[whatwg/streams] Add ReadableStreamBYOBReader.readFully() (#1145)

Implements #1143.

In my first attempt, I did most of the heavy lifting in a `ReadableStreamBYOBReaderReadFully()` helper that calls `read(view)`. If the first read didn't fill the entire view yet, it immediately calls `read(view)` again but with a special "addToFront" flag so that the new read-into request goes to the *front* of the queue rather than the back. This works fine, but it's not very pretty. It also means we're possibly calling `read(view)` *re-entrantly* from within `ReadIntoRequest.chunkSteps()`, which is somewhat pushing the boundaries of what you can reasonably expect from the spec. 😬 (I've kept this attempt in the commit history, so you can judge for yourselves.)

I then realized that we already have logic that keeps a read-into request in the queue after a `respond()`. When the user performs a BYOB read with a multi-byte typed array, the stream only fulfills the request when at least `elementSize` have been written into the pull-into descriptor. If not, the request stays pending and the pull-into descriptor remains at the head of the queue. Therefore, in my second (and latest) attempt, I add a special type of pull-into descriptor which must stay in the queue as long as `bytesFilled < byteLength`, rather than the usual `bytesFilled < elementSize`. This also works very well, but requires changes across multiple parts of the code.

To do:
* [ ] Write (many more) tests to prove that this actually handles all possible edge cases
* [ ] Write the specification text once we've decided on the approach

---

- [ ] At least two implementers are interested (and none opposed):
   * …
   * …
- [ ] [Tests](https://github.com/web-platform-tests/wpt) are written and can be reviewed and commented upon at:
   * …
- [ ] [Implementation bugs](https://github.com/whatwg/meta/blob/main/MAINTAINERS.md#handling-pull-requests) are filed:
   * Chrome: …
   * Firefox: …
   * Safari: …

(See [WHATWG Working Mode: Changes](https://whatwg.org/working-mode#changes) for more details.)

You can view, comment on, or merge this pull request online at:

  https://github.com/whatwg/streams/pull/1145


-- Commit Summary --

  * Add ReadableStreamBYOBReader.readFully() (first attempt)
  * Revert "Add ReadableStreamBYOBReader.readFully() (first attempt)"
  * Add ReadableStreamBYOBReader.readFully()

-- File Changes --

    M reference-implementation/lib/ReadableByteStreamController-impl.js (3)
    M reference-implementation/lib/ReadableStreamBYOBReader-impl.js (25)
    M reference-implementation/lib/ReadableStreamBYOBReader.webidl (1)
    M reference-implementation/lib/abstract-ops/readable-streams.js (45)

-- Patch Links --

https://github.com/whatwg/streams/pull/1145.patch

https://github.com/whatwg/streams/pull/1145.diff


-- 
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/1145

Received on Thursday, 15 July 2021 21:22:03 UTC