dnssd
Version:
Bonjour/Avahi-like service discovery in pure JavaScript
102 lines (83 loc) • 2.43 kB
JavaScript
;
var EventEmitter = require('events').EventEmitter;
/**
* Node EventEmitter + some convenience methods
* @class
*
* This emitter lets you do this:
*
* > emitter.using(obj)
* > .on('event', obj.handleEvent)
* > .on('thing', obj.doThing)
* >
* > emitter.removeListenersCreatedBy(obj)
*
* Because this doesn't work:
*
* > emitter.on('event', this.fn.bind(this))
* > emitter.removeListener('event', this.fn.bind(this))
*
* @param {object} options
*/
function Emitter() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
// this._eventContexts is a map of maps that track of listener/event pairs
// created by some object / context
//
// {
// context: {
// listener_fn: event type,
// },
// }
//
this._eventContexts = new Map();
this.setMaxListeners(options.maxListeners || 0);
}
Emitter.prototype = Object.create(EventEmitter.prototype);
Emitter.prototype.constructor = Emitter;
/**
* Adds a listener that is bound to a context
*/
Emitter.prototype.using = function (context) {
var emitter = this;
var contextSpecific = {
on: function on(event, fn) {
var listener = fn.bind(context);
var listeners = emitter._eventContexts.get(context) || new Map();
// add listener/event to context list
listeners.set(listener, event);
emitter._eventContexts.set(context, listeners);
// register event
emitter.on(event, listener);
return contextSpecific;
},
once: function once(event, fn) {
var listener = fn.bind(context);
var listeners = emitter._eventContexts.get(context) || new Map();
// add listener/event to context list
listeners.set(listener, event);
emitter._eventContexts.set(context, listeners);
// register event
emitter.once(event, listener);
return contextSpecific;
}
};
return contextSpecific;
};
Emitter.prototype.off = function (event, fn) {
this.removeListener(event, fn);
return this;
};
/**
* Remove all listeners that were created by / assigned to given context
*/
Emitter.prototype.removeListenersCreatedBy = function (context) {
var _this = this;
var listeners = this._eventContexts.get(context) || [];
listeners.forEach(function (event, fn) {
return _this.off(event, fn);
});
this._eventContexts.delete(context);
return this;
};
module.exports = Emitter;