@@ -301,25 +301,11 @@ export class IncrementalPublisher {
301301 initialResultRecord : InitialResultRecord ,
302302 data : ObjMap < unknown > | null ,
303303 ) : 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 ) ;
310305
311306 const errors = initialResultRecord . errors ;
312307 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 ) {
323309 return {
324310 initialResult : {
325311 ...initialResult ,
@@ -538,18 +524,7 @@ export class IncrementalPublisher {
538524 const incrementalResults : Array < IncrementalResult > = [ ] ;
539525 const completedResults : Array < CompletedResult > = [ ] ;
540526 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 ) ;
553528 if ( isStreamItemsRecord ( subsequentResultRecord ) ) {
554529 if ( subsequentResultRecord . isFinalRecord ) {
555530 newPendingSources . delete ( subsequentResultRecord . streamRecord ) ;
@@ -613,6 +588,8 @@ export class IncrementalPublisher {
613588 let idWithLongestPath : string | undefined ;
614589 for ( const deferredFragmentRecord of deferredFragmentRecords ) {
615590 const id = deferredFragmentRecord . id ;
591+ // TODO: add test
592+ /* c8 ignore next 3 */
616593 if ( id === undefined ) {
617594 continue ;
618595 }
@@ -655,25 +632,51 @@ export class IncrementalPublisher {
655632 return result ;
656633 }
657634
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 {
661667 this . _push ( subsequentResultRecord ) ;
662- return ;
663668 }
664669
665- this . _introduce ( subsequentResultRecord ) ;
666- return ;
670+ if ( ! subsequentResultRecord . pendingSent ) {
671+ pendingSources . add ( subsequentResultRecord ) ;
672+ }
667673 }
668674
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 ) ;
676677 }
678+
679+ return pendingSources ;
677680 }
678681
679682 private _getChildren (
0 commit comments