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
+27
View File
@@ -180,6 +180,33 @@ it('accepts all four events without an active beta and updates match lifecycle',
expect((await post(gameEvent('game_end', 0, 0))).status).toBe(200);
});
it.each(['game_start', 'round_change', 'heartbeat', 'game_end'] as const)('preserves %s player pings through ingestion, streaming and reload', async event => {
const payload = gameEvent(event, 17);
payload.players = payload.players.map((player, i) => ({ ...player, ping: [0, 42, 999, null][i] }));
const { subscribe } = await import('../../src/lib/server/pipeline/bus.js');
const listener = vi.fn();
const unsubscribe = subscribe(listener);
try {
const response = await post(payload);
expect(response.status).toBe(200);
expect((await response.json()).telemetry.players).toEqual(payload.players);
expect(listener).toHaveBeenCalledWith({ type: 'server-telemetry', entries: [expect.objectContaining({ players: payload.players })] });
const { closeDb } = await import('../../src/lib/server/db/index.js');
closeDb();
const { listTelemetry } = await import('../../src/lib/server/fleet/telemetry.js');
const { telemetryReport } = await import('../../src/lib/server/fleet/status-evidence.js');
expect(listTelemetry()[0].players).toEqual(payload.players);
expect(telemetryReport(payload.server)?.players).toEqual(payload.players);
} finally { unsubscribe(); }
});
it.each([-1, 1.5, '42', false, {}, [], Number.MAX_SAFE_INTEGER + 1])('rejects invalid player ping: %j', async ping => {
for (const event of ['game_start', 'heartbeat'] as const) {
const body = gameEvent(event, 17, 1);
expect((await post({ ...body, players: [{ ...body.players[0], ping }] })).status).toBe(400);
}
});
it.each([null, [], {}, ...['boot', 'session_start', 'match_end', 'feature', 'other'].map(event => ({ ...payload, event })),
{ ...payload, map: '' }, { ...payload, map: undefined }, { ...payload, round: -1 },
{ ...payload, round: 1.5 }, { ...payload, round: '17' }, { ...payload, players: 4 }, { ...payload, players: null },