Skip to content

Commit 6cd5e81

Browse files
Always resolve tee's cancel promise after stream closes or errors
Fixes #1038.
1 parent d6ea924 commit 6cd5e81

File tree

3 files changed

+8
-7
lines changed

3 files changed

+8
-7
lines changed

index.bs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2196,6 +2196,7 @@ create them does not matter.
21962196
[$ReadableStreamDefaultControllerClose$](|branch1|.\[[controller]]).
21972197
1. If |canceled2| is false, perform !
21982198
[$ReadableStreamDefaultControllerClose$](|branch2|.\[[controller]]).
2199+
1. [=Resolve=] |cancelPromise| with undefined.
21992200

22002201
: [=read request/error steps=]
22012202
::
@@ -2226,6 +2227,7 @@ create them does not matter.
22262227
1. [=Upon rejection=] of |reader|.\[[closedPromise]] with reason |r|,
22272228
1. Perform ! [$ReadableStreamDefaultControllerError$](|branch1|.\[[controller]], |r|).
22282229
1. Perform ! [$ReadableStreamDefaultControllerError$](|branch2|.\[[controller]], |r|).
2230+
1. [=Resolve=] |cancelPromise| with undefined.
22292231
1. Return « |branch1|, |branch2| ».
22302232
</div>
22312233

reference-implementation/lib/abstract-ops/readable-streams.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -331,10 +331,7 @@ function ReadableStreamTee(stream, cloneForBranch2) {
331331
let branch1;
332332
let branch2;
333333

334-
let resolveCancelPromise;
335-
const cancelPromise = new Promise(resolve => {
336-
resolveCancelPromise = resolve;
337-
});
334+
const cancelPromise = newPromise();
338335

339336
function pullAlgorithm() {
340337
if (reading === true) {
@@ -376,6 +373,7 @@ function ReadableStreamTee(stream, cloneForBranch2) {
376373
if (canceled2 === false) {
377374
ReadableStreamDefaultControllerClose(branch2._controller);
378375
}
376+
resolvePromise(cancelPromise, undefined);
379377
},
380378
errorSteps: () => {
381379
reading = false;
@@ -392,7 +390,7 @@ function ReadableStreamTee(stream, cloneForBranch2) {
392390
if (canceled2 === true) {
393391
const compositeReason = CreateArrayFromList([reason1, reason2]);
394392
const cancelResult = ReadableStreamCancel(stream, compositeReason);
395-
resolveCancelPromise(cancelResult);
393+
resolvePromise(cancelPromise, cancelResult);
396394
}
397395
return cancelPromise;
398396
}
@@ -403,7 +401,7 @@ function ReadableStreamTee(stream, cloneForBranch2) {
403401
if (canceled1 === true) {
404402
const compositeReason = CreateArrayFromList([reason1, reason2]);
405403
const cancelResult = ReadableStreamCancel(stream, compositeReason);
406-
resolveCancelPromise(cancelResult);
404+
resolvePromise(cancelPromise, cancelResult);
407405
}
408406
return cancelPromise;
409407
}
@@ -416,6 +414,7 @@ function ReadableStreamTee(stream, cloneForBranch2) {
416414
uponRejection(reader._closedPromise, r => {
417415
ReadableStreamDefaultControllerError(branch1._controller, r);
418416
ReadableStreamDefaultControllerError(branch2._controller, r);
417+
resolvePromise(cancelPromise, undefined);
419418
});
420419

421420
return [branch1, branch2];

0 commit comments

Comments
 (0)