From 986aac5715965b5907bc21ffa8c60dcfc7c47da1 Mon Sep 17 00:00:00 2001 From: Yaacov Rydzinski Date: Thu, 9 Nov 2023 14:47:05 +0200 Subject: [PATCH 1/2] fix(incremental): fix loop --- src/execution/IncrementalPublisher.ts | 30 +++++++++++++++------------ 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/execution/IncrementalPublisher.ts b/src/execution/IncrementalPublisher.ts index 161c90553c..e8d3b83fd9 100644 --- a/src/execution/IncrementalPublisher.ts +++ b/src/execution/IncrementalPublisher.ts @@ -609,27 +609,31 @@ export class IncrementalPublisher { deferredGroupedFieldSetRecord: DeferredGroupedFieldSetRecord, ): IncrementalDeferResult { const { data, deferredFragmentRecords } = deferredGroupedFieldSetRecord; - let maxLength = deferredFragmentRecords[0].path.length; - let maxIndex = 0; - for (let i = 1; i < deferredFragmentRecords.length; i++) { - const deferredFragmentRecord = deferredFragmentRecords[i]; + let maxLength: number | undefined; + let recordWithLongestPath: DeferredFragmentRecord | undefined; + for (const deferredFragmentRecord of deferredFragmentRecords) { + if (deferredFragmentRecord.id === undefined) { + continue; + } const length = deferredFragmentRecord.path.length; - if (length > maxLength) { + if (maxLength === undefined || length > maxLength) { maxLength = length; - maxIndex = i; + recordWithLongestPath = deferredFragmentRecord; } } - const recordWithLongestPath = deferredFragmentRecords[maxIndex]; - const longestPath = recordWithLongestPath.path; - const subPath = deferredGroupedFieldSetRecord.path.slice( - longestPath.length, - ); - const id = recordWithLongestPath.id; + const subPath = deferredGroupedFieldSetRecord.path.slice(maxLength); + // safe because `id` is always defined once the fragment has been released + // as pending and at least one fragment has been completed, so must have been + // released as pending + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const id = recordWithLongestPath!.id; const incrementalDeferResult: IncrementalDeferResult = { // safe because `data``is always defined when the record is completed // eslint-disable-next-line @typescript-eslint/no-non-null-assertion data: data!, - // safe because `id` is defined once the fragment has been released as pending + // safe because `id` is always defined once the fragment has been released + // as pending and at least one fragment has been completed, so must have been + // released as pending // eslint-disable-next-line @typescript-eslint/no-non-null-assertion id: id!, }; From 969f4173dd7b241c885c5920fd4e7b23961e1e0a Mon Sep 17 00:00:00 2001 From: Yaacov Rydzinski Date: Thu, 9 Nov 2023 21:45:46 +0200 Subject: [PATCH 2/2] integrate suggestion from review --- src/execution/IncrementalPublisher.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/execution/IncrementalPublisher.ts b/src/execution/IncrementalPublisher.ts index e8d3b83fd9..760043c78b 100644 --- a/src/execution/IncrementalPublisher.ts +++ b/src/execution/IncrementalPublisher.ts @@ -610,23 +610,19 @@ export class IncrementalPublisher { ): IncrementalDeferResult { const { data, deferredFragmentRecords } = deferredGroupedFieldSetRecord; let maxLength: number | undefined; - let recordWithLongestPath: DeferredFragmentRecord | undefined; + let idWithLongestPath: string | undefined; for (const deferredFragmentRecord of deferredFragmentRecords) { - if (deferredFragmentRecord.id === undefined) { + const id = deferredFragmentRecord.id; + if (id === undefined) { continue; } const length = deferredFragmentRecord.path.length; if (maxLength === undefined || length > maxLength) { maxLength = length; - recordWithLongestPath = deferredFragmentRecord; + idWithLongestPath = id; } } const subPath = deferredGroupedFieldSetRecord.path.slice(maxLength); - // safe because `id` is always defined once the fragment has been released - // as pending and at least one fragment has been completed, so must have been - // released as pending - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const id = recordWithLongestPath!.id; const incrementalDeferResult: IncrementalDeferResult = { // safe because `data``is always defined when the record is completed // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -635,7 +631,7 @@ export class IncrementalPublisher { // as pending and at least one fragment has been completed, so must have been // released as pending // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - id: id!, + id: idWithLongestPath!, }; if (subPath.length > 0) {