diff --git a/src/execution/__tests__/stream-test.ts b/src/execution/__tests__/stream-test.ts index aed5211ae1..f9dec10d72 100644 --- a/src/execution/__tests__/stream-test.ts +++ b/src/execution/__tests__/stream-test.ts @@ -531,11 +531,6 @@ describe('Execute: stream directive', () => { }, ], }, - ], - hasNext: true, - }, - { - incremental: [ { items: [{ name: 'Leia', id: '3' }], path: ['friendList', 2], @@ -984,11 +979,6 @@ describe('Execute: stream directive', () => { }, ], }, - ], - hasNext: true, - }, - { - incremental: [ { items: [{ nonNullName: 'Han' }], path: ['friendList', 2], diff --git a/src/execution/execute.ts b/src/execution/execute.ts index 1bc6c4267b..46b5b2dd37 100644 --- a/src/execution/execute.ts +++ b/src/execution/execute.ts @@ -1791,16 +1791,21 @@ function executeDeferredFragment( fields, asyncPayloadRecord, ); - - if (isPromise(promiseOrData)) { - promiseOrData = promiseOrData.then(null, (e) => { - asyncPayloadRecord.errors.push(e); - return null; - }); - } } catch (e) { asyncPayloadRecord.errors.push(e); - promiseOrData = null; + asyncPayloadRecord.addData(null); + return; + } + + if (isPromise(promiseOrData)) { + promiseOrData.then( + (value) => asyncPayloadRecord.addData(value), + (error) => { + asyncPayloadRecord.errors.push(error); + asyncPayloadRecord.addData(null); + }, + ); + return; } asyncPayloadRecord.addData(promiseOrData); } @@ -1823,7 +1828,7 @@ function executeStreamField( exeContext, }); if (isPromise(item)) { - const completedItems = completePromisedValue( + completePromisedValue( exeContext, itemType, fieldNodes, @@ -1832,15 +1837,14 @@ function executeStreamField( item, asyncPayloadRecord, ).then( - (value) => [value], + (value) => asyncPayloadRecord.addItems([value]), (error) => { asyncPayloadRecord.errors.push(error); filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); - return null; + asyncPayloadRecord.addItems(null); }, ); - asyncPayloadRecord.addItems(completedItems); return asyncPayloadRecord; } @@ -1873,7 +1877,7 @@ function executeStreamField( } if (isPromise(completedItem)) { - const completedItems = completedItem + completedItem .then(undefined, (rawError) => { const error = locatedError(rawError, fieldNodes, pathToArray(itemPath)); const handledError = handleFieldError( @@ -1885,15 +1889,14 @@ function executeStreamField( return handledError; }) .then( - (value) => [value], + (value) => asyncPayloadRecord.addItems([value]), (error) => { asyncPayloadRecord.errors.push(error); filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); - return null; + asyncPayloadRecord.addItems(null); }, ); - asyncPayloadRecord.addItems(completedItems); return asyncPayloadRecord; } @@ -2008,22 +2011,19 @@ async function executeStreamIterator( const { done, value: completedItem } = iteration; - let completedItems: PromiseOrValue | null>; if (isPromise(completedItem)) { - completedItems = completedItem.then( - (value) => [value], + completedItem.then( + (resolvedItem) => asyncPayloadRecord.addItems([resolvedItem]), (error) => { asyncPayloadRecord.errors.push(error); filterSubsequentPayloads(exeContext, path, asyncPayloadRecord); - return null; + asyncPayloadRecord.addItems(null); }, ); } else { - completedItems = [completedItem]; + asyncPayloadRecord.addItems([completedItem]); } - asyncPayloadRecord.addItems(completedItems); - if (done) { break; } @@ -2202,7 +2202,7 @@ class DeferredFragmentRecord { }); } - addData(data: PromiseOrValue | null>) { + addData(data: ObjMap | null) { const parentData = this.parentContext?.promise; if (parentData) { this._resolve?.(parentData.then(() => data)); @@ -2253,7 +2253,7 @@ class StreamRecord { }); } - addItems(items: PromiseOrValue | null>) { + addItems(items: Array | null) { const parentData = this.parentContext?.promise; if (parentData) { this._resolve?.(parentData.then(() => items));