UNPKG

radish

Version:

Radish is a React-based static site generator that outputs plain HTML and CSS.

61 lines (60 loc) 2.29 kB
const VERSION = "v1"; const PAGES_CACHE = `pages_${VERSION}`; const ASSET_CACHE = `assets_${VERSION}`; const CACHES = new Set([PAGES_CACHE, ASSET_CACHE]); const SW_CACHE_KEY = "sw-cache-expires"; const DEFAULT_MAX_AGE = 0; const DEFAULT_PUBLIC_MAX_AGE = 31_557_600; self.addEventListener("activate", event => { event.waitUntil(caches .keys() .then(keys => { const deletes = keys .filter(key => !CACHES.has(key)) .map(key => caches.delete(key)); return Promise.all(deletes); }) .then(() => self.clients.claim())); }); self.addEventListener("fetch", event => { event.respondWith(caches.match(event.request.url).then(cached => { const expires = Number(cached?.headers.get(SW_CACHE_KEY)); if (cached && new Date().getTime() / 1000 < expires) return cached; const url = new URL(event.request.url); const isPublic = url.pathname.startsWith(PUBLIC_PATH); const fresh = fetch(event.request) .then(res => { if (!res || res.status !== 200 || res.type !== "basic") return res; const control = cacheControl(res.headers.get("cache-control") || ""); if (control["no-store"]) return res; const defaultMaxAge = isPublic ? DEFAULT_PUBLIC_MAX_AGE : DEFAULT_MAX_AGE; const maxAge = control["max-age"] ?? defaultMaxAge, expires = Math.trunc(new Date().getTime() / 1000) + maxAge; const clone = res.clone(); const headers = [...clone.headers, [SW_CACHE_KEY, "" + expires]]; caches.open(isPublic ? ASSET_CACHE : PAGES_CACHE).then(cache => { cache.put(event.request.url, new Response(clone.body, { headers })); }); return res; }) .catch(() => cached || new Response("Page not available.")); return fresh; })); }); function cacheControl(header) { const result = {}; if (!header) return {}; const directives = header.split(/, ?/).map(val => val.split("=")); for (const [key, val] of directives) { if (!key) continue; result[key] = val ? Number(val) : 1; } return result; } export {};