mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-30 09:37:26 +08:00
1 parent
7a39cb3d29
commit
331e26b71e
1 file changed
+34
-20
+34
-20
@@ -4188,37 +4188,50 @@ async function prepareOffline() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function applicationChecksum(path, options) {
|
||||||
|
const response = await fetch(path, { ...options, signal: AbortSignal.timeout(10000) });
|
||||||
|
try {
|
||||||
|
return response.ok && !response.redirected ? response.headers.get("X-OFDGo-Checksum") : null;
|
||||||
|
} finally {
|
||||||
|
await response.body?.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function watchApplicationUpdates(checksum) {
|
function watchApplicationUpdates(checksum) {
|
||||||
let checking = false;
|
let checking = false;
|
||||||
let checked = 0;
|
let retry = false;
|
||||||
async function check() {
|
async function check(force = false) {
|
||||||
if (checking || document.hidden || !navigator.onLine || Date.now() - checked < 60000) {
|
if (checking) {
|
||||||
|
if (force === true) retry = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (document.hidden || !navigator.onLine) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
checking = true;
|
checking = true;
|
||||||
checked = Date.now();
|
|
||||||
try {
|
try {
|
||||||
if (!checksum) {
|
if (!checksum) {
|
||||||
if (!navigator.serviceWorker.controller) return;
|
if (!navigator.serviceWorker.controller) return;
|
||||||
const current = await fetch("./ofdgo.js", { signal: AbortSignal.timeout(10000) });
|
checksum = await applicationChecksum("./ofdgo.js");
|
||||||
if (current.ok && !current.redirected) checksum = current.headers.get("X-OFDGo-Checksum");
|
|
||||||
await current.body?.cancel();
|
|
||||||
if (!checksum) return;
|
if (!checksum) return;
|
||||||
}
|
}
|
||||||
const response = await fetch("./", { method: "HEAD", cache: "no-store", signal: AbortSignal.timeout(10000) });
|
const latest = await applicationChecksum("./", { method: "HEAD", cache: "no-store" });
|
||||||
const latest = response.headers.get("X-OFDGo-Checksum");
|
if (latest) {
|
||||||
if (response.ok && !response.redirected && latest) {
|
|
||||||
el.refreshAppButton.hidden = latest === checksum;
|
el.refreshAppButton.hidden = latest === checksum;
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
} finally {
|
} finally {
|
||||||
checking = false;
|
checking = false;
|
||||||
|
if (retry) {
|
||||||
|
retry = false;
|
||||||
|
check(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
window.addEventListener("online", check);
|
}
|
||||||
|
window.addEventListener("online", () => check(true));
|
||||||
window.addEventListener("focus", check);
|
window.addEventListener("focus", check);
|
||||||
|
window.addEventListener("pageshow", check);
|
||||||
document.addEventListener("visibilitychange", check);
|
document.addEventListener("visibilitychange", check);
|
||||||
window.setInterval(check, 300000);
|
|
||||||
check();
|
check();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4229,18 +4242,19 @@ function waitForWorker(worker, target) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const timer = setTimeout(() => {
|
const timer = setTimeout(() => {
|
||||||
worker.removeEventListener("statechange", changed);
|
finish(new Error("更新等待超时"));
|
||||||
reject(new Error("更新等待超时"));
|
|
||||||
}, 30000);
|
}, 30000);
|
||||||
|
function finish(error) {
|
||||||
|
clearTimeout(timer);
|
||||||
|
worker.removeEventListener("statechange", changed);
|
||||||
|
if (error) reject(error);
|
||||||
|
else resolve();
|
||||||
|
}
|
||||||
function changed() {
|
function changed() {
|
||||||
if (worker.state === target || worker.state === "activated") {
|
if (worker.state === target || worker.state === "activated") {
|
||||||
clearTimeout(timer);
|
finish();
|
||||||
worker.removeEventListener("statechange", changed);
|
|
||||||
resolve();
|
|
||||||
} else if (worker.state === "redundant") {
|
} else if (worker.state === "redundant") {
|
||||||
clearTimeout(timer);
|
finish(new Error("离线启动失败"));
|
||||||
worker.removeEventListener("statechange", changed);
|
|
||||||
reject(new Error("离线启动失败"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
worker.addEventListener("statechange", changed);
|
worker.addEventListener("statechange", changed);
|
||||||
|
|||||||
Reference in new issue
Block a user