enforce client server compatibility
This commit is contained in:
@@ -4,6 +4,7 @@
|
|||||||
let serverAddress = 'http://127.0.0.1:8787';
|
let serverAddress = 'http://127.0.0.1:8787';
|
||||||
let connectionState = 'OFFLINE';
|
let connectionState = 'OFFLINE';
|
||||||
let serverVersion = '—';
|
let serverVersion = '—';
|
||||||
|
let serverCompatibility = '';
|
||||||
let diagnostics: { status: string; database: string; twitch_identity_count: number; unseen_notification_count: number; realtime: string } | undefined;
|
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 backups: Array<{ filename: string; size_bytes: number; modified_at: string | null }> = [];
|
||||||
let backupError = '';
|
let backupError = '';
|
||||||
@@ -101,6 +102,24 @@
|
|||||||
bot: { connected: false, missing_scopes: [], reauthorization_required: false },
|
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) {
|
$: if (authenticated && selectedOverlayId && overlayName && !overlayBusy) {
|
||||||
const signature = overlayDraftSignature();
|
const signature = overlayDraftSignature();
|
||||||
cacheOverlayDraft();
|
cacheOverlayDraft();
|
||||||
@@ -129,6 +148,13 @@
|
|||||||
if (!response.ok) throw new Error(`HTTP ${response.status}`);
|
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();
|
const info: { server_version: string; minimum_client_version?: string; maximum_client_version?: string } = await response.json();
|
||||||
serverVersion = info.server_version;
|
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';
|
connectionState = 'CONNECTED';
|
||||||
connectionNotice = '';
|
connectionNotice = '';
|
||||||
return;
|
return;
|
||||||
@@ -141,6 +167,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function login() {
|
async function login() {
|
||||||
|
if (connectionState === 'INCOMPATIBLE') {
|
||||||
|
authError = 'This client version is not compatible with the server.';
|
||||||
|
return;
|
||||||
|
}
|
||||||
authBusy = true;
|
authBusy = true;
|
||||||
authError = '';
|
authError = '';
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user