- From: Domenic Denicola <notifications@github.com>
- Date: Tue, 24 Sep 2019 02:30:13 -0700
- To: whatwg/streams <streams@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/streams/issues/1017@github.com>
A blocker for #963 is expanding Web IDL's async iterator support to be powerful enough for readable streams. The tracking issue over there is https://github.com/heycam/webidl/issues/800.
On this side I want to record a draft of the algorithms. After the following get done:
- https://github.com/heycam/webidl/pull/802
- https://github.com/heycam/webidl/issues/804
- https://github.com/heycam/webidl/issues/803
- The actual async iterator PR tracked in https://github.com/heycam/webidl/issues/800
then it will look something like this:
**Async iterator initialization steps**, given a `ReadableStream` _stream_, async iterator _iterator_, and argument _options_:
1. Let _reader_ be ? AcquireReadableStreamDefaultReader(_stream_).
1. Set _iterator_.[[reader]] to _reader_.
1. Set _iterator_.[[preventCancel]] to _options_["`preventCancel`"].
To **get the next iteration result** for `ReadableStream` given the async iterator _iterator_:
1. Let promise be a new promise.
1. Let _reader_ be _iterator_.[[reader]].
1. If _reader_.[[ownerReadableStream]] is undefined, return a promise rejected with a `TypeError` exception.
1. Return the result of reacting to ! ReadableStreamDefaultReaderRead(_reader_) with a fulfillment handler that takes an argument _result_ and performs the following steps:
1. Assert: Type(_result_) is Object.
1. Let done be ! Get(_result_, "`done`").
1. Assert: Type(_done_) is Boolean.
1. If _done_ is true,
1. Perform ! ReadableStreamReaderGenericRelease(_reader_).
1. Return undefined.
1. Let _value_ be ! Get(_result_, "`value`").
1. Return _value.
(The above will become a bit cleaner if we are able to move away from using actual ES objects for read results, which will likely happen as part of the general Web IDL conversion.)
To **close the async iterator** for `ReadableStream` given the async iterator _iterator_ and argument _value_:
1. Let _reader_ be _iterator_.[[asyncIteratorReader]].
1. If _reader_.[[ownerReadableStream]] is undefined, return a promise rejected with a `TypeError` exception.
1. If _reader_.[[readRequests]] is not empty, return a promise rejected with a `TypeError` exception.
1. If _iterator_.[[preventCancel]] is false, then:
1. Let _result_ be ! ReadableStreamReaderGenericCancel(_reader_, _value_).
1. Perform ! ReadableStreamReaderGenericRelease(_reader_).
1. Return _result_.
1. Perform ! ReadableStreamReaderGenericRelease(reader).
1. Return a promise resolved with undefined.
---
I think this all works, so that's good.
--
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/issues/1017
Received on Tuesday, 24 September 2019 09:30:35 UTC