- From: Domenic Denicola <notifications@github.com>
- Date: Wed, 05 Apr 2017 01:44:23 -0700
- To: whatwg/streams <streams@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/streams/pull/721/review/30985292@github.com>
domenic commented on this pull request.
Found some nits :)
> - 1. Perform ! WritableStreamRejectAbortRequestIfPending(_stream_).
- 1. Perform ! WritableStreamRejectPromisesInReactionToError(_stream_).
+ 1. Assert: _stream_.[[storedError]] is *undefined*.
+ 1. Assert: _stream_.[[state]] is `"writable"`.
+ 1. Let _controller_ be _stream_.[[writableStreamController]].
+ 1. Assert: _controller_ is not *undefined*.
+ 1. Set _stream_.[[state]] to `"erroring"`.
+ 1. Set _stream_.[[storedError]] to _reason_.
+ 1. Let _writer_ be _stream_.[[writer]].
+ 1. If _writer_ is not *undefined*, perform !
+ WritableStreamDefaultWriterEnsureReadyPromiseRejected(_writer_, _reason_).
+ 1. If ! WritableStreamHasOperationMarkedInFlight(_stream_) is *false* and _controller_.[[started]] is *true*, perform
+ ! WritableStreamFinishError(_stream_).
+</emu-alg>
+
+<h4 id="writable-stream-finish-error" aoid="WritableStreamFinishError" nothrow>WritableStreamFinishError
Maybe the abstract ops should be named "WritableStreamStartErroring" and "WritableStreamFinishErroring"?
> + 1. Let _writer_ be _stream_.[[writer]].
+ 1. If _writer_ is not *undefined*, perform !
+ WritableStreamDefaultWriterEnsureReadyPromiseRejected(_writer_, _reason_).
+ 1. If ! WritableStreamHasOperationMarkedInFlight(_stream_) is *false* and _controller_.[[started]] is *true*, perform
+ ! WritableStreamFinishError(_stream_).
+</emu-alg>
+
+<h4 id="writable-stream-finish-error" aoid="WritableStreamFinishError" nothrow>WritableStreamFinishError
+( <var>stream</var> )</h4>
+
+<emu-alg>
+ 1. Assert: _stream_.[[state]] is `"erroring"`.
+ 1. Assert: ! WritableStreamHasOperationMarkedInFlight(_stream_) is *false*.
+ 1. Set _stream_.[[state]] to `"errored"`.
+ 1. Perform ! _stream_.[[writableStreamController]].[[ErrorSteps]]().
+ 1. Let _storedError_ by _stream_.[[storedError]];
Semicolon should be period. "by" should be "be"
> +<h4 id="writable-stream-finish-error" aoid="WritableStreamFinishError" nothrow>WritableStreamFinishError
+( <var>stream</var> )</h4>
+
+<emu-alg>
+ 1. Assert: _stream_.[[state]] is `"erroring"`.
+ 1. Assert: ! WritableStreamHasOperationMarkedInFlight(_stream_) is *false*.
+ 1. Set _stream_.[[state]] to `"errored"`.
+ 1. Perform ! _stream_.[[writableStreamController]].[[ErrorSteps]]().
+ 1. Let _storedError_ by _stream_.[[storedError]];
+ 1. Repeat for each _writeRequest_ that is an element of _stream_.[[writeRequests]],
+ 1. <a>Reject</a> _writeRequest_ with _storedError_.
+ 1. Set _stream_.[[writeRequest]] to an empty List.
+ 1. if _stream_.[[pendingAbortRequest]] is *undefined*,
+ 1. Perform ! WritableStreamRejectCloseAndClosedPromiseIfNeeded(_stream_).
+ 1. Return.
+ 1. Let _abortRequest_ by _stream_.[[pendingAbortRequest]].
"by" should be "be". Might be worth running a regex for "Let ... by".
> +
+<emu-alg>
+ 1. Assert: _stream_.[[state]] is `"erroring"`.
+ 1. Assert: ! WritableStreamHasOperationMarkedInFlight(_stream_) is *false*.
+ 1. Set _stream_.[[state]] to `"errored"`.
+ 1. Perform ! _stream_.[[writableStreamController]].[[ErrorSteps]]().
+ 1. Let _storedError_ by _stream_.[[storedError]];
+ 1. Repeat for each _writeRequest_ that is an element of _stream_.[[writeRequests]],
+ 1. <a>Reject</a> _writeRequest_ with _storedError_.
+ 1. Set _stream_.[[writeRequest]] to an empty List.
+ 1. if _stream_.[[pendingAbortRequest]] is *undefined*,
+ 1. Perform ! WritableStreamRejectCloseAndClosedPromiseIfNeeded(_stream_).
+ 1. Return.
+ 1. Let _abortRequest_ by _stream_.[[pendingAbortRequest]].
+ 1. Set _stream_.[[pendingAbortRequest]] to *undefined*.
+ 1. Let _promise_ be stream.[[writableStreamController]].[[AbortSteps]](_abortRequest_.[[reason]]).
Missing ! (although I admit it's unclear whether these internal methods return completion values).
> +<emu-alg>
+ 1. Assert: _stream_.[[state]] is `"erroring"`.
+ 1. Assert: ! WritableStreamHasOperationMarkedInFlight(_stream_) is *false*.
+ 1. Set _stream_.[[state]] to `"errored"`.
+ 1. Perform ! _stream_.[[writableStreamController]].[[ErrorSteps]]().
+ 1. Let _storedError_ by _stream_.[[storedError]];
+ 1. Repeat for each _writeRequest_ that is an element of _stream_.[[writeRequests]],
+ 1. <a>Reject</a> _writeRequest_ with _storedError_.
+ 1. Set _stream_.[[writeRequest]] to an empty List.
+ 1. if _stream_.[[pendingAbortRequest]] is *undefined*,
+ 1. Perform ! WritableStreamRejectCloseAndClosedPromiseIfNeeded(_stream_).
+ 1. Return.
+ 1. Let _abortRequest_ by _stream_.[[pendingAbortRequest]].
+ 1. Set _stream_.[[pendingAbortRequest]] to *undefined*.
+ 1. Let _promise_ be stream.[[writableStreamController]].[[AbortSteps]](_abortRequest_.[[reason]]).
+ 1. <a>Upon fulfillment</a> of _promise_, <a>resolve</a> _abortRequest_.[[promise]] with *undefined*.
We're a bit inconsistent but we seem to lean toward not indenting "Upon fulfillment" and "Upon rejection" steps.
> 1. Return ! WritableStreamDefaultWriterClose(_writer_).
</emu-alg>
+<h4 id="writable-stream-default-writer-ensure-closed-promise-rejected"
+aoid="WritableStreamDefaultWriterEnsureClosedPromiseRejected"
+nothrow>WritableStreamDefaultWriterEnsureClosedPromiseRejected( <var>writer</var>, <var>error</var> )</h4>
It occurs to me we could abstract this out into a utility abstract op like EnsureStatePromiseRejected(promise, error). ("State" included to justify marking it as handled.)
Not sure if worth it.
> @@ -3582,10 +3568,13 @@ aoid="WritableStreamDefaultControllerAdvanceQueueIfNeeded" nothrow>WritableStrea
<emu-alg>
1. Let _stream_ be _controller_.[[controlledWritableStream]].
+ 1. if _controller_.[[started]] is *false*, return.
Capitalize
--
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/721#pullrequestreview-30985292
Received on Wednesday, 5 April 2017 08:44:57 UTC