Skip to content

Commit f38fadc

Browse files
Release reader immediately when shutting down a pipe
1 parent 93c0b4c commit f38fadc

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

index.bs

+7-3
Original file line numberDiff line numberDiff line change
@@ -2198,6 +2198,9 @@ The following abstract operations operate on {{ReadableStream}} instances at a h
21982198
|originalError|, then:
21992199
1. If |shuttingDown| is true, abort these substeps.
22002200
1. Set |shuttingDown| to true.
2201+
1. If |reader| [=implements=] {{ReadableStreamBYOBReader}}, perform
2202+
! [$ReadableStreamBYOBReaderRelease$](|reader|).
2203+
1. Otherwise, perform ! [$ReadableStreamDefaultReaderRelease$](|reader|).
22012204
1. If |dest|.[=WritableStream/[[state]]=] is "`writable`" and !
22022205
[$WritableStreamCloseQueuedOrInFlight$](|dest|) is false,
22032206
1. If any [=chunks=] have been read but not yet written, write them to |dest|.
@@ -2210,6 +2213,9 @@ The following abstract operations operate on {{ReadableStream}} instances at a h
22102213
ask to shutdown, optionally with an error |error|, then:
22112214
1. If |shuttingDown| is true, abort these substeps.
22122215
1. Set |shuttingDown| to true.
2216+
1. If |reader| [=implements=] {{ReadableStreamBYOBReader}}, perform
2217+
! [$ReadableStreamBYOBReaderRelease$](|reader|).
2218+
1. Otherwise, perform ! [$ReadableStreamDefaultReaderRelease$](|reader|).
22132219
1. If |dest|.[=WritableStream/[[state]]=] is "`writable`" and !
22142220
[$WritableStreamCloseQueuedOrInFlight$](|dest|) is false,
22152221
1. If any [=chunks=] have been read but not yet written, write them to |dest|.
@@ -2218,10 +2224,8 @@ The following abstract operations operate on {{ReadableStream}} instances at a h
22182224
1. [=Finalize=], passing along |error| if it was given.
22192225
* <dfn id="rs-pipeTo-finalize"><i>Finalize</i></dfn>: both forms of shutdown will eventually ask
22202226
to finalize, optionally with an error |error|, which means to perform the following steps:
2227+
1. Assert: |reader|.[=ReadableStreamGenericReader/[[stream]]=] is undefined.
22212228
1. Perform ! [$WritableStreamDefaultWriterRelease$](|writer|).
2222-
1. If |reader| [=implements=] {{ReadableStreamBYOBReader}}, perform
2223-
! [$ReadableStreamBYOBReaderRelease$](|reader|).
2224-
1. Otherwise, perform ! [$ReadableStreamDefaultReaderRelease$](|reader|).
22252229
1. If |signal| is not undefined, [=AbortSignal/remove=] |abortAlgorithm| from |signal|.
22262230
1. If |error| was given, [=reject=] |promise| with |error|.
22272231
1. Otherwise, [=resolve=] |promise| with undefined.

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,9 @@ function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventC
200200
}
201201

202202
return transformPromiseWith(writer._readyPromise, () => {
203+
if (shuttingDown === true) {
204+
return promiseResolvedWith(true);
205+
}
203206
return new Promise((resolveRead, rejectRead) => {
204207
ReadableStreamDefaultReaderRead(
205208
reader,
@@ -289,6 +292,7 @@ function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventC
289292
return;
290293
}
291294
shuttingDown = true;
295+
ReadableStreamDefaultReaderRelease(reader);
292296

293297
if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {
294298
uponFulfillment(waitForWritesToFinish(), doTheRest);
@@ -310,6 +314,7 @@ function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventC
310314
return;
311315
}
312316
shuttingDown = true;
317+
ReadableStreamDefaultReaderRelease(reader);
313318

314319
if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {
315320
uponFulfillment(waitForWritesToFinish(), () => finalize(isError, error));
@@ -319,8 +324,8 @@ function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventC
319324
}
320325

321326
function finalize(isError, error) {
327+
assert(reader._stream === undefined);
322328
WritableStreamDefaultWriterRelease(writer);
323-
ReadableStreamDefaultReaderRelease(reader);
324329

325330
if (signal !== undefined) {
326331
signal.removeEventListener('abort', abortAlgorithm);

0 commit comments

Comments
 (0)