auto refresh

This commit is contained in:
Theo Browne
2026-02-22 03:12:44 -08:00
parent a7b2a24f02
commit deeeeae8f7
3 changed files with 15 additions and 0 deletions

View File

@@ -38,6 +38,7 @@ type ServerMessage = {
data: GameState; data: GameState;
totalRounds: number; totalRounds: number;
viewerCount: number; viewerCount: number;
version?: string;
}; };
const MODEL_COLORS: Record<string, string> = { const MODEL_COLORS: Record<string, string> = {
@@ -73,6 +74,7 @@ let connected = false;
let ws: WebSocket | null = null; let ws: WebSocket | null = null;
let reconnectTimer: number | null = null; let reconnectTimer: number | null = null;
let lastMessageAt = 0; let lastMessageAt = 0;
let knownVersion: string | null = null;
function getColor(name: string): string { function getColor(name: string): string {
return MODEL_COLORS[name] ?? "#aeb6d6"; return MODEL_COLORS[name] ?? "#aeb6d6";
@@ -128,6 +130,10 @@ function setupWebSocket() {
try { try {
const msg = JSON.parse(String(e.data)) as ServerMessage; const msg = JSON.parse(String(e.data)) as ServerMessage;
if (msg.type === "state") { if (msg.type === "state") {
if (msg.version) {
if (!knownVersion) knownVersion = msg.version;
else if (knownVersion !== msg.version) return location.reload();
}
state = msg.data; state = msg.data;
totalRounds = totalRounds =
Number.isFinite(msg.totalRounds) && msg.totalRounds >= 0 Number.isFinite(msg.totalRounds) && msg.totalRounds >= 0

View File

@@ -44,6 +44,7 @@ type ServerMessage = {
data: GameState; data: GameState;
totalRounds: number; totalRounds: number;
viewerCount: number; viewerCount: number;
version?: string;
}; };
// ── Model colors & logos ───────────────────────────────────────────────────── // ── Model colors & logos ─────────────────────────────────────────────────────
@@ -410,6 +411,7 @@ function App() {
let ws: WebSocket; let ws: WebSocket;
let reconnectTimer: ReturnType<typeof setTimeout>; let reconnectTimer: ReturnType<typeof setTimeout>;
let knownVersion: string | null = null;
function connect() { function connect() {
ws = new WebSocket(wsUrl); ws = new WebSocket(wsUrl);
ws.onopen = () => setConnected(true); ws.onopen = () => setConnected(true);
@@ -420,6 +422,10 @@ function App() {
ws.onmessage = (e) => { ws.onmessage = (e) => {
const msg: ServerMessage = JSON.parse(e.data); const msg: ServerMessage = JSON.parse(e.data);
if (msg.type === "state") { if (msg.type === "state") {
if (msg.version) {
if (!knownVersion) knownVersion = msg.version;
else if (knownVersion !== msg.version) return location.reload();
}
setState(msg.data); setState(msg.data);
setTotalRounds(msg.totalRounds); setTotalRounds(msg.totalRounds);
setViewerCount(msg.viewerCount); setViewerCount(msg.viewerCount);

View File

@@ -14,6 +14,8 @@ import {
type RoundState, type RoundState,
} from "./game.ts"; } from "./game.ts";
const VERSION = crypto.randomUUID().slice(0, 8);
// ── Game state ────────────────────────────────────────────────────────────── // ── Game state ──────────────────────────────────────────────────────────────
const runsArg = process.argv.find((a) => a.startsWith("runs=")); const runsArg = process.argv.find((a) => a.startsWith("runs="));
@@ -225,6 +227,7 @@ function broadcast() {
data: gameState, data: gameState,
totalRounds: runs, totalRounds: runs,
viewerCount: clients.size, viewerCount: clients.size,
version: VERSION,
}); });
for (const ws of clients) { for (const ws of clients) {
ws.send(msg); ws.send(msg);