70 lines
2.9 KiB
JavaScript
70 lines
2.9 KiB
JavaScript
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" },
|
|
});
|
|
})());
|
|
});
|