{"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":[],"mappings":"AAoBA,SAAwB,iBAA2B;AAC3C,QAAA,gCAAgB;AAGhB,QAAA,oBAAoB,OAAO,cAAsB,SAAoB;AACrE,QAAA,UAAU,IAAI,SAAS,GAAG;AAC5B,iBAAW,YAAY,UAAU,IAAI,SAAS,GAAG;AACzC,cAAA,SAAS,GAAG,IAAI;AAAA,MACxB;AAAA,IACF;AAAA,EAAA;AAII,QAAA,cAAc,CAAC,iBAAiB;AAEtC,QAAM,WAAqB;AAAA,IACzB,MAAM,KAAK,cAAc,MAAM;AAC7B,iBAAW,cAAc,aAAa;AAC9B,cAAA,WAAW,WAAW,GAAG,IAAI;AAAA,MACrC;AAAA,IACF;AAAA,IAEA,UAAU,YAAY;AACpB,kBAAY,KAAK,UAAU;AAG3B,aAAO,MAAM;AACX,iBAAS,YAAY,UAAU;AAAA,MAAA;AAAA,IAEnC;AAAA,IAEA,YAAY,YAAY;AAChB,YAAA,kBAAkB,YAAY,QAAQ,UAAU;AAGtD,UAAI,mBAAmB,GAAG;AACZ,oBAAA,OAAO,iBAAiB,CAAC;AAAA,MACvC;AAAA,IACF;AAAA,IAEA,GAAG,WAAW,UAAU;AACtB,UAAI,CAAC,UAAU,IAAI,SAAS,GAAG;AAC7B,kBAAU,IAAI,WAAW,CAAC,QAAQ,CAAC;AAAA,MAAA,OAC9B;AACL,kBAAU,IAAI,SAAS,EAAE,KAAK,QAAQ;AAAA,MACxC;AAGA,aAAO,MAAM;AACF,iBAAA,IAAI,WAAW,QAAQ;AAAA,MAAA;AAAA,IAEpC;AAAA,IAEA,IAAI,WAAW,UAAU;AACb,gBAAA,IAAI,SAAS,GAAG,OAAO,UAAU,IAAI,SAAS,EAAE,QAAQ,QAAQ,GAAG,CAAC;AAAA,IAChF;AAAA,IAEA,KAAK,WAAW,UAAU;AACxB,aAAO,SAAS,GAAG,WAAW,UAAU,SAAS;AACtC,iBAAA,IAAI,WAAW,QAAQ;AACzB,eAAA,SAAS,GAAG,IAAI;AAAA,MAAA,CACxB;AAAA,IACH;AAAA,IAEA,UAAU;AACR,WAAK,mBAAmB;AACxB,WAAK,qBAAqB;AACnB,aAAA;AAAA,IACT;AAAA,IAEA,eAAe,WAAW,UAAU;AAC3B,aAAA,SAAS,IAAI,WAAW,QAAQ;AAAA,IACzC;AAAA,IAEA,qBAAqB;AACnB,gBAAU,MAAM;AACT,aAAA;AAAA,IACT;AAAA,IAEA,uBAAuB;AACrB,kBAAY,SAAS;AACd,aAAA;AAAA,IACT;AAAA,IAEA,YAAY,WAAW,UAAU;AACxB,aAAA,SAAS,GAAG,WAAW,QAAQ;AAAA,IACxC;AAAA,EAAA;AAGK,SAAA;AACT;"}