omelop
Version:
[](https://travis-ci.org/node-omelop/omelop)
120 lines • 7.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SIOConnector = void 0;
const events_1 = require("events");
const http_1 = require("http");
let httpServer = (0, http_1.createServer)();
const siosocket_1 = require("./siosocket");
const socket_io_1 = require("socket.io");
let PKG_ID_BYTES = 4;
let PKG_ROUTE_LENGTH_BYTES = 1;
let PKG_HEAD_BYTES = PKG_ID_BYTES + PKG_ROUTE_LENGTH_BYTES;
let curId = 1;
/**
* Connector that manager low level connection and protocol bewteen server and client.
* Develper can provide their own connector to switch the low level prototol, such as tcp or probuf.
*/
class SIOConnector extends events_1.EventEmitter {
constructor(port, host, opts) {
super();
this.port = port;
this.host = host;
this.opts = opts;
opts.pingTimeout = opts.pingTimeout || 60;
opts.pingInterval = opts.pingInterval || 25;
}
/**
* Start connector to listen the specified port
*/
start(cb) {
let self = this;
// issue https://gitee.com/NetEase/omelop-cn/issues/174
let opts;
if (!!this.opts) {
opts = this.opts;
}
else {
opts = {
transports: [
'websocket', 'polling-xhr', 'polling-jsonp', 'polling'
]
};
}
opts.path = '/socket.io';
let sio = new socket_io_1.Server(httpServer, opts);
let port = this.port;
httpServer.listen(port, function () {
console.log('sio Server listening at port %d', port);
});
sio.on('connection', (socket) => {
// this.wsocket.sockets.on('connection', function (socket) {
let siosocket = new siosocket_1.SioSocket(curId++, socket);
self.emit('connection', siosocket);
siosocket.on('closing', function (reason) {
siosocket.send({ route: 'onKick', reason: reason });
});
});
process.nextTick(cb);
}
/**
* Stop connector
*/
stop(force, cb) {
this.server.close();
process.nextTick(cb);
}
encode(reqId, route, msg) {
if (reqId) {
return composeResponse(reqId, route, msg);
}
else {
return composePush(route, msg);
}
}
/**
* Decode client message package.
*
* Package format:
* message id: 4bytes big-endian integer
* route length: 1byte
* route: route length bytes
* body: the rest bytes
*
* @param {String} data socket.io package from client
* @return {Object} message object
*/
decode(msg) {
let index = 0;
let id = parseIntField(msg, index, PKG_ID_BYTES);
index += PKG_ID_BYTES;
let routeLen = parseIntField(msg, index, PKG_ROUTE_LENGTH_BYTES);
let route = msg.substr(PKG_HEAD_BYTES, routeLen);
let body = msg.substr(PKG_HEAD_BYTES + routeLen);
return {
id: id,
route: route,
body: JSON.parse(body)
};
}
}
exports.SIOConnector = SIOConnector;
let composeResponse = function (msgId, route, msgBody) {
return {
id: msgId,
body: msgBody
};
};
let composePush = function (route, msgBody) {
return JSON.stringify({ route: route, body: msgBody });
};
let parseIntField = function (str, offset, len) {
let res = 0;
for (let i = 0; i < len; i++) {
if (i > 0) {
res <<= 8;
}
res |= str.charCodeAt(offset + i) & 0xff;
}
return res;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lvY29ubmVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2Nvbm5lY3RvcnMvc2lvY29ubmVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLG1DQUFzQztBQUN0QywrQkFBb0M7QUFDcEMsSUFBSSxVQUFVLEdBQUcsSUFBQSxtQkFBWSxHQUFFLENBQUM7QUFDaEMsMkNBQXdDO0FBRXhDLHlDQUFrRDtBQUVsRCxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDckIsSUFBSSxzQkFBc0IsR0FBRyxDQUFDLENBQUM7QUFDL0IsSUFBSSxjQUFjLEdBQUcsWUFBWSxHQUFHLHNCQUFzQixDQUFDO0FBRTNELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztBQUdkOzs7R0FHRztBQUNILE1BQWEsWUFBYSxTQUFRLHFCQUFZO0lBTzFDLFlBQVksSUFBWSxFQUFFLElBQVksRUFBRSxJQUF5QjtRQUM3RCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBSUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsRUFBYztRQUNoQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsdURBQXVEO1FBQ3ZELElBQUksSUFBeUIsQ0FBQztRQUM5QixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2IsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDcEI7YUFDSTtZQUNELElBQUksR0FBRztnQkFDSCxVQUFV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