43 lines
2.4 KiB
TypeScript
43 lines
2.4 KiB
TypeScript
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 });
|
|
}
|