From 0177ebafa9cc36dd3cb12ec4fe7b27985a91b5f2 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 21 Jul 2020 08:31:51 -0400 Subject: [PATCH] feat: respect cache headers --- src/get-cache-key.ts | 16 ++++++++++++++++ src/index.ts | 20 ++++++++++++-------- src/response.ts | 1 + 3 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 src/get-cache-key.ts diff --git a/src/get-cache-key.ts b/src/get-cache-key.ts new file mode 100644 index 0000000..de8dec9 --- /dev/null +++ b/src/get-cache-key.ts @@ -0,0 +1,16 @@ +export function getCacheKey(request: Request): string | null { + const pragma = request.headers.get("pragma"); + if (pragma === "no-cache") { + return null; + } + + const cacheControl = request.headers.get("cache-control"); + if (cacheControl) { + const directives = new Set(cacheControl.split(",").map((s) => s.trim())); + if (directives.has("no-store") || directives.has("no-cache")) { + return null; + } + } + + return request.url; +} diff --git a/src/index.ts b/src/index.ts index 0f9a31a..435ad32 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,6 +6,7 @@ import { tableRoute } from "./routes/table"; import { userRoute } from "./routes/user"; import { searchRoute } from "./routes/search"; import { createResponse } from "./response"; +import { getCacheKey } from "./get-cache-key"; import * as types from "./api/types"; export type Handler = ( @@ -55,14 +56,14 @@ const handleRequest = async (fetchEvent: FetchEvent): Promise => { return new Response("Endpoint not found.", { status: 404 }); } - const cacheKey = request.url; + const cacheKey = getCacheKey(request); let response; - try { - const cachedResponse = await cache.match(cacheKey); - if (cachedResponse) { - response = cachedResponse; - } - } catch (err) {} + + if (cacheKey) { + try { + response = await cache.match(cacheKey); + } catch (err) {} + } const getResponseAndPersist = async () => { const res = await match.handler({ @@ -72,7 +73,10 @@ const handleRequest = async (fetchEvent: FetchEvent): Promise => { notionToken, }); - await cache.put(cacheKey, res.clone()); + if (cacheKey) { + await cache.put(cacheKey, res.clone()); + } + return res; }; diff --git a/src/response.ts b/src/response.ts index 54809bc..90caf91 100644 --- a/src/response.ts +++ b/src/response.ts @@ -10,6 +10,7 @@ export const createResponse = ( headers: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "GET, OPTIONS", + "Content-Type": "application/json", ...headers, }, });