feat: add server-side version update check
Logs current version on startup and checks GitHub for newer releases. Only runs in production, output stays in server logs (no client exposure).
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
import { readFileSync } from "fs";
|
||||
|
||||
const VERSION_CHECK_URL =
|
||||
"https://raw.githubusercontent.com/root-fr/jmap-webmail/main/VERSION";
|
||||
|
||||
const SEMVER_RE = /^\d+\.\d+\.\d+$/;
|
||||
|
||||
function compareVersions(current: string, remote: string): number {
|
||||
const a = current.split(".").map(Number);
|
||||
const b = remote.split(".").map(Number);
|
||||
for (let i = 0; i < 3; i++) {
|
||||
if ((b[i] ?? 0) > (a[i] ?? 0)) return 1;
|
||||
if ((b[i] ?? 0) < (a[i] ?? 0)) return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
export async function register() {
|
||||
const pkg = JSON.parse(
|
||||
readFileSync(`${process.cwd()}/package.json`, "utf-8")
|
||||
);
|
||||
const current: string = pkg.version ?? "0.0.0";
|
||||
console.info(`JMAP Webmail v${current}`);
|
||||
|
||||
if (process.env.NODE_ENV !== "production") return;
|
||||
|
||||
try {
|
||||
const res = await fetch(VERSION_CHECK_URL, {
|
||||
cache: "no-store",
|
||||
signal: AbortSignal.timeout(5000),
|
||||
});
|
||||
if (!res.ok) return;
|
||||
const remote = (await res.text()).trim();
|
||||
if (!SEMVER_RE.test(remote)) return;
|
||||
if (compareVersions(current, remote) > 0) {
|
||||
console.info(
|
||||
`Update available: v${remote} — https://github.com/root-fr/jmap-webmail`
|
||||
);
|
||||
}
|
||||
} catch {
|
||||
// Network unavailable — not critical
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user