- From: Domenic Denicola <notifications@github.com>
- Date: Mon, 30 Aug 2021 09:06:50 -0700
- To: whatwg/streams <streams@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/streams/pull/1162/review/741816787@github.com>
@domenic approved this pull request. LGTM with mostly typographical nits. One substantial issue in the example code, `abortReason()` should be `abortReason`. > @@ -0,0 +1,120 @@ +# WritableStream controller AbortSignal Explainer ```suggestion # `WritableStream` controller `AbortSignal` Explainer ``` > +* [abortReason](https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-abortreason) + * The argument passed to `writable.abort()` or `writer.abort()`. Undefined if no argument was passed or `abort()` + hasn't been called. +* [signal](https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-signal) + * An AbortSignal. By using `signal.addEventListener('abort', …)` an underlying sink can abort the pending write + or close operation when the stream is aborted. ```suggestion * [`abortReason`](https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-abortreason): The argument passed to `writable.abort()` or `writer.abort()`. Undefined if no argument was passed or `abort()` hasn't been called. * [`signal`](https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-signal): An `AbortSignal`. By using `signal.addEventListener('abort', …)` an underlying sink can abort the pending write or close operation when the stream is aborted. ``` > +streams such as [WebTransport](https://w3c.github.io/webtransport/). + + +## API Proposed + +On [WritableStreamDefaultController](https://streams.spec.whatwg.org/#writablestreamdefaultcontroller) +(the controller argument that is passed to underlying sinks): + +* [abortReason](https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-abortreason) + * The argument passed to `writable.abort()` or `writer.abort()`. Undefined if no argument was passed or `abort()` + hasn't been called. +* [signal](https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-signal) + * An AbortSignal. By using `signal.addEventListener('abort', …)` an underlying sink can abort the pending write + or close operation when the stream is aborted. + +The WritableStream API does not change. Instead, the existing `abort()` operation will now signal abort. ```suggestion The `WritableStream` API does not change. Instead, the existing `abort()` operation will now signal abort. ``` > +On [WritableStreamDefaultController](https://streams.spec.whatwg.org/#writablestreamdefaultcontroller) +(the controller argument that is passed to underlying sinks): + +* [abortReason](https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-abortreason) + * The argument passed to `writable.abort()` or `writer.abort()`. Undefined if no argument was passed or `abort()` + hasn't been called. +* [signal](https://streams.spec.whatwg.org/#writablestreamdefaultcontroller-signal) + * An AbortSignal. By using `signal.addEventListener('abort', …)` an underlying sink can abort the pending write + or close operation when the stream is aborted. + +The WritableStream API does not change. Instead, the existing `abort()` operation will now signal abort. + + +## Examples + +These are some examples of Javascript which can be used for writable streams once this is implemented: ```suggestion These are some examples of JavaScript which can be used for writable streams once this is implemented: ``` > + +## Examples + +These are some examples of Javascript which can be used for writable streams once this is implemented: + +In this example, the underlying sink write waits 1 second to simulate a long-running operation. However, if abort() is +called it stops immediately. + + +```javascript +const ws = new WritableStream({ + write(controller) { + return new Promise((resolve, reject) => { + setTimeout(resolve, 1000); + controller.signal.addEventListener('abort', + () => reject(controller.abortReason())); ```suggestion () => reject(controller.abortReason)); ``` > + write(controller) { + return new Promise((resolve, reject) => { + setTimeout(resolve, 1000); + controller.signal.addEventListener('abort', + () => reject(controller.abortReason())); + }); + } +}); +const writer = ws.getWriter(); + +writer.write(99); +await writer.abort(); +``` + + +This example shows integration with an existing API that uses AbortSignal. In this case, each write() triggers a POST ```suggestion This example shows integration with an existing API that uses `AbortSignal`. In this case, each `write()` triggers a POST ``` > +// `ws` is a WritableStream. + +const reallyBigArrayBuffer = …; +writer.write(reallyBigArrayBuffer); +// Send RESET_STREAM to the server without waiting for `reallyBigArrayBuffer` to +// be transmitted. +await writer.abort(); +``` + + + +## Goals + +* Allow writes to be aborted more quickly and efficiently. +* WebTransport will be able to use WritableStreamDefaultController.signal to make +[SendStream's write](https://w3c.github.io/webtransport/#sendstream-write) and ```suggestion [`SendStream`'s `write()`](https://w3c.github.io/webtransport/#sendstream-write) and ``` > + +const reallyBigArrayBuffer = …; +writer.write(reallyBigArrayBuffer); +// Send RESET_STREAM to the server without waiting for `reallyBigArrayBuffer` to +// be transmitted. +await writer.abort(); +``` + + + +## Goals + +* Allow writes to be aborted more quickly and efficiently. +* WebTransport will be able to use WritableStreamDefaultController.signal to make +[SendStream's write](https://w3c.github.io/webtransport/#sendstream-write) and +[close](https://w3c.github.io/webtransport/#sendstream-close) abortable. ```suggestion [`close()`](https://w3c.github.io/webtransport/#sendstream-close) abortable. ``` > + +* Allow writes to be aborted more quickly and efficiently. +* WebTransport will be able to use WritableStreamDefaultController.signal to make +[SendStream's write](https://w3c.github.io/webtransport/#sendstream-write) and +[close](https://w3c.github.io/webtransport/#sendstream-close) abortable. + + +## Non-Goals + +* Exposing a method to abort individual operations without aborting the stream as a whole. The semantics of this +would be unclear and confusing. + + +## User Benefits + +* Allows `abort` operation to complete more quickly, which avoids wasted resources for sites that take advantage of it. ```suggestion * Allows the abort operation to complete more quickly, which avoids wasted resources for sites that take advantage of it. ``` -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/whatwg/streams/pull/1162#pullrequestreview-741816787
Received on Monday, 30 August 2021 16:07:05 UTC