import type { EventBusCallback } from './app-types'; import { Logger } from './logger'; export class EventBus { private static eventRegister: Map> = new Map< string, Array >(); static on(eventName: string, callback: EventBusCallback): void { Logger.logDbg(`Registering Listener for event: ${eventName}`); if (!this.eventRegister.has(eventName)) { this.eventRegister.set(eventName, [callback]); } else { this.eventRegister.get(eventName).push(callback); } } /** * Remove a specific callback for an event * @param eventName Event name to remove callback from * @param callback The callback function to remove */ static off(eventName: string, callback: EventBusCallback): void { if (this.eventRegister.has(eventName)) { const callbacks = this.eventRegister.get(eventName); const index = callbacks.indexOf(callback); if (index > -1) { callbacks.splice(index, 1); Logger.logDbg(`Removed listener for event: ${eventName}`); } // Clean up empty arrays if (callbacks.length === 0) { this.eventRegister.delete(eventName); } } } /** * Remove all callbacks for a specific event * @param eventName Event name to clear all listeners for */ static clearEvent(eventName: string): void { if (this.eventRegister.has(eventName)) { this.eventRegister.delete(eventName); Logger.logDbg(`Cleared all listeners for event: ${eventName}`); } } /** * Remove all event listeners (used during SDK shutdown) */ static clearAll(): void { this.eventRegister.clear(); Logger.logDbg('Cleared all event listeners'); } static triggerEvent(eventName: string, payload: any): void { if (this.eventRegister.has(eventName)) { for (const cb of this.eventRegister.get(eventName)) { try { Logger.logDbg( `Sending event ${eventName} to all listeners. Count = ${ this.eventRegister.get(eventName).length }` ); cb(eventName, payload); } catch (err) { Logger.logError('Unable to process callback for event: ' + eventName); } } } } }