- From: Domenic Denicola <notifications@github.com>
- Date: Tue, 21 Aug 2018 12:26:52 -0700
- To: whatwg/streams <streams@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/streams/pull/950/review/148209766@github.com>
domenic requested changes on this pull request. Great start, and sorry for the delay in reviewing! > + 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> + +<emu-alg> + 1. Let _iterator_ be ? GetMethod(*this*, "iterator"). + 1. Return ? Call(_iterator_, *this*). Yeah for spec style we should follow https://tc39.github.io/ecma262/#sec-map.prototype-@@iterator I guess. > +</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> + +<emu-alg> + 1. Let _iterator_ be ? GetMethod(*this*, "iterator"). + 1. Return ? Call(_iterator_, *this*). +</emu-alg> + +<h3 id="default-reader-asynciterator-prototype" interface lt="ReadableStreamDefaultReaderAsyncIteratorPrototype"> + ReadableStreamDefaultReaderAsyncIteratorPrototype +</h3> Style nit: this introduces spaces between the `>` and `R` and the `e` and the `<`. No good. Same throughout various places in the patch. > + <tr> + <td>\[[Reader]] + <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. IsReadableStreamDefaultReaderAsyncIteratorPrototype doesn't seem to be defined? > +</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. Return ? Call(_read_, _reader_). +</emu-alg> + +<h4 id="default-reader-asynciterator-prototype-return" method for="ReadableStreamDefaultReaderAsyncIteratorPrototype"> + return() +</h4> So apparently async iterator return methods should take a value argument and return a promise for `{ done: true, value }`. You'll want to return the result of transforming the call to `cancel()` by a function that creates and returns the `{ done: true, value }` tuple (probably using ReadableStreamCreateReadResult for consistency). > @@ -700,8 +700,52 @@ class ReadableStreamDefaultReader { ReadableStreamReaderGenericRelease(this); } + + iterator({ cancel = true } = {}) { + const O = this; To follow the spec more exactly, don't do the `O` aliasing. Here and everywhere below. > @@ -1402,6 +1405,90 @@ 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 + 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]], This should be `!`, not `?`, I think. > + if (typeof O !== 'object') { + throw new TypeError(); + } + const reader = O._reader; + const read = reader.read; + return read.call(reader); + }, + return() { + const O = this; + if (typeof O !== 'object') { + throw new TypeError(); + } + if (O._cancel === true) { + const reader = O._reader; + const cancel = reader.cancel; + cancel.call(reader); We should put a full GetMethod implementation in helpers.js. -- 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-148209766
Received on Tuesday, 21 August 2018 19:27:13 UTC