123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- /**
- * 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;
- };
|