diff --git a/docker/nginx.conf b/docker/nginx.conf
index 7f7313e00..d5c0efadb 100644
--- a/docker/nginx.conf
+++ b/docker/nginx.conf
@@ -1,8 +1,6 @@
-map $sent_http_content_type $expires {
- # cache everything for 1 year
- default 1y;
- # html files shouldn't be cached for single-page applications
- text/html off;
+map $sent_http_content_type $cc_header {
+ default "public, max-age=31536000";
+ text/html "no-cache";
}
server {
@@ -17,10 +15,7 @@ server {
index index.html index.htm;
try_files $uri /console/index.html;
- # Add cache headers
- expires $expires;
- add_header Pragma public;
- add_header Cache-Control "public";
+ add_header Cache-Control $cc_header always;
# Deny IE browsers from going into quirks mode
add_header X-UA-Compatible "IE=Edge";
diff --git a/src/service-worker.ts b/src/service-worker.ts
index b34bc0445..23f5988aa 100644
--- a/src/service-worker.ts
+++ b/src/service-worker.ts
@@ -3,88 +3,23 @@
///
///
-import { build, files, version, base } from '$service-worker';
+import { build, files } from '$service-worker';
const sw = self as unknown as ServiceWorkerGlobalScope;
-// Create a unique cache name for this deployment
-const CACHE = `cache-${version}`;
-
const ASSETS = [
...build, // the app itself
...files // everything in `static`
];
+// Preload all assets
sw.addEventListener('install', (event) => {
- // Create a new cache and add all files to it
- async function addFilesToCache() {
- const cache = await caches.open(CACHE);
- await cache.addAll(ASSETS);
- }
-
- // Check if the page URL does not match the exclusion path
- const shouldCache = !location.pathname.startsWith(`${base}/auth`);
- if (shouldCache) {
- event.waitUntil(addFilesToCache());
- }
+ event.waitUntil(Promise.allSettled(ASSETS.map((asset) => fetch(asset))));
});
+// Clean up all old caches left by previous service workers
sw.addEventListener('activate', (event) => {
- // Remove previous cached data from disk
- async function deleteOldCaches() {
- for (const key of await caches.keys()) {
- if (key !== CACHE) await caches.delete(key);
- }
- }
-
- event.waitUntil(deleteOldCaches());
-});
-
-sw.addEventListener('fetch', (event) => {
- // ignore POST requests etc
- if (event.request.method !== 'GET') return;
-
- async function respond() {
- const url = new URL(event.request.url);
- const cache = await caches.open(CACHE);
-
- // `build`/`files` can always be served from the cache
- if (ASSETS.includes(url.pathname)) {
- const response = await cache.match(url.pathname);
-
- if (response) {
- return response;
- }
- }
-
- // for everything else, try the network first, but
- // fall back to the cache if we're offline
- try {
- const response = await fetch(event.request);
-
- // if we're offline, fetch can return a value that is not a Response
- // instead of throwing - and we can't pass this non-Response to respondWith
- if (!(response instanceof Response)) {
- throw new Error('invalid response from fetch');
- }
-
- if (response.status === 200) {
- cache.put(event.request, response.clone());
- }
-
- return response;
- } catch (err) {
- const response = await cache.match(event.request);
-
- if (response) {
- return response;
- }
-
- // if there's no cache, then just error out
- // as there is nothing we can do to respond to this request
- throw err;
- }
- }
-
- event.respondWith(respond());
+ event.waitUntil(
+ caches.keys().then((keys) => Promise.all(keys.map((key) => caches.delete(key))))
+ );
});