import { spawn, ChildProcess } from "child_process"; import { ServerStartCommand } from "server-manager-shared"; import { SERVER_SCRIPT_PATH, SERVER_WORKING_DIRECTORY } from "./config"; import { getLogger } from "./logger"; const logger = getLogger("ProcessManager"); interface ServerProcess { id:string; name:string; port:number; queryPort:number; process:ChildProcess; started:number; alive:boolean; players:number; maxPlayers:number; } export class ProcessManager { private processes = new Map(); startServer(data: ServerStartCommand){ logger.debug( "Starte Game Server:", data.name ); const args = [ `-Port=${data.port}`, `-QueryPort=${data.queryPort}`, `-ServerName=${data.name}` ]; const process = spawn( SERVER_SCRIPT_PATH, args, { cwd: SERVER_WORKING_DIRECTORY, stdio:"pipe", detached:true } ); process.stdout?.on( "data", data=>{ logger.debug( `[${data.name}]`, data.toString() ); } ); process.stderr?.on( "data", data=>{ logger.error( "SERVER ERROR:", data.toString() ); } ); process.on("exit", code=>{ const server = this.processes.get(data.serverId); if(server){ logger.info( "Server beendet:", server.name, code ); this.processes.delete( data.serverId ); } }); this.processes.set( data.serverId, { id:data.serverId, name:data.name, port:data.port, queryPort:data.queryPort, process, started:Date.now(), alive:true, players:0, maxPlayers:0 } ); logger.info( "Server gestartet:", { id:data.serverId, pid:process.pid } ); } stopServer(id:string){ const server = this.processes.get(id); if(!server){ logger.warn( "Server nicht gefunden:", id ); return; } logger.debug( "Stoppe Server:", server.name ); process.kill( -server.process.pid!, "SIGTERM" ); } getServers(){ return Array.from( this.processes.values() ); } getStatus(){ return Array.from( this.processes.values() ).map(server => ({ id: server.id, name: server.name, port: server.port, queryPort: server.queryPort, pid: server.process.pid, alive: server.alive, players: server.players, maxPlayers: server.maxPlayers, started: server.started })); } }