- From: Shannon Booth <notifications@github.com>
- Date: Sat, 09 Nov 2024 03:11:11 -0800
- To: whatwg/streams <streams@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/streams/issues/1331@github.com>
### What is the issue with the Streams Standard? Consider the following test (simplification of https://github.com/web-platform-tests/wpt/blob/8686b7a6d288d3b2c22b5ddb5a21773619b22b85/streams/writable-streams/aborting.any.js#L57) ```html <script> async function test() { const ws = new WritableStream(); setTimeout(() => { const writer = ws.getWriter(); const abortPromise = writer.abort("some error"); writer.write(1); }, 0) } test(); </script> ``` The stack of calls from [abort(reason)](https://streams.spec.whatwg.org/#default-writer-abort) are: 1. [WritableStreamDefaultWriterAbort](https://streams.spec.whatwg.org/#writable-stream-default-writer-abort) 2. [WritableStreamAbort](https://streams.spec.whatwg.org/#writable-stream-abort) 3. [WritableStreamStartErroring](https://streams.spec.whatwg.org/#writable-stream-start-erroring) 4. [WritableStreamFinishErroring](https://streams.spec.whatwg.org/#writable-stream-finish-erroring) Step 12 of this WritableStreamFinishErroring will then perform: > 12. Let promise be ! stream.[[[controller]]](https://streams.spec.whatwg.org/#writablestream-controller).[[[AbortSteps]]](https://streams.spec.whatwg.org/#abstract-opdef-writablestreamcontroller-abortsteps)(abortRequest’s [reason](https://streams.spec.whatwg.org/#pending-abort-request-reason)). Where [\[AbortSteps\](reason)](https://streams.spec.whatwg.org/#ws-default-controller-private-abort) will clear the write algorithms: > 2. Perform ! [WritableStreamDefaultControllerClearAlgorithms](https://streams.spec.whatwg.org/#writable-stream-default-controller-clear-algorithms)([this](https://webidl.spec.whatwg.org/#this)). Which includes the `strategySizeAlgorithm`: > 4. Set controller.[[[strategySizeAlgorithm]]](https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-strategysizealgorithm) to undefined. Once abort has finished, [writer.write(chunk)](https://streams.spec.whatwg.org/#default-writer-write) is invoked. In [WritableStreamDefaultWriterWrite](https://streams.spec.whatwg.org/#writable-stream-default-writer-write) step 4 is to: > 4. Let chunkSize be ! [WritableStreamDefaultControllerGetChunkSize](https://streams.spec.whatwg.org/#writable-stream-default-controller-get-chunk-size)(controller, chunk). Which will invoke the strategySizeAlgorithm: > 1. Let returnValue be the result of performing controller.[[[strategySizeAlgorithm]]](https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-strategysizealgorithm), passing in chunk, and interpreting the result as a [completion record](https://tc39.es/ecma262/multipage/ecmascript-data-types-and-values.html#sec-completion-record-specification-type). However, this has been nulled out by the call to WritableStreamDefaultControllerClearAlgorithms earlier, as part of the `abort`. The stream is in an errored state, and _should_ through an abort, but this is only performed on step 9 of WritableStreamDefaultWriterWrite. Speculatively, I think step 4. of `WritableStreamDefaultWriterWrite` could be moved to just after step 9 where the erroring status is checked, but I am not sure if that has unintended side effects. -- Reply to this email directly or view it on GitHub: https://github.com/whatwg/streams/issues/1331 You are receiving this because you are subscribed to this thread. Message ID: <whatwg/streams/issues/1331@github.com>
Received on Saturday, 9 November 2024 11:11:15 UTC