@@ -97,34 +97,17 @@ export type FormattedIncrementalResult<
9797 * parents have completed so that they can no longer be filtered. This includes all Incremental 
9898 * Data records in `released`, as well as Incremental Data records that have not yet completed. 
9999 * 
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-  * 
108100 * @internal  
109101 */ 
110102export  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 > ; 
118105
119106  // these are assigned within the Promise executor called synchronously within the constructor 
120107  private  _signalled ! : Promise < unknown > ; 
121108  private  _resolve ! : ( )  =>  void ; 
122109
123110  constructor ( )  { 
124-     this . _initialResult  =  { 
125-       children : new  Set ( ) , 
126-       isCompleted : false , 
127-     } ; 
128111    this . _released  =  new  Set ( ) ; 
129112    this . _pending  =  new  Set ( ) ; 
130113    this . _reset ( ) ; 
@@ -210,19 +193,22 @@ export class IncrementalPublisher {
210193    } ; 
211194  } 
212195
196+   prepareInitialResultRecord ( ) : InitialResultRecord  { 
197+     return  { 
198+       errors : [ ] , 
199+       children : new  Set ( ) , 
200+     } ; 
201+   } 
202+ 
213203  prepareNewDeferredFragmentRecord ( opts : { 
214204    label : string  |  undefined ; 
215205    path : Path  |  undefined ; 
216-     parentContext : IncrementalDataRecord   |   undefined ; 
206+     parentContext : IncrementalDataRecord ; 
217207  } ) : DeferredFragmentRecord  { 
218208    const  deferredFragmentRecord  =  new  DeferredFragmentRecord ( opts ) ; 
219209
220210    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 ) ; 
226212
227213    return  deferredFragmentRecord ; 
228214  } 
@@ -231,16 +217,12 @@ export class IncrementalPublisher {
231217    label : string  |  undefined ; 
232218    path : Path  |  undefined ; 
233219    asyncIterator ?: AsyncIterator < unknown > ; 
234-     parentContext : IncrementalDataRecord   |   undefined ; 
220+     parentContext : IncrementalDataRecord ; 
235221  } ) : StreamItemsRecord  { 
236222    const  streamItemsRecord  =  new  StreamItemsRecord ( opts ) ; 
237223
238224    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 ) ; 
244226
245227    return  streamItemsRecord ; 
246228  } 
@@ -274,36 +256,36 @@ export class IncrementalPublisher {
274256    incrementalDataRecord . errors . push ( error ) ; 
275257  } 
276258
277-   publishInitial ( )  { 
278-     for  ( const  child  of  this . _initialResult . children )  { 
259+   publishInitial ( initialResult : InitialResultRecord )  { 
260+     for  ( const  child  of  initialResult . children )  { 
261+       if  ( child . filtered )  { 
262+         continue ; 
263+       } 
279264      this . _publish ( child ) ; 
280265    } 
281266  } 
282267
283-   filter ( 
284-     nullPath : Path , 
285-     erroringIncrementalDataRecord : IncrementalDataRecord  |  undefined , 
286-   )  { 
268+   getInitialErrors ( 
269+     initialResult : InitialResultRecord , 
270+   ) : ReadonlyArray < GraphQLError >  { 
271+     return  initialResult . errors ; 
272+   } 
273+ 
274+   filter ( nullPath : Path ,  erroringIncrementalDataRecord : IncrementalDataRecord )  { 
287275    const  nullPathArray  =  pathToArray ( nullPath ) ; 
288276
289277    const  asyncIterators  =  new  Set < AsyncIterator < unknown > > ( ) ; 
290278
291-     const  children  = 
292-       erroringIncrementalDataRecord  ===  undefined 
293-         ? this . _initialResult . children 
294-         : erroringIncrementalDataRecord . children ; 
279+     const  descendants  =  this . _getDescendants ( 
280+       erroringIncrementalDataRecord . children , 
281+     ) ; 
295282
296-     for  ( const  child  of  this . _getDescendants ( children ) )  { 
283+     for  ( const  child  of  descendants )  { 
297284      if  ( ! this . _matchesPath ( child . path ,  nullPathArray ) )  { 
298285        continue ; 
299286      } 
300287
301-       this . _delete ( child ) ; 
302-       const  parent  = 
303-         child . parentContext  ===  undefined 
304-           ? this . _initialResult 
305-           : child . parentContext ; 
306-       parent . children . delete ( child ) ; 
288+       child . filtered  =  true ; 
307289
308290      if  ( isStreamItemsRecord ( child ) )  { 
309291        if  ( child . asyncIterator  !==  undefined )  { 
@@ -333,37 +315,34 @@ export class IncrementalPublisher {
333315    this . _signalled  =  signalled ; 
334316  } 
335317
336-   private  _introduce ( item : IncrementalDataRecord )  { 
318+   private  _introduce ( item : SubsequentDataRecord )  { 
337319    this . _pending . add ( item ) ; 
338320  } 
339321
340-   private  _release ( item : IncrementalDataRecord ) : void { 
322+   private  _release ( item : SubsequentDataRecord ) : void { 
341323    if  ( this . _pending . has ( item ) )  { 
342324      this . _released . add ( item ) ; 
343325      this . _trigger ( ) ; 
344326    } 
345327  } 
346328
347-   private  _push ( item : IncrementalDataRecord ) : void { 
329+   private  _push ( item : SubsequentDataRecord ) : void { 
348330    this . _released . add ( item ) ; 
349331    this . _pending . add ( item ) ; 
350332    this . _trigger ( ) ; 
351333  } 
352334
353-   private  _delete ( item : IncrementalDataRecord )  { 
354-     this . _released . delete ( item ) ; 
355-     this . _pending . delete ( item ) ; 
356-     this . _trigger ( ) ; 
357-   } 
358- 
359335  private  _getIncrementalResult ( 
360-     completedRecords : ReadonlySet < IncrementalDataRecord > , 
336+     completedRecords : ReadonlySet < SubsequentDataRecord > , 
361337  ) : SubsequentIncrementalExecutionResult  |  undefined  { 
362338    const  incrementalResults : Array < IncrementalResult >  =  [ ] ; 
363339    let  encounteredCompletedAsyncIterator  =  false ; 
364340    for  ( const  incrementalDataRecord  of  completedRecords )  { 
365341      const  incrementalResult : IncrementalResult  =  { } ; 
366342      for  ( const  child  of  incrementalDataRecord . children )  { 
343+         if  ( child . filtered )  { 
344+           continue ; 
345+         } 
367346        this . _publish ( child ) ; 
368347      } 
369348      if  ( isStreamItemsRecord ( incrementalDataRecord ) )  { 
@@ -396,18 +375,18 @@ export class IncrementalPublisher {
396375      : undefined ; 
397376  } 
398377
399-   private  _publish ( incrementalDataRecord :  IncrementalDataRecord )  { 
400-     if  ( incrementalDataRecord . isCompleted )  { 
401-       this . _push ( incrementalDataRecord ) ; 
378+   private  _publish ( subsequentResultRecord :  SubsequentDataRecord )  { 
379+     if  ( subsequentResultRecord . isCompleted )  { 
380+       this . _push ( subsequentResultRecord ) ; 
402381    }  else  { 
403-       this . _introduce ( incrementalDataRecord ) ; 
382+       this . _introduce ( subsequentResultRecord ) ; 
404383    } 
405384  } 
406385
407386  private  _getDescendants ( 
408-     children : ReadonlySet < IncrementalDataRecord > , 
409-     descendants  =  new  Set < IncrementalDataRecord > ( ) , 
410-   ) : ReadonlySet < IncrementalDataRecord >  { 
387+     children : ReadonlySet < SubsequentDataRecord > , 
388+     descendants  =  new  Set < SubsequentDataRecord > ( ) , 
389+   ) : ReadonlySet < SubsequentDataRecord >  { 
411390    for  ( const  child  of  children )  { 
412391      descendants . add ( child ) ; 
413392      this . _getDescendants ( child . children ,  descendants ) ; 
@@ -429,26 +408,27 @@ export class IncrementalPublisher {
429408  } 
430409} 
431410
411+ export  interface  InitialResultRecord  { 
412+   errors : Array < GraphQLError > ; 
413+   children : Set < SubsequentDataRecord > ; 
414+ } 
415+ 
432416/** @internal  */ 
433417export  class  DeferredFragmentRecord  { 
434418  errors : Array < GraphQLError > ; 
435419  label : string  |  undefined ; 
436420  path : Array < string  |  number > ; 
437421  data : ObjMap < unknown >  |  null ; 
438-   parentContext : IncrementalDataRecord  |  undefined ; 
439-   children : Set < IncrementalDataRecord > ; 
422+   children : Set < SubsequentDataRecord > ; 
440423  isCompleted : boolean ; 
441-   constructor ( opts : { 
442-     label : string  |  undefined ; 
443-     path : Path  |  undefined ; 
444-     parentContext : IncrementalDataRecord  |  undefined ; 
445-   } )  { 
424+   filtered : boolean ; 
425+   constructor ( opts : {  label : string  |  undefined ;  path : Path  |  undefined  } )  { 
446426    this . label  =  opts . label ; 
447427    this . path  =  pathToArray ( opts . path ) ; 
448-     this . parentContext  =  opts . parentContext ; 
449428    this . errors  =  [ ] ; 
450429    this . children  =  new  Set ( ) ; 
451430    this . isCompleted  =  false ; 
431+     this . filtered  =  false ; 
452432    this . data  =  null ; 
453433  } 
454434} 
@@ -459,33 +439,34 @@ export class StreamItemsRecord {
459439  label : string  |  undefined ; 
460440  path : Array < string  |  number > ; 
461441  items : Array < unknown >  |  null ; 
462-   parentContext : IncrementalDataRecord  |  undefined ; 
463-   children : Set < IncrementalDataRecord > ; 
442+   children : Set < SubsequentDataRecord > ; 
464443  asyncIterator : AsyncIterator < unknown >  |  undefined ; 
465444  isCompletedAsyncIterator ?: boolean ; 
466445  isCompleted : boolean ; 
446+   filtered : boolean ; 
467447  constructor ( opts : { 
468448    label : string  |  undefined ; 
469449    path : Path  |  undefined ; 
470450    asyncIterator ?: AsyncIterator < unknown > ; 
471-     parentContext : IncrementalDataRecord  |  undefined ; 
472451  } )  { 
473452    this . items  =  null ; 
474453    this . label  =  opts . label ; 
475454    this . path  =  pathToArray ( opts . path ) ; 
476-     this . parentContext  =  opts . parentContext ; 
477455    this . asyncIterator  =  opts . asyncIterator ; 
478456    this . errors  =  [ ] ; 
479457    this . children  =  new  Set ( ) ; 
480458    this . isCompleted  =  false ; 
459+     this . filtered  =  false ; 
481460    this . items  =  null ; 
482461  } 
483462} 
484463
485- export  type  IncrementalDataRecord  =  DeferredFragmentRecord  |  StreamItemsRecord ; 
464+ export  type  SubsequentDataRecord  =  DeferredFragmentRecord  |  StreamItemsRecord ; 
465+ 
466+ export  type  IncrementalDataRecord  =  InitialResultRecord  |  SubsequentDataRecord ; 
486467
487468function  isStreamItemsRecord ( 
488-   incrementalDataRecord :  IncrementalDataRecord , 
489- ) : incrementalDataRecord  is StreamItemsRecord  { 
490-   return  incrementalDataRecord  instanceof  StreamItemsRecord ; 
469+   subsequentResultRecord :  SubsequentDataRecord , 
470+ ) : subsequentResultRecord  is StreamItemsRecord  { 
471+   return  subsequentResultRecord  instanceof  StreamItemsRecord ; 
491472} 
0 commit comments