socketioMEANseed/www/node_modules/eventemitter3/index.js
www/node_modules/eventemitter3/index.jsRaw
1'use strict';
2
3var has = Object.prototype.hasOwnProperty;
4
5//
6// We store our EE objects in a plain object whose properties are event names.
7// If `Object.create(null)` is not supported we prefix the event names with a
8// `~` to make sure that the built-in object properties are not overridden or
9// used as an attack vector.
10// We also assume that `Object.create(null)` is available when the event name
11// is an ES6 Symbol.
12//
13var prefix = typeof Object.create !== 'function' ? '~' : false;
14
15/**
16 * Representation of a single EventEmitter function.
17 *
18 * @param {Function} fn Event handler to be called.
19 * @param {Mixed} context Context for function execution.
20 * @param {Boolean} [once=false] Only emit once
21 * @api private
22 */
23function EE(fn, context, once) {
24 this.fn = fn;
25 this.context = context;
26 this.once = once || false;
27}
28
29/**
30 * Minimal EventEmitter interface that is molded against the Node.js
31 * EventEmitter interface.
32 *
33 * @constructor
34 * @api public
35 */
36function EventEmitter() { /* Nothing to set */ }
37
38/**
39 * Hold the assigned EventEmitters by name.
40 *
41 * @type {Object}
42 * @private
43 */
44EventEmitter.prototype._events = undefined;
45
46/**
47 * Return an array listing the events for which the emitter has registered
48 * listeners.
49 *
50 * @returns {Array}
51 * @api public
52 */
53EventEmitter.prototype.eventNames = function eventNames() {
54 var events = this._events
55 , names = []
56 , name;
57
58 if (!events) return names;
59
60 for (name in events) {
61 if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
62 }
63
64 if (Object.getOwnPropertySymbols) {
65 return names.concat(Object.getOwnPropertySymbols(events));
66 }
67
68 return names;
69};
70
71/**
72 * Return a list of assigned event listeners.
73 *
74 * @param {String} event The events that should be listed.
75 * @param {Boolean} exists We only need to know if there are listeners.
76 * @returns {Array|Boolean}
77 * @api public
78 */
79EventEmitter.prototype.listeners = function listeners(event, exists) {
80 var evt = prefix ? prefix + event : event
81 , available = this._events && this._events[evt];
82
83 if (exists) return !!available;
84 if (!available) return [];
85 if (available.fn) return [available.fn];
86
87 for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {
88 ee[i] = available[i].fn;
89 }
90
91 return ee;
92};
93
94/**
95 * Emit an event to all registered event listeners.
96 *
97 * @param {String} event The name of the event.
98 * @returns {Boolean} Indication if we've emitted an event.
99 * @api public
100 */
101EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
102 var evt = prefix ? prefix + event : event;
103
104 if (!this._events || !this._events[evt]) return false;
105
106 var listeners = this._events[evt]
107 , len = arguments.length
108 , args
109 , i;
110
111 if ('function' === typeof listeners.fn) {
112 if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);
113
114 switch (len) {
115 case 1: return listeners.fn.call(listeners.context), true;
116 case 2: return listeners.fn.call(listeners.context, a1), true;
117 case 3: return listeners.fn.call(listeners.context, a1, a2), true;
118 case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
119 case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
120 case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
121 }
122
123 for (i = 1, args = new Array(len -1); i < len; i++) {
124 args[i - 1] = arguments[i];
125 }
126
127 listeners.fn.apply(listeners.context, args);
128 } else {
129 var length = listeners.length
130 , j;
131
132 for (i = 0; i < length; i++) {
133 if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);
134
135 switch (len) {
136 case 1: listeners[i].fn.call(listeners[i].context); break;
137 case 2: listeners[i].fn.call(listeners[i].context, a1); break;
138 case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
139 default:
140 if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
141 args[j - 1] = arguments[j];
142 }
143
144 listeners[i].fn.apply(listeners[i].context, args);
145 }
146 }
147 }
148
149 return true;
150};
151
152/**
153 * Register a new EventListener for the given event.
154 *
155 * @param {String} event Name of the event.
156 * @param {Function} fn Callback function.
157 * @param {Mixed} [context=this] The context of the function.
158 * @api public
159 */
160EventEmitter.prototype.on = function on(event, fn, context) {
161 var listener = new EE(fn, context || this)
162 , evt = prefix ? prefix + event : event;
163
164 if (!this._events) this._events = prefix ? {} : Object.create(null);
165 if (!this._events[evt]) this._events[evt] = listener;
166 else {
167 if (!this._events[evt].fn) this._events[evt].push(listener);
168 else this._events[evt] = [
169 this._events[evt], listener
170 ];
171 }
172
173 return this;
174};
175
176/**
177 * Add an EventListener that's only called once.
178 *
179 * @param {String} event Name of the event.
180 * @param {Function} fn Callback function.
181 * @param {Mixed} [context=this] The context of the function.
182 * @api public
183 */
184EventEmitter.prototype.once = function once(event, fn, context) {
185 var listener = new EE(fn, context || this, true)
186 , evt = prefix ? prefix + event : event;
187
188 if (!this._events) this._events = prefix ? {} : Object.create(null);
189 if (!this._events[evt]) this._events[evt] = listener;
190 else {
191 if (!this._events[evt].fn) this._events[evt].push(listener);
192 else this._events[evt] = [
193 this._events[evt], listener
194 ];
195 }
196
197 return this;
198};
199
200/**
201 * Remove event listeners.
202 *
203 * @param {String} event The event we want to remove.
204 * @param {Function} fn The listener that we need to find.
205 * @param {Mixed} context Only remove listeners matching this context.
206 * @param {Boolean} once Only remove once listeners.
207 * @api public
208 */
209EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
210 var evt = prefix ? prefix + event : event;
211
212 if (!this._events || !this._events[evt]) return this;
213
214 var listeners = this._events[evt]
215 , events = [];
216
217 if (fn) {
218 if (listeners.fn) {
219 if (
220 listeners.fn !== fn
221 || (once && !listeners.once)
222 || (context && listeners.context !== context)
223 ) {
224 events.push(listeners);
225 }
226 } else {
227 for (var i = 0, length = listeners.length; i < length; i++) {
228 if (
229 listeners[i].fn !== fn
230 || (once && !listeners[i].once)
231 || (context && listeners[i].context !== context)
232 ) {
233 events.push(listeners[i]);
234 }
235 }
236 }
237 }
238
239 //
240 // Reset the array, or remove it completely if we have no more listeners.
241 //
242 if (events.length) {
243 this._events[evt] = events.length === 1 ? events[0] : events;
244 } else {
245 delete this._events[evt];
246 }
247
248 return this;
249};
250
251/**
252 * Remove all listeners or only the listeners for the specified event.
253 *
254 * @param {String} event The event want to remove all listeners for.
255 * @api public
256 */
257EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
258 if (!this._events) return this;
259
260 if (event) delete this._events[prefix ? prefix + event : event];
261 else this._events = prefix ? {} : Object.create(null);
262
263 return this;
264};
265
266//
267// Alias methods names because people roll like that.
268//
269EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
270EventEmitter.prototype.addListener = EventEmitter.prototype.on;
271
272//
273// This function doesn't apply anymore.
274//
275EventEmitter.prototype.setMaxListeners = function setMaxListeners() {
276 return this;
277};
278
279//
280// Expose the prefix.
281//
282EventEmitter.prefixed = prefix;
283
284//
285// Expose the module.
286//
287if ('undefined' !== typeof module) {
288 module.exports = EventEmitter;
289}