diff --git a/assets/webui/ofdgo.js b/assets/webui/ofdgo.js index 1baf76b..267b1f7 100644 --- a/assets/webui/ofdgo.js +++ b/assets/webui/ofdgo.js @@ -421,6 +421,7 @@ async function prepareOffline() { return false; } el.offlineStatus.textContent = "可离线"; + watchApplicationUpdates(result.checksum); } catch { el.offlineStatus.textContent = "未就绪"; } @@ -428,6 +429,29 @@ async function prepareOffline() { return true; } +function watchApplicationUpdates(checksum) { + let checking = false; + async function check() { + if (checking || document.hidden || !navigator.onLine) { + return; + } + checking = true; + try { + const response = await fetch("./", { method: "HEAD", cache: "no-store", signal: AbortSignal.timeout(10000) }); + const latest = response.headers.get("X-OFDGo-Checksum"); + if (response.ok && !response.redirected && latest) { + el.offlineStatus.textContent = latest === checksum ? "可离线" : "可更新"; + } + } catch { + } finally { + checking = false; + } + } + window.addEventListener("online", check); + document.addEventListener("visibilitychange", check); + check(); +} + function waitForWorker(worker, target) { return new Promise((resolve, reject) => { function changed() { diff --git a/assets/webui/ofdgo.sw.js b/assets/webui/ofdgo.sw.js index 1bbe881..15dd24a 100644 --- a/assets/webui/ofdgo.sw.js +++ b/assets/webui/ofdgo.sw.js @@ -25,24 +25,26 @@ self.addEventListener("message", (event) => { } event.waitUntil((async () => { try { - const reload = await navigator.locks.request(CACHE_PREFIX, async () => { + const result = await navigator.locks.request(CACHE_PREFIX, async () => { const meta = await caches.open(META_CACHE); await cleanBundles(meta); if (type === "refresh") { await updateBundle(meta); - return true; + return { reload: true }; } const bundle = await readBundle(meta, CLIENT_PREFIX + event.source.id); if (await isBundleComplete(bundle)) { - return false; + const cache = await caches.open(bundle.name); + const response = await cache.match(self.registration.scope); + return { reload: false, checksum: response.headers.get("X-OFDGo-Checksum") }; } await currentBundle(meta); - return true; + return { reload: true }; }); if (type === "refresh") { await self.skipWaiting(); } - port.postMessage({ ok: true, reload }); + port.postMessage({ ok: true, ...result }); } catch (err) { port.postMessage({ error: err.message }); } finally {