139 lines
3.1 KiB
JavaScript
139 lines
3.1 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var has = Object.prototype.hasOwnProperty;
|
||
|
|
||
|
/**
|
||
|
* An auto incrementing id which we can use to create "unique" Ultron instances
|
||
|
* so we can track the event emitters that are added through the Ultron
|
||
|
* interface.
|
||
|
*
|
||
|
* @type {Number}
|
||
|
* @private
|
||
|
*/
|
||
|
var id = 0;
|
||
|
|
||
|
/**
|
||
|
* Ultron is high-intelligence robot. It gathers intelligence so it can start improving
|
||
|
* upon his rudimentary design. It will learn from your EventEmitting patterns
|
||
|
* and exterminate them.
|
||
|
*
|
||
|
* @constructor
|
||
|
* @param {EventEmitter} ee EventEmitter instance we need to wrap.
|
||
|
* @api public
|
||
|
*/
|
||
|
function Ultron(ee) {
|
||
|
if (!(this instanceof Ultron)) return new Ultron(ee);
|
||
|
|
||
|
this.id = id++;
|
||
|
this.ee = ee;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Register a new EventListener for the given event.
|
||
|
*
|
||
|
* @param {String} event Name of the event.
|
||
|
* @param {Functon} fn Callback function.
|
||
|
* @param {Mixed} context The context of the function.
|
||
|
* @returns {Ultron}
|
||
|
* @api public
|
||
|
*/
|
||
|
Ultron.prototype.on = function on(event, fn, context) {
|
||
|
fn.__ultron = this.id;
|
||
|
this.ee.on(event, fn, context);
|
||
|
|
||
|
return this;
|
||
|
};
|
||
|
/**
|
||
|
* Add an EventListener that's only called once.
|
||
|
*
|
||
|
* @param {String} event Name of the event.
|
||
|
* @param {Function} fn Callback function.
|
||
|
* @param {Mixed} context The context of the function.
|
||
|
* @returns {Ultron}
|
||
|
* @api public
|
||
|
*/
|
||
|
Ultron.prototype.once = function once(event, fn, context) {
|
||
|
fn.__ultron = this.id;
|
||
|
this.ee.once(event, fn, context);
|
||
|
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Remove the listeners we assigned for the given event.
|
||
|
*
|
||
|
* @returns {Ultron}
|
||
|
* @api public
|
||
|
*/
|
||
|
Ultron.prototype.remove = function remove() {
|
||
|
var args = arguments
|
||
|
, ee = this.ee
|
||
|
, event;
|
||
|
|
||
|
//
|
||
|
// When no event names are provided we assume that we need to clear all the
|
||
|
// events that were assigned through us.
|
||
|
//
|
||
|
if (args.length === 1 && 'string' === typeof args[0]) {
|
||
|
args = args[0].split(/[, ]+/);
|
||
|
} else if (!args.length) {
|
||
|
if (ee.eventNames) {
|
||
|
args = ee.eventNames();
|
||
|
} else if (ee._events) {
|
||
|
args = [];
|
||
|
|
||
|
for (event in ee._events) {
|
||
|
if (has.call(ee._events, event)) args.push(event);
|
||
|
}
|
||
|
|
||
|
if (Object.getOwnPropertySymbols) {
|
||
|
args = args.concat(Object.getOwnPropertySymbols(ee._events));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (var i = 0; i < args.length; i++) {
|
||
|
var listeners = ee.listeners(args[i]);
|
||
|
|
||
|
for (var j = 0; j < listeners.length; j++) {
|
||
|
event = listeners[j];
|
||
|
|
||
|
//
|
||
|
// Once listeners have a `listener` property that stores the real listener
|
||
|
// in the EventEmitter that ships with Node.js.
|
||
|
//
|
||
|
if (event.listener) {
|
||
|
if (event.listener.__ultron !== this.id) continue;
|
||
|
delete event.listener.__ultron;
|
||
|
} else {
|
||
|
if (event.__ultron !== this.id) continue;
|
||
|
delete event.__ultron;
|
||
|
}
|
||
|
|
||
|
ee.removeListener(args[i], event);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Destroy the Ultron instance, remove all listeners and release all references.
|
||
|
*
|
||
|
* @returns {Boolean}
|
||
|
* @api public
|
||
|
*/
|
||
|
Ultron.prototype.destroy = function destroy() {
|
||
|
if (!this.ee) return false;
|
||
|
|
||
|
this.remove();
|
||
|
this.ee = null;
|
||
|
|
||
|
return true;
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Expose the module.
|
||
|
//
|
||
|
module.exports = Ultron;
|