Fix fleet stale-status flicker during polling

This commit is contained in:
2026-09-18 15:11:49 -04:00
parent f54cac8c50
commit 6d903adb31
6 changed files with 59 additions and 12 deletions
+6 -6
View File
@@ -1,24 +1,24 @@
import { freshStatusTimestamp } from '../../server-freshness.js';
export type Health = 'online' | 'stale' | 'offline' | 'starting';
const ONLINE_MAX_MS = 30_000;
const STALE_MAX_MS = 120_000;
/**
* Classify server health from its last successful RCON timestamp.
* `offline` if we've never seen it, or if RCON just failed, or if the last
* successful reply is >120s old. `stale` if the last reply is 30-120s old
* (RCON glitchy). `online` if fresh.
* `offline` if we've never seen it or the last successful reply is >120s old.
* `stale` on an RCON failure or if the last reply is 45-120s old.
* `online` if fresh, including the allowance for polling and delivery.
*/
export function classifyHealth(lastSeenAt: string | null, lastError: string | null, containerState?: string | null): Health {
if (containerState === 'starting' || containerState === 'restarting') return 'starting';
if (containerState && containerState !== 'running') return 'offline';
if (!lastSeenAt) return 'offline';
const age = Date.now() - new Date(lastSeenAt).getTime();
if (!Number.isFinite(age) || age < 0) return 'offline';
if (age <= ONLINE_MAX_MS) {
if (freshStatusTimestamp(lastSeenAt, Date.now())) {
// Even with a fresh last_seen, a very recent error demotes to stale
return lastError ? 'stale' : 'online';
}
if (!Number.isFinite(age) || age < 0) return 'offline';
if (age <= STALE_MAX_MS) return 'stale';
return 'offline';
}