Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/commons/EventSubscriber.ts
1028 views
1
import IRegisteredEventListener, {
2
IEventSubscriber,
3
} from '@secret-agent/interfaces/IRegisteredEventListener';
4
5
export default class EventSubscriber implements IEventSubscriber {
6
private readonly registeredEventListeners: IRegisteredEventListener[] = [];
7
8
on<K extends string | symbol, Func extends (...args: any[]) => void>(
9
emitter: {
10
on(event: K, listener: Func, includeUnhandledEvents?: boolean);
11
off(event: K, listener: Func);
12
},
13
eventName: K,
14
handler: Func,
15
includeUnhandledEvents?: boolean,
16
): IRegisteredEventListener {
17
emitter.on(eventName, handler, includeUnhandledEvents);
18
const registeredEvent: IRegisteredEventListener = { emitter, eventName, handler };
19
this.registeredEventListeners.push(registeredEvent);
20
return registeredEvent;
21
}
22
23
once<Event extends string | symbol, Func extends (...args: any[]) => void>(
24
emitter: {
25
once(event: Event, listener: Func, includeUnhandledEvents?: boolean);
26
off(event: Event, listener: Func);
27
},
28
eventName: Event,
29
handler: Func,
30
includeUnhandledEvents?: boolean,
31
): IRegisteredEventListener {
32
emitter.once(eventName, handler, includeUnhandledEvents);
33
const registeredEvent: IRegisteredEventListener = { emitter, eventName, handler };
34
this.registeredEventListeners.push(registeredEvent);
35
return registeredEvent;
36
}
37
38
off(...listeners: IRegisteredEventListener[]): void {
39
for (const listener of listeners) {
40
listener.emitter.off(listener.eventName, listener.handler);
41
}
42
listeners.length = 0;
43
}
44
45
close(...keepMockEvents: (string | symbol)[]): void {
46
for (const listener of this.registeredEventListeners) {
47
if (keepMockEvents.includes(listener.eventName)) {
48
// add a mock event handler (like for capturing events)
49
(listener.emitter as any).on(listener.eventName, () => null);
50
}
51
listener.emitter.off(listener.eventName, listener.handler);
52
}
53
this.registeredEventListeners.length = 0;
54
}
55
}
56
57