Support player ping in game telemetry

This commit is contained in:
2026-10-06 21:10:25 -04:00
parent 2520735850
commit 675d9b1576
6 changed files with 61 additions and 4 deletions
+1 -1
View File
@@ -70,7 +70,7 @@ export function selectServerObservation<T extends ServerObservation>(server: T,
return { ...result, health: 'online', status_source: 'telemetry', last_players: players,
last_map: report.map, last_seen_at: report.receivedAt, last_error: null,
roster: report.players.map(player => ({ num: null, score: 'score' in player ? player.score : null,
ping: null, guid: player.guid, name: player.name })),
ping: player.ping ?? null, guid: player.guid, name: player.name })),
active_since: players > 0 ? timing.activeSince : null,
inactive_since: players === 0 ? timing.inactiveSince : null,
game_started_at: players === 0 ? null : timing.gameStartedAt,
+9 -1
View File
@@ -1,6 +1,8 @@
export interface TelemetryPlayer {
name: string;
guid: string;
/** Server-measured latency in milliseconds; absent/null when unavailable. */
ping?: number | null;
}
export interface TelemetryPlayerStats extends TelemetryPlayer {
@@ -51,7 +53,13 @@ export function parseGameEvent(value: unknown): GameEvent {
for (const key of ['name', 'guid'] as const) {
if (typeof player[key] !== 'string' || !player[key].trim()) throw new Error(`players[${index}].${key} must be a nonempty string`);
}
const identity = { name: player.name as string, guid: player.guid as string };
const identity: TelemetryPlayer = { name: player.name as string, guid: player.guid as string };
if (player.ping !== undefined) {
if (player.ping !== null && (!Number.isSafeInteger(player.ping) || (player.ping as number) < 0)) {
throw new Error(`players[${index}].ping must be a nonnegative integer or null`);
}
identity.ping = player.ping as number | null;
}
if (guids.has(identity.guid)) throw new Error(`players[${index}].guid must be unique within the report`);
guids.add(identity.guid);
if (body.event === 'game_start') return identity;