enforce client server compatibility

This commit is contained in:
2026-10-25 05:38:06 +01:00
parent 02fcad6a8c
commit a387ea124a
+30
View File
@@ -4,6 +4,7 @@
let serverAddress = 'http://127.0.0.1:8787';
let connectionState = 'OFFLINE';
let serverVersion = '—';
let serverCompatibility = '';
let diagnostics: { status: string; database: string; twitch_identity_count: number; unseen_notification_count: number; realtime: string } | undefined;
let backups: Array<{ filename: string; size_bytes: number; modified_at: string | null }> = [];
let backupError = '';
@@ -101,6 +102,24 @@
bot: { connected: false, missing_scopes: [], reauthorization_required: false },
};
const CLIENT_VERSION = '0.1.0';
function versionParts(value: string) {
const match = value.match(/^(\d+)\.(\d+)\.(\d+)/);
return match ? [Number(match[1]), Number(match[2]), Number(match[3])] : undefined;
}
function isClientCompatible(minimum: string, maximum: string) {
const client = versionParts(CLIENT_VERSION);
const minimumParts = versionParts(minimum);
const maximumParts = versionParts(maximum);
if (!client || !minimumParts) return false;
const compare = (left: number[], right: number[]) => left[0] - right[0] || left[1] - right[1] || left[2] - right[2];
if (compare(client, minimumParts) < 0) return false;
if (maximum === '0.x' || !maximumParts) return true;
return compare(client, maximumParts) <= 0;
}
$: if (authenticated && selectedOverlayId && overlayName && !overlayBusy) {
const signature = overlayDraftSignature();
cacheOverlayDraft();
@@ -129,6 +148,13 @@
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const info: { server_version: string; minimum_client_version?: string; maximum_client_version?: string } = await response.json();
serverVersion = info.server_version;
if (info.minimum_client_version && info.maximum_client_version && !isClientCompatible(info.minimum_client_version, info.maximum_client_version)) {
serverCompatibility = `Requires client ${info.minimum_client_version}–${info.maximum_client_version}`;
connectionState = 'INCOMPATIBLE';
connectionNotice = 'Client update required';
return;
}
serverCompatibility = info.minimum_client_version && info.maximum_client_version ? `${info.minimum_client_version}–${info.maximum_client_version}` : '';
connectionState = 'CONNECTED';
connectionNotice = '';
return;
@@ -141,6 +167,10 @@
}
async function login() {
if (connectionState === 'INCOMPATIBLE') {
authError = 'This client version is not compatible with the server.';
return;
}
authBusy = true;
authError = '';
try {