API/api.medcify.app/node_modules/pm2-axon/lib/sockets/sub-emitter.js
2022-09-26 11:41:44 +05:30

93 lines
1.8 KiB
JavaScript

/**
* Module dependencies.
*/
var Message = require('amp-message');
var SubSocket = require('./sub');
/**
* Expose `SubEmitterSocket`.
*/
module.exports = SubEmitterSocket;
/**
* Initialzie a new `SubEmitterSocket`.
*
* @api private
*/
function SubEmitterSocket() {
this.sock = new SubSocket;
this.sock.onmessage = this.onmessage.bind(this);
this.bind = this.sock.bind.bind(this.sock);
this.connect = this.sock.connect.bind(this.sock);
this.close = this.sock.close.bind(this.sock);
this.listeners = [];
}
/**
* Message handler.
*
* @param {net.Socket} sock
* @return {Function} closure(msg, mulitpart)
* @api private
*/
SubEmitterSocket.prototype.onmessage = function(){
var listeners = this.listeners;
var self = this;
return function(buf){
var msg = new Message(buf);
var topic = msg.shift();
for (var i = 0; i < listeners.length; ++i) {
var listener = listeners[i];
var m = listener.re.exec(topic);
if (!m) continue;
listener.fn.apply(this, m.slice(1).concat(msg.args));
}
}
};
/**
* Subscribe to `event` and invoke the given callback `fn`.
*
* @param {String} event
* @param {Function} fn
* @return {SubEmitterSocket} self
* @api public
*/
SubEmitterSocket.prototype.on = function(event, fn){
var re = this.sock.subscribe(event);
this.listeners.push({
event: event,
re: re,
fn: fn
});
return this;
};
/**
* Unsubscribe with the given `event`.
*
* @param {String} event
* @return {SubEmitterSocket} self
* @api public
*/
SubEmitterSocket.prototype.off = function(event){
for (var i = 0; i < this.listeners.length; ++i) {
if (this.listeners[i].event === event) {
this.sock.unsubscribe(this.listeners[i].re);
this.listeners.splice(i--, 1);
}
}
return this;
};