@@ -16,28 +16,45 @@ export class BrowserEventEmitter<
1616> implements EventEmitter < EventTypes >
1717{
1818 #target = new EventTarget ( ) ;
19+ #listenerWrappers = new Map <
20+ string ,
21+ Map < ( ...args : unknown [ ] ) => void , EventListener >
22+ > ( ) ;
1923
2024 on < K extends keyof EventTypes > (
2125 type : K ,
2226 listener : ( ...args : EventTypes [ K ] ) => void ,
2327 ) {
24- this . #target. addEventListener (
25- type as string ,
26- ( ( event : CustomEvent ) =>
27- listener ( ...( event . detail ?? [ ] ) ) ) as EventListener ,
28- ) ;
28+ const eventType = type as string ;
29+ let listenersForType = this . #listenerWrappers. get ( eventType ) ;
30+ if ( ! listenersForType ) {
31+ listenersForType = new Map ( ) ;
32+ this . #listenerWrappers. set ( eventType , listenersForType ) ;
33+ }
34+ let wrapper = listenersForType . get ( listener ) ;
35+ if ( ! wrapper ) {
36+ wrapper = ( ( event : CustomEvent ) =>
37+ listener ( ...( event . detail ?? [ ] ) ) ) as EventListener ;
38+ listenersForType . set ( listener , wrapper ) ;
39+ }
40+ this . #target. addEventListener ( eventType , wrapper ) ;
2941 return this ;
3042 }
3143
3244 off < K extends keyof EventTypes > (
3345 type : K ,
3446 listener : ( ...args : EventTypes [ K ] ) => void ,
3547 ) {
36- this . #target. removeEventListener (
37- type as string ,
38- ( ( event : CustomEvent ) =>
39- listener ( ...( event . detail ?? [ ] ) ) ) as EventListener ,
40- ) ;
48+ const eventType = type as string ;
49+ const listenersForType = this . #listenerWrappers. get ( eventType ) ;
50+ const wrapper = listenersForType ?. get ( listener ) ;
51+ if ( wrapper ) {
52+ this . #target. removeEventListener ( eventType , wrapper ) ;
53+ listenersForType ?. delete ( listener ) ;
54+ if ( listenersForType ?. size === 0 ) {
55+ this . #listenerWrappers. delete ( eventType ) ;
56+ }
57+ }
4158 return this ;
4259 }
4360
0 commit comments