-
Notifications
You must be signed in to change notification settings - Fork 181
/
listeners.ts
44 lines (34 loc) · 1.14 KB
/
listeners.ts
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
42
43
44
// PM = payload map
export type Handler<PM extends Record<string, [unknown, unknown]>, E extends keyof PM> =
(data: PM[E][0]) => PM[E][1] | Promise<PM[E][1]>
export default class Listeners<
PM extends Record<string, [unknown, unknown]> = Record<string, [void, unknown]>
> {
_all = new Map<keyof PM, Set<Handler<PM, keyof PM>>>();
trigger<E extends keyof PM>(
...[event, data]: PM[E][0] extends void ? [E] : [E, PM[E][0]]
): Promise<PM[E][1][]> {
const handlers = this._all.get(event);
if (handlers) {
return Promise.all([...handlers].map(fn => fn(data)));
}
return Promise.resolve([]);
}
add<E extends keyof PM>(event: E, handler: Handler<PM, E>) {
let handlers = this._all.get(event) as Set<Handler<PM, E>> | undefined;
if (!handlers) {
handlers = new Set();
this._all.set(event, handlers as Set<never>);
}
handlers.add(handler);
}
remove<E extends keyof PM>(event: E, handler: Handler<PM, E>) {
const handlers = this._all.get(event) as Set<Handler<PM, E>> | undefined;
if (handlers) {
handlers.delete(handler);
}
}
removeAll() {
this._all = new Map();
}
}