"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ServerManager = void 0; const logger_1 = require("./logger"); const crypto_1 = require("crypto"); const nameGenerator_1 = require("./nameGenerator"); const logger = (0, logger_1.getLogger)("ServerManager"); class ServerManager { constructor(rabbit, wrapperRegistry, serverRegistry, portManager) { this.rabbit = rabbit; this.wrapperRegistry = wrapperRegistry; this.serverRegistry = serverRegistry; this.portManager = portManager; } async createServer() { /* freien Wrapper suchen */ const wrapper = this.findBestWrapper(); if (!wrapper) { logger.warn("Kein Wrapper verfügbar"); return; } const serverId = "srv-" + (0, crypto_1.randomUUID)() .slice(0, 8); const serverName = (0, nameGenerator_1.generateServerName)(this.serverRegistry .getAll() .map(server => server.name)); /* Ports reservieren */ const ports = this.portManager.allocate(); const server = { id: serverId, name: serverName, wrapperId: wrapper.id, status: "STARTING", port: ports.port, queryPort: ports.queryPort, players: 0, maxPlayers: 21, created: Date.now(), lastSeen: Date.now() }; /* Registry Eintrag */ this.serverRegistry.add(server); /* Command an Wrapper */ const command = { type: "server.start", serverId, name: serverName, port: ports.port, queryPort: ports.queryPort }; const sent = this.rabbit.channel.sendToQueue(wrapper.commandQueue, Buffer.from(JSON.stringify(command))); if (!sent) { throw new Error("Server Start Command konnte nicht gesendet werden"); } logger.info("Starting server:", server.id); } async stopServer(serverId) { const server = this.serverRegistry.get(serverId); if (!server) { logger.warn("Server not found:", serverId); return; } const wrapper = this.wrapperRegistry.get(server.wrapperId); if (!wrapper) { logger.warn("Wrapper not found:", server.wrapperId); return; } const command = { type: "server.stop", serverId }; this.rabbit.channel.sendToQueue(wrapper.commandQueue, Buffer.from(JSON.stringify(command))); server.status = "STOPPING"; this.serverRegistry.update(server); logger.info("Stopping server:", serverId); } findBestWrapper() { const wrappers = this.wrapperRegistry.getAll() .filter(w => w.online); if (wrappers.length === 0) return undefined; /* Einfachste Version: wenigste Server */ wrappers.sort((a, b) => a.servers.length - b.servers.length); return wrappers[0]; } } exports.ServerManager = ServerManager;