diff --git a/client/index.ts b/client/index.ts index 2045029..752bce3 100644 --- a/client/index.ts +++ b/client/index.ts @@ -24,4 +24,15 @@ const onResize = () => { } // deno-lint-ignore no-window no-window-prefix window.addEventListener('resize', onResize) -onResize() \ No newline at end of file +onResize() + +// @ts-ignore 工作正常, 这里是获取为 URL 以便于构建 +import sw from './sw.ts?worker&url' + +if ("serviceWorker" in navigator) + try { + navigator.serviceWorker + .register(sw as URL) + } catch (e) { + console.error(e) + } diff --git a/client/sw.ts b/client/sw.ts new file mode 100644 index 0000000..9e30143 --- /dev/null +++ b/client/sw.ts @@ -0,0 +1,30 @@ +interface FetchEvent extends Event { + waitUntil: (p: Promise) => void + request: Request + respondWith: (r: Response | Promise) => void +} + +// 上传文件的代理与缓存 +self.addEventListener("fetch", (e) => { + const event = e as FetchEvent + if (event.request.method != "GET" || event.request.url.indexOf("/uploaded_files/") == -1) return + + event.respondWith( + (async () => { + const cache = await caches.open("LingChair-UploadedFile-Cache") + const cachedResponse = await cache.match(event.request) + if (cachedResponse) { + event.waitUntil(cache.add(event.request)) + return cachedResponse + } + return fetch({ + ...event.request, + headers: { + ...event.request.headers, + // 目前还不能获取 token + // localsotrage 在这里不可用 + } + }) + })() + ) +})