const CONTENT_CACHE_NAME = "healer-man-content-v1"; const MANAGED_ASSET_PREFIXES = [ "/assets/characters/", "/assets/creatures/", "/assets/equipment/", "/assets/game/", "/assets/ui/", ]; const BUNDLED_ASSET_PREFIXES = [ "/assets/ui/", "/assets/equipment/", "/assets/characters/wow335a-v1/manifest.json", "/assets/characters/wow335a-v1/human/", "/assets/creatures/wailing-caverns/", "/assets/game/arenas/", "/assets/game/dungeons/wailing-caverns/", ]; const BUNDLED_ASSET_PATHS = new Set([ "/assets/characters/wow335a-v1/textures/character/human/faciallowerhair00_00.webp", "/assets/characters/wow335a-v1/textures/character/human/facialupperhair00_00.webp", "/assets/characters/wow335a-v1/textures/character/human/female/humanfemalefacelower00_00.webp", "/assets/characters/wow335a-v1/textures/character/human/female/humanfemalefaceupper00_00.webp", "/assets/characters/wow335a-v1/textures/character/human/female/humanfemalenakedpelvisskin00_00.webp", "/assets/characters/wow335a-v1/textures/character/human/female/humanfemalenakedtorsoskin00_00.webp", "/assets/characters/wow335a-v1/textures/character/human/female/humanfemaleskin00_00.webp", "/assets/characters/wow335a-v1/textures/character/human/hair00_00.webp", "/assets/characters/wow335a-v1/textures/character/human/male/humanmalefacelower00_00.webp", "/assets/characters/wow335a-v1/textures/character/human/male/humanmalefaceupper00_00.webp", "/assets/characters/wow335a-v1/textures/character/human/male/humanmalenakedpelvisskin00_00.webp", "/assets/characters/wow335a-v1/textures/character/human/male/humanmaleskin00_00.webp", "/assets/characters/wow335a-v1/textures/character/human/scalplowerhair00_00.webp", "/assets/characters/wow335a-v1/textures/character/human/scalpupperhair00_00.webp", ]); self.addEventListener("install", (event) => { event.waitUntil(self.skipWaiting()); }); self.addEventListener("activate", (event) => { event.waitUntil((async () => { const names = await caches.keys(); await Promise.all(names .filter((name) => name.startsWith(`${CONTENT_CACHE_NAME}-staging-`)) .map((name) => caches.delete(name))); await self.clients.claim(); })()); }); self.addEventListener("fetch", (event) => { const { request } = event; if (request.method !== "GET") return; const url = new URL(request.url); if (url.origin !== self.location.origin || !MANAGED_ASSET_PREFIXES.some((prefix) => url.pathname.startsWith(prefix))) return; event.respondWith((async () => { const cache = await caches.open(CONTENT_CACHE_NAME); const cached = await cache.match(request, { ignoreSearch: true }); if (cached) return cached; if (BUNDLED_ASSET_PATHS.has(url.pathname) || BUNDLED_ASSET_PREFIXES.some((prefix) => url.pathname.startsWith(prefix))) { return fetch(request); } return new Response("Optional content is not installed.", { status: 404, headers: { "content-type": "text/plain; charset=utf-8" }, }); })()); });