@@ -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,23 @@ export class IncrementalPublisher {
210
193
} ;
211
194
}
212
195
196
+ prepareInitialResultRecord ( ) : InitialResultRecord {
197
+ return {
198
+ errors : [ ] ,
199
+ children : new Set ( ) ,
200
+ isCompleted : false ,
201
+ } ;
202
+ }
203
+
213
204
prepareNewDeferredFragmentRecord ( opts : {
214
205
label : string | undefined ;
215
206
path : Path | undefined ;
216
- parentContext : IncrementalDataRecord | undefined ;
207
+ parentContext : IncrementalDataRecord ;
217
208
} ) : DeferredFragmentRecord {
218
209
const deferredFragmentRecord = new DeferredFragmentRecord ( opts ) ;
219
210
220
211
const parentContext = opts . parentContext ;
221
- if ( parentContext ) {
222
- parentContext . children . add ( deferredFragmentRecord ) ;
223
- } else {
224
- this . _initialResult . children . add ( deferredFragmentRecord ) ;
225
- }
212
+ parentContext . children . add ( deferredFragmentRecord ) ;
226
213
227
214
return deferredFragmentRecord ;
228
215
}
@@ -231,16 +218,12 @@ export class IncrementalPublisher {
231
218
label : string | undefined ;
232
219
path : Path | undefined ;
233
220
asyncIterator ?: AsyncIterator < unknown > ;
234
- parentContext : IncrementalDataRecord | undefined ;
221
+ parentContext : IncrementalDataRecord ;
235
222
} ) : StreamItemsRecord {
236
223
const streamItemsRecord = new StreamItemsRecord ( opts ) ;
237
224
238
225
const parentContext = opts . parentContext ;
239
- if ( parentContext ) {
240
- parentContext . children . add ( streamItemsRecord ) ;
241
- } else {
242
- this . _initialResult . children . add ( streamItemsRecord ) ;
243
- }
226
+ parentContext . children . add ( streamItemsRecord ) ;
244
227
245
228
return streamItemsRecord ;
246
229
}
@@ -274,29 +257,31 @@ export class IncrementalPublisher {
274
257
incrementalDataRecord . errors . push ( error ) ;
275
258
}
276
259
277
- publishInitial ( ) {
278
- for ( const child of this . _initialResult . children ) {
260
+ publishInitial ( initialResult : InitialResultRecord ) {
261
+ for ( const child of initialResult . children ) {
279
262
if ( child . filtered ) {
280
263
continue ;
281
264
}
282
265
this . _publish ( child ) ;
283
266
}
284
267
}
285
268
286
- filter (
287
- nullPath : Path ,
288
- erroringIncrementalDataRecord : IncrementalDataRecord | undefined ,
289
- ) {
269
+ getInitialErrors (
270
+ initialResult : InitialResultRecord ,
271
+ ) : ReadonlyArray < GraphQLError > {
272
+ return initialResult . errors ;
273
+ }
274
+
275
+ filter ( nullPath : Path , erroringIncrementalDataRecord : IncrementalDataRecord ) {
290
276
const nullPathArray = pathToArray ( nullPath ) ;
291
277
292
278
const asyncIterators = new Set < AsyncIterator < unknown > > ( ) ;
293
279
294
- const children =
295
- erroringIncrementalDataRecord === undefined
296
- ? this . _initialResult . children
297
- : erroringIncrementalDataRecord . children ;
280
+ const descendants = this . _getDescendants (
281
+ erroringIncrementalDataRecord . children ,
282
+ ) ;
298
283
299
- for ( const child of this . _getDescendants ( children ) ) {
284
+ for ( const child of descendants ) {
300
285
if ( ! this . _matchesPath ( child . path , nullPathArray ) ) {
301
286
continue ;
302
287
}
@@ -332,31 +317,31 @@ export class IncrementalPublisher {
332
317
this . _signalled = signalled ;
333
318
}
334
319
335
- private _introduce ( item : IncrementalDataRecord ) {
320
+ private _introduce ( item : SubsequentDataRecord ) {
336
321
this . _pending . add ( item ) ;
337
322
}
338
323
339
- private _release ( item : IncrementalDataRecord ) : void {
324
+ private _release ( item : SubsequentDataRecord ) : void {
340
325
if ( this . _pending . has ( item ) ) {
341
326
this . _released . add ( item ) ;
342
327
this . _trigger ( ) ;
343
328
}
344
329
}
345
330
346
- private _push ( item : IncrementalDataRecord ) : void {
331
+ private _push ( item : SubsequentDataRecord ) : void {
347
332
this . _released . add ( item ) ;
348
333
this . _pending . add ( item ) ;
349
334
this . _trigger ( ) ;
350
335
}
351
336
352
- private _delete ( item : IncrementalDataRecord ) {
337
+ private _delete ( item : SubsequentDataRecord ) {
353
338
this . _released . delete ( item ) ;
354
339
this . _pending . delete ( item ) ;
355
340
this . _trigger ( ) ;
356
341
}
357
342
358
343
private _getIncrementalResult (
359
- completedRecords : ReadonlySet < IncrementalDataRecord > ,
344
+ completedRecords : ReadonlySet < SubsequentDataRecord > ,
360
345
) : SubsequentIncrementalExecutionResult | undefined {
361
346
const incrementalResults : Array < IncrementalResult > = [ ] ;
362
347
let encounteredCompletedAsyncIterator = false ;
@@ -398,18 +383,18 @@ export class IncrementalPublisher {
398
383
: undefined ;
399
384
}
400
385
401
- private _publish ( incrementalDataRecord : IncrementalDataRecord ) {
402
- if ( incrementalDataRecord . isCompleted ) {
403
- this . _push ( incrementalDataRecord ) ;
386
+ private _publish ( subsequentResultRecord : SubsequentDataRecord ) {
387
+ if ( subsequentResultRecord . isCompleted ) {
388
+ this . _push ( subsequentResultRecord ) ;
404
389
} else {
405
- this . _introduce ( incrementalDataRecord ) ;
390
+ this . _introduce ( subsequentResultRecord ) ;
406
391
}
407
392
}
408
393
409
394
private _getDescendants (
410
- children : ReadonlySet < IncrementalDataRecord > ,
411
- descendants = new Set < IncrementalDataRecord > ( ) ,
412
- ) : ReadonlySet < IncrementalDataRecord > {
395
+ children : ReadonlySet < SubsequentDataRecord > ,
396
+ descendants = new Set < SubsequentDataRecord > ( ) ,
397
+ ) : ReadonlySet < SubsequentDataRecord > {
413
398
for ( const child of children ) {
414
399
descendants . add ( child ) ;
415
400
this . _getDescendants ( child . children , descendants ) ;
@@ -431,13 +416,19 @@ export class IncrementalPublisher {
431
416
}
432
417
}
433
418
419
+ export interface InitialResultRecord {
420
+ errors : Array < GraphQLError > ;
421
+ children : Set < SubsequentDataRecord > ;
422
+ isCompleted : boolean ;
423
+ }
424
+
434
425
/** @internal */
435
426
export class DeferredFragmentRecord {
436
427
errors : Array < GraphQLError > ;
437
428
label : string | undefined ;
438
429
path : Array < string | number > ;
439
430
data : ObjMap < unknown > | null ;
440
- children : Set < IncrementalDataRecord > ;
431
+ children : Set < SubsequentDataRecord > ;
441
432
isCompleted : boolean ;
442
433
filtered : boolean ;
443
434
constructor ( opts : { label : string | undefined ; path : Path | undefined } ) {
@@ -457,7 +448,7 @@ export class StreamItemsRecord {
457
448
label : string | undefined ;
458
449
path : Array < string | number > ;
459
450
items : Array < unknown > | null ;
460
- children : Set < IncrementalDataRecord > ;
451
+ children : Set < SubsequentDataRecord > ;
461
452
asyncIterator : AsyncIterator < unknown > | undefined ;
462
453
isCompletedAsyncIterator ?: boolean ;
463
454
isCompleted : boolean ;
@@ -479,10 +470,12 @@ export class StreamItemsRecord {
479
470
}
480
471
}
481
472
482
- export type IncrementalDataRecord = DeferredFragmentRecord | StreamItemsRecord ;
473
+ export type SubsequentDataRecord = DeferredFragmentRecord | StreamItemsRecord ;
474
+
475
+ export type IncrementalDataRecord = InitialResultRecord | SubsequentDataRecord ;
483
476
484
477
function isStreamItemsRecord (
485
- incrementalDataRecord : IncrementalDataRecord ,
486
- ) : incrementalDataRecord is StreamItemsRecord {
487
- return incrementalDataRecord instanceof StreamItemsRecord ;
478
+ subsequentResultRecord : SubsequentDataRecord ,
479
+ ) : subsequentResultRecord is StreamItemsRecord {
480
+ return subsequentResultRecord instanceof StreamItemsRecord ;
488
481
}
0 commit comments