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'; }