- From: Mattias Buelens <notifications@github.com>
- Date: Tue, 03 Aug 2021 07:09:18 -0700
- To: whatwg/streams <streams@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/streams/issues/1155/891878727@github.com>
Each individual stream fills up to its own `highWaterMark`, pulling in chunks as necessary. So if you have a pipe chain like this:
```javascript
const rs1 = new ReadableStream({
pull(controller) {
console.log("pull");
controller.enqueue("chunk");
}
}, { highWaterMark: 5 });
const rs2 = rs1
.pipeThrough(new TransformStream({}, { highWaterMark: 2 }))
.pipeThrough(new TransformStream({}, { highWaterMark: 1 }));
```
then this will log `"pull"` 8 times (5 + 2 + 1) to fill up all queues. If you then start reading from `rs2`:
```javascript
const reader = rs2.getReader();
await reader.read();
```
then you'll get a chunk out of the last stream's queue. Since that causes its queue to dip below its high water mark (1), it'll pull a chunk from the previous stream. The same thing happens with this stream: a chunk is pulled from its queue, it dips below its high water mark (2), and pulls a chunk from `rs1`. `rs1` immediately provides a chunk from its queue, also dips below its high water mark, and pulls from its underlying source.
In general, I don't think it's possible for a `ReadableStream` to know when "the final consumer" has received a previously enqueued chunk. That chunk can still be in the queue of a transform stream further down the pipe chain (as shown above), or inside the internal state of a `transform()` method that is currently processing the chunk. I think the only way to do this is to actually make the final consumer (a `WritableStream` acting as a sink, or a destructive `TransformStream`) manually `close()` the chunk when it (eventually) receives it.
On a slightly related note: what would you expect to happen when you enqueue a couple of `VideoFrame`s and then the stream becomes canceled? The Streams standard will discard all queued chunks, but then it's up to the garbage collector to clean up any resources associated with these `VideoFrame`s. Can that cause problems if these are not cleaned up soon enough? 🤔
--
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/1155#issuecomment-891878727
Received on Tuesday, 3 August 2021 14:09:30 UTC