diff options
-rw-r--r-- | cli/tests/unit/cache_api_test.ts | 24 | ||||
-rw-r--r-- | ext/cache/01_cache.js | 16 |
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. |