adds round telemetry support
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import { subscribe } from '$lib/server/pipeline/bus.js';
|
||||
import { listTelemetry } from '$lib/server/fleet/telemetry.js';
|
||||
|
||||
const encoder = new TextEncoder();
|
||||
const HEARTBEAT_MS = 20_000;
|
||||
@@ -10,11 +11,12 @@ export async function GET() {
|
||||
const stream = new ReadableStream<Uint8Array>({
|
||||
start(controller) {
|
||||
unsubscribe = subscribe((event) => {
|
||||
if (event.type === 'server-status') {
|
||||
controller.enqueue(encoder.encode(`event: server-status\ndata: ${JSON.stringify(event)}\n\n`));
|
||||
if (event.type === 'server-status' || event.type === 'server-telemetry') {
|
||||
controller.enqueue(encoder.encode(`event: ${event.type}\ndata: ${JSON.stringify(event)}\n\n`));
|
||||
}
|
||||
});
|
||||
controller.enqueue(encoder.encode(': hello\n\n'));
|
||||
controller.enqueue(encoder.encode(`event: server-telemetry\ndata: ${JSON.stringify({ entries: listTelemetry(), snapshot: true })}\n\n`));
|
||||
heartbeat = setInterval(() => controller.enqueue(encoder.encode(': ping\n\n')), HEARTBEAT_MS);
|
||||
},
|
||||
cancel() {
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
import { json } from '@sveltejs/kit';
|
||||
import { getServer } from '$lib/server/fleet/servers.js';
|
||||
import { saveTelemetry } from '$lib/server/fleet/telemetry.js';
|
||||
import { emit } from '$lib/server/pipeline/bus.js';
|
||||
|
||||
export async function POST({ request }: { request: Request }) {
|
||||
if (request.headers.get('content-type')?.split(';')[0].trim().toLowerCase() !== 'application/json') {
|
||||
return json({ ok: false, error: 'Content-Type must be application/json' }, { status: 415 });
|
||||
}
|
||||
const body = await request.json().catch(() => null);
|
||||
if (!body || typeof body !== 'object' || Array.isArray(body)
|
||||
|| body.event !== 'round_change'
|
||||
|| typeof body.server !== 'string' || !body.server.length || body.server.length > 255
|
||||
|| !Number.isSafeInteger(body.round) || body.round < 0
|
||||
|| !Number.isSafeInteger(body.players) || body.players < 0) {
|
||||
return json({ ok: false, error: 'Expected round_change, a server name, and nonnegative integer round and players' }, { status: 400 });
|
||||
}
|
||||
const server = getServer(body.server);
|
||||
if (!server || server.destroyed_at) {
|
||||
return json({ ok: false, error: 'Unknown or destroyed server' }, { status: 404 });
|
||||
}
|
||||
const telemetry = {
|
||||
server: body.server as string, round: body.round as number,
|
||||
players: body.players as number, receivedAt: new Date().toISOString()
|
||||
};
|
||||
saveTelemetry(telemetry);
|
||||
emit({ type: 'server-telemetry', entries: [telemetry] });
|
||||
return json({ ok: true, telemetry });
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
<script lang="ts">
|
||||
import RoundTelemetry from '$ui/components/RoundTelemetry.svelte';
|
||||
import { onMount, onDestroy } from 'svelte';
|
||||
import { page } from '$app/stores';
|
||||
import { goto } from '$app/navigation';
|
||||
@@ -304,6 +305,8 @@
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<RoundTelemetry {name} />
|
||||
|
||||
{#if destroyError}
|
||||
<div class="destroy-error" role="alert">{destroyError}</div>
|
||||
{/if}
|
||||
|
||||
Reference in New Issue
Block a user