Files
server-manager/manager/src/serverManager.js
T

103 lines
3.2 KiB
JavaScript

"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;