/** * Created by shihuayang on 7/16/2016. */ var EventEmitter = require('events').EventEmitter; var util = require('util'); var pomelo = require('./pomelo-client.js'); var COS_CLIENT_VERSION = '0.2.0'; var PomeloClientProxy = function (opts) { EventEmitter.call(this); this.cosToken = ""; this.lastMsgSeqId = 0; this.initCallback = null; this.heartbeatTimer = null; this.heartbeatInterval = 2000; this.heartbeatTimeoutTimes = 3; this.heartbeatTryTimes = 1; this.__realpomelo__ = new pomelo(opts); }; util.inherits(PomeloClientProxy, EventEmitter); module.exports = PomeloClientProxy; var pomeloClientProxy = PomeloClientProxy.prototype; pomeloClientProxy.init = function(params, cb) { var self = this; if(!!cb && typeof cb === 'function') { self.initCallback = cb; } this.__realpomelo__.on('error', function (msg) { if (!!self.heartbeatTimer) { clearInterval(self.heartbeatTimer); delete self.heartbeatTimer; } }); this.__realpomelo__.on('close', function(msg){ if (!!self.heartbeatTimer) { clearInterval(self.heartbeatTimer); delete self.heartbeatTimer; } }); //pomelo.emit('processMessage', msg); this.__realpomelo__.on('processMessage', function (msg) { self.emit(msg.route, msg.body); }); this.__realpomelo__.on('onKick', function (data) { self.emit('onKick', data); }); this.__realpomelo__.init(params, function () { //内部handshake完成,开始走proxy的handshake var params = { cosVersion: COS_CLIENT_VERSION, cosSeq: self.lastMsgSeqId }; if (self.cosToken.length > 0) { params.cosToken = self.cosToken; } var route = 'cos.connector.handshake'; self.__realpomelo__.request(route, params, function(data) { onHandshake(self, data); }); }); }; pomeloClientProxy.request = function(route, msg, cb) { var self = this; this.__realpomelo__.request(route, msg, function (body) { var cosSeq = body.cosSeq; if(!!cosSeq && cosSeq > self.lastMsgSeqId) { self.lastMsgSeqId = cosSeq; } cb(body); }); }; pomeloClientProxy.notify = function (route, msg) { this.__realpomelo__.notify(route, msg); }; pomeloClientProxy.disconnect = function() { this.__realpomelo__.disconnect(); if (!!this.heartbeatTimer) { clearInterval(this.heartbeatTimer); delete this.heartbeatTimer; } }; var onHandshake = function (pomelo, data) { var code = data.code; if (code != 0) { if (code === 4) { console.log('Package version not match'); } else if (code === 5) { console.log('Token not exist'); } return; } pomelo.cosToken = data.cosToken; //注意:只所以初使化的回调在这里返回,是为了保证C-S连接全部完成之后,client才可以请求 if(!!pomelo.initCallback && 'function' === typeof pomelo.initCallback) { heartbeat(pomelo, data); pomelo.initCallback(); } }; var heartbeat = function(pomelo, data) { if(!pomelo.heartbeatInterval) { // no heartbeat return; } if(!pomelo.heartbeatTimer) { pomelo.heartbeatTryTimes = 1; pomelo.heartbeatTimer = setInterval(function () { pomelo.heartbeatTryTimes++; if (pomelo.heartbeatTryTimes >= pomelo.heartbeatTimeoutTimes) { //console.info(, ''); pomelo.__realpomelo__.disconnect(); } else { var params = { cosSeq: pomelo.lastMsgSeqId }; var route = 'cos.connector.heartbeat'; pomelo.__realpomelo__.request(route, params, function(data) { onHeartbeat(pomelo, data); }); } }, pomelo.heartbeatInterval); } }; var onHeartbeat = function (pomelo, data) { pomelo.heartbeatTryTimes = 1; };