{"version":3,"file":"index.mjs","names":["Injectable","InjectableScope","scope","Transient","EventEmitter","listeners","Map","on","event","listener","has","set","Set","get","add","off","delete","size","once","args","emit","Promise","all","Array","from","map"],"sources":["../src/event-emitter.mts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/no-empty-object-type */\n/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n\nimport { Injectable } from './decorators/index.mjs'\nimport { InjectableScope } from './enums/index.mjs'\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport type EventsConfig = {\n  [event: string]: any[]\n}\nexport type EventsNames<Events extends EventsConfig> = Exclude<\n  keyof Events,\n  symbol | number\n>\nexport type EventsArgs<\n  Events extends EventsConfig,\n  Name extends EventsNames<Events>,\n> = Events[Name] extends any[] ? Events[Name] : []\n\n@Injectable({ scope: InjectableScope.Transient })\nexport class EventEmitter<Events extends EventsConfig = {}> {\n  private listeners: Map<EventsNames<Events>, Set<Function>> = new Map()\n\n  on<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n    event: E,\n    listener: (...args: Args) => void | Promise<void>,\n  ) {\n    if (!this.listeners.has(event)) {\n      this.listeners.set(event, new Set())\n    }\n\n    this.listeners.get(event)!.add(listener)\n\n    return () => {\n      this.off(event, listener)\n    }\n  }\n\n  off<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n    event: E,\n    listener: (...args: Args) => void | Promise<void>,\n  ) {\n    if (!this.listeners.has(event)) {\n      return\n    }\n\n    this.listeners.get(event)!.delete(listener)\n    if (this.listeners.get(event)!.size === 0) {\n      this.listeners.delete(event)\n    }\n  }\n\n  once<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n    event: E,\n    listener: (...args: Args) => void | Promise<void>,\n  ) {\n    const off = this.on(event, (...args) => {\n      off()\n      // @ts-expect-error - This is a valid call\n      listener(...args)\n    })\n\n    return off\n  }\n\n  async emit<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n    event: E,\n    ...args: Args\n  ): Promise<any> {\n    if (!this.listeners.has(event)) {\n      return\n    }\n\n    return Promise.all(\n      Array.from(this.listeners.get(event)!).map((listener) =>\n        listener(...args),\n      ),\n    )\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoBCA,WAAW,EAAEE,OAAOD,gBAAgBE,WAAU,CAAA;AACxC,IAAMC,eAAN,MAAMA;;;;CACHC,4BAAqD,IAAIC,KAAAA;CAEjEC,GACEC,OACAC,UACA;AACA,MAAI,CAAC,KAAKJ,UAAUK,IAAIF,MAAAA,CACtB,MAAKH,UAAUM,IAAIH,uBAAO,IAAII,KAAAA,CAAAA;AAGhC,OAAKP,UAAUQ,IAAIL,MAAAA,CAAQM,IAAIL,SAAAA;AAE/B,eAAO;AACL,QAAKM,IAAIP,OAAOC,SAAAA;;;CAIpBM,IACEP,OACAC,UACA;AACA,MAAI,CAAC,KAAKJ,UAAUK,IAAIF,MAAAA,CACtB;AAGF,OAAKH,UAAUQ,IAAIL,MAAAA,CAAQQ,OAAOP,SAAAA;AAClC,MAAI,KAAKJ,UAAUQ,IAAIL,MAAAA,CAAQS,SAAS,EACtC,MAAKZ,UAAUW,OAAOR,MAAAA;;CAI1BU,KACEV,OACAC,UACA;EACA,MAAMM,MAAM,KAAKR,GAAGC,QAAQ,GAAGW,SAAAA;AAC7BJ,QAAAA;AAEAN,YAAAA,GAAYU,KAAAA;IACd;AAEA,SAAOJ;;CAGT,MAAMK,KACJZ,OACA,GAAGW,MACW;AACd,MAAI,CAAC,KAAKd,UAAUK,IAAIF,MAAAA,CACtB;AAGF,SAAOa,QAAQC,IACbC,MAAMC,KAAK,KAAKnB,UAAUQ,IAAIL,MAAAA,CAAAA,CAASiB,KAAKhB,aAC1CA,SAAAA,GAAYU,KAAAA,CAAAA,CAAAA"}