/** * Event Emitter for SwMock */ export class EventEmitter { private events: Map = new Map(); /** * Add event listener */ on(event: string, callback: Function): void { if (!this.events.has(event)) { this.events.set(event, []); } this.events.get(event)!.push(callback); } /** * Remove event listener */ off(event: string, callback: Function): void { const callbacks = this.events.get(event); if (callbacks) { const index = callbacks.indexOf(callback); if (index > -1) { callbacks.splice(index, 1); } } } /** * Add one-time event listener */ once(event: string, callback: Function): void { const onceCallback = (...args: any[]) => { callback(...args); this.off(event, onceCallback); }; this.on(event, onceCallback); } /** * Emit event */ emit(event: string, ...args: any[]): void { const callbacks = this.events.get(event); if (callbacks) { callbacks.forEach(callback => { try { callback(...args); } catch (error) { console.error(`[SwMock] Error in event handler for '${event}':`, error); } }); } } /** * Remove all listeners for an event */ removeAllListeners(event?: string): void { if (event) { this.events.delete(event); } else { this.events.clear(); } } /** * Get all event names */ eventNames(): string[] { return Array.from(this.events.keys()); } /** * Get listener count for an event */ listenerCount(event: string): number { const callbacks = this.events.get(event); return callbacks ? callbacks.length : 0; } }