"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Server = exports.LogLevel = void 0; const chinese_random_name_1 = __importDefault(require("chinese-random-name")); const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const ws_1 = __importDefault(require("ws")); var LogLevel; (function (LogLevel) { LogLevel[LogLevel["Log"] = 1] = "Log"; LogLevel[LogLevel["Warn"] = 2] = "Warn"; LogLevel[LogLevel["Error"] = 3] = "Error"; })(LogLevel = exports.LogLevel || (exports.LogLevel = {})); class Server { constructor() { this.port = null; this.webSocketServer = null; const config = JSON.parse(fs_1.default.readFileSync(path_1.default.join(__dirname, 'config', 'config.json')).toString()); this.port = config.port; this.logHandler = []; for (const handlerConfig of config.handlers) { const handlerModule = require(`./handler/${handlerConfig.name}/${handlerConfig.name}`); const handlerClass = handlerModule[handlerConfig.name] || handlerModule['default']; this.logHandler.push(new handlerClass(handlerConfig)); } } start() { if (this.webSocketServer) { return; } this.logHandler.forEach(handler => handler.onServerStart()); this.webSocketServer = new ws_1.default.Server({ port: this.port, host: '0.0.0.0' }); this.webSocketServer.on('connection', (ws) => this.handleClient(ws)); } stop() { this.logHandler.forEach(handler => handler.onServerStop()); this.webSocketServer && this.webSocketServer.close(); this.webSocketServer = null; } genClientID() { return chinese_random_name_1.default.generate(); } handleClient(ws) { const promise = new Promise((resolve) => { let clientID = null; let isClosed = false; const handlerMessage = (message) => { if (!message) return; if (typeof message !== 'string') message = message.toString(); let data = null; try { data = JSON.parse(message); } catch (error) { data = null; } ; if (!data) return; switch (data.type) { case 'init': let initData = null; try { initData = JSON.parse(data.data); } catch (error) { initData = null; } ; if (!initData) break; clientID = initData.id || this.genClientID(); this.logHandler.forEach(handler => handler.onClientConnected(clientID)); ws.send(clientID); break; case 'log': if (!clientID) break; let logData = null; try { logData = JSON.parse(data.data); } catch (error) { logData = null; } ; if (!logData || !logData.logs) break; this.logHandler.forEach(handler => handler.onClientLogMessage(clientID, logData.logs)); break; case 'error': if (!clientID) break; let errorData = null; try { errorData = JSON.parse(data.data); } catch (error) { errorData = null; } ; if (!errorData || !errorData.error) break; this.logHandler.forEach(handler => handler.onClientErrorMessage(clientID, errorData.error)); break; } }; const onClose = () => { if (isClosed) return; isClosed = true; clientID && this.logHandler.forEach(handler => handler.onClientDisconnect(clientID)); resolve(); }; ws.on('message', (message) => handlerMessage(message)); ws.on('close', () => onClose()); ws.on('error', () => onClose()); }); return promise; } } exports.Server = Server; new Server().start();