120 lines
3.1 KiB
JavaScript
120 lines
3.1 KiB
JavaScript
/**
|
|
* Scheduler component to schedule message sending.
|
|
*/
|
|
|
|
var DefaultScheduler = require('../pushSchedulers/direct');
|
|
var logger = require('pomelo-logger').getLogger('pomelo', __filename);
|
|
|
|
module.exports = function(app, opts) {
|
|
return new PushScheduler(app, opts);
|
|
};
|
|
|
|
var PushScheduler = function(app, opts) {
|
|
this.app = app;
|
|
opts = opts || {};
|
|
this.scheduler = getScheduler(this, app, opts);
|
|
};
|
|
|
|
PushScheduler.prototype.name = '__pushScheduler__';
|
|
|
|
/**
|
|
* Component lifecycle callback
|
|
*
|
|
* @param {Function} cb
|
|
* @return {Void}
|
|
*/
|
|
PushScheduler.prototype.afterStart = function(cb) {
|
|
if(this.isSelectable) {
|
|
for (var k in this.scheduler) {
|
|
var sch = this.scheduler[k];
|
|
if(typeof sch.start === 'function') {
|
|
sch.start();
|
|
}
|
|
}
|
|
process.nextTick(cb);
|
|
} else if(typeof this.scheduler.start === 'function') {
|
|
this.scheduler.start(cb);
|
|
} else {
|
|
process.nextTick(cb);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Component lifecycle callback
|
|
*
|
|
* @param {Function} cb
|
|
* @return {Void}
|
|
*/
|
|
PushScheduler.prototype.stop = function(force, cb) {
|
|
if(this.isSelectable) {
|
|
for (var k in this.scheduler) {
|
|
var sch = this.scheduler[k];
|
|
if(typeof sch.stop === 'function') {
|
|
sch.stop();
|
|
}
|
|
}
|
|
process.nextTick(cb);
|
|
} else if(typeof this.scheduler.stop === 'function') {
|
|
this.scheduler.stop(cb);
|
|
} else {
|
|
process.nextTick(cb);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Schedule how the message to send.
|
|
*
|
|
* @param {Number} reqId request id
|
|
* @param {String} route route string of the message
|
|
* @param {Object} msg message content after encoded
|
|
* @param {Array} recvs array of receiver's session id
|
|
* @param {Object} opts options
|
|
* @param {Function} cb
|
|
*/
|
|
|
|
PushScheduler.prototype.schedule = function(reqId, route, msg, recvs, opts, cb) {
|
|
var self = this;
|
|
if(self.isSelectable) {
|
|
if(typeof self.selector === 'function') {
|
|
self.selector(reqId, route, msg, recvs, opts, function(id) {
|
|
if(self.scheduler[id] && typeof self.scheduler[id].schedule === 'function') {
|
|
self.scheduler[id].schedule(reqId, route, msg, recvs, opts, cb);
|
|
} else {
|
|
logger.error('invalid pushScheduler id, id: %j', id);
|
|
}
|
|
});
|
|
} else {
|
|
logger.error('the selector for pushScheduler is not a function, selector: %j', self.selector);
|
|
}
|
|
} else {
|
|
if (typeof self.scheduler.schedule === 'function') {
|
|
self.scheduler.schedule(reqId, route, msg, recvs, opts, cb);
|
|
} else {
|
|
logger.error('the scheduler does not have a schedule function, scheduler: %j', self.scheduler);
|
|
}
|
|
}
|
|
};
|
|
|
|
var getScheduler = function(pushSchedulerComp, app, opts) {
|
|
var scheduler = opts.scheduler || DefaultScheduler;
|
|
if(typeof scheduler === 'function') {
|
|
return scheduler(app, opts);
|
|
}
|
|
|
|
if(Array.isArray(scheduler)) {
|
|
var res = {};
|
|
scheduler.forEach(function(sch) {
|
|
if(typeof sch.scheduler === 'function') {
|
|
res[sch.id] = sch.scheduler(app, sch.options);
|
|
} else {
|
|
res[sch.id] = sch.scheduler;
|
|
}
|
|
});
|
|
pushSchedulerComp.isSelectable = true;
|
|
pushSchedulerComp.selector = opts.selector;
|
|
return res;
|
|
}
|
|
|
|
return scheduler;
|
|
};
|