{"version":3,"file":"broker-registry.mjs","names":[],"sources":["../../../../../../../@warlock.js/herald/src/communicators/broker-registry.ts"],"sourcesContent":["import { EventEmitter } from \"node:events\";\r\nimport type { BrokerRegistryEvent, BrokerRegistryListener } from \"../types\";\r\nimport { Broker, type BrokerOptions } from \"./broker\";\r\n\r\n/**\r\n * Error thrown when a broker is not found\r\n */\r\nexport class MissingBrokerError extends Error {\r\n  public readonly brokerName?: string;\r\n\r\n  public constructor(message: string, brokerName?: string) {\r\n    super(message);\r\n    this.name = \"MissingBrokerError\";\r\n    this.brokerName = brokerName;\r\n  }\r\n}\r\n\r\n/**\r\n * Broker Registry\r\n *\r\n * Maintains registry of named brokers.\r\n * Similar to DataSourceRegistry in @warlock.js/cascade\r\n *\r\n * @example\r\n * ```typescript\r\n * // Register a broker\r\n * brokerRegistry.register({\r\n *   name: \"default\",\r\n *   driver: rabbitMQDriver,\r\n *   isDefault: true,\r\n * });\r\n *\r\n * // Get the default broker\r\n * const comm = brokerRegistry.get();\r\n *\r\n * // Get a specific broker by name\r\n * const analytics = brokerRegistry.get(\"analytics\");\r\n *\r\n * // Listen for events\r\n * brokerRegistry.on(\"connected\", (comm) => {\r\n *   console.log(`${comm.name} connected`);\r\n * });\r\n * ```\r\n */\r\nclass BrokerRegistry {\r\n  private readonly sources = new Map<string, Broker>();\r\n  private defaultSource?: Broker;\r\n  private readonly events = new EventEmitter();\r\n\r\n  /**\r\n   * Register a new broker\r\n   *\r\n   * Sets up event forwarding from the driver to the registry.\r\n   *\r\n   * @param options - Broker configuration\r\n   * @returns The registered broker instance\r\n   *\r\n   * @example\r\n   * ```typescript\r\n   * const broker = brokerRegistry.register({\r\n   *   name: \"primary\",\r\n   *   driver: myDriver,\r\n   *   isDefault: true,\r\n   * });\r\n   * ```\r\n   */\r\n  public register(options: BrokerOptions): Broker {\r\n    const broker = new Broker(options);\r\n    this.sources.set(broker.name, broker);\r\n\r\n    const isNewDefault = broker.isDefault || !this.defaultSource;\r\n\r\n    if (isNewDefault) {\r\n      this.defaultSource = broker;\r\n    }\r\n\r\n    // Emit registration events\r\n    this.events.emit(\"registered\", broker);\r\n\r\n    if (isNewDefault) {\r\n      this.events.emit(\"default-registered\", broker);\r\n    }\r\n\r\n    // Forward driver events to registry\r\n    broker.driver.on(\"connected\", () => {\r\n      this.events.emit(\"connected\", broker);\r\n    });\r\n\r\n    broker.driver.on(\"disconnected\", () => {\r\n      this.events.emit(\"disconnected\", broker);\r\n    });\r\n\r\n    return broker;\r\n  }\r\n\r\n  /**\r\n   * Clear all registered brokers\r\n   */\r\n  public clear(): void {\r\n    this.defaultSource = undefined;\r\n    this.sources.clear();\r\n  }\r\n\r\n  /**\r\n   * Listen for registry events\r\n   *\r\n   * @param event - Event to listen for\r\n   * @param listener - Callback function\r\n   *\r\n   * @example\r\n   * ```typescript\r\n   * brokerRegistry.on(\"registered\", (comm) => {\r\n   *   console.log(`Broker \"${comm.name}\" registered`);\r\n   * });\r\n   *\r\n   * brokerRegistry.on(\"connected\", (comm) => {\r\n   *   console.log(`Broker \"${comm.name}\" connected`);\r\n   * });\r\n   * ```\r\n   */\r\n  public on(event: BrokerRegistryEvent, listener: BrokerRegistryListener): void {\r\n    this.events.on(event, listener);\r\n  }\r\n\r\n  /**\r\n   * Listen for a registry event once\r\n   *\r\n   * @param event - Event to listen for\r\n   * @param listener - Callback function\r\n   */\r\n  public once(event: BrokerRegistryEvent, listener: BrokerRegistryListener): void {\r\n    this.events.once(event, listener);\r\n  }\r\n\r\n  /**\r\n   * Remove an event listener\r\n   *\r\n   * @param event - Event to stop listening for\r\n   * @param listener - Callback to remove\r\n   */\r\n  public off(event: BrokerRegistryEvent, listener: BrokerRegistryListener): void {\r\n    this.events.off(event, listener);\r\n  }\r\n\r\n  /**\r\n   * Get a broker by name or the default one\r\n   *\r\n   * @param name - Optional broker name\r\n   * @returns Broker instance\r\n   * @throws MissingBrokerError if not found\r\n   *\r\n   * @example\r\n   * ```typescript\r\n   * // Get default broker\r\n   * const comm = brokerRegistry.get();\r\n   *\r\n   * // Get specific broker\r\n   * const analytics = brokerRegistry.get(\"analytics\");\r\n   * ```\r\n   */\r\n  public get(name?: string): Broker {\r\n    if (name !== undefined) {\r\n      const source = this.sources.get(name);\r\n      if (!source) {\r\n        throw new MissingBrokerError(`Broker \"${name}\" is not registered.`, name);\r\n      }\r\n      return source;\r\n    }\r\n\r\n    if (!this.defaultSource) {\r\n      throw new MissingBrokerError(\"No default broker registered.\");\r\n    }\r\n\r\n    return this.defaultSource;\r\n  }\r\n\r\n  /**\r\n   * Check if a broker exists\r\n   *\r\n   * @param name - Broker name to check\r\n   * @returns True if exists\r\n   */\r\n  public has(name: string): boolean {\r\n    return this.sources.has(name);\r\n  }\r\n\r\n  /**\r\n   * Check if any brokers are registered\r\n   */\r\n  public hasAny(): boolean {\r\n    return this.sources.size > 0;\r\n  }\r\n\r\n  /**\r\n   * Get all registered brokers\r\n   *\r\n   * @returns Array of all brokers\r\n   *\r\n   * @example\r\n   * ```typescript\r\n   * // Disconnect all brokers\r\n   * for (const comm of brokerRegistry.getAll()) {\r\n   *   await comm.disconnect();\r\n   * }\r\n   * ```\r\n   */\r\n  public getAll(): Broker[] {\r\n    return Array.from(this.sources.values());\r\n  }\r\n\r\n  /**\r\n   * Get all broker names\r\n   *\r\n   * @returns Array of broker names\r\n   */\r\n  public getNames(): string[] {\r\n    return Array.from(this.sources.keys());\r\n  }\r\n\r\n  /**\r\n   * Get the default broker (if any)\r\n   *\r\n   * @returns Default broker or undefined\r\n   */\r\n  public getDefault(): Broker | undefined {\r\n    return this.defaultSource;\r\n  }\r\n}\r\n\r\n/**\r\n * Global broker registry instance\r\n */\r\nexport const brokerRegistry = new BrokerRegistry();\r\n"],"mappings":";;;;;;;AAOA,IAAa,qBAAb,cAAwC,MAAM;CAG5C,AAAO,YAAY,SAAiB,YAAqB;EACvD,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,aAAa;CACpB;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,IAAM,iBAAN,MAAqB;;iCACQ,IAAI,IAAoB;gBAEzB,IAAI,aAAa;;;;;;;;;;;;;;;;;;;CAmB3C,AAAO,SAAS,SAAgC;EAC9C,MAAM,SAAS,IAAI,OAAO,OAAO;EACjC,KAAK,QAAQ,IAAI,OAAO,MAAM,MAAM;EAEpC,MAAM,eAAe,OAAO,aAAa,CAAC,KAAK;EAE/C,IAAI,cACF,KAAK,gBAAgB;EAIvB,KAAK,OAAO,KAAK,cAAc,MAAM;EAErC,IAAI,cACF,KAAK,OAAO,KAAK,sBAAsB,MAAM;EAI/C,OAAO,OAAO,GAAG,mBAAmB;GAClC,KAAK,OAAO,KAAK,aAAa,MAAM;EACtC,CAAC;EAED,OAAO,OAAO,GAAG,sBAAsB;GACrC,KAAK,OAAO,KAAK,gBAAgB,MAAM;EACzC,CAAC;EAED,OAAO;CACT;;;;CAKA,AAAO,QAAc;EACnB,KAAK,gBAAgB;EACrB,KAAK,QAAQ,MAAM;CACrB;;;;;;;;;;;;;;;;;;CAmBA,AAAO,GAAG,OAA4B,UAAwC;EAC5E,KAAK,OAAO,GAAG,OAAO,QAAQ;CAChC;;;;;;;CAQA,AAAO,KAAK,OAA4B,UAAwC;EAC9E,KAAK,OAAO,KAAK,OAAO,QAAQ;CAClC;;;;;;;CAQA,AAAO,IAAI,OAA4B,UAAwC;EAC7E,KAAK,OAAO,IAAI,OAAO,QAAQ;CACjC;;;;;;;;;;;;;;;;;CAkBA,AAAO,IAAI,MAAuB;EAChC,IAAI,SAAS,QAAW;GACtB,MAAM,SAAS,KAAK,QAAQ,IAAI,IAAI;GACpC,IAAI,CAAC,QACH,MAAM,IAAI,mBAAmB,WAAW,KAAK,uBAAuB,IAAI;GAE1E,OAAO;EACT;EAEA,IAAI,CAAC,KAAK,eACR,MAAM,IAAI,mBAAmB,+BAA+B;EAG9D,OAAO,KAAK;CACd;;;;;;;CAQA,AAAO,IAAI,MAAuB;EAChC,OAAO,KAAK,QAAQ,IAAI,IAAI;CAC9B;;;;CAKA,AAAO,SAAkB;EACvB,OAAO,KAAK,QAAQ,OAAO;CAC7B;;;;;;;;;;;;;;CAeA,AAAO,SAAmB;EACxB,OAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;CACzC;;;;;;CAOA,AAAO,WAAqB;EAC1B,OAAO,MAAM,KAAK,KAAK,QAAQ,KAAK,CAAC;CACvC;;;;;;CAOA,AAAO,aAAiC;EACtC,OAAO,KAAK;CACd;AACF;;;;AAKA,MAAa,iBAAiB,IAAI,eAAe"}