diff --git a/package.json b/package.json index e3ad3a76..70de97c3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "impro", - "version": "0.17.108", + "version": "0.17.109", "type": "module", "scripts": { "start": "rm -rf \"${BUILD_DIR:-build}\" && NODE_ENV=development eleventy --serve", diff --git a/src/index.html b/src/index.html index 7a382bcc..27306289 100644 --- a/src/index.html +++ b/src/index.html @@ -52,6 +52,55 @@ import { enableErrorLogs } from "/js/errorLogs.js"; import "/js/perf.js"; + // Reload when a newer version is deployed + const RELOAD_GUARD_KEY = "version-check-last-reload"; + const RELOAD_GUARD_MS = 60 * 1000; + + async function fetchDeployedVersion() { + try { + const response = await fetch("/version.json", { cache: "no-store" }); + if (!response.ok) { + return null; + } + const data = await response.json(); + return data.version ?? null; + } catch { + return null; + } + } + + async function reloadIfOutdated() { + const deployedVersion = await fetchDeployedVersion(); + if ( + deployedVersion === null || + deployedVersion === window.env.version + ) { + return; + } + // Guard against a reload loop if the server keeps returning stale HTML + const lastReload = Number(sessionStorage.getItem(RELOAD_GUARD_KEY)); + if (lastReload && Date.now() - lastReload < RELOAD_GUARD_MS) { + console.warn( + `Deployed version ${deployedVersion} differs from running version ${window.env.version}, but a reload was already attempted recently - skipping`, + ); + return; + } + sessionStorage.setItem(RELOAD_GUARD_KEY, String(Date.now())); + window.location.reload(); + } + + reloadIfOutdated(); + window.addEventListener("visibilitychange", () => { + if (document.visibilityState === "visible") { + reloadIfOutdated(); + } + }); + window.addEventListener("pageshow", (event) => { + if (event.persisted) { + reloadIfOutdated(); + } + }); + const params = new URLSearchParams(window.location.search); // Dev tools diff --git a/src/version.11ty.js b/src/version.11ty.js new file mode 100644 index 00000000..4c4b5276 --- /dev/null +++ b/src/version.11ty.js @@ -0,0 +1,11 @@ +export default { + data() { + return { + permalink: "/version.json", + }; + }, + + render(data) { + return JSON.stringify({ version: data.version }, null, 2); + }, +};