import { fleetSnapshot } from '$lib/server/fleet/snapshot.js'; import { kick } from '$lib/server/pipeline/worker.js'; import { json } from '@sveltejs/kit'; import { queueCreateServer } from '$lib/server/provisioning/index.js'; import type { GameMode, ZombieGame } from '$lib/server/fleet/map-aliases.js'; export function GET() { return json(fleetSnapshot()); } export async function POST({ request }: { request: Request }) { const body = (await request.json().catch(() => ({}))) as { hostId?: string; libraryId?: string; image?: string; bindAddress?: string; publicAddress?: string; publicPort?: number; game?: string; gameMode?: string; mapSlug?: string; plutoKey?: string; expectedName?: string; previewId?: string; }; if (!body || (body.game !== undefined && body.game !== 't5' && body.game !== 't6') || typeof body.gameMode !== 'string' || typeof body.mapSlug !== 'string' || (body.plutoKey !== undefined && typeof body.plutoKey !== 'string') || (body.expectedName !== undefined && typeof body.expectedName !== 'string') || (body.previewId !== undefined && (typeof body.previewId !== 'string' || !body.previewId))) { return json( { ok: false, error: 'game must be t5 or t6; gameMode and mapSlug are required strings; plutoKey and expectedName are optional strings', kind: 'bad-request' }, { status: 400 } ); } const result = queueCreateServer({ game: body.game as ZombieGame | undefined, gameMode: body.gameMode as GameMode, mapSlug: body.mapSlug, plutoKey: body.plutoKey, expectedName: body.expectedName, previewId: body.previewId, createdBy: 'ui', hostId: body.hostId, libraryId: body.libraryId, image: body.image, bindAddress: body.bindAddress, publicAddress: body.publicAddress, publicPort: body.publicPort }); if (!result.ok) { const status = result.kind === 'bad-request' ? 400 : result.kind === 'unconfigured' ? 503 : result.kind === 'conflict' || result.kind === 'unknown-map' || result.kind === 'no-slot' || result.kind === 'no-port' ? 409 : 500; return json({ ok: false, error: result.message, kind: result.kind }, { status }); } void kick().catch((err) => console.error('[create] worker kick failed:', err)); return json({ ok: true, name: result.name, port: result.port, deploymentId: result.deploymentId }, { status: 202 }); }