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)
      }
    }
  }
}