93 lines
1.8 KiB
JavaScript
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;
|
||
|
};
|