Skip to content

Tracking issue for Web IDL async iterator support #1017

Closed
@domenic

Description

@domenic

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 whatwg/webidl#800.

On this side I want to record a draft of the algorithms. After the following get done:

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).
  2. Set iterator.[[reader]] to reader.
  3. 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.
  2. Let reader be iterator.[[reader]].
  3. If reader.[[ownerReadableStream]] is undefined, return a promise rejected with a TypeError exception.
  4. 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.
    2. Let done be ! Get(result, "done").
    3. Assert: Type(done) is Boolean.
    4. If done is true,
      1. Perform ! ReadableStreamReaderGenericRelease(reader).
      2. Return undefined.
    5. Let value be ! Get(result, "value").
    6. 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]].
  2. If reader.[[ownerReadableStream]] is undefined, return a promise rejected with a TypeError exception.
  3. If reader.[[readRequests]] is not empty, return a promise rejected with a TypeError exception.
  4. If iterator.[[preventCancel]] is false, then:
    1. Let result be ! ReadableStreamReaderGenericCancel(reader, value).
    2. Perform ! ReadableStreamReaderGenericRelease(reader).
    3. Return result.
  5. Perform ! ReadableStreamReaderGenericRelease(reader).
  6. Return a promise resolved with undefined.

I think this all works, so that's good.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions