diff --git a/app/web/src/base/page/editor.tsx b/app/web/src/base/page/editor.tsx
index ecb312fe..5eb04857 100644
--- a/app/web/src/base/page/editor.tsx
+++ b/app/web/src/base/page/editor.tsx
@@ -136,6 +136,11 @@ export default page({
const Editor = local.Editor;
if (local.loading || !Editor) return ;
+ navigator.serviceWorker.controller?.postMessage({
+ type: "add-cache",
+ url: location.href,
+ });
+
return (
);
diff --git a/app/web/src/base/page/live.tsx b/app/web/src/base/page/live.tsx
index 2ffe6213..716beeb6 100644
--- a/app/web/src/base/page/live.tsx
+++ b/app/web/src/base/page/live.tsx
@@ -11,6 +11,11 @@ export default page({
params.page_id = params._;
}
+ navigator.serviceWorker.controller?.postMessage({
+ type: "add-cache",
+ url: location.href,
+ });
+
return (
{
if ("serviceWorker" in navigator) {
try {
await navigator.serviceWorker.register(
- new URL("./sworker.js", import.meta.url),
+ new URL("./sworker.ts", import.meta.url),
{
type: "module",
scope: "/",
diff --git a/app/web/src/sworker.js b/app/web/src/sworker.js
deleted file mode 100644
index 4400c931..00000000
--- a/app/web/src/sworker.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { manifest, version } from "@parcel/service-worker";
-
-async function install() {
- const cache = await caches.open(version);
- await cache.addAll(manifest);
-}
-addEventListener("install", (e) => e.waitUntil(install()));
-
-async function activate() {
- const keys = await caches.keys();
- await Promise.all(keys.map((key) => key !== version && caches.delete(key)));
-}
-addEventListener("activate", (e) => e.waitUntil(activate()));
diff --git a/app/web/src/sworker.ts b/app/web/src/sworker.ts
new file mode 100644
index 00000000..b1941aab
--- /dev/null
+++ b/app/web/src/sworker.ts
@@ -0,0 +1,40 @@
+import { manifest, version } from "@parcel/service-worker";
+
+async function install() {
+ const cache = await caches.open(version);
+ await cache.addAll(manifest);
+}
+addEventListener("install", (e) => (e as ExtendableEvent).waitUntil(install()));
+
+async function activate() {
+ const keys = await caches.keys();
+ await Promise.all(keys.map((key) => key !== version && caches.delete(key)));
+}
+addEventListener("activate", (e) =>
+ (e as ExtendableEvent).waitUntil(activate())
+);
+
+addEventListener("fetch", async (evt) => {
+ const e = evt as FetchEvent;
+ e.respondWith(
+ (async () => {
+ const r = await caches.match(e.request);
+ if (r) {
+ return r;
+ }
+ return await fetch(e.request);
+ })()
+ );
+});
+addEventListener("message", async (e) => {
+ const type = e.data.type;
+ const cache = await caches.open(version);
+
+ switch (type) {
+ case "add-cache":
+ if (!(await cache.match(e.data.url))) {
+ await cache.add(e.data.url);
+ }
+ break;
+ }
+});