@@ -89,31 +89,36 @@ class Emitter {
89
89
}
90
90
const on = event . on . slice ( ) ;
91
91
const promises = on . map ( async ( fn ) => fn ( value ) ) ;
92
- if ( event . once . length > 0 ) {
93
- const on = new Array ( event . on . length ) ;
92
+ if ( event . once . size > 0 ) {
93
+ const len = event . on . length ;
94
+ const on = new Array ( len ) ;
94
95
let index = 0 ;
95
- for ( let i = 0 , len = event . on . length ; i < len ; i ++ ) {
96
+ for ( let i = 0 ; i < len ; i ++ ) {
96
97
const listener = event . on [ i ] ;
97
- if ( ! event . once . includes ( listener ) ) on [ index ++ ] = listener ;
98
+ if ( ! event . once . has ( listener ) ) on [ index ++ ] = listener ;
99
+ }
100
+ if ( index === 0 ) {
101
+ this . #events. delete ( eventName ) ;
102
+ return Promise . resolve ( ) ;
98
103
}
99
104
on . length = index ;
100
- if ( index > 0 ) this . #events. set ( eventName , { on, once : [ ] } ) ;
101
- else this . #events. delete ( eventName ) ;
105
+ this . #events. set ( eventName , { on, once : new Set ( ) } ) ;
102
106
}
103
107
return Promise . all ( promises ) . then ( ( ) => undefined ) ;
104
108
}
105
109
106
110
#addListener( eventName , listener , once ) {
107
111
let event = this . #events. get ( eventName ) ;
108
112
if ( ! event ) {
109
- event = { on : [ listener ] , once : once ? [ listener ] : [ ] } ;
113
+ const on = [ listener ] ;
114
+ event = { on, once : once ? new Set ( on ) : new Set ( ) } ;
110
115
this . #events. set ( eventName , event ) ;
111
116
} else {
112
117
if ( event . on . includes ( listener ) ) {
113
118
throw new Error ( 'Duplicate listeners detected' ) ;
114
119
}
115
120
event . on . push ( listener ) ;
116
- if ( once ) event . once . push ( listener ) ;
121
+ if ( once ) event . once . add ( listener ) ;
117
122
}
118
123
if ( event . on . length > this . #maxListeners) {
119
124
throw new Error (
@@ -135,10 +140,9 @@ class Emitter {
135
140
if ( ! listener ) return void this . #events. delete ( eventName ) ;
136
141
const event = this . #events. get ( eventName ) ;
137
142
if ( ! event ) return ;
138
- const onIndex = event . on . indexOf ( listener ) ;
139
- if ( onIndex > - 1 ) event . on . splice ( onIndex , 1 ) ;
140
- const onceIndex = event . once . indexOf ( listener ) ;
141
- if ( onceIndex > - 1 ) event . once . splice ( onceIndex , 1 ) ;
143
+ const index = event . on . indexOf ( listener ) ;
144
+ if ( index > - 1 ) event . on . splice ( index , 1 ) ;
145
+ event . once . delete ( listener ) ;
142
146
}
143
147
144
148
toPromise ( eventName ) {
@@ -157,31 +161,15 @@ class Emitter {
157
161
}
158
162
159
163
listeners ( eventName ) {
160
- if ( eventName ) {
161
- const event = this . #events. get ( eventName ) ;
162
- return event ? event . on : [ ] ;
163
- }
164
- const listeners = new Set ( ) ;
165
- for ( const event of this . #events. values ( ) ) {
166
- for ( let i = 0 , len = event . on . length ; i < len ; i ++ ) {
167
- listeners . add ( event . on [ i ] ) ;
168
- }
169
- }
170
- return Array . from ( listeners ) ;
164
+ if ( ! eventName ) throw new Error ( 'Expected eventName' ) ;
165
+ const event = this . #events. get ( eventName ) ;
166
+ return event ? event . on : [ ] ;
171
167
}
172
168
173
169
listenerCount ( eventName ) {
174
- if ( eventName ) {
175
- const event = this . #events. get ( eventName ) ;
176
- return event ? event . on . length : 0 ;
177
- }
178
- const listeners = new Set ( ) ;
179
- for ( const event of this . #events. values ( ) ) {
180
- for ( let i = 0 , len = event . on . length ; i < len ; i ++ ) {
181
- listeners . add ( event . on [ i ] ) ;
182
- }
183
- }
184
- return listeners . size ;
170
+ if ( ! eventName ) throw new Error ( 'Expected eventName' ) ;
171
+ const event = this . #events. get ( eventName ) ;
172
+ return event ? event . on . length : 0 ;
185
173
}
186
174
187
175
eventNames ( ) {
0 commit comments