/** * Schnittstelle für die CS2-Serververwaltung. * * Jeder Adapter implementiert genau diese vier Operationen. Der ServerManager ruft sie auf; * Routen und Frontend kennen nur den ServerManager. * * start({ matchId, mode, secrets }) * -> { handle, host, port, tvPort } * Startet (oder reserviert) einen Server. handle ist ein beliebiges JSON-Objekt, * das ausschließlich im Backend gespeichert wird (z. B. Containername, RCON-Ziel). * secrets = { rconPassword, serverPassword, tvPassword } werden vom Manager erzeugt. * * status(handle) * -> { state: 'starting' | 'running' | 'stopped' | 'failed', message?, playerCount?, map? } * * configure(handle, { map, beforeMapChange, afterMapChange, commands }) * -> void Wirft einen Fehler mit verständlicher Meldung, wenn die Konfiguration scheitert. * * stop(handle) * -> void Darf mehrfach aufgerufen werden. * * Optional: * sendCommands(handle, commands) -> string[] für Aktionen wie mp_warmup_end. * * Eigenschaften: * name Kurzname des Adapters * simulated true, wenn kein echter Server existiert. Das Frontend zeigt dann niemals * "läuft" an, sondern kennzeichnet alles als Demo. */ import { DemoServerAdapter } from './demoAdapter.js'; import { DockerHostPool } from './dockerAdapter.js'; import { StaticPoolServerAdapter } from './staticPoolAdapter.js'; export function createServerAdapter(config, deps) { switch (config.serverAdapter) { case 'demo': return new DemoServerAdapter(config.demo); case 'docker': return new DockerHostPool(config.docker, deps); case 'static': return new StaticPoolServerAdapter(config.staticPool, deps); default: throw new Error(`Unbekannter SERVER_ADAPTER "${config.serverAdapter}" (erlaubt: demo, docker, static)`); } }