From 15bbd791f889c5c18529b9eefb548ec43f1289e6 Mon Sep 17 00:00:00 2001 From: John Date: Mon, 21 Mar 2022 13:54:15 +0000 Subject: [PATCH 1/5] Add cloudflare cache --- .changeset/pretty-carpets-scream.md | 5 +++++ packages/adapter-cloudflare/files/worker.js | 25 ++++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 .changeset/pretty-carpets-scream.md diff --git a/.changeset/pretty-carpets-scream.md b/.changeset/pretty-carpets-scream.md new file mode 100644 index 000000000000..869f0a9b168f --- /dev/null +++ b/.changeset/pretty-carpets-scream.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': patch +--- + +Add cloudflare cache to store responses with a cache header. diff --git a/packages/adapter-cloudflare/files/worker.js b/packages/adapter-cloudflare/files/worker.js index caa76b852a13..0fa22de1fe9c 100644 --- a/packages/adapter-cloudflare/files/worker.js +++ b/packages/adapter-cloudflare/files/worker.js @@ -50,12 +50,25 @@ export default { // dynamically-generated pages try { - return await server.respond(req, { - platform: { env, context }, - getClientAddress() { - return req.headers.get('cf-connecting-ip'); - } - }); + const cache = caches.default; + let response = await cache.match(req); + + if (!response) { + response = await server.respond(req, { + platform: { env, context }, + getClientAddress() { + return req.headers.get('cf-connecting-ip'); + } + }); + + // Use context so you can return the response without blocking on + // writing to cache + try { + context(cache.put(req, response.clone())); + } catch {} + } + + return response; } catch (e) { return new Response('Error rendering route: ' + (e.message || e.toString()), { status: 500 }); } From 22a489c1d67f9f6f6d930dd9005c3465c2eb5785 Mon Sep 17 00:00:00 2001 From: John Date: Mon, 21 Mar 2022 14:09:18 +0000 Subject: [PATCH 2/5] Fix linting issues --- packages/adapter-cloudflare/files/worker.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/adapter-cloudflare/files/worker.js b/packages/adapter-cloudflare/files/worker.js index 0fa22de1fe9c..33070c6616ad 100644 --- a/packages/adapter-cloudflare/files/worker.js +++ b/packages/adapter-cloudflare/files/worker.js @@ -50,6 +50,7 @@ export default { // dynamically-generated pages try { + // @ts-ignore const cache = caches.default; let response = await cache.match(req); @@ -65,7 +66,9 @@ export default { // writing to cache try { context(cache.put(req, response.clone())); - } catch {} + } catch { + // noop + } } return response; From 37da9e429d40e4a3cac652340821f33e275f4c92 Mon Sep 17 00:00:00 2001 From: John Date: Mon, 21 Mar 2022 18:00:44 +0000 Subject: [PATCH 3/5] Update packages/adapter-cloudflare/files/worker.js Co-authored-by: Luke Edwards --- packages/adapter-cloudflare/files/worker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adapter-cloudflare/files/worker.js b/packages/adapter-cloudflare/files/worker.js index 33070c6616ad..d9649ec6c8dc 100644 --- a/packages/adapter-cloudflare/files/worker.js +++ b/packages/adapter-cloudflare/files/worker.js @@ -65,7 +65,7 @@ export default { // Use context so you can return the response without blocking on // writing to cache try { - context(cache.put(req, response.clone())); + context.waitUntil(cache.put(req, response.clone())); } catch { // noop } From 3722b93a197597f5da12bf23059b11670922841d Mon Sep 17 00:00:00 2001 From: John Date: Thu, 24 Mar 2022 18:14:58 +0000 Subject: [PATCH 4/5] Add check for set-cookie --- packages/adapter-cloudflare/files/worker.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/adapter-cloudflare/files/worker.js b/packages/adapter-cloudflare/files/worker.js index d9649ec6c8dc..cc5b0530d789 100644 --- a/packages/adapter-cloudflare/files/worker.js +++ b/packages/adapter-cloudflare/files/worker.js @@ -50,7 +50,8 @@ export default { // dynamically-generated pages try { - // @ts-ignore + // `default` cache property exists in the cloudflare workers environment only. + // @ts-expect-error const cache = caches.default; let response = await cache.match(req); @@ -62,9 +63,15 @@ export default { } }); - // Use context so you can return the response without blocking on + // Use waitUntil so you can return the response without blocking on // writing to cache try { + // If cookies are being set, ensure we dont cache the page. + if (response.headers.has('Set-Cookie')) { + response = new Response(response.body, response); + response.headers.append('Cache-Control', 'private=Set-Cookie'); + } + context.waitUntil(cache.put(req, response.clone())); } catch { // noop From f877449eb57b976446151e9eeec418ab12517b42 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 24 Mar 2022 11:34:44 -0700 Subject: [PATCH 5/5] Update packages/adapter-cloudflare/files/worker.js --- packages/adapter-cloudflare/files/worker.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/adapter-cloudflare/files/worker.js b/packages/adapter-cloudflare/files/worker.js index cc5b0530d789..8a56e6a544db 100644 --- a/packages/adapter-cloudflare/files/worker.js +++ b/packages/adapter-cloudflare/files/worker.js @@ -50,8 +50,7 @@ export default { // dynamically-generated pages try { - // `default` cache property exists in the cloudflare workers environment only. - // @ts-expect-error + // @ts-expect-error - `default` exists only in the cloudflare workers environment const cache = caches.default; let response = await cache.match(req);