@mos-connection/connector
Version:
MOS compliant TCP/IP Socket connection.
118 lines • 4.09 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MosSocketServer = void 0;
const net_1 = require("net");
const eventemitter3_1 = require("eventemitter3");
const socketConnection_1 = require("./socketConnection");
class MosSocketServer extends eventemitter3_1.EventEmitter {
/** */
constructor(port, description, debug) {
super();
this._connectedSockets = [];
this._port = port;
this._portDescription = description;
this._debug = debug ?? false;
this._socketServer = new net_1.Server();
this._socketServer.on('connection', (socket) => this._onClientConnection(socket));
this._socketServer.on('close', () => this._onServerClose());
this._socketServer.on('error', (error) => this._onServerError(error));
}
async dispose(sockets) {
const closePromises = [];
// close clients
sockets.forEach((socket) => {
closePromises.push(new Promise((resolve) => {
socket.on('close', resolve);
socket.end();
socket.destroy();
}));
});
// close server
closePromises.push(new Promise((resolve) => {
// this._socketServer.on('close', resolve)
this._socketServer.close(() => {
resolve();
});
}));
// close any server connections:
this._connectedSockets.forEach((socket) => {
socket.destroy();
});
await Promise.all(closePromises);
}
/** */
async listen() {
this.debugTrace('listen', this._portDescription, this._port);
return new Promise((resolve, reject) => {
try {
this.debugTrace('inside promise', this._portDescription, this._port);
// already listening
if (this._socketServer.listening) {
this.debugTrace('already listening', this._portDescription, this._port);
resolve();
return;
}
// Listens and handles error and events
this._socketServer.once('error', (e) => {
reject(e);
});
this._socketServer.once('close', () => {
reject(Error('Socket was closed'));
});
this._socketServer.once('listening', () => {
resolve();
this._socketServer.on('error', (e) => {
this.emit(socketConnection_1.SocketServerEvent.ERROR, e);
});
this._socketServer.on('close', () => {
this.emit(socketConnection_1.SocketServerEvent.CLOSE);
});
});
this._socketServer.listen(this._port);
}
catch (e) {
reject(e);
}
});
}
setDebug(debug) {
this._debug = debug;
}
get port() {
return this._port;
}
get portDescription() {
return this._portDescription;
}
/** */
_onClientConnection(socket) {
this._connectedSockets.push(socket);
socket.on('close', () => {
const i = this._connectedSockets.indexOf(socket);
if (i !== -1) {
this._connectedSockets.splice(i, 1);
}
});
this.emit(socketConnection_1.SocketServerEvent.CLIENT_CONNECTED, {
socket: socket,
portDescription: this._portDescription,
});
}
/** */
_onServerError(error) {
// @todo: implement
this.debugTrace('Server error:', error);
}
/** */
_onServerClose() {
// @todo: implement
this.debugTrace(`Server closed: on port ${this._port}`);
}
debugTrace(...strs) {
// eslint-disable-next-line no-console
if (this._debug)
console.log(...strs);
}
}
exports.MosSocketServer = MosSocketServer;
//# sourceMappingURL=mosSocketServer.js.map