export class EventBus { constructor() { this.events = new Map(); } emit(id, data = {}) { let ev = this.events.get(id); if (!ev) { let ev = new EventItem(id); this.events.set(id, ev); return; } ev.subscribers.forEach((subscriber) => { subscriber(data); }); } subscribe(id, subscriber) { let ev = this.events.get(id); if (!ev) { ev = new EventItem(id); this.events.set(id, ev); } ev.subscribers.push(subscriber); } unsubscribe(id, subscriber) { if (this.events.has(id)) { let ev = this.events.get(id); ev.subscribers = ev.subscribers.filter((fn) => fn !== subscriber); if (ev.subscribers.length < 1) { this.events.delete(id); } } } unsubscribeAll(id) { if (this.events.has(id)) { this.events.delete(id); } } } export class EventItem { constructor(id) { this.id = id; this.subscribers = []; } }