Skip to content

Commit 355ca68

Browse files
committed
Simplify collectFields for @defer & @stream
1 parent 2e29180 commit 355ca68

File tree

6 files changed

+334
-469
lines changed

6 files changed

+334
-469
lines changed

src/execution/IncrementalPublisher.ts

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { invariant } from '../jsutils/invariant.js';
12
import type { ObjMap } from '../jsutils/ObjMap.js';
23
import type { Path } from '../jsutils/Path.js';
34
import { pathToArray } from '../jsutils/Path.js';
@@ -8,7 +9,7 @@ import type {
89
GraphQLFormattedError,
910
} from '../error/GraphQLError.js';
1011

11-
import type { GroupedFieldSet } from './collectFields.js';
12+
import type { DeferUsage, GroupedFieldSet } from './collectFields.js';
1213

1314
interface IncrementalUpdate<TData = unknown, TExtensions = ObjMap<unknown>> {
1415
pending: ReadonlyArray<PendingResult>;
@@ -609,16 +610,23 @@ export class IncrementalPublisher {
609610
deferredGroupedFieldSetRecord: DeferredGroupedFieldSetRecord,
610611
): IncrementalDeferResult {
611612
const { data, deferredFragmentRecords } = deferredGroupedFieldSetRecord;
612-
let maxLength = deferredFragmentRecords[0].path.length;
613-
let maxIndex = 0;
614-
for (let i = 1; i < deferredFragmentRecords.length; i++) {
613+
let maxLength;
614+
let maxIndex;
615+
for (let i = 0; i < deferredFragmentRecords.length; i++) {
615616
const deferredFragmentRecord = deferredFragmentRecords[i];
617+
if (deferredFragmentRecord.id == null) {
618+
continue;
619+
}
616620
const length = deferredFragmentRecord.path.length;
617-
if (length > maxLength) {
621+
if (typeof maxLength !== 'number' || length > maxLength) {
618622
maxLength = length;
619623
maxIndex = i;
620624
}
621625
}
626+
invariant(
627+
typeof maxIndex === 'number',
628+
'No id for deferred incremental result',
629+
);
622630
const recordWithLongestPath = deferredFragmentRecords[maxIndex];
623631
const longestPath = recordWithLongestPath.path;
624632
const subPath = deferredGroupedFieldSetRecord.path.slice(
@@ -763,7 +771,6 @@ export class DeferredGroupedFieldSetRecord {
763771
path: ReadonlyArray<string | number>;
764772
deferredFragmentRecords: ReadonlyArray<DeferredFragmentRecord>;
765773
groupedFieldSet: GroupedFieldSet;
766-
shouldInitiateDefer: boolean;
767774
errors: Array<GraphQLError>;
768775
data: ObjMap<unknown> | undefined;
769776
sent: boolean;
@@ -772,12 +779,10 @@ export class DeferredGroupedFieldSetRecord {
772779
path: Path | undefined;
773780
deferredFragmentRecords: ReadonlyArray<DeferredFragmentRecord>;
774781
groupedFieldSet: GroupedFieldSet;
775-
shouldInitiateDefer: boolean;
776782
}) {
777783
this.path = pathToArray(opts.path);
778784
this.deferredFragmentRecords = opts.deferredFragmentRecords;
779785
this.groupedFieldSet = opts.groupedFieldSet;
780-
this.shouldInitiateDefer = opts.shouldInitiateDefer;
781786
this.errors = [];
782787
this.sent = false;
783788
}
@@ -786,6 +791,7 @@ export class DeferredGroupedFieldSetRecord {
786791
/** @internal */
787792
export class DeferredFragmentRecord {
788793
path: ReadonlyArray<string | number>;
794+
deferUsage: DeferUsage;
789795
label: string | undefined;
790796
id: string | undefined;
791797
children: Set<SubsequentResultRecord>;
@@ -795,9 +801,10 @@ export class DeferredFragmentRecord {
795801
pendingSent?: boolean;
796802
_pending: Set<DeferredGroupedFieldSetRecord>;
797803

798-
constructor(opts: { path: Path | undefined; label: string | undefined }) {
804+
constructor(opts: { path: Path | undefined; deferUsage: DeferUsage }) {
799805
this.path = pathToArray(opts.path);
800-
this.label = opts.label;
806+
this.label = opts.deferUsage.label;
807+
this.deferUsage = opts.deferUsage;
801808
this.children = new Set();
802809
this.filtered = false;
803810
this.deferredGroupedFieldSetRecords = new Set();

0 commit comments

Comments
 (0)