Newer
Older
rpg / packages / engine / src / core / EventBus.ts
/**
 * Простая шина событий с типизированными темами.
 * Подписка: on('enemy:killed', handler); шина ничего не знает о жанре.
 */
export class EventBus {
    private listeners = new Map<string, Set<(payload: unknown) => void>>();

    on<T>(topic: string, handler: (payload: T) => void): () => void {
        let set = this.listeners.get(topic);
        if (!set) {
            set = new Set();
            this.listeners.set(topic, set);
        }
        const wrapped = handler as (payload: unknown) => void;
        set.add(wrapped);
        return () => set!.delete(wrapped);
    }

    emit<T>(topic: string, payload?: T): void {
        const set = this.listeners.get(topic);
        if (!set) return;
        for (const handler of [...set]) {
            handler(payload);
        }
    }

    clear(): void {
        this.listeners.clear();
    }
}