@@ -4,10 +4,10 @@ import { promiseWithResolvers } from '../jsutils/promiseWithResolvers.js';
4
4
import type {
5
5
DeferredFragmentRecord ,
6
6
DeferredGroupedFieldSetRecord ,
7
- DeferredGroupedFieldSetResult ,
8
7
IncrementalDataRecord ,
9
8
IncrementalDataRecordResult ,
10
9
ReconcilableDeferredGroupedFieldSetResult ,
10
+ StreamItemsRecord ,
11
11
StreamRecord ,
12
12
SubsequentResultRecord ,
13
13
} from './types.js' ;
@@ -16,7 +16,6 @@ import { isDeferredGroupedFieldSetRecord } from './types.js';
16
16
interface DeferredFragmentNode {
17
17
deferredFragmentRecord : DeferredFragmentRecord ;
18
18
deferredGroupedFieldSetRecords : Set < DeferredGroupedFieldSetRecord > ;
19
- results : Array < DeferredGroupedFieldSetResult > ;
20
19
reconcilableResults : Set < ReconcilableDeferredGroupedFieldSetResult > ;
21
20
children : Array < DeferredFragmentNode > ;
22
21
}
@@ -46,6 +45,7 @@ export class IncrementalGraph {
46
45
> ;
47
46
48
47
private _newPending : Set < SubsequentResultNode > ;
48
+ private _newIncrementalDataRecords : Set < IncrementalDataRecord > ;
49
49
private _completedQueue : Array < IncrementalDataRecordResult > ;
50
50
private _nextQueue : Array <
51
51
( iterable : IteratorResult < Iterable < IncrementalDataRecordResult > > ) => void
@@ -54,6 +54,7 @@ export class IncrementalGraph {
54
54
constructor ( ) {
55
55
this . _pending = new Set ( ) ;
56
56
this . _deferredFragmentNodes = new Map ( ) ;
57
+ this . _newIncrementalDataRecords = new Set ( ) ;
57
58
this . _newPending = new Set ( ) ;
58
59
this . _completedQueue = [ ] ;
59
60
this . _nextQueue = [ ] ;
@@ -64,41 +65,9 @@ export class IncrementalGraph {
64
65
) : void {
65
66
for ( const incrementalDataRecord of incrementalDataRecords ) {
66
67
if ( isDeferredGroupedFieldSetRecord ( incrementalDataRecord ) ) {
67
- for ( const deferredFragmentRecord of incrementalDataRecord . deferredFragmentRecords ) {
68
- const deferredFragmentNode = this . _addDeferredFragmentNode (
69
- deferredFragmentRecord ,
70
- ) ;
71
- deferredFragmentNode . deferredGroupedFieldSetRecords . add (
72
- incrementalDataRecord ,
73
- ) ;
74
- }
75
-
76
- const result = incrementalDataRecord . result ;
77
- if ( isPromise ( result ) ) {
78
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
79
- result . then ( ( resolved ) => {
80
- this . _enqueueCompletedDeferredGroupedFieldSet ( resolved ) ;
81
- } ) ;
82
- } else {
83
- this . _enqueueCompletedDeferredGroupedFieldSet ( result ) ;
84
- }
85
-
86
- continue ;
87
- }
88
-
89
- const streamRecord = incrementalDataRecord . streamRecord ;
90
- if ( streamRecord . id === undefined ) {
91
- this . _newPending . add ( streamRecord ) ;
92
- }
93
-
94
- const result = incrementalDataRecord . result ;
95
- if ( isPromise ( result ) ) {
96
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
97
- result . then ( ( resolved ) => {
98
- this . _enqueue ( resolved ) ;
99
- } ) ;
68
+ this . _addDeferredGroupedFieldSetRecord ( incrementalDataRecord ) ;
100
69
} else {
101
- this . _enqueue ( result ) ;
70
+ this . _addStreamItemsRecord ( incrementalDataRecord ) ;
102
71
}
103
72
}
104
73
}
@@ -127,6 +96,9 @@ export class IncrementalGraph {
127
96
this . _pending . add ( node ) ;
128
97
newPending . push ( node ) ;
129
98
} else if ( node . deferredGroupedFieldSetRecords . size > 0 ) {
99
+ for ( const deferredGroupedFieldSetNode of node . deferredGroupedFieldSetRecords ) {
100
+ this . _newIncrementalDataRecords . add ( deferredGroupedFieldSetNode ) ;
101
+ }
130
102
this . _pending . add ( node ) ;
131
103
newPending . push ( node . deferredFragmentRecord ) ;
132
104
} else {
@@ -136,6 +108,18 @@ export class IncrementalGraph {
136
108
}
137
109
}
138
110
this . _newPending . clear ( ) ;
111
+
112
+ for ( const incrementalDataRecord of this . _newIncrementalDataRecords ) {
113
+ const result = incrementalDataRecord . result ;
114
+ if ( isPromise ( result ) ) {
115
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
116
+ result . then ( ( resolved ) => this . _enqueue ( resolved ) ) ;
117
+ } else {
118
+ this . _enqueue ( result ) ;
119
+ }
120
+ }
121
+ this . _newIncrementalDataRecords . clear ( ) ;
122
+
139
123
return newPending ;
140
124
}
141
125
@@ -210,9 +194,6 @@ export class IncrementalGraph {
210
194
this . _removePending ( deferredFragmentNode ) ;
211
195
for ( const child of deferredFragmentNode . children ) {
212
196
this . _newPending . add ( child ) ;
213
- for ( const result of child . results ) {
214
- this . _enqueue ( result ) ;
215
- }
216
197
}
217
198
return reconcilableResults ;
218
199
}
@@ -251,6 +232,30 @@ export class IncrementalGraph {
251
232
}
252
233
}
253
234
235
+ private _addDeferredGroupedFieldSetRecord (
236
+ deferredGroupedFieldSetRecord : DeferredGroupedFieldSetRecord ,
237
+ ) : void {
238
+ for ( const deferredFragmentRecord of deferredGroupedFieldSetRecord . deferredFragmentRecords ) {
239
+ const deferredFragmentNode = this . _addDeferredFragmentNode (
240
+ deferredFragmentRecord ,
241
+ ) ;
242
+ if ( this . _pending . has ( deferredFragmentNode ) ) {
243
+ this . _newIncrementalDataRecords . add ( deferredGroupedFieldSetRecord ) ;
244
+ }
245
+ deferredFragmentNode . deferredGroupedFieldSetRecords . add (
246
+ deferredGroupedFieldSetRecord ,
247
+ ) ;
248
+ }
249
+ }
250
+
251
+ private _addStreamItemsRecord ( streamItemsRecord : StreamItemsRecord ) : void {
252
+ const streamRecord = streamItemsRecord . streamRecord ;
253
+ if ( ! this . _pending . has ( streamRecord ) ) {
254
+ this . _newPending . add ( streamRecord ) ;
255
+ }
256
+ this . _newIncrementalDataRecords . add ( streamItemsRecord ) ;
257
+ }
258
+
254
259
private _addDeferredFragmentNode (
255
260
deferredFragmentRecord : DeferredFragmentRecord ,
256
261
) : DeferredFragmentNode {
@@ -263,7 +268,6 @@ export class IncrementalGraph {
263
268
deferredFragmentNode = {
264
269
deferredFragmentRecord,
265
270
deferredGroupedFieldSetRecords : new Set ( ) ,
266
- results : [ ] ,
267
271
reconcilableResults : new Set ( ) ,
268
272
children : [ ] ,
269
273
} ;
@@ -281,30 +285,6 @@ export class IncrementalGraph {
281
285
return deferredFragmentNode ;
282
286
}
283
287
284
- private _enqueueCompletedDeferredGroupedFieldSet (
285
- result : DeferredGroupedFieldSetResult ,
286
- ) : void {
287
- let isPending = false ;
288
- for ( const deferredFragmentRecord of result . deferredGroupedFieldSetRecord
289
- . deferredFragmentRecords ) {
290
- const deferredFragmentNode = this . _deferredFragmentNodes . get (
291
- deferredFragmentRecord ,
292
- ) ;
293
- // TODO: add test case?
294
- /* c8 ignore next 3 */
295
- if ( deferredFragmentNode === undefined ) {
296
- continue ;
297
- }
298
- if ( this . _pending . has ( deferredFragmentNode ) ) {
299
- isPending = true ;
300
- }
301
- deferredFragmentNode . results . push ( result ) ;
302
- }
303
- if ( isPending ) {
304
- this . _enqueue ( result ) ;
305
- }
306
- }
307
-
308
288
private * _yieldCurrentCompletedIncrementalData (
309
289
first : IncrementalDataRecordResult ,
310
290
) : Generator < IncrementalDataRecordResult > {
0 commit comments