{"version":3,"file":"event-emitter.cjs","sources":["../../src/event-emitter.ts"],"sourcesContent":["/**\n * Generic type-safe event emitter\n * @template TEvents - Record of event names to event payload types\n */\nexport class EventEmitter<TEvents extends Record<string, any>> {\n  private listeners = new Map<\n    keyof TEvents,\n    Set<(event: TEvents[keyof TEvents]) => void>\n  >()\n\n  /**\n   * Subscribe to an event\n   * @param event - Event name to listen for\n   * @param callback - Function to call when event is emitted\n   * @returns Unsubscribe function\n   */\n  on<T extends keyof TEvents>(\n    event: T,\n    callback: (event: TEvents[T]) => void,\n  ): () => void {\n    if (!this.listeners.has(event)) {\n      this.listeners.set(event, new Set())\n    }\n    this.listeners.get(event)!.add(callback as (event: any) => void)\n\n    return () => {\n      this.listeners.get(event)?.delete(callback as (event: any) => void)\n    }\n  }\n\n  /**\n   * Subscribe to an event once (automatically unsubscribes after first emission)\n   * @param event - Event name to listen for\n   * @param callback - Function to call when event is emitted\n   * @returns Unsubscribe function\n   */\n  once<T extends keyof TEvents>(\n    event: T,\n    callback: (event: TEvents[T]) => void,\n  ): () => void {\n    const unsubscribe = this.on(event, (eventPayload) => {\n      callback(eventPayload)\n      unsubscribe()\n    })\n    return unsubscribe\n  }\n\n  /**\n   * Unsubscribe from an event\n   * @param event - Event name to stop listening for\n   * @param callback - Function to remove\n   */\n  off<T extends keyof TEvents>(\n    event: T,\n    callback: (event: TEvents[T]) => void,\n  ): void {\n    this.listeners.get(event)?.delete(callback as (event: any) => void)\n  }\n\n  /**\n   * Wait for an event to be emitted\n   * @param event - Event name to wait for\n   * @param timeout - Optional timeout in milliseconds\n   * @returns Promise that resolves with the event payload\n   */\n  waitFor<T extends keyof TEvents>(\n    event: T,\n    timeout?: number,\n  ): Promise<TEvents[T]> {\n    return new Promise((resolve, reject) => {\n      let timeoutId: NodeJS.Timeout | undefined\n      const unsubscribe = this.on(event, (eventPayload) => {\n        if (timeoutId) {\n          clearTimeout(timeoutId)\n          timeoutId = undefined\n        }\n        resolve(eventPayload)\n        unsubscribe()\n      })\n      if (timeout) {\n        timeoutId = setTimeout(() => {\n          timeoutId = undefined\n          unsubscribe()\n          reject(new Error(`Timeout waiting for event ${String(event)}`))\n        }, timeout)\n      }\n    })\n  }\n\n  /**\n   * Emit an event to all listeners\n   * @param event - Event name to emit\n   * @param eventPayload - Event payload\n   * @internal For use by subclasses - subclasses should wrap this with a public emit if needed\n   */\n  protected emitInner<T extends keyof TEvents>(\n    event: T,\n    eventPayload: TEvents[T],\n  ): void {\n    this.listeners.get(event)?.forEach((listener) => {\n      try {\n        listener(eventPayload)\n      } catch (error) {\n        // Re-throw in a microtask to surface the error\n        queueMicrotask(() => {\n          throw error\n        })\n      }\n    })\n  }\n\n  /**\n   * Clear all listeners\n   */\n  protected clearListeners(): void {\n    this.listeners.clear()\n  }\n}\n"],"names":[],"mappings":";;AAIO,MAAM,aAAkD;AAAA,EAAxD,cAAA;AACL,SAAQ,gCAAgB,IAAA;AAAA,EAGtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQF,GACE,OACA,UACY;AACZ,QAAI,CAAC,KAAK,UAAU,IAAI,KAAK,GAAG;AAC9B,WAAK,UAAU,IAAI,OAAO,oBAAI,KAAK;AAAA,IACrC;AACA,SAAK,UAAU,IAAI,KAAK,EAAG,IAAI,QAAgC;AAE/D,WAAO,MAAM;AACX,WAAK,UAAU,IAAI,KAAK,GAAG,OAAO,QAAgC;AAAA,IACpE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KACE,OACA,UACY;AACZ,UAAM,cAAc,KAAK,GAAG,OAAO,CAAC,iBAAiB;AACnD,eAAS,YAAY;AACrB,kBAAA;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IACE,OACA,UACM;AACN,SAAK,UAAU,IAAI,KAAK,GAAG,OAAO,QAAgC;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QACE,OACA,SACqB;AACrB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAI;AACJ,YAAM,cAAc,KAAK,GAAG,OAAO,CAAC,iBAAiB;AACnD,YAAI,WAAW;AACb,uBAAa,SAAS;AACtB,sBAAY;AAAA,QACd;AACA,gBAAQ,YAAY;AACpB,oBAAA;AAAA,MACF,CAAC;AACD,UAAI,SAAS;AACX,oBAAY,WAAW,MAAM;AAC3B,sBAAY;AACZ,sBAAA;AACA,iBAAO,IAAI,MAAM,6BAA6B,OAAO,KAAK,CAAC,EAAE,CAAC;AAAA,QAChE,GAAG,OAAO;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQU,UACR,OACA,cACM;AACN,SAAK,UAAU,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa;AAC/C,UAAI;AACF,iBAAS,YAAY;AAAA,MACvB,SAAS,OAAO;AAEd,uBAAe,MAAM;AACnB,gBAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKU,iBAAuB;AAC/B,SAAK,UAAU,MAAA;AAAA,EACjB;AACF;;"}