Files
fusion/packages/dashboard/app/public/sw.js
gsxdsm ed84a728c2 feat(FN-1093): add mobile build, PWA, and live reload workflow
- Optimize dashboard Vite output for mobile and include vite/client types in app typecheck
- Add PWA support with manifest, service worker, icons, and client registration hooks
- Add a mobile workspace package with Capacitor config and live-reload scripts for local development
- Add a dedicated GitHub Actions mobile pipeline and update mobile workflow documentation
- Add dashboard tests for build output, mobile scripts, and PWA asset coverage
2026-04-07 23:25:34 -07:00

91 lines
2.3 KiB
JavaScript

const CACHE_NAME = "fusion-cache-v1";
const APP_SHELL_URLS = [
"/",
"/index.html",
"/manifest.json",
"/logo.svg",
"/icons/icon-192.png",
"/icons/icon-512.png",
];
self.addEventListener("install", (event) => {
event.waitUntil((async () => {
try {
const cache = await caches.open(CACHE_NAME);
await cache.addAll(APP_SHELL_URLS);
} catch (error) {
console.warn("[sw] install cache warmup failed", error);
}
})());
});
self.addEventListener("activate", (event) => {
event.waitUntil((async () => {
try {
const keys = await caches.keys();
await Promise.all(
keys
.filter((key) => key !== CACHE_NAME)
.map((key) => caches.delete(key)),
);
await self.clients.claim();
} catch (error) {
console.warn("[sw] activate cleanup failed", error);
}
})());
});
self.addEventListener("fetch", (event) => {
const request = event.request;
if (request.method !== "GET") {
return;
}
const url = new URL(request.url);
const isApiRequest = url.pathname.startsWith("/api/");
if (isApiRequest) {
event.respondWith((async () => {
try {
const networkResponse = await fetch(request);
try {
const cache = await caches.open(CACHE_NAME);
await cache.put(request, networkResponse.clone());
} catch (cacheError) {
console.warn("[sw] api cache put failed", cacheError);
}
return networkResponse;
} catch (networkError) {
try {
const cachedResponse = await caches.match(request);
if (cachedResponse) {
return cachedResponse;
}
} catch (cacheError) {
console.warn("[sw] api cache lookup failed", cacheError);
}
throw networkError;
}
})());
return;
}
event.respondWith((async () => {
try {
const cache = await caches.open(CACHE_NAME);
const cachedResponse = await cache.match(request);
if (cachedResponse) {
return cachedResponse;
}
const networkResponse = await fetch(request);
await cache.put(request, networkResponse.clone());
return networkResponse;
} catch (error) {
console.warn("[sw] static cache flow failed", error);
return fetch(request);
}
})());
});