UNPKG

@mos-connection/connector

Version:
118 lines 4.09 kB
"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