export class MessageBus { constructor() { this.bus = new EventTarget() this.counter = 0 this.fnmap = new Map() } subscribe(eventName, fn) { this.counter++ this.bus.addEventListener(eventName, fn) this.fnmap.set(this.counter, { eventName, fn }) return this.counter } unsubscribe(mappedID) { const mapped = this.fnmap.get(mappedID) if (mapped === undefined) { console.warn('unsubscribe, no such mapped ID', mappedID) return } this.fnmap.delete(mappedID) this.bus.removeEventListener(mapped.eventName, mapped.fn) } dispatch(eventName, data) { console.debug('mbus', eventName, data) this.bus.dispatchEvent(new CustomEvent(eventName, { detail: data })) } }