{"version":3,"file":"event-utils.mjs","sources":["../../../src/lib/shared/event-utils.ts"],"sourcesContent":["/**\n * @file Unified Event Utilities\n * @description Best-of-breed event handling with type safety, middleware, coordination,\n * and reliability features. Consolidates 4 previous implementations into one canonical version.\n *\n * @module shared/event-utils\n * @author Agent 5 - PhD TypeScript Architect\n * @version 2.0.0\n */\n\n// =============================================================================\n// Core Types\n// =============================================================================\n\n/**\n * Generic event handler function type.\n */\nexport type EventHandler<T = unknown> = (data: T) => void | Promise<void>;\n\n/**\n * Synchronous event handler.\n */\nexport type SyncEventHandler<T = unknown> = (data: T) => void;\n\n/**\n * Async event handler.\n */\nexport type AsyncEventHandler<T = unknown> = (data: T) => Promise<void>;\n\n/**\n * Unsubscribe function returned by event subscriptions.\n */\nexport type Unsubscribe = () => void;\n\n/**\n * Event middleware function.\n */\nexport type EventMiddleware<T = unknown> = (\n  data: T,\n  next: (data: T) => void | Promise<void>\n) => void | Promise<void>;\n\n// =============================================================================\n// Configuration Types\n// =============================================================================\n\n/**\n * Event listener options.\n */\nexport interface EventListenerOptions {\n  /** Call handler only once then auto-remove */\n  once?: boolean;\n  /** Priority (higher executes first) */\n  priority?: number;\n  /** Abort signal to auto-remove listener */\n  signal?: AbortSignal;\n  /** Debounce delay in milliseconds */\n  debounce?: number;\n  /** Throttle interval in milliseconds */\n  throttle?: number;\n  /** Source filter (string, regex, or array) */\n  sourceFilter?: string | RegExp | string[];\n  /** Target filter */\n  targetFilter?: string;\n  /** Transform data before passing to handler */\n  transform?: (data: unknown) => unknown;\n  /** Filter events */\n  filter?: (data: unknown) => boolean;\n}\n\n/**\n * Unified event emitter configuration.\n */\nexport interface UnifiedEventEmitterOptions {\n  /** Maximum listeners per event (warning threshold) */\n  maxListeners?: number;\n  /** Enable debug logging */\n  debug?: boolean;\n  /** Error handler for listener errors */\n  onError?: (error: Error, event: string) => void;\n\n  // Feature flags\n  /** Enable middleware support */\n  enableMiddleware?: boolean;\n  /** Enable event deduplication */\n  enableDeduplication?: boolean;\n  /** Enable event persistence/history */\n  enablePersistence?: boolean;\n  /** Enable statistics tracking */\n  enableStatistics?: boolean;\n  /** Enable dead letter queue */\n  enableDeadLetters?: boolean;\n\n  // Feature-specific configuration\n  /** Deduplication window in milliseconds */\n  deduplicationWindow?: number;\n  /** Maximum events to persist in history */\n  maxPersistedEvents?: number;\n  /** Maximum dead letters to keep */\n  maxDeadLetters?: number;\n  /** Maximum retries for failed deliveries */\n  maxRetries?: number;\n  /** Retry delay in milliseconds */\n  retryDelayMs?: number;\n}\n\n// =============================================================================\n// Event Metadata Types\n// =============================================================================\n\n/**\n * Event metadata for advanced features.\n */\nexport interface EventMetadata {\n  /** Unique event ID */\n  id: string;\n  /** Event timestamp */\n  timestamp: number;\n  /** Source identifier */\n  source?: string;\n  /** Target identifier */\n  target?: string | null;\n  /** Event priority */\n  priority: number;\n  /** Correlation ID for request-response pattern */\n  correlationId?: string;\n  /** Whether acknowledgment is required */\n  requiresAck?: boolean;\n  /** Custom metadata */\n  custom?: Record<string, unknown>;\n}\n\n/**\n * Event with metadata.\n */\nexport interface EventWithMetadata<T> {\n  /** Event name/type */\n  event: string;\n  /** Event payload */\n  payload: T;\n  /** Event metadata */\n  metadata: EventMetadata;\n}\n\n// =============================================================================\n// Statistics Types\n// =============================================================================\n\n/**\n * Event bus statistics.\n */\nexport interface EventBusStats {\n  /** Total events published */\n  totalPublished: number;\n  /** Total events delivered */\n  totalDelivered: number;\n  /** Total delivery failures */\n  totalFailures: number;\n  /** Current active subscriptions */\n  activeSubscriptions: number;\n  /** Dead letters count */\n  deadLettersCount: number;\n  /** Events by type */\n  eventsByType: Map<string, number>;\n  /** Events by priority */\n  eventsByPriority: Record<number, number>;\n  /** Average delivery time in milliseconds */\n  avgDeliveryTime: number;\n}\n\n// =============================================================================\n// Internal Types\n// =============================================================================\n\n/**\n * Internal listener entry with metadata.\n */\ninterface PriorityListener<T> {\n  handler: EventHandler<T>;\n  priority: number;\n  once: boolean;\n  options: EventListenerOptions;\n  metadata: {\n    id: string;\n    createdAt: number;\n    eventsReceived: number;\n    isActive: boolean;\n  };\n  processedHandler?: EventHandler<T>; // Debounced/throttled version\n}\n\n/**\n * Dead letter entry for failed deliveries.\n */\ninterface DeadLetterEntry {\n  event: string;\n  data: unknown;\n  metadata: EventMetadata;\n  reason: string;\n  timestamp: number;\n  retryCount: number;\n}\n\n/**\n * Deduplication cache entry.\n */\ninterface DeduplicationEntry {\n  hash: string;\n  expiresAt: number;\n}\n\n/**\n * Pending request for request-response pattern.\n */\ninterface PendingRequest<T = unknown> {\n  correlationId: string;\n  responseEvent: string;\n  resolve: (data: T) => void;\n  reject: (error: Error) => void;\n  timeoutHandle: ReturnType<typeof setTimeout>;\n  timestamp: number;\n}\n\n// =============================================================================\n// Common Event Types\n// =============================================================================\n\n/**\n * Standard application events that can be used across modules.\n */\nexport type AppEvents = {\n  // Authentication\n  'auth:login': { userId: string; timestamp: number };\n  'auth:logout': { userId: string; reason?: string };\n  'auth:sessionExpired': { userId: string };\n  'auth:tokenRefreshed': { accessToken: string };\n\n  // Navigation\n  'navigation:beforeNavigate': { from: string; to: string };\n  'navigation:afterNavigate': { from: string; to: string };\n  'navigation:blocked': { from: string; to: string; reason: string };\n\n  // Data\n  'data:invalidate': { keys: string[] };\n  'data:update': { key: string; value: unknown };\n  'data:refresh': { source: string };\n\n  // UI\n  'ui:themeChange': { theme: 'light' | 'dark' | 'system' };\n  'ui:notification': {\n    type: 'info' | 'success' | 'warning' | 'error';\n    message: string;\n    duration?: number;\n  };\n  'ui:modalOpen': { id: string; data?: Record<string, unknown> };\n  'ui:modalClose': { id: string; result?: unknown };\n\n  // Error\n  'error:global': { error: Error; context?: string };\n  'error:network': { url: string; status: number; message: string };\n  'error:validation': { field: string; message: string };\n\n  // Performance\n  'performance:slowOperation': { operation: string; durationMs: number };\n  'performance:memoryPressure': { level: 'low' | 'moderate' | 'critical' };\n\n  // Feature flags\n  'feature:flagChange': { key: string; value: unknown; previousValue: unknown };\n\n  // Offline Queue\n  'offlineQueue:expired': { id: string; url: string };\n  'offlineQueue:enqueued': { id: string; url: string };\n  'offlineQueue:processing': { count: number };\n  'offlineQueue:completed': { id: string; url: string; response: unknown };\n  'offlineQueue:failed': { id: string; url: string; error: Error };\n\n  // Service Circuit Breaker\n  'service:stateChange': { service: string; from: string; to: string; health: unknown };\n  'service:error': { service: string; error: Error };\n  'service:healthCheck': { service: string; health: unknown };\n\n  // Analytics\n  'analytics:consentChanged': { consent: unknown };\n\n  // Network\n  'network:online': undefined;\n  'network:offline': undefined;\n  'network:qualityChange': { quality: string };\n}\n\n// =============================================================================\n// Event Emitter Interface\n// =============================================================================\n\n/**\n * Type-safe event emitter interface.\n */\nexport interface IEventEmitter<Events extends Record<string, unknown>> {\n  /**\n   * Subscribe to an event.\n   */\n  on<K extends keyof Events>(\n    event: K,\n    handler: EventHandler<Events[K]>,\n    options?: EventListenerOptions\n  ): Unsubscribe;\n\n  /**\n   * Subscribe to an event for a single emission.\n   */\n  once<K extends keyof Events>(\n    event: K,\n    handler: EventHandler<Events[K]>,\n    options?: Omit<EventListenerOptions, 'once'>\n  ): Unsubscribe;\n\n  /**\n   * Unsubscribe from an event.\n   */\n  off<K extends keyof Events>(\n    event: K,\n    handler: EventHandler<Events[K]>\n  ): void;\n\n  /**\n   * Emit an event.\n   */\n  emit<K extends keyof Events>(event: K, data: Events[K]): void | Promise<void>;\n\n  /**\n   * Remove all listeners for an event (or all events if no event specified).\n   */\n  removeAllListeners<K extends keyof Events>(event?: K): void;\n\n  /**\n   * Get listener count for an event.\n   */\n  listenerCount<K extends keyof Events>(event: K): number;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\nlet listenerIdCounter = 0;\nlet eventIdCounter = 0;\n\n/**\n * Generate unique listener ID.\n */\nfunction generateListenerId(): string {\n  return `listener_${Date.now().toString(36)}_${(++listenerIdCounter).toString(36)}`;\n}\n\n/**\n * Generate unique event ID.\n */\nfunction generateEventId(): string {\n  return `event_${Date.now().toString(36)}_${(++eventIdCounter).toString(36)}`;\n}\n\n/**\n * Create hash for event deduplication.\n */\nfunction createEventHash(event: string, data: unknown): string {\n  const str = `${event}:${JSON.stringify(data)}`;\n  let hash = 0;\n  for (let i = 0; i < str.length; i++) {\n    const char = str.charCodeAt(i);\n    hash = ((hash << 5) - hash) + char;\n    hash = hash & hash; // Convert to 32-bit integer\n  }\n  return hash.toString(36);\n}\n\n/**\n * Create debounced function.\n */\nfunction debounce<T extends (...args: unknown[]) => unknown>(\n  fn: T,\n  delay: number\n): T {\n  let timeoutId: ReturnType<typeof setTimeout> | null = null;\n  return ((...args: unknown[]) => {\n    if (timeoutId) clearTimeout(timeoutId);\n    timeoutId = setTimeout(() => fn(...args), delay);\n  }) as T;\n}\n\n/**\n * Create throttled function.\n */\nfunction throttle<T extends (...args: unknown[]) => unknown>(\n  fn: T,\n  interval: number\n): T {\n  let lastExecution = 0;\n  return ((...args: unknown[]) => {\n    const now = Date.now();\n    if (now - lastExecution >= interval) {\n      lastExecution = now;\n      fn(...args);\n    }\n  }) as T;\n}\n\n/**\n * Check if source matches filter.\n */\nfunction matchesSourceFilter(\n  source: string | undefined,\n  filter: string | RegExp | string[] | undefined\n): boolean {\n  if (filter === undefined || filter === null || source === undefined || source === null || source === '') return true;\n  if (filter instanceof RegExp) return filter.test(source);\n  if (Array.isArray(filter)) return filter.includes(source);\n  return filter === source;\n}\n\n// =============================================================================\n// Unified Event Emitter Implementation\n// =============================================================================\n\n/**\n * Unified event emitter with all best-of-breed features.\n *\n * Features:\n * - Type-safe event maps\n * - Priority listeners\n * - Once-only listeners\n * - Wildcard listeners\n * - Async event handling\n * - Memory leak prevention\n * - Middleware support\n * - Event namespacing\n * - Request-response pattern\n * - Event deduplication\n * - Event persistence and replay\n * - Dead letter queue\n * - Statistics tracking\n * - Debounce/throttle support\n * - AbortSignal support\n *\n * @example\n * ```typescript\n * interface MyEvents {\n *   'user:created': { id: string; name: string };\n *   'user:deleted': { id: string };\n * }\n *\n * const emitter = new UnifiedEventEmitter<MyEvents>();\n *\n * emitter.on('user:created', (data) => {\n *   console.log(`User ${data.name} created`);\n * });\n *\n * emitter.emit('user:created', { id: '1', name: 'John' });\n * ```\n */\nexport class UnifiedEventEmitter<Events extends Record<string, unknown>>\n  implements IEventEmitter<Events>\n{\n  private readonly config: Required<UnifiedEventEmitterOptions>;\n  private readonly listeners = new Map<keyof Events, PriorityListener<Events[keyof Events]>[]>();\n  private readonly middlewares = new Map<keyof Events, EventMiddleware<Events[keyof Events]>[]>();\n  // private readonly wildcardListeners: PriorityListener<unknown>[] = [];\n\n  // Advanced features\n  private readonly deduplicationCache = new Map<string, DeduplicationEntry>();\n  private readonly eventHistory: EventWithMetadata<unknown>[] = [];\n  private readonly deadLetters: DeadLetterEntry[] = [];\n  private readonly pendingRequests = new Map<string, PendingRequest>();\n\n  // Statistics\n  private stats: EventBusStats = {\n    totalPublished: 0,\n    totalDelivered: 0,\n    totalFailures: 0,\n    activeSubscriptions: 0,\n    deadLettersCount: 0,\n    eventsByType: new Map(),\n    eventsByPriority: { 0: 0, 1: 0, 2: 0, 3: 0 },\n    avgDeliveryTime: 0,\n  };\n  private totalDeliveryTime = 0;\n\n  // Cleanup\n  private cleanupInterval: ReturnType<typeof setInterval> | null = null;\n  private contextSource?: string;\n\n  constructor(options: UnifiedEventEmitterOptions = {}) {\n    this.config = {\n      maxListeners: options.maxListeners ?? 10,\n      debug: options.debug ?? false,\n      onError: options.onError ?? ((error, event) => {\n        console.error(`[UnifiedEventEmitter] Error in \"${String(event)}\" handler:`, error);\n      }),\n      enableMiddleware: options.enableMiddleware ?? true,\n      enableDeduplication: options.enableDeduplication ?? false,\n      enablePersistence: options.enablePersistence ?? false,\n      enableStatistics: options.enableStatistics ?? false,\n      enableDeadLetters: options.enableDeadLetters ?? false,\n      deduplicationWindow: options.deduplicationWindow ?? 1000,\n      maxPersistedEvents: options.maxPersistedEvents ?? 100,\n      maxDeadLetters: options.maxDeadLetters ?? 50,\n      maxRetries: options.maxRetries ?? 3,\n      retryDelayMs: options.retryDelayMs ?? 1000,\n    };\n\n    // Start cleanup interval if deduplication enabled\n    if (this.config.enableDeduplication) {\n      this.cleanupInterval = setInterval(() => {\n        this.cleanupDeduplicationCache();\n      }, this.config.deduplicationWindow * 2);\n    }\n  }\n\n  // ===========================================================================\n  // Core API\n  // ===========================================================================\n\n  /**\n   * Subscribe to an event.\n   */\n  on<K extends keyof Events>(\n    event: K,\n    handler: EventHandler<Events[K]>,\n    options: EventListenerOptions = {}\n  ): Unsubscribe {\n    const { priority = 0, once = false, signal, debounce: debounceMs, throttle: throttleMs } = options;\n\n    if (!this.listeners.has(event)) {\n      this.listeners.set(event, []);\n    }\n\n    const handlers = this.listeners.get(event);\n    if (handlers === undefined) {\n      throw new Error(`Failed to get handlers for event: ${String(event)}`);\n    }\n\n    // Warn if max listeners exceeded\n    if (handlers.length >= this.config.maxListeners) {\n      console.warn(\n        `[UnifiedEventEmitter] Max listeners (${this.config.maxListeners}) exceeded for event \"${String(event)}\"`\n      );\n    }\n\n    // Create processed handler (debounced/throttled if configured)\n    let processedHandler: EventHandler<Events[K]> | undefined;\n    if (debounceMs !== undefined && debounceMs !== null && debounceMs > 0) {\n      processedHandler = debounce(handler as (...args: unknown[]) => unknown, debounceMs) as EventHandler<Events[K]>;\n    } else if (throttleMs !== undefined && throttleMs !== null && throttleMs > 0) {\n      processedHandler = throttle(handler as (...args: unknown[]) => unknown, throttleMs) as EventHandler<Events[K]>;\n    }\n\n    const entry: PriorityListener<Events[K]> = {\n      handler,\n      priority,\n      once,\n      options,\n      metadata: {\n        id: generateListenerId(),\n        createdAt: Date.now(),\n        eventsReceived: 0,\n        isActive: true,\n      },\n      processedHandler,\n    };\n\n    handlers.push(entry as PriorityListener<Events[keyof Events]>);\n\n    // Sort by priority (higher first)\n    handlers.sort((a, b) => b.priority - a.priority);\n\n    if (this.config.enableStatistics) {\n      this.stats.activeSubscriptions++;\n    }\n\n    if (this.config.debug) {\n      console.info(`[UnifiedEventEmitter] Added listener for \"${String(event)}\"`);\n    }\n\n    // Create unsubscribe function\n    const unsubscribe = (): void => this.off(event, handler);\n\n    // Auto-unsubscribe on abort signal\n    if (signal) {\n      signal.addEventListener('abort', unsubscribe, { once: true });\n    }\n\n    return unsubscribe;\n  }\n\n  /**\n   * Subscribe to an event for a single emission.\n   */\n  once<K extends keyof Events>(\n    event: K,\n    handler: EventHandler<Events[K]>,\n    options: Omit<EventListenerOptions, 'once'> = {}\n  ): Unsubscribe {\n    return this.on(event, handler, { ...options, once: true });\n  }\n\n  /**\n   * Unsubscribe from an event.\n   */\n  off<K extends keyof Events>(\n    event: K,\n    handler: EventHandler<Events[K]>\n  ): void {\n    const handlers = this.listeners.get(event);\n    if (!handlers) return;\n\n    const index = handlers.findIndex((h) => h.handler === handler);\n    if (index !== -1) {\n      const entry = handlers[index];\n      if (entry) {\n        entry.metadata.isActive = false;\n      }\n      handlers.splice(index, 1);\n\n      if (this.config.enableStatistics) {\n        this.stats.activeSubscriptions--;\n      }\n\n      if (this.config.debug) {\n        console.info(`[UnifiedEventEmitter] Removed listener for \"${String(event)}\"`);\n      }\n    }\n\n    // Clean up empty arrays\n    if (handlers.length === 0) {\n      this.listeners.delete(event);\n    }\n  }\n\n  /**\n   * Emit an event.\n   */\n  async emit<K extends keyof Events>(event: K, data: Events[K]): Promise<void> {\n    const startTime = this.config.enableStatistics ? performance.now() : 0;\n\n    // Check deduplication\n    if (this.config.enableDeduplication) {\n      const hash = createEventHash(String(event), data);\n      const existing = this.deduplicationCache.get(hash);\n      if (existing !== undefined && existing !== null && existing.expiresAt > Date.now()) {\n        if (this.config.debug) {\n          console.info(`[UnifiedEventEmitter] Deduplicated event: ${String(event)}`);\n        }\n        return;\n      }\n\n      // Add to deduplication cache\n      this.deduplicationCache.set(hash, {\n        hash,\n        expiresAt: Date.now() + this.config.deduplicationWindow,\n      });\n    }\n\n    // Create event metadata\n    const metadata: EventMetadata = {\n      id: generateEventId(),\n      timestamp: Date.now(),\n      source: this.contextSource,\n      target: null,\n      priority: 0,\n    };\n\n    // Update statistics\n    if (this.config.enableStatistics) {\n      this.stats.totalPublished++;\n      const count = this.stats.eventsByType.get(String(event)) ?? 0;\n      this.stats.eventsByType.set(String(event), count + 1);\n    }\n\n    // Persist event if enabled\n    if (this.config.enablePersistence) {\n      this.eventHistory.push({\n        event: String(event),\n        payload: data,\n        metadata,\n      });\n      if (this.eventHistory.length > this.config.maxPersistedEvents) {\n        this.eventHistory.shift();\n      }\n    }\n\n    if (this.config.debug) {\n      console.info(`[UnifiedEventEmitter] Emitting \"${String(event)}\"`, data);\n    }\n\n    // Get handlers\n    const handlers = this.listeners.get(event);\n    if (!handlers || handlers.length === 0) {\n      // No handlers - add to dead letter if enabled\n      if (this.config.enableDeadLetters) {\n        this.addDeadLetter(String(event), data, metadata, 'No subscribers');\n      }\n      return;\n    }\n\n    // Apply middleware\n    let processedData = data;\n    if (this.config.enableMiddleware) {\n      const middlewares = this.middlewares.get(event);\n      if (middlewares && middlewares.length > 0) {\n        processedData = await this.applyMiddleware(middlewares, data) as Events[K];\n      }\n    }\n\n    // Copy handlers to avoid modification during iteration\n    const handlersCopy = [...handlers];\n    const toRemove: EventHandler<Events[K]>[] = [];\n\n    // Execute handlers\n    for (const entry of handlersCopy) {\n      if (!entry.metadata.isActive) continue;\n\n      // Apply filters\n      if (entry.options.filter !== undefined && entry.options.filter !== null && !entry.options.filter(processedData)) {\n        continue;\n      }\n\n      if (entry.options.sourceFilter !== undefined && entry.options.sourceFilter !== null && !matchesSourceFilter(this.contextSource, entry.options.sourceFilter)) {\n        continue;\n      }\n\n      // Mark once handlers for removal BEFORE execution to prevent double-firing\n      if (entry.once) {\n        entry.metadata.isActive = false;\n        toRemove.push(entry.handler as EventHandler<Events[K]>);\n      }\n\n      try {\n        // Apply transform if configured\n        let finalData = processedData;\n        if (entry.options.transform) {\n          finalData = entry.options.transform(processedData) as Events[K];\n        }\n\n        // Use processed handler (debounced/throttled) if available\n        const handlerToCall = entry.processedHandler ?? entry.handler;\n        await handlerToCall(finalData);\n\n        entry.metadata.eventsReceived++;\n\n        if (this.config.enableStatistics) {\n          this.stats.totalDelivered++;\n        }\n      } catch (error) {\n        if (this.config.enableStatistics) {\n          this.stats.totalFailures++;\n        }\n\n        this.config.onError(\n          error instanceof Error ? error : new Error(String(error)),\n          String(event)\n        );\n\n        // Add to dead letter queue\n        if (this.config.enableDeadLetters) {\n          this.addDeadLetter(\n            String(event),\n            data,\n            metadata,\n            error instanceof Error ? error.message : 'Unknown error'\n          );\n        }\n      }\n    }\n\n    // Remove once handlers\n    for (const handler of toRemove) {\n      this.off(event, handler);\n    }\n\n    // Update delivery time stats\n    if (this.config.enableStatistics) {\n      const deliveryTime = performance.now() - startTime;\n      this.totalDeliveryTime += deliveryTime;\n      this.stats.avgDeliveryTime = this.totalDeliveryTime / this.stats.totalDelivered;\n    }\n  }\n\n  /**\n   * Emit synchronously (fire and forget).\n   */\n  emitSync<K extends keyof Events>(event: K, data: Events[K]): void {\n    void this.emit(event, data);\n  }\n\n  /**\n   * Remove all listeners for an event (or all events if no event specified).\n   */\n  removeAllListeners<K extends keyof Events>(event?: K): void {\n    if (event !== undefined && event !== null) {\n      const handlers = this.listeners.get(event);\n      if (handlers !== undefined && handlers !== null && this.config.enableStatistics) {\n        this.stats.activeSubscriptions -= handlers.length;\n      }\n      this.listeners.delete(event);\n      this.middlewares.delete(event);\n    } else {\n      if (this.config.enableStatistics) {\n        this.stats.activeSubscriptions = 0;\n      }\n      this.listeners.clear();\n      this.middlewares.clear();\n    }\n  }\n\n  /**\n   * Get listener count for an event.\n   */\n  listenerCount<K extends keyof Events>(event: K): number {\n    return this.listeners.get(event)?.length ?? 0;\n  }\n\n  /**\n   * Get all registered event names.\n   */\n  eventNames(): (keyof Events)[] {\n    return Array.from(this.listeners.keys());\n  }\n\n  // ===========================================================================\n  // Advanced Features\n  // ===========================================================================\n\n  /**\n   * Wait for an event to be emitted.\n   */\n  async waitFor<K extends keyof Events>(\n    event: K,\n    options: {\n      timeout?: number;\n      filter?: (data: Events[K]) => boolean;\n    } = {}\n  ): Promise<Events[K]> {\n    return new Promise((resolve, reject) => {\n      let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n      const handler: EventHandler<Events[K]> = (data) => {\n        if (options.filter && !options.filter(data)) {\n          return; // Don't resolve if filter doesn't match\n        }\n\n        if (timeoutId) {\n          clearTimeout(timeoutId);\n        }\n        this.off(event, handler);\n        resolve(data);\n      };\n\n      if (options.timeout !== undefined && options.timeout > 0) {\n        timeoutId = setTimeout(() => {\n          this.off(event, handler);\n          reject(new Error(`Timeout waiting for event \"${String(event)}\"`));\n        }, options.timeout);\n      }\n\n      this.on(event, handler);\n    });\n  }\n\n  /**\n   * Add middleware for an event.\n   */\n  use<K extends keyof Events>(\n    event: K,\n    middleware: EventMiddleware<Events[K]>\n  ): Unsubscribe {\n    if (!this.config.enableMiddleware) {\n      console.warn('[UnifiedEventEmitter] Middleware is disabled');\n      return () => {};\n    }\n\n    if (!this.middlewares.has(event)) {\n      this.middlewares.set(event, []);\n    }\n\n    const middlewares = this.middlewares.get(event);\n    if (middlewares) {\n      middlewares.push(middleware as unknown as EventMiddleware<Events[keyof Events]>);\n    }\n\n    return () => {\n      if (middlewares) {\n        const index = middlewares.indexOf(middleware as unknown as EventMiddleware<Events[keyof Events]>);\n        if (index !== -1) {\n          middlewares.splice(index, 1);\n        }\n      }\n    };\n  }\n\n  /**\n   * Pipe events from another emitter.\n   */\n  pipe<K extends keyof Events>(\n    event: K,\n    source: UnifiedEventEmitter<Events>\n  ): Unsubscribe {\n    const handler: EventHandler<Events[K]> = (data) => {\n      this.emitSync(event, data);\n    };\n\n    return source.on(event, handler);\n  }\n\n  /**\n   * Set context source for emitted events.\n   */\n  setContext(source: string): void {\n    this.contextSource = source;\n  }\n\n  /**\n   * Get context source.\n   */\n  getContext(): string | undefined {\n    return this.contextSource;\n  }\n\n  /**\n   * Request-response pattern: send request and wait for response.\n   */\n  async request<TReq extends keyof Events, TRes extends keyof Events>(\n    requestEvent: TReq,\n    responseEvent: TRes,\n    payload: Events[TReq],\n    timeout = 5000\n  ): Promise<Events[TRes]> {\n    const correlationId = generateEventId();\n\n    return new Promise((resolve, reject) => {\n      // Set up response listener\n      const subscription = this.on(\n        responseEvent,\n        (data) => {\n          // Check if this response matches our request\n          // In real implementation, we'd check metadata.correlationId\n          subscription();\n          const pending = this.pendingRequests.get(correlationId);\n          if (pending) {\n            clearTimeout(pending.timeoutHandle);\n            this.pendingRequests.delete(correlationId);\n          }\n          resolve(data);\n        },\n        { once: true }\n      );\n\n      // Set up timeout\n      const timeoutHandle = setTimeout(() => {\n        subscription();\n        this.pendingRequests.delete(correlationId);\n        reject(new Error(`Request timeout for ${String(requestEvent)} -> ${String(responseEvent)}`));\n      }, timeout);\n\n      // Store pending request\n      this.pendingRequests.set(correlationId, {\n        correlationId,\n        responseEvent: String(responseEvent),\n        resolve: resolve as (data: unknown) => void,\n        reject,\n        timeoutHandle,\n        timestamp: Date.now(),\n      });\n\n      // Send request\n      this.emitSync(requestEvent, payload);\n    });\n  }\n\n  // ===========================================================================\n  // Request-Response Pattern\n  // ===========================================================================\n\n  /**\n   * Get event history.\n   */\n  getHistory(): ReadonlyArray<EventWithMetadata<unknown>> {\n    if (!this.config.enablePersistence) {\n      console.warn('[UnifiedEventEmitter] Persistence is disabled');\n      return [];\n    }\n    return [...this.eventHistory];\n  }\n\n  // ===========================================================================\n  // Persistence and Replay\n  // ===========================================================================\n\n  /**\n   * Replay events from history.\n   */\n  replay(filter?: (event: EventWithMetadata<unknown>) => boolean): void {\n    if (!this.config.enablePersistence) {\n      console.warn('[UnifiedEventEmitter] Persistence is disabled');\n      return;\n    }\n\n    const events = filter ? this.eventHistory.filter(filter) : this.eventHistory;\n\n    for (const event of events) {\n      this.emitSync(event.event as keyof Events, event.payload as Events[keyof Events]);\n    }\n  }\n\n  /**\n   * Clear event history.\n   */\n  clearHistory(): void {\n    this.eventHistory.length = 0;\n  }\n\n  /**\n   * Get dead letters.\n   */\n  getDeadLetters(): ReadonlyArray<DeadLetterEntry> {\n    if (!this.config.enableDeadLetters) {\n      console.warn('[UnifiedEventEmitter] Dead letter queue is disabled');\n      return [];\n    }\n    return [...this.deadLetters];\n  }\n\n  // ===========================================================================\n  // Dead Letter Queue\n  // ===========================================================================\n\n  /**\n   * Retry a dead letter.\n   */\n  retryDeadLetter(index: number): boolean {\n    if (!this.config.enableDeadLetters) {\n      console.warn('[UnifiedEventEmitter] Dead letter queue is disabled');\n      return false;\n    }\n\n    const entry = this.deadLetters[index];\n    if (!entry || entry.retryCount >= this.config.maxRetries) {\n      return false;\n    }\n\n    entry.retryCount++;\n    this.emitSync(entry.event as keyof Events, entry.data as Events[keyof Events]);\n\n    // Remove from dead letters\n    this.deadLetters.splice(index, 1);\n    if (this.config.enableStatistics) {\n      this.stats.deadLettersCount--;\n    }\n\n    return true;\n  }\n\n  /**\n   * Clear dead letters.\n   */\n  clearDeadLetters(): void {\n    this.deadLetters.length = 0;\n    if (this.config.enableStatistics) {\n      this.stats.deadLettersCount = 0;\n    }\n  }\n\n  /**\n   * Get statistics.\n   */\n  getStats(): EventBusStats {\n    if (!this.config.enableStatistics) {\n      console.warn('[UnifiedEventEmitter] Statistics tracking is disabled');\n    }\n    return {\n      ...this.stats,\n      eventsByType: new Map(this.stats.eventsByType),\n    };\n  }\n\n  /**\n   * Reset statistics.\n   */\n  resetStats(): void {\n    this.stats = {\n      totalPublished: 0,\n      totalDelivered: 0,\n      totalFailures: 0,\n      activeSubscriptions: this.stats.activeSubscriptions, // Keep current subscriptions\n      deadLettersCount: this.deadLetters.length,\n      eventsByType: new Map(),\n      eventsByPriority: { 0: 0, 1: 0, 2: 0, 3: 0 },\n      avgDeliveryTime: 0,\n    };\n    this.totalDeliveryTime = 0;\n  }\n\n  // ===========================================================================\n  // Statistics\n  // ===========================================================================\n\n  /**\n   * Clear all data and reset emitter.\n   */\n  clear(): void {\n    // Clear all listeners\n    for (const handlers of this.listeners.values()) {\n      for (const handler of handlers) {\n        handler.metadata.isActive = false;\n      }\n    }\n    this.listeners.clear();\n    this.middlewares.clear();\n\n    // Clear pending requests\n    for (const pending of this.pendingRequests.values()) {\n      clearTimeout(pending.timeoutHandle);\n      pending.reject(new Error('Event emitter cleared'));\n    }\n    this.pendingRequests.clear();\n\n    // Clear caches\n    this.deduplicationCache.clear();\n    this.eventHistory.length = 0;\n    this.deadLetters.length = 0;\n\n    // Reset stats\n    this.resetStats();\n  }\n\n  /**\n   * Dispose the emitter and clean up resources.\n   */\n  dispose(): void {\n    this.clear();\n    if (this.cleanupInterval) {\n      clearInterval(this.cleanupInterval);\n      this.cleanupInterval = null;\n    }\n  }\n\n  // ===========================================================================\n  // Cleanup\n  // ===========================================================================\n\n  /**\n   * Apply middleware chain.\n   */\n  private async applyMiddleware<K extends keyof Events>(\n    middlewares: EventMiddleware<Events[K]>[],\n    data: Events[K]\n  ): Promise<Events[K]> {\n    let currentData = data;\n\n    const executeMiddleware = async (index: number, data: Events[K]): Promise<void> => {\n      if (index >= middlewares.length) {\n        currentData = data;\n        return;\n      }\n\n      const middleware = middlewares[index];\n      if (middleware) {\n        await middleware(data, async (nextData) =>\n          executeMiddleware(index + 1, nextData)\n        );\n      }\n    };\n\n    await executeMiddleware(0, data);\n    return currentData;\n  }\n\n  /**\n   * Add message to dead letter queue.\n   */\n  private addDeadLetter(\n    event: string,\n    data: unknown,\n    metadata: EventMetadata,\n    reason: string\n  ): void {\n    this.deadLetters.push({\n      event,\n      data,\n      metadata,\n      reason,\n      timestamp: Date.now(),\n      retryCount: 0,\n    });\n\n    if (this.config.enableStatistics) {\n      this.stats.deadLettersCount++;\n    }\n\n    // Trim if exceeding limit\n    if (this.deadLetters.length > this.config.maxDeadLetters) {\n      this.deadLetters.shift();\n      if (this.config.enableStatistics) {\n        this.stats.deadLettersCount--;\n      }\n    }\n  }\n\n  /**\n   * Clean up deduplication cache.\n   */\n  private cleanupDeduplicationCache(): void {\n    const now = Date.now();\n    for (const [hash, entry] of this.deduplicationCache) {\n      if (entry.expiresAt <= now) {\n        this.deduplicationCache.delete(hash);\n      }\n    }\n  }\n}\n\n// =============================================================================\n// Factory Functions\n// =============================================================================\n\n/**\n * Create a unified event emitter.\n */\nexport function createEventEmitter<Events extends Record<string, unknown>>(\n  options?: UnifiedEventEmitterOptions\n): UnifiedEventEmitter<Events> {\n  return new UnifiedEventEmitter<Events>(options);\n}\n\n/**\n * Create a scoped event emitter with namespace.\n */\nexport function createScopedEmitter<Events extends Record<string, unknown>>(\n  namespace: string,\n  baseEmitter?: UnifiedEventEmitter<Record<string, unknown>>\n): UnifiedEventEmitter<Events> {\n  const scoped = createEventEmitter<Events>();\n  scoped.setContext(namespace);\n\n  // Forward to base emitter with namespace prefix if provided\n  if (baseEmitter) {\n    const originalEmit = scoped.emit.bind(scoped);\n    scoped.emit = async <K extends keyof Events>(event: K, data: Events[K]) => {\n      await originalEmit(event, data);\n      await baseEmitter.emit(`${namespace}:${String(event)}`, data);\n    };\n  }\n\n  return scoped;\n}\n\n// =============================================================================\n// Global Event Bus\n// =============================================================================\n\n/**\n * Global event bus instance.\n */\nexport const globalEventBus = createEventEmitter<AppEvents>({\n  maxListeners: 50,\n  debug: process.env['NODE_ENV'] === 'development',\n  enableStatistics: true,\n  enableDeadLetters: true,\n});\n\n/**\n * Shorthand for common event operations.\n */\nexport const events = {\n  emit: globalEventBus.emit.bind(globalEventBus),\n  on: globalEventBus.on.bind(globalEventBus),\n  once: globalEventBus.once.bind(globalEventBus),\n  off: globalEventBus.off.bind(globalEventBus),\n  waitFor: globalEventBus.waitFor.bind(globalEventBus),\n};\n\n// =============================================================================\n// Event Handler Utilities\n// =============================================================================\n\n/**\n * Create a handler that only executes once per unique key within a time window.\n */\nexport function dedupeHandler<T>(\n  handler: EventHandler<T>,\n  keyFn: (data: T) => string,\n  windowMs: number\n): EventHandler<T> {\n  const seen = new Map<string, number>();\n\n  return async (data: T) => {\n    const key = keyFn(data);\n    const now = Date.now();\n    const lastSeen = seen.get(key);\n\n    if (lastSeen !== undefined && now - lastSeen < windowMs) {\n      return; // Skip duplicate\n    }\n\n    seen.set(key, now);\n\n    // Cleanup old entries periodically\n    if (seen.size > 1000) {\n      const cutoff = now - windowMs;\n      for (const [k, v] of seen.entries()) {\n        if (v < cutoff) seen.delete(k);\n      }\n    }\n\n    return handler(data);\n  };\n}\n\n/**\n * Create a handler that batches events and calls the handler with all events.\n */\nexport function batchHandler<T>(\n  handler: (events: T[]) => void | Promise<void>,\n  intervalMs: number\n): EventHandler<T> {\n  let batch: T[] = [];\n  let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n  const flush = (): void => {\n    if (batch.length === 0) return;\n    const events = batch;\n    batch = [];\n    void handler(events);\n  };\n\n  return (data: T) => {\n    batch.push(data);\n\n    timeoutId ??= setTimeout(() => {\n      timeoutId = null;\n      flush();\n    }, intervalMs);\n  };\n}\n\n/**\n * Create a handler that filters events based on a predicate.\n */\nexport function filterHandler<T>(\n  handler: EventHandler<T>,\n  predicate: (data: T) => boolean\n): EventHandler<T> {\n  return async (data: T): Promise<void> => {\n    if (predicate(data)) {\n      await handler(data);\n    }\n  };\n}\n\n/**\n * Create a handler that transforms event data before passing to handler.\n */\nexport function mapHandler<T, U>(\n  handler: EventHandler<U>,\n  transform: (data: T) => U\n): EventHandler<T> {\n  return async (data: T) => {\n    return handler(transform(data));\n  };\n}\n\n/**\n * Combine multiple handlers into one.\n */\nexport function combineHandlers<T>(\n  ...handlers: EventHandler<T>[]\n): EventHandler<T> {\n  return async (data: T) => {\n    for (const handler of handlers) {\n      await handler(data);\n    }\n  };\n}\n\n// =============================================================================\n// DOM Event Utilities\n// =============================================================================\n\n/**\n * Add event listener with automatic cleanup.\n */\nexport function addEventListener<K extends keyof WindowEventMap>(\n  target: Window,\n  event: K,\n  handler: (event: WindowEventMap[K]) => void,\n  options?: boolean | AddEventListenerOptions\n): Unsubscribe;\n// eslint-disable-next-line no-redeclare\nexport function addEventListener<K extends keyof DocumentEventMap>(\n  target: Document,\n  event: K,\n  handler: (event: DocumentEventMap[K]) => void,\n  options?: boolean | AddEventListenerOptions\n): Unsubscribe;\n// eslint-disable-next-line no-redeclare\nexport function addEventListener<K extends keyof HTMLElementEventMap>(\n  target: HTMLElement,\n  event: K,\n  handler: (event: HTMLElementEventMap[K]) => void,\n  options?: boolean | AddEventListenerOptions\n): Unsubscribe;\n// eslint-disable-next-line no-redeclare\nexport function addEventListener(\n  target: EventTarget,\n  event: string,\n  handler: EventListener,\n  options?: boolean | AddEventListenerOptions\n): Unsubscribe {\n  target.addEventListener(event, handler, options);\n  return () => target.removeEventListener(event, handler, options);\n}\n\n/**\n * Create a disposable event listener that cleans up when signal is aborted.\n */\nexport function addDisposableEventListener<K extends keyof WindowEventMap>(\n  target: Window,\n  event: K,\n  handler: (event: WindowEventMap[K]) => void,\n  signal: AbortSignal,\n  options?: Omit<AddEventListenerOptions, 'signal'>\n): void;\n// eslint-disable-next-line no-redeclare\nexport function addDisposableEventListener(\n  target: EventTarget,\n  event: string,\n  handler: EventListener,\n  signal: AbortSignal,\n  options?: Omit<AddEventListenerOptions, 'signal'>\n): void {\n  if (signal.aborted) return;\n  target.addEventListener(event, handler, { ...options, signal });\n}\n\n// =============================================================================\n// Custom Event Utilities\n// =============================================================================\n\n/**\n * Create and dispatch a custom event.\n */\nexport function dispatchCustomEvent<T>(\n  target: EventTarget,\n  eventName: string,\n  detail: T,\n  options: Omit<CustomEventInit<T>, 'detail'> = {}\n): boolean {\n  const event = new CustomEvent(eventName, {\n    ...options,\n    detail,\n    bubbles: options.bubbles ?? true,\n    cancelable: options.cancelable ?? true,\n  });\n  return target.dispatchEvent(event);\n}\n\n/**\n * Listen for a custom event with typed detail.\n */\nexport function onCustomEvent<T>(\n  target: EventTarget,\n  eventName: string,\n  handler: (detail: T) => void,\n  options?: boolean | AddEventListenerOptions\n): Unsubscribe {\n  const wrappedHandler = (event: Event): void => {\n    if (event instanceof CustomEvent) {\n      handler(event.detail as T);\n    }\n  };\n  target.addEventListener(eventName, wrappedHandler, options);\n  return () => target.removeEventListener(eventName, wrappedHandler, options);\n}\n\n// =============================================================================\n// Mixin Pattern\n// =============================================================================\n\n/**\n * Constructor type for mixin pattern.\n */\ntype Constructor<T = object> = new (...args: unknown[]) => T;\n\n/**\n * Event emitter mixin for classes.\n */\nexport function withEvents<\n  T extends Constructor,\n  Events extends Record<string, unknown>\n>(\n  Base: T\n): T & Constructor<{ events: UnifiedEventEmitter<Events> }> {\n  // Create a mixin class that adds event emitter functionality\n  const MixinClass = class extends (Base as Constructor) {\n    events = createEventEmitter<Events>();\n  };\n\n  return MixinClass as T & Constructor<{ events: UnifiedEventEmitter<Events> }>;\n}\n\n// =============================================================================\n// Legacy Compatibility Exports\n// =============================================================================\n\n/**\n * @deprecated Use UnifiedEventEmitter instead\n */\nexport const SimpleEventEmitter = UnifiedEventEmitter;\n\n/**\n * @deprecated Use UnifiedEventEmitter instead\n */\nexport const EventEmitter = UnifiedEventEmitter;\n"],"names":["listenerIdCounter","eventIdCounter","generateListenerId","generateEventId","createEventHash","event","data","str","hash","i","char","debounce","fn","delay","timeoutId","args","throttle","interval","lastExecution","now","matchesSourceFilter","source","filter","UnifiedEventEmitter","options","error","handler","priority","once","signal","debounceMs","throttleMs","handlers","processedHandler","entry","a","unsubscribe","index","h","startTime","existing","metadata","count","processedData","middlewares","handlersCopy","toRemove","finalData","deliveryTime","resolve","reject","middleware","requestEvent","responseEvent","payload","timeout","correlationId","subscription","pending","timeoutHandle","events","currentData","executeMiddleware","nextData","reason","createEventEmitter","createScopedEmitter","namespace","baseEmitter","scoped","originalEmit","globalEventBus","dedupeHandler","keyFn","windowMs","seen","key","lastSeen","cutoff","k","v","batchHandler","intervalMs","batch","flush","filterHandler","predicate","mapHandler","transform","combineHandlers","addEventListener","target","addDisposableEventListener","dispatchCustomEvent","eventName","detail","onCustomEvent","wrappedHandler","withEvents","Base","SimpleEventEmitter"],"mappings":"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"}