{"version":3,"file":"ngx-signal-hub.mjs","sources":["../../../projects/ngx-signal-hub/src/lib/signal-hub.service.ts","../../../projects/ngx-signal-hub/src/public-api.ts","../../../projects/ngx-signal-hub/src/ngx-signal-hub.ts"],"sourcesContent":["import {\n  DestroyRef,\n  Injectable,\n  Injector,\n  effect,\n  signal,\n  computed,\n  untracked,\n  Signal,\n} from '@angular/core';\n\n/**\n * Represents an event in the signal hub with a key, data, and timestamp.\n */\nexport interface HubEvent<T = unknown> {\n  key: string;\n  data: T;\n  timestamp: number;\n}\n\n/**\n * Represents the options for subscribing to a signal hub event.\n */\nexport interface HubEventOptions<T> {\n  /** The key/query string to match events against (e.g., 'user:login', 'user:*'). */\n  key: string;\n  /** The callback function to execute when an event matches the query. */\n  callback: (event: HubEvent<T>) => void | Promise<void>;\n  /** Optional DestroyRef for auto-cleaning subscriptions. */\n  destroyRef?: DestroyRef;\n  /** If true, replays the latest event for the key on subscription. */\n  replayLatest?: boolean;\n  /** Optional error handler for callback errors. */\n  onError?: (error: unknown, event: HubEvent<T>) => void;\n}\n\n/**\n * Represents a subscription to the signal hub.\n */\nexport interface HubSubscription {\n  unsubscribe: () => void;\n}\n\n/**\n * A hybrid signal hub service for publishing and observing events using Signals and callbacks.\n * Supports pub/sub with key-based routing, pattern matching, and Signal-based event observation.\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class MyComponent {\n *   constructor(private signalHub: SignalHubService, private destroyRef: DestroyRef) {\n *     // Synchronous subscription\n *     this.signalHub.on({\n *       key: 'user:*',\n *       callback: (event) => console.log(event.data),\n *       destroyRef: this.destroyRef,\n *       replayLatest: true,\n *     });\n *\n *     // Asynchronous subscription\n *     this.signalHub.onAsync({\n *       key: 'user:login',\n *       callback: async (event) => {\n *         await fetch('/log', { method: 'POST', body: JSON.stringify(event.data) });\n *         console.log(event.data);\n *       },\n *       replayLatest: true,\n *       onError: (err) => console.error('Event error:', err),\n *     });\n *\n *     // Publish an event\n *     this.signalHub.publish('user:login', { id: 123 });\n *\n *     // Clear a specific event\n *     this.signalHub.clearEvent('user:login');\n *\n *     // Reset everything\n *     this.signalHub.reset({ clearSubscribers: true });\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class SignalHubService {\n  private readonly eventQueue = signal<HubEvent[]>([]);\n  private readonly eventRegistry = signal<Map<string, HubEvent>>(new Map());\n  private readonly subscribers = new Map<\n    string,\n    Array<{\n      callback: (event: HubEvent<unknown>) => void | Promise<void>;\n      onError?: (error: unknown, event: HubEvent<unknown>) => void;\n    }>\n  >();\n\n  constructor(injector: Injector) {\n    effect(\n      () => {\n        const queuedEvents = this.eventQueue();\n        if (!queuedEvents.length) return;\n\n        untracked(() => {\n          const registry = this.eventRegistry();\n          const updatedRegistry = new Map(registry);\n\n          for (const event of queuedEvents) {\n            updatedRegistry.set(event.key, event);\n            this.notifySubscribers(event);\n          }\n\n          this.eventRegistry.set(updatedRegistry);\n          this.eventQueue.set([]);\n        });\n      },\n      { injector }\n    );\n  }\n\n  /**\n   * Publishes an event with the given key and data, triggering subscribers and updating the registry.\n   *\n   * @param key - The event key (e.g., 'user:login').\n   * @param data - The event data (must not be null or undefined).\n   * @throws Error if key is empty or data is null/undefined.\n   *\n   * @example\n   * ```typescript\n   * signalHub.publish('user:login', { id: 123 });\n   * // Triggers subscribers to 'user:login' or 'user:*'\n   * ```\n   */\n  publish<T>(key: string, data: T): void {\n    if (!key) throw new Error('Key cannot be empty');\n    if (data == null) throw new Error('Data cannot be null or undefined');\n\n    const event: HubEvent<T> = { key, data, timestamp: Date.now() };\n    this.eventQueue.update((queue) => [...queue, event]);\n  }\n\n  /**\n   * Publishes an event with the given key, triggering subscribers and updating the registry.\n   *\n   * @param key - The event key (e.g., 'user:login').\n   * @throws Error if key is empty.\n   *\n   * @example\n   * ```typescript\n   * signalHub.publish('user:login');\n   * // Triggers subscribers to 'user:login' or 'user:*'\n   * ```\n   */\n  publishNoData(key: string): void {\n    if (!key) throw new Error('Key cannot be empty');\n    const event: HubEvent<undefined> = { key, data: undefined, timestamp: Date.now() };\n    this.eventQueue.update((queue) => [...queue, event]);\n  }\n\n  /**\n   * Subscribes to events matching a query with a synchronous callback, optionally auto-cleaning with DestroyRef.\n   * Supports pattern matching (e.g., 'user:*') and optional replay of the latest event.\n   *\n   * @param options - Subscription options including key, callback, and optional settings.\n   * @returns A HubSubscription object with an unsubscribe method.\n   * @throws Error if key is empty or callback is not a function.\n   *\n   * @example\n   * ```typescript\n   * signalHub.subscribe({\n   *   key: 'user:*',\n   *   callback: (event) => console.log(event.data),\n   *   replayLatest: true,\n   *   destroyRef: inject(DestroyRef),\n   *   onError: (err) => console.error('Error:', err),\n   * });\n   * ```\n   */\n  subscribe<T>({\n    key,\n    callback,\n    destroyRef,\n    replayLatest,\n    onError,\n  }: HubEventOptions<T>): HubSubscription {\n    if (!key) throw new Error('Key cannot be empty');\n    if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n    if (replayLatest) {\n      const latestEvent = this.eventRegistry().get(key) as HubEvent<T> | undefined;\n      if (latestEvent) {\n        try {\n          callback(latestEvent);\n        } catch (error) {\n          if (onError) {\n            onError(error, latestEvent);\n          } else {\n            console.warn(`Replay error for query \"${key}\":`, error);\n          }\n        }\n      }\n    }\n    return this.internalSubscribe(key, callback, destroyRef, onError);\n  }\n\n  /**\n   * Subscribes to events matching a query with an asynchronous callback, optionally auto-cleaning with DestroyRef.\n   * Supports pattern matching (e.g., 'user:*') and optional replay of the latest event.\n   *\n   * @param options - Subscription options including key, callback, and optional settings.\n   * @returns A Promise resolving to a HubSubscription object with an unsubscribe method.\n   * @throws Error if key is empty or callback is not a function.\n   *\n   * @example\n   * ```typescript\n   * await signalHub.subscribeAsync({\n   *   key: 'user:*',\n   *   callback: async (event) => console.log(event.data),\n   *   replayLatest: true,\n   *   destroyRef: inject(DestroyRef),\n   *   onError: (err) => console.error('Error:', err),\n   * });\n   * ```\n   */\n  async subscribeAsync<T>({\n    key,\n    callback,\n    destroyRef,\n    replayLatest,\n    onError,\n  }: HubEventOptions<T>): Promise<HubSubscription> {\n    if (!key) throw new Error('Key cannot be empty');\n    if (typeof callback !== 'function') throw new Error('Callback must be a function');\n\n    if (replayLatest) {\n      const latestEvent = this.eventRegistry().get(key) as HubEvent<T> | undefined;\n      if (latestEvent) {\n        try {\n          await callback(latestEvent);\n        } catch (error) {\n          if (onError) {\n            onError(error, latestEvent);\n          } else {\n            console.warn(`Replay error for query \"${key}\":`, error);\n          }\n        }\n      }\n    }\n    return this.internalSubscribe(key, callback, destroyRef, onError);\n  }\n\n  /**\n   * A shorthand for subscribing to events with a synchronous callback, with optional replay and auto-cleanup.\n   *\n   * @param options - Options including key, callback, and optional replayLatest, destroyRef, and onError.\n   * @returns A HubSubscription object with an unsubscribe method.\n   *\n   * @example\n   * ```typescript\n   * signalHub.on({\n   *   key: 'user:login',\n   *   callback: (event) => console.log(event.data),\n   *   replayLatest: true,\n   *   destroyRef: inject(DestroyRef),\n   *   onError: (err) => console.error('Error:', err),\n   * });\n   * ```\n   */\n  on<T>({ key, callback, replayLatest, destroyRef, onError }: HubEventOptions<T>): HubSubscription {\n    return this.subscribe({ key, callback, replayLatest, destroyRef, onError });\n  }\n\n  /**\n   * A shorthand for subscribing to events with an asynchronous callback, with optional replay and auto-cleanup.\n   *\n   * @param options - Options including key, callback, and optional replayLatest, destroyRef, and onError.\n   * @returns A Promise resolving to a HubSubscription object with an unsubscribe method.\n   *\n   * @example\n   * ```typescript\n   * await signalHub.onAsync({\n   *   key: 'user:login',\n   *   callback: async (event) => console.log(event.data),\n   *   replayLatest: true,\n   *   destroyRef: inject(DestroyRef),\n   *   onError: (err) => console.error('Error:', err),\n   * });\n   * ```\n   */\n  async onAsync<T>({\n    key,\n    callback,\n    replayLatest,\n    destroyRef,\n    onError,\n  }: HubEventOptions<T>): Promise<HubSubscription> {\n    return this.subscribeAsync({ key, callback, replayLatest, destroyRef, onError });\n  }\n\n  /**\n   * Subscribes to a single event matching the key with a synchronous callback, auto-unsubscribing after the first match.\n   *\n   * @param options - Options including key, callback, and optional replayLatest and onError.\n   * @returns A HubSubscription object with an unsubscribe method.\n   *\n   * @example\n   * ```typescript\n   * signalHub.once({\n   *   key: 'user:login',\n   *   callback: (event) => console.log('Logged in:', event.data),\n   *   replayLatest: true,\n   *   onError: (err) => console.error('Error:', err),\n   * });\n   * ```\n   */\n  once<T>({ key, callback, replayLatest, onError }: HubEventOptions<T>): HubSubscription {\n    let subscription: HubSubscription | null = null;\n    // Guarantees the callback runs exactly once, even in the same `notifySubscribers` cycle.\n    let hasRun = false;\n\n    subscription = this.subscribe({\n      key,\n      callback: (event) => {\n        if (hasRun) return; // Skip if already run.\n        hasRun = true;\n        subscription?.unsubscribe(); // Unsubscribe first\n        callback(event as HubEvent<T>);\n      },\n      replayLatest,\n      onError,\n    });\n    return subscription;\n  }\n\n  /**\n   * Subscribes to a single event matching the key with an asynchronous callback, auto-unsubscribing after the first match.\n   *\n   * @param options - Options including key, callback, and optional replayLatest and onError.\n   * @returns A Promise resolving to a HubSubscription object with an unsubscribe method.\n   *\n   * @example\n   * ```typescript\n   * await signalHub.onceAsync({\n   *   key: 'user:login',\n   *   callback: async (event) => console.log('Logged in:', event.data),\n   *   replayLatest: true,\n   *   onError: (err) => console.error('Error:', err),\n   * });\n   * ```\n   */\n  async onceAsync<T>({\n    key,\n    callback,\n    replayLatest,\n    onError,\n  }: HubEventOptions<T>): Promise<HubSubscription> {\n    let subscription: HubSubscription | null = null;\n    subscription = await this.subscribeAsync({\n      key,\n      callback: async (event) => {\n        await callback(event as HubEvent<T>);\n        subscription?.unsubscribe();\n      },\n      replayLatest,\n      onError,\n    });\n    return subscription;\n  }\n  /**\n   * Subscribes to the latest events from multiple keys, invoking the callback with an array of events\n   * whenever any key emits a new event, provided all keys have emitted at least once.\n   *\n   * @param options - Options including keys, callback, and optional settings.\n   * @returns A HubSubscription object with an unsubscribe method.\n   * @throws Error if keys array is empty or contains invalid keys.\n   *\n   * @example\n   * ```typescript\n   * signalHub.onCombineLatest({\n   *   keys: ['user:login', 'user:logout'],\n   *   callback: (events) => console.log(events.map(e => e.data)),\n   *   replayLatest: true,\n   *   destroyRef: inject(DestroyRef),\n   *   onError: (err, events) => console.error('Error:', err, events),\n   * });\n   * ```\n   */\n  onCombineLatest<T>({\n    keys,\n    callback,\n    destroyRef,\n    replayLatest,\n    onError,\n  }: {\n    keys: string[];\n    callback: (events: HubEvent<T>[]) => void | Promise<void>;\n    destroyRef?: DestroyRef;\n    replayLatest?: boolean;\n    onError?: (error: unknown, events: HubEvent<T>[]) => void;\n  }): HubSubscription {\n    if (!keys.length) throw new Error('Keys array cannot be empty');\n    if (keys.some((key) => !key)) throw new Error('All keys must be non-empty');\n\n    const safeCallback = callback as (events: HubEvent<unknown>[]) => void | Promise<void>;\n    const safeOnError = onError as\n      | ((error: unknown, events: HubEvent<unknown>[]) => void)\n      | undefined;\n\n    // Check if all keys have events for replay\n    if (replayLatest) {\n      const registry = this.eventRegistry();\n      const latestEvents = keys.map((key) => registry.get(key) as HubEvent<T>).filter(Boolean);\n      if (latestEvents.length === keys.length) {\n        try {\n          safeCallback(latestEvents);\n        } catch (error) {\n          if (safeOnError) {\n            safeOnError(error, latestEvents);\n          } else {\n            console.warn(`Replay error for combineLatest:`, error);\n          }\n        }\n      }\n    }\n\n    // Subscribe to each key\n    const subscriptions = keys.map((key) =>\n      this.on({\n        key,\n        callback: () => {\n          // Check if all keys have events\n          const registry = this.eventRegistry();\n          const events = keys.map((k) => registry.get(k) as HubEvent<T>).filter(Boolean);\n          if (events.length === keys.length) {\n            try {\n              safeCallback(events);\n            } catch (error) {\n              if (safeOnError) {\n                safeOnError(error, events);\n              } else {\n                console.warn(`Callback error for combineLatest:`, error);\n              }\n            }\n          }\n        },\n        // Adapt onError for single event\n        onError: safeOnError\n          ? (error, event) => safeOnError(error, [event]) // Wrap single event in array\n          : undefined,\n      })\n    );\n\n    // Handle unsubscribe\n    let manualUnsubscribe = true;\n    if (destroyRef) {\n      manualUnsubscribe = false;\n      destroyRef.onDestroy(() => subscriptions.forEach((sub) => sub.unsubscribe()));\n    }\n\n    return {\n      unsubscribe: () => {\n        if (manualUnsubscribe) {\n          subscriptions.forEach((sub) => sub.unsubscribe());\n        }\n      },\n    };\n  }\n\n  /**\n   * Subscribes to the latest events from multiple keys with an asynchronous callback,\n   * invoking the callback with an array of events whenever any key emits a new event,\n   * provided all keys have emitted at least once.\n   *\n   * @param options - Options including keys, callback, and optional settings.\n   * @returns A Promise resolving to a HubSubscription object with an unsubscribe method.\n   * @throws Error if keys array is empty or contains invalid keys.\n   */\n  async onCombineLatestAsync<T>({\n    keys,\n    callback,\n    destroyRef,\n    replayLatest,\n    onError,\n  }: {\n    keys: string[];\n    callback: (events: HubEvent<T>[]) => Promise<void>;\n    destroyRef?: DestroyRef;\n    replayLatest?: boolean;\n    onError?: (error: unknown, events: HubEvent<T>[]) => void;\n  }): Promise<HubSubscription> {\n    if (!keys.length) throw new Error('Keys array cannot be empty');\n    if (keys.some((key) => !key)) throw new Error('All keys must be non-empty');\n\n    const safeCallback = callback as (events: HubEvent<unknown>[]) => Promise<void>;\n    const safeOnError = onError as\n      | ((error: unknown, events: HubEvent<unknown>[]) => void)\n      | undefined;\n\n    // Check if all keys have events for replay\n    if (replayLatest) {\n      const registry = this.eventRegistry();\n      const latestEvents = keys.map((key) => registry.get(key) as HubEvent<T>).filter(Boolean);\n      if (latestEvents.length === keys.length) {\n        try {\n          await safeCallback(latestEvents);\n        } catch (error) {\n          if (safeOnError) {\n            safeOnError(error, latestEvents);\n          } else {\n            console.warn(`Replay error for combineLatestAsync:`, error);\n          }\n        }\n      }\n    }\n\n    // Subscribe to each key\n    const subscriptions = keys.map((key) =>\n      this.on({\n        key,\n        callback: async () => {\n          // Check if all keys have events\n          const registry = this.eventRegistry();\n          const events = keys.map((k) => registry.get(k) as HubEvent<T>).filter(Boolean);\n          if (events.length === keys.length) {\n            try {\n              await safeCallback(events);\n            } catch (error) {\n              if (safeOnError) {\n                safeOnError(error, events);\n              } else {\n                console.warn(`Callback error for combineLatestAsync:`, error);\n              }\n            }\n          }\n        },\n        // Adapt onError for single event\n        onError: safeOnError ? (error, event) => safeOnError(error, [event]) : undefined,\n      })\n    );\n\n    // Handle unsubscribe\n    let manualUnsubscribe = true;\n    if (destroyRef) {\n      manualUnsubscribe = false;\n      destroyRef.onDestroy(() => subscriptions.forEach((sub) => sub.unsubscribe()));\n    }\n\n    return {\n      unsubscribe: () => {\n        if (manualUnsubscribe) {\n          subscriptions.forEach((sub) => sub.unsubscribe());\n        }\n      },\n    };\n  }\n\n  /**\n   * Returns a Signal for observing the latest event for a specific key, or null if none exists.\n   *\n   * @param key - The event key to observe (e.g., 'user:login').\n   * @returns A Signal emitting the latest HubEvent or null.\n   * @throws Error if key is empty.\n   *\n   * @example\n   * ```typescript\n   * const userLogin = signalHub.toSignal('user:login');\n   * effect(() => console.log(userLogin()?.data));\n   * ```\n   */\n  toSignal<T>(key: string): Signal<HubEvent<T> | null> {\n    if (!key) throw new Error('Key cannot be empty');\n    return computed(() => this.eventRegistry().get(key) as HubEvent<T> | null);\n  }\n\n  /**\n   * Returns a Signal for observing the latest events for multiple keys or wildcard patterns,\n   * returning an array of matching events.\n   *\n   * @param keys - Array of event keys or wildcard patterns to observe (e.g., `['user:login', 'user:*']`).\n   * @param options - Optional configuration for sorting the returned events.\n   * @param options.sortBy - Sorts the events by `'timestamp'` (descending, latest first) or `'key'` (alphabetically).\n   * @returns A Signal emitting an array of matching HubEvents, deduplicated by key.\n   * @throws Error if the keys array is empty or contains invalid (empty) keys.\n   *\n   * @example\n   * ```typescript\n   * // Observe specific and wildcard keys\n   * const events = signalHub.toSignalMultiple(['user:login', 'user:*'], { sortBy: 'timestamp' });\n   * effect(() => console.log(events().map(e => `${e.key}: ${e.data}`)));\n   *\n   * // Publish events\n   * signalHub.publish('user:login', { id: 123 });\n   * signalHub.publish('user:logout', { id: 456 });\n   *\n   * // Output might be: [\"user:logout: {id: 456}\", \"user:login: {id: 123}\"] (sorted by timestamp)\n   * ```\n   */\n  toSignalMultiple<T>(\n    keys: string[],\n    options: { sortBy?: 'timestamp' | 'key' } = {}\n  ): Signal<HubEvent<T>[]> {\n    if (!keys.length) throw new Error('Keys array cannot be empty');\n    if (keys.some((key) => !key)) throw new Error('All keys must be non-empty');\n\n    return computed(() => {\n      const registry = this.eventRegistry();\n      const matchingEvents: HubEvent<T>[] = [];\n\n      // Track unique event keys to avoid duplicates\n      const seenKeys = new Set<string>();\n\n      for (const key of keys) {\n        if (!key.includes('*')) {\n          // Exact key match\n          const event = registry.get(key) as HubEvent<T> | undefined;\n          if (event && !seenKeys.has(event.key)) {\n            matchingEvents.push(event);\n            seenKeys.add(event.key);\n          }\n        } else {\n          // Wildcard match\n          for (const [eventKey, event] of registry) {\n            if (this.matchQuery(eventKey, key) && !seenKeys.has(eventKey)) {\n              matchingEvents.push(event as HubEvent<T>);\n              seenKeys.add(eventKey);\n            }\n          }\n        }\n      }\n\n      if (options.sortBy === 'timestamp') {\n        return matchingEvents.sort((a, b) => b.timestamp - a.timestamp);\n      } else if (options.sortBy === 'key') {\n        return matchingEvents.sort((a, b) => a.key.localeCompare(b.key));\n      }\n      return matchingEvents;\n    });\n  }\n\n  /**\n   * Clears a specific event from the registry by its key.\n   *\n   * @param key - The event key to clear.\n   * @throws Error if key is empty.\n   *\n   * @example\n   * ```typescript\n   * signalHub.clearEvent('user:login');\n   * // Removes 'user:login' from the registry, affecting replayLatest and signals\n   * ```\n   */\n  clearEvent(key: string): void {\n    if (!key) throw new Error('Key cannot be empty');\n    this.eventRegistry.update((registry) => {\n      const updated = new Map(registry);\n      updated.delete(key);\n      return updated;\n    });\n  }\n\n  /**\n   * Resets the event registry, optionally clearing all subscribers.\n   *\n   * @param options - Optional settings for the reset operation.\n   * @param options.clearSubscribers - If true, also clears all subscribers (default: false).\n   *\n   * @example\n   * ```typescript\n   * signalHub.reset(); // Clears event registry only\n   * signalHub.reset({ clearSubscribers: true }); // Clears registry and subscribers\n   * ```\n   */\n  reset(options: { clearSubscribers?: boolean } = {}): void {\n    this.eventRegistry.set(new Map());\n    if (options.clearSubscribers) {\n      this.subscribers.clear();\n    }\n  }\n\n  /**\n   * Unsubscribes all callbacks for a specific key or all subscribers if no key is provided.\n   *\n   * @param key - Optional key to unsubscribe all callbacks for. If omitted, all subscribers are removed.\n   *\n   * @example\n   * ```typescript\n   * signalHub.unsubscribeAll('user:login'); // Remove all 'user:login' subscribers\n   * signalHub.unsubscribeAll(); // Remove all subscribers\n   * ```\n   */\n  unsubscribeAll(key?: string): void {\n    if (key) {\n      this.subscribers.delete(key);\n    } else {\n      this.subscribers.clear();\n    }\n  }\n\n  private internalSubscribe<T>(\n    query: string,\n    callback: (event: HubEvent<T>) => void | Promise<void>,\n    destroyRef?: DestroyRef,\n    onError?: (error: unknown, event: HubEvent<T>) => void\n  ): HubSubscription {\n    const safeCallback = callback as (event: HubEvent<unknown>) => void | Promise<void>;\n    const safeOnError = onError as ((error: unknown, event: HubEvent<unknown>) => void) | undefined;\n    const callbacks = this.subscribers.get(query) ?? [];\n    callbacks.push({ callback: safeCallback, onError: safeOnError });\n    this.subscribers.set(query, callbacks);\n\n    let manualUnsubscribe = true;\n    if (destroyRef) {\n      manualUnsubscribe = false;\n      destroyRef.onDestroy(() => this.unsubscribe(query, safeCallback));\n    }\n\n    return {\n      unsubscribe: () => {\n        if (manualUnsubscribe) {\n          this.unsubscribe(query, safeCallback);\n        }\n      },\n    };\n  }\n\n  private async notifySubscribers(event: HubEvent): Promise<void> {\n    const subscriberPromises: Promise<void>[] = [];\n\n    this.subscribers.forEach((subscribers, query) => {\n      if (this.matchQuery(event.key, query)) {\n        subscribers.forEach(({ callback, onError }) => {\n          const promise = Promise.resolve()\n            .then(() => callback(event))\n            .catch((error) => {\n              if (onError) {\n                onError(error, event);\n              } else {\n                console.warn(`Subscriber error for query \"${query}\":`, error);\n              }\n            });\n          subscriberPromises.push(promise);\n        });\n      }\n    });\n\n    await Promise.all(subscriberPromises);\n  }\n\n  private unsubscribe<T>(\n    query: string,\n    callback: (event: HubEvent<T>) => void | Promise<void>\n  ): void {\n    const callbacks = this.subscribers.get(query);\n    if (!callbacks) return;\n\n    const updatedCallbacks = callbacks.filter(\n      (sub) => sub.callback !== (callback as (event: HubEvent<unknown>) => void | Promise<void>)\n    );\n    if (updatedCallbacks.length) {\n      this.subscribers.set(query, updatedCallbacks);\n    } else {\n      this.subscribers.delete(query);\n    }\n  }\n\n  private matchQuery(key: string, query: string): boolean {\n    if (key === query) return true;\n\n    if (query === '*') return true;\n\n    if (key.includes(':') && query.includes(':')) {\n      const [keyPart1] = key.split(':');\n      const [queryPart1, queryPart2] = query.split(':');\n\n      if (keyPart1 === queryPart1 && queryPart2 === '*') return true;\n    }\n\n    return false;\n  }\n}\n","/*\n * Public API Surface of ngx-signal-hub\n */\n\nexport * from './lib/signal-hub.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}