Logs current version on startup and checks GitHub for newer releases. Only runs in production, output stays in server logs (no client exposure).
44 lines
1.2 KiB
TypeScript
44 lines
1.2 KiB
TypeScript
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
|
|
}
|
|
}
|