obj.prototype["get" + names] = function(callback) { var scope = this; var key = obj.getKey(this.id + ':' + names); var promise = new Promise(function(resolve, reject) { client.smembers(key, function(err, keys) { if (err) reject(err); if (!keys.length) resolve(keys); relation.get(keys).then( function(result) { /* If the relation has disappeared, clean the link. */ for (var i = 0; i < result.length; i++) { if (!result[i]) { scope["remove" + name](keys[i]); } } resolve(result); }, function(error) { reject(error); } ); }); }); promise.nodeify(callback); return promise; };
this.obj.prototype["get" + name] = function(callback) { /* Last callback in the chain runs the final done callback via promise. */ var next, done; var promise = new Promise(function(resolve, reject) { done = next = function(err, res) { err ? reject(err) : resolve(res); }; }); promise.nodeify(callback); /* Loop through objects wrapping a new callback around the previous. */ for (var i = (objs.length - 1); i > 0; i--) { var getter = "get" + ((objs[i] === relation) ? name : objs[i].name); /* Might be plural */ /** * @param {function} n Next * @param {function} g Getter */ next = function(n, g) { return function(err, res) { if (err || !res) return done(err, null); res[g](n); }; }(next, getter); } /* Initiate the callback chain by calling the first getter. */ this["get" + objs[0].name](next); return promise; };
obj.prototype["get" + name] = function(callback) { var scope = this; var key = obj.getKey(this.id + ':' + name); var promise = new Promise(function(resolve, reject) { client.get(key, function(err, res) { if (err) return reject(err); if (!res) return resolve(null); relation.get(res).then( function(result) { /* If the relation has disappeared, clean the link. */ if (!result) { scope["set" + name](result); } resolve(result); }, function(error) { reject(error); } ); }); }); promise.nodeify(callback); return promise; };
cls[getter] = function(value, callback) { var promise = new Promise(function(resolve, reject) { client.smembers(getKey(value), function(err, keys) { if (err) return reject(err); if (!keys.length) return resolve(keys); cls.get(keys, function(err, results) { if (err) return reject(err); var instances = []; for (var i = 0; i < results.length; i++) { if (!results[i]) { client.srem(getKey(value), keys[i]); // cleanup stale index continue; /* No longer exists. */ } if (results[i][field] == value) { instances.push(results[i]); } } resolve(instances); }); }); }); promise.nodeify(callback); return promise; }
obj.prototype["has" + name] = function(related, callback) { var key = obj.getKey(this.id + ":" + names); var relid = (related instanceof String || typeof related === 'string') ? related : related.id; var promise = new Promise(function(resolve, reject) { client.sismember(key, relid, function(err, res) { if (err) return reject(err); resolve(Boolean(res)); }); }); promise.nodeify(callback); return promise; }
obj.prototype["set" + name] = function(relObj, callback) { var key = obj.getKey(this.id + ':' + name); var promise = new Promise(function(resolve, reject) { if (relObj) { client.set(key, relObj.id, function(err, res) { err ? reject(err) : resolve(true); }); } else { client.del(key, function(err, res) { err ? reject(err) : resolve(true); }); } }); promise.nodeify(callback); return promise; }
obj.prototype["remove" + name] = function(related, callback) { var key = obj.getKey(this.id + ':' + names); var relid; if (related instanceof String || typeof(related) === "string") { relid = related; } else { relid = related.id; } var promise = new Promise(function(resolve, reject) { client.srem(key, relid, function(err, res) { err ? reject(err) : resolve(true); }); }); promise.nodeify(callback); return promise; };
/** * http://www.qcloud.com/doc/product/269/%E7%8B%AC%E7%AB%8B%E6%A8%A1%E5%BC%8F * @param identifier 用户Id * @param cb 回调函数 * @returns Promise, 如果回调函数为空,返回promise,否则返回空 */ function signature(identifier, cb) { identifier = identifier + ''; let sign = spawn(Cmd_Path, [Key_Path, APP_ID, identifier], {cmd: __dirname}); let rtn = new Promise((resv, reject) => { let _token = ''; sign.stdout.on('data', (data) => {_token = data}); sign.stderr.on('data', reject); sign.on('close', (code) => { if(code !== 0) { reject(`signature failure, code:${code}, err:${_token}`); } else { resv(_token.toString()); } }); }); return rtn.nodeify(cb); }
self.id = function id (success, failure) { var p = new Promise(function (resolve, reject) { if (self._id) return resolve(self._id); var endpoint = urlUtil.resolve(opts.url, '/displayer/convert/email'); request({ url: endpoint, method: 'POST', json: { email: self._email } }, function (err, res, body) { if (err) return reject(err); if (res.statusCode !== 200 || !body || body.status !== 'okay') return reject(makeError(res.statusCode, body)); self._id = body.userId; resolve(body.userId); }); }); if (success && !failure) p.nodeify(success); if (success && failure) p.then(success, failure); return p; };
module.exports.generate = function generateScout(options, callback) { if (!_.isObject(options)) { throw new Error('`options` is required'); } _.defaults(options, defaults); var webpackOptions = _.cloneDeep(overrides); _.merge(webpackOptions, defaults, options.webpackOptions); webpackOptions.scout = { appModules: options.appModules }; // each build gets its own unique directory webpackOptions.output.path = '/build' + buildNumber; buildNumber++; webpackOptions.plugins = options.webpackOptions.plugins || []; // uglify by default if (!options.pretty) { webpackOptions.plugins.push(new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false } })); } else { webpackOptions.output.pathinfo = true; } var appConfig; try { appConfig = JSON.stringify(options.appConfig || {}); } catch (e) { throw new Error('Cannot stringify appConfig value'); } options.flags = _.defaults(options.flags || {}, { APP_NAMESPACE : JSON.stringify(options.namespace || DEFAULT_NAMESPACE), SCOUTFILE_APP_CONFIG : appConfig }); webpackOptions.plugins.push( new webpack.DefinePlugin(options.flags) ); // initialize webpack and use an in-memory filesystem var compiler = webpack(webpackOptions); compiler.outputFileSystem = memfs; var promise = new BluebirdPromise(function (resolve, reject) { BluebirdPromise.promisify(compiler.run, compiler)(). then(function (stats) { var error; stats = stats.toJson(); // annoyingly, this is necessary to detect all errors and warnings // http://webpack.github.io/docs/node.js-api.html#error-handling if (stats.errors.length || stats.warnings.length) { error = new Error(webpackFailureTemplate(stats)); error.webpackStats = stats; return reject(error); } // look up the bundle, read it as a string, and delete the file var bundlePath = webpackOptions.output.path + '/' + webpackOptions.output.filename; var src = memfs.readFileSync(bundlePath); memfs.unlinkSync(bundlePath); memfs.rmdirSync(webpackOptions.output.path); resolve(src.toString()); }). catch(function (err) { reject(err); }); }); return promise.nodeify(callback); };