{"version":3,"file":"lifecycle-event-bus.mjs","names":["LifecycleEventBus","listeners","Map","logger","on","ns","event","listener","debug","has","set","nsEvents","get","Set","add","delete","size","emit","key","events","res","Promise","allSettled","map","then","results","filter","result","status","warn","reason","length","reject"],"sources":["../../../../src/internal/lifecycle/lifecycle-event-bus.mts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-empty-object-type */\n/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n\ntype ListenersMap = Map<string, Map<string, Set<Function>>>\n\n/**\n * Event bus for service lifecycle events (create, destroy, etc.).\n *\n * Enables loose coupling between services by allowing them to subscribe\n * to lifecycle events of their dependencies without direct references.\n * Used primarily for invalidation cascading.\n */\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nexport class LifecycleEventBus {\n  private listeners: ListenersMap = new Map()\n  constructor(private readonly logger: Console | null = null) {}\n\n  on<Event extends string | `pre:${string}` | `post:${string}`>(\n    ns: string,\n    event: Event,\n    listener: (event: Event) => void,\n  ) {\n    this.logger?.debug(`[LifecycleEventBus]#on(): ns:${ns} event:${event}`)\n    if (!this.listeners.has(ns)) {\n      this.listeners.set(ns, new Map())\n    }\n\n    const nsEvents = this.listeners.get(ns)!\n    if (!nsEvents.has(event)) {\n      nsEvents.set(event, new Set())\n    }\n\n    nsEvents.get(event)!.add(listener)\n\n    return () => {\n      nsEvents.get(event)?.delete(listener)\n      if (nsEvents.get(event)?.size === 0) {\n        nsEvents.delete(event)\n      }\n      if (nsEvents.size === 0) {\n        this.listeners.delete(ns)\n      }\n    }\n  }\n\n  async emit(key: string, event: string) {\n    if (!this.listeners.has(key)) {\n      return\n    }\n\n    const events = this.listeners.get(key)!\n\n    this.logger?.debug(`[LifecycleEventBus]#emit(): ${key}:${event}`)\n\n    const res = await Promise.allSettled(\n      [...(events.get(event) ?? [])!].map((listener) => listener(event)),\n    ).then((results) => {\n      const res = results\n        .filter((result) => result.status === 'rejected')\n        .map((result: PromiseRejectedResult) => {\n          this.logger?.warn(\n            `[LifecycleEventBus]#emit(): ${key}:${event} rejected with`,\n            result.reason,\n          )\n          return result\n        })\n\n      if (res.length > 0) {\n        return Promise.reject(res)\n      }\n      return results\n    })\n    return res\n  }\n}\n\n"],"mappings":";;;;;;;GAaA,IAAaA,oBAAb,MAAaA;;CACHC,4BAA0B,IAAIC,KAAAA;CACtC,YAAY,SAA0C,MAAM;OAA/BC,SAAAA;;CAE7BC,GACEC,IACAC,OACAC,UACA;AACA,OAAKJ,QAAQK,MAAM,gCAAgCH,GAAG,SAASC,QAAO;AACtE,MAAI,CAAC,KAAKL,UAAUQ,IAAIJ,GAAAA,CACtB,MAAKJ,UAAUS,IAAIL,oBAAI,IAAIH,KAAAA,CAAAA;EAG7B,MAAMS,WAAW,KAAKV,UAAUW,IAAIP,GAAAA;AACpC,MAAI,CAACM,SAASF,IAAIH,MAAAA,CAChBK,UAASD,IAAIJ,uBAAO,IAAIO,KAAAA,CAAAA;AAG1BF,WAASC,IAAIN,MAAAA,CAAQQ,IAAIP,SAAAA;AAEzB,eAAO;AACLI,YAASC,IAAIN,MAAAA,EAAQS,OAAOR,SAAAA;AAC5B,OAAII,SAASC,IAAIN,MAAAA,EAAQU,SAAS,EAChCL,UAASI,OAAOT,MAAAA;AAElB,OAAIK,SAASK,SAAS,EACpB,MAAKf,UAAUc,OAAOV,GAAAA;;;CAK5B,MAAMY,KAAKC,KAAaZ,OAAe;AACrC,MAAI,CAAC,KAAKL,UAAUQ,IAAIS,IAAAA,CACtB;EAGF,MAAMC,SAAS,KAAKlB,UAAUW,IAAIM,IAAAA;AAElC,OAAKf,QAAQK,MAAM,+BAA+BU,IAAI,GAAGZ,QAAO;AAoBhE,SAlBY,MAAMe,QAAQC,WACxB,IAAKH,OAAOP,IAAIN,MAAAA,IAAU,EAAE,CAAG,CAACiB,KAAKhB,aAAaA,SAASD,MAAAA,CAAAA,CAAAA,CAC3DkB,MAAMC,YAAAA;GACN,MAAML,MAAMK,QACTC,QAAQC,WAAWA,OAAOC,WAAW,WAAA,CACrCL,KAAKI,WAAAA;AACJ,SAAKxB,QAAQ0B,KACX,+BAA+BX,IAAI,GAAGZ,MAAM,iBAC5CqB,OAAOG,OAAM;AAEf,WAAOH;KACT;AAEF,OAAIP,IAAIW,SAAS,EACf,QAAOV,QAAQW,OAAOZ,IAAAA;AAExB,UAAOK;IACT"}