UNPKG

@runejs/core

Version:

Core logging, networking, and buffer functionality for RuneJS applications.

84 lines 2.95 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SocketServer = void 0; const net_1 = require("net"); const buffer_1 = require("../buffer"); const logger_1 = require("../logger"); const connection_status_1 = require("./connection-status"); class SocketServer { constructor(socket) { this._connectionStatus = connection_status_1.ConnectionStatus.HANDSHAKE; this.socket = socket; socket.setNoDelay(true); socket.setKeepAlive(true); socket.setTimeout(30000); socket.on('data', data => { try { this.dataReceived(data); } catch (e) { this.error(e); } }); socket.on('close', hadError => { if (hadError) { this.error(new Error('Socket closed unexpectedly!')); } else { this.closeConnection(); } }); socket.on('error', error => this.error(error)); } static launch(serverName, hostName, port, socketServerFactory) { net_1.createServer(socket => { socketServerFactory(socket); }).listen(port, hostName); logger_1.logger.info(`${serverName} listening @ ${hostName}:${port}.`); } dataReceived(data) { if (!data) { return; } const byteBuffer = buffer_1.ByteBuffer.fromNodeBuffer(data); if (this.connectionStatus === connection_status_1.ConnectionStatus.HANDSHAKE) { if (this.initialHandshake(byteBuffer)) { this._connectionStatus = connection_status_1.ConnectionStatus.ACTIVE; } else { logger_1.logger.warn(`Initial client handshake failed.`); } } else { this.decodeMessage(byteBuffer); } } closeConnection() { var _a; this._connectionStatus = connection_status_1.ConnectionStatus.CLOSED; if (((_a = this.socket) === null || _a === void 0 ? void 0 : _a.writable) && !this.socket.destroyed) { this.socket.destroy(); } this.connectionDestroyed(); } error(error) { logger_1.logger.error('Socket destroyed due to error:'); logger_1.logger.error(error); try { this.closeConnection(); } catch (closeConnectionError) { logger_1.logger.error(`Error closing server connection:`); logger_1.logger.error(closeConnectionError); } } get connectionStatus() { return this._connectionStatus; } get connectionAlive() { var _a; return ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.writable) && !this.socket.destroyed; } } exports.SocketServer = SocketServer; //# sourceMappingURL=socket-server.js.map