copilot-api / src /lib /event-bus.ts
imspsycho's picture
Initial upload from Google Colab
98c9143 verified
Raw
History Blame Contribute Delete
1.02 kB
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)
}
}
}
}