import { observationReader } from '$lib/server/fleet/status.js'; import { listServers } from '$lib/server/fleet/servers.js'; import { statusEntry } from '$lib/server/pipeline/worker.js'; 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; export async function GET() { let heartbeat: NodeJS.Timeout | null = null; let unsubscribe: (() => void) | null = null; const stream = new ReadableStream({ start(controller) { unsubscribe = subscribe((event) => { if (event.type === 'server-status' || event.type === 'server-telemetry') { controller.enqueue(encoder.encode(`event: ${event.type}\ndata: ${JSON.stringify({ ...event, serverNow: Date.now() })}\n\n`)); } }); const observation = observationReader(); const observe = (server: ReturnType[number]) => statusEntry(server, observation); controller.enqueue(encoder.encode(': hello\n\n')); controller.enqueue(encoder.encode(`event: server-status\ndata: ${JSON.stringify({ entries: listServers().map(server => observe(server)), snapshot: true, serverNow: Date.now() })}\n\n`)); controller.enqueue(encoder.encode(`event: server-telemetry\ndata: ${JSON.stringify({ entries: listTelemetry(), snapshot: true, serverNow: Date.now() })}\n\n`)); heartbeat = setInterval(() => controller.enqueue(encoder.encode(': ping\n\n')), HEARTBEAT_MS); }, cancel() { if (heartbeat) clearInterval(heartbeat); if (unsubscribe) unsubscribe(); } }); return new Response(stream, { headers: { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache, no-transform', Connection: 'keep-alive' } }); }