{"version":3,"file":"async-event-emitter.mjs","sources":["../../src/types/async-event-emitter.ts"],"sourcesContent":["import { EventDataMap, EventType } from './lifecycle-events'\n\nexport type AsyncEventListener<T = unknown> = (event: T, eventName: string | symbol) => Promise<void> | void\n\nexport class AsyncEventEmitter {\n  private listenerWrapperMap = new WeakMap<AsyncEventListener, AsyncEventListener>()\n  private listenerMap: Record<string | symbol, AsyncEventListener[]> = {}\n\n  async emitAsync<K extends EventType>(eventName: K, event: EventDataMap[K]): Promise<void>\n  async emitAsync(eventName: string | symbol, event: unknown): Promise<void>\n  async emitAsync(eventName: string | symbol, event: unknown): Promise<void> {\n    for (const listener of this.listenerMap[eventName] ?? []) {\n      await listener(event, eventName)\n    }\n  }\n\n  on<K extends EventType>(eventName: K, listener: AsyncEventListener<EventDataMap[K]>): AsyncEventEmitter\n  on<T = unknown>(eventName: string | symbol, listener: AsyncEventListener<T>): AsyncEventEmitter\n  on(eventName: string | symbol, listener: AsyncEventListener): AsyncEventEmitter {\n    if (!this.listenerMap[eventName]) this.listenerMap[eventName] = []\n    this.listenerMap[eventName].push(listener as AsyncEventListener)\n    return this\n  }\n\n  once<K extends EventType>(eventName: K, listener: AsyncEventListener<EventDataMap[K]>): AsyncEventEmitter\n  once<T = unknown>(eventName: string | symbol, listener: AsyncEventListener<T>): AsyncEventEmitter\n  once(eventName: string | symbol, listener: AsyncEventListener): AsyncEventEmitter {\n    const wrappedListener: AsyncEventListener = async (event, eventName) => {\n      try {\n        return await listener(event, eventName)\n      } finally {\n        this.removeListener(eventName, wrappedListener)\n      }\n    }\n    this.listenerWrapperMap.set(listener, wrappedListener)\n    return this.on(eventName, wrappedListener)\n  }\n\n  removeListener(eventName: string | symbol, listener: AsyncEventListener): AsyncEventEmitter {\n    const wrappedListener = this.listenerWrapperMap.get(listener)\n    if (wrappedListener) {\n      this.listenerWrapperMap.delete(listener)\n      if (this.listenerMap[eventName]?.indexOf(wrappedListener) !== -1) {\n        this.listenerMap[eventName].splice(this.listenerMap[eventName].indexOf(wrappedListener), 1)\n      }\n    } else {\n      if (this.listenerMap[eventName]?.indexOf(listener) !== -1) {\n        this.listenerMap[eventName].splice(this.listenerMap[eventName].indexOf(listener), 1)\n      }\n    }\n\n    return this\n  }\n\n  off = this.removeListener\n}\n"],"names":[],"mappings":"MAIa,iBAAiB,CAAA;AAA9B,IAAA,WAAA,GAAA;AACU,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,OAAO,EAA0C;QAC1E,IAAW,CAAA,WAAA,GAAkD,EAAE;AAgDvE,QAAA,IAAA,CAAA,GAAG,GAAG,IAAI,CAAC,cAAc;;AA5CzB,IAAA,MAAM,SAAS,CAAC,SAA0B,EAAE,KAAc,EAAA;AACxD,QAAA,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE;AACxD,YAAA,MAAM,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;;;IAMpC,EAAE,CAAC,SAA0B,EAAE,QAA4B,EAAA;AACzD,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;AAAE,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE;QAClE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAA8B,CAAC;AAChE,QAAA,OAAO,IAAI;;IAKb,IAAI,CAAC,SAA0B,EAAE,QAA4B,EAAA;QAC3D,MAAM,eAAe,GAAuB,OAAO,KAAK,EAAE,SAAS,KAAI;AACrE,YAAA,IAAI;AACF,gBAAA,OAAO,MAAM,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;;oBAC/B;AACR,gBAAA,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,eAAe,CAAC;;AAEnD,SAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC;QACtD,OAAO,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC;;IAG5C,cAAc,CAAC,SAA0B,EAAE,QAA4B,EAAA;QACrE,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC7D,IAAI,eAAe,EAAE;AACnB,YAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC;AACxC,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE;gBAChE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;;;aAExF;AACL,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE;gBACzD,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;;;AAIxF,QAAA,OAAO,IAAI;;AAId;;;;"}