@imtbl/auth 2.11.1-alpha.0 → 2.11.1-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,26 +1,51 @@
1
- import { EventEmitter } from 'events';
1
+ type StringEventKey<T> = Extract<keyof T, string>;
2
+
3
+ type AnyListener = (...args: any[]) => void;
4
+ type EventArgs<TEvents, TEventName extends keyof TEvents> =
5
+ TEvents[TEventName] extends readonly [...infer A]
6
+ ? [...A]
7
+ : TEvents[TEventName] extends readonly any[]
8
+ ? [...TEvents[TEventName]]
9
+ : [TEvents[TEventName]];
2
10
 
3
11
  export default class TypedEventEmitter<TEvents extends Record<string, any>> {
4
- private emitter = new EventEmitter();
12
+ private listeners = new Map<StringEventKey<TEvents>, Set<AnyListener>>();
5
13
 
6
- emit<TEventName extends keyof TEvents & string>(
14
+ emit<TEventName extends StringEventKey<TEvents>>(
7
15
  eventName: TEventName,
8
- ...eventArg: TEvents[TEventName]
16
+ ...eventArg: EventArgs<TEvents, TEventName>
9
17
  ) {
10
- this.emitter.emit(eventName, ...(eventArg as []));
18
+ const handlers = this.listeners.get(eventName);
19
+ if (!handlers || handlers.size === 0) {
20
+ return;
21
+ }
22
+
23
+ // Copy handlers to avoid issues if listeners mutate during emit
24
+ [...handlers].forEach((handler) => {
25
+ handler(...eventArg);
26
+ });
11
27
  }
12
28
 
13
- on<TEventName extends keyof TEvents & string>(
29
+ on<TEventName extends StringEventKey<TEvents>>(
14
30
  eventName: TEventName,
15
- handler: (...eventArg: TEvents[TEventName]) => void,
31
+ handler: (...eventArg: EventArgs<TEvents, TEventName>) => void,
16
32
  ) {
17
- this.emitter.on(eventName, handler as any);
33
+ const handlers = this.listeners.get(eventName) ?? new Set<AnyListener>();
34
+ handlers.add(handler as AnyListener);
35
+ this.listeners.set(eventName, handlers);
18
36
  }
19
37
 
20
- removeListener<TEventName extends keyof TEvents & string>(
38
+ removeListener<TEventName extends StringEventKey<TEvents>>(
21
39
  eventName: TEventName,
22
- handler: (...eventArg: TEvents[TEventName]) => void,
40
+ handler: (...eventArg: EventArgs<TEvents, TEventName>) => void,
23
41
  ) {
24
- this.emitter.removeListener(eventName, handler as any);
42
+ const handlers = this.listeners.get(eventName);
43
+ if (!handlers) {
44
+ return;
45
+ }
46
+ handlers.delete(handler as AnyListener);
47
+ if (handlers.size === 0) {
48
+ this.listeners.delete(eventName);
49
+ }
25
50
  }
26
51
  }