@@ -97,34 +97,17 @@ export type FormattedIncrementalResult<
97
97
* parents have completed so that they can no longer be filtered. This includes all Incremental
98
98
* Data records in `released`, as well as Incremental Data records that have not yet completed.
99
99
*
100
- * `_initialResult`: a record containing the state of the initial result, as follows:
101
- * `isCompleted`: indicates whether the initial result has completed.
102
- * `children`: the set of Incremental Data records that can be be published when the initial
103
- * result is completed.
104
- *
105
- * Each Incremental Data record also contains similar metadata, i.e. these records also contain
106
- * similar `isCompleted` and `children` properties.
107
- *
108
100
* @internal
109
101
*/
110
102
export class IncrementalPublisher {
111
- private _initialResult : {
112
- children : Set < IncrementalDataRecord > ;
113
- isCompleted : boolean ;
114
- } ;
115
-
116
- private _released : Set < IncrementalDataRecord > ;
117
- private _pending : Set < IncrementalDataRecord > ;
103
+ private _released : Set < SubsequentDataRecord > ;
104
+ private _pending : Set < SubsequentDataRecord > ;
118
105
119
106
// these are assigned within the Promise executor called synchronously within the constructor
120
107
private _signalled ! : Promise < unknown > ;
121
108
private _resolve ! : ( ) => void ;
122
109
123
110
constructor ( ) {
124
- this . _initialResult = {
125
- children : new Set ( ) ,
126
- isCompleted : false ,
127
- } ;
128
111
this . _released = new Set ( ) ;
129
112
this . _pending = new Set ( ) ;
130
113
this . _reset ( ) ;
@@ -210,19 +193,22 @@ export class IncrementalPublisher {
210
193
} ;
211
194
}
212
195
196
+ prepareInitialResultRecord ( ) : InitialResultRecord {
197
+ return {
198
+ errors : [ ] ,
199
+ children : new Set ( ) ,
200
+ } ;
201
+ }
202
+
213
203
prepareNewDeferredFragmentRecord ( opts : {
214
204
label : string | undefined ;
215
205
path : Path | undefined ;
216
- parentContext : IncrementalDataRecord | undefined ;
206
+ parentContext : IncrementalDataRecord ;
217
207
} ) : DeferredFragmentRecord {
218
208
const deferredFragmentRecord = new DeferredFragmentRecord ( opts ) ;
219
209
220
210
const parentContext = opts . parentContext ;
221
- if ( parentContext ) {
222
- parentContext . children . add ( deferredFragmentRecord ) ;
223
- } else {
224
- this . _initialResult . children . add ( deferredFragmentRecord ) ;
225
- }
211
+ parentContext . children . add ( deferredFragmentRecord ) ;
226
212
227
213
return deferredFragmentRecord ;
228
214
}
@@ -231,16 +217,12 @@ export class IncrementalPublisher {
231
217
label : string | undefined ;
232
218
path : Path | undefined ;
233
219
asyncIterator ?: AsyncIterator < unknown > ;
234
- parentContext : IncrementalDataRecord | undefined ;
220
+ parentContext : IncrementalDataRecord ;
235
221
} ) : StreamItemsRecord {
236
222
const streamItemsRecord = new StreamItemsRecord ( opts ) ;
237
223
238
224
const parentContext = opts . parentContext ;
239
- if ( parentContext ) {
240
- parentContext . children . add ( streamItemsRecord ) ;
241
- } else {
242
- this . _initialResult . children . add ( streamItemsRecord ) ;
243
- }
225
+ parentContext . children . add ( streamItemsRecord ) ;
244
226
245
227
return streamItemsRecord ;
246
228
}
@@ -274,29 +256,31 @@ export class IncrementalPublisher {
274
256
incrementalDataRecord . errors . push ( error ) ;
275
257
}
276
258
277
- publishInitial ( ) {
278
- for ( const child of this . _initialResult . children ) {
259
+ publishInitial ( initialResult : InitialResultRecord ) {
260
+ for ( const child of initialResult . children ) {
279
261
if ( child . filtered ) {
280
262
continue ;
281
263
}
282
264
this . _publish ( child ) ;
283
265
}
284
266
}
285
267
286
- filter (
287
- nullPath : Path ,
288
- erroringIncrementalDataRecord : IncrementalDataRecord | undefined ,
289
- ) {
268
+ getInitialErrors (
269
+ initialResult : InitialResultRecord ,
270
+ ) : ReadonlyArray < GraphQLError > {
271
+ return initialResult . errors ;
272
+ }
273
+
274
+ filter ( nullPath : Path , erroringIncrementalDataRecord : IncrementalDataRecord ) {
290
275
const nullPathArray = pathToArray ( nullPath ) ;
291
276
292
277
const asyncIterators = new Set < AsyncIterator < unknown > > ( ) ;
293
278
294
- const children =
295
- erroringIncrementalDataRecord === undefined
296
- ? this . _initialResult . children
297
- : erroringIncrementalDataRecord . children ;
279
+ const descendants = this . _getDescendants (
280
+ erroringIncrementalDataRecord . children ,
281
+ ) ;
298
282
299
- for ( const child of this . _getDescendants ( children ) ) {
283
+ for ( const child of descendants ) {
300
284
if ( ! this . _matchesPath ( child . path , nullPathArray ) ) {
301
285
continue ;
302
286
}
@@ -332,31 +316,31 @@ export class IncrementalPublisher {
332
316
this . _signalled = signalled ;
333
317
}
334
318
335
- private _introduce ( item : IncrementalDataRecord ) {
319
+ private _introduce ( item : SubsequentDataRecord ) {
336
320
this . _pending . add ( item ) ;
337
321
}
338
322
339
- private _release ( item : IncrementalDataRecord ) : void {
323
+ private _release ( item : SubsequentDataRecord ) : void {
340
324
if ( this . _pending . has ( item ) ) {
341
325
this . _released . add ( item ) ;
342
326
this . _trigger ( ) ;
343
327
}
344
328
}
345
329
346
- private _push ( item : IncrementalDataRecord ) : void {
330
+ private _push ( item : SubsequentDataRecord ) : void {
347
331
this . _released . add ( item ) ;
348
332
this . _pending . add ( item ) ;
349
333
this . _trigger ( ) ;
350
334
}
351
335
352
- private _delete ( item : IncrementalDataRecord ) {
336
+ private _delete ( item : SubsequentDataRecord ) {
353
337
this . _released . delete ( item ) ;
354
338
this . _pending . delete ( item ) ;
355
339
this . _trigger ( ) ;
356
340
}
357
341
358
342
private _getIncrementalResult (
359
- completedRecords : ReadonlySet < IncrementalDataRecord > ,
343
+ completedRecords : ReadonlySet < SubsequentDataRecord > ,
360
344
) : SubsequentIncrementalExecutionResult | undefined {
361
345
const incrementalResults : Array < IncrementalResult > = [ ] ;
362
346
let encounteredCompletedAsyncIterator = false ;
@@ -398,18 +382,18 @@ export class IncrementalPublisher {
398
382
: undefined ;
399
383
}
400
384
401
- private _publish ( incrementalDataRecord : IncrementalDataRecord ) {
402
- if ( incrementalDataRecord . isCompleted ) {
403
- this . _push ( incrementalDataRecord ) ;
385
+ private _publish ( subsequentResultRecord : SubsequentDataRecord ) {
386
+ if ( subsequentResultRecord . isCompleted ) {
387
+ this . _push ( subsequentResultRecord ) ;
404
388
} else {
405
- this . _introduce ( incrementalDataRecord ) ;
389
+ this . _introduce ( subsequentResultRecord ) ;
406
390
}
407
391
}
408
392
409
393
private _getDescendants (
410
- children : ReadonlySet < IncrementalDataRecord > ,
411
- descendants = new Set < IncrementalDataRecord > ( ) ,
412
- ) : ReadonlySet < IncrementalDataRecord > {
394
+ children : ReadonlySet < SubsequentDataRecord > ,
395
+ descendants = new Set < SubsequentDataRecord > ( ) ,
396
+ ) : ReadonlySet < SubsequentDataRecord > {
413
397
for ( const child of children ) {
414
398
descendants . add ( child ) ;
415
399
this . _getDescendants ( child . children , descendants ) ;
@@ -431,13 +415,18 @@ export class IncrementalPublisher {
431
415
}
432
416
}
433
417
418
+ export interface InitialResultRecord {
419
+ errors : Array < GraphQLError > ;
420
+ children : Set < SubsequentDataRecord > ;
421
+ }
422
+
434
423
/** @internal */
435
424
export class DeferredFragmentRecord {
436
425
errors : Array < GraphQLError > ;
437
426
label : string | undefined ;
438
427
path : Array < string | number > ;
439
428
data : ObjMap < unknown > | null ;
440
- children : Set < IncrementalDataRecord > ;
429
+ children : Set < SubsequentDataRecord > ;
441
430
isCompleted : boolean ;
442
431
filtered : boolean ;
443
432
constructor ( opts : { label : string | undefined ; path : Path | undefined } ) {
@@ -457,7 +446,7 @@ export class StreamItemsRecord {
457
446
label : string | undefined ;
458
447
path : Array < string | number > ;
459
448
items : Array < unknown > | null ;
460
- children : Set < IncrementalDataRecord > ;
449
+ children : Set < SubsequentDataRecord > ;
461
450
asyncIterator : AsyncIterator < unknown > | undefined ;
462
451
isCompletedAsyncIterator ?: boolean ;
463
452
isCompleted : boolean ;
@@ -479,10 +468,12 @@ export class StreamItemsRecord {
479
468
}
480
469
}
481
470
482
- export type IncrementalDataRecord = DeferredFragmentRecord | StreamItemsRecord ;
471
+ export type SubsequentDataRecord = DeferredFragmentRecord | StreamItemsRecord ;
472
+
473
+ export type IncrementalDataRecord = InitialResultRecord | SubsequentDataRecord ;
483
474
484
475
function isStreamItemsRecord (
485
- incrementalDataRecord : IncrementalDataRecord ,
486
- ) : incrementalDataRecord is StreamItemsRecord {
487
- return incrementalDataRecord instanceof StreamItemsRecord ;
476
+ subsequentResultRecord : SubsequentDataRecord ,
477
+ ) : subsequentResultRecord is StreamItemsRecord {
478
+ return subsequentResultRecord instanceof StreamItemsRecord ;
488
479
}
0 commit comments