2023-04-02 10:06:25 +02:00
|
|
|
import { ServerPort } from 'common/interfaces';
|
|
|
|
import * as net from 'net';
|
|
|
|
|
2023-04-04 17:59:54 +02:00
|
|
|
interface ServerParams {
|
|
|
|
trace: boolean;
|
|
|
|
echo: boolean;
|
|
|
|
alertReset: boolean;
|
|
|
|
}
|
|
|
|
|
2023-04-02 10:06:25 +02:00
|
|
|
class Server {
|
2023-04-07 17:56:48 +02:00
|
|
|
private process: NodeJS.Process;
|
|
|
|
private trace: boolean;
|
|
|
|
private echo: boolean;
|
|
|
|
private alertReset: boolean;
|
|
|
|
private ports: ServerPort[];
|
|
|
|
private server: net.Server[];
|
|
|
|
private nBytes: number[];
|
|
|
|
private nMsgs: number[];
|
2023-04-02 10:06:25 +02:00
|
|
|
|
|
|
|
constructor (process: NodeJS.Process) {
|
|
|
|
this.process = process;
|
|
|
|
this.trace = false;
|
|
|
|
this.echo = false;
|
|
|
|
this.alertReset = false;
|
|
|
|
this.ports = [];
|
|
|
|
this.server = [];
|
|
|
|
this.nBytes = [];
|
|
|
|
this.nMsgs = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Setta le porte
|
|
|
|
*
|
|
|
|
* @param {*} ports
|
|
|
|
* @memberof Server
|
|
|
|
*/
|
2023-04-04 17:59:54 +02:00
|
|
|
setPorts (ports: ServerPort[]) {
|
2023-04-02 10:06:25 +02:00
|
|
|
this.ports = ports;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Invia i log al render process
|
|
|
|
*
|
|
|
|
* @param {string} message Messaggio del log
|
|
|
|
* @param {string} [color=''] Colore del log (green, yellow, red)
|
|
|
|
* @memberof Server
|
|
|
|
*/
|
2023-04-07 17:56:48 +02:00
|
|
|
sendLog (message?: string, color = '', i18n?: string, i18nParams?: {[key: string]: string | number}) {
|
2023-04-02 10:06:25 +02:00
|
|
|
const log = {
|
|
|
|
event: 'log',
|
2023-04-07 17:56:48 +02:00
|
|
|
content: {
|
|
|
|
message,
|
|
|
|
color,
|
|
|
|
i18n,
|
|
|
|
params: i18nParams
|
|
|
|
}
|
2023-04-02 10:06:25 +02:00
|
|
|
};
|
|
|
|
this.process.send(log);
|
|
|
|
}
|
|
|
|
|
2023-04-04 17:59:54 +02:00
|
|
|
startServer (params: ServerParams) {
|
2023-04-02 10:06:25 +02:00
|
|
|
this.trace = params.trace;
|
|
|
|
this.echo = params.echo;
|
|
|
|
this.alertReset = params.alertReset;
|
|
|
|
|
|
|
|
for (let i = 0; i < this.ports.length; i++) {
|
|
|
|
const port = this.ports[i].port;
|
|
|
|
|
|
|
|
this.server[i] = net.createServer();
|
|
|
|
this.nBytes[i] = 0;
|
|
|
|
this.nMsgs[i] = 0;
|
|
|
|
|
2023-04-04 17:59:54 +02:00
|
|
|
this.server[i].on('connection', (socket: net.Socket) => {
|
2023-04-07 17:56:48 +02:00
|
|
|
if (this.trace)
|
|
|
|
this.sendLog(null, '', 'clientConnectedOnPort', { port });
|
2023-04-02 10:06:25 +02:00
|
|
|
|
2023-04-04 17:59:54 +02:00
|
|
|
socket.on('data', (msg: Buffer) => {
|
2023-04-02 10:06:25 +02:00
|
|
|
const msgString = msg.toString();
|
|
|
|
if (this.echo) socket.write(msg);
|
|
|
|
this.nBytes[i] += msg.length;
|
|
|
|
this.nMsgs[i]++;
|
|
|
|
|
2023-04-07 17:56:48 +02:00
|
|
|
if (this.trace)
|
|
|
|
this.sendLog(null, '', 'messageReceivedOnPort', { port, message: msgString });
|
2023-04-02 10:06:25 +02:00
|
|
|
});// <- socket data
|
|
|
|
|
|
|
|
socket.on('end', () => {
|
2023-04-07 17:56:48 +02:00
|
|
|
if (this.trace)
|
|
|
|
this.sendLog(null, '', 'clientDisonnectedOnPort', { port });
|
2023-04-02 10:06:25 +02:00
|
|
|
});
|
|
|
|
|
2023-04-04 17:59:54 +02:00
|
|
|
socket.on('error', (err: Error & { code: string }) => {
|
2023-04-02 10:06:25 +02:00
|
|
|
switch (err.code) {
|
|
|
|
case 'ECONNRESET':
|
|
|
|
if (this.alertReset)
|
2023-04-07 17:56:48 +02:00
|
|
|
this.sendLog(null, 'yellow', 'clientErrorOnPort', { port, error: err.toString() });
|
2023-04-02 10:06:25 +02:00
|
|
|
else
|
2023-04-07 17:56:48 +02:00
|
|
|
if (this.trace)
|
|
|
|
this.sendLog(null, '', 'clientDisonnectedOnPort', { port });
|
2023-04-02 10:06:25 +02:00
|
|
|
break;
|
|
|
|
default:
|
2023-04-07 17:56:48 +02:00
|
|
|
this.sendLog(null, 'red', 'clientErrorOnPort', { port, error: err.toString() });
|
2023-04-02 10:06:25 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
});// <- server
|
|
|
|
|
2023-04-04 17:59:54 +02:00
|
|
|
this.server[i].on('error', (err: Error) => {
|
2023-04-07 17:56:48 +02:00
|
|
|
this.sendLog(null, 'red', 'serverErrorOnPort', { port, error: err.toString() });
|
2023-04-02 10:06:25 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
this.server[i].listen(port, () => {
|
2023-04-07 17:56:48 +02:00
|
|
|
this.sendLog(null, '', 'listenindOnPort', { port });
|
2023-04-02 10:06:25 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
stopServer (callback: () => void) {
|
|
|
|
(async () => {
|
|
|
|
for (let i = 0; i < this.server.length; i++) {
|
2023-04-04 17:59:54 +02:00
|
|
|
this.server[i].close(() => {
|
2023-04-02 10:06:25 +02:00
|
|
|
this.server[i].unref();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
callback();
|
|
|
|
})();
|
|
|
|
}
|
|
|
|
|
|
|
|
getReports () {
|
2023-04-04 17:59:54 +02:00
|
|
|
const reportList: {port: number; sockets: number; data: number; messages: number}[] = [];
|
2023-04-02 10:06:25 +02:00
|
|
|
for (let i = 0; i < this.server.length; i++) {
|
|
|
|
const report = {
|
2023-04-04 17:59:54 +02:00
|
|
|
port: (this.server[i].address() as net.AddressInfo).port,
|
|
|
|
sockets: null as number,
|
2023-04-02 10:06:25 +02:00
|
|
|
data: this.nBytes[i],
|
|
|
|
messages: this.nMsgs[i]
|
|
|
|
};
|
|
|
|
|
2023-04-04 17:59:54 +02:00
|
|
|
this.server[i].getConnections((err: Error, nSockets: number) => {
|
2023-04-07 17:56:48 +02:00
|
|
|
if (err)
|
|
|
|
this.sendLog(null, 'red', 'reportError', { error: err.toString() });
|
2023-04-02 10:06:25 +02:00
|
|
|
report.sockets = nSockets;
|
|
|
|
reportList.push(report);
|
|
|
|
|
|
|
|
if ((i + 1) === this.server.length) {
|
|
|
|
const rep = {
|
|
|
|
event: 'report',
|
|
|
|
content: reportList
|
|
|
|
};
|
|
|
|
this.process.send(rep);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
resetReports () {
|
|
|
|
for (let i = 0; i < this.server.length; i++) {
|
|
|
|
this.nBytes[i] = 0;
|
|
|
|
this.nMsgs[i] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-04-04 17:59:54 +02:00
|
|
|
export { Server, ServerParams };
|