@@ -241,19 +241,28 @@ class Result implements Promise<QueryResult> {
241
241
summary ?: ResultSummary ,
242
242
} = { paused : true , firstRun : true , finished : false }
243
243
244
-
245
- const controlFlow = async ( ) => {
246
- if ( state . queuedObserver === undefined ) {
247
- state . queuedObserver = this . _createQueuedResultObserver ( )
248
- state . streaming = await this . _subscribe ( state . queuedObserver , true ) . catch ( ( ) => undefined )
244
+ const controlFlow = ( ) => {
245
+ if ( ! state . streaming ) {
246
+ return ;
249
247
}
250
- if ( state . queuedObserver . size >= this . _watermarks . high && ! state . paused ) {
248
+ const queueSizeIsOverHighOrEqualWatermark = state . queuedObserver ! . size >= this . _watermarks . high
249
+ const queueSizeIsBellowOrEqualLowWatermark = state . queuedObserver ! . size <= this . _watermarks . low
250
+
251
+ if ( queueSizeIsOverHighOrEqualWatermark && ! state . paused ) {
251
252
state . paused = true
252
- state . streaming ? .pause ( )
253
- } else if ( state . queuedObserver . size <= this . _watermarks . low && state . paused || state . firstRun ) {
253
+ state . streaming . pause ( )
254
+ } else if ( queueSizeIsBellowOrEqualLowWatermark && state . paused || state . firstRun && ! queueSizeIsOverHighOrEqualWatermark ) {
254
255
state . firstRun = false
255
256
state . paused = false
256
- state . streaming ?. resume ( )
257
+ state . streaming . resume ( )
258
+ }
259
+ }
260
+
261
+ const initializeObserver = async ( ) => {
262
+ if ( state . queuedObserver === undefined ) {
263
+ state . queuedObserver = this . _createQueuedResultObserver ( controlFlow )
264
+ state . streaming = await this . _subscribe ( state . queuedObserver , true ) . catch ( ( ) => undefined )
265
+ controlFlow ( )
257
266
}
258
267
}
259
268
@@ -262,7 +271,7 @@ class Result implements Promise<QueryResult> {
262
271
if ( state . finished ) {
263
272
return { done : true , value : state . summary ! }
264
273
}
265
- await controlFlow ( )
274
+ await initializeObserver ( )
266
275
const next = await state . queuedObserver ! . dequeue ( )
267
276
if ( next . done ) {
268
277
state . finished = next . done
@@ -280,7 +289,7 @@ class Result implements Promise<QueryResult> {
280
289
if ( state . finished ) {
281
290
return { done : true , value : state . summary ! }
282
291
}
283
- await controlFlow ( )
292
+ await initializeObserver ( )
284
293
return await state . queuedObserver ! . head ( )
285
294
}
286
295
}
@@ -461,7 +470,7 @@ class Result implements Promise<QueryResult> {
461
470
/**
462
471
* @access private
463
472
*/
464
- private _createQueuedResultObserver ( ) : QueuedResultObserver {
473
+ private _createQueuedResultObserver ( onQueueSizeChanged : ( ) => void ) : QueuedResultObserver {
465
474
interface ResolvablePromise < T > {
466
475
promise : Promise < T >
467
476
resolve : ( arg : T ) => any | undefined
@@ -509,11 +518,13 @@ class Result implements Promise<QueryResult> {
509
518
}
510
519
} else {
511
520
buffer . push ( element )
521
+ onQueueSizeChanged ( )
512
522
}
513
523
} ,
514
524
dequeue : async ( ) => {
515
525
if ( buffer . length > 0 ) {
516
526
const element = buffer . shift ( ) !
527
+ onQueueSizeChanged ( )
517
528
if ( isError ( element ) ) {
518
529
throw element
519
530
}
@@ -538,6 +549,8 @@ class Result implements Promise<QueryResult> {
538
549
} catch ( error ) {
539
550
buffer . unshift ( error )
540
551
throw error
552
+ } finally {
553
+ onQueueSizeChanged ( )
541
554
}
542
555
} ,
543
556
get size ( ) : number {
0 commit comments