summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/fetch/22_body.js3
-rw-r--r--ext/web/06_streams.js21
-rw-r--r--tools/wpt/expectation.json32
3 files changed, 23 insertions, 33 deletions
diff --git a/ext/fetch/22_body.js b/ext/fetch/22_body.js
index 9fe00b144..644b9f76f 100644
--- a/ext/fetch/22_body.js
+++ b/ext/fetch/22_body.js
@@ -33,6 +33,7 @@ import {
readableStreamCollectIntoUint8Array,
readableStreamDisturb,
ReadableStreamPrototype,
+ readableStreamTee,
readableStreamThrowIfErrored,
} from "ext:deno_web/06_streams.js";
const primordials = globalThis.__bootstrap.primordials;
@@ -194,7 +195,7 @@ class InnerBody {
* @returns {InnerBody}
*/
clone() {
- const { 0: out1, 1: out2 } = this.stream.tee();
+ const { 0: out1, 1: out2 } = readableStreamTee(this.stream, true);
this.streamOrStatic = out1;
const second = new InnerBody(out2);
second.source = core.deserialize(core.serialize(this.source));
diff --git a/ext/web/06_streams.js b/ext/web/06_streams.js
index beab2ec12..01f84aa2c 100644
--- a/ext/web/06_streams.js
+++ b/ext/web/06_streams.js
@@ -9,6 +9,7 @@
const core = globalThis.Deno.core;
const ops = core.ops;
import * as webidl from "ext:deno_webidl/00_webidl.js";
+import { structuredClone } from "ext:deno_web/02_structured_clone.js";
import {
AbortSignalPrototype,
add,
@@ -2847,9 +2848,24 @@ function readableStreamDefaultTee(stream, cloneForBranch2) {
queueMicrotask(() => {
readAgain = false;
const value1 = value;
- const value2 = value;
+ let value2 = value;
- // TODO(lucacasonato): respect clonedForBranch2.
+ if (canceled2 === false && cloneForBranch2 === true) {
+ try {
+ value2 = structuredClone(value2);
+ } catch (cloneError) {
+ readableStreamDefaultControllerError(
+ branch1[_controller],
+ cloneError,
+ );
+ readableStreamDefaultControllerError(
+ branch2[_controller],
+ cloneError,
+ );
+ cancelPromise.resolve(readableStreamCancel(stream, cloneError));
+ return;
+ }
+ }
if (canceled1 === false) {
readableStreamDefaultControllerEnqueue(
@@ -6464,6 +6480,7 @@ export {
readableStreamForRidUnrefableRef,
readableStreamForRidUnrefableUnref,
ReadableStreamPrototype,
+ readableStreamTee,
readableStreamThrowIfErrored,
TransformStream,
TransformStreamDefaultController,
diff --git a/tools/wpt/expectation.json b/tools/wpt/expectation.json
index 289698c1e..861530841 100644
--- a/tools/wpt/expectation.json
+++ b/tools/wpt/expectation.json
@@ -4382,36 +4382,8 @@
"response-from-stream.any.worker.html": true,
"response-cancel-stream.any.html": true,
"response-cancel-stream.any.worker.html": true,
- "response-clone.any.html": [
- "Check response clone use structureClone for teed ReadableStreams (Int8Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (Int16Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (Int32Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (ArrayBufferchunk)",
- "Check response clone use structureClone for teed ReadableStreams (Uint8Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (Uint8ClampedArraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (Uint16Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (Uint32Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (BigInt64Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (BigUint64Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (Float32Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (Float64Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (DataViewchunk)"
- ],
- "response-clone.any.worker.html": [
- "Check response clone use structureClone for teed ReadableStreams (Int8Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (Int16Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (Int32Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (ArrayBufferchunk)",
- "Check response clone use structureClone for teed ReadableStreams (Uint8Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (Uint8ClampedArraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (Uint16Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (Uint32Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (BigInt64Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (BigUint64Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (Float32Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (Float64Arraychunk)",
- "Check response clone use structureClone for teed ReadableStreams (DataViewchunk)"
- ],
+ "response-clone.any.html": true,
+ "response-clone.any.worker.html": true,
"response-consume-empty.any.html": [
"Consume empty FormData response body as text"
],