Spaces:
Paused
Paused
| // src/MemoryLeakError.ts | |
| var MemoryLeakError = class extends Error { | |
| constructor(emitter, type, count) { | |
| super( | |
| `Possible EventEmitter memory leak detected. ${count} ${type.toString()} listeners added. Use emitter.setMaxListeners() to increase limit` | |
| ); | |
| this.emitter = emitter; | |
| this.type = type; | |
| this.count = count; | |
| this.name = "MaxListenersExceededWarning"; | |
| } | |
| }; | |
| // src/Emitter.ts | |
| var _Emitter = class { | |
| static listenerCount(emitter, eventName) { | |
| return emitter.listenerCount(eventName); | |
| } | |
| constructor() { | |
| this.events = /* @__PURE__ */ new Map(); | |
| this.maxListeners = _Emitter.defaultMaxListeners; | |
| this.hasWarnedAboutPotentialMemoryLeak = false; | |
| } | |
| _emitInternalEvent(internalEventName, eventName, listener) { | |
| this.emit( | |
| internalEventName, | |
| ...[eventName, listener] | |
| ); | |
| } | |
| _getListeners(eventName) { | |
| return Array.prototype.concat.apply([], this.events.get(eventName)) || []; | |
| } | |
| _removeListener(listeners, listener) { | |
| const index = listeners.indexOf(listener); | |
| if (index > -1) { | |
| listeners.splice(index, 1); | |
| } | |
| return []; | |
| } | |
| _wrapOnceListener(eventName, listener) { | |
| const onceListener = (...data) => { | |
| this.removeListener(eventName, onceListener); | |
| return listener.apply(this, data); | |
| }; | |
| Object.defineProperty(onceListener, "name", { value: listener.name }); | |
| return onceListener; | |
| } | |
| setMaxListeners(maxListeners) { | |
| this.maxListeners = maxListeners; | |
| return this; | |
| } | |
| /** | |
| * Returns the current max listener value for the `Emitter` which is | |
| * either set by `emitter.setMaxListeners(n)` or defaults to | |
| * `Emitter.defaultMaxListeners`. | |
| */ | |
| getMaxListeners() { | |
| return this.maxListeners; | |
| } | |
| /** | |
| * Returns an array listing the events for which the emitter has registered listeners. | |
| * The values in the array will be strings or Symbols. | |
| */ | |
| eventNames() { | |
| return Array.from(this.events.keys()); | |
| } | |
| /** | |
| * Synchronously calls each of the listeners registered for the event named `eventName`, | |
| * in the order they were registered, passing the supplied arguments to each. | |
| * Returns `true` if the event has listeners, `false` otherwise. | |
| * | |
| * @example | |
| * const emitter = new Emitter<{ hello: [string] }>() | |
| * emitter.emit('hello', 'John') | |
| */ | |
| emit(eventName, ...data) { | |
| const listeners = this._getListeners(eventName); | |
| listeners.forEach((listener) => { | |
| listener.apply(this, data); | |
| }); | |
| return listeners.length > 0; | |
| } | |
| addListener(eventName, listener) { | |
| this._emitInternalEvent("newListener", eventName, listener); | |
| const nextListeners = this._getListeners(eventName).concat(listener); | |
| this.events.set(eventName, nextListeners); | |
| if (this.maxListeners > 0 && this.listenerCount(eventName) > this.maxListeners && !this.hasWarnedAboutPotentialMemoryLeak) { | |
| this.hasWarnedAboutPotentialMemoryLeak = true; | |
| const memoryLeakWarning = new MemoryLeakError( | |
| this, | |
| eventName, | |
| this.listenerCount(eventName) | |
| ); | |
| console.warn(memoryLeakWarning); | |
| } | |
| return this; | |
| } | |
| on(eventName, listener) { | |
| return this.addListener(eventName, listener); | |
| } | |
| once(eventName, listener) { | |
| return this.addListener( | |
| eventName, | |
| this._wrapOnceListener(eventName, listener) | |
| ); | |
| } | |
| prependListener(eventName, listener) { | |
| const listeners = this._getListeners(eventName); | |
| if (listeners.length > 0) { | |
| const nextListeners = [listener].concat(listeners); | |
| this.events.set(eventName, nextListeners); | |
| } else { | |
| this.events.set(eventName, listeners.concat(listener)); | |
| } | |
| return this; | |
| } | |
| prependOnceListener(eventName, listener) { | |
| return this.prependListener( | |
| eventName, | |
| this._wrapOnceListener(eventName, listener) | |
| ); | |
| } | |
| removeListener(eventName, listener) { | |
| const listeners = this._getListeners(eventName); | |
| if (listeners.length > 0) { | |
| this._removeListener(listeners, listener); | |
| this.events.set(eventName, listeners); | |
| this._emitInternalEvent("removeListener", eventName, listener); | |
| } | |
| return this; | |
| } | |
| /** | |
| * Alias for `emitter.removeListener()`. | |
| * | |
| * @example | |
| * emitter.off('hello', listener) | |
| */ | |
| off(eventName, listener) { | |
| return this.removeListener(eventName, listener); | |
| } | |
| removeAllListeners(eventName) { | |
| if (eventName) { | |
| this.events.delete(eventName); | |
| } else { | |
| this.events.clear(); | |
| } | |
| return this; | |
| } | |
| /** | |
| * Returns a copy of the array of listeners for the event named `eventName`. | |
| */ | |
| listeners(eventName) { | |
| return Array.from(this._getListeners(eventName)); | |
| } | |
| /** | |
| * Returns the number of listeners listening to the event named `eventName`. | |
| */ | |
| listenerCount(eventName) { | |
| return this._getListeners(eventName).length; | |
| } | |
| rawListeners(eventName) { | |
| return this.listeners(eventName); | |
| } | |
| }; | |
| var Emitter = _Emitter; | |
| Emitter.defaultMaxListeners = 10; | |
| export { | |
| Emitter, | |
| MemoryLeakError | |
| }; | |
| //# sourceMappingURL=index.mjs.map |