91 lines
3.2 KiB
JavaScript
91 lines
3.2 KiB
JavaScript
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
|
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
|
// Used https://gist.github.com/mudge/5830382 as a starting point.
|
|
// See https://github.com/browserify/events/blob/master/events.js for
|
|
// the Node.js (https://nodejs.org/api/events.html) polyfill used by webpack.
|
|
export var EventManager = /*#__PURE__*/function () {
|
|
function EventManager() {
|
|
_classCallCheck(this, EventManager);
|
|
this.maxListeners = 20;
|
|
this.warnOnce = false;
|
|
this.events = {};
|
|
}
|
|
_createClass(EventManager, [{
|
|
key: "on",
|
|
value: function on(eventName, listener) {
|
|
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
var collection = this.events[eventName];
|
|
if (!collection) {
|
|
collection = {
|
|
highPriority: new Map(),
|
|
regular: new Map()
|
|
};
|
|
this.events[eventName] = collection;
|
|
}
|
|
if (options.isFirst) {
|
|
collection.highPriority.set(listener, true);
|
|
} else {
|
|
collection.regular.set(listener, true);
|
|
}
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var collectionSize = collection.highPriority.size + collection.regular.size;
|
|
if (collectionSize > this.maxListeners && !this.warnOnce) {
|
|
this.warnOnce = true;
|
|
console.warn(["Possible EventEmitter memory leak detected. ".concat(collectionSize, " ").concat(eventName, " listeners added.")].join('\n'));
|
|
}
|
|
}
|
|
}
|
|
}, {
|
|
key: "removeListener",
|
|
value: function removeListener(eventName, listener) {
|
|
if (this.events[eventName]) {
|
|
this.events[eventName].regular.delete(listener);
|
|
this.events[eventName].highPriority.delete(listener);
|
|
}
|
|
}
|
|
}, {
|
|
key: "removeAllListeners",
|
|
value: function removeAllListeners() {
|
|
this.events = {};
|
|
}
|
|
}, {
|
|
key: "emit",
|
|
value: function emit(eventName) {
|
|
var collection = this.events[eventName];
|
|
if (!collection) {
|
|
return;
|
|
}
|
|
var highPriorityListeners = Array.from(collection.highPriority.keys());
|
|
var regularListeners = Array.from(collection.regular.keys());
|
|
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
args[_key - 1] = arguments[_key];
|
|
}
|
|
for (var i = highPriorityListeners.length - 1; i >= 0; i -= 1) {
|
|
var listener = highPriorityListeners[i];
|
|
if (collection.highPriority.has(listener)) {
|
|
listener.apply(this, args);
|
|
}
|
|
}
|
|
for (var _i = 0; _i < regularListeners.length; _i += 1) {
|
|
var _listener = regularListeners[_i];
|
|
if (collection.regular.has(_listener)) {
|
|
_listener.apply(this, args);
|
|
}
|
|
}
|
|
}
|
|
}, {
|
|
key: "once",
|
|
value: function once(eventName, listener) {
|
|
// eslint-disable-next-line consistent-this
|
|
var that = this;
|
|
this.on(eventName, function oneTimeListener() {
|
|
that.removeListener(eventName, oneTimeListener);
|
|
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
args[_key2] = arguments[_key2];
|
|
}
|
|
listener.apply(that, args);
|
|
});
|
|
}
|
|
}]);
|
|
return EventManager;
|
|
}(); |