UNPKG

sveltekit-sync

Version:
74 lines (73 loc) 1.89 kB
/** * Simple event emitter for realtime events. * Used as a foundation for both client and server-side event handling. */ export class EventEmitter { listeners = new Map(); /** * Subscribe to an event * @returns Unsubscribe function */ on(event, handler) { if (!this.listeners.has(event)) { this.listeners.set(event, new Set()); } this.listeners.get(event).add(handler); return () => this.off(event, handler); } /** * Unsubscribe from an event */ off(event, handler) { const handlers = this.listeners.get(event); if (handlers) { handlers.delete(handler); if (handlers.size === 0) { this.listeners.delete(event); } } } /** * Emit an event to all subscribers */ emit(event, data) { const handlers = this.listeners.get(event); if (handlers) { handlers.forEach(handler => { try { handler(data); } catch (error) { console.error(`Error in event handler for "${event}":`, error); } }); } } /** * Subscribe to an event for one-time execution */ once(event, handler) { const wrappedHandler = (data) => { this.off(event, wrappedHandler); handler(data); }; return this.on(event, wrappedHandler); } /** * Remove all listeners for an event or all events */ removeAllListeners(event) { if (event) { this.listeners.delete(event); } else { this.listeners.clear(); } } /** * Get listener count for an event */ listenerCount(event) { return this.listeners.get(event)?.size ?? 0; } }