UNPKG

omelop

Version:

[![Build Status](https://travis-ci.org/node-omelop/omelop.svg?branch=master)](https://travis-ci.org/node-omelop/omelop)

149 lines 9.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.HybridSocket = void 0; const events_1 = require("events"); const handler_1 = require("./common/handler"); const omelop_protocol_1 = require("omelop-protocol"); const omelop_logger_1 = require("omelop-logger"); const path = require("path"); let logger = (0, omelop_logger_1.getLogger)('omelop', path.basename(__filename)); let ST_INITED = 0; let ST_WAIT_ACK = 1; let ST_WORKING = 2; let ST_CLOSED = 3; /** * Socket class that wraps socket and websocket to provide unified interface for up level. */ class HybridSocket extends events_1.EventEmitter { constructor(id, socket, request, opts) { super(); this.id = id; this.socket = socket; if (request && (opts.realIPKey || opts.realPortKey)) { let ip = request['headers'][opts.realIPKey]; if (ip) { this.remoteAddress = { ip: ip, port: opts.realPortKey ? request['headers'][opts.realPortKey] : 0 }; } } if (!this.remoteAddress) { if (!socket._socket) { this.remoteAddress = { ip: socket.address().address, port: socket.address().port }; } else { this.remoteAddress = { ip: socket._socket.remoteAddress, port: socket._socket.remotePort }; if (request.headers['x-forwarded-for']) { // 反向代理,获取到玩家真实ip const ipArr = request.headers['x-forwarded-for'].split(','); if (ipArr.length > 0) { this.remoteAddress.ip = ipArr[0]; } } else if (request.headers['x-real-ip']) { this.remoteAddress.ip = request.headers['x-real-ip']; } } } let self = this; socket.once('close', this.emit.bind(this, 'disconnect')); socket.on('error', this.emit.bind(this, 'error')); socket.on('message', function (msg) { if (msg) { msg = omelop_protocol_1.Package.decode(msg); (0, handler_1.default)(self, msg); } }); this.state = ST_INITED; // TODO: any other events? } /** * Send raw byte data. * * @api private */ sendRaw(msg) { if (this.state !== ST_WORKING) { return; } let self = this; this.socket.send(msg, { binary: true }, (err) => { if (!!err) { logger.error('websocket send binary data failed: %j', err.stack); return; } }); } /** * Send byte data package to client. * * @param {Buffer} msg byte data */ send(msg) { if (msg instanceof String) { msg = Buffer.from(msg); } else if (!(msg instanceof Buffer)) { msg = Buffer.from(JSON.stringify(msg)); } this.sendRaw(omelop_protocol_1.Package.encode(omelop_protocol_1.Package.TYPE_DATA, msg)); } /** * Send byte data packages to client in batch. * * @param {Buffer} msgs byte data */ sendBatch(msgs) { let rs = []; for (let i = 0; i < msgs.length; i++) { let src = omelop_protocol_1.Package.encode(omelop_protocol_1.Package.TYPE_DATA, msgs[i]); rs.push(src); } this.sendRaw(Buffer.concat(rs)); } /** * Send message to client no matter whether handshake. * * @api private */ sendForce(msg) { if (this.state === ST_CLOSED) { return; } this.socket.send(msg, { binary: true }); } /** * Response handshake request * * @api private */ handshakeResponse(resp) { if (this.state !== ST_INITED) { return; } this.socket.send(resp, { binary: true }); this.state = ST_WAIT_ACK; } /** * Close the connection. * * @api private */ disconnect() { if (this.state === ST_CLOSED) { return; } this.state = ST_CLOSED; this.socket.emit('close'); this.socket.close(); } } exports.HybridSocket = HybridSocket; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHlicmlkc29ja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2Nvbm5lY3RvcnMvaHlicmlkc29ja2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLG1DQUFzQztBQUN0Qyw4Q0FBc0Q7QUFDdEQscURBQTBDO0FBQzFDLGlEQUEwQztBQUsxQyw2QkFBNkI7QUFFN0IsSUFBSSxNQUFNLEdBQUcsSUFBQSx5QkFBUyxFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFHNUQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztBQUNwQixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFDbkIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBT2xCOztHQUVHO0FBQ0gsTUFBYSxZQUFhLFNBQVEscUJBQVk7SUFNMUMsWUFBWSxFQUFVLEVBQUUsTUFBcUIsRUFBRSxPQUFZLEVBQUUsSUFBeUI7UUFDbEYsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBRXJCLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDakQsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1QyxJQUFJLEVBQUUsRUFBRTtnQkFDSixJQUFJLENBQUMsYUFBYSxHQUFHO29CQUNqQixFQUFFLEVBQUUsRUFBRTtvQkFDTixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENB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