@@ -16,32 +16,16 @@ import type {
1616 StreamRecord ,
1717 SubsequentResultRecord ,
1818} from './types.js' ;
19- import { isDeferredGroupedFieldSetRecord } from './types.js' ;
20-
21- interface DeferredFragmentNode {
22- deferredFragmentRecord : DeferredFragmentRecord ;
23- deferredGroupedFieldSetRecords : Set < DeferredGroupedFieldSetRecord > ;
24- reconcilableResults : Set < ReconcilableDeferredGroupedFieldSetResult > ;
25- children : Set < SubsequentResultNode > ;
26- }
27-
28- function isDeferredFragmentNode (
29- node : SubsequentResultNode | undefined ,
30- ) : node is DeferredFragmentNode {
31- return node !== undefined && 'deferredFragmentRecord' in node ;
32- }
33-
34- type SubsequentResultNode = DeferredFragmentNode | StreamRecord ;
19+ import {
20+ isDeferredFragmentRecord ,
21+ isDeferredGroupedFieldSetRecord ,
22+ } from './types.js' ;
3523
3624/**
3725 * @internal
3826 */
3927export class IncrementalGraph {
40- private _pending : Set < SubsequentResultNode > ;
41- private _deferredFragmentNodes : Map <
42- DeferredFragmentRecord ,
43- DeferredFragmentNode
44- > ;
28+ private _pending : Set < SubsequentResultRecord > ;
4529
4630 private _completedQueue : Array < IncrementalDataRecordResult > ;
4731 private _nextQueue : Array <
@@ -50,33 +34,31 @@ export class IncrementalGraph {
5034
5135 constructor ( ) {
5236 this . _pending = new Set ( ) ;
53- this . _deferredFragmentNodes = new Map ( ) ;
5437 this . _completedQueue = [ ] ;
5538 this . _nextQueue = [ ] ;
5639 }
5740
5841 getNewPending (
5942 incrementalDataRecords : ReadonlyArray < IncrementalDataRecord > ,
6043 ) : ReadonlyArray < SubsequentResultRecord > {
61- const newPending = new Set < SubsequentResultNode > ( ) ;
44+ const newPending = new Set < SubsequentResultRecord > ( ) ;
6245 this . _addIncrementalDataRecords (
6346 incrementalDataRecords ,
6447 undefined ,
6548 newPending ,
6649 ) ;
67- return this . _pendingNodesToResults ( newPending ) ;
50+ return this . _getNewPending ( newPending ) ;
6851 }
6952
7053 addCompletedReconcilableDeferredGroupedFieldSet (
7154 reconcilableResult : ReconcilableDeferredGroupedFieldSetResult ,
7255 ) : void {
73- for ( const deferredFragmentNode of this . _fragmentsToNodes (
74- reconcilableResult . deferredGroupedFieldSetRecord . deferredFragmentRecords ,
75- ) ) {
76- deferredFragmentNode . deferredGroupedFieldSetRecords . delete (
56+ for ( const deferredFragmentRecord of reconcilableResult
57+ . deferredGroupedFieldSetRecord . deferredFragmentRecords ) {
58+ deferredFragmentRecord . deferredGroupedFieldSetRecords . delete (
7759 reconcilableResult . deferredGroupedFieldSetRecord ,
7860 ) ;
79- deferredFragmentNode . reconcilableResults . add ( reconcilableResult ) ;
61+ deferredFragmentRecord . reconcilableResults . add ( reconcilableResult ) ;
8062 }
8163
8264 const incrementalDataRecords = reconcilableResult . incrementalDataRecords ;
@@ -132,64 +114,46 @@ export class IncrementalGraph {
132114 reconcilableResults : ReadonlyArray < ReconcilableDeferredGroupedFieldSetResult > ;
133115 }
134116 | undefined {
135- const deferredFragmentNode = this . _deferredFragmentNodes . get (
136- deferredFragmentRecord ,
137- ) ;
138117 // TODO: add test case?
139118 /* c8 ignore next 3 */
140- if ( deferredFragmentNode === undefined ) {
119+ if ( ! this . _pending . has ( deferredFragmentRecord ) ) {
141120 return undefined ;
142121 }
143- if ( deferredFragmentNode . deferredGroupedFieldSetRecords . size > 0 ) {
122+ if ( deferredFragmentRecord . deferredGroupedFieldSetRecords . size > 0 ) {
144123 return ;
145124 }
146125 const reconcilableResults = Array . from (
147- deferredFragmentNode . reconcilableResults ,
126+ deferredFragmentRecord . reconcilableResults ,
148127 ) ;
149- this . _removePending ( deferredFragmentNode ) ;
128+ this . _removePending ( deferredFragmentRecord ) ;
150129 for ( const reconcilableResult of reconcilableResults ) {
151- for ( const otherDeferredFragmentNode of this . _fragmentsToNodes (
152- reconcilableResult . deferredGroupedFieldSetRecord
153- . deferredFragmentRecords ,
154- ) ) {
155- otherDeferredFragmentNode . reconcilableResults . delete (
130+ for ( const otherDeferredFragmentRecord of reconcilableResult
131+ . deferredGroupedFieldSetRecord . deferredFragmentRecords ) {
132+ otherDeferredFragmentRecord . reconcilableResults . delete (
156133 reconcilableResult ,
157134 ) ;
158135 }
159136 }
160- const newPending = this . _pendingNodesToResults (
161- deferredFragmentNode . children ,
162- ) ;
137+ const newPending = this . _getNewPending ( deferredFragmentRecord . children ) ;
163138 return { newPending, reconcilableResults } ;
164139 }
165140
166141 removeDeferredFragment (
167142 deferredFragmentRecord : DeferredFragmentRecord ,
168143 ) : boolean {
169- const deferredFragmentNode = this . _deferredFragmentNodes . get (
170- deferredFragmentRecord ,
171- ) ;
172- if ( deferredFragmentNode === undefined ) {
144+ if ( ! this . _pending . has ( deferredFragmentRecord ) ) {
173145 return false ;
174146 }
175- this . _removePending ( deferredFragmentNode ) ;
176- this . _deferredFragmentNodes . delete ( deferredFragmentRecord ) ;
177- // TODO: add test case for an erroring deferred fragment with child defers
178- /* c8 ignore next 5 */
179- for ( const child of deferredFragmentNode . children ) {
180- if ( isDeferredFragmentNode ( child ) ) {
181- this . removeDeferredFragment ( child . deferredFragmentRecord ) ;
182- }
183- }
147+ this . _removePending ( deferredFragmentRecord ) ;
184148 return true ;
185149 }
186150
187151 removeStream ( streamRecord : StreamRecord ) : void {
188152 this . _removePending ( streamRecord ) ;
189153 }
190154
191- private _removePending ( subsequentResultNode : SubsequentResultNode ) : void {
192- this . _pending . delete ( subsequentResultNode ) ;
155+ private _removePending ( subsequentResultRecord : SubsequentResultRecord ) : void {
156+ this . _pending . delete ( subsequentResultRecord ) ;
193157 if ( this . _pending . size === 0 ) {
194158 for ( const resolve of this . _nextQueue ) {
195159 resolve ( { value : undefined , done : true } ) ;
@@ -200,116 +164,88 @@ export class IncrementalGraph {
200164 private _addIncrementalDataRecords (
201165 incrementalDataRecords : ReadonlyArray < IncrementalDataRecord > ,
202166 parents : ReadonlyArray < DeferredFragmentRecord > | undefined ,
203- newPending ?: Set < SubsequentResultNode > | undefined ,
167+ subsequentResultRecords ?: Set < SubsequentResultRecord > | undefined ,
204168 ) : void {
205169 for ( const incrementalDataRecord of incrementalDataRecords ) {
206170 if ( isDeferredGroupedFieldSetRecord ( incrementalDataRecord ) ) {
207171 for ( const deferredFragmentRecord of incrementalDataRecord . deferredFragmentRecords ) {
208- const deferredFragmentNode = this . _addDeferredFragmentNode (
172+ this . _addDeferredFragment (
209173 deferredFragmentRecord ,
210- newPending ,
174+ subsequentResultRecords ,
211175 ) ;
212- deferredFragmentNode . deferredGroupedFieldSetRecords . add (
176+ deferredFragmentRecord . deferredGroupedFieldSetRecords . add (
213177 incrementalDataRecord ,
214178 ) ;
215179 }
216180 if ( this . _hasPendingFragment ( incrementalDataRecord ) ) {
217181 this . _onDeferredGroupedFieldSet ( incrementalDataRecord ) ;
218182 }
219183 } else if ( parents === undefined ) {
220- invariant ( newPending !== undefined ) ;
221- newPending . add ( incrementalDataRecord ) ;
184+ invariant ( subsequentResultRecords !== undefined ) ;
185+ subsequentResultRecords . add ( incrementalDataRecord ) ;
222186 } else {
223187 for ( const parent of parents ) {
224- const deferredFragmentNode = this . _addDeferredFragmentNode (
225- parent ,
226- newPending ,
227- ) ;
228- deferredFragmentNode . children . add ( incrementalDataRecord ) ;
188+ this . _addDeferredFragment ( parent , subsequentResultRecords ) ;
189+ parent . children . add ( incrementalDataRecord ) ;
229190 }
230191 }
231192 }
232193 }
233194
234- private _pendingNodesToResults (
235- newPendingNodes : Set < SubsequentResultNode > ,
195+ private _getNewPending (
196+ subsequentResultRecords : Set < SubsequentResultRecord > ,
236197 ) : ReadonlyArray < SubsequentResultRecord > {
237- const newPendingResults : Array < SubsequentResultRecord > = [ ] ;
238- for ( const node of newPendingNodes ) {
239- if ( isDeferredFragmentNode ( node ) ) {
240- if ( node . deferredGroupedFieldSetRecords . size > 0 ) {
241- node . deferredFragmentRecord . setAsPending ( ) ;
242- for ( const deferredGroupedFieldSetRecord of node . deferredGroupedFieldSetRecords ) {
198+ const newPending : Array < SubsequentResultRecord > = [ ] ;
199+ for ( const subsequentResultRecord of subsequentResultRecords ) {
200+ if ( isDeferredFragmentRecord ( subsequentResultRecord ) ) {
201+ if ( subsequentResultRecord . deferredGroupedFieldSetRecords . size > 0 ) {
202+ subsequentResultRecord . setAsPending ( ) ;
203+ for ( const deferredGroupedFieldSetRecord of subsequentResultRecord . deferredGroupedFieldSetRecords ) {
243204 if ( ! this . _hasPendingFragment ( deferredGroupedFieldSetRecord ) ) {
244205 this . _onDeferredGroupedFieldSet ( deferredGroupedFieldSetRecord ) ;
245206 }
246207 }
247- this . _pending . add ( node ) ;
248- newPendingResults . push ( node . deferredFragmentRecord ) ;
208+ this . _pending . add ( subsequentResultRecord ) ;
209+ newPending . push ( subsequentResultRecord ) ;
249210 continue ;
250211 }
251- this . _deferredFragmentNodes . delete ( node . deferredFragmentRecord ) ;
252- for ( const child of node . children ) {
253- newPendingNodes . add ( child ) ;
212+ for ( const child of subsequentResultRecord . children ) {
213+ subsequentResultRecords . add ( child ) ;
254214 }
255215 } else {
256- this . _pending . add ( node ) ;
257- newPendingResults . push ( node ) ;
216+ this . _pending . add ( subsequentResultRecord ) ;
217+ newPending . push ( subsequentResultRecord ) ;
258218
259219 // eslint-disable-next-line @typescript-eslint/no-floating-promises
260- this . _onStreamItems ( node ) ;
220+ this . _onStreamItems ( subsequentResultRecord ) ;
261221 }
262222 }
263- return newPendingResults ;
223+ return newPending ;
264224 }
265225
266226 private _hasPendingFragment (
267227 deferredGroupedFieldSetRecord : DeferredGroupedFieldSetRecord ,
268228 ) : boolean {
269- return this . _fragmentsToNodes (
270- deferredGroupedFieldSetRecord . deferredFragmentRecords ,
271- ) . some ( ( node ) => this . _pending . has ( node ) ) ;
272- }
273-
274- private _fragmentsToNodes (
275- deferredFragmentRecords : ReadonlyArray < DeferredFragmentRecord > ,
276- ) : Array < DeferredFragmentNode > {
277- return deferredFragmentRecords
278- . map ( ( deferredFragmentRecord ) =>
279- this . _deferredFragmentNodes . get ( deferredFragmentRecord ) ,
280- )
281- . filter < DeferredFragmentNode > ( isDeferredFragmentNode ) ;
229+ return deferredGroupedFieldSetRecord . deferredFragmentRecords . some (
230+ ( deferredFragmentRecord ) => this . _pending . has ( deferredFragmentRecord ) ,
231+ ) ;
282232 }
283233
284- private _addDeferredFragmentNode (
234+ private _addDeferredFragment (
285235 deferredFragmentRecord : DeferredFragmentRecord ,
286- newPending : Set < SubsequentResultNode > | undefined ,
287- ) : DeferredFragmentNode {
288- let deferredFragmentNode = this . _deferredFragmentNodes . get (
289- deferredFragmentRecord ,
290- ) ;
291- if ( deferredFragmentNode !== undefined ) {
292- return deferredFragmentNode ;
236+ subsequentResultRecords : Set < SubsequentResultRecord > | undefined ,
237+ ) : void {
238+ if ( this . _pending . has ( deferredFragmentRecord ) ) {
239+ return ;
293240 }
294- deferredFragmentNode = {
295- deferredFragmentRecord,
296- deferredGroupedFieldSetRecords : new Set ( ) ,
297- reconcilableResults : new Set ( ) ,
298- children : new Set ( ) ,
299- } ;
300- this . _deferredFragmentNodes . set (
301- deferredFragmentRecord ,
302- deferredFragmentNode ,
303- ) ;
304241 const parent = deferredFragmentRecord . parent ;
305242 if ( parent === undefined ) {
306- invariant ( newPending !== undefined ) ;
307- newPending . add ( deferredFragmentNode ) ;
308- return deferredFragmentNode ;
243+ invariant ( subsequentResultRecords !== undefined ) ;
244+ subsequentResultRecords . add ( deferredFragmentRecord ) ;
245+ return ;
309246 }
310- const parentNode = this . _addDeferredFragmentNode ( parent , newPending ) ;
311- parentNode . children . add ( deferredFragmentNode ) ;
312- return deferredFragmentNode ;
247+ parent . children . add ( deferredFragmentRecord ) ;
248+ this . _addDeferredFragment ( parent , subsequentResultRecords ) ;
313249 }
314250
315251 private _onDeferredGroupedFieldSet (
0 commit comments