@@ -110,7 +110,7 @@ class BroadcastImpl {
110110 #buffer = new RingBuffer ( ) ;
111111 #bufferStart = 0 ;
112112 #consumers = new SafeSet ( ) ;
113- #waiters = [ ] ; // Consumers with pending resolve (subset of #consumers)
113+ #waiters = new SafeSet ( ) ; // Consumers with pending resolve
114114 #ended = false ;
115115 #error;
116116 #errored = false ;
@@ -203,6 +203,7 @@ class BroadcastImpl {
203203
204204 function detach ( ) {
205205 state . detached = true ;
206+ self . #waiters. delete ( state ) ;
206207 if ( state . resolve ) {
207208 state . resolve ( { __proto__ : null , done : true , value : undefined } ) ;
208209 }
@@ -262,7 +263,7 @@ class BroadcastImpl {
262263 const { promise, resolve, reject } = PromiseWithResolvers ( ) ;
263264 state . resolve = resolve ;
264265 state . reject = reject ;
265- ArrayPrototypePush ( self . #waiters, state ) ;
266+ self . #waiters. add ( state ) ;
266267 return promise ;
267268 } ,
268269
@@ -313,6 +314,7 @@ class BroadcastImpl {
313314 consumer . detached = true ;
314315 }
315316 this . #consumers. clear ( ) ;
317+ this . #waiters. clear ( ) ;
316318 this . #cachedMinCursorConsumers = 0 ;
317319 const onCancel = this [ kOnCancel ] ;
318320 this [ kOnCancel ] = null ;
@@ -401,6 +403,7 @@ class BroadcastImpl {
401403 }
402404 }
403405 }
406+ this . #waiters. clear ( ) ;
404407 this . #notifyEndDrained( ) ;
405408 }
406409
@@ -422,6 +425,7 @@ class BroadcastImpl {
422425 consumer . detached = true ;
423426 }
424427 this . #consumers. clear ( ) ;
428+ this . #waiters. clear ( ) ;
425429 this . #cachedMinCursorConsumers = 0 ;
426430 }
427431
@@ -489,12 +493,11 @@ class BroadcastImpl {
489493
490494 #notifyConsumers( ) {
491495 const waiters = this . #waiters;
492- if ( waiters . length === 0 ) return ;
496+ if ( waiters . size === 0 ) return ;
493497 // Swap out the waiters list so consumers that re-wait during
494498 // resolve don't get processed twice in this cycle.
495- this . #waiters = [ ] ;
496- for ( let i = 0 ; i < waiters . length ; i ++ ) {
497- const consumer = waiters [ i ] ;
499+ this . #waiters = new SafeSet ( ) ;
500+ for ( const consumer of waiters ) {
498501 if ( consumer . resolve ) {
499502 const bufferIndex = consumer . cursor - this . #bufferStart;
500503 if ( bufferIndex < this . #buffer. length ) {
@@ -513,11 +516,11 @@ class BroadcastImpl {
513516 if ( consumer . detached && this . #deleteConsumer( consumer ) ) {
514517 this . #tryTrimBuffer( ) ;
515518 } else if ( this . #promotePending( consumer ) ) {
516- ArrayPrototypePush ( this . #waiters, consumer ) ;
519+ this . #waiters. add ( consumer ) ;
517520 }
518521 } else {
519522 // Still waiting -- put back
520- ArrayPrototypePush ( this . #waiters, consumer ) ;
523+ this . #waiters. add ( consumer ) ;
521524 }
522525 }
523526 }
0 commit comments