atagen

malice

public
Star0
Watch0
31897439eac76c5520baf2ca6f60165369c78338
2
ssh://brewery@pls.lobotomise.me:33/atagen/malice.git

Blame: web/src/sw.ts

d8772d4eb408atagen2026-10-26 04:43 UTC1
import { AVATAR_CACHE, handleMediaFetch } from './sw-media';
d8772d4eb408atagen2026-10-26 04:43 UTC2
d8772d4eb408atagen2026-10-26 04:43 UTC3
declare const __MALICE_DEVICE__: boolean;
973f8fbdaf80atagen2026-09-28 09:10 UTC4
973f8fbdaf80atagen2026-09-28 09:10 UTC5
// Prepended by vite.config.ts's precacheManifestPlugin: every emitted chunk,
973f8fbdaf80atagen2026-09-28 09:10 UTC6
// asset, and the wasm, as root-relative URLs.
973f8fbdaf80atagen2026-09-28 09:10 UTC7
const sw = self as unknown as ServiceWorkerGlobalScope & { __MALICE_PRECACHE__: string[] };
973f8fbdaf80atagen2026-09-28 09:10 UTC8
973f8fbdaf80atagen2026-09-28 09:10 UTC9
const CACHE_NAME = 'malice-shell-v1';
973f8fbdaf80atagen2026-09-28 09:10 UTC10
973f8fbdaf80atagen2026-09-28 09:10 UTC11
sw.addEventListener('install', (event) => {
973f8fbdaf80atagen2026-09-28 09:10 UTC12
  event.waitUntil(
973f8fbdaf80atagen2026-09-28 09:10 UTC13
    (async () => {
973f8fbdaf80atagen2026-09-28 09:10 UTC14
      const cache = await caches.open(CACHE_NAME);
973f8fbdaf80atagen2026-09-28 09:10 UTC15
      await cache.addAll(['/', '/index.html', ...sw.__MALICE_PRECACHE__]);
973f8fbdaf80atagen2026-09-28 09:10 UTC16
    })()
973f8fbdaf80atagen2026-09-28 09:10 UTC17
  );
d8772d4eb408atagen2026-10-26 04:43 UTC18
});
d8772d4eb408atagen2026-10-26 04:43 UTC19
d8772d4eb408atagen2026-10-26 04:43 UTC20
sw.addEventListener('message', (event) => {
d8772d4eb408atagen2026-10-26 04:43 UTC21
  if (event.data?.type === 'SKIP_WAITING') void sw.skipWaiting();
973f8fbdaf80atagen2026-09-28 09:10 UTC22
});
973f8fbdaf80atagen2026-09-28 09:10 UTC23
973f8fbdaf80atagen2026-09-28 09:10 UTC24
sw.addEventListener('activate', (event) => {
973f8fbdaf80atagen2026-09-28 09:10 UTC25
  event.waitUntil(
973f8fbdaf80atagen2026-09-28 09:10 UTC26
    (async () => {
973f8fbdaf80atagen2026-09-28 09:10 UTC27
      const keys = await caches.keys();
cf23dbf4e77catagen2026-10-23 06:36 UTC28
      await Promise.all(keys.filter((key) => key !== CACHE_NAME && key !== AVATAR_CACHE).map((key) => caches.delete(key)));
919753ab134catagen2026-10-26 03:48 UTC29
      const shell = await caches.open(CACHE_NAME);
919753ab134catagen2026-10-26 03:48 UTC30
      const keep = new Set(['/', '/index.html', ...sw.__MALICE_PRECACHE__]);
919753ab134catagen2026-10-26 03:48 UTC31
      for (const request of await shell.keys()) {
919753ab134catagen2026-10-26 03:48 UTC32
        const path = new URL(request.url).pathname;
919753ab134catagen2026-10-26 03:48 UTC33
        if (path.startsWith('/assets/') && !keep.has(path)) await shell.delete(request);
919753ab134catagen2026-10-26 03:48 UTC34
      }
973f8fbdaf80atagen2026-09-28 09:10 UTC35
      await sw.clients.claim();
973f8fbdaf80atagen2026-09-28 09:10 UTC36
    })()
973f8fbdaf80atagen2026-09-28 09:10 UTC37
  );
973f8fbdaf80atagen2026-09-28 09:10 UTC38
});
973f8fbdaf80atagen2026-09-28 09:10 UTC39
973f8fbdaf80atagen2026-09-28 09:10 UTC40
async function cacheFirst(request: Request): Promise<Response> {
973f8fbdaf80atagen2026-09-28 09:10 UTC41
  const cached = await caches.match(request);
973f8fbdaf80atagen2026-09-28 09:10 UTC42
  if (cached) return cached;
973f8fbdaf80atagen2026-09-28 09:10 UTC43
  const response = await fetch(request);
973f8fbdaf80atagen2026-09-28 09:10 UTC44
  if (response.ok) {
973f8fbdaf80atagen2026-09-28 09:10 UTC45
    const cache = await caches.open(CACHE_NAME);
973f8fbdaf80atagen2026-09-28 09:10 UTC46
    void cache.put(request, response.clone());
973f8fbdaf80atagen2026-09-28 09:10 UTC47
  }
973f8fbdaf80atagen2026-09-28 09:10 UTC48
  return response;
973f8fbdaf80atagen2026-09-28 09:10 UTC49
}
973f8fbdaf80atagen2026-09-28 09:10 UTC50
973f8fbdaf80atagen2026-09-28 09:10 UTC51
async function networkFirstNavigation(request: Request): Promise<Response> {
973f8fbdaf80atagen2026-09-28 09:10 UTC52
  try {
973f8fbdaf80atagen2026-09-28 09:10 UTC53
    return await fetch(request);
973f8fbdaf80atagen2026-09-28 09:10 UTC54
  } catch {
973f8fbdaf80atagen2026-09-28 09:10 UTC55
    const cached = await caches.match('/index.html');
973f8fbdaf80atagen2026-09-28 09:10 UTC56
    if (cached) return cached;
973f8fbdaf80atagen2026-09-28 09:10 UTC57
    throw new Error('offline and no cached shell');
973f8fbdaf80atagen2026-09-28 09:10 UTC58
  }
973f8fbdaf80atagen2026-09-28 09:10 UTC59
}
973f8fbdaf80atagen2026-09-28 09:10 UTC60
973f8fbdaf80atagen2026-09-28 09:10 UTC61
sw.addEventListener('fetch', (event) => {
973f8fbdaf80atagen2026-09-28 09:10 UTC62
  const url = new URL(event.request.url);
973f8fbdaf80atagen2026-09-28 09:10 UTC63
d8772d4eb408atagen2026-10-26 04:43 UTC64
  if (__MALICE_DEVICE__ && handleMediaFetch(event)) return;
d8772d4eb408atagen2026-10-26 04:43 UTC65
  if (url.pathname.startsWith('/api/')) return;
544a170ead2catagen2026-10-20 11:47 UTC66
  if (url.pathname.startsWith('/assets/') || url.pathname.startsWith('/twemoji/')) {
973f8fbdaf80atagen2026-09-28 09:10 UTC67
    event.respondWith(cacheFirst(event.request));
973f8fbdaf80atagen2026-09-28 09:10 UTC68
    return;
973f8fbdaf80atagen2026-09-28 09:10 UTC69
  }
973f8fbdaf80atagen2026-09-28 09:10 UTC70
  if (event.request.mode === 'navigate') {
973f8fbdaf80atagen2026-09-28 09:10 UTC71
    event.respondWith(networkFirstNavigation(event.request));
973f8fbdaf80atagen2026-09-28 09:10 UTC72
  }
973f8fbdaf80atagen2026-09-28 09:10 UTC73
});
d8772d4eb408atagen2026-10-26 04:43 UTC74
d8772d4eb408atagen2026-10-26 04:43 UTC75
sw.addEventListener('notificationclick', (event) => {
d8772d4eb408atagen2026-10-26 04:43 UTC76
  event.notification.close();
d8772d4eb408atagen2026-10-26 04:43 UTC77
  const roomId = (event.notification.data as { roomId?: unknown } | null)?.roomId;
d8772d4eb408atagen2026-10-26 04:43 UTC78
  if (typeof roomId !== 'string') return;
d8772d4eb408atagen2026-10-26 04:43 UTC79
  event.waitUntil(
d8772d4eb408atagen2026-10-26 04:43 UTC80
    (async () => {
d8772d4eb408atagen2026-10-26 04:43 UTC81
      const windows = await sw.clients.matchAll({ type: 'window', includeUncontrolled: true });
d8772d4eb408atagen2026-10-26 04:43 UTC82
      const existing = windows.find((client) => client.visibilityState === 'visible') ?? windows[0];
d8772d4eb408atagen2026-10-26 04:43 UTC83
      if (!existing) {
d8772d4eb408atagen2026-10-26 04:43 UTC84
        await sw.clients.openWindow(`/?room=${encodeURIComponent(roomId)}`);
d8772d4eb408atagen2026-10-26 04:43 UTC85
        return;
d8772d4eb408atagen2026-10-26 04:43 UTC86
      }
d8772d4eb408atagen2026-10-26 04:43 UTC87
      existing.postMessage({ type: 'malice-open-room', roomId });
d8772d4eb408atagen2026-10-26 04:43 UTC88
      await existing.focus();
d8772d4eb408atagen2026-10-26 04:43 UTC89
    })()
d8772d4eb408atagen2026-10-26 04:43 UTC90
  );
d8772d4eb408atagen2026-10-26 04:43 UTC91
});