Skip to content

Commit f965bd5

Browse files
committed
optimize setCompletedIterator behavior
1 parent 6c0e52d commit f965bd5

File tree

2 files changed

+19
-62
lines changed

2 files changed

+19
-62
lines changed

src/execution/__tests__/stream-test.ts

Lines changed: 14 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -594,9 +594,6 @@ describe('Execute: stream directive', () => {
594594
path: ['friendList', 2],
595595
},
596596
],
597-
hasNext: true,
598-
},
599-
{
600597
hasNext: false,
601598
},
602599
]);
@@ -634,9 +631,6 @@ describe('Execute: stream directive', () => {
634631
path: ['friendList', 2],
635632
},
636633
],
637-
hasNext: true,
638-
},
639-
{
640634
hasNext: false,
641635
},
642636
]);
@@ -676,7 +670,7 @@ describe('Execute: stream directive', () => {
676670
}
677671
}
678672
`);
679-
const result = await completeAsync(document, 3, {
673+
const result = await completeAsync(document, 2, {
680674
async *friendList() {
681675
yield await Promise.resolve(friends[0]);
682676
yield await Promise.resolve(friends[1]);
@@ -705,10 +699,9 @@ describe('Execute: stream directive', () => {
705699
path: ['friendList', 2],
706700
},
707701
],
708-
hasNext: true,
702+
hasNext: false,
709703
},
710704
},
711-
{ done: false, value: { hasNext: false } },
712705
{ done: true, value: undefined },
713706
]);
714707
});
@@ -1128,9 +1121,6 @@ describe('Execute: stream directive', () => {
11281121
path: ['friendList', 2],
11291122
},
11301123
],
1131-
hasNext: true,
1132-
},
1133-
{
11341124
hasNext: false,
11351125
},
11361126
]);
@@ -1175,9 +1165,6 @@ describe('Execute: stream directive', () => {
11751165
],
11761166
},
11771167
],
1178-
hasNext: true,
1179-
},
1180-
{
11811168
hasNext: false,
11821169
},
11831170
]);
@@ -1246,9 +1233,6 @@ describe('Execute: stream directive', () => {
12461233
],
12471234
},
12481235
],
1249-
hasNext: true,
1250-
},
1251-
{
12521236
hasNext: false,
12531237
},
12541238
]);
@@ -1327,9 +1311,6 @@ describe('Execute: stream directive', () => {
13271311
],
13281312
},
13291313
],
1330-
hasNext: true,
1331-
},
1332-
{
13331314
hasNext: false,
13341315
},
13351316
]);
@@ -1353,25 +1334,19 @@ describe('Execute: stream directive', () => {
13531334
} /* c8 ignore stop */,
13541335
},
13551336
});
1356-
expectJSON(result).toDeepEqual([
1357-
{
1358-
errors: [
1359-
{
1360-
message:
1361-
'Cannot return null for non-nullable field NestedObject.nonNullScalarField.',
1362-
locations: [{ line: 4, column: 11 }],
1363-
path: ['nestedObject', 'nonNullScalarField'],
1364-
},
1365-
],
1366-
data: {
1367-
nestedObject: null,
1337+
expectJSON(result).toDeepEqual({
1338+
errors: [
1339+
{
1340+
message:
1341+
'Cannot return null for non-nullable field NestedObject.nonNullScalarField.',
1342+
locations: [{ line: 4, column: 11 }],
1343+
path: ['nestedObject', 'nonNullScalarField'],
13681344
},
1369-
hasNext: true,
1370-
},
1371-
{
1372-
hasNext: false,
1345+
],
1346+
data: {
1347+
nestedObject: null,
13731348
},
1374-
]);
1349+
});
13751350
});
13761351
it('Filters payloads that are nulled by a later synchronous error', async () => {
13771352
const document = parse(`
@@ -1557,9 +1532,6 @@ describe('Execute: stream directive', () => {
15571532
],
15581533
},
15591534
],
1560-
hasNext: true,
1561-
},
1562-
{
15631535
hasNext: false,
15641536
},
15651537
]);
@@ -1707,9 +1679,6 @@ describe('Execute: stream directive', () => {
17071679
path: ['friendList', 2],
17081680
},
17091681
],
1710-
hasNext: true,
1711-
},
1712-
{
17131682
hasNext: false,
17141683
},
17151684
]);
@@ -1771,9 +1740,6 @@ describe('Execute: stream directive', () => {
17711740
path: ['nestedObject', 'nestedFriendList', 1],
17721741
},
17731742
],
1774-
hasNext: true,
1775-
},
1776-
{
17771743
hasNext: false,
17781744
},
17791745
]);
@@ -1854,17 +1820,12 @@ describe('Execute: stream directive', () => {
18541820
path: ['nestedObject', 'nestedFriendList', 1],
18551821
},
18561822
],
1857-
hasNext: true,
1823+
hasNext: false,
18581824
},
18591825
done: false,
18601826
});
18611827
const result5 = await iterator.next();
18621828
expectJSON(result5).toDeepEqual({
1863-
value: { hasNext: false },
1864-
done: false,
1865-
});
1866-
const result6 = await iterator.next();
1867-
expectJSON(result6).toDeepEqual({
18681829
value: undefined,
18691830
done: true,
18701831
});

src/execution/execute.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2295,12 +2295,12 @@ async function executeStreamAsyncIteratorItem(
22952295
try {
22962296
const iteration = await iterator.next();
22972297
if (!exeContext.streams.has(streamRecord.streamContext)) {
2298-
streamRecord.setIsCompletedIterator();
2298+
streamRecord.remove();
22992299
return { done: true, value: undefined };
23002300
}
23012301
const { value, done } = iteration;
23022302
if (done) {
2303-
streamRecord.setIsCompletedIterator();
2303+
streamRecord.remove();
23042304
return { done, value: undefined };
23052305
}
23062306
item = value;
@@ -2487,10 +2487,6 @@ function getCompletedIncrementalResults(
24872487
exeContext.subsequentPayloads.delete(asyncPayloadRecord);
24882488
if (isStreamPayload(asyncPayloadRecord)) {
24892489
const items = asyncPayloadRecord.items;
2490-
if (asyncPayloadRecord.isCompletedIterator) {
2491-
// async iterable resolver just finished but there may be pending payloads
2492-
continue;
2493-
}
24942490
(incrementalResult as IncrementalStreamResult).items = items ?? null;
24952491
if (asyncPayloadRecord.streamContext.label !== undefined) {
24962492
incrementalResult.label = asyncPayloadRecord.streamContext.label;
@@ -2747,7 +2743,6 @@ class StreamRecord {
27472743
items: Array<unknown> | null;
27482744
promise: Promise<void>;
27492745
parents: Array<AsyncPayloadRecord> | undefined;
2750-
isCompletedIterator?: boolean;
27512746
isCompleted: boolean;
27522747
_exeContext: ExecutionContext;
27532748
_resolve?: (arg: PromiseOrValue<Array<unknown> | null>) => void;
@@ -2785,8 +2780,9 @@ class StreamRecord {
27852780
this._resolve?.(items);
27862781
}
27872782

2788-
setIsCompletedIterator() {
2789-
this.isCompletedIterator = true;
2783+
remove() {
2784+
this._exeContext.subsequentPayloads.delete(this);
2785+
this._resolve?.(null);
27902786
}
27912787
}
27922788

0 commit comments

Comments
 (0)