103 lines
3.2 KiB
JavaScript
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;
|