Spaces:
Running
Running
File size: 1,024 Bytes
98c9143 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | export type EventBusHandler<Event> = (event: Event) => void
export class EventBus<Events extends object> {
private readonly handlers = new Map<
keyof Events,
Set<EventBusHandler<Events[keyof Events]>>
>()
publish<Name extends keyof Events>(name: Name, event: Events[Name]): void {
const handlers = this.handlers.get(name)
if (!handlers) {
return
}
for (const handler of Array.from(handlers)) {
handler(event)
}
}
subscribe<Name extends keyof Events>(
name: Name,
handler: EventBusHandler<Events[Name]>,
): () => void {
let handlers = this.handlers.get(name)
if (!handlers) {
handlers = new Set<EventBusHandler<Events[keyof Events]>>()
this.handlers.set(name, handlers)
}
const registeredHandler = handler as EventBusHandler<Events[keyof Events]>
handlers.add(registeredHandler)
return () => {
handlers.delete(registeredHandler)
if (handlers.size === 0) {
this.handlers.delete(name)
}
}
}
}
|