-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEventEmitter.js
More file actions
190 lines (153 loc) · 5.56 KB
/
EventEmitter.js
File metadata and controls
190 lines (153 loc) · 5.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/**
* Event Emitter (Node.JS => Browser)
* Created by Seris (Twitter: @Serris_) seerriss@gmail.com
* License: GNU GENERAL PUBLIC LICENSE, Version 3, 29 June 2007 (https://www.gnu.org/licenses/gpl-3.0.txt)
* URL: https://github.com/Seris/EventEmitter
**/
(function () {
"use strict";
var EventEmitter = function () {};
EventEmitter.listenerCount = function (emitter, event) {
if (!emitter instanceof EventEmitter) {
return 0;
}
if (!arguments[1]) {
return 0;
}
if (emitter._events[event]) {
return emitter._events[event].length;
} else {
return 0;
}
};
EventEmitter.prototype._maxListeners = 10;
EventEmitter.prototype._events = {};
// Bind event
EventEmitter.prototype.on = function (event, listener) {
if (typeof arguments[1] !== "function") {
throw new TypeError("listener must be a function");
}
var event = event.toString();
if (!this._events[event]) {
this._events[event] = [];
this._events[event].warned = false;
}
if (this._maxListeners !== 0 && this._events[event].length - 1 > this._maxListeners && !this._events[event].warned) {
console.warn(
"possible EventEmitter memory leak detected. " +
(this._events[event].length - 1) +
" listeners added. Use emitter.setMaxListeners() to increase limit."
);
this._events[event].warned = true;
}
this._events[event].push(listener);
this.emit('newListener', event, listener);
};
EventEmitter.prototype.once = function (event, listener) {
if (typeof arguments[1] !== "function") {
throw new TypeError("listener must be a function");
}
var event = event.toString();
if (!this._events[event]) {
this._events[event] = [];
this._events[event].warned = false;
}
if (this._maxListeners !== 0 && this._events[event].length - 1 > this._maxListeners && !this._events[event].warned) {
console.warn(
"possible EventEmitter memory leak detected. " +
this._events[event].length +
" listeners added. Use emitter.setMaxListeners() to increase limit."
);
this._events[event].warned = true;
}
this._events[event].push({
listener: listener
});
this.emit('newListener', event, listener);
};
// Fire Event
EventEmitter.prototype.emit = function () {
if (typeof arguments[0] !== "string") {
throw new TypeError("Expected string for event ! " + typeof arguments[0] + " given !");
}
var event = arguments[0];
if (!this._events[event]) {
return;
}
var args = new Array(arguments.length);
for (var i = 1; i < arguments.length; i++) {
args[i - 1] = arguments[i];
}
var self = this;
for (var i = 0; i < this._events[event].length; i++) {
switch (typeof this._events[event][i]) {
case "function":
(function (fn) {
setTimeout(function () {
fn.apply(this, args);
}, 0);
}).call(this, this._events[event][i]);
break;
case "object":
var fn = this._events[event].splice(i, 1)[0];
(function (fn) {
setTimeout(function () {
fn.listener.apply(this, args);
}, 0);
i--;
}).call(this, fn);
break;
}
}
};
// Remove Event
EventEmitter.prototype.removeListener = function (event, listener) {
if (typeof event !== "string") {
throw new TypeError("Expected string for event ! " + typeof event + " given !");
}
if (typeof listener !== "function") {
throw new TypeError("Listener must be a function !");
}
if (!this._events[event]) {
return false;
}
var index = this._events[event].indexOf(listener);
if (index !== -1) {
this.emit('removeListener', event, listener);
this._events[event].splice(index, 1);
return true;
} else {
return false;
}
};
// Remove (All) Events
EventEmitter.prototype.removeAllListeners = function (event) {
if (arguments[0]) {
if (typeof event !== "string") {
throw new TypeError("Expected string for event ! " + typeof event + " given !");
}
delete this._events[event];
} else {
this._events = {};
}
};
// Set Max Listeners
EventEmitter.prototype.setMaxListeners = function (max) {
if (typeof max !== "number") {
throw new TypeError("Expected number for max listeners ! " + typeof event + " given !");
}
if (max < 0) {
throw new TypeError("Expected number greater or equal to 0 for max listeners ! " + max + " given !");
}
this._maxListeners = max;
};
// Returns an array of listeners for the specified event
EventEmitter.prototype.listeners = function (event) {
if (!this._events[event]) {
return [];
}
// Clone the array
return this._events[event].slice(0);
};
this.EventEmitter = EventEmitter;
}).call(window);