Files
svn/tech/client/交接文档/谭健交接文档/Script/LogServer/Server.js
2025-08-04 10:46:00 +08:00

129 lines
5.0 KiB
JavaScript

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