/// <reference lib="esnext" />
/// <reference lib="webworker" />
/**
 * Cozsweet PWA Service Worker (Serwist source)
 *
 * 编译链：
 *   src/app/sw.ts (此文件)
 *     → esbuild (Serwist Turbopack 在 build 时跑)
 *       → /serwist/sw.js (App Router Route Handler 服务)
 *
 * precache 列表由 `withSerwist` 在 build 时注入 `self.__SW_MANIFEST`。
 * Runtime cache 用 `defaultCache`（Serwist 推荐的 Google Fonts / Static / Image
 * 缓存策略）—— 对聊天类应用够用。
 *
 * 配置：
 *   - skipWaiting: true     新 SW 立即 activate，避免旧 SW 卡住页面
 *   - clientsClaim: true    新 SW 立即接管所有打开的 client
 *   - navigationPreload:    用 preload API 加速文档请求（资源请求 SW 完成前先发）
 *
 * Offline fallback：`/~offline` 路由（serwist route handler 里也登记了
 * `additionalPrecacheEntries`，双保险）。对应页面：
 * `src/app/~offline/page.tsx`。
 */
import { defaultCache } from "@serwist/turbopack/worker";
import type { PrecacheEntry, SerwistGlobalConfig } from "serwist";
import { Serwist } from "serwist";

declare global {
  interface WorkerGlobalScope extends SerwistGlobalConfig {
    __SW_MANIFEST: (PrecacheEntry | string)[] | undefined;
  }
}

declare const self: ServiceWorkerGlobalScope;

const serwist = new Serwist({
  precacheEntries: self.__SW_MANIFEST,
  skipWaiting: true,
  clientsClaim: true,
  navigationPreload: true,
  runtimeCaching: defaultCache,
  fallbacks: {
    entries: [
      {
        url: "/~offline",
        matcher({ request }) {
          return request.destination === "document";
        },
      },
    ],
  },
});

serwist.addEventListeners();
