UNPKG

@liuliang520500/taobao-topclient

Version:

淘宝开放平台SDK,支持ESM与CommonJS双模式导入

129 lines (116 loc) 5.25 kB
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;