@liuliang520500/taobao-topclient
Version:
淘宝开放平台SDK,支持ESM与CommonJS双模式导入
129 lines (116 loc) • 5.25 kB
JavaScript
var Common = require('./common.js').Common;
var TmcCodec = function(){
}
TmcCodec.prototype.writeMessage = function(message) {
var buffer = new Buffer(256);
buffer.writeUInt8(2,0);
buffer.writeUInt8(message.messageType,1);
var index = 2;
if(message.statusCode && message.statusCode > 0){
buffer.writeUInt16LE(Common.enum.HeaderType.StatusCode,index);
buffer.writeUInt32LE(message.statusCode,index+2);
index += 6;
}
if(message.flag && message.flag > 0){
buffer.writeUInt16LE(Common.enum.HeaderType.Flag,index);
buffer.writeUInt32LE(message.flag,index+2);
index += 6;
}
if(message.token){
buffer.writeUInt16LE(Common.enum.HeaderType.Token,index);
var length = Buffer.byteLength(message.token);
buffer.writeUInt32LE(length,index+2);
buffer.write(message.token,index+6,'UTF-8');
index = index + length + 6;
}
if(message.content){
for(var key in message.content){
buffer.writeUInt16LE(Common.enum.HeaderType.Custom,index);
var length = Buffer.byteLength(key);
buffer.writeUInt32LE(length,index+2);
buffer.write(key,index+6,'UTF-8');
index = index + length + 6;
length = Buffer.byteLength(message.content[key]);
if(length == 0){
buffer.writeUInt8(Common.enum.ValueFormat.Void,index);
}else{
var type = typeof message.content[key];
if(key == '__kind'){
buffer.writeUInt8(Common.enum.ValueFormat.Byte,index);
buffer.writeUInt8(message.content[key],index+1);
index += 2;
} else if(type == 'number'){
buffer.writeUInt8(Common.enum.ValueFormat.Int64,index);
const big = ~~(message.content[key] / (0xFFFFFFFF + 1));
const low = (message.content[key] % (0xFFFFFFFF + 1));
buffer.writeUInt32LE(low,index + 1);
buffer.writeUInt32LE(big,index + 5);
index += 9;
} else{
buffer.writeUInt8(Common.enum.ValueFormat.CountedString,index);
buffer.writeUInt32LE(length,index+1);
buffer.write(message.content[key],index+5,'UTF-8');
index = index + length + 5;
}
}
}
}
buffer.writeUInt16LE(Common.enum.HeaderType.EndOfHeaders,index);
return buffer.slice(0,index+2);
}
TmcCodec.prototype.readMessage = function(buffer) {
var message = {};
message.protocolVersion = buffer.readUInt8(0);
message.messageType = buffer.readUInt8(1);
try{
var headerType = buffer.readUInt16LE(2);
var index = 4;
while(headerType != Common.enum.HeaderType.EndOfHeaders){
if(headerType === Common.enum.HeaderType.StatusCode){
message.statusCode = buffer.readUInt32LE(index);
index += 4;
} else if(headerType === Common.enum.HeaderType.StatusPhrase){
var length = buffer.readUInt32LE(index);
message.statusPhase = buffer.toString('UTF-8',index+4,index+length+4);
index = index + length + 4;
} else if(headerType === Common.enum.HeaderType.Flag){
message.flag = buffer.readUInt32LE(index);
index += 4;
} else if(headerType === Common.enum.HeaderType.Token){
var length = buffer.readUInt32LE(index);
message.token = buffer.toString('UTF-8',index+4,index+length+4);
index = index + length + 4;
} else if(headerType === Common.enum.HeaderType.Custom){
var length = buffer.readUInt32LE(index);
var key = buffer.toString('UTF-8',index+4,index+length+4);
index = index + length + 4;
var format = buffer.readUInt8(index);
index += 1;
if(format == Common.enum.ValueFormat.Int64 || format == Common.enum.ValueFormat.Date){
message[key] = buffer.readUInt32LE(index) + buffer.readUInt32LE(index+4) * 4294967296;
index += 8;
}else if(format == Common.enum.ValueFormat.CountedString){
length = buffer.readUInt32LE(index);
message[key] = buffer.toString('UTF-8',index+4,index+length+4);
index = index + length + 4;
}else if(format == Common.enum.ValueFormat.Byte){
message[key] = buffer.readUInt8(index);
index += 1;
}else if(format == Common.enum.ValueFormat.Int32){
message[key] = buffer.readUInt32LE(index);
index += 4;
}else if(format == Common.enum.ValueFormat.Int16){
message[key] = buffer.readUInt16LE(index);
index += 2;
}
}
headerType = buffer.readUInt16LE(index);
index += 2;
}
}catch (err) {
console.log(err);
return null;
}
return message;
}
exports.TmcCodec = TmcCodec;