171 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // 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
 |