129 lines
5.0 KiB
JavaScript
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();
|