@pilotlab/lux-tools
Version:
A luxurious user experience framework, developed by your friends at Pilot.
80 lines (68 loc) • 2.36 kB
text/typescript
import * as net from "net";
import * as shortid from "shortid";
import { Log } from "./log";
import { TcpSessionManager } from "./tcpSessionManager";
export class TcpServer {
// Singleton ==================================
private static _instance: TcpServer = null;
static getInstance() {
if (TcpServer._instance === null) {
TcpServer._instance = new TcpServer();
}
return TcpServer._instance;
}
constructor() {
this.tag = 'TcpServer';
this._server = null;
this._port = 0;
this._host = '';
this._sessionManager = new TcpSessionManager();
}
// ============================================
tag;
private _sessionManager;
private _server;
private _port;
private _host;
init(port, host) {
let server = net.createServer((socket) => {
/// on socket connection:
this._sessionManager.createSession(socket);
});
this._server = server;
this._port = port;
this._host = host;
this._bindServerEvents(server);
}
_bindServerEvents(server) {
server.on('error', (err) => {
if (err.code == 'EADDRINUSE') {
Log.error(this.tag, 'Address in use, retrying...');
this._retry();
} else {
Log.error(this.tag, err.toString());
}
});
server.listen(this._port, this._host, () => {
Log.info(this.tag, 'bind to', this._host, ':', this._port);
});
}
_retry() {
if (this._server && this._port && this._host) {
setTimeout(() => {
let server = this._server;
server.close();
server.listen(this._port, this._host, () => {
Log.info(this.tag, 'bind to', this._host, ':', this._port);
});
}, 1000);
}
}
periodSendingTest(ms) {
const commands = ["!VENEER@W01\r", "!VENEER@L01\r", "!VENEER@Q01\r", "!VENEER@X01\r", "!VENEER@T01\r"];
setInterval(() => {
const session = this._sessionManager.getSessions()[this._sessionManager.getSessions().length - 1];
if (session) session.getSocket().write(commands[Math.round(Math.random() * (commands.length - 1))]);
}, ms);
}
}