Compact autoscaling lobby rows and observation times

This commit is contained in:
2026-10-07 16:47:35 -04:00
parent 40df99c115
commit 45e9bcd4ce
4 changed files with 84 additions and 18 deletions
+12
View File
@@ -1,3 +1,4 @@
import { freshStatusTimestamp } from '../server-freshness.js';
import type { ScalingHistory, ScalingMember, ScalingView } from '../autoscaling.js';
import { parseServerName, zombieMapBySlug, zombieMaps } from '../map-aliases.js';
@@ -79,3 +80,14 @@ export function scalingActivity(view: ScalingView): ScalingActivity[] {
}
return [...groups.values()].sort((a, b) => b.lastSeenAt - a.lastSeenAt);
}
/** Advance observation ages even when polling fails, using the fleet freshness window. */
export function observationAge(at: number, now: number): { label: string; stale: boolean } {
const age = now - at;
if (!Number.isFinite(at) || !Number.isFinite(age) || age < -1000) return { label: 'Check observation time', stale: true };
const seconds = Math.max(0, Math.floor(age / 1000));
const elapsed = seconds < 60 ? `${seconds}s` : seconds < 3600 ? `${Math.floor(seconds / 60)}m`
: seconds < 86400 ? `${Math.floor(seconds / 3600)}h` : `${Math.floor(seconds / 86400)}d`;
const stale = !freshStatusTimestamp(new Date(at).toISOString(), now);
return { label: `${stale ? 'Stale · ' : ''}${elapsed} ago`, stale };
}