From dd389318c4216c4d1dd7f6a5ac03da46a544fe9f Mon Sep 17 00:00:00 2001 From: Yaacov Rydzinski Date: Fri, 28 Apr 2023 11:08:34 +0300 Subject: [PATCH 1/5] remove some optionality to parameters --- src/execution/execute.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/execution/execute.ts b/src/execution/execute.ts index df048480ba..01292b1221 100644 --- a/src/execution/execute.ts +++ b/src/execution/execute.ts @@ -640,7 +640,7 @@ function executeFields( sourceValue: unknown, path: Path | undefined, fields: GroupedFieldSet, - asyncPayloadRecord?: AsyncPayloadRecord, + asyncPayloadRecord?: AsyncPayloadRecord | undefined, ): PromiseOrValue> { const results = Object.create(null); let containsPromise = false; @@ -697,7 +697,7 @@ function executeField( source: unknown, fieldGroup: FieldGroup, path: Path, - asyncPayloadRecord?: AsyncPayloadRecord, + asyncPayloadRecord?: AsyncPayloadRecord | undefined, ): PromiseOrValue { const fieldName = fieldGroup[0].name.value; const fieldDef = exeContext.schema.getField(parentType, fieldName); @@ -820,7 +820,7 @@ function handleFieldError( returnType: GraphQLOutputType, fieldGroup: FieldGroup, path: Path, - asyncPayloadRecord?: AsyncPayloadRecord | undefined, + asyncPayloadRecord: AsyncPayloadRecord | undefined, ): void { const error = locatedError(rawError, fieldGroup, pathToArray(path)); @@ -865,7 +865,7 @@ function completeValue( info: GraphQLResolveInfo, path: Path, result: unknown, - asyncPayloadRecord?: AsyncPayloadRecord, + asyncPayloadRecord: AsyncPayloadRecord | undefined, ): PromiseOrValue { // If result is an Error, throw a located error. if (result instanceof Error) { @@ -957,7 +957,7 @@ async function completePromisedValue( info: GraphQLResolveInfo, path: Path, result: Promise, - asyncPayloadRecord?: AsyncPayloadRecord, + asyncPayloadRecord: AsyncPayloadRecord | undefined, ): Promise { try { const resolved = await result; @@ -1056,7 +1056,7 @@ async function completeAsyncIteratorValue( info: GraphQLResolveInfo, path: Path, iterator: AsyncIterator, - asyncPayloadRecord?: AsyncPayloadRecord, + asyncPayloadRecord: AsyncPayloadRecord | undefined, ): Promise> { const stream = getStreamValues(exeContext, fieldGroup, path); let containsPromise = false; @@ -1135,7 +1135,7 @@ function completeListValue( info: GraphQLResolveInfo, path: Path, result: unknown, - asyncPayloadRecord?: AsyncPayloadRecord, + asyncPayloadRecord: AsyncPayloadRecord | undefined, ): PromiseOrValue> { const itemType = returnType.ofType; @@ -1226,7 +1226,7 @@ function completeListItemValue( fieldGroup: FieldGroup, info: GraphQLResolveInfo, itemPath: Path, - asyncPayloadRecord?: AsyncPayloadRecord, + asyncPayloadRecord: AsyncPayloadRecord | undefined, ): boolean { if (isPromise(item)) { completedResults.push( @@ -1322,7 +1322,7 @@ function completeAbstractValue( info: GraphQLResolveInfo, path: Path, result: unknown, - asyncPayloadRecord?: AsyncPayloadRecord, + asyncPayloadRecord: AsyncPayloadRecord | undefined, ): PromiseOrValue> { const resolveTypeFn = returnType.resolveType ?? exeContext.typeResolver; const contextValue = exeContext.contextValue; @@ -1432,7 +1432,7 @@ function completeObjectValue( info: GraphQLResolveInfo, path: Path, result: unknown, - asyncPayloadRecord?: AsyncPayloadRecord, + asyncPayloadRecord: AsyncPayloadRecord | undefined, ): PromiseOrValue> { // If there is an isTypeOf predicate function, call it with the // current result. If isTypeOf returns false, then raise an error rather @@ -1488,7 +1488,7 @@ function collectAndExecuteSubfields( fieldGroup: FieldGroup, path: Path, result: unknown, - asyncPayloadRecord?: AsyncPayloadRecord, + asyncPayloadRecord: AsyncPayloadRecord | undefined, ): PromiseOrValue> { // Collect sub-fields to execute to complete this value. const { groupedFieldSet: subGroupedFieldSet, patches: subPatches } = From c722f039c0b6a22f0a3e56fde70b28463a3c93ff Mon Sep 17 00:00:00 2001 From: Yaacov Rydzinski Date: Fri, 28 Apr 2023 11:13:56 +0300 Subject: [PATCH 2/5] rename fields parameter in executeFieldsSerially to groupedFieldSet to match type --- src/execution/execute.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/execution/execute.ts b/src/execution/execute.ts index 01292b1221..bfec59b508 100644 --- a/src/execution/execute.ts +++ b/src/execution/execute.ts @@ -601,10 +601,10 @@ function executeFieldsSerially( parentType: GraphQLObjectType, sourceValue: unknown, path: Path | undefined, - fields: GroupedFieldSet, + groupedFieldSet: GroupedFieldSet, ): PromiseOrValue> { return promiseReduce( - fields, + groupedFieldSet, (results, [responseName, fieldGroup]) => { const fieldPath = addPath(path, responseName, parentType.name); const result = executeField( From a1ebdc4576ffc17c9bb0a4bc8da169498140f3f0 Mon Sep 17 00:00:00 2001 From: Yaacov Rydzinski Date: Thu, 4 May 2023 17:35:04 +0300 Subject: [PATCH 3/5] rename iterator to asyncIterator --- src/execution/execute.ts | 50 ++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/execution/execute.ts b/src/execution/execute.ts index bfec59b508..9978b35b03 100644 --- a/src/execution/execute.ts +++ b/src/execution/execute.ts @@ -1055,7 +1055,7 @@ async function completeAsyncIteratorValue( fieldGroup: FieldGroup, info: GraphQLResolveInfo, path: Path, - iterator: AsyncIterator, + asyncIterator: AsyncIterator, asyncPayloadRecord: AsyncPayloadRecord | undefined, ): Promise> { const stream = getStreamValues(exeContext, fieldGroup, path); @@ -1072,7 +1072,7 @@ async function completeAsyncIteratorValue( // eslint-disable-next-line @typescript-eslint/no-floating-promises executeStreamAsyncIterator( index, - iterator, + asyncIterator, exeContext, fieldGroup, info, @@ -1088,7 +1088,7 @@ async function completeAsyncIteratorValue( let iteration; try { // eslint-disable-next-line no-await-in-loop - iteration = await iterator.next(); + iteration = await asyncIterator.next(); if (iteration.done) { break; } @@ -1140,7 +1140,7 @@ function completeListValue( const itemType = returnType.ofType; if (isAsyncIterable(result)) { - const iterator = result[Symbol.asyncIterator](); + const asyncIterator = result[Symbol.asyncIterator](); return completeAsyncIteratorValue( exeContext, @@ -1148,7 +1148,7 @@ function completeListValue( fieldGroup, info, path, - iterator, + asyncIterator, asyncPayloadRecord, ); } @@ -1948,7 +1948,7 @@ function executeStreamField( } async function executeStreamAsyncIteratorItem( - iterator: AsyncIterator, + asyncIterator: AsyncIterator, exeContext: ExecutionContext, fieldGroup: FieldGroup, info: GraphQLResolveInfo, @@ -1958,9 +1958,9 @@ async function executeStreamAsyncIteratorItem( ): Promise> { let item; try { - const { value, done } = await iterator.next(); + const { value, done } = await asyncIterator.next(); if (done) { - asyncPayloadRecord.setIsCompletedIterator(); + asyncPayloadRecord.setIsCompletedAsyncIterator(); return { done, value: undefined }; } item = value; @@ -1973,7 +1973,7 @@ async function executeStreamAsyncIteratorItem( itemPath, asyncPayloadRecord, ); - // don't continue if iterator throws + // don't continue if async iterator throws return { done: true, value: null }; } let completedItem; @@ -2019,7 +2019,7 @@ async function executeStreamAsyncIteratorItem( async function executeStreamAsyncIterator( initialIndex: number, - iterator: AsyncIterator, + asyncIterator: AsyncIterator, exeContext: ExecutionContext, fieldGroup: FieldGroup, info: GraphQLResolveInfo, @@ -2037,7 +2037,7 @@ async function executeStreamAsyncIterator( label, path: itemPath, parentContext: previousAsyncPayloadRecord, - iterator, + asyncIterator, exeContext, }); @@ -2045,7 +2045,7 @@ async function executeStreamAsyncIterator( try { // eslint-disable-next-line no-await-in-loop iteration = await executeStreamAsyncIteratorItem( - iterator, + asyncIterator, exeContext, fieldGroup, info, @@ -2058,8 +2058,8 @@ async function executeStreamAsyncIterator( filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); asyncPayloadRecord.addItems(null); // entire stream has errored and bubbled upwards - if (iterator?.return) { - iterator.return().catch(() => { + if (asyncIterator?.return) { + asyncIterator.return().catch(() => { // ignore errors }); } @@ -2110,8 +2110,8 @@ function filterSubsequentPayloads( } } // asyncRecord path points to nulled error field - if (isStreamPayload(asyncRecord) && asyncRecord.iterator?.return) { - asyncRecord.iterator.return().catch(() => { + if (isStreamPayload(asyncRecord) && asyncRecord.asyncIterator?.return) { + asyncRecord.asyncIterator.return().catch(() => { // ignore error }); } @@ -2131,7 +2131,7 @@ function getCompletedIncrementalResults( exeContext.subsequentPayloads.delete(asyncPayloadRecord); if (isStreamPayload(asyncPayloadRecord)) { const items = asyncPayloadRecord.items; - if (asyncPayloadRecord.isCompletedIterator) { + if (asyncPayloadRecord.isCompletedAsyncIterator) { // async iterable resolver just finished but there may be pending payloads continue; } @@ -2196,9 +2196,9 @@ function yieldSubsequentPayloads( exeContext.subsequentPayloads.forEach((asyncPayloadRecord) => { if ( isStreamPayload(asyncPayloadRecord) && - asyncPayloadRecord.iterator?.return + asyncPayloadRecord.asyncIterator?.return ) { - promises.push(asyncPayloadRecord.iterator.return()); + promises.push(asyncPayloadRecord.asyncIterator.return()); } }); return Promise.all(promises); @@ -2280,15 +2280,15 @@ class StreamRecord { items: Array | null; promise: Promise; parentContext: AsyncPayloadRecord | undefined; - iterator: AsyncIterator | undefined; - isCompletedIterator?: boolean; + asyncIterator: AsyncIterator | undefined; + isCompletedAsyncIterator?: boolean; isCompleted: boolean; _exeContext: ExecutionContext; _resolve?: (arg: PromiseOrValue | null>) => void; constructor(opts: { label: string | undefined; path: Path | undefined; - iterator?: AsyncIterator; + asyncIterator?: AsyncIterator; parentContext: AsyncPayloadRecord | undefined; exeContext: ExecutionContext; }) { @@ -2297,7 +2297,7 @@ class StreamRecord { this.label = opts.label; this.path = pathToArray(opts.path); this.parentContext = opts.parentContext; - this.iterator = opts.iterator; + this.asyncIterator = opts.asyncIterator; this.errors = []; this._exeContext = opts.exeContext; this._exeContext.subsequentPayloads.add(this); @@ -2322,8 +2322,8 @@ class StreamRecord { this._resolve?.(items); } - setIsCompletedIterator() { - this.isCompletedIterator = true; + setIsCompletedAsyncIterator() { + this.isCompletedAsyncIterator = true; } } From 209a4c8d3aa747d7d033602e606b18ef83f8e693 Mon Sep 17 00:00:00 2001 From: Yaacov Rydzinski Date: Thu, 4 May 2023 17:29:09 +0300 Subject: [PATCH 4/5] rename StreamRecord to StreamItemsRecord --- src/execution/execute.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/execution/execute.ts b/src/execution/execute.ts index 9978b35b03..99939ac670 100644 --- a/src/execution/execute.ts +++ b/src/execution/execute.ts @@ -1857,7 +1857,7 @@ function executeStreamField( label?: string, parentContext?: AsyncPayloadRecord, ): AsyncPayloadRecord { - const asyncPayloadRecord = new StreamRecord({ + const asyncPayloadRecord = new StreamItemsRecord({ label, path: itemPath, parentContext, @@ -1953,7 +1953,7 @@ async function executeStreamAsyncIteratorItem( fieldGroup: FieldGroup, info: GraphQLResolveInfo, itemType: GraphQLOutputType, - asyncPayloadRecord: StreamRecord, + asyncPayloadRecord: StreamItemsRecord, itemPath: Path, ): Promise> { let item; @@ -2033,7 +2033,7 @@ async function executeStreamAsyncIterator( // eslint-disable-next-line no-constant-condition while (true) { const itemPath = addPath(path, index, undefined); - const asyncPayloadRecord = new StreamRecord({ + const asyncPayloadRecord = new StreamItemsRecord({ label, path: itemPath, parentContext: previousAsyncPayloadRecord, @@ -2110,7 +2110,7 @@ function filterSubsequentPayloads( } } // asyncRecord path points to nulled error field - if (isStreamPayload(asyncRecord) && asyncRecord.asyncIterator?.return) { + if (isStreamItemsRecord(asyncRecord) && asyncRecord.asyncIterator?.return) { asyncRecord.asyncIterator.return().catch(() => { // ignore error }); @@ -2129,7 +2129,7 @@ function getCompletedIncrementalResults( continue; } exeContext.subsequentPayloads.delete(asyncPayloadRecord); - if (isStreamPayload(asyncPayloadRecord)) { + if (isStreamItemsRecord(asyncPayloadRecord)) { const items = asyncPayloadRecord.items; if (asyncPayloadRecord.isCompletedAsyncIterator) { // async iterable resolver just finished but there may be pending payloads @@ -2195,7 +2195,7 @@ function yieldSubsequentPayloads( const promises: Array>> = []; exeContext.subsequentPayloads.forEach((asyncPayloadRecord) => { if ( - isStreamPayload(asyncPayloadRecord) && + isStreamItemsRecord(asyncPayloadRecord) && asyncPayloadRecord.asyncIterator?.return ) { promises.push(asyncPayloadRecord.asyncIterator.return()); @@ -2272,7 +2272,7 @@ class DeferredFragmentRecord { } } -class StreamRecord { +class StreamItemsRecord { type: 'stream'; errors: Array; label: string | undefined; @@ -2327,10 +2327,10 @@ class StreamRecord { } } -type AsyncPayloadRecord = DeferredFragmentRecord | StreamRecord; +type AsyncPayloadRecord = DeferredFragmentRecord | StreamItemsRecord; -function isStreamPayload( +function isStreamItemsRecord( asyncPayload: AsyncPayloadRecord, -): asyncPayload is StreamRecord { +): asyncPayload is StreamItemsRecord { return asyncPayload.type === 'stream'; } From 66af66d911654e320d93d678fdaf85ed4cd92d56 Mon Sep 17 00:00:00 2001 From: Yaacov Rydzinski Date: Fri, 5 May 2023 17:41:46 +0300 Subject: [PATCH 5/5] rename AsyncPayloadRecord to IncrementalDataRecord --- src/execution/execute.ts | 261 ++++++++++++++++++++------------------- 1 file changed, 132 insertions(+), 129 deletions(-) diff --git a/src/execution/execute.ts b/src/execution/execute.ts index 99939ac670..8c3df9f265 100644 --- a/src/execution/execute.ts +++ b/src/execution/execute.ts @@ -121,7 +121,7 @@ export interface ExecutionContext { typeResolver: GraphQLTypeResolver; subscribeFieldResolver: GraphQLFieldResolver; errors: Array; - subsequentPayloads: Set; + subsequentPayloads: Set; } /** @@ -640,7 +640,7 @@ function executeFields( sourceValue: unknown, path: Path | undefined, fields: GroupedFieldSet, - asyncPayloadRecord?: AsyncPayloadRecord | undefined, + incrementalDataRecord?: IncrementalDataRecord | undefined, ): PromiseOrValue> { const results = Object.create(null); let containsPromise = false; @@ -654,7 +654,7 @@ function executeFields( sourceValue, fieldGroup, fieldPath, - asyncPayloadRecord, + incrementalDataRecord, ); if (result !== undefined) { @@ -697,7 +697,7 @@ function executeField( source: unknown, fieldGroup: FieldGroup, path: Path, - asyncPayloadRecord?: AsyncPayloadRecord | undefined, + incrementalDataRecord?: IncrementalDataRecord | undefined, ): PromiseOrValue { const fieldName = fieldGroup[0].name.value; const fieldDef = exeContext.schema.getField(parentType, fieldName); @@ -742,7 +742,7 @@ function executeField( info, path, result, - asyncPayloadRecord, + incrementalDataRecord, ); } @@ -753,7 +753,7 @@ function executeField( info, path, result, - asyncPayloadRecord, + incrementalDataRecord, ); if (isPromise(completed)) { @@ -766,9 +766,9 @@ function executeField( returnType, fieldGroup, path, - asyncPayloadRecord, + incrementalDataRecord, ); - filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); + filterSubsequentPayloads(exeContext, path, incrementalDataRecord); return null; }); } @@ -780,9 +780,9 @@ function executeField( returnType, fieldGroup, path, - asyncPayloadRecord, + incrementalDataRecord, ); - filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); + filterSubsequentPayloads(exeContext, path, incrementalDataRecord); return null; } } @@ -820,7 +820,7 @@ function handleFieldError( returnType: GraphQLOutputType, fieldGroup: FieldGroup, path: Path, - asyncPayloadRecord: AsyncPayloadRecord | undefined, + incrementalDataRecord: IncrementalDataRecord | undefined, ): void { const error = locatedError(rawError, fieldGroup, pathToArray(path)); @@ -830,7 +830,7 @@ function handleFieldError( throw error; } - const errors = asyncPayloadRecord?.errors ?? exeContext.errors; + const errors = incrementalDataRecord?.errors ?? exeContext.errors; // Otherwise, error protection is applied, logging the error and resolving // a null value for this field if one is encountered. @@ -865,7 +865,7 @@ function completeValue( info: GraphQLResolveInfo, path: Path, result: unknown, - asyncPayloadRecord: AsyncPayloadRecord | undefined, + incrementalDataRecord: IncrementalDataRecord | undefined, ): PromiseOrValue { // If result is an Error, throw a located error. if (result instanceof Error) { @@ -882,7 +882,7 @@ function completeValue( info, path, result, - asyncPayloadRecord, + incrementalDataRecord, ); if (completed === null) { throw new Error( @@ -906,7 +906,7 @@ function completeValue( info, path, result, - asyncPayloadRecord, + incrementalDataRecord, ); } @@ -926,7 +926,7 @@ function completeValue( info, path, result, - asyncPayloadRecord, + incrementalDataRecord, ); } @@ -939,7 +939,7 @@ function completeValue( info, path, result, - asyncPayloadRecord, + incrementalDataRecord, ); } /* c8 ignore next 6 */ @@ -957,7 +957,7 @@ async function completePromisedValue( info: GraphQLResolveInfo, path: Path, result: Promise, - asyncPayloadRecord: AsyncPayloadRecord | undefined, + incrementalDataRecord: IncrementalDataRecord | undefined, ): Promise { try { const resolved = await result; @@ -968,7 +968,7 @@ async function completePromisedValue( info, path, resolved, - asyncPayloadRecord, + incrementalDataRecord, ); if (isPromise(completed)) { completed = await completed; @@ -981,9 +981,9 @@ async function completePromisedValue( returnType, fieldGroup, path, - asyncPayloadRecord, + incrementalDataRecord, ); - filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); + filterSubsequentPayloads(exeContext, path, incrementalDataRecord); return null; } } @@ -1056,7 +1056,7 @@ async function completeAsyncIteratorValue( info: GraphQLResolveInfo, path: Path, asyncIterator: AsyncIterator, - asyncPayloadRecord: AsyncPayloadRecord | undefined, + incrementalDataRecord: IncrementalDataRecord | undefined, ): Promise> { const stream = getStreamValues(exeContext, fieldGroup, path); let containsPromise = false; @@ -1079,7 +1079,7 @@ async function completeAsyncIteratorValue( itemType, path, stream.label, - asyncPayloadRecord, + incrementalDataRecord, ); break; } @@ -1099,7 +1099,7 @@ async function completeAsyncIteratorValue( itemType, fieldGroup, itemPath, - asyncPayloadRecord, + incrementalDataRecord, ); completedResults.push(null); break; @@ -1114,7 +1114,7 @@ async function completeAsyncIteratorValue( fieldGroup, info, itemPath, - asyncPayloadRecord, + incrementalDataRecord, ) ) { containsPromise = true; @@ -1135,7 +1135,7 @@ function completeListValue( info: GraphQLResolveInfo, path: Path, result: unknown, - asyncPayloadRecord: AsyncPayloadRecord | undefined, + incrementalDataRecord: IncrementalDataRecord | undefined, ): PromiseOrValue> { const itemType = returnType.ofType; @@ -1149,7 +1149,7 @@ function completeListValue( info, path, asyncIterator, - asyncPayloadRecord, + incrementalDataRecord, ); } @@ -1164,7 +1164,7 @@ function completeListValue( // This is specified as a simple map, however we're optimizing the path // where the list contains no Promises by avoiding creating another Promise. let containsPromise = false; - let previousAsyncPayloadRecord = asyncPayloadRecord; + let previousIncrementalDataRecord = incrementalDataRecord; const completedResults: Array = []; let index = 0; for (const item of result) { @@ -1177,7 +1177,7 @@ function completeListValue( typeof stream.initialCount === 'number' && index >= stream.initialCount ) { - previousAsyncPayloadRecord = executeStreamField( + previousIncrementalDataRecord = executeStreamField( path, itemPath, item, @@ -1186,7 +1186,7 @@ function completeListValue( info, itemType, stream.label, - previousAsyncPayloadRecord, + previousIncrementalDataRecord, ); index++; continue; @@ -1201,7 +1201,7 @@ function completeListValue( fieldGroup, info, itemPath, - asyncPayloadRecord, + incrementalDataRecord, ) ) { containsPromise = true; @@ -1226,7 +1226,7 @@ function completeListItemValue( fieldGroup: FieldGroup, info: GraphQLResolveInfo, itemPath: Path, - asyncPayloadRecord: AsyncPayloadRecord | undefined, + incrementalDataRecord: IncrementalDataRecord | undefined, ): boolean { if (isPromise(item)) { completedResults.push( @@ -1237,7 +1237,7 @@ function completeListItemValue( info, itemPath, item, - asyncPayloadRecord, + incrementalDataRecord, ), ); @@ -1252,7 +1252,7 @@ function completeListItemValue( info, itemPath, item, - asyncPayloadRecord, + incrementalDataRecord, ); if (isPromise(completedItem)) { @@ -1266,9 +1266,9 @@ function completeListItemValue( itemType, fieldGroup, itemPath, - asyncPayloadRecord, + incrementalDataRecord, ); - filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); + filterSubsequentPayloads(exeContext, itemPath, incrementalDataRecord); return null; }), ); @@ -1284,9 +1284,9 @@ function completeListItemValue( itemType, fieldGroup, itemPath, - asyncPayloadRecord, + incrementalDataRecord, ); - filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); + filterSubsequentPayloads(exeContext, itemPath, incrementalDataRecord); completedResults.push(null); } @@ -1322,7 +1322,7 @@ function completeAbstractValue( info: GraphQLResolveInfo, path: Path, result: unknown, - asyncPayloadRecord: AsyncPayloadRecord | undefined, + incrementalDataRecord: IncrementalDataRecord | undefined, ): PromiseOrValue> { const resolveTypeFn = returnType.resolveType ?? exeContext.typeResolver; const contextValue = exeContext.contextValue; @@ -1344,7 +1344,7 @@ function completeAbstractValue( info, path, result, - asyncPayloadRecord, + incrementalDataRecord, ), ); } @@ -1363,7 +1363,7 @@ function completeAbstractValue( info, path, result, - asyncPayloadRecord, + incrementalDataRecord, ); } @@ -1432,7 +1432,7 @@ function completeObjectValue( info: GraphQLResolveInfo, path: Path, result: unknown, - asyncPayloadRecord: AsyncPayloadRecord | undefined, + incrementalDataRecord: IncrementalDataRecord | undefined, ): PromiseOrValue> { // If there is an isTypeOf predicate function, call it with the // current result. If isTypeOf returns false, then raise an error rather @@ -1451,7 +1451,7 @@ function completeObjectValue( fieldGroup, path, result, - asyncPayloadRecord, + incrementalDataRecord, ); }); } @@ -1467,7 +1467,7 @@ function completeObjectValue( fieldGroup, path, result, - asyncPayloadRecord, + incrementalDataRecord, ); } @@ -1488,7 +1488,7 @@ function collectAndExecuteSubfields( fieldGroup: FieldGroup, path: Path, result: unknown, - asyncPayloadRecord: AsyncPayloadRecord | undefined, + incrementalDataRecord: IncrementalDataRecord | undefined, ): PromiseOrValue> { // Collect sub-fields to execute to complete this value. const { groupedFieldSet: subGroupedFieldSet, patches: subPatches } = @@ -1500,7 +1500,7 @@ function collectAndExecuteSubfields( result, path, subGroupedFieldSet, - asyncPayloadRecord, + incrementalDataRecord, ); for (const subPatch of subPatches) { @@ -1512,7 +1512,7 @@ function collectAndExecuteSubfields( subPatchGroupedFieldSet, label, path, - asyncPayloadRecord, + incrementalDataRecord, ); } @@ -1814,9 +1814,9 @@ function executeDeferredFragment( fields: GroupedFieldSet, label?: string, path?: Path, - parentContext?: AsyncPayloadRecord, + parentContext?: IncrementalDataRecord, ): void { - const asyncPayloadRecord = new DeferredFragmentRecord({ + const incrementalDataRecord = new DeferredFragmentRecord({ label, path, parentContext, @@ -1830,20 +1830,20 @@ function executeDeferredFragment( sourceValue, path, fields, - asyncPayloadRecord, + incrementalDataRecord, ); if (isPromise(promiseOrData)) { promiseOrData = promiseOrData.then(null, (e) => { - asyncPayloadRecord.errors.push(e); + incrementalDataRecord.errors.push(e); return null; }); } } catch (e) { - asyncPayloadRecord.errors.push(e); + incrementalDataRecord.errors.push(e); promiseOrData = null; } - asyncPayloadRecord.addData(promiseOrData); + incrementalDataRecord.addData(promiseOrData); } function executeStreamField( @@ -1855,9 +1855,9 @@ function executeStreamField( info: GraphQLResolveInfo, itemType: GraphQLOutputType, label?: string, - parentContext?: AsyncPayloadRecord, -): AsyncPayloadRecord { - const asyncPayloadRecord = new StreamItemsRecord({ + parentContext?: IncrementalDataRecord, +): IncrementalDataRecord { + const incrementalDataRecord = new StreamItemsRecord({ label, path: itemPath, parentContext, @@ -1871,18 +1871,18 @@ function executeStreamField( info, itemPath, item, - asyncPayloadRecord, + incrementalDataRecord, ).then( (value) => [value], (error) => { - asyncPayloadRecord.errors.push(error); - filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); + incrementalDataRecord.errors.push(error); + filterSubsequentPayloads(exeContext, path, incrementalDataRecord); return null; }, ); - asyncPayloadRecord.addItems(completedItems); - return asyncPayloadRecord; + incrementalDataRecord.addItems(completedItems); + return incrementalDataRecord; } let completedItem: PromiseOrValue; @@ -1895,7 +1895,7 @@ function executeStreamField( info, itemPath, item, - asyncPayloadRecord, + incrementalDataRecord, ); } catch (rawError) { handleFieldError( @@ -1904,16 +1904,16 @@ function executeStreamField( itemType, fieldGroup, itemPath, - asyncPayloadRecord, + incrementalDataRecord, ); completedItem = null; - filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); + filterSubsequentPayloads(exeContext, itemPath, incrementalDataRecord); } } catch (error) { - asyncPayloadRecord.errors.push(error); - filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); - asyncPayloadRecord.addItems(null); - return asyncPayloadRecord; + incrementalDataRecord.errors.push(error); + filterSubsequentPayloads(exeContext, path, incrementalDataRecord); + incrementalDataRecord.addItems(null); + return incrementalDataRecord; } if (isPromise(completedItem)) { @@ -1925,26 +1925,26 @@ function executeStreamField( itemType, fieldGroup, itemPath, - asyncPayloadRecord, + incrementalDataRecord, ); - filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); + filterSubsequentPayloads(exeContext, itemPath, incrementalDataRecord); return null; }) .then( (value) => [value], (error) => { - asyncPayloadRecord.errors.push(error); - filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); + incrementalDataRecord.errors.push(error); + filterSubsequentPayloads(exeContext, path, incrementalDataRecord); return null; }, ); - asyncPayloadRecord.addItems(completedItems); - return asyncPayloadRecord; + incrementalDataRecord.addItems(completedItems); + return incrementalDataRecord; } - asyncPayloadRecord.addItems([completedItem]); - return asyncPayloadRecord; + incrementalDataRecord.addItems([completedItem]); + return incrementalDataRecord; } async function executeStreamAsyncIteratorItem( @@ -1953,14 +1953,14 @@ async function executeStreamAsyncIteratorItem( fieldGroup: FieldGroup, info: GraphQLResolveInfo, itemType: GraphQLOutputType, - asyncPayloadRecord: StreamItemsRecord, + incrementalDataRecord: StreamItemsRecord, itemPath: Path, ): Promise> { let item; try { const { value, done } = await asyncIterator.next(); if (done) { - asyncPayloadRecord.setIsCompletedAsyncIterator(); + incrementalDataRecord.setIsCompletedAsyncIterator(); return { done, value: undefined }; } item = value; @@ -1971,7 +1971,7 @@ async function executeStreamAsyncIteratorItem( itemType, fieldGroup, itemPath, - asyncPayloadRecord, + incrementalDataRecord, ); // don't continue if async iterator throws return { done: true, value: null }; @@ -1985,7 +1985,7 @@ async function executeStreamAsyncIteratorItem( info, itemPath, item, - asyncPayloadRecord, + incrementalDataRecord, ); if (isPromise(completedItem)) { @@ -1996,9 +1996,9 @@ async function executeStreamAsyncIteratorItem( itemType, fieldGroup, itemPath, - asyncPayloadRecord, + incrementalDataRecord, ); - filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); + filterSubsequentPayloads(exeContext, itemPath, incrementalDataRecord); return null; }); } @@ -2010,9 +2010,9 @@ async function executeStreamAsyncIteratorItem( itemType, fieldGroup, itemPath, - asyncPayloadRecord, + incrementalDataRecord, ); - filterSubsequentPayloads(exeContext, itemPath, asyncPayloadRecord); + filterSubsequentPayloads(exeContext, itemPath, incrementalDataRecord); return { done: false, value: null }; } } @@ -2026,17 +2026,17 @@ async function executeStreamAsyncIterator( itemType: GraphQLOutputType, path: Path, label?: string, - parentContext?: AsyncPayloadRecord, + parentContext?: IncrementalDataRecord, ): Promise { let index = initialIndex; - let previousAsyncPayloadRecord = parentContext ?? undefined; + let previousIncrementalDataRecord = parentContext ?? undefined; // eslint-disable-next-line no-constant-condition while (true) { const itemPath = addPath(path, index, undefined); - const asyncPayloadRecord = new StreamItemsRecord({ + const incrementalDataRecord = new StreamItemsRecord({ label, path: itemPath, - parentContext: previousAsyncPayloadRecord, + parentContext: previousIncrementalDataRecord, asyncIterator, exeContext, }); @@ -2050,13 +2050,13 @@ async function executeStreamAsyncIterator( fieldGroup, info, itemType, - asyncPayloadRecord, + incrementalDataRecord, itemPath, ); } catch (error) { - asyncPayloadRecord.errors.push(error); - filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); - asyncPayloadRecord.addItems(null); + incrementalDataRecord.errors.push(error); + filterSubsequentPayloads(exeContext, path, incrementalDataRecord); + incrementalDataRecord.addItems(null); // entire stream has errored and bubbled upwards if (asyncIterator?.return) { asyncIterator.return().catch(() => { @@ -2073,8 +2073,8 @@ async function executeStreamAsyncIterator( completedItems = completedItem.then( (value) => [value], (error) => { - asyncPayloadRecord.errors.push(error); - filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); + incrementalDataRecord.errors.push(error); + filterSubsequentPayloads(exeContext, path, incrementalDataRecord); return null; }, ); @@ -2082,12 +2082,12 @@ async function executeStreamAsyncIterator( completedItems = [completedItem]; } - asyncPayloadRecord.addItems(completedItems); + incrementalDataRecord.addItems(completedItems); if (done) { break; } - previousAsyncPayloadRecord = asyncPayloadRecord; + previousIncrementalDataRecord = incrementalDataRecord; index++; } } @@ -2095,27 +2095,30 @@ async function executeStreamAsyncIterator( function filterSubsequentPayloads( exeContext: ExecutionContext, nullPath: Path, - currentAsyncRecord: AsyncPayloadRecord | undefined, + currentIncrementalDataRecord: IncrementalDataRecord | undefined, ): void { const nullPathArray = pathToArray(nullPath); - exeContext.subsequentPayloads.forEach((asyncRecord) => { - if (asyncRecord === currentAsyncRecord) { + exeContext.subsequentPayloads.forEach((incrementalDataRecord) => { + if (incrementalDataRecord === currentIncrementalDataRecord) { // don't remove payload from where error originates return; } for (let i = 0; i < nullPathArray.length; i++) { - if (asyncRecord.path[i] !== nullPathArray[i]) { - // asyncRecord points to a path unaffected by this payload + if (incrementalDataRecord.path[i] !== nullPathArray[i]) { + // incrementalDataRecord points to a path unaffected by this payload return; } } - // asyncRecord path points to nulled error field - if (isStreamItemsRecord(asyncRecord) && asyncRecord.asyncIterator?.return) { - asyncRecord.asyncIterator.return().catch(() => { + // incrementalDataRecord path points to nulled error field + if ( + isStreamItemsRecord(incrementalDataRecord) && + incrementalDataRecord.asyncIterator?.return + ) { + incrementalDataRecord.asyncIterator.return().catch(() => { // ignore error }); } - exeContext.subsequentPayloads.delete(asyncRecord); + exeContext.subsequentPayloads.delete(incrementalDataRecord); }); } @@ -2123,30 +2126,30 @@ function getCompletedIncrementalResults( exeContext: ExecutionContext, ): Array { const incrementalResults: Array = []; - for (const asyncPayloadRecord of exeContext.subsequentPayloads) { + for (const incrementalDataRecord of exeContext.subsequentPayloads) { const incrementalResult: IncrementalResult = {}; - if (!asyncPayloadRecord.isCompleted) { + if (!incrementalDataRecord.isCompleted) { continue; } - exeContext.subsequentPayloads.delete(asyncPayloadRecord); - if (isStreamItemsRecord(asyncPayloadRecord)) { - const items = asyncPayloadRecord.items; - if (asyncPayloadRecord.isCompletedAsyncIterator) { + exeContext.subsequentPayloads.delete(incrementalDataRecord); + if (isStreamItemsRecord(incrementalDataRecord)) { + const items = incrementalDataRecord.items; + if (incrementalDataRecord.isCompletedAsyncIterator) { // async iterable resolver just finished but there may be pending payloads continue; } (incrementalResult as IncrementalStreamResult).items = items; } else { - const data = asyncPayloadRecord.data; + const data = incrementalDataRecord.data; (incrementalResult as IncrementalDeferResult).data = data ?? null; } - incrementalResult.path = asyncPayloadRecord.path; - if (asyncPayloadRecord.label != null) { - incrementalResult.label = asyncPayloadRecord.label; + incrementalResult.path = incrementalDataRecord.path; + if (incrementalDataRecord.label != null) { + incrementalResult.label = incrementalDataRecord.label; } - if (asyncPayloadRecord.errors.length > 0) { - incrementalResult.errors = asyncPayloadRecord.errors; + if (incrementalDataRecord.errors.length > 0) { + incrementalResult.errors = incrementalDataRecord.errors; } incrementalResults.push(incrementalResult); } @@ -2193,12 +2196,12 @@ function yieldSubsequentPayloads( function returnStreamIterators() { const promises: Array>> = []; - exeContext.subsequentPayloads.forEach((asyncPayloadRecord) => { + exeContext.subsequentPayloads.forEach((incrementalDataRecord) => { if ( - isStreamItemsRecord(asyncPayloadRecord) && - asyncPayloadRecord.asyncIterator?.return + isStreamItemsRecord(incrementalDataRecord) && + incrementalDataRecord.asyncIterator?.return ) { - promises.push(asyncPayloadRecord.asyncIterator.return()); + promises.push(incrementalDataRecord.asyncIterator.return()); } }); return Promise.all(promises); @@ -2233,14 +2236,14 @@ class DeferredFragmentRecord { path: Array; promise: Promise; data: ObjMap | null; - parentContext: AsyncPayloadRecord | undefined; + parentContext: IncrementalDataRecord | undefined; isCompleted: boolean; _exeContext: ExecutionContext; _resolve?: (arg: PromiseOrValue | null>) => void; constructor(opts: { label: string | undefined; path: Path | undefined; - parentContext: AsyncPayloadRecord | undefined; + parentContext: IncrementalDataRecord | undefined; exeContext: ExecutionContext; }) { this.type = 'defer'; @@ -2279,7 +2282,7 @@ class StreamItemsRecord { path: Array; items: Array | null; promise: Promise; - parentContext: AsyncPayloadRecord | undefined; + parentContext: IncrementalDataRecord | undefined; asyncIterator: AsyncIterator | undefined; isCompletedAsyncIterator?: boolean; isCompleted: boolean; @@ -2289,7 +2292,7 @@ class StreamItemsRecord { label: string | undefined; path: Path | undefined; asyncIterator?: AsyncIterator; - parentContext: AsyncPayloadRecord | undefined; + parentContext: IncrementalDataRecord | undefined; exeContext: ExecutionContext; }) { this.type = 'stream'; @@ -2327,10 +2330,10 @@ class StreamItemsRecord { } } -type AsyncPayloadRecord = DeferredFragmentRecord | StreamItemsRecord; +type IncrementalDataRecord = DeferredFragmentRecord | StreamItemsRecord; function isStreamItemsRecord( - asyncPayload: AsyncPayloadRecord, -): asyncPayload is StreamItemsRecord { - return asyncPayload.type === 'stream'; + incrementalDataRecord: IncrementalDataRecord, +): incrementalDataRecord is StreamItemsRecord { + return incrementalDataRecord.type === 'stream'; }