summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/tests/unit/cache_api_test.ts24
-rw-r--r--ext/cache/01_cache.js16
2 files changed, 32 insertions, 8 deletions
diff --git a/cli/tests/unit/cache_api_test.ts b/cli/tests/unit/cache_api_test.ts
index 8b84bfc6d..16996c821 100644
--- a/cli/tests/unit/cache_api_test.ts
+++ b/cli/tests/unit/cache_api_test.ts
@@ -106,7 +106,7 @@ Deno.test(async function cachePutReaderLock() {
response,
);
- assertRejects(
+ await assertRejects(
async () => {
await response.arrayBuffer();
},
@@ -116,3 +116,25 @@ Deno.test(async function cachePutReaderLock() {
await promise;
});
+
+Deno.test(async function cachePutResourceLeak() {
+ const cacheName = "cache-v1";
+ const cache = await caches.open(cacheName);
+
+ const stream = new ReadableStream({
+ start(controller) {
+ controller.error(new Error("leak"));
+ },
+ });
+
+ await assertRejects(
+ async () => {
+ await cache.put(
+ new Request("https://example.com/"),
+ new Response(stream),
+ );
+ },
+ Error,
+ "leak",
+ );
+});
diff --git a/ext/cache/01_cache.js b/ext/cache/01_cache.js
index c2843cedb..c22390a6d 100644
--- a/ext/cache/01_cache.js
+++ b/ext/cache/01_cache.js
@@ -141,15 +141,17 @@
},
);
if (reader) {
- while (true) {
- const { value, done } = await reader.read();
- if (done) {
- await core.shutdown(rid);
- core.close(rid);
- break;
- } else {
+ try {
+ while (true) {
+ const { value, done } = await reader.read();
+ if (done) {
+ break;
+ }
await core.write(rid, value);
}
+ } finally {
+ await core.shutdown(rid);
+ core.close(rid);
}
}
// Step 12-19: TODO(@satyarohith): do the insertion in background.