Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80517 views
1
'use strict';
2
3
/**
4
* Representation of a single EventEmitter function.
5
*
6
* @param {Function} fn Event handler to be called.
7
* @param {Mixed} context Context for function execution.
8
* @param {Boolean} once Only emit once
9
* @api private
10
*/
11
function EE(fn, context, once) {
12
this.fn = fn;
13
this.context = context;
14
this.once = once || false;
15
}
16
17
/**
18
* Minimal EventEmitter interface that is molded against the Node.js
19
* EventEmitter interface.
20
*
21
* @constructor
22
* @api public
23
*/
24
function EventEmitter() { /* Nothing to set */ }
25
26
/**
27
* Holds the assigned EventEmitters by name.
28
*
29
* @type {Object}
30
* @private
31
*/
32
EventEmitter.prototype._events = undefined;
33
34
/**
35
* Return a list of assigned event listeners.
36
*
37
* @param {String} event The events that should be listed.
38
* @returns {Array}
39
* @api public
40
*/
41
EventEmitter.prototype.listeners = function listeners(event) {
42
if (!this._events || !this._events[event]) return [];
43
if (this._events[event].fn) return [this._events[event].fn];
44
45
for (var i = 0, l = this._events[event].length, ee = new Array(l); i < l; i++) {
46
ee[i] = this._events[event][i].fn;
47
}
48
49
return ee;
50
};
51
52
/**
53
* Emit an event to all registered event listeners.
54
*
55
* @param {String} event The name of the event.
56
* @returns {Boolean} Indication if we've emitted an event.
57
* @api public
58
*/
59
EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
60
if (!this._events || !this._events[event]) return false;
61
62
var listeners = this._events[event]
63
, len = arguments.length
64
, args
65
, i;
66
67
if ('function' === typeof listeners.fn) {
68
if (listeners.once) this.removeListener(event, listeners.fn, true);
69
70
switch (len) {
71
case 1: return listeners.fn.call(listeners.context), true;
72
case 2: return listeners.fn.call(listeners.context, a1), true;
73
case 3: return listeners.fn.call(listeners.context, a1, a2), true;
74
case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
75
case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
76
case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
77
}
78
79
for (i = 1, args = new Array(len -1); i < len; i++) {
80
args[i - 1] = arguments[i];
81
}
82
83
listeners.fn.apply(listeners.context, args);
84
} else {
85
var length = listeners.length
86
, j;
87
88
for (i = 0; i < length; i++) {
89
if (listeners[i].once) this.removeListener(event, listeners[i].fn, true);
90
91
switch (len) {
92
case 1: listeners[i].fn.call(listeners[i].context); break;
93
case 2: listeners[i].fn.call(listeners[i].context, a1); break;
94
case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
95
default:
96
if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
97
args[j - 1] = arguments[j];
98
}
99
100
listeners[i].fn.apply(listeners[i].context, args);
101
}
102
}
103
}
104
105
return true;
106
};
107
108
/**
109
* Register a new EventListener for the given event.
110
*
111
* @param {String} event Name of the event.
112
* @param {Functon} fn Callback function.
113
* @param {Mixed} context The context of the function.
114
* @api public
115
*/
116
EventEmitter.prototype.on = function on(event, fn, context) {
117
var listener = new EE(fn, context || this);
118
119
if (!this._events) this._events = {};
120
if (!this._events[event]) this._events[event] = listener;
121
else {
122
if (!this._events[event].fn) this._events[event].push(listener);
123
else this._events[event] = [
124
this._events[event], listener
125
];
126
}
127
128
return this;
129
};
130
131
/**
132
* Add an EventListener that's only called once.
133
*
134
* @param {String} event Name of the event.
135
* @param {Function} fn Callback function.
136
* @param {Mixed} context The context of the function.
137
* @api public
138
*/
139
EventEmitter.prototype.once = function once(event, fn, context) {
140
var listener = new EE(fn, context || this, true);
141
142
if (!this._events) this._events = {};
143
if (!this._events[event]) this._events[event] = listener;
144
else {
145
if (!this._events[event].fn) this._events[event].push(listener);
146
else this._events[event] = [
147
this._events[event], listener
148
];
149
}
150
151
return this;
152
};
153
154
/**
155
* Remove event listeners.
156
*
157
* @param {String} event The event we want to remove.
158
* @param {Function} fn The listener that we need to find.
159
* @param {Boolean} once Only remove once listeners.
160
* @api public
161
*/
162
EventEmitter.prototype.removeListener = function removeListener(event, fn, once) {
163
if (!this._events || !this._events[event]) return this;
164
165
var listeners = this._events[event]
166
, events = [];
167
168
if (fn) {
169
if (listeners.fn && (listeners.fn !== fn || (once && !listeners.once))) {
170
events.push(listeners);
171
}
172
if (!listeners.fn) for (var i = 0, length = listeners.length; i < length; i++) {
173
if (listeners[i].fn !== fn || (once && !listeners[i].once)) {
174
events.push(listeners[i]);
175
}
176
}
177
}
178
179
//
180
// Reset the array, or remove it completely if we have no more listeners.
181
//
182
if (events.length) {
183
this._events[event] = events.length === 1 ? events[0] : events;
184
} else {
185
delete this._events[event];
186
}
187
188
return this;
189
};
190
191
/**
192
* Remove all listeners or only the listeners for the specified event.
193
*
194
* @param {String} event The event want to remove all listeners for.
195
* @api public
196
*/
197
EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
198
if (!this._events) return this;
199
200
if (event) delete this._events[event];
201
else this._events = {};
202
203
return this;
204
};
205
206
//
207
// Alias methods names because people roll like that.
208
//
209
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
210
EventEmitter.prototype.addListener = EventEmitter.prototype.on;
211
212
//
213
// This function doesn't apply anymore.
214
//
215
EventEmitter.prototype.setMaxListeners = function setMaxListeners() {
216
return this;
217
};
218
219
//
220
// Expose the module.
221
//
222
EventEmitter.EventEmitter = EventEmitter;
223
EventEmitter.EventEmitter2 = EventEmitter;
224
EventEmitter.EventEmitter3 = EventEmitter;
225
226
//
227
// Expose the module.
228
//
229
module.exports = EventEmitter;
230
231