@@ -15,32 +15,16 @@ import type {
15
15
StreamRecord ,
16
16
SubsequentResultRecord ,
17
17
} from './types.js' ;
18
- import { isDeferredGroupedFieldSetRecord } from './types.js' ;
19
-
20
- interface DeferredFragmentNode {
21
- deferredFragmentRecord : DeferredFragmentRecord ;
22
- deferredGroupedFieldSetRecords : Set < DeferredGroupedFieldSetRecord > ;
23
- reconcilableResults : Set < ReconcilableDeferredGroupedFieldSetResult > ;
24
- children : Set < SubsequentResultNode > ;
25
- }
26
-
27
- function isDeferredFragmentNode (
28
- node : SubsequentResultNode | undefined ,
29
- ) : node is DeferredFragmentNode {
30
- return node !== undefined && 'deferredFragmentRecord' in node ;
31
- }
32
-
33
- type SubsequentResultNode = DeferredFragmentNode | StreamRecord ;
18
+ import {
19
+ isDeferredFragmentRecord ,
20
+ isDeferredGroupedFieldSetRecord ,
21
+ } from './types.js' ;
34
22
35
23
/**
36
24
* @internal
37
25
*/
38
26
export class IncrementalGraph {
39
- private _pending : Set < SubsequentResultNode > ;
40
- private _deferredFragmentNodes : Map <
41
- DeferredFragmentRecord ,
42
- DeferredFragmentNode
43
- > ;
27
+ private _pending : Set < SubsequentResultRecord > ;
44
28
45
29
private _completedQueue : Array < IncrementalDataRecordResult > ;
46
30
private _nextQueue : Array <
@@ -49,33 +33,31 @@ export class IncrementalGraph {
49
33
50
34
constructor ( ) {
51
35
this . _pending = new Set ( ) ;
52
- this . _deferredFragmentNodes = new Map ( ) ;
53
36
this . _completedQueue = [ ] ;
54
37
this . _nextQueue = [ ] ;
55
38
}
56
39
57
40
getNewPending (
58
41
incrementalDataRecords : ReadonlyArray < IncrementalDataRecord > ,
59
42
) : ReadonlyArray < SubsequentResultRecord > {
60
- const newPending = new Set < SubsequentResultNode > ( ) ;
43
+ const newPending = new Set < SubsequentResultRecord > ( ) ;
61
44
this . _addIncrementalDataRecords (
62
45
incrementalDataRecords ,
63
46
undefined ,
64
47
newPending ,
65
48
) ;
66
- return this . _pendingNodesToResults ( newPending ) ;
49
+ return this . _getNewPending ( newPending ) ;
67
50
}
68
51
69
52
addCompletedReconcilableDeferredGroupedFieldSet (
70
53
reconcilableResult : ReconcilableDeferredGroupedFieldSetResult ,
71
54
) : void {
72
- for ( const deferredFragmentNode of this . _fragmentsToNodes (
73
- reconcilableResult . deferredGroupedFieldSetRecord . deferredFragmentRecords ,
74
- ) ) {
75
- deferredFragmentNode . deferredGroupedFieldSetRecords . delete (
55
+ for ( const deferredFragmentRecord of reconcilableResult
56
+ . deferredGroupedFieldSetRecord . deferredFragmentRecords ) {
57
+ deferredFragmentRecord . deferredGroupedFieldSetRecords . delete (
76
58
reconcilableResult . deferredGroupedFieldSetRecord ,
77
59
) ;
78
- deferredFragmentNode . reconcilableResults . add ( reconcilableResult ) ;
60
+ deferredFragmentRecord . reconcilableResults . add ( reconcilableResult ) ;
79
61
}
80
62
81
63
const incrementalDataRecords = reconcilableResult . incrementalDataRecords ;
@@ -131,64 +113,46 @@ export class IncrementalGraph {
131
113
reconcilableResults : ReadonlyArray < ReconcilableDeferredGroupedFieldSetResult > ;
132
114
}
133
115
| undefined {
134
- const deferredFragmentNode = this . _deferredFragmentNodes . get (
135
- deferredFragmentRecord ,
136
- ) ;
137
116
// TODO: add test case?
138
117
/* c8 ignore next 3 */
139
- if ( deferredFragmentNode === undefined ) {
118
+ if ( ! this . _pending . has ( deferredFragmentRecord ) ) {
140
119
return undefined ;
141
120
}
142
- if ( deferredFragmentNode . deferredGroupedFieldSetRecords . size > 0 ) {
121
+ if ( deferredFragmentRecord . deferredGroupedFieldSetRecords . size > 0 ) {
143
122
return ;
144
123
}
145
124
const reconcilableResults = Array . from (
146
- deferredFragmentNode . reconcilableResults ,
125
+ deferredFragmentRecord . reconcilableResults ,
147
126
) ;
148
- this . _removePending ( deferredFragmentNode ) ;
127
+ this . _removePending ( deferredFragmentRecord ) ;
149
128
for ( const reconcilableResult of reconcilableResults ) {
150
- for ( const otherDeferredFragmentNode of this . _fragmentsToNodes (
151
- reconcilableResult . deferredGroupedFieldSetRecord
152
- . deferredFragmentRecords ,
153
- ) ) {
154
- otherDeferredFragmentNode . reconcilableResults . delete (
129
+ for ( const otherDeferredFragmentRecord of reconcilableResult
130
+ . deferredGroupedFieldSetRecord . deferredFragmentRecords ) {
131
+ otherDeferredFragmentRecord . reconcilableResults . delete (
155
132
reconcilableResult ,
156
133
) ;
157
134
}
158
135
}
159
- const newPending = this . _pendingNodesToResults (
160
- deferredFragmentNode . children ,
161
- ) ;
136
+ const newPending = this . _getNewPending ( deferredFragmentRecord . children ) ;
162
137
return { newPending, reconcilableResults } ;
163
138
}
164
139
165
140
removeDeferredFragment (
166
141
deferredFragmentRecord : DeferredFragmentRecord ,
167
142
) : boolean {
168
- const deferredFragmentNode = this . _deferredFragmentNodes . get (
169
- deferredFragmentRecord ,
170
- ) ;
171
- if ( deferredFragmentNode === undefined ) {
143
+ if ( ! this . _pending . has ( deferredFragmentRecord ) ) {
172
144
return false ;
173
145
}
174
- this . _removePending ( deferredFragmentNode ) ;
175
- this . _deferredFragmentNodes . delete ( deferredFragmentRecord ) ;
176
- // TODO: add test case for an erroring deferred fragment with child defers
177
- /* c8 ignore next 5 */
178
- for ( const child of deferredFragmentNode . children ) {
179
- if ( isDeferredFragmentNode ( child ) ) {
180
- this . removeDeferredFragment ( child . deferredFragmentRecord ) ;
181
- }
182
- }
146
+ this . _removePending ( deferredFragmentRecord ) ;
183
147
return true ;
184
148
}
185
149
186
150
removeStream ( streamRecord : StreamRecord ) : void {
187
151
this . _removePending ( streamRecord ) ;
188
152
}
189
153
190
- private _removePending ( subsequentResultNode : SubsequentResultNode ) : void {
191
- this . _pending . delete ( subsequentResultNode ) ;
154
+ private _removePending ( subsequentResultRecord : SubsequentResultRecord ) : void {
155
+ this . _pending . delete ( subsequentResultRecord ) ;
192
156
if ( this . _pending . size === 0 ) {
193
157
for ( const resolve of this . _nextQueue ) {
194
158
resolve ( { value : undefined , done : true } ) ;
@@ -199,115 +163,87 @@ export class IncrementalGraph {
199
163
private _addIncrementalDataRecords (
200
164
incrementalDataRecords : ReadonlyArray < IncrementalDataRecord > ,
201
165
parents : ReadonlyArray < DeferredFragmentRecord > | undefined ,
202
- newPending ?: Set < SubsequentResultNode > | undefined ,
166
+ subsequentResultRecords ?: Set < SubsequentResultRecord > | undefined ,
203
167
) : void {
204
168
for ( const incrementalDataRecord of incrementalDataRecords ) {
205
169
if ( isDeferredGroupedFieldSetRecord ( incrementalDataRecord ) ) {
206
170
for ( const deferredFragmentRecord of incrementalDataRecord . deferredFragmentRecords ) {
207
- const deferredFragmentNode = this . _addDeferredFragmentNode (
171
+ this . _addDeferredFragment (
208
172
deferredFragmentRecord ,
209
- newPending ,
173
+ subsequentResultRecords ,
210
174
) ;
211
- deferredFragmentNode . deferredGroupedFieldSetRecords . add (
175
+ deferredFragmentRecord . deferredGroupedFieldSetRecords . add (
212
176
incrementalDataRecord ,
213
177
) ;
214
178
}
215
179
if ( this . _hasPendingFragment ( incrementalDataRecord ) ) {
216
180
this . _onDeferredGroupedFieldSet ( incrementalDataRecord ) ;
217
181
}
218
182
} else if ( parents === undefined ) {
219
- invariant ( newPending !== undefined ) ;
220
- newPending . add ( incrementalDataRecord ) ;
183
+ invariant ( subsequentResultRecords !== undefined ) ;
184
+ subsequentResultRecords . add ( incrementalDataRecord ) ;
221
185
} else {
222
186
for ( const parent of parents ) {
223
- const deferredFragmentNode = this . _addDeferredFragmentNode (
224
- parent ,
225
- newPending ,
226
- ) ;
227
- deferredFragmentNode . children . add ( incrementalDataRecord ) ;
187
+ this . _addDeferredFragment ( parent , subsequentResultRecords ) ;
188
+ parent . children . add ( incrementalDataRecord ) ;
228
189
}
229
190
}
230
191
}
231
192
}
232
193
233
- private _pendingNodesToResults (
234
- newPendingNodes : Set < SubsequentResultNode > ,
194
+ private _getNewPending (
195
+ subsequentResultRecords : Set < SubsequentResultRecord > ,
235
196
) : ReadonlyArray < SubsequentResultRecord > {
236
- const newPendingResults : Array < SubsequentResultRecord > = [ ] ;
237
- for ( const node of newPendingNodes ) {
238
- if ( isDeferredFragmentNode ( node ) ) {
239
- if ( node . deferredGroupedFieldSetRecords . size > 0 ) {
240
- for ( const deferredGroupedFieldSetRecord of node . deferredGroupedFieldSetRecords ) {
197
+ const newPending : Array < SubsequentResultRecord > = [ ] ;
198
+ for ( const subsequentResultRecord of subsequentResultRecords ) {
199
+ if ( isDeferredFragmentRecord ( subsequentResultRecord ) ) {
200
+ if ( subsequentResultRecord . deferredGroupedFieldSetRecords . size > 0 ) {
201
+ for ( const deferredGroupedFieldSetRecord of subsequentResultRecord . deferredGroupedFieldSetRecords ) {
241
202
if ( ! this . _hasPendingFragment ( deferredGroupedFieldSetRecord ) ) {
242
203
this . _onDeferredGroupedFieldSet ( deferredGroupedFieldSetRecord ) ;
243
204
}
244
205
}
245
- this . _pending . add ( node ) ;
246
- newPendingResults . push ( node . deferredFragmentRecord ) ;
206
+ this . _pending . add ( subsequentResultRecord ) ;
207
+ newPending . push ( subsequentResultRecord ) ;
247
208
continue ;
248
209
}
249
- this . _deferredFragmentNodes . delete ( node . deferredFragmentRecord ) ;
250
- for ( const child of node . children ) {
251
- newPendingNodes . add ( child ) ;
210
+ for ( const child of subsequentResultRecord . children ) {
211
+ subsequentResultRecords . add ( child ) ;
252
212
}
253
213
} else {
254
- this . _pending . add ( node ) ;
255
- newPendingResults . push ( node ) ;
214
+ this . _pending . add ( subsequentResultRecord ) ;
215
+ newPending . push ( subsequentResultRecord ) ;
256
216
257
217
// eslint-disable-next-line @typescript-eslint/no-floating-promises
258
- this . _onStreamItems ( node ) ;
218
+ this . _onStreamItems ( subsequentResultRecord ) ;
259
219
}
260
220
}
261
- return newPendingResults ;
221
+ return newPending ;
262
222
}
263
223
264
224
private _hasPendingFragment (
265
225
deferredGroupedFieldSetRecord : DeferredGroupedFieldSetRecord ,
266
226
) : boolean {
267
- return this . _fragmentsToNodes (
268
- deferredGroupedFieldSetRecord . deferredFragmentRecords ,
269
- ) . some ( ( node ) => this . _pending . has ( node ) ) ;
270
- }
271
-
272
- private _fragmentsToNodes (
273
- deferredFragmentRecords : ReadonlyArray < DeferredFragmentRecord > ,
274
- ) : Array < DeferredFragmentNode > {
275
- return deferredFragmentRecords
276
- . map ( ( deferredFragmentRecord ) =>
277
- this . _deferredFragmentNodes . get ( deferredFragmentRecord ) ,
278
- )
279
- . filter < DeferredFragmentNode > ( isDeferredFragmentNode ) ;
227
+ return deferredGroupedFieldSetRecord . deferredFragmentRecords . some (
228
+ ( deferredFragmentRecord ) => this . _pending . has ( deferredFragmentRecord ) ,
229
+ ) ;
280
230
}
281
231
282
- private _addDeferredFragmentNode (
232
+ private _addDeferredFragment (
283
233
deferredFragmentRecord : DeferredFragmentRecord ,
284
- newPending : Set < SubsequentResultNode > | undefined ,
285
- ) : DeferredFragmentNode {
286
- let deferredFragmentNode = this . _deferredFragmentNodes . get (
287
- deferredFragmentRecord ,
288
- ) ;
289
- if ( deferredFragmentNode !== undefined ) {
290
- return deferredFragmentNode ;
234
+ subsequentResultRecords : Set < SubsequentResultRecord > | undefined ,
235
+ ) : void {
236
+ if ( this . _pending . has ( deferredFragmentRecord ) ) {
237
+ return ;
291
238
}
292
- deferredFragmentNode = {
293
- deferredFragmentRecord,
294
- deferredGroupedFieldSetRecords : new Set ( ) ,
295
- reconcilableResults : new Set ( ) ,
296
- children : new Set ( ) ,
297
- } ;
298
- this . _deferredFragmentNodes . set (
299
- deferredFragmentRecord ,
300
- deferredFragmentNode ,
301
- ) ;
302
239
const parent = deferredFragmentRecord . parent ;
303
240
if ( parent === undefined ) {
304
- invariant ( newPending !== undefined ) ;
305
- newPending . add ( deferredFragmentNode ) ;
306
- return deferredFragmentNode ;
241
+ invariant ( subsequentResultRecords !== undefined ) ;
242
+ subsequentResultRecords . add ( deferredFragmentRecord ) ;
243
+ return ;
307
244
}
308
- const parentNode = this . _addDeferredFragmentNode ( parent , newPending ) ;
309
- parentNode . children . add ( deferredFragmentNode ) ;
310
- return deferredFragmentNode ;
245
+ parent . children . add ( deferredFragmentRecord ) ;
246
+ this . _addDeferredFragment ( parent , subsequentResultRecords ) ;
311
247
}
312
248
313
249
private _onDeferredGroupedFieldSet (
0 commit comments