mirror of
https://github.com/titaniumnetwork-dev/Ultraviolet.git
synced 2025-05-16 04:50:01 -04:00
npm events, expose EventEmitter via bundle
This commit is contained in:
parent
7ef4fb9732
commit
1a1bf9b500
27 changed files with 27 additions and 1567 deletions
5
package-lock.json
generated
5
package-lock.json
generated
|
@ -13,6 +13,7 @@
|
||||||
"bowser": "^2.11.0",
|
"bowser": "^2.11.0",
|
||||||
"css-tree": "^2.0.4",
|
"css-tree": "^2.0.4",
|
||||||
"esotope-hammerhead": "^0.6.1",
|
"esotope-hammerhead": "^0.6.1",
|
||||||
|
"events": "^3.3.0",
|
||||||
"idb": "^7.0.0",
|
"idb": "^7.0.0",
|
||||||
"meriyah": "^4.2.0",
|
"meriyah": "^4.2.0",
|
||||||
"mime-db": "^1.51.0",
|
"mime-db": "^1.51.0",
|
||||||
|
@ -1167,7 +1168,6 @@
|
||||||
"version": "3.3.0",
|
"version": "3.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
|
||||||
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
|
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.x"
|
"node": ">=0.8.x"
|
||||||
}
|
}
|
||||||
|
@ -3580,8 +3580,7 @@
|
||||||
"events": {
|
"events": {
|
||||||
"version": "3.3.0",
|
"version": "3.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
|
||||||
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
|
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"fast-deep-equal": {
|
"fast-deep-equal": {
|
||||||
"version": "3.1.3",
|
"version": "3.1.3",
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
"bowser": "^2.11.0",
|
"bowser": "^2.11.0",
|
||||||
"css-tree": "^2.0.4",
|
"css-tree": "^2.0.4",
|
||||||
"esotope-hammerhead": "^0.6.1",
|
"esotope-hammerhead": "^0.6.1",
|
||||||
|
"events": "^3.3.0",
|
||||||
"idb": "^7.0.0",
|
"idb": "^7.0.0",
|
||||||
"meriyah": "^4.2.0",
|
"meriyah": "^4.2.0",
|
||||||
"mime-db": "^1.51.0",
|
"mime-db": "^1.51.0",
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from '../events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from '../hook.js';
|
import HookEvent from '../hook.js';
|
||||||
|
|
||||||
class AttrApi extends EventEmitter {
|
class AttrApi extends EventEmitter {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from '../events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from '../hook.js';
|
import HookEvent from '../hook.js';
|
||||||
|
|
||||||
class DocumentHook extends EventEmitter {
|
class DocumentHook extends EventEmitter {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from '../events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from '../hook.js';
|
import HookEvent from '../hook.js';
|
||||||
|
|
||||||
class ElementApi extends EventEmitter {
|
class ElementApi extends EventEmitter {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from '../events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from '../hook.js';
|
import HookEvent from '../hook.js';
|
||||||
|
|
||||||
class NodeApi extends EventEmitter {
|
class NodeApi extends EventEmitter {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from '../events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from '../hook.js';
|
import HookEvent from '../hook.js';
|
||||||
|
|
||||||
class StyleApi extends EventEmitter {
|
class StyleApi extends EventEmitter {
|
||||||
|
|
|
@ -1,522 +0,0 @@
|
||||||
// Copyright Joyent, Inc. and other Node 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.
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var R = typeof Reflect === 'object' ? Reflect : null;
|
|
||||||
var ReflectApply =
|
|
||||||
R && typeof R.apply === 'function'
|
|
||||||
? R.apply
|
|
||||||
: function ReflectApply(target, receiver, args) {
|
|
||||||
return Function.prototype.apply.call(target, receiver, args);
|
|
||||||
};
|
|
||||||
|
|
||||||
var ReflectOwnKeys;
|
|
||||||
if (R && typeof R.ownKeys === 'function') {
|
|
||||||
ReflectOwnKeys = R.ownKeys;
|
|
||||||
} else if (Object.getOwnPropertySymbols) {
|
|
||||||
ReflectOwnKeys = function ReflectOwnKeys(target) {
|
|
||||||
return Object.getOwnPropertyNames(target).concat(
|
|
||||||
Object.getOwnPropertySymbols(target)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
ReflectOwnKeys = function ReflectOwnKeys(target) {
|
|
||||||
return Object.getOwnPropertyNames(target);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function ProcessEmitWarning(warning) {
|
|
||||||
if (console && console.warn) console.warn(warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
var NumberIsNaN =
|
|
||||||
Number.isNaN ||
|
|
||||||
function NumberIsNaN(value) {
|
|
||||||
return value !== value;
|
|
||||||
};
|
|
||||||
|
|
||||||
function EventEmitter() {
|
|
||||||
EventEmitter.init.call(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default EventEmitter;
|
|
||||||
|
|
||||||
// Backwards-compat with node 0.10.x
|
|
||||||
EventEmitter.EventEmitter = EventEmitter;
|
|
||||||
|
|
||||||
EventEmitter.prototype._events = undefined;
|
|
||||||
EventEmitter.prototype._eventsCount = 0;
|
|
||||||
EventEmitter.prototype._maxListeners = undefined;
|
|
||||||
|
|
||||||
// By default EventEmitters will print a warning if more than 10 listeners are
|
|
||||||
// added to it. This is a useful default which helps finding memory leaks.
|
|
||||||
var defaultMaxListeners = 10;
|
|
||||||
|
|
||||||
function checkListener(listener) {
|
|
||||||
if (typeof listener !== 'function') {
|
|
||||||
throw new TypeError(
|
|
||||||
'The "listener" argument must be of type Function. Received type ' +
|
|
||||||
typeof listener
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
|
|
||||||
enumerable: true,
|
|
||||||
get: function () {
|
|
||||||
return defaultMaxListeners;
|
|
||||||
},
|
|
||||||
set: function (arg) {
|
|
||||||
if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
|
|
||||||
throw new RangeError(
|
|
||||||
'The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' +
|
|
||||||
arg +
|
|
||||||
'.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
defaultMaxListeners = arg;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
EventEmitter.init = function () {
|
|
||||||
if (
|
|
||||||
this._events === undefined ||
|
|
||||||
this._events === Object.getPrototypeOf(this)._events
|
|
||||||
) {
|
|
||||||
this._events = Object.create(null);
|
|
||||||
this._eventsCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._maxListeners = this._maxListeners || undefined;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Obviously not all Emitters should be limited to 10. This function allows
|
|
||||||
// that to be increased. Set to zero for unlimited.
|
|
||||||
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
|
|
||||||
if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {
|
|
||||||
throw new RangeError(
|
|
||||||
'The value of "n" is out of range. It must be a non-negative number. Received ' +
|
|
||||||
n +
|
|
||||||
'.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
this._maxListeners = n;
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
function _getMaxListeners(that) {
|
|
||||||
if (that._maxListeners === undefined)
|
|
||||||
return EventEmitter.defaultMaxListeners;
|
|
||||||
return that._maxListeners;
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
|
|
||||||
return _getMaxListeners(this);
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.emit = function emit(type) {
|
|
||||||
var args = [];
|
|
||||||
for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
|
|
||||||
var doError = type === 'error';
|
|
||||||
|
|
||||||
var events = this._events;
|
|
||||||
if (events !== undefined) doError = doError && events.error === undefined;
|
|
||||||
else if (!doError) return false;
|
|
||||||
|
|
||||||
// If there is no 'error' event listener then throw.
|
|
||||||
if (doError) {
|
|
||||||
var er;
|
|
||||||
if (args.length > 0) er = args[0];
|
|
||||||
if (er instanceof Error) {
|
|
||||||
// Note: The comments on the `throw` lines are intentional, they show
|
|
||||||
// up in Node's output if this results in an unhandled exception.
|
|
||||||
throw er; // Unhandled 'error' event
|
|
||||||
}
|
|
||||||
// At least give some kind of context to the user
|
|
||||||
var err = new Error(
|
|
||||||
'Unhandled error.' + (er ? ' (' + er.message + ')' : '')
|
|
||||||
);
|
|
||||||
err.context = er;
|
|
||||||
throw err; // Unhandled 'error' event
|
|
||||||
}
|
|
||||||
|
|
||||||
var handler = events[type];
|
|
||||||
|
|
||||||
if (handler === undefined) return false;
|
|
||||||
|
|
||||||
if (typeof handler === 'function') {
|
|
||||||
ReflectApply(handler, this, args);
|
|
||||||
} else {
|
|
||||||
var len = handler.length;
|
|
||||||
var listeners = arrayClone(handler, len);
|
|
||||||
for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
function _addListener(target, type, listener, prepend) {
|
|
||||||
var m;
|
|
||||||
var events;
|
|
||||||
var existing;
|
|
||||||
|
|
||||||
checkListener(listener);
|
|
||||||
|
|
||||||
events = target._events;
|
|
||||||
if (events === undefined) {
|
|
||||||
events = target._events = Object.create(null);
|
|
||||||
target._eventsCount = 0;
|
|
||||||
} else {
|
|
||||||
// To avoid recursion in the case that type === "newListener"! Before
|
|
||||||
// adding it to the listeners, first emit "newListener".
|
|
||||||
if (events.newListener !== undefined) {
|
|
||||||
target.emit(
|
|
||||||
'newListener',
|
|
||||||
type,
|
|
||||||
listener.listener ? listener.listener : listener
|
|
||||||
);
|
|
||||||
|
|
||||||
// Re-assign `events` because a newListener handler could have caused the
|
|
||||||
// this._events to be assigned to a new object
|
|
||||||
events = target._events;
|
|
||||||
}
|
|
||||||
existing = events[type];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (existing === undefined) {
|
|
||||||
// Optimize the case of one listener. Don't need the extra array object.
|
|
||||||
existing = events[type] = listener;
|
|
||||||
++target._eventsCount;
|
|
||||||
} else {
|
|
||||||
if (typeof existing === 'function') {
|
|
||||||
// Adding the second element, need to change to array.
|
|
||||||
existing = events[type] = prepend
|
|
||||||
? [listener, existing]
|
|
||||||
: [existing, listener];
|
|
||||||
// If we've already got an array, just append.
|
|
||||||
} else if (prepend) {
|
|
||||||
existing.unshift(listener);
|
|
||||||
} else {
|
|
||||||
existing.push(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for listener leak
|
|
||||||
m = _getMaxListeners(target);
|
|
||||||
if (m > 0 && existing.length > m && !existing.warned) {
|
|
||||||
existing.warned = true;
|
|
||||||
// No error code for this since it is a Warning
|
|
||||||
// eslint-disable-next-line no-restricted-syntax
|
|
||||||
var w = new Error(
|
|
||||||
'Possible EventEmitter memory leak detected. ' +
|
|
||||||
existing.length +
|
|
||||||
' ' +
|
|
||||||
String(type) +
|
|
||||||
' listeners ' +
|
|
||||||
'added. Use emitter.setMaxListeners() to ' +
|
|
||||||
'increase limit'
|
|
||||||
);
|
|
||||||
w.name = 'MaxListenersExceededWarning';
|
|
||||||
w.emitter = target;
|
|
||||||
w.type = type;
|
|
||||||
w.count = existing.length;
|
|
||||||
ProcessEmitWarning(w);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.prototype.addListener = function addListener(type, listener) {
|
|
||||||
return _addListener(this, type, listener, false);
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
|
|
||||||
|
|
||||||
EventEmitter.prototype.prependListener = function prependListener(
|
|
||||||
type,
|
|
||||||
listener
|
|
||||||
) {
|
|
||||||
return _addListener(this, type, listener, true);
|
|
||||||
};
|
|
||||||
|
|
||||||
function onceWrapper() {
|
|
||||||
if (!this.fired) {
|
|
||||||
this.target.removeListener(this.type, this.wrapFn);
|
|
||||||
this.fired = true;
|
|
||||||
if (arguments.length === 0) return this.listener.call(this.target);
|
|
||||||
return this.listener.apply(this.target, arguments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function _onceWrap(target, type, listener) {
|
|
||||||
var state = {
|
|
||||||
fired: false,
|
|
||||||
wrapFn: undefined,
|
|
||||||
target: target,
|
|
||||||
type: type,
|
|
||||||
listener: listener,
|
|
||||||
};
|
|
||||||
var wrapped = onceWrapper.bind(state);
|
|
||||||
wrapped.listener = listener;
|
|
||||||
state.wrapFn = wrapped;
|
|
||||||
return wrapped;
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.prototype.once = function once(type, listener) {
|
|
||||||
checkListener(listener);
|
|
||||||
this.on(type, _onceWrap(this, type, listener));
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.prependOnceListener = function prependOnceListener(
|
|
||||||
type,
|
|
||||||
listener
|
|
||||||
) {
|
|
||||||
checkListener(listener);
|
|
||||||
this.prependListener(type, _onceWrap(this, type, listener));
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Emits a 'removeListener' event if and only if the listener was removed.
|
|
||||||
EventEmitter.prototype.removeListener = function removeListener(
|
|
||||||
type,
|
|
||||||
listener
|
|
||||||
) {
|
|
||||||
var list, events, position, i, originalListener;
|
|
||||||
|
|
||||||
checkListener(listener);
|
|
||||||
|
|
||||||
events = this._events;
|
|
||||||
if (events === undefined) return this;
|
|
||||||
|
|
||||||
list = events[type];
|
|
||||||
if (list === undefined) return this;
|
|
||||||
|
|
||||||
if (list === listener || list.listener === listener) {
|
|
||||||
if (--this._eventsCount === 0) this._events = Object.create(null);
|
|
||||||
else {
|
|
||||||
delete events[type];
|
|
||||||
if (events.removeListener)
|
|
||||||
this.emit('removeListener', type, list.listener || listener);
|
|
||||||
}
|
|
||||||
} else if (typeof list !== 'function') {
|
|
||||||
position = -1;
|
|
||||||
|
|
||||||
for (i = list.length - 1; i >= 0; i--) {
|
|
||||||
if (list[i] === listener || list[i].listener === listener) {
|
|
||||||
originalListener = list[i].listener;
|
|
||||||
position = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (position < 0) return this;
|
|
||||||
|
|
||||||
if (position === 0) list.shift();
|
|
||||||
else {
|
|
||||||
spliceOne(list, position);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (list.length === 1) events[type] = list[0];
|
|
||||||
|
|
||||||
if (events.removeListener !== undefined)
|
|
||||||
this.emit('removeListener', type, originalListener || listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
|
|
||||||
|
|
||||||
EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) {
|
|
||||||
var listeners, events, i;
|
|
||||||
|
|
||||||
events = this._events;
|
|
||||||
if (events === undefined) return this;
|
|
||||||
|
|
||||||
// not listening for removeListener, no need to emit
|
|
||||||
if (events.removeListener === undefined) {
|
|
||||||
if (arguments.length === 0) {
|
|
||||||
this._events = Object.create(null);
|
|
||||||
this._eventsCount = 0;
|
|
||||||
} else if (events[type] !== undefined) {
|
|
||||||
if (--this._eventsCount === 0) this._events = Object.create(null);
|
|
||||||
else delete events[type];
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// emit removeListener for all listeners on all events
|
|
||||||
if (arguments.length === 0) {
|
|
||||||
var keys = Object.keys(events);
|
|
||||||
var key;
|
|
||||||
for (i = 0; i < keys.length; ++i) {
|
|
||||||
key = keys[i];
|
|
||||||
if (key === 'removeListener') continue;
|
|
||||||
this.removeAllListeners(key);
|
|
||||||
}
|
|
||||||
this.removeAllListeners('removeListener');
|
|
||||||
this._events = Object.create(null);
|
|
||||||
this._eventsCount = 0;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
listeners = events[type];
|
|
||||||
|
|
||||||
if (typeof listeners === 'function') {
|
|
||||||
this.removeListener(type, listeners);
|
|
||||||
} else if (listeners !== undefined) {
|
|
||||||
// LIFO order
|
|
||||||
for (i = listeners.length - 1; i >= 0; i--) {
|
|
||||||
this.removeListener(type, listeners[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
function _listeners(target, type, unwrap) {
|
|
||||||
var events = target._events;
|
|
||||||
|
|
||||||
if (events === undefined) return [];
|
|
||||||
|
|
||||||
var evlistener = events[type];
|
|
||||||
if (evlistener === undefined) return [];
|
|
||||||
|
|
||||||
if (typeof evlistener === 'function')
|
|
||||||
return unwrap ? [evlistener.listener || evlistener] : [evlistener];
|
|
||||||
|
|
||||||
return unwrap
|
|
||||||
? unwrapListeners(evlistener)
|
|
||||||
: arrayClone(evlistener, evlistener.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.prototype.listeners = function listeners(type) {
|
|
||||||
return _listeners(this, type, true);
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.rawListeners = function rawListeners(type) {
|
|
||||||
return _listeners(this, type, false);
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.listenerCount = function (emitter, type) {
|
|
||||||
if (typeof emitter.listenerCount === 'function') {
|
|
||||||
return emitter.listenerCount(type);
|
|
||||||
} else {
|
|
||||||
return listenerCount.call(emitter, type);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.listenerCount = listenerCount;
|
|
||||||
function listenerCount(type) {
|
|
||||||
var events = this._events;
|
|
||||||
|
|
||||||
if (events !== undefined) {
|
|
||||||
var evlistener = events[type];
|
|
||||||
|
|
||||||
if (typeof evlistener === 'function') {
|
|
||||||
return 1;
|
|
||||||
} else if (evlistener !== undefined) {
|
|
||||||
return evlistener.length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.prototype.eventNames = function eventNames() {
|
|
||||||
return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
|
|
||||||
};
|
|
||||||
|
|
||||||
function arrayClone(arr, n) {
|
|
||||||
var copy = new Array(n);
|
|
||||||
for (var i = 0; i < n; ++i) copy[i] = arr[i];
|
|
||||||
return copy;
|
|
||||||
}
|
|
||||||
|
|
||||||
function spliceOne(list, index) {
|
|
||||||
for (; index + 1 < list.length; index++) list[index] = list[index + 1];
|
|
||||||
list.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
function unwrapListeners(arr) {
|
|
||||||
var ret = new Array(arr.length);
|
|
||||||
for (var i = 0; i < ret.length; ++i) {
|
|
||||||
ret[i] = arr[i].listener || arr[i];
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
function once(emitter, name) {
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
function errorListener(err) {
|
|
||||||
emitter.removeListener(name, resolver);
|
|
||||||
reject(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
function resolver() {
|
|
||||||
if (typeof emitter.removeListener === 'function') {
|
|
||||||
emitter.removeListener('error', errorListener);
|
|
||||||
}
|
|
||||||
resolve([].slice.call(arguments));
|
|
||||||
}
|
|
||||||
|
|
||||||
eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
|
|
||||||
if (name !== 'error') {
|
|
||||||
addErrorHandlerIfEventEmitter(emitter, errorListener, {
|
|
||||||
once: true,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
|
|
||||||
if (typeof emitter.on === 'function') {
|
|
||||||
eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
|
|
||||||
if (typeof emitter.on === 'function') {
|
|
||||||
if (flags.once) {
|
|
||||||
emitter.once(name, listener);
|
|
||||||
} else {
|
|
||||||
emitter.on(name, listener);
|
|
||||||
}
|
|
||||||
} else if (typeof emitter.addEventListener === 'function') {
|
|
||||||
// EventTarget does not have `error` event semantics like Node
|
|
||||||
// EventEmitters, we do not listen for `error` events here.
|
|
||||||
emitter.addEventListener(name, function wrapListener(arg) {
|
|
||||||
// IE does not have builtin `{ once: true }` support so we
|
|
||||||
// have to do it manually.
|
|
||||||
if (flags.once) {
|
|
||||||
emitter.removeEventListener(name, wrapListener);
|
|
||||||
}
|
|
||||||
listener(arg);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
throw new TypeError(
|
|
||||||
'The "emitter" argument must be of type EventEmitter. Received type ' +
|
|
||||||
typeof emitter
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from './events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from './hook.js';
|
import HookEvent from './hook.js';
|
||||||
|
|
||||||
class History extends EventEmitter {
|
class History extends EventEmitter {
|
||||||
|
|
|
@ -13,7 +13,7 @@ import MessageApi from './message.js';
|
||||||
import NavigatorApi from './navigator.js';
|
import NavigatorApi from './navigator.js';
|
||||||
import Workers from './worker.js';
|
import Workers from './worker.js';
|
||||||
import URLApi from './url.js';
|
import URLApi from './url.js';
|
||||||
import EventEmitter from './events.js';
|
import EventEmitter from 'events';
|
||||||
import StorageApi from './storage.js';
|
import StorageApi from './storage.js';
|
||||||
import StyleApi from './dom/style.js';
|
import StyleApi from './dom/style.js';
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from './events.js';
|
import EventEmitter from 'events';
|
||||||
|
|
||||||
class LocationApi extends EventEmitter {
|
class LocationApi extends EventEmitter {
|
||||||
constructor(ctx) {
|
constructor(ctx) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from './events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from './hook.js';
|
import HookEvent from './hook.js';
|
||||||
|
|
||||||
class MessageApi extends EventEmitter {
|
class MessageApi extends EventEmitter {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from '../events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from '../hook.js';
|
import HookEvent from '../hook.js';
|
||||||
|
|
||||||
class FunctionHook extends EventEmitter {
|
class FunctionHook extends EventEmitter {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from '../events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from '../hook.js';
|
import HookEvent from '../hook.js';
|
||||||
|
|
||||||
class ObjectHook extends EventEmitter {
|
class ObjectHook extends EventEmitter {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from './events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from './hook.js';
|
import HookEvent from './hook.js';
|
||||||
|
|
||||||
class NavigatorApi extends EventEmitter {
|
class NavigatorApi extends EventEmitter {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from '../events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from '../hook.js';
|
import HookEvent from '../hook.js';
|
||||||
|
|
||||||
class EventSourceApi extends EventEmitter {
|
class EventSourceApi extends EventEmitter {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from '../events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from '../hook.js';
|
import HookEvent from '../hook.js';
|
||||||
|
|
||||||
class Fetch extends EventEmitter {
|
class Fetch extends EventEmitter {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from '../events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from '../hook.js';
|
import HookEvent from '../hook.js';
|
||||||
|
|
||||||
class Xhr extends EventEmitter {
|
class Xhr extends EventEmitter {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from './events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from './hook.js';
|
import HookEvent from './hook.js';
|
||||||
|
|
||||||
class StorageApi extends EventEmitter {
|
class StorageApi extends EventEmitter {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from './events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from './hook.js';
|
import HookEvent from './hook.js';
|
||||||
|
|
||||||
class URLApi extends EventEmitter {
|
class URLApi extends EventEmitter {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from './events.js';
|
import EventEmitter from 'events';
|
||||||
import HookEvent from './hook.js';
|
import HookEvent from './hook.js';
|
||||||
|
|
||||||
class Workers extends EventEmitter {
|
class Workers extends EventEmitter {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { parse, walk, generate } from 'css-tree';
|
import { parse, walk, generate } from 'css-tree';
|
||||||
import EventEmitter from './events.js';
|
import EventEmitter from 'events';
|
||||||
import parsel from './parsel.js';
|
import parsel from './parsel.js';
|
||||||
|
|
||||||
class CSS extends EventEmitter {
|
class CSS extends EventEmitter {
|
||||||
|
|
|
@ -1,522 +0,0 @@
|
||||||
// Copyright Joyent, Inc. and other Node 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.
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var R = typeof Reflect === 'object' ? Reflect : null;
|
|
||||||
var ReflectApply =
|
|
||||||
R && typeof R.apply === 'function'
|
|
||||||
? R.apply
|
|
||||||
: function ReflectApply(target, receiver, args) {
|
|
||||||
return Function.prototype.apply.call(target, receiver, args);
|
|
||||||
};
|
|
||||||
|
|
||||||
var ReflectOwnKeys;
|
|
||||||
if (R && typeof R.ownKeys === 'function') {
|
|
||||||
ReflectOwnKeys = R.ownKeys;
|
|
||||||
} else if (Object.getOwnPropertySymbols) {
|
|
||||||
ReflectOwnKeys = function ReflectOwnKeys(target) {
|
|
||||||
return Object.getOwnPropertyNames(target).concat(
|
|
||||||
Object.getOwnPropertySymbols(target)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
ReflectOwnKeys = function ReflectOwnKeys(target) {
|
|
||||||
return Object.getOwnPropertyNames(target);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function ProcessEmitWarning(warning) {
|
|
||||||
if (console && console.warn) console.warn(warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
var NumberIsNaN =
|
|
||||||
Number.isNaN ||
|
|
||||||
function NumberIsNaN(value) {
|
|
||||||
return value !== value;
|
|
||||||
};
|
|
||||||
|
|
||||||
function EventEmitter() {
|
|
||||||
EventEmitter.init.call(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default EventEmitter;
|
|
||||||
|
|
||||||
// Backwards-compat with node 0.10.x
|
|
||||||
EventEmitter.EventEmitter = EventEmitter;
|
|
||||||
|
|
||||||
EventEmitter.prototype._events = undefined;
|
|
||||||
EventEmitter.prototype._eventsCount = 0;
|
|
||||||
EventEmitter.prototype._maxListeners = undefined;
|
|
||||||
|
|
||||||
// By default EventEmitters will print a warning if more than 10 listeners are
|
|
||||||
// added to it. This is a useful default which helps finding memory leaks.
|
|
||||||
var defaultMaxListeners = 10;
|
|
||||||
|
|
||||||
function checkListener(listener) {
|
|
||||||
if (typeof listener !== 'function') {
|
|
||||||
throw new TypeError(
|
|
||||||
'The "listener" argument must be of type Function. Received type ' +
|
|
||||||
typeof listener
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
|
|
||||||
enumerable: true,
|
|
||||||
get: function () {
|
|
||||||
return defaultMaxListeners;
|
|
||||||
},
|
|
||||||
set: function (arg) {
|
|
||||||
if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
|
|
||||||
throw new RangeError(
|
|
||||||
'The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' +
|
|
||||||
arg +
|
|
||||||
'.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
defaultMaxListeners = arg;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
EventEmitter.init = function () {
|
|
||||||
if (
|
|
||||||
this._events === undefined ||
|
|
||||||
this._events === Object.getPrototypeOf(this)._events
|
|
||||||
) {
|
|
||||||
this._events = Object.create(null);
|
|
||||||
this._eventsCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._maxListeners = this._maxListeners || undefined;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Obviously not all Emitters should be limited to 10. This function allows
|
|
||||||
// that to be increased. Set to zero for unlimited.
|
|
||||||
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
|
|
||||||
if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {
|
|
||||||
throw new RangeError(
|
|
||||||
'The value of "n" is out of range. It must be a non-negative number. Received ' +
|
|
||||||
n +
|
|
||||||
'.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
this._maxListeners = n;
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
function _getMaxListeners(that) {
|
|
||||||
if (that._maxListeners === undefined)
|
|
||||||
return EventEmitter.defaultMaxListeners;
|
|
||||||
return that._maxListeners;
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
|
|
||||||
return _getMaxListeners(this);
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.emit = function emit(type) {
|
|
||||||
var args = [];
|
|
||||||
for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
|
|
||||||
var doError = type === 'error';
|
|
||||||
|
|
||||||
var events = this._events;
|
|
||||||
if (events !== undefined) doError = doError && events.error === undefined;
|
|
||||||
else if (!doError) return false;
|
|
||||||
|
|
||||||
// If there is no 'error' event listener then throw.
|
|
||||||
if (doError) {
|
|
||||||
var er;
|
|
||||||
if (args.length > 0) er = args[0];
|
|
||||||
if (er instanceof Error) {
|
|
||||||
// Note: The comments on the `throw` lines are intentional, they show
|
|
||||||
// up in Node's output if this results in an unhandled exception.
|
|
||||||
throw er; // Unhandled 'error' event
|
|
||||||
}
|
|
||||||
// At least give some kind of context to the user
|
|
||||||
var err = new Error(
|
|
||||||
'Unhandled error.' + (er ? ' (' + er.message + ')' : '')
|
|
||||||
);
|
|
||||||
err.context = er;
|
|
||||||
throw err; // Unhandled 'error' event
|
|
||||||
}
|
|
||||||
|
|
||||||
var handler = events[type];
|
|
||||||
|
|
||||||
if (handler === undefined) return false;
|
|
||||||
|
|
||||||
if (typeof handler === 'function') {
|
|
||||||
ReflectApply(handler, this, args);
|
|
||||||
} else {
|
|
||||||
var len = handler.length;
|
|
||||||
var listeners = arrayClone(handler, len);
|
|
||||||
for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
function _addListener(target, type, listener, prepend) {
|
|
||||||
var m;
|
|
||||||
var events;
|
|
||||||
var existing;
|
|
||||||
|
|
||||||
checkListener(listener);
|
|
||||||
|
|
||||||
events = target._events;
|
|
||||||
if (events === undefined) {
|
|
||||||
events = target._events = Object.create(null);
|
|
||||||
target._eventsCount = 0;
|
|
||||||
} else {
|
|
||||||
// To avoid recursion in the case that type === "newListener"! Before
|
|
||||||
// adding it to the listeners, first emit "newListener".
|
|
||||||
if (events.newListener !== undefined) {
|
|
||||||
target.emit(
|
|
||||||
'newListener',
|
|
||||||
type,
|
|
||||||
listener.listener ? listener.listener : listener
|
|
||||||
);
|
|
||||||
|
|
||||||
// Re-assign `events` because a newListener handler could have caused the
|
|
||||||
// this._events to be assigned to a new object
|
|
||||||
events = target._events;
|
|
||||||
}
|
|
||||||
existing = events[type];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (existing === undefined) {
|
|
||||||
// Optimize the case of one listener. Don't need the extra array object.
|
|
||||||
existing = events[type] = listener;
|
|
||||||
++target._eventsCount;
|
|
||||||
} else {
|
|
||||||
if (typeof existing === 'function') {
|
|
||||||
// Adding the second element, need to change to array.
|
|
||||||
existing = events[type] = prepend
|
|
||||||
? [listener, existing]
|
|
||||||
: [existing, listener];
|
|
||||||
// If we've already got an array, just append.
|
|
||||||
} else if (prepend) {
|
|
||||||
existing.unshift(listener);
|
|
||||||
} else {
|
|
||||||
existing.push(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for listener leak
|
|
||||||
m = _getMaxListeners(target);
|
|
||||||
if (m > 0 && existing.length > m && !existing.warned) {
|
|
||||||
existing.warned = true;
|
|
||||||
// No error code for this since it is a Warning
|
|
||||||
// eslint-disable-next-line no-restricted-syntax
|
|
||||||
var w = new Error(
|
|
||||||
'Possible EventEmitter memory leak detected. ' +
|
|
||||||
existing.length +
|
|
||||||
' ' +
|
|
||||||
String(type) +
|
|
||||||
' listeners ' +
|
|
||||||
'added. Use emitter.setMaxListeners() to ' +
|
|
||||||
'increase limit'
|
|
||||||
);
|
|
||||||
w.name = 'MaxListenersExceededWarning';
|
|
||||||
w.emitter = target;
|
|
||||||
w.type = type;
|
|
||||||
w.count = existing.length;
|
|
||||||
ProcessEmitWarning(w);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.prototype.addListener = function addListener(type, listener) {
|
|
||||||
return _addListener(this, type, listener, false);
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
|
|
||||||
|
|
||||||
EventEmitter.prototype.prependListener = function prependListener(
|
|
||||||
type,
|
|
||||||
listener
|
|
||||||
) {
|
|
||||||
return _addListener(this, type, listener, true);
|
|
||||||
};
|
|
||||||
|
|
||||||
function onceWrapper() {
|
|
||||||
if (!this.fired) {
|
|
||||||
this.target.removeListener(this.type, this.wrapFn);
|
|
||||||
this.fired = true;
|
|
||||||
if (arguments.length === 0) return this.listener.call(this.target);
|
|
||||||
return this.listener.apply(this.target, arguments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function _onceWrap(target, type, listener) {
|
|
||||||
var state = {
|
|
||||||
fired: false,
|
|
||||||
wrapFn: undefined,
|
|
||||||
target: target,
|
|
||||||
type: type,
|
|
||||||
listener: listener,
|
|
||||||
};
|
|
||||||
var wrapped = onceWrapper.bind(state);
|
|
||||||
wrapped.listener = listener;
|
|
||||||
state.wrapFn = wrapped;
|
|
||||||
return wrapped;
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.prototype.once = function once(type, listener) {
|
|
||||||
checkListener(listener);
|
|
||||||
this.on(type, _onceWrap(this, type, listener));
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.prependOnceListener = function prependOnceListener(
|
|
||||||
type,
|
|
||||||
listener
|
|
||||||
) {
|
|
||||||
checkListener(listener);
|
|
||||||
this.prependListener(type, _onceWrap(this, type, listener));
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Emits a 'removeListener' event if and only if the listener was removed.
|
|
||||||
EventEmitter.prototype.removeListener = function removeListener(
|
|
||||||
type,
|
|
||||||
listener
|
|
||||||
) {
|
|
||||||
var list, events, position, i, originalListener;
|
|
||||||
|
|
||||||
checkListener(listener);
|
|
||||||
|
|
||||||
events = this._events;
|
|
||||||
if (events === undefined) return this;
|
|
||||||
|
|
||||||
list = events[type];
|
|
||||||
if (list === undefined) return this;
|
|
||||||
|
|
||||||
if (list === listener || list.listener === listener) {
|
|
||||||
if (--this._eventsCount === 0) this._events = Object.create(null);
|
|
||||||
else {
|
|
||||||
delete events[type];
|
|
||||||
if (events.removeListener)
|
|
||||||
this.emit('removeListener', type, list.listener || listener);
|
|
||||||
}
|
|
||||||
} else if (typeof list !== 'function') {
|
|
||||||
position = -1;
|
|
||||||
|
|
||||||
for (i = list.length - 1; i >= 0; i--) {
|
|
||||||
if (list[i] === listener || list[i].listener === listener) {
|
|
||||||
originalListener = list[i].listener;
|
|
||||||
position = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (position < 0) return this;
|
|
||||||
|
|
||||||
if (position === 0) list.shift();
|
|
||||||
else {
|
|
||||||
spliceOne(list, position);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (list.length === 1) events[type] = list[0];
|
|
||||||
|
|
||||||
if (events.removeListener !== undefined)
|
|
||||||
this.emit('removeListener', type, originalListener || listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
|
|
||||||
|
|
||||||
EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) {
|
|
||||||
var listeners, events, i;
|
|
||||||
|
|
||||||
events = this._events;
|
|
||||||
if (events === undefined) return this;
|
|
||||||
|
|
||||||
// not listening for removeListener, no need to emit
|
|
||||||
if (events.removeListener === undefined) {
|
|
||||||
if (arguments.length === 0) {
|
|
||||||
this._events = Object.create(null);
|
|
||||||
this._eventsCount = 0;
|
|
||||||
} else if (events[type] !== undefined) {
|
|
||||||
if (--this._eventsCount === 0) this._events = Object.create(null);
|
|
||||||
else delete events[type];
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// emit removeListener for all listeners on all events
|
|
||||||
if (arguments.length === 0) {
|
|
||||||
var keys = Object.keys(events);
|
|
||||||
var key;
|
|
||||||
for (i = 0; i < keys.length; ++i) {
|
|
||||||
key = keys[i];
|
|
||||||
if (key === 'removeListener') continue;
|
|
||||||
this.removeAllListeners(key);
|
|
||||||
}
|
|
||||||
this.removeAllListeners('removeListener');
|
|
||||||
this._events = Object.create(null);
|
|
||||||
this._eventsCount = 0;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
listeners = events[type];
|
|
||||||
|
|
||||||
if (typeof listeners === 'function') {
|
|
||||||
this.removeListener(type, listeners);
|
|
||||||
} else if (listeners !== undefined) {
|
|
||||||
// LIFO order
|
|
||||||
for (i = listeners.length - 1; i >= 0; i--) {
|
|
||||||
this.removeListener(type, listeners[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
function _listeners(target, type, unwrap) {
|
|
||||||
var events = target._events;
|
|
||||||
|
|
||||||
if (events === undefined) return [];
|
|
||||||
|
|
||||||
var evlistener = events[type];
|
|
||||||
if (evlistener === undefined) return [];
|
|
||||||
|
|
||||||
if (typeof evlistener === 'function')
|
|
||||||
return unwrap ? [evlistener.listener || evlistener] : [evlistener];
|
|
||||||
|
|
||||||
return unwrap
|
|
||||||
? unwrapListeners(evlistener)
|
|
||||||
: arrayClone(evlistener, evlistener.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.prototype.listeners = function listeners(type) {
|
|
||||||
return _listeners(this, type, true);
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.rawListeners = function rawListeners(type) {
|
|
||||||
return _listeners(this, type, false);
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.listenerCount = function (emitter, type) {
|
|
||||||
if (typeof emitter.listenerCount === 'function') {
|
|
||||||
return emitter.listenerCount(type);
|
|
||||||
} else {
|
|
||||||
return listenerCount.call(emitter, type);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.listenerCount = listenerCount;
|
|
||||||
function listenerCount(type) {
|
|
||||||
var events = this._events;
|
|
||||||
|
|
||||||
if (events !== undefined) {
|
|
||||||
var evlistener = events[type];
|
|
||||||
|
|
||||||
if (typeof evlistener === 'function') {
|
|
||||||
return 1;
|
|
||||||
} else if (evlistener !== undefined) {
|
|
||||||
return evlistener.length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.prototype.eventNames = function eventNames() {
|
|
||||||
return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
|
|
||||||
};
|
|
||||||
|
|
||||||
function arrayClone(arr, n) {
|
|
||||||
var copy = new Array(n);
|
|
||||||
for (var i = 0; i < n; ++i) copy[i] = arr[i];
|
|
||||||
return copy;
|
|
||||||
}
|
|
||||||
|
|
||||||
function spliceOne(list, index) {
|
|
||||||
for (; index + 1 < list.length; index++) list[index] = list[index + 1];
|
|
||||||
list.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
function unwrapListeners(arr) {
|
|
||||||
var ret = new Array(arr.length);
|
|
||||||
for (var i = 0; i < ret.length; ++i) {
|
|
||||||
ret[i] = arr[i].listener || arr[i];
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
function once(emitter, name) {
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
function errorListener(err) {
|
|
||||||
emitter.removeListener(name, resolver);
|
|
||||||
reject(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
function resolver() {
|
|
||||||
if (typeof emitter.removeListener === 'function') {
|
|
||||||
emitter.removeListener('error', errorListener);
|
|
||||||
}
|
|
||||||
resolve([].slice.call(arguments));
|
|
||||||
}
|
|
||||||
|
|
||||||
eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
|
|
||||||
if (name !== 'error') {
|
|
||||||
addErrorHandlerIfEventEmitter(emitter, errorListener, {
|
|
||||||
once: true,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
|
|
||||||
if (typeof emitter.on === 'function') {
|
|
||||||
eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
|
|
||||||
if (typeof emitter.on === 'function') {
|
|
||||||
if (flags.once) {
|
|
||||||
emitter.once(name, listener);
|
|
||||||
} else {
|
|
||||||
emitter.on(name, listener);
|
|
||||||
}
|
|
||||||
} else if (typeof emitter.addEventListener === 'function') {
|
|
||||||
// EventTarget does not have `error` event semantics like Node
|
|
||||||
// EventEmitters, we do not listen for `error` events here.
|
|
||||||
emitter.addEventListener(name, function wrapListener(arg) {
|
|
||||||
// IE does not have builtin `{ once: true }` support so we
|
|
||||||
// have to do it manually.
|
|
||||||
if (flags.once) {
|
|
||||||
emitter.removeEventListener(name, wrapListener);
|
|
||||||
}
|
|
||||||
listener(arg);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
throw new TypeError(
|
|
||||||
'The "emitter" argument must be of type EventEmitter. Received type ' +
|
|
||||||
typeof emitter
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,4 +1,4 @@
|
||||||
import EventEmitter from './events.js';
|
import EventEmitter from 'events';
|
||||||
import { parse, parseFragment, serialize } from 'parse5';
|
import { parse, parseFragment, serialize } from 'parse5';
|
||||||
|
|
||||||
class HTML extends EventEmitter {
|
class HTML extends EventEmitter {
|
||||||
|
|
|
@ -37,6 +37,7 @@ import parsel from './parsel.js';
|
||||||
import UVClient from '../client/index.js';
|
import UVClient from '../client/index.js';
|
||||||
import Bowser from 'bowser';
|
import Bowser from 'bowser';
|
||||||
import BareClient from '@tomphttp/bare-client';
|
import BareClient from '@tomphttp/bare-client';
|
||||||
|
import EventEmitter from 'events';
|
||||||
|
|
||||||
const valid_chars =
|
const valid_chars =
|
||||||
"!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~";
|
"!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~";
|
||||||
|
@ -214,6 +215,7 @@ class Ultraviolet {
|
||||||
static openDB = openDB;
|
static openDB = openDB;
|
||||||
static Bowser = Bowser;
|
static Bowser = Bowser;
|
||||||
static BareClient = BareClient;
|
static BareClient = BareClient;
|
||||||
|
static EventEmitter = EventEmitter;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Ultraviolet;
|
export default Ultraviolet;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { parseScript } from 'meriyah';
|
import { parseScript } from 'meriyah';
|
||||||
// import { parse } from 'acorn-hammerhead';
|
// import { parse } from 'acorn-hammerhead';
|
||||||
import { generate } from 'esotope-hammerhead';
|
import { generate } from 'esotope-hammerhead';
|
||||||
import EventEmitter from './events.js';
|
import EventEmitter from 'events';
|
||||||
|
|
||||||
class JS extends EventEmitter {
|
class JS extends EventEmitter {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
|
500
src/uv.sw.js
500
src/uv.sw.js
|
@ -31,7 +31,7 @@ const cspHeaders = [
|
||||||
const emptyMethods = ['GET', 'HEAD'];
|
const emptyMethods = ['GET', 'HEAD'];
|
||||||
const emptyStatus = [204, 304];
|
const emptyStatus = [204, 304];
|
||||||
|
|
||||||
class UVServiceWorker extends EventEmitter {
|
class UVServiceWorker extends Ultraviolet.EventEmitter {
|
||||||
constructor(config = __uv$config) {
|
constructor(config = __uv$config) {
|
||||||
super();
|
super();
|
||||||
if (!config.bare) config.bare = '/bare/';
|
if (!config.bare) config.bare = '/bare/';
|
||||||
|
@ -344,501 +344,3 @@ class HookEvent {
|
||||||
this.#intercepted = true;
|
this.#intercepted = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var R = typeof Reflect === 'object' ? Reflect : null;
|
|
||||||
var ReflectApply =
|
|
||||||
R && typeof R.apply === 'function'
|
|
||||||
? R.apply
|
|
||||||
: function ReflectApply(target, receiver, args) {
|
|
||||||
return Function.prototype.apply.call(target, receiver, args);
|
|
||||||
};
|
|
||||||
|
|
||||||
var ReflectOwnKeys;
|
|
||||||
if (R && typeof R.ownKeys === 'function') {
|
|
||||||
ReflectOwnKeys = R.ownKeys;
|
|
||||||
} else if (Object.getOwnPropertySymbols) {
|
|
||||||
ReflectOwnKeys = function ReflectOwnKeys(target) {
|
|
||||||
return Object.getOwnPropertyNames(target).concat(
|
|
||||||
Object.getOwnPropertySymbols(target)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
ReflectOwnKeys = function ReflectOwnKeys(target) {
|
|
||||||
return Object.getOwnPropertyNames(target);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function ProcessEmitWarning(warning) {
|
|
||||||
if (console && console.warn) console.warn(warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
var NumberIsNaN =
|
|
||||||
Number.isNaN ||
|
|
||||||
function NumberIsNaN(value) {
|
|
||||||
return value !== value;
|
|
||||||
};
|
|
||||||
|
|
||||||
function EventEmitter() {
|
|
||||||
EventEmitter.init.call(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Backwards-compat with node 0.10.x
|
|
||||||
EventEmitter.EventEmitter = EventEmitter;
|
|
||||||
|
|
||||||
EventEmitter.prototype._events = undefined;
|
|
||||||
EventEmitter.prototype._eventsCount = 0;
|
|
||||||
EventEmitter.prototype._maxListeners = undefined;
|
|
||||||
|
|
||||||
// By default EventEmitters will print a warning if more than 10 listeners are
|
|
||||||
// added to it. This is a useful default which helps finding memory leaks.
|
|
||||||
var defaultMaxListeners = 10;
|
|
||||||
|
|
||||||
function checkListener(listener) {
|
|
||||||
if (typeof listener !== 'function') {
|
|
||||||
throw new TypeError(
|
|
||||||
'The "listener" argument must be of type Function. Received type ' +
|
|
||||||
typeof listener
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
|
|
||||||
enumerable: true,
|
|
||||||
get: function () {
|
|
||||||
return defaultMaxListeners;
|
|
||||||
},
|
|
||||||
set: function (arg) {
|
|
||||||
if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
|
|
||||||
throw new RangeError(
|
|
||||||
'The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' +
|
|
||||||
arg +
|
|
||||||
'.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
defaultMaxListeners = arg;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
EventEmitter.init = function () {
|
|
||||||
if (
|
|
||||||
this._events === undefined ||
|
|
||||||
this._events === Object.getPrototypeOf(this)._events
|
|
||||||
) {
|
|
||||||
this._events = Object.create(null);
|
|
||||||
this._eventsCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._maxListeners = this._maxListeners || undefined;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Obviously not all Emitters should be limited to 10. This function allows
|
|
||||||
// that to be increased. Set to zero for unlimited.
|
|
||||||
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
|
|
||||||
if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {
|
|
||||||
throw new RangeError(
|
|
||||||
'The value of "n" is out of range. It must be a non-negative number. Received ' +
|
|
||||||
n +
|
|
||||||
'.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
this._maxListeners = n;
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
function _getMaxListeners(that) {
|
|
||||||
if (that._maxListeners === undefined)
|
|
||||||
return EventEmitter.defaultMaxListeners;
|
|
||||||
return that._maxListeners;
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
|
|
||||||
return _getMaxListeners(this);
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.emit = function emit(type) {
|
|
||||||
var args = [];
|
|
||||||
for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
|
|
||||||
var doError = type === 'error';
|
|
||||||
|
|
||||||
var events = this._events;
|
|
||||||
if (events !== undefined) doError = doError && events.error === undefined;
|
|
||||||
else if (!doError) return false;
|
|
||||||
|
|
||||||
// If there is no 'error' event listener then throw.
|
|
||||||
if (doError) {
|
|
||||||
var er;
|
|
||||||
if (args.length > 0) er = args[0];
|
|
||||||
if (er instanceof Error) {
|
|
||||||
// Note: The comments on the `throw` lines are intentional, they show
|
|
||||||
// up in Node's output if this results in an unhandled exception.
|
|
||||||
throw er; // Unhandled 'error' event
|
|
||||||
}
|
|
||||||
// At least give some kind of context to the user
|
|
||||||
var err = new Error(
|
|
||||||
'Unhandled error.' + (er ? ' (' + er.message + ')' : '')
|
|
||||||
);
|
|
||||||
err.context = er;
|
|
||||||
throw err; // Unhandled 'error' event
|
|
||||||
}
|
|
||||||
|
|
||||||
var handler = events[type];
|
|
||||||
|
|
||||||
if (handler === undefined) return false;
|
|
||||||
|
|
||||||
if (typeof handler === 'function') {
|
|
||||||
ReflectApply(handler, this, args);
|
|
||||||
} else {
|
|
||||||
var len = handler.length;
|
|
||||||
var listeners = arrayClone(handler, len);
|
|
||||||
for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
function _addListener(target, type, listener, prepend) {
|
|
||||||
var m;
|
|
||||||
var events;
|
|
||||||
var existing;
|
|
||||||
|
|
||||||
checkListener(listener);
|
|
||||||
|
|
||||||
events = target._events;
|
|
||||||
if (events === undefined) {
|
|
||||||
events = target._events = Object.create(null);
|
|
||||||
target._eventsCount = 0;
|
|
||||||
} else {
|
|
||||||
// To avoid recursion in the case that type === "newListener"! Before
|
|
||||||
// adding it to the listeners, first emit "newListener".
|
|
||||||
if (events.newListener !== undefined) {
|
|
||||||
target.emit(
|
|
||||||
'newListener',
|
|
||||||
type,
|
|
||||||
listener.listener ? listener.listener : listener
|
|
||||||
);
|
|
||||||
|
|
||||||
// Re-assign `events` because a newListener handler could have caused the
|
|
||||||
// this._events to be assigned to a new object
|
|
||||||
events = target._events;
|
|
||||||
}
|
|
||||||
existing = events[type];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (existing === undefined) {
|
|
||||||
// Optimize the case of one listener. Don't need the extra array object.
|
|
||||||
existing = events[type] = listener;
|
|
||||||
++target._eventsCount;
|
|
||||||
} else {
|
|
||||||
if (typeof existing === 'function') {
|
|
||||||
// Adding the second element, need to change to array.
|
|
||||||
existing = events[type] = prepend
|
|
||||||
? [listener, existing]
|
|
||||||
: [existing, listener];
|
|
||||||
// If we've already got an array, just append.
|
|
||||||
} else if (prepend) {
|
|
||||||
existing.unshift(listener);
|
|
||||||
} else {
|
|
||||||
existing.push(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for listener leak
|
|
||||||
m = _getMaxListeners(target);
|
|
||||||
if (m > 0 && existing.length > m && !existing.warned) {
|
|
||||||
existing.warned = true;
|
|
||||||
// No error code for this since it is a Warning
|
|
||||||
// eslint-disable-next-line no-restricted-syntax
|
|
||||||
var w = new Error(
|
|
||||||
'Possible EventEmitter memory leak detected. ' +
|
|
||||||
existing.length +
|
|
||||||
' ' +
|
|
||||||
String(type) +
|
|
||||||
' listeners ' +
|
|
||||||
'added. Use emitter.setMaxListeners() to ' +
|
|
||||||
'increase limit'
|
|
||||||
);
|
|
||||||
w.name = 'MaxListenersExceededWarning';
|
|
||||||
w.emitter = target;
|
|
||||||
w.type = type;
|
|
||||||
w.count = existing.length;
|
|
||||||
ProcessEmitWarning(w);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.prototype.addListener = function addListener(type, listener) {
|
|
||||||
return _addListener(this, type, listener, false);
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
|
|
||||||
|
|
||||||
EventEmitter.prototype.prependListener = function prependListener(
|
|
||||||
type,
|
|
||||||
listener
|
|
||||||
) {
|
|
||||||
return _addListener(this, type, listener, true);
|
|
||||||
};
|
|
||||||
|
|
||||||
function onceWrapper() {
|
|
||||||
if (!this.fired) {
|
|
||||||
this.target.removeListener(this.type, this.wrapFn);
|
|
||||||
this.fired = true;
|
|
||||||
if (arguments.length === 0) return this.listener.call(this.target);
|
|
||||||
return this.listener.apply(this.target, arguments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function _onceWrap(target, type, listener) {
|
|
||||||
var state = {
|
|
||||||
fired: false,
|
|
||||||
wrapFn: undefined,
|
|
||||||
target: target,
|
|
||||||
type: type,
|
|
||||||
listener: listener,
|
|
||||||
};
|
|
||||||
var wrapped = onceWrapper.bind(state);
|
|
||||||
wrapped.listener = listener;
|
|
||||||
state.wrapFn = wrapped;
|
|
||||||
return wrapped;
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.prototype.once = function once(type, listener) {
|
|
||||||
checkListener(listener);
|
|
||||||
this.on(type, _onceWrap(this, type, listener));
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.prependOnceListener = function prependOnceListener(
|
|
||||||
type,
|
|
||||||
listener
|
|
||||||
) {
|
|
||||||
checkListener(listener);
|
|
||||||
this.prependListener(type, _onceWrap(this, type, listener));
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Emits a 'removeListener' event if and only if the listener was removed.
|
|
||||||
EventEmitter.prototype.removeListener = function removeListener(
|
|
||||||
type,
|
|
||||||
listener
|
|
||||||
) {
|
|
||||||
var list, events, position, i, originalListener;
|
|
||||||
|
|
||||||
checkListener(listener);
|
|
||||||
|
|
||||||
events = this._events;
|
|
||||||
if (events === undefined) return this;
|
|
||||||
|
|
||||||
list = events[type];
|
|
||||||
if (list === undefined) return this;
|
|
||||||
|
|
||||||
if (list === listener || list.listener === listener) {
|
|
||||||
if (--this._eventsCount === 0) this._events = Object.create(null);
|
|
||||||
else {
|
|
||||||
delete events[type];
|
|
||||||
if (events.removeListener)
|
|
||||||
this.emit('removeListener', type, list.listener || listener);
|
|
||||||
}
|
|
||||||
} else if (typeof list !== 'function') {
|
|
||||||
position = -1;
|
|
||||||
|
|
||||||
for (i = list.length - 1; i >= 0; i--) {
|
|
||||||
if (list[i] === listener || list[i].listener === listener) {
|
|
||||||
originalListener = list[i].listener;
|
|
||||||
position = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (position < 0) return this;
|
|
||||||
|
|
||||||
if (position === 0) list.shift();
|
|
||||||
else {
|
|
||||||
spliceOne(list, position);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (list.length === 1) events[type] = list[0];
|
|
||||||
|
|
||||||
if (events.removeListener !== undefined)
|
|
||||||
this.emit('removeListener', type, originalListener || listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
|
|
||||||
|
|
||||||
EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) {
|
|
||||||
var listeners, events, i;
|
|
||||||
|
|
||||||
events = this._events;
|
|
||||||
if (events === undefined) return this;
|
|
||||||
|
|
||||||
// not listening for removeListener, no need to emit
|
|
||||||
if (events.removeListener === undefined) {
|
|
||||||
if (arguments.length === 0) {
|
|
||||||
this._events = Object.create(null);
|
|
||||||
this._eventsCount = 0;
|
|
||||||
} else if (events[type] !== undefined) {
|
|
||||||
if (--this._eventsCount === 0) this._events = Object.create(null);
|
|
||||||
else delete events[type];
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// emit removeListener for all listeners on all events
|
|
||||||
if (arguments.length === 0) {
|
|
||||||
var keys = Object.keys(events);
|
|
||||||
var key;
|
|
||||||
for (i = 0; i < keys.length; ++i) {
|
|
||||||
key = keys[i];
|
|
||||||
if (key === 'removeListener') continue;
|
|
||||||
this.removeAllListeners(key);
|
|
||||||
}
|
|
||||||
this.removeAllListeners('removeListener');
|
|
||||||
this._events = Object.create(null);
|
|
||||||
this._eventsCount = 0;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
listeners = events[type];
|
|
||||||
|
|
||||||
if (typeof listeners === 'function') {
|
|
||||||
this.removeListener(type, listeners);
|
|
||||||
} else if (listeners !== undefined) {
|
|
||||||
// LIFO order
|
|
||||||
for (i = listeners.length - 1; i >= 0; i--) {
|
|
||||||
this.removeListener(type, listeners[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
function _listeners(target, type, unwrap) {
|
|
||||||
var events = target._events;
|
|
||||||
|
|
||||||
if (events === undefined) return [];
|
|
||||||
|
|
||||||
var evlistener = events[type];
|
|
||||||
if (evlistener === undefined) return [];
|
|
||||||
|
|
||||||
if (typeof evlistener === 'function')
|
|
||||||
return unwrap ? [evlistener.listener || evlistener] : [evlistener];
|
|
||||||
|
|
||||||
return unwrap
|
|
||||||
? unwrapListeners(evlistener)
|
|
||||||
: arrayClone(evlistener, evlistener.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.prototype.listeners = function listeners(type) {
|
|
||||||
return _listeners(this, type, true);
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.rawListeners = function rawListeners(type) {
|
|
||||||
return _listeners(this, type, false);
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.listenerCount = function (emitter, type) {
|
|
||||||
if (typeof emitter.listenerCount === 'function') {
|
|
||||||
return emitter.listenerCount(type);
|
|
||||||
} else {
|
|
||||||
return listenerCount.call(emitter, type);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
EventEmitter.prototype.listenerCount = listenerCount;
|
|
||||||
function listenerCount(type) {
|
|
||||||
var events = this._events;
|
|
||||||
|
|
||||||
if (events !== undefined) {
|
|
||||||
var evlistener = events[type];
|
|
||||||
|
|
||||||
if (typeof evlistener === 'function') {
|
|
||||||
return 1;
|
|
||||||
} else if (evlistener !== undefined) {
|
|
||||||
return evlistener.length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
EventEmitter.prototype.eventNames = function eventNames() {
|
|
||||||
return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
|
|
||||||
};
|
|
||||||
|
|
||||||
function arrayClone(arr, n) {
|
|
||||||
var copy = new Array(n);
|
|
||||||
for (var i = 0; i < n; ++i) copy[i] = arr[i];
|
|
||||||
return copy;
|
|
||||||
}
|
|
||||||
|
|
||||||
function spliceOne(list, index) {
|
|
||||||
for (; index + 1 < list.length; index++) list[index] = list[index + 1];
|
|
||||||
list.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
function unwrapListeners(arr) {
|
|
||||||
var ret = new Array(arr.length);
|
|
||||||
for (var i = 0; i < ret.length; ++i) {
|
|
||||||
ret[i] = arr[i].listener || arr[i];
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
function once(emitter, name) {
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
function errorListener(err) {
|
|
||||||
emitter.removeListener(name, resolver);
|
|
||||||
reject(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
function resolver() {
|
|
||||||
if (typeof emitter.removeListener === 'function') {
|
|
||||||
emitter.removeListener('error', errorListener);
|
|
||||||
}
|
|
||||||
resolve([].slice.call(arguments));
|
|
||||||
}
|
|
||||||
|
|
||||||
eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
|
|
||||||
if (name !== 'error') {
|
|
||||||
addErrorHandlerIfEventEmitter(emitter, errorListener, {
|
|
||||||
once: true,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
|
|
||||||
if (typeof emitter.on === 'function') {
|
|
||||||
eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
|
|
||||||
if (typeof emitter.on === 'function') {
|
|
||||||
if (flags.once) {
|
|
||||||
emitter.once(name, listener);
|
|
||||||
} else {
|
|
||||||
emitter.on(name, listener);
|
|
||||||
}
|
|
||||||
} else if (typeof emitter.addEventListener === 'function') {
|
|
||||||
// EventTarget does not have `error` event semantics like Node
|
|
||||||
// EventEmitters, we do not listen for `error` events here.
|
|
||||||
emitter.addEventListener(name, function wrapListener(arg) {
|
|
||||||
// IE does not have builtin `{ once: true }` support so we
|
|
||||||
// have to do it manually.
|
|
||||||
if (flags.once) {
|
|
||||||
emitter.removeEventListener(name, wrapListener);
|
|
||||||
}
|
|
||||||
listener(arg);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
throw new TypeError(
|
|
||||||
'The "emitter" argument must be of type EventEmitter. Received type ' +
|
|
||||||
typeof emitter
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue