/** * Copyright (c) Double Symmetry GmbH * Commercial use requires a license. See https://rntp.dev/pricing */ type Listener = (payload: unknown) => void; export interface EventSubscription { remove(): void; } /** * Minimal typed event emitter for the web backend. `src/audio.ts` routes * `addEventListener` here on web instead of `NativeEventEmitter`, so events * work regardless of react-native-web's emitter internals. */ export class EventBus { private listeners = new Map>(); addListener(event: string, listener: Listener): EventSubscription { let set = this.listeners.get(event); if (!set) { set = new Set(); this.listeners.set(event, set); } set.add(listener); return { remove: () => { this.listeners.get(event)?.delete(listener); }, }; } emit(event: string, payload: unknown): void { this.listeners.get(event)?.forEach((listener) => { try { listener(payload); } catch (e) { console.error(`@rntp/player: error in '${event}' listener`, e); } }); } removeAllListeners(): void { this.listeners.clear(); } }