Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
amethystnetwork-dev
GitHub Repository: amethystnetwork-dev/Incognito
Path: blob/main/static/script/events.js
918 views
1
// Copyright Joyent, Inc. and other Node contributors.
2
//
3
// Permission is hereby granted, free of charge, to any person obtaining a
4
// copy of this software and associated documentation files (the
5
// "Software"), to deal in the Software without restriction, including
6
// without limitation the rights to use, copy, modify, merge, publish,
7
// distribute, sublicense, and/or sell copies of the Software, and to permit
8
// persons to whom the Software is furnished to do so, subject to the
9
// following conditions:
10
//
11
// The above copyright notice and this permission notice shall be included
12
// in all copies or substantial portions of the Software.
13
//
14
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20
// USE OR OTHER DEALINGS IN THE SOFTWARE.
21
22
'use strict';
23
24
var R = typeof Reflect === 'object' ? Reflect : null
25
var ReflectApply = R && typeof R.apply === 'function'
26
? R.apply
27
: function ReflectApply(target, receiver, args) {
28
return Function.prototype.apply.call(target, receiver, args);
29
}
30
31
var ReflectOwnKeys
32
if (R && typeof R.ownKeys === 'function') {
33
ReflectOwnKeys = R.ownKeys
34
} else if (Object.getOwnPropertySymbols) {
35
ReflectOwnKeys = function ReflectOwnKeys(target) {
36
return Object.getOwnPropertyNames(target)
37
.concat(Object.getOwnPropertySymbols(target));
38
};
39
} else {
40
ReflectOwnKeys = function ReflectOwnKeys(target) {
41
return Object.getOwnPropertyNames(target);
42
};
43
}
44
45
function ProcessEmitWarning(warning) {
46
if (console && console.warn) console.warn(warning);
47
}
48
49
var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {
50
return value !== value;
51
}
52
53
function EventEmitter() {
54
EventEmitter.init.call(this);
55
}
56
57
export default EventEmitter;
58
59
// Backwards-compat with node 0.10.x
60
EventEmitter.EventEmitter = EventEmitter;
61
62
EventEmitter.prototype._events = undefined;
63
EventEmitter.prototype._eventsCount = 0;
64
EventEmitter.prototype._maxListeners = undefined;
65
66
// By default EventEmitters will print a warning if more than 10 listeners are
67
// added to it. This is a useful default which helps finding memory leaks.
68
var defaultMaxListeners = 10;
69
70
function checkListener(listener) {
71
if (typeof listener !== 'function') {
72
throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
73
}
74
}
75
76
Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
77
enumerable: true,
78
get: function() {
79
return defaultMaxListeners;
80
},
81
set: function(arg) {
82
if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
83
throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');
84
}
85
defaultMaxListeners = arg;
86
}
87
});
88
89
EventEmitter.init = function() {
90
91
if (this._events === undefined ||
92
this._events === Object.getPrototypeOf(this)._events) {
93
this._events = Object.create(null);
94
this._eventsCount = 0;
95
}
96
97
this._maxListeners = this._maxListeners || undefined;
98
};
99
100
// Obviously not all Emitters should be limited to 10. This function allows
101
// that to be increased. Set to zero for unlimited.
102
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
103
if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {
104
throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.');
105
}
106
this._maxListeners = n;
107
return this;
108
};
109
110
function _getMaxListeners(that) {
111
if (that._maxListeners === undefined)
112
return EventEmitter.defaultMaxListeners;
113
return that._maxListeners;
114
}
115
116
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
117
return _getMaxListeners(this);
118
};
119
120
EventEmitter.prototype.emit = function emit(type) {
121
var args = [];
122
for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
123
var doError = (type === 'error');
124
125
var events = this._events;
126
if (events !== undefined)
127
doError = (doError && events.error === undefined);
128
else if (!doError)
129
return false;
130
131
// If there is no 'error' event listener then throw.
132
if (doError) {
133
var er;
134
if (args.length > 0)
135
er = args[0];
136
if (er instanceof Error) {
137
// Note: The comments on the `throw` lines are intentional, they show
138
// up in Node's output if this results in an unhandled exception.
139
throw er; // Unhandled 'error' event
140
}
141
// At least give some kind of context to the user
142
var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));
143
err.context = er;
144
throw err; // Unhandled 'error' event
145
}
146
147
var handler = events[type];
148
149
if (handler === undefined)
150
return false;
151
152
if (typeof handler === 'function') {
153
ReflectApply(handler, this, args);
154
} else {
155
var len = handler.length;
156
var listeners = arrayClone(handler, len);
157
for (var i = 0; i < len; ++i)
158
ReflectApply(listeners[i], this, args);
159
}
160
161
return true;
162
};
163
164
function _addListener(target, type, listener, prepend) {
165
var m;
166
var events;
167
var existing;
168
169
checkListener(listener);
170
171
events = target._events;
172
if (events === undefined) {
173
events = target._events = Object.create(null);
174
target._eventsCount = 0;
175
} else {
176
// To avoid recursion in the case that type === "newListener"! Before
177
// adding it to the listeners, first emit "newListener".
178
if (events.newListener !== undefined) {
179
target.emit('newListener', type,
180
listener.listener ? listener.listener : listener);
181
182
// Re-assign `events` because a newListener handler could have caused the
183
// this._events to be assigned to a new object
184
events = target._events;
185
}
186
existing = events[type];
187
}
188
189
if (existing === undefined) {
190
// Optimize the case of one listener. Don't need the extra array object.
191
existing = events[type] = listener;
192
++target._eventsCount;
193
} else {
194
if (typeof existing === 'function') {
195
// Adding the second element, need to change to array.
196
existing = events[type] =
197
prepend ? [listener, existing] : [existing, listener];
198
// If we've already got an array, just append.
199
} else if (prepend) {
200
existing.unshift(listener);
201
} else {
202
existing.push(listener);
203
}
204
205
// Check for listener leak
206
m = _getMaxListeners(target);
207
if (m > 0 && existing.length > m && !existing.warned) {
208
existing.warned = true;
209
// No error code for this since it is a Warning
210
// eslint-disable-next-line no-restricted-syntax
211
var w = new Error('Possible EventEmitter memory leak detected. ' +
212
existing.length + ' ' + String(type) + ' listeners ' +
213
'added. Use emitter.setMaxListeners() to ' +
214
'increase limit');
215
w.name = 'MaxListenersExceededWarning';
216
w.emitter = target;
217
w.type = type;
218
w.count = existing.length;
219
ProcessEmitWarning(w);
220
}
221
}
222
223
return target;
224
}
225
226
EventEmitter.prototype.addListener = function addListener(type, listener) {
227
return _addListener(this, type, listener, false);
228
};
229
230
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
231
232
EventEmitter.prototype.prependListener =
233
function prependListener(type, listener) {
234
return _addListener(this, type, listener, true);
235
};
236
237
function onceWrapper() {
238
if (!this.fired) {
239
this.target.removeListener(this.type, this.wrapFn);
240
this.fired = true;
241
if (arguments.length === 0)
242
return this.listener.call(this.target);
243
return this.listener.apply(this.target, arguments);
244
}
245
}
246
247
function _onceWrap(target, type, listener) {
248
var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };
249
var wrapped = onceWrapper.bind(state);
250
wrapped.listener = listener;
251
state.wrapFn = wrapped;
252
return wrapped;
253
}
254
255
EventEmitter.prototype.once = function once(type, listener) {
256
checkListener(listener);
257
this.on(type, _onceWrap(this, type, listener));
258
return this;
259
};
260
261
EventEmitter.prototype.prependOnceListener =
262
function prependOnceListener(type, listener) {
263
checkListener(listener);
264
this.prependListener(type, _onceWrap(this, type, listener));
265
return this;
266
};
267
268
// Emits a 'removeListener' event if and only if the listener was removed.
269
EventEmitter.prototype.removeListener =
270
function removeListener(type, listener) {
271
var list, events, position, i, originalListener;
272
273
checkListener(listener);
274
275
events = this._events;
276
if (events === undefined)
277
return this;
278
279
list = events[type];
280
if (list === undefined)
281
return this;
282
283
if (list === listener || list.listener === listener) {
284
if (--this._eventsCount === 0)
285
this._events = Object.create(null);
286
else {
287
delete events[type];
288
if (events.removeListener)
289
this.emit('removeListener', type, list.listener || listener);
290
}
291
} else if (typeof list !== 'function') {
292
position = -1;
293
294
for (i = list.length - 1; i >= 0; i--) {
295
if (list[i] === listener || list[i].listener === listener) {
296
originalListener = list[i].listener;
297
position = i;
298
break;
299
}
300
}
301
302
if (position < 0)
303
return this;
304
305
if (position === 0)
306
list.shift();
307
else {
308
spliceOne(list, position);
309
}
310
311
if (list.length === 1)
312
events[type] = list[0];
313
314
if (events.removeListener !== undefined)
315
this.emit('removeListener', type, originalListener || listener);
316
}
317
318
return this;
319
};
320
321
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
322
323
EventEmitter.prototype.removeAllListeners =
324
function removeAllListeners(type) {
325
var listeners, events, i;
326
327
events = this._events;
328
if (events === undefined)
329
return this;
330
331
// not listening for removeListener, no need to emit
332
if (events.removeListener === undefined) {
333
if (arguments.length === 0) {
334
this._events = Object.create(null);
335
this._eventsCount = 0;
336
} else if (events[type] !== undefined) {
337
if (--this._eventsCount === 0)
338
this._events = Object.create(null);
339
else
340
delete events[type];
341
}
342
return this;
343
}
344
345
// emit removeListener for all listeners on all events
346
if (arguments.length === 0) {
347
var keys = Object.keys(events);
348
var key;
349
for (i = 0; i < keys.length; ++i) {
350
key = keys[i];
351
if (key === 'removeListener') continue;
352
this.removeAllListeners(key);
353
}
354
this.removeAllListeners('removeListener');
355
this._events = Object.create(null);
356
this._eventsCount = 0;
357
return this;
358
}
359
360
listeners = events[type];
361
362
if (typeof listeners === 'function') {
363
this.removeListener(type, listeners);
364
} else if (listeners !== undefined) {
365
// LIFO order
366
for (i = listeners.length - 1; i >= 0; i--) {
367
this.removeListener(type, listeners[i]);
368
}
369
}
370
371
return this;
372
};
373
374
function _listeners(target, type, unwrap) {
375
var events = target._events;
376
377
if (events === undefined)
378
return [];
379
380
var evlistener = events[type];
381
if (evlistener === undefined)
382
return [];
383
384
if (typeof evlistener === 'function')
385
return unwrap ? [evlistener.listener || evlistener] : [evlistener];
386
387
return unwrap ?
388
unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
389
}
390
391
EventEmitter.prototype.listeners = function listeners(type) {
392
return _listeners(this, type, true);
393
};
394
395
EventEmitter.prototype.rawListeners = function rawListeners(type) {
396
return _listeners(this, type, false);
397
};
398
399
EventEmitter.listenerCount = function(emitter, type) {
400
if (typeof emitter.listenerCount === 'function') {
401
return emitter.listenerCount(type);
402
} else {
403
return listenerCount.call(emitter, type);
404
}
405
};
406
407
EventEmitter.prototype.listenerCount = listenerCount;
408
function listenerCount(type) {
409
var events = this._events;
410
411
if (events !== undefined) {
412
var evlistener = events[type];
413
414
if (typeof evlistener === 'function') {
415
return 1;
416
} else if (evlistener !== undefined) {
417
return evlistener.length;
418
}
419
}
420
421
return 0;
422
}
423
424
EventEmitter.prototype.eventNames = function eventNames() {
425
return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
426
};
427
428
function arrayClone(arr, n) {
429
var copy = new Array(n);
430
for (var i = 0; i < n; ++i)
431
copy[i] = arr[i];
432
return copy;
433
}
434
435
function spliceOne(list, index) {
436
for (; index + 1 < list.length; index++)
437
list[index] = list[index + 1];
438
list.pop();
439
}
440
441
function unwrapListeners(arr) {
442
var ret = new Array(arr.length);
443
for (var i = 0; i < ret.length; ++i) {
444
ret[i] = arr[i].listener || arr[i];
445
}
446
return ret;
447
}
448
449
function once(emitter, name) {
450
return new Promise(function (resolve, reject) {
451
function errorListener(err) {
452
emitter.removeListener(name, resolver);
453
reject(err);
454
}
455
456
function resolver() {
457
if (typeof emitter.removeListener === 'function') {
458
emitter.removeListener('error', errorListener);
459
}
460
resolve([].slice.call(arguments));
461
};
462
463
eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
464
if (name !== 'error') {
465
addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
466
}
467
});
468
}
469
470
function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
471
if (typeof emitter.on === 'function') {
472
eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
473
}
474
}
475
476
function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
477
if (typeof emitter.on === 'function') {
478
if (flags.once) {
479
emitter.once(name, listener);
480
} else {
481
emitter.on(name, listener);
482
}
483
} else if (typeof emitter.addEventListener === 'function') {
484
// EventTarget does not have `error` event semantics like Node
485
// EventEmitters, we do not listen for `error` events here.
486
emitter.addEventListener(name, function wrapListener(arg) {
487
// IE does not have builtin `{ once: true }` support so we
488
// have to do it manually.
489
if (flags.once) {
490
emitter.removeEventListener(name, wrapListener);
491
}
492
listener(arg);
493
});
494
} else {
495
throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
496
}
497
}
498