mirror of
https://github.com/amir20/dozzle.git
synced 2026-06-23 04:10:12 +00:00
af4412f667
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
55 lines
1.3 KiB
Go
55 lines
1.3 KiB
Go
package web
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
)
|
|
|
|
const serviceWorkerTemplate = `
|
|
const CACHE_NAME = "dozzle-%s";
|
|
|
|
self.addEventListener("install", (event) => {
|
|
self.skipWaiting();
|
|
});
|
|
|
|
self.addEventListener("activate", (event) => {
|
|
event.waitUntil(
|
|
caches.keys().then((names) =>
|
|
Promise.all(
|
|
names.filter((name) => name !== CACHE_NAME).map((name) => caches.delete(name))
|
|
)
|
|
)
|
|
);
|
|
self.clients.claim();
|
|
});
|
|
|
|
self.addEventListener("fetch", (event) => {
|
|
const url = new URL(event.request.url);
|
|
|
|
// Cache immutable hashed assets (Vite adds hashes to filenames)
|
|
if (url.pathname.match(/\/assets\/.*\.[a-f0-9]{8}\./)) {
|
|
event.respondWith(
|
|
caches.match(event.request).then((cached) => {
|
|
if (cached) return cached;
|
|
return fetch(event.request).then((response) => {
|
|
if (response.ok) {
|
|
const clone = response.clone();
|
|
caches.open(CACHE_NAME).then((cache) => cache.put(event.request, clone));
|
|
}
|
|
return response;
|
|
});
|
|
})
|
|
);
|
|
return;
|
|
}
|
|
|
|
// Network-first for everything else (API calls, HTML, etc.)
|
|
});
|
|
`
|
|
|
|
func (h *handler) serviceWorker(w http.ResponseWriter, _ *http.Request) {
|
|
w.Header().Set("Content-Type", "application/javascript")
|
|
w.Header().Set("Cache-Control", "no-cache")
|
|
fmt.Fprintf(w, serviceWorkerTemplate, h.config.Version)
|
|
}
|