{"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":"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"}