{"version":3,"file":"event-hub.mjs","sources":["../../src/services/event-hub.ts"],"sourcesContent":["export type Subscriber = (eventName: string, ...args: any[]) => Promise<void>;\nexport type Listener = (...args: any[]) => Promise<void>;\n\nexport interface EventHub {\n  emit(eventName: string, ...args: unknown[]): Promise<void>;\n  subscribe(subscriber: Subscriber): () => void;\n  unsubscribe(subscriber: Subscriber): void;\n  on(eventName: string, listener: Listener): () => void;\n  off(eventName: string, listener: Listener): void;\n  once(eventName: string, listener: Listener): () => void;\n  destroy(): EventHub;\n  removeListener(eventName: string, listener: Listener): void;\n  removeAllListeners(): EventHub;\n  removeAllSubscribers(): EventHub;\n  addListener(eventName: string, listener: Listener): () => void;\n}\n\n/**\n * The event hub is Strapi's event control center.\n */\nexport default function createEventHub(): EventHub {\n  const listeners = new Map();\n\n  // Default subscriber to easily add listeners with the on() method\n  const defaultSubscriber = async (eventName: string, ...args: unknown[]) => {\n    if (listeners.has(eventName)) {\n      for (const listener of listeners.get(eventName)) {\n        await listener(...args);\n      }\n    }\n  };\n\n  // Store of subscribers that will be called when an event is emitted\n  const subscribers = [defaultSubscriber];\n\n  const eventHub: EventHub = {\n    async emit(eventName, ...args) {\n      for (const subscriber of subscribers) {\n        await subscriber(eventName, ...args);\n      }\n    },\n\n    subscribe(subscriber) {\n      subscribers.push(subscriber);\n\n      // Return a function to remove the subscriber\n      return () => {\n        eventHub.unsubscribe(subscriber);\n      };\n    },\n\n    unsubscribe(subscriber) {\n      const subscriberIndex = subscribers.indexOf(subscriber);\n\n      // Only remove the subscriber if it exists\n      if (subscriberIndex >= 0) {\n        subscribers.splice(subscriberIndex, 1);\n      }\n    },\n\n    on(eventName, listener) {\n      if (!listeners.has(eventName)) {\n        listeners.set(eventName, [listener]);\n      } else {\n        listeners.get(eventName).push(listener);\n      }\n\n      // Return a function to remove the listener\n      return () => {\n        eventHub.off(eventName, listener);\n      };\n    },\n\n    off(eventName, listener) {\n      listeners.get(eventName)?.splice(listeners.get(eventName).indexOf(listener), 1);\n    },\n\n    once(eventName, listener) {\n      return eventHub.on(eventName, async (...args) => {\n        eventHub.off(eventName, listener);\n        return listener(...args);\n      });\n    },\n\n    destroy() {\n      this.removeAllListeners();\n      this.removeAllSubscribers();\n      return this;\n    },\n\n    removeListener(eventName, listener) {\n      return eventHub.off(eventName, listener);\n    },\n\n    removeAllListeners() {\n      listeners.clear();\n      return this;\n    },\n\n    removeAllSubscribers() {\n      subscribers.length = 0;\n      return this;\n    },\n\n    addListener(eventName, listener) {\n      return eventHub.on(eventName, listener);\n    },\n  };\n\n  return eventHub;\n}\n"],"names":["createEventHub","listeners","Map","defaultSubscriber","eventName","args","has","listener","get","subscribers","eventHub","emit","subscriber","subscribe","push","unsubscribe","subscriberIndex","indexOf","splice","on","set","off","once","destroy","removeAllListeners","removeAllSubscribers","removeListener","clear","length","addListener"],"mappings":"AAiBA;;AAEC,IACc,SAASA,cAAAA,GAAAA;AACtB,IAAA,MAAMC,YAAY,IAAIC,GAAAA,EAAAA;;IAGtB,MAAMC,iBAAAA,GAAoB,OAAOC,SAAAA,EAAmB,GAAGC,IAAAA,GAAAA;QACrD,IAAIJ,SAAAA,CAAUK,GAAG,CAACF,SAAAA,CAAAA,EAAY;AAC5B,YAAA,KAAK,MAAMG,QAAAA,IAAYN,SAAAA,CAAUO,GAAG,CAACJ,SAAAA,CAAAA,CAAY;AAC/C,gBAAA,MAAMG,QAAAA,CAAAA,GAAYF,IAAAA,CAAAA;AACpB,YAAA;AACF,QAAA;AACF,IAAA,CAAA;;AAGA,IAAA,MAAMI,WAAAA,GAAc;AAACN,QAAAA;AAAkB,KAAA;AAEvC,IAAA,MAAMO,QAAAA,GAAqB;AACzB,QAAA,MAAMC,IAAAA,CAAAA,CAAKP,SAAS,EAAE,GAAGC,IAAI,EAAA;YAC3B,KAAK,MAAMO,cAAcH,WAAAA,CAAa;AACpC,gBAAA,MAAMG,WAAWR,SAAAA,EAAAA,GAAcC,IAAAA,CAAAA;AACjC,YAAA;AACF,QAAA,CAAA;AAEAQ,QAAAA,SAAAA,CAAAA,CAAUD,UAAU,EAAA;AAClBH,YAAAA,WAAAA,CAAYK,IAAI,CAACF,UAAAA,CAAAA;;YAGjB,OAAO,IAAA;AACLF,gBAAAA,QAAAA,CAASK,WAAW,CAACH,UAAAA,CAAAA;AACvB,YAAA,CAAA;AACF,QAAA,CAAA;AAEAG,QAAAA,WAAAA,CAAAA,CAAYH,UAAU,EAAA;YACpB,MAAMI,eAAAA,GAAkBP,WAAAA,CAAYQ,OAAO,CAACL,UAAAA,CAAAA;;AAG5C,YAAA,IAAII,mBAAmB,CAAA,EAAG;gBACxBP,WAAAA,CAAYS,MAAM,CAACF,eAAAA,EAAiB,CAAA,CAAA;AACtC,YAAA;AACF,QAAA,CAAA;QAEAG,EAAAA,CAAAA,CAAGf,SAAS,EAAEG,QAAQ,EAAA;AACpB,YAAA,IAAI,CAACN,SAAAA,CAAUK,GAAG,CAACF,SAAAA,CAAAA,EAAY;gBAC7BH,SAAAA,CAAUmB,GAAG,CAAChB,SAAAA,EAAW;AAACG,oBAAAA;AAAS,iBAAA,CAAA;YACrC,CAAA,MAAO;AACLN,gBAAAA,SAAAA,CAAUO,GAAG,CAACJ,SAAAA,CAAAA,CAAWU,IAAI,CAACP,QAAAA,CAAAA;AAChC,YAAA;;YAGA,OAAO,IAAA;gBACLG,QAAAA,CAASW,GAAG,CAACjB,SAAAA,EAAWG,QAAAA,CAAAA;AAC1B,YAAA,CAAA;AACF,QAAA,CAAA;QAEAc,GAAAA,CAAAA,CAAIjB,SAAS,EAAEG,QAAQ,EAAA;YACrBN,SAAAA,CAAUO,GAAG,CAACJ,SAAAA,CAAAA,EAAYc,MAAAA,CAAOjB,SAAAA,CAAUO,GAAG,CAACJ,SAAAA,CAAAA,CAAWa,OAAO,CAACV,QAAAA,CAAAA,EAAW,CAAA,CAAA;AAC/E,QAAA,CAAA;QAEAe,IAAAA,CAAAA,CAAKlB,SAAS,EAAEG,QAAQ,EAAA;AACtB,YAAA,OAAOG,QAAAA,CAASS,EAAE,CAACf,SAAAA,EAAW,OAAO,GAAGC,IAAAA,GAAAA;gBACtCK,QAAAA,CAASW,GAAG,CAACjB,SAAAA,EAAWG,QAAAA,CAAAA;AACxB,gBAAA,OAAOA,QAAAA,CAAAA,GAAYF,IAAAA,CAAAA;AACrB,YAAA,CAAA,CAAA;AACF,QAAA,CAAA;AAEAkB,QAAAA,OAAAA,CAAAA,GAAAA;AACE,YAAA,IAAI,CAACC,kBAAkB,EAAA;AACvB,YAAA,IAAI,CAACC,oBAAoB,EAAA;AACzB,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;QAEAC,cAAAA,CAAAA,CAAetB,SAAS,EAAEG,QAAQ,EAAA;YAChC,OAAOG,QAAAA,CAASW,GAAG,CAACjB,SAAAA,EAAWG,QAAAA,CAAAA;AACjC,QAAA,CAAA;AAEAiB,QAAAA,kBAAAA,CAAAA,GAAAA;AACEvB,YAAAA,SAAAA,CAAU0B,KAAK,EAAA;AACf,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEAF,QAAAA,oBAAAA,CAAAA,GAAAA;AACEhB,YAAAA,WAAAA,CAAYmB,MAAM,GAAG,CAAA;AACrB,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;QAEAC,WAAAA,CAAAA,CAAYzB,SAAS,EAAEG,QAAQ,EAAA;YAC7B,OAAOG,QAAAA,CAASS,EAAE,CAACf,SAAAA,EAAWG,QAAAA,CAAAA;AAChC,QAAA;AACF,KAAA;IAEA,OAAOG,QAAAA;AACT;;;;"}