- From: Timothy Gu <notifications@github.com>
- Date: Wed, 22 Aug 2018 16:14:36 -0700
- To: whatwg/streams <streams@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/streams/pull/950/review/148705241@github.com>
TimothyGu commented on this pull request.
> @@ -1402,6 +1405,92 @@ lt="ReadableStreamDefaultReader(stream)">new ReadableStreamDefaultReader(<var>st
1. Perform ! ReadableStreamReaderGenericRelease(*this*).
</emu-alg>
+<h5 id="default-reader-iterator" method for="ReadableStreamDefaultReader">
+iterator({ cancel = true } = {})</h5>
Just don't worry about the line length and put it on the same line as `<h5>`.
> + reader.
+</div>
+
+<emu-alg>
+ 1. If ! IsReadableStreamDefaultReader(*this*) is *false*, throw a *TypeError* exception.
+ 1. If *this*.[[ownerReadableStream]] is *undefined*, throw a *TypeError* exception.
+ 1. Let _iterator_ be ? ObjectCreate(`<a idl>ReadableStreamDefaultReaderAsyncIteratorPrototype</a>`, « [[Reader]],
+ [[Cancel]] »).
+ 1. Set _iterator_.[[Reader]] to *this*.
+ 1. Set _iterator_.[[Cancel]] to ! ToBoolean(_cancel_).
+ 1. Return _iterator_.
+</emu-alg>
+
+<h5 id="default-reader-@@asynciterator" for="ReadableStreamDefaultReader">[@@asyncIterator]()</h5>
+
+<div class="note">
`<p class="note">`
> + 1. If *this*.[[ownerReadableStream]] is *undefined*, throw a *TypeError* exception.
+ 1. Let _iterator_ be ? ObjectCreate(`<a idl>ReadableStreamDefaultReaderAsyncIteratorPrototype</a>`, « [[Reader]],
+ [[Cancel]] »).
+ 1. Set _iterator_.[[Reader]] to *this*.
+ 1. Set _iterator_.[[Cancel]] to ! ToBoolean(_cancel_).
+ 1. Return _iterator_.
+</emu-alg>
+
+<h5 id="default-reader-@@asynciterator" for="ReadableStreamDefaultReader">[@@asyncIterator]()</h5>
+
+<div class="note">
+ The <code>@@asyncIterator</code> method is an alias of {{ReadableStreamDefaultReader/iterator}}.
+</div>
+
+The initial value of the <code>@@asyncIterator</code> method is the same function object as the initial value of the
+<code>iterator</code> method.
This should be linked. Also it should be made explicit which `iterator` method we are talking about (which object it belongs to), if we have more than one in the future.
> @@ -1402,6 +1405,92 @@ lt="ReadableStreamDefaultReader(stream)">new ReadableStreamDefaultReader(<var>st
1. Perform ! ReadableStreamReaderGenericRelease(*this*).
</emu-alg>
+<h5 id="default-reader-iterator" method for="ReadableStreamDefaultReader">
+iterator({ cancel = true } = {})</h5>
My point about the naming remains. I still would like to see it as `getIterator()` or `iterate()`.
> @@ -1402,6 +1405,92 @@ lt="ReadableStreamDefaultReader(stream)">new ReadableStreamDefaultReader(<var>st
1. Perform ! ReadableStreamReaderGenericRelease(*this*).
</emu-alg>
+<h5 id="default-reader-iterator" method for="ReadableStreamDefaultReader">
+iterator({ cancel = true } = {})</h5>
+
+<div class="note">
Use a paragraph element.
> @@ -1402,6 +1405,92 @@ lt="ReadableStreamDefaultReader(stream)">new ReadableStreamDefaultReader(<var>st
1. Perform ! ReadableStreamReaderGenericRelease(*this*).
</emu-alg>
+<h5 id="default-reader-iterator" method for="ReadableStreamDefaultReader">
+iterator({ cancel = true } = {})</h5>
+
+<div class="note">
+ The <code>iterator</code> method returns an async iterator which can be used to consume the stream. The
+ <code>return</code> method of this iterator object will optionally {{ReadableStreamDefaultReader/cancel()}} this
`return` should be linked.
> +
+<h5 id="default-reader-@@asynciterator" for="ReadableStreamDefaultReader">[@@asyncIterator]()</h5>
+
+<div class="note">
+ The <code>@@asyncIterator</code> method is an alias of {{ReadableStreamDefaultReader/iterator}}.
+</div>
+
+The initial value of the <code>@@asyncIterator</code> method is the same function object as the initial value of the
+<code>iterator</code> method.
+
+<h3 id="default-reader-asynciterator-prototype" interface lt="ReadableStreamDefaultReaderAsyncIteratorPrototype">
+ReadableStreamDefaultReaderAsyncIteratorPrototype</h3>
+
+<h4 id="default-reader-asynciterator-prototype-internal-slots">Internal slots</h4>
+
+Instances of {{ReadableStreamDefaultReaderAsyncIteratorPrototype}} are created with the internal slots described in the
You can't have instances of a prototype. Just say "`ReadableStreamDefaultReader` Async Iterator objects" or something similar, and use that name consistently. See https://tc39.github.io/ecma262/#sec-async-from-sync-iterator-objects for how ES does it.
> +
+<h4 id="default-reader-asynciterator-prototype-next" method for="ReadableStreamDefaultReaderAsyncIteratorPrototype">
+next()</h4>
+
+<emu-alg>
+ 1. If ! IsReadableStreamDefaultReaderAsyncIteratorPrototype(*this*) is *false*, throw a *TypeError* exception.
+ 1. Let _reader_ be *this*.[[Reader]].
+ 1. Let _read_ be GetMethod(_reader_, `"read"`).
+ 1. If _read_ is an abrupt completion, return a promise rejected with _read_.[[Value]].
+ 1. let _result_ be Call(_read_, _reader_).
+ 1. If _result_ is an abrupt completion, return a promise rejected with _result_.[[Value]].
+ 1. Return NormalCompletion(_result_).
+</emu-alg>
+
+<h4 id="default-reader-asynciterator-prototype-return" method for="ReadableStreamDefaultReaderAsyncIteratorPrototype">
+return(value)</h4>
"value" needs to be in <var>
> + 1. Let _read_ be GetMethod(_reader_, `"read"`).
+ 1. If _read_ is an abrupt completion, return a promise rejected with _read_.[[Value]].
+ 1. let _result_ be Call(_read_, _reader_).
+ 1. If _result_ is an abrupt completion, return a promise rejected with _result_.[[Value]].
+ 1. Return NormalCompletion(_result_).
+</emu-alg>
+
+<h4 id="default-reader-asynciterator-prototype-return" method for="ReadableStreamDefaultReaderAsyncIteratorPrototype">
+return(value)</h4>
+
+<emu-alg>
+ 1. If ! IsReadableStreamDefaultReaderAsyncIteratorPrototype(*this*) is *false*, throw a *TypeError* exception.
+ 1. Let _reader_ be *this*.[[Reader]].
+ 1. If *this*.[[Cancel]] is *true*, then:
+ 1. Let _cancel_ be ? GetMethod(_reader_, `"cancel"`).
+ 1. let _result_ be Call(_cancel_, _reader_, « _value_ »).
Let
> + <td class="non-normative">A {{ReadableStreamDefaultReader}} instance.
+ </tr>
+ <tr>
+ <td>\[[Cancel]]
+ <td class="non-normative">Boolean value indicating if the reader will be cancelled when the stream returns.
+ </tr>
+</table>
+
+<h4 id="default-reader-asynciterator-prototype-next" method for="ReadableStreamDefaultReaderAsyncIteratorPrototype">
+next()</h4>
+
+<emu-alg>
+ 1. If ! IsReadableStreamDefaultReaderAsyncIteratorPrototype(*this*) is *false*, throw a *TypeError* exception.
+ 1. Let _reader_ be *this*.[[Reader]].
+ 1. Let _read_ be GetMethod(_reader_, `"read"`).
+ 1. If _read_ is an abrupt completion, return a promise rejected with _read_.[[Value]].
Link "promise rejected with"
> + <td>\[[Cancel]]
+ <td class="non-normative">Boolean value indicating if the reader will be cancelled when the stream returns.
+ </tr>
+</table>
+
+<h4 id="default-reader-asynciterator-prototype-next" method for="ReadableStreamDefaultReaderAsyncIteratorPrototype">
+next()</h4>
+
+<emu-alg>
+ 1. If ! IsReadableStreamDefaultReaderAsyncIteratorPrototype(*this*) is *false*, throw a *TypeError* exception.
+ 1. Let _reader_ be *this*.[[Reader]].
+ 1. Let _read_ be GetMethod(_reader_, `"read"`).
+ 1. If _read_ is an abrupt completion, return a promise rejected with _read_.[[Value]].
+ 1. let _result_ be Call(_read_, _reader_).
+ 1. If _result_ is an abrupt completion, return a promise rejected with _result_.[[Value]].
+ 1. Return NormalCompletion(_result_).
I would wrap the _result_ in a [PromiseResolve](https://tc39.github.io/ecma262/#sec-promise-resolve) (or equivalently, [a promise resolved with](https://www.w3.org/2001/tag/doc/promises-guide/#a-promise-resolved-with) _result_) to guarantee that `next` always returns a promise.
> + 1. Return NormalCompletion(_result_).
+</emu-alg>
+
+<h4 id="default-reader-asynciterator-prototype-return" method for="ReadableStreamDefaultReaderAsyncIteratorPrototype">
+return(value)</h4>
+
+<emu-alg>
+ 1. If ! IsReadableStreamDefaultReaderAsyncIteratorPrototype(*this*) is *false*, throw a *TypeError* exception.
+ 1. Let _reader_ be *this*.[[Reader]].
+ 1. If *this*.[[Cancel]] is *true*, then:
+ 1. Let _cancel_ be ? GetMethod(_reader_, `"cancel"`).
+ 1. let _result_ be Call(_cancel_, _reader_, « _value_ »).
+ 1. If _result_ is an abrupt completion, return a promise rejected with _result_.[[Value]].
+ 1. Let _iterResult_ be ObjectCreate(%ObjectPrototype%).
+ 1. Perform CreateDataProperty(_iterResult_, `"done"`, *true*).
+ 1. Perform CreateDataProperty(_iterResult_, `"value"`, _value_).
Use [CreateIterResultObject](https://tc39.github.io/ecma262/#sec-createiterresultobject).
> +</emu-alg>
+
+<h4 id="default-reader-asynciterator-prototype-return" method for="ReadableStreamDefaultReaderAsyncIteratorPrototype">
+return(value)</h4>
+
+<emu-alg>
+ 1. If ! IsReadableStreamDefaultReaderAsyncIteratorPrototype(*this*) is *false*, throw a *TypeError* exception.
+ 1. Let _reader_ be *this*.[[Reader]].
+ 1. If *this*.[[Cancel]] is *true*, then:
+ 1. Let _cancel_ be ? GetMethod(_reader_, `"cancel"`).
+ 1. let _result_ be Call(_cancel_, _reader_, « _value_ »).
+ 1. If _result_ is an abrupt completion, return a promise rejected with _result_.[[Value]].
+ 1. Let _iterResult_ be ObjectCreate(%ObjectPrototype%).
+ 1. Perform CreateDataProperty(_iterResult_, `"done"`, *true*).
+ 1. Perform CreateDataProperty(_iterResult_, `"value"`, _value_).
+ 1. Return a promise resolved with _iterResult_.
Link "a promise resolved with"
> @@ -1562,6 +1651,16 @@ ReadableStreamBYOBReader(<var>stream</var>)</h4>
1. Return *true*.
</emu-alg>
+<h4 id="is-readable-stream-default-reader-asynciterator-prototype">
+aoid="IsReadableStreamDefaultReaderAsyncIteratorPrototype" nothrow>IsReadableStreamDefaultReaderAsyncIteratorPrototype (
+ <var>x</var> )</h4>
+
+<emu-alg>
+ 1. If Type(_x_) is not Object, return *false*.
Per ECMAScript convention, objects usually use a single uppercase letter or a camel-cased phrase as variable name. In this case I believe _argument_ would suffice.
> @@ -1562,6 +1651,16 @@ ReadableStreamBYOBReader(<var>stream</var>)</h4>
1. Return *true*.
</emu-alg>
+<h4 id="is-readable-stream-default-reader-asynciterator-prototype">
+aoid="IsReadableStreamDefaultReaderAsyncIteratorPrototype" nothrow>IsReadableStreamDefaultReaderAsyncIteratorPrototype (
+ <var>x</var> )</h4>
+
+<emu-alg>
+ 1. If Type(_x_) is not Object, return *false*.
+ 1. If _x_ does not have a [[Reader]] and [[Cancel]] internal slots, return *false*.
The "a" seems misplaced.
> @@ -1562,6 +1651,16 @@ ReadableStreamBYOBReader(<var>stream</var>)</h4>
1. Return *true*.
</emu-alg>
+<h4 id="is-readable-stream-default-reader-asynciterator-prototype">
+aoid="IsReadableStreamDefaultReaderAsyncIteratorPrototype" nothrow>IsReadableStreamDefaultReaderAsyncIteratorPrototype (
You are testing for if an object is an AsyncIterator, not if it's an object.
> + 1. Let _reader_ be *this*.[[Reader]].
+ 1. Let _read_ be GetMethod(_reader_, `"read"`).
+ 1. If _read_ is an abrupt completion, return a promise rejected with _read_.[[Value]].
+ 1. let _result_ be Call(_read_, _reader_).
+ 1. If _result_ is an abrupt completion, return a promise rejected with _result_.[[Value]].
+ 1. Return NormalCompletion(_result_).
+</emu-alg>
+
+<h4 id="default-reader-asynciterator-prototype-return" method for="ReadableStreamDefaultReaderAsyncIteratorPrototype">
+return(value)</h4>
+
+<emu-alg>
+ 1. If ! IsReadableStreamDefaultReaderAsyncIteratorPrototype(*this*) is *false*, throw a *TypeError* exception.
+ 1. Let _reader_ be *this*.[[Reader]].
+ 1. If *this*.[[Cancel]] is *true*, then:
+ 1. Let _cancel_ be ? GetMethod(_reader_, `"cancel"`).
You should wrap this ? in a promise too.
> +
+<h4 id="default-reader-asynciterator-prototype-internal-slots">Internal slots</h4>
+
+Instances of {{ReadableStreamDefaultReaderAsyncIteratorPrototype}} are created with the internal slots described in the
+following table:
+
+<table>
+ <thead>
+ <tr>
+ <th>Internal Slot</th>
+ <th>Description (<em>non-normative</em>)</th>
+ </tr>
+ </thead>
+ <tr>
+ <td>\[[Prototype]]
+ <td>%AsyncIteratorPrototype%
Any reason why this isn't in a .non-normative?
--
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/950#pullrequestreview-148705241
Received on Wednesday, 22 August 2018 23:14:59 UTC