@@ -301,25 +301,11 @@ export class IncrementalPublisher {
301
301
initialResultRecord : InitialResultRecord ,
302
302
data : ObjMap < unknown > | null ,
303
303
) : ExecutionResult | ExperimentalIncrementalExecutionResults {
304
- for ( const child of initialResultRecord . children ) {
305
- if ( child . filtered ) {
306
- continue ;
307
- }
308
- this . _publish ( child ) ;
309
- }
304
+ const pendingSources = this . _publish ( initialResultRecord . children ) ;
310
305
311
306
const errors = initialResultRecord . errors ;
312
307
const initialResult = errors . length === 0 ? { data } : { errors, data } ;
313
- const pending = this . _pending ;
314
- if ( pending . size > 0 ) {
315
- const pendingSources = new Set < DeferredFragmentRecord | StreamRecord > ( ) ;
316
- for ( const subsequentResultRecord of pending ) {
317
- const pendingSource = isStreamItemsRecord ( subsequentResultRecord )
318
- ? subsequentResultRecord . streamRecord
319
- : subsequentResultRecord ;
320
- pendingSources . add ( pendingSource ) ;
321
- }
322
-
308
+ if ( pendingSources . size > 0 ) {
323
309
return {
324
310
initialResult : {
325
311
...initialResult ,
@@ -538,18 +524,7 @@ export class IncrementalPublisher {
538
524
const incrementalResults : Array < IncrementalResult > = [ ] ;
539
525
const completedResults : Array < CompletedResult > = [ ] ;
540
526
for ( const subsequentResultRecord of completedRecords ) {
541
- for ( const child of subsequentResultRecord . children ) {
542
- if ( child . filtered ) {
543
- continue ;
544
- }
545
- const pendingSource = isStreamItemsRecord ( child )
546
- ? child . streamRecord
547
- : child ;
548
- if ( ! pendingSource . pendingSent ) {
549
- newPendingSources . add ( pendingSource ) ;
550
- }
551
- this . _publish ( child ) ;
552
- }
527
+ this . _publish ( subsequentResultRecord . children , newPendingSources ) ;
553
528
if ( isStreamItemsRecord ( subsequentResultRecord ) ) {
554
529
if ( subsequentResultRecord . isFinalRecord ) {
555
530
newPendingSources . delete ( subsequentResultRecord . streamRecord ) ;
@@ -613,6 +588,8 @@ export class IncrementalPublisher {
613
588
let idWithLongestPath : string | undefined ;
614
589
for ( const deferredFragmentRecord of deferredFragmentRecords ) {
615
590
const id = deferredFragmentRecord . id ;
591
+ // TODO: add test
592
+ /* c8 ignore next 3 */
616
593
if ( id === undefined ) {
617
594
continue ;
618
595
}
@@ -655,25 +632,51 @@ export class IncrementalPublisher {
655
632
return result ;
656
633
}
657
634
658
- private _publish ( subsequentResultRecord : SubsequentResultRecord ) : void {
659
- if ( isStreamItemsRecord ( subsequentResultRecord ) ) {
660
- if ( subsequentResultRecord . isCompleted ) {
635
+ private _publish (
636
+ subsequentResultRecords : ReadonlySet < SubsequentResultRecord > ,
637
+ pendingSources = new Set < DeferredFragmentRecord | StreamRecord > ( ) ,
638
+ ) : Set < DeferredFragmentRecord | StreamRecord > {
639
+ const emptyRecords : Array < SubsequentResultRecord > = [ ] ;
640
+
641
+ for ( const subsequentResultRecord of subsequentResultRecords ) {
642
+ if ( subsequentResultRecord . filtered ) {
643
+ continue ;
644
+ }
645
+ if ( isStreamItemsRecord ( subsequentResultRecord ) ) {
646
+ if ( subsequentResultRecord . isCompleted ) {
647
+ this . _push ( subsequentResultRecord ) ;
648
+ } else {
649
+ this . _introduce ( subsequentResultRecord ) ;
650
+ }
651
+
652
+ const stream = subsequentResultRecord . streamRecord ;
653
+ if ( ! stream . pendingSent ) {
654
+ pendingSources . add ( stream ) ;
655
+ }
656
+ continue ;
657
+ }
658
+
659
+ if ( subsequentResultRecord . _pending . size > 0 ) {
660
+ this . _introduce ( subsequentResultRecord ) ;
661
+ } else if (
662
+ subsequentResultRecord . deferredGroupedFieldSetRecords . size === 0
663
+ ) {
664
+ emptyRecords . push ( subsequentResultRecord ) ;
665
+ continue ;
666
+ } else {
661
667
this . _push ( subsequentResultRecord ) ;
662
- return ;
663
668
}
664
669
665
- this . _introduce ( subsequentResultRecord ) ;
666
- return ;
670
+ if ( ! subsequentResultRecord . pendingSent ) {
671
+ pendingSources . add ( subsequentResultRecord ) ;
672
+ }
667
673
}
668
674
669
- if ( subsequentResultRecord . _pending . size > 0 ) {
670
- this . _introduce ( subsequentResultRecord ) ;
671
- } else if (
672
- subsequentResultRecord . deferredGroupedFieldSetRecords . size > 0 ||
673
- subsequentResultRecord . children . size > 0
674
- ) {
675
- this . _push ( subsequentResultRecord ) ;
675
+ for ( const emptyRecord of emptyRecords ) {
676
+ this . _publish ( emptyRecord . children , pendingSources ) ;
676
677
}
678
+
679
+ return pendingSources ;
677
680
}
678
681
679
682
private _getChildren (
0 commit comments