2024-06-21 19:49:13 +03:00

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;
}();