1- import EventEmitter from "node:events" ;
2-
31type EventMap = Record < string , unknown > ;
42
53type EventKey < T extends EventMap > = string & keyof T ;
@@ -12,20 +10,39 @@ export interface Emitter<T extends EventMap> {
1210}
1311
1412export class TypedEmitter < T extends EventMap > implements Emitter < T > {
15- private emitter = new EventEmitter ( ) ;
13+ private listeners = new Map < string , Set < EventReceiver < unknown > > > ( ) ;
14+
1615 on < K extends EventKey < T > > ( eventName : K , fn : EventReceiver < T [ K ] > ) {
17- this . emitter . on ( eventName , fn ) ;
16+ const listeners =
17+ this . listeners . get ( eventName ) ?? new Set < EventReceiver < unknown > > ( ) ;
18+ listeners . add ( fn as EventReceiver < unknown > ) ;
19+ this . listeners . set ( eventName , listeners ) ;
1820 }
1921
2022 off < K extends EventKey < T > > ( eventName : K , fn : EventReceiver < T [ K ] > ) {
21- this . emitter . off ( eventName , fn ) ;
23+ const listeners = this . listeners . get ( eventName ) ;
24+ if ( ! listeners ) {
25+ return ;
26+ }
27+
28+ listeners . delete ( fn as EventReceiver < unknown > ) ;
29+ if ( listeners . size === 0 ) {
30+ this . listeners . delete ( eventName ) ;
31+ }
2232 }
2333
2434 emit < K extends EventKey < T > > ( eventName : K , params : T [ K ] ) {
25- this . emitter . emit ( eventName , params ) ;
35+ const listeners = this . listeners . get ( eventName ) ;
36+ if ( ! listeners ) {
37+ return ;
38+ }
39+
40+ for ( const listener of listeners ) {
41+ listener ( params ) ;
42+ }
2643 }
2744
2845 removeAllListeners ( ) {
29- this . emitter . removeAllListeners ( ) ;
46+ this . listeners . clear ( ) ;
3047 }
3148}
0 commit comments