Merge pull request #1813 from appwrite/fix-remove-nginx-caching

fix: adjust service worker and nginx caching
This commit is contained in:
Torsten Dittmann
2025-04-22 16:58:54 +02:00
committed by GitHub
2 changed files with 11 additions and 81 deletions
+4 -9
View File
@@ -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";
+7 -72
View File
@@ -3,88 +3,23 @@
/// <reference lib="esnext" />
/// <reference lib="webworker" />
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))))
);
});