aboutsummaryrefslogtreecommitdiff
path: root/node_modules/ultron
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/ultron')
-rw-r--r--node_modules/ultron/.npmignore3
-rw-r--r--node_modules/ultron/.travis.yml21
-rw-r--r--node_modules/ultron/LICENSE22
-rw-r--r--node_modules/ultron/README.md97
-rw-r--r--node_modules/ultron/index.js129
-rw-r--r--node_modules/ultron/package.json41
-rw-r--r--node_modules/ultron/test.js327
7 files changed, 640 insertions, 0 deletions
diff --git a/node_modules/ultron/.npmignore b/node_modules/ultron/.npmignore
new file mode 100644
index 000000000..66210a2a6
--- /dev/null
+++ b/node_modules/ultron/.npmignore
@@ -0,0 +1,3 @@
+node_modules
+coverage
+.tern-port
diff --git a/node_modules/ultron/.travis.yml b/node_modules/ultron/.travis.yml
new file mode 100644
index 000000000..a505004be
--- /dev/null
+++ b/node_modules/ultron/.travis.yml
@@ -0,0 +1,21 @@
+sudo: false
+language: node_js
+node_js:
+ - "0.12"
+ - "0.10"
+ - "0.8"
+ - "iojs"
+before_install:
+ - 'if [ "${TRAVIS_NODE_VERSION}" == "0.8" ]; then npm install -g npm@2.11.1; fi'
+script:
+ - "npm run test-travis"
+after_script:
+ - "npm install coveralls@2.11.x && cat coverage/lcov.info | coveralls"
+matrix:
+ fast_finish: true
+notifications:
+ irc:
+ channels:
+ - "irc.freenode.org#unshift"
+ on_success: change
+ on_failure: change
diff --git a/node_modules/ultron/LICENSE b/node_modules/ultron/LICENSE
new file mode 100644
index 000000000..6dc9316a6
--- /dev/null
+++ b/node_modules/ultron/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Unshift.io, Arnout Kazemier, the Contributors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/node_modules/ultron/README.md b/node_modules/ultron/README.md
new file mode 100644
index 000000000..84fa3f238
--- /dev/null
+++ b/node_modules/ultron/README.md
@@ -0,0 +1,97 @@
+# Ultron
+
+[![Made by unshift](https://img.shields.io/badge/made%20by-unshift-00ffcc.svg?style=flat-square)](http://unshift.io)[![Version npm](http://img.shields.io/npm/v/ultron.svg?style=flat-square)](http://browsenpm.org/package/ultron)[![Build Status](http://img.shields.io/travis/unshiftio/ultron/master.svg?style=flat-square)](https://travis-ci.org/unshiftio/ultron)[![Dependencies](https://img.shields.io/david/unshiftio/ultron.svg?style=flat-square)](https://david-dm.org/unshiftio/ultron)[![Coverage Status](http://img.shields.io/coveralls/unshiftio/ultron/master.svg?style=flat-square)](https://coveralls.io/r/unshiftio/ultron?branch=master)[![IRC channel](http://img.shields.io/badge/IRC-irc.freenode.net%23unshift-00a8ff.svg?style=flat-square)](http://webchat.freenode.net/?channels=unshift)
+
+Ultron is a high-intelligence robot. It gathers intelligence so it can start
+improving upon his rudimentary design. It will learn your event emitting
+patterns and find ways to exterminate them. Allowing you to remove only the
+event emitters that **you** assigned and not the ones that your users or
+developers assigned. This can prevent race conditions, memory leaks and even file
+descriptor leaks from ever happening as you won't remove clean up processes.
+
+## Installation
+
+The module is designed to be used in browsers using browserify and in Node.js.
+You can install the module through the public npm registry by running the
+following command in CLI:
+
+```
+npm install --save ultron
+```
+
+## Usage
+
+In all examples we assume that you've required the library as following:
+
+```js
+'use strict';
+
+var Ultron = require('ultron');
+```
+
+Now that we've required the library we can construct our first `Ultron` instance.
+The constructor requires one argument which should be the `EventEmitter`
+instance that we need to operate upon. This can be the `EventEmitter` module
+that ships with Node.js or `EventEmitter3` or anything else as long as it
+follow the same API and internal structure as these 2. So with that in mind we
+can create the instance:
+
+```js
+//
+// For the sake of this example we're going to construct an empty EventEmitter
+//
+var EventEmitter = require('events').EventEmitter; // or require('eventmitter3');
+var events = new EventEmitter();
+
+var ultron = new Ultron(events);
+```
+
+You can now use the following API's from the Ultron instance:
+
+### Ultron.on
+
+Register a new event listener for the given event. It follows the exact same API
+as `EventEmitter.on` but it will return itself instead of returning the
+EventEmitter instance. If you are using EventEmitter3 it also supports the
+context param:
+
+```js
+ultron.on('event-name', handler, { custom: 'function context' });
+```
+
+### Ultron.once
+
+Exactly the same as the [Ultron.on](#ultronon) but it only allows the execution
+once.
+
+### Ultron.remove
+
+This is where all the magic happens and the safe removal starts. This function
+accepts different argument styles:
+
+- No arguments, assume that all events need to be removed so it will work as
+ `removeAllListeners()` API.
+- 1 argument, when it's a string it will be split on ` ` and `,` to create a
+ list of events that need to be cleared.
+- Multiple arguments, we assume that they are all names of events that need to
+ be cleared.
+
+```js
+ultron.remove('foo, bar baz'); // Removes foo, bar and baz.
+ultron.remove('foo', 'bar', 'baz'); // Removes foo, bar and baz.
+ultron.remove(); // Removes everything.
+```
+
+If you just want to remove a single event listener using a function reference
+you can still use the EventEmitter's `removeListener(event, fn)` API:
+
+```js
+function foo() {}
+
+ulton.on('foo', foo);
+events.removeListener('foo', foo);
+```
+
+## License
+
+MIT
diff --git a/node_modules/ultron/index.js b/node_modules/ultron/index.js
new file mode 100644
index 000000000..af17ab7cc
--- /dev/null
+++ b/node_modules/ultron/index.js
@@ -0,0 +1,129 @@
+'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
+ , 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) {
+ args = [];
+
+ for (event in this.ee._events) {
+ if (has.call(this.ee._events, event)) args.push(event);
+ }
+ }
+
+ for (var i = 0; i < args.length; i++) {
+ var listeners = this.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;
+ }
+
+ this.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;
diff --git a/node_modules/ultron/package.json b/node_modules/ultron/package.json
new file mode 100644
index 000000000..e13ab5ba2
--- /dev/null
+++ b/node_modules/ultron/package.json
@@ -0,0 +1,41 @@
+{
+ "name": "ultron",
+ "version": "1.0.2",
+ "description": "Ultron is high-intelligence robot. It gathers intel so it can start improving upon his rudimentary design",
+ "main": "index.js",
+ "scripts": {
+ "100%": "istanbul check-coverage --statements 100 --functions 100 --lines 100 --branches 100",
+ "test": "mocha test.js",
+ "watch": "mocha --watch test.js",
+ "coverage": "istanbul cover ./node_modules/.bin/_mocha -- test.js",
+ "test-travis": "istanbul cover node_modules/.bin/_mocha --report lcovonly -- test.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/unshiftio/ultron"
+ },
+ "keywords": [
+ "Ultron",
+ "robot",
+ "gather",
+ "intelligence",
+ "event",
+ "events",
+ "eventemitter",
+ "emitter",
+ "cleanup"
+ ],
+ "author": "Arnout Kazemier",
+ "license": "MIT",
+ "devDependencies": {
+ "assume": "1.2.x",
+ "eventemitter3": "1.1.x",
+ "istanbul": "0.3.x",
+ "mocha": "2.2.x",
+ "pre-commit": "1.0.x"
+ },
+ "bugs": {
+ "url": "https://github.com/unshiftio/ultron/issues"
+ },
+ "homepage": "https://github.com/unshiftio/ultron"
+}
diff --git a/node_modules/ultron/test.js b/node_modules/ultron/test.js
new file mode 100644
index 000000000..1fd4f1bb5
--- /dev/null
+++ b/node_modules/ultron/test.js
@@ -0,0 +1,327 @@
+/* istanbul ignore next */
+describe('Ultron', function () {
+ 'use strict';
+
+ var EventEmitter = require('eventemitter3')
+ , EE = require('events').EventEmitter
+ , assume = require('assume')
+ , Ultron = require('./')
+ , ultron
+ , ee;
+
+ beforeEach(function () {
+ ee = new EventEmitter();
+ ultron = new Ultron(ee);
+ });
+
+ afterEach(function () {
+ ultron.destroy();
+ ee.removeAllListeners();
+ });
+
+ it('is exposed as a function', function () {
+ assume(Ultron).is.a('function');
+ });
+
+ it('can be initialized without the new keyword', function () {
+ assume(Ultron(ee)).is.instanceOf(Ultron);
+ });
+
+ it('assigns a unique id to every instance', function () {
+ for (var i = 0; i < 100; i++) {
+ assume(ultron.id).does.not.equal((new Ultron()).id);
+ }
+ });
+
+ it('allows removal through the event emitter', function () {
+ function foo() {}
+ function bar() {}
+
+ ultron.on('foo', foo);
+ ultron.once('foo', bar);
+
+ assume(foo.__ultron).equals(ultron.id);
+ assume(bar.__ultron).equals(ultron.id);
+ assume(ee.listeners('foo').length).equals(2);
+
+ ee.removeListener('foo', foo);
+ assume(ee.listeners('foo').length).equals(1);
+
+ ee.removeListener('foo', bar);
+ assume(ee.listeners('foo').length).equals(0);
+ });
+
+ describe('#on', function () {
+ it('assigns a listener', function () {
+ assume(ee.listeners('foo').length).equals(0);
+
+ function foo() {}
+
+ ultron.on('foo', foo);
+ assume(ee.listeners('foo').length).equals(1);
+ assume(ee.listeners('foo')[0]).equals(foo);
+ });
+
+ it('tags the assigned function', function () {
+ assume(ee.listeners('foo').length).equals(0);
+
+ ultron.on('foo', function () {});
+ assume(ee.listeners('foo')[0].__ultron).equals(ultron.id);
+ });
+
+ it('also passes in the context', function (next) {
+ var context = 1313;
+
+ ultron.on('foo', function (a, b, c) {
+ assume(a).equals('a');
+ assume(b).equals('b');
+ assume(c).equals('c');
+
+ assume(this).equals(context);
+
+ next();
+ }, context);
+
+ ee.emit('foo', 'a', 'b', 'c');
+ });
+
+ it('works with regular eventemitters as well', function (next) {
+ var ee = new EE()
+ , ultron = new Ultron(ee);
+
+ ultron.on('foo', function (a, b, c) {
+ assume(a).equals('a');
+ assume(b).equals('b');
+ assume(c).equals('c');
+
+ next();
+ });
+
+ ee.emit('foo', 'a', 'b', 'c');
+ });
+ });
+
+ describe('#once', function () {
+ it('assigns a listener', function () {
+ assume(ee.listeners('foo').length).equals(0);
+
+ function foo() {}
+ ultron.once('foo', foo);
+ assume(ee.listeners('foo').length).equals(1);
+ assume(ee.listeners('foo')[0]).equals(foo);
+ });
+
+ it('tags the assigned function', function () {
+ assume(ee.listeners('foo').length).equals(0);
+
+ ultron.once('foo', function () {});
+ assume(ee.listeners('foo')[0].__ultron).equals(ultron.id);
+ });
+
+ it('also passes in the context', function (next) {
+ var context = 1313;
+
+ ultron.once('foo', function (a, b, c) {
+ assume(a).equals('a');
+ assume(b).equals('b');
+ assume(c).equals('c');
+
+ assume(this).equals(context);
+
+ next();
+ }, context);
+
+ ee.emit('foo', 'a', 'b', 'c');
+ ee.emit('foo', 'a', 'b', 'c'); // Ensure that we don't double execute
+ });
+
+ it('works with regular eventemitters as well', function (next) {
+ var ee = new EE()
+ , ultron = new Ultron(ee);
+
+ ultron.once('foo', function (a, b, c) {
+ assume(a).equals('a');
+ assume(b).equals('b');
+ assume(c).equals('c');
+
+ next();
+ });
+
+ ee.emit('foo', 'a', 'b', 'c');
+ ee.emit('foo', 'a', 'b', 'c'); // Ensure that we don't double execute
+ });
+ });
+
+ describe('#remove', function () {
+ it('removes only our assigned `on` listeners', function () {
+ function foo() {}
+ function bar() {}
+
+ ee.on('foo', foo);
+ ultron.on('foo', bar);
+ assume(ee.listeners('foo').length).equals(2);
+
+ ultron.remove('foo');
+ assume(ee.listeners('foo').length).equals(1);
+ assume(ee.listeners('foo')[0]).equals(foo);
+ });
+
+ it('removes our private __ultron references', function () {
+ function once() {}
+ function on() {}
+
+ assume('__ultron' in once).is.false();
+ assume('__ultron' in on).is.false();
+
+ ultron.on('foo', on);
+ ultron.once('bar', once);
+
+ assume('__ultron' in once).is.true();
+ assume('__ultron' in on).is.true();
+
+ ultron.remove('foo, bar');
+
+ assume('__ultron' in once).is.false();
+ assume('__ultron' in on).is.false();
+
+ ultron.destroy();
+
+ ee = new EE();
+ ultron = new Ultron(ee);
+
+ assume('__ultron' in once).is.false();
+ assume('__ultron' in on).is.false();
+
+ ultron.on('foo', on);
+ ultron.once('bar', once);
+
+ assume('__ultron' in once).is.true();
+ assume('__ultron' in on).is.true();
+
+ ultron.remove('foo, bar');
+
+ assume('__ultron' in once).is.false();
+ assume('__ultron' in on).is.false();
+ });
+
+ it('removes only our assigned `once` listeners', function () {
+ function foo() {}
+ function bar() {}
+
+ ee.once('foo', foo);
+ ultron.once('foo', bar);
+ assume(ee.listeners('foo').length).equals(2);
+
+ ultron.remove('foo');
+ assume(ee.listeners('foo').length).equals(1);
+ assume(ee.listeners('foo')[0]).equals(foo);
+ });
+
+ it('removes only our assigned `once` listeners from regular EE', function () {
+ var ee = new EE()
+ , ultron = new Ultron(ee);
+
+ function foo() {}
+ function bar() {}
+
+ ee.once('foo', foo);
+ ultron.once('foo', bar);
+ assume(ee.listeners('foo').length).equals(2);
+
+ ultron.remove('foo');
+ assume(ee.listeners('foo').length).equals(1);
+ assume(ee.listeners('foo')[0].listener).equals(foo);
+ });
+
+ it('removes all assigned events if called without args', function () {
+ function foo() {}
+ function bar() {}
+
+ ultron.on('foo', foo);
+ ultron.on('bar', bar);
+
+ assume(ee.listeners('foo').length).equals(1);
+ assume(ee.listeners('bar').length).equals(1);
+
+ ultron.remove();
+
+ assume(ee.listeners('foo').length).equals(0);
+ assume(ee.listeners('bar').length).equals(0);
+ });
+
+ it('removes multiple listeners based on args', function () {
+ function foo() {}
+ function bar() {}
+ function baz() {}
+
+ ultron.on('foo', foo);
+ ultron.on('bar', bar);
+ ultron.on('baz', baz);
+
+ assume(ee.listeners('foo').length).equals(1);
+ assume(ee.listeners('bar').length).equals(1);
+ assume(ee.listeners('baz').length).equals(1);
+
+ ultron.remove('foo', 'bar');
+
+ assume(ee.listeners('foo').length).equals(0);
+ assume(ee.listeners('bar').length).equals(0);
+ assume(ee.listeners('baz').length).equals(1);
+ });
+
+ it('removes multiple listeners if first arg is seperated string', function () {
+ function foo() {}
+ function bar() {}
+ function baz() {}
+
+ ultron.on('foo', foo);
+ ultron.on('bar', bar);
+ ultron.on('baz', baz);
+
+ assume(ee.listeners('foo').length).equals(1);
+ assume(ee.listeners('bar').length).equals(1);
+ assume(ee.listeners('baz').length).equals(1);
+
+ ultron.remove('foo, bar');
+
+ assume(ee.listeners('foo').length).equals(0);
+ assume(ee.listeners('bar').length).equals(0);
+ assume(ee.listeners('baz').length).equals(1);
+ });
+ });
+
+ describe('#destroy', function () {
+ it('removes all listeners', function () {
+ function foo() {}
+ function bar() {}
+ function baz() {}
+
+ ultron.on('foo', foo);
+ ultron.on('bar', bar);
+ ultron.on('baz', baz);
+
+ assume(ee.listeners('foo').length).equals(1);
+ assume(ee.listeners('bar').length).equals(1);
+ assume(ee.listeners('baz').length).equals(1);
+
+ ultron.destroy();
+
+ assume(ee.listeners('foo').length).equals(0);
+ assume(ee.listeners('bar').length).equals(0);
+ assume(ee.listeners('baz').length).equals(0);
+ });
+
+ it('removes the .ee reference', function () {
+ assume(ultron.ee).equals(ee);
+ ultron.destroy();
+ assume(ultron.ee).equals(null);
+ });
+
+ it('returns booleans for state indication', function () {
+ assume(ultron.destroy()).is.true();
+ assume(ultron.destroy()).is.false();
+ assume(ultron.destroy()).is.false();
+ assume(ultron.destroy()).is.false();
+ });
+ });
+});