- From: Mattias Buelens <notifications@github.com>
- Date: Tue, 03 Aug 2021 14:40:38 -0700
- To: whatwg/streams <streams@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/streams/issues/1155/892184703@github.com>
> > make the final consumer ... manually close() the chunk when it (eventually) receives it.
>
> [w3c/mediacapture-transform#56](https://github.com/w3c/mediacapture-transform/issues/56) is about that not working with `tee()`.
I see... For Fetch, we use ["tee a readable stream"](https://streams.spec.whatwg.org/#readablestream-tee) which calls `ReadableStreamTee` with `cloneForBranch2 = true`. Thus, all chunks are [structurally cloned](https://streams.spec.whatwg.org/#abstract-opdef-structuredclone) before enqueuing them to the second branch.
Unfortunately, this mechanism is not exposed to web authors. `ReadableStream.prototype.tee()` always uses `cloneForBranch2 = false`. A naive solution would be to pipe `branch2` through a `TransformStream` that manually `clone()`s each frame:
```javascript
function teeWithClone(readable) {
let [branch1, branch2] = readable.tee();
branch2 = branch2.pipeThrough(new TransformStream({
transform(frame, controller) {
controller.enqueue(frame.clone());
}
}));
return [branch1, branch2];
}
```
But this has a nasty problem. If the consumer of `branch1` modifies or closes the frame before `branch2` had a chance to clone it, then `branch2` will have modified or even unusable frames. So to do this "correctly", you'd have to clone *first*:
```javascript
function teeWithClone(readable) {
readable = readable.pipeThrough(new TransformStream({
transform(frame, controller) {
controller.enqueue([frame, frame.clone()]);
}
}));
let [branch1, branch2] = readable.tee();
branch1 = branch1.pipeThrough(new TransformStream({
transform([frame, clonedFrame], controller) {
controller.enqueue(frame);
}
}));
branch2 = branch2.pipeThrough(new TransformStream({
transform([frame, clonedFrame], controller) {
controller.enqueue(clonedFrame);
}
}));
return [branch1, branch2];
}
```
...which looks very, very weird. 😛
--
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-892184703
Received on Tuesday, 3 August 2021 21:40:51 UTC