{"version":3,"file":"event-bus.mjs","sources":["../../../src/lib/vdom/event-bus.ts"],"sourcesContent":["/**\n * @file VDOM Event Bus\n * @description Module event bus for cross-module communication in the Virtual DOM system\n */\n\nimport { globalEventBus, createEventEmitter, type EventHandler } from '../shared/event-utils';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface EventBusConfig {\n  /** Maximum listeners per event */\n  maxListeners?: number;\n  /** Enable debug mode */\n  debug?: boolean;\n  /** Enable event history */\n  enableHistory?: boolean;\n  /** Maximum events in history */\n  maxHistorySize?: number;\n}\n\nexport interface EventBusStats {\n  /** Total events published */\n  totalPublished: number;\n  /** Total events delivered */\n  totalDelivered: number;\n  /** Active subscriptions */\n  activeSubscriptions: number;\n  /** Events by type */\n  eventsByType: Map<string, number>;\n}\n\nexport interface ModuleEventMessage<T = unknown> {\n  /** Source module ID */\n  source: string;\n  /** Target module ID (optional, broadcast if not specified) */\n  target?: string;\n  /** Event type */\n  type: string;\n  /** Event payload */\n  payload: T;\n  /** Timestamp */\n  timestamp: number;\n}\n\nexport type ModuleEventHandler<T = unknown> = EventHandler<ModuleEventMessage<T>>;\n\n// =============================================================================\n// Module Event Bus\n// =============================================================================\n\nexport interface ModuleEventBusOptions {\n  /** Enable security checks */\n  enableSecurity?: boolean;\n  /** Maximum listeners per event */\n  maxListeners?: number;\n  /** Enable debug mode */\n  debug?: boolean;\n  /** Enable event history */\n  enableHistory?: boolean;\n  /** Maximum events in history */\n  maxHistorySize?: number;\n}\n\n/**\n * Event bus for cross-module communication\n */\nexport class ModuleEventBus {\n  private readonly emitter;\n  private readonly moduleSubscriptions = new Map<string, Set<() => void>>();\n  // private readonly options: ModuleEventBusOptions;\n\n  constructor(options: ModuleEventBusOptions = {}) {\n    // this.options = options;\n    this.emitter = createEventEmitter<Record<string, ModuleEventMessage>>({\n      maxListeners: options.maxListeners ?? 100,\n      debug: options.debug ?? false,\n      enableStatistics: true,\n    });\n  }\n\n  /**\n   * Subscribe to events\n   */\n  subscribe<T = unknown>(\n    eventType: string,\n    handler: ModuleEventHandler<T>,\n    moduleId?: string\n  ): () => void {\n    const unsubscribe = this.emitter.on(eventType, handler as EventHandler<ModuleEventMessage>);\n\n    // Track subscription by module if provided\n    if (moduleId !== null && moduleId !== undefined && moduleId !== '') {\n      if (!this.moduleSubscriptions.has(moduleId)) {\n        this.moduleSubscriptions.set(moduleId, new Set());\n      }\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      this.moduleSubscriptions.get(moduleId)!.add(unsubscribe);\n    }\n\n    return unsubscribe;\n  }\n\n  /**\n   * Publish an event\n   */\n  publish<T = unknown>(eventType: string, payload: T, source: string, target?: string): void {\n    const message: ModuleEventMessage<T> = {\n      source,\n      target,\n      type: eventType,\n      payload,\n      timestamp: Date.now(),\n    };\n\n    this.emitter.emitSync(eventType, message as ModuleEventMessage);\n  }\n\n  /**\n   * Unsubscribe all handlers for a module\n   */\n  unsubscribeModule(moduleId: string): void {\n    const subscriptions = this.moduleSubscriptions.get(moduleId);\n    if (subscriptions) {\n      for (const unsubscribe of subscriptions) {\n        unsubscribe();\n      }\n      this.moduleSubscriptions.delete(moduleId);\n    }\n  }\n\n  /**\n   * Get statistics\n   */\n  getStats(): EventBusStats {\n    const stats = this.emitter.getStats();\n    return {\n      totalPublished: stats.totalPublished,\n      totalDelivered: stats.totalDelivered,\n      activeSubscriptions: stats.activeSubscriptions,\n      eventsByType: stats.eventsByType,\n    };\n  }\n\n  /**\n   * Clear all subscriptions\n   */\n  clear(): void {\n    this.emitter.clear();\n    this.moduleSubscriptions.clear();\n  }\n\n  /**\n   * Dispose the event bus\n   */\n  dispose(): void {\n    this.clear();\n    this.emitter.dispose();\n  }\n}\n\n// =============================================================================\n// Default Instance\n// =============================================================================\n\nlet defaultEventBus: ModuleEventBus | null = null;\n\n/**\n * Get the default event bus instance\n */\nexport function getDefaultEventBus(): ModuleEventBus {\n  defaultEventBus ??= new ModuleEventBus();\n  return defaultEventBus;\n}\n\n/**\n * Set a custom default event bus\n */\nexport function setDefaultEventBus(bus: ModuleEventBus): void {\n  defaultEventBus = bus;\n}\n\n/**\n * Reset the default event bus\n */\nexport function resetDefaultEventBus(): void {\n  if (defaultEventBus) {\n    defaultEventBus.dispose();\n    defaultEventBus = null;\n  }\n}\n\n// =============================================================================\n// Convenience Functions\n// =============================================================================\n\n/**\n * Subscribe to an event on the default event bus\n */\nexport function subscribe<T = unknown>(\n  eventType: string,\n  handler: ModuleEventHandler<T>,\n  moduleId?: string\n): () => void {\n  return getDefaultEventBus().subscribe(eventType, handler, moduleId);\n}\n\n/**\n * Publish an event on the default event bus\n */\nexport function publish<T = unknown>(\n  eventType: string,\n  payload: T,\n  source: string,\n  target?: string\n): void {\n  getDefaultEventBus().publish(eventType, payload, source, target);\n}\n\n// Re-export global event bus for convenience\nexport { globalEventBus };\n"],"names":["ModuleEventBus","options","createEventEmitter","eventType","handler","moduleId","unsubscribe","payload","source","target","message","subscriptions","stats","defaultEventBus","getDefaultEventBus","setDefaultEventBus","bus","resetDefaultEventBus","subscribe","publish"],"mappings":";;AAoEO,MAAMA,EAAe;AAAA,EACT;AAAA,EACA,0CAA0B,IAAA;AAAA;AAAA,EAG3C,YAAYC,IAAiC,IAAI;AAE/C,SAAK,UAAUC,EAAuD;AAAA,MACpE,cAAcD,EAAQ,gBAAgB;AAAA,MACtC,OAAOA,EAAQ,SAAS;AAAA,MACxB,kBAAkB;AAAA,IAAA,CACnB;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,UACEE,GACAC,GACAC,GACY;AACZ,UAAMC,IAAc,KAAK,QAAQ,GAAGH,GAAWC,CAA2C;AAG1F,WAAIC,KAAa,QAAkCA,MAAa,OACzD,KAAK,oBAAoB,IAAIA,CAAQ,KACxC,KAAK,oBAAoB,IAAIA,GAAU,oBAAI,KAAK,GAGlD,KAAK,oBAAoB,IAAIA,CAAQ,EAAG,IAAIC,CAAW,IAGlDA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAqBH,GAAmBI,GAAYC,GAAgBC,GAAuB;AACzF,UAAMC,IAAiC;AAAA,MACrC,QAAAF;AAAA,MACA,QAAAC;AAAA,MACA,MAAMN;AAAA,MACN,SAAAI;AAAA,MACA,WAAW,KAAK,IAAA;AAAA,IAAI;AAGtB,SAAK,QAAQ,SAASJ,GAAWO,CAA6B;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkBL,GAAwB;AACxC,UAAMM,IAAgB,KAAK,oBAAoB,IAAIN,CAAQ;AAC3D,QAAIM,GAAe;AACjB,iBAAWL,KAAeK;AACxB,QAAAL,EAAA;AAEF,WAAK,oBAAoB,OAAOD,CAAQ;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAA0B;AACxB,UAAMO,IAAQ,KAAK,QAAQ,SAAA;AAC3B,WAAO;AAAA,MACL,gBAAgBA,EAAM;AAAA,MACtB,gBAAgBA,EAAM;AAAA,MACtB,qBAAqBA,EAAM;AAAA,MAC3B,cAAcA,EAAM;AAAA,IAAA;AAAA,EAExB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,QAAQ,MAAA,GACb,KAAK,oBAAoB,MAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,MAAA,GACL,KAAK,QAAQ,QAAA;AAAA,EACf;AACF;AAMA,IAAIC,IAAyC;AAKtC,SAASC,IAAqC;AACnD,SAAAD,MAAoB,IAAIb,EAAA,GACjBa;AACT;AAKO,SAASE,EAAmBC,GAA2B;AAC5D,EAAAH,IAAkBG;AACpB;AAKO,SAASC,IAA6B;AAC3C,EAAIJ,MACFA,EAAgB,QAAA,GAChBA,IAAkB;AAEtB;AASO,SAASK,EACdf,GACAC,GACAC,GACY;AACZ,SAAOS,EAAA,EAAqB,UAAUX,GAAWC,GAASC,CAAQ;AACpE;AAKO,SAASc,EACdhB,GACAI,GACAC,GACAC,GACM;AACN,EAAAK,EAAA,EAAqB,QAAQX,GAAWI,GAASC,GAAQC,CAAM;AACjE;"}