Files
HexaHost-GameCloud/packages/contracts/src/servers.ts
smueller ab21f53cdd
Some checks failed
CI / Node — lint, typecheck, test, build (push) Failing after 9s
CI / Go — node-agent tests (push) Failing after 8s
CI / Go — edge-gateway build (push) Successful in 14s
Phase7
2026-06-26 13:20:55 +02:00

85 lines
2.4 KiB
TypeScript

import { z } from 'zod';
export const gameServerStatusSchema = z.enum([
'DRAFT',
'PROVISIONING',
'INSTALLING',
'STOPPED',
'QUEUED',
'STARTING',
'RUNNING',
'STOPPING',
'BACKING_UP',
'RESTORING',
'UNKNOWN',
'ERROR',
'DELETING',
'DELETED',
]);
export const serverEditionSchema = z.enum(['JAVA', 'BEDROCK']);
export const softwareFamilySchema = z.enum([
'VANILLA',
'PAPER',
'PURPUR',
'FABRIC',
'FORGE',
'NEOFORGE',
'QUILT',
'BEDROCK_DEDICATED',
]);
export const createServerRequestSchema = z.object({
name: z.string().min(1).max(64),
edition: serverEditionSchema.default('JAVA'),
softwareFamily: softwareFamilySchema.default('VANILLA'),
minecraftVersion: z.string().min(1).max(32).default('1.21.1'),
eulaAccepted: z.literal(true, {
errorMap: () => ({ message: 'EULA must be accepted' }),
}),
ramMb: z.number().int().min(512).max(65536).optional(),
planId: z.string().uuid().optional(),
});
export const serverResponseSchema = z.object({
id: z.string().uuid(),
userId: z.string().uuid(),
planId: z.string().uuid().nullable(),
nodeId: z.string().uuid().nullable(),
name: z.string(),
status: gameServerStatusSchema,
version: z.number().int(),
edition: serverEditionSchema,
softwareFamily: softwareFamilySchema,
minecraftVersion: z.string(),
eulaAccepted: z.boolean(),
hostPort: z.number().int().nullable(),
containerId: z.string().nullable(),
dataPath: z.string().nullable(),
activeWorldName: z.string(),
ramMb: z.number().int(),
idleShutdownEnabled: z.boolean(),
idleStopAt: z.string().datetime().nullable(),
createdAt: z.string().datetime(),
updatedAt: z.string().datetime(),
});
export const serverListResponseSchema = z.object({
servers: z.array(serverResponseSchema),
});
export const serverActionResponseSchema = z.object({
server: serverResponseSchema,
jobId: z.string().optional(),
queuePosition: z.number().int().optional(),
});
export type GameServerStatus = z.infer<typeof gameServerStatusSchema>;
export type ServerEdition = z.infer<typeof serverEditionSchema>;
export type SoftwareFamily = z.infer<typeof softwareFamilySchema>;
export type CreateServerRequest = z.infer<typeof createServerRequestSchema>;
export type ServerResponse = z.infer<typeof serverResponseSchema>;
export type ServerListResponse = z.infer<typeof serverListResponseSchema>;
export type ServerActionResponse = z.infer<typeof serverActionResponseSchema>;