@liuliang520500/taobao-topclient
Version:
淘宝开放平台SDK,支持ESM与CommonJS双模式导入
153 lines (135 loc) • 4.58 kB
JavaScript
var WebSocket = require('ws');
var Common = require('./common.js').Common;
var TmcCodec = require('./tmcCodec.js').TmcCodec;
var util = require('../topUtil.js');
var codec = new TmcCodec();
var client ;
var TmcClient = function TmcClient(appkey,appsecret,groupName) {
this._appkey = appkey;
this._appsecret = appsecret;
this._groupName = groupName;
this._uri = 'ws://mc.api.taobao.com/';
this._ws = null;
this.isReconing = false;
this._callback = null;
this._interval = null;
client = this;
}
TmcClient.prototype.createSign = function(timestamp){
var basestring = this._appsecret;
basestring += 'app_key' + this._appkey;
basestring += 'group_name' + this._groupName;
basestring += 'timestamp' + timestamp;
basestring += this._appsecret;
return util.md5(basestring).toUpperCase();
}
TmcClient.prototype.createConnectMessage = function() {
var msg = {};
msg.messageType = Common.enum.MessageType.CONNECT;
var timestamp = Date.now();
var content = {
'app_key':this._appkey,
'group_name':this._groupName,
'timestamp':timestamp+'',
'sign':this.createSign(timestamp),
'sdk':'NodeJS-1.2.0',
'intranet_ip':util.getLocalIPAdress()
};
msg.content = content;
var buffer = codec.writeMessage(msg);
return buffer;
}
TmcClient.prototype.createPullMessage = function() {
var msg = {};
msg.protocolVersion = 2;
msg.messageType = Common.enum.MessageType.SEND;
var content = {
'__kind':Common.enum.MessageKind.PullRequest
};
msg.token = client._token;
msg.content = content;
var buffer = codec.writeMessage(msg);
return buffer;
}
TmcClient.prototype.createConfirmMessage = function(id) {
var msg = {};
msg.protocolVersion = 2;
msg.messageType = Common.enum.MessageType.SEND;
var content = {
'__kind':Common.enum.MessageKind.Confirm,
'id':id
};
msg.token = client._token;
msg.content = content;
var buffer = codec.writeMessage(msg);
return buffer;
}
TmcClient.prototype.autoPull = function () {
if(client._ws){
client._ws.send(client.createPullMessage(), { binary: true, mask: true });
}
}
TmcClient.prototype.reconnect = function (duration) {
if(this.isReconing)
return;
this.isReconing = true;
setTimeout(function timeout() {
client.connect(client._uri,client._callback);
}, duration);
}
TmcClient.prototype.connect = function(uri,callback) {
this._uri = uri;
this._callback = callback;
if(client._ws != null){
client._ws.close();
}
var ws = new WebSocket(this._uri);
ws.on('open', function open() {
client._ws = ws;
this.send(client.createConnectMessage(), { binary: true, mask: true });
if(!client._interval){
client._interval = setInterval(client.autoPull, 5000);
}
});
ws.on('message', function(data, flags) {
if(flags.binary){
var message = codec.readMessage(data);
if(message != null && message.messageType == Common.enum.MessageType.CONNECTACK){
if(message.statusCode){
throw new Error(message.statusPhase);
}else{
client._token = message.token;
console.log("top message channel connect success, token = "+message.token);
}
}else if(message != null && message.messageType == Common.enum.MessageType.SEND){
var status = {success:true};
try {
client._callback(message,status);
}catch (err) {
status.success = false;
}
if(status.success){
ws.send(client.createConfirmMessage(message.id), { binary: true, mask: true });
}
}else{
console.log(message);
}
}
});
ws.on('ping',function(data, flags) {
ws.pong(data,{mask: true },true);
});
ws.on('error',function(reason, errorCode) {
console.log('tmc client error,reason : '+ reason + ' code : '+ errorCode);
console.log('tmc client channel closed begin reconnect');
client._ws = null;
client.reconnect(15000);
});
ws.on('close', function close() {
console.log('tmc client channel closed begin reconnect');
client._ws = null;
client.reconnect(3000);
});
this.isReconing = false;
}
exports.TmcClient = TmcClient;