feat: establish NekoNest Cloud control and relay
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
import { DAEMON_RELEASE_POLICY } from "./daemon-policy.mjs";
|
||||
|
||||
export const MINIMUM_CLOUD_DAEMON_VERSION = DAEMON_RELEASE_POLICY.minimumVersion;
|
||||
|
||||
export type StableVersion = [major: number, minor: number, patch: number];
|
||||
|
||||
export type ReportedDaemonVersion =
|
||||
| { state: "unreported"; version: null }
|
||||
| { state: "invalid"; version: null }
|
||||
| { state: "incompatible"; version: string }
|
||||
| { state: "compatible"; version: string };
|
||||
|
||||
export function parseStableVersion(value: string): StableVersion | null {
|
||||
const version = value.trim();
|
||||
const match = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.exec(version);
|
||||
if (!match) return null;
|
||||
const parts = match.slice(1).map(Number);
|
||||
if (parts.some((part) => !Number.isSafeInteger(part))) return null;
|
||||
return parts as StableVersion;
|
||||
}
|
||||
|
||||
export function compareStableVersions(left: StableVersion, right: StableVersion): number {
|
||||
for (let index = 0; index < 3; index += 1) {
|
||||
if (left[index] !== right[index]) return left[index] - right[index];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
export function classifyReportedDaemonVersion(value: string | undefined): ReportedDaemonVersion {
|
||||
const version = value?.trim() ?? "";
|
||||
if (!version) return { state: "unreported", version: null };
|
||||
|
||||
const parsed = parseStableVersion(version);
|
||||
const minimum = parseStableVersion(MINIMUM_CLOUD_DAEMON_VERSION);
|
||||
if (!parsed || !minimum) return { state: "invalid", version: null };
|
||||
if (compareStableVersions(parsed, minimum) < 0) {
|
||||
return { state: "incompatible", version };
|
||||
}
|
||||
return { state: "compatible", version };
|
||||
}
|
||||
Reference in New Issue
Block a user