Files
Amir Raminfar af4412f667 feat: add PWA support with dynamic base URL (#4608)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 13:09:13 -07:00

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)
}