summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/tests/unit/text_encoding_test.ts17
-rw-r--r--ext/web/06_streams.js4
-rw-r--r--ext/web/08_text_encoding.js8
3 files changed, 29 insertions, 0 deletions
diff --git a/cli/tests/unit/text_encoding_test.ts b/cli/tests/unit/text_encoding_test.ts
index b76e9a9bf..270fd07a8 100644
--- a/cli/tests/unit/text_encoding_test.ts
+++ b/cli/tests/unit/text_encoding_test.ts
@@ -319,3 +319,20 @@ Deno.test(function binaryEncode() {
assertEquals(Array.from(bytes), decodeBinary(binaryString));
}
});
+
+Deno.test(
+ { permissions: { read: true } },
+ async function textDecoderStreamCleansUpOnCancel() {
+ const filename = "cli/tests/testdata/assets/hello.txt";
+ const file = await Deno.open(filename);
+ const readable = file.readable.pipeThrough(new TextDecoderStream());
+ const chunks = [];
+ for await (const chunk of readable) {
+ chunks.push(chunk);
+ // breaking out of the loop prevents normal shutdown at end of async iterator values and triggers the cancel method of the stream instead
+ break;
+ }
+ assertEquals(chunks.length, 1);
+ assertEquals(chunks[0].length, 12);
+ },
+);
diff --git a/ext/web/06_streams.js b/ext/web/06_streams.js
index c5306ca9c..7ce045e68 100644
--- a/ext/web/06_streams.js
+++ b/ext/web/06_streams.js
@@ -6681,6 +6681,10 @@ webidl.converters.Transformer = webidl
converter: webidl.converters.Function,
},
{
+ key: "cancel",
+ converter: webidl.converters.Function,
+ },
+ {
key: "readableType",
converter: webidl.converters.any,
},
diff --git a/ext/web/08_text_encoding.js b/ext/web/08_text_encoding.js
index 45dbad538..5f8391e12 100644
--- a/ext/web/08_text_encoding.js
+++ b/ext/web/08_text_encoding.js
@@ -301,6 +301,14 @@ class TextDecoderStream {
return PromiseReject(err);
}
},
+ cancel: (_reason) => {
+ try {
+ const _ = this.#decoder.decode();
+ return PromiseResolve();
+ } catch (err) {
+ return PromiseReject(err);
+ }
+ },
});
this[webidl.brand] = webidl.brand;
}