@runejs/core
Version:
Core logging, networking, and buffer functionality for RuneJS applications.
84 lines • 2.95 kB
JavaScript
;
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