@@ -2201,6 +2201,14 @@ The following abstract operations operate on {{ReadableStream}} instances at a h
2201
2201
1. If |reader| [=implements=] {{ReadableStreamBYOBReader}} , perform
2202
2202
! [$ReadableStreamBYOBReaderRelease$] (|reader|).
2203
2203
1. Otherwise, perform ! [$ReadableStreamDefaultReaderRelease$] (|reader|).
2204
+ 1. Set |reader| to ! [$AcquireReadableStreamDefaultReader$] (|source|).
2205
+ <p class="note"> The initial reader is released to ensure that any pending read requests
2206
+ are immediately aborted, and no more chunks are pulled from |source|. A new reader is
2207
+ acquired in order to keep |source| locked until the shutdown is [=finalized=] , for example
2208
+ to [=cancel a readable stream|cancel=] |source| if necessary.
2209
+ This exchange of readers is not observable to author code and the user agent is free to
2210
+ implement this differently, for example by keeping the same reader and internally aborting
2211
+ its pending read requests.
2204
2212
1. If |dest|.[=WritableStream/[[state]]=] is "`writable`" and !
2205
2213
[$WritableStreamCloseQueuedOrInFlight$] (|dest|) is false,
2206
2214
1. If any [=chunks=] have been read but not yet written, write them to |dest|.
@@ -2216,6 +2224,7 @@ The following abstract operations operate on {{ReadableStream}} instances at a h
2216
2224
1. If |reader| [=implements=] {{ReadableStreamBYOBReader}} , perform
2217
2225
! [$ReadableStreamBYOBReaderRelease$] (|reader|).
2218
2226
1. Otherwise, perform ! [$ReadableStreamDefaultReaderRelease$] (|reader|).
2227
+ 1. Set |reader| to ! [$AcquireReadableStreamDefaultReader$] (|source|).
2219
2228
1. If |dest|.[=WritableStream/[[state]]=] is "`writable`" and !
2220
2229
[$WritableStreamCloseQueuedOrInFlight$] (|dest|) is false,
2221
2230
1. If any [=chunks=] have been read but not yet written, write them to |dest|.
@@ -2224,8 +2233,10 @@ The following abstract operations operate on {{ReadableStream}} instances at a h
2224
2233
1. [=Finalize=] , passing along |error| if it was given.
2225
2234
* <dfn id="rs-pipeTo-finalize"><i>Finalize</i></dfn> : both forms of shutdown will eventually ask
2226
2235
to finalize, optionally with an error |error|, which means to perform the following steps:
2227
- 1. Assert: |reader|.[=ReadableStreamGenericReader/[[stream]]=] is undefined.
2228
2236
1. Perform ! [$WritableStreamDefaultWriterRelease$] (|writer|).
2237
+ 1. If |reader| [=implements=] {{ReadableStreamBYOBReader}} , perform
2238
+ ! [$ReadableStreamBYOBReaderRelease$] (|reader|).
2239
+ 1. Otherwise, perform ! [$ReadableStreamDefaultReaderRelease$] (|reader|).
2229
2240
1. If |signal| is not undefined, [=AbortSignal/remove=] |abortAlgorithm| from |signal|.
2230
2241
1. If |error| was given, [=reject=] |promise| with |error|.
2231
2242
1. Otherwise, [=resolve=] |promise| with undefined.
0 commit comments