1 Star 0 Fork 0

Tars.js/stream

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
tars.js 53.27 KB
一键复制 编辑 原始数据 按行查看 历史
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427
var assert = require("assert");
var util = require("util");
var Tars = module.exports = {};
var BIT32 = 4294967296;
var BIT31 = BIT32 / 2;
var Big = typeof Buffer.prototype.writeBigInt64BE === "function" ? null : require('big.js');
/**
* 异常类
*/
Tars.Exception = function ($code, $message) {
this.code = $code;
this.message = $message;
}
util.inherits(Tars.Exception, Error);
Tars.EncodeException = function ($message) {
this.code = -2;
this.message = $message;
}
util.inherits(Tars.EncodeException, Tars.Exception);
Tars.DecodeException = function ($message) {
this.code = -1;
this.message = $message;
}
util.inherits(Tars.DecodeException, Tars.Exception);
Tars.DecodeMismatch = function ($message) {
this.code = -1;
this.message = $message;
}
util.inherits(Tars.DecodeMismatch, Tars.DecodeException);
Tars.DecodeRequireNotExist = function ($message) {
this.code = -1;
this.message = $message;
}
util.inherits(Tars.DecodeRequireNotExist, Tars.DecodeException);
Tars.DecodeInvalidValue = function ($message) {
this.code = -1;
this.message = $message;
}
util.inherits(Tars.DecodeInvalidValue, Tars.DecodeException);
Tars.TupNotFoundKey = function ($message) {
this.code = -1;
this.message = $message;
}
util.inherits(Tars.TupNotFoundKey, Tars.Exception);
/**
* TARS编解码底层辅助类
*/
Tars.DataHelp = {
EN_INT8 : 0,
EN_INT16 : 1,
EN_INT32 : 2,
EN_INT64 : 3,
EN_FLOAT : 4,
EN_DOUBLE : 5,
EN_STRING1 : 6,
EN_STRING4 : 7,
EN_MAP : 8,
EN_LIST : 9,
EN_STRUCTBEGIN : 10,
EN_STRUCTEND : 11,
EN_ZERO : 12,
EN_SIMPLELIST : 13
};
Tars.Boolean = {
_write : function(os, tag, val) { return os.writeBoolean(tag, val); },
_read : function(is, tag, def) { return is.readBoolean(tag, true, def); },
_classname : "bool"
};
Tars.Int8 = {
_write : function(os, tag, val) { return os.writeInt8(tag, val); },
_read : function(is, tag, def) { return is.readInt8(tag, true, def); },
_classname : "char"
};
Tars.Int16 = {
_write : function(os, tag, val) { return os.writeInt16(tag, val); },
_read : function(is, tag, def) { return is.readInt16(tag, true, def); },
_classname : "short"
};
Tars.Int32 = {
_write : function(os, tag, val) { return os.writeInt32(tag, val); },
_read : function(is, tag, def) { return is.readInt32(tag, true, def); },
_classname : "int32"
};
Tars.Int64 = {
_write : function(os, tag, val, bString) { return os.writeInt64(tag, val, bString); },
_read : function(is, tag, def, bString) { return is.readInt64(tag, true, def, bString); },
_classname : "int64"
};
Tars.UInt8 = {
_write : function(os, tag, val) { return os.writeInt16(tag, val); },
_read : function(is, tag, def) { return is.readInt16(tag, true, def); },
_classname : "short"
};
Tars.UInt16 = {
_write : function(os, tag, val) { return os.writeInt32(tag, val); },
_read : function(is, tag, def) { return is.readInt32(tag, true, def); },
_classname : "int32"
};
Tars.UInt32 = {
_write : function(os, tag, val) { return os.writeInt64(tag, val); },
_read : function(is, tag, def) { return is.readInt64(tag, true, def); },
_classname : "int64"
};
Tars.Float = {
_write : function(os, tag, val) { return os.writeFloat(tag, val); },
_read : function(is, tag, def) { return is.readFloat(tag, true, def); },
_classname : "float"
};
Tars.Double = {
_write : function(os, tag, val) { return os.writeDouble(tag, val); },
_read : function(is, tag, def) { return is.readDouble(tag, true, def); },
_classname : "double"
};
Tars.String = {
_write : function(os, tag, val, bRaw) { return os.writeString(tag, val, bRaw); },
_read : function(is, tag, def, bRaw) { return is.readString(tag, true, def, bRaw); },
_classname : "string"
};
Tars.Enum = {
_write : function(os, tag, val) { return os.writeInt32(tag, val); },
_read : function(is, tag, def) { return is.readInt32(tag, true, def); },
_classname : "int32"
};
/**
* TARS-List实现类
*/
var HeroList = function (proto, bValue) {
this._proto = proto;
this._bValue = bValue || 0;
this.value = new Array();
this._classname = "List<" + proto._classname + ">";
};
HeroList.prototype._write = function(os, tag, val, bRaw, bString) { return os.writeList(tag, val, bRaw, bString); };
HeroList.prototype._read = function(is, tag, def, bRaw, bString) { return is.readList(tag, true, def, bRaw, bString); };
HeroList.prototype.new = function() { return new HeroList(this._proto); };
HeroList.prototype.at = function(index) { return this.value[index]; };
HeroList.prototype.push = function(value) { this.value.push(value); };
HeroList.prototype.forEach = function(callback) {
for (var i = 0; i < this.value.length; i++) {
if (callback.call(null, this.value[i], i, this.value) == false) break;
}
};
HeroList.prototype.toObject = function () {
var tmp = [];
for (var i = 0, len = this.value.length; i < len; i++){
tmp.push(!this.value[i].toObject?this.value[i]:this.value[i].toObject());
}
return tmp;
};
HeroList.prototype.readFromObject = function (json) {
var vsimple = !this._proto.create && !this._proto._vproto && !this._proto._proto && !this._proto.new;
for (var i = 0, len = json.length; i < len; i++) {
if (vsimple) {
this.push(json[i]);
} else {
var temp = this._proto.new();
temp.readFromObject(json[i]);
this.push(temp);
}
}
return this;
}
HeroList.prototype.__defineGetter__("length", function () { return this.value.length; });
Tars.List = function(proto, bValue) {
return new HeroList(proto, bValue);
};
/**
* TARS-Map实现类
*/
var MultiMap = function(kproto, vproto, bKey, bValue) {
this._kproto = kproto;
this._vproto = vproto;
this._bKey = bKey || 0;
this._bValue = bValue || 0;
this.keys = new Object();
this.value = new Object();
this._classname = "map<" + kproto._classname + "," + vproto._classname + ">";
};
MultiMap.prototype._write = function(os, tag, val, bRaw) { return os.writeMap(tag, val, bRaw); };
MultiMap.prototype._read = function(is, tag, def, bRaw) { return is.readMap(tag, true, def, bRaw); };
MultiMap.prototype.put = function(key, value) { this.insert(key, value); };
MultiMap.prototype.set = function(key, value) { this.insert(key, value); };
MultiMap.prototype.remove = function(key) { delete this.keys[key._genKey()]; delete this.value[key._genKey()]; };
MultiMap.prototype.size = function() { return Object.keys(this.keys || {}).length;};
MultiMap.prototype.has = function(key) { return this.keys.hasOwnProperty(key._genKey()); };
MultiMap.prototype.insert = function(key, value) {
var keys = Object.keys(this.keys || {});
for(var i = 0; i < keys.length; i++)
{
var anItem = keys[i];
if (key._equal(this.keys[anItem])) {
this.value[anItem] = value;
return ;
}
}
this.keys[key._genKey()] = key;
this.value[key._genKey()] = value;
};
MultiMap.prototype.get = function(key) {
var keys = Object.keys(this.keys || {});
for(var i = 0; i < keys.length; i++)
{
var anItem = keys[i];
if (key._equal(this.keys[anItem])) {
return this.value[anItem];
}
}
return undefined;
};
MultiMap.prototype.clear = function() {
delete this.keys;
delete this.value;
this.keys = new Object();
this.value = new Object();
}
MultiMap.prototype.forEach = function(callback) {
var keys = Object.keys(this.value || {});
for(var i = 0; i < keys.length; i++)
{
var key = keys[i];
if (callback.call(null, this.keys[key], this.value[key]) == false)
break;
}
};
MultiMap.prototype.toObject = function () {
assert(false, "multimap has no toObject function");
}
MultiMap.prototype.readFromObject = function () {
assert(false, "multimap has no toObject readFromObject");
}
var HeroMap = function (kproto, vproto, bKey, bValue) {
this._kproto = kproto;
this._vproto = vproto;
this._bKey = bKey || 0;
this._bValue = bValue || 0;
this.value = new Object();
this._classname = "map<" + kproto._classname + "," + vproto._classname + ">";
}
HeroMap.prototype._write = function(os, tag, val) { return os.writeMap(tag, val); }
HeroMap.prototype._read = function(is, tag, def) { return is.readMap(tag, true, def); }
HeroMap.prototype.new = function() { return new HeroMap(this._kproto, this._vproto); }
HeroMap.prototype.put = function(key, value) { this.insert(key, value); }
HeroMap.prototype.set = function(key, value) { this.insert(key, value); }
HeroMap.prototype.remove = function(key) { delete this.value[key]; }
HeroMap.prototype.size = function() { return Object.keys(this.value || {}).length; }
HeroMap.prototype.has = function(key) { return this.value.hasOwnProperty(key); }
HeroMap.prototype.insert = function(key, value) { this.value[key] = value; }
HeroMap.prototype.get = function(key) { return this.value[key]; }
HeroMap.prototype.clear = function() { delete this.value; this.value = new Object(); }
HeroMap.prototype.forEach = function(callback, bKey) {
var keys = Object.keys(this.value || {});
for(var i = 0; i < keys.length; i++)
{
var key = keys[i];
switch (this._kproto){
case Tars.Int8:
case Tars.Int16:
case Tars.Int32:
case Tars.UInt8:
case Tars.UInt16:
case Tars.UInt32:
case Tars.Float:
case Tars.Double:
key=Number(key);
break;
case Tars.Int64:
if(!bKey){
key=Number(key);
}
break;
}
if (callback.call(null, key, this.value[key]) == false)
break;
}
};
HeroMap.prototype.toObject = function () {
var tmp = {};
var keys = Object.keys(this.value || {});
for(var i = 0; i < keys.length; i++)
{
var key = keys[i];
tmp[key] = !this.value[key].toObject?this.value[key]:this.value[key].toObject();
}
return tmp;
};
HeroMap.prototype.readFromObject = function (json) {
var vsimple = !this._vproto.create && !this._vproto._vproto && !this._vproto._proto;
var keys = Object.keys(json || {});
for(var i = 0; i < keys.length; i++)
{
var key = keys[i];
if (vsimple) {
this.insert(key, json[key]);
} else {
var temp = this._vproto.new();
temp.readFromObject(json[key]);
this.insert(key, temp);
}
}
};
Tars.Map = function(kproto, vproto, bKey, bValue) {
if (kproto.prototype && kproto.prototype._equal) {
return new MultiMap(kproto, vproto, bKey, bValue);
}
return new HeroMap(kproto, vproto, bKey, bValue);
}
/**
* 适用于NodeJS支持的Buffer的实现类
*/
var createNodeBuffer = (function () {
if ('allocUnsafe' in Buffer) {
return function (data) {
return Buffer.allocUnsafe(data);
}
} else {
return function (data) {
return new Buffer(data);
}
}
}());
Tars.BinBuffer = function (buffer) {
if(!buffer)
{
buffer = createNodeBuffer(0);
}
this._buffer = (buffer != undefined && buffer instanceof Buffer)?buffer:null;
this._length = (buffer != undefined && buffer instanceof Buffer)?buffer.length:0;
this._capacity = this._length;
this._position = 0;
}
Tars.BinBuffer._classname = "list<char>";
Tars.BinBuffer.prototype.__defineGetter__("length", function () { return this._length; });
Tars.BinBuffer.prototype.__defineGetter__("capacity", function () { return this._capacity; });
Tars.BinBuffer.prototype.__defineGetter__("position", function () { return this._position; });
Tars.BinBuffer.prototype.__defineSetter__("position", function (position) { this._position = position; });
Tars.BinBuffer._write = function (os, tag, val) {
return os.writeBytes(tag, val);
}
Tars.BinBuffer._read = function (os, tag, def) {
return os.readBytes(tag, true, def);
}
Tars.BinBuffer.new = function () {
return new Tars.BinBuffer();
}
Tars.BinBuffer.from = function (data) {
var binBuffer = new Tars.BinBuffer();
binBuffer.writeString(data);
return binBuffer;
}
Tars.BinBuffer.prototype.reset = function () {
this._length = 0;
this._position = 0;
}
Tars.BinBuffer.prototype._allocate = function (byteLength) {
if (this._capacity > this._position + byteLength) {
return ;
}
this._capacity = Math.max(512, (this._position + byteLength) * 2);
var temp = createNodeBuffer(this._capacity);
if (this._buffer != null) {
this._buffer.copy(temp, 0, 0, this._position);
this._buffer = undefined;
}
this._buffer = temp;
}
Tars.BinBuffer.prototype.replace = function (srcBuffer, offset, byteLength) {
srcBuffer.copy(this._buffer, 0, offset, offset + byteLength);
}
Tars.BinBuffer.prototype.writeInt8 = function (value) {
value = +value;
this._allocate(1);
this._buffer.writeInt8(value, this._position);
this._position += 1;
this._length = this._position;
}
Tars.BinBuffer.prototype.writeUInt8 = function (value) {
value = +value;
this._allocate(1);
this._buffer.writeUInt8(value, this._position);
this._position += 1;
this._length = this._position;
}
Tars.BinBuffer.prototype.writeInt16 = function (value) {
value = +value;
this._allocate(2);
this._buffer.writeInt16BE(value, this._position);
this._position += 2;
this._length = this._position;
}
Tars.BinBuffer.prototype.writeUInt16 = function (value) {
value = +value;
this._allocate(2);
this._buffer.writeUInt16BE(value, this._position);
this._position += 2;
this._length = this._position;
}
Tars.BinBuffer.prototype.writeInt32 = function (value) {
value = +value;
this._allocate(4);
this._buffer.writeInt32BE(value, this._position);
this._position += 4;
this._length = this._position;
}
Tars.BinBuffer.prototype.writeUInt32 = function (value) {
value = +value;
this._allocate(4);
this._buffer.writeUInt32BE(value, this._position);
this._position += 4;
this._length = this._position;
}
Tars.BinBuffer.prototype.writeInt64 = function (value, bString) {
this._allocate(8);
var H4, L4, val;
//nodejs v12+ 直接支持bigint写入(value仍然是string表达时才支持高精度)
if(typeof this._buffer.writeBigInt64BE === "function"){
this._buffer.writeBigInt64BE(BigInt(value), this._position);
} else {
if (bString === true || bString === 1) {
//字符串int64写入,支持int64精度
val = new Big(value);
if (val.s === 1) {
H4 = +val.div(BIT32).round(0,0).toString();
L4 = +val.mod(BIT32).toString();
} else {
H4 = val.div(BIT32).round(0,3);
L4 = +val.minus((new Big(H4)).times(BIT32)).toString();
H4 = +H4.plus(BIT32).toString();
}
} else {
//Number写入,支持到2^53-1的精度
val = +value;
if (val > 0){
H4 = Math.floor(val/BIT32);
L4 = val - H4 * BIT32;
} else {
H4 = Math.floor(val/BIT32);
L4 = val - H4 * BIT32;
H4 += BIT32;
}
}
this._buffer.writeUInt32BE(H4, this._position);
this._buffer.writeUInt32BE(L4, this._position + 4);
}
this._position += 8;
this._length = this._position;
}
Tars.BinBuffer.prototype.writeFloat = function (value) {
this._allocate(4);
this._buffer.writeFloatBE(value, this._position);
this._position += 4;
this._length = this._position;
}
Tars.BinBuffer.prototype.writeDouble = function (value) {
this._allocate(8);
this._buffer.writeDoubleBE(value, this._position);
this._position += 8;
this._length = this._position;
}
Tars.BinBuffer.prototype.writeString = function (value, ByteLength, bRaw) {
if (bRaw === true || bRaw === 1) {
this._allocate(ByteLength);
value.copy(this._buffer, this._position);
this._position += ByteLength;
this._length = this._position;
return ;
}
var byteLength = ByteLength || Buffer.byteLength(value);
this._allocate(byteLength);
this._buffer.write(value, this._position, byteLength, "utf8");
this._position += byteLength;
this._length = this._position;
}
Tars.BinBuffer.prototype.writeBinBuffer = function (srcBinBuffer) {
if (srcBinBuffer._length == 0 || srcBinBuffer._buffer == null) return ;
this._allocate(srcBinBuffer.length);
srcBinBuffer._buffer.copy(this._buffer, this._position, 0, srcBinBuffer._length);
this._position += srcBinBuffer._length;
this._length = this._position;
}
Tars.BinBuffer.prototype.writeNodeBuffer = function (srcBuffer, offset, byteLength) {
offset = (offset == undefined)?0:offset;
byteLength = (byteLength == undefined)?srcBuffer.length:byteLength;
this._allocate(byteLength);
srcBuffer.copy(this._buffer, this._position, offset, offset + byteLength);
this._length += byteLength;
this._position += byteLength;
}
Tars.BinBuffer.prototype.readInt8 = function () {
return this._buffer.readInt8(this._position++);
}
Tars.BinBuffer.prototype.readInt16 = function () {
this._position += 2;
return this._buffer.readInt16BE(this._position - 2);
}
Tars.BinBuffer.prototype.readInt32 = function () {
this._position += 4;
return this._buffer.readInt32BE(this._position - 4);
}
Tars.BinBuffer.prototype.readUInt8 = function () {
this._position += 1;
return this._buffer.readUInt8(this._position - 1);
}
Tars.BinBuffer.prototype.readUInt16 = function () {
this._position += 2;
return this._buffer.readUInt16BE(this._position - 2);
}
Tars.BinBuffer.prototype.readUInt32 = function () {
this._position += 4;
return this._buffer.readUInt32BE(this._position - 4);
}
Tars.BinBuffer.prototype.readInt64 = function(bString) {
//nodejs v12+ 支持bigint,性能比big.js好
if(typeof this._buffer.readBigInt64BE === "function"){
var bigInt = this._buffer.readBigInt64BE(this._position);
this._position += 8;
if(bString === true || bString === 1){
return bigInt.toString();
}
if(bString === 2){
return bigInt;
}
return Number(bigInt);
}
var H4 = this._buffer.readUInt32BE(this._position);
var L4 = this._buffer.readUInt32BE(this._position + 4);
this._position += 8;
//字符串格式读出,支持int64精度
if (bString === true || bString === 1) {
if (H4 < BIT31) {
return new Big(H4).times(BIT32).plus(L4).toString();
} else {
H4 = BIT32 - 1 - H4;
return '-' + (new Big(H4)).times(BIT32).plus(BIT32 - L4).toString();
}
}
//Number读出,支持到 2^53 - 1 的精度
if (H4 < BIT31) {
return H4 * BIT32 + L4;
} else {
return -((BIT32 - L4) + BIT32 * (BIT32 - 1 - H4));
}
}
Tars.BinBuffer.prototype.readFloat = function() {
this._position += 4;
return this._buffer.readFloatBE(this._position - 4);
}
Tars.BinBuffer.prototype.readDouble = function() {
this._position += 8;
return this._buffer.readDoubleBE(this._position - 8);
}
Tars.BinBuffer.prototype.readString = function (byteLength, bRaw) {
var temp = createNodeBuffer(byteLength);
var ret;
if (bRaw === true || bRaw === 1) {
this._buffer.copy(temp, 0, this._position, this._position + byteLength);
this._position += byteLength;
return temp;
}
this._buffer.copy(temp, 0, this._position, this._position + byteLength);
this._position += byteLength;
if(temp.length == 1)
{
if(temp[0] & 0x80)
{
ret = temp.toString("binary", 0, temp.length);
} else {
ret = temp.toString("utf8", 0, temp.length);
}
} else {
ret = temp.toString("utf8", 0, temp.length);
}
return ret;
}
Tars.BinBuffer.prototype.readBinBuffer = function (byteLength, bReuse) {
if (bReuse === true) {
var temp = new Tars.BinBuffer();
temp._buffer = this._buffer.slice(this._position, this._position + byteLength);
temp._length = byteLength;
temp._capacity = byteLength;
temp._position = 0;
return temp;
}
var temp = new Tars.BinBuffer();
temp.writeNodeBuffer(this._buffer, this._position, byteLength);
this._position += byteLength;
return temp;
}
Tars.BinBuffer.prototype.toNodeBuffer = function () {
var temp = createNodeBuffer(this._length);
this._buffer.copy(temp, 0, 0, this._length);
return temp;
}
Tars.BinBuffer.prototype.toNodeBufferUnSafe = function () {
return this._buffer.slice(0, this._length);
}
Tars.BinBuffer.prototype.toObject = function () {
return this.toNodeBuffer();
}
Tars.BinBuffer.prototype.readFromObject = Tars.BinBuffer.prototype.writeNodeBuffer;
Tars.BinBuffer.prototype.print = function() {
var str = "";
for (var i = 0; i < this._length; i++) {
str += (this._buffer[i] > 15?"":"0") + this._buffer[i].toString(16) + (((i+1)%16 == 0)?"\n":" ");
}
console.log(str.toUpperCase());
}
/**
* tars输出编解码包裹类
*/
Tars.TarsOutputStream = function () {
this._binBuffer = new Tars.BinBuffer;
}
Tars.TarsOutputStream.prototype._writeTo = function (tag, type) {
if (tag < 15) {
this._binBuffer.writeUInt8((tag << 4 & 0xF0) | type);
} else {
this._binBuffer.writeUInt16((0xF0 | type) << 8 | tag);
}
}
Tars.TarsOutputStream.prototype.setHeaderLength = function (value) {
var position = this._binBuffer._position === 0?4:this._binBuffer._position;
var length = this._binBuffer._position === 0?4:this._binBuffer._length;
this._binBuffer._position = 0;
this._binBuffer.writeInt32(value);
this._binBuffer._position = position;
this._binBuffer._length = length;
}
Tars.TarsOutputStream.prototype.writeBoolean = function (tag, value) {
this.writeInt8(tag, value == true ? 1 : 0);
}
Tars.TarsOutputStream.prototype.writeInt8 = function (tag, value) {
value = +value;
if (value == 0) {
this._writeTo(tag, Tars.DataHelp.EN_ZERO);
} else {
this._writeTo(tag, Tars.DataHelp.EN_INT8);
this._binBuffer.writeInt8(value);
}
}
Tars.TarsOutputStream.prototype.writeInt16 = function (tag, value) {
value = +value;
if (value >= -128 && value <= 127) {
this.writeInt8(tag, value);
} else {
this._writeTo(tag, Tars.DataHelp.EN_INT16);
this._binBuffer.writeInt16(value);
}
}
Tars.TarsOutputStream.prototype.writeInt32 = function (tag, value) {
value = +value;
if (value >= -32768 && value <= 32767) {
this.writeInt16(tag, value);
} else {
this._writeTo(tag, Tars.DataHelp.EN_INT32);
this._binBuffer.writeInt32(value);
}
}
Tars.TarsOutputStream.prototype.writeInt64 = function (tag, value, bString) {
var val = Number(value);
if (val >= -2147483648 && val <= 2147483647) {
this.writeInt32(tag, val);
return;
}
this._writeTo(tag, Tars.DataHelp.EN_INT64);
this._binBuffer.writeInt64(value, bString);
}
Tars.TarsOutputStream.prototype.writeUInt8 = function (tag, value) {
this.writeInt16(tag, value);
}
Tars.TarsOutputStream.prototype.writeUInt16 = function (tag, value) {
this.writeInt32(tag, value);
}
Tars.TarsOutputStream.prototype.writeUInt32 = function (tag, value) {
this.writeInt64(tag, value);
}
Tars.TarsOutputStream.prototype.writeFloat = function (tag, value) {
if (value == 0) {
this._writeTo(tag, Tars.DataHelp.EN_ZERO);
} else {
this._writeTo(tag, Tars.DataHelp.EN_FLOAT);
this._binBuffer.writeFloat(value);
}
}
Tars.TarsOutputStream.prototype.writeDouble = function (tag, value) {
if (value == 0) {
this._writeTo(tag, Tars.DataHelp.EN_ZERO);
} else {
this._writeTo(tag, Tars.DataHelp.EN_DOUBLE);
this._binBuffer.writeDouble(value);
}
}
Tars.TarsOutputStream.prototype.writeStruct = function (tag, value) {
if (value._writeTo == undefined) {
throw Error("not defined writeTo Function");
}
this._writeTo(tag, Tars.DataHelp.EN_STRUCTBEGIN);
value._writeTo(this);
this._writeTo(0, Tars.DataHelp.EN_STRUCTEND);
}
Tars.TarsOutputStream.prototype.writeString = function (tag, value, bRaw) {
if (bRaw != undefined && bRaw == true) {
var byteLength = value.length;
if (byteLength > 255) {
this._writeTo(tag, Tars.DataHelp.EN_STRING4);
this._binBuffer.writeUInt32(byteLength);
} else {
this._writeTo(tag, Tars.DataHelp.EN_STRING1);
this._binBuffer.writeUInt8(byteLength);
}
this._binBuffer.writeString(value, byteLength, bRaw);
return ;
}
var byteLength = Buffer.byteLength(value, "utf8");
if (byteLength > 255) {
this._writeTo(tag, Tars.DataHelp.EN_STRING4);
this._binBuffer.writeUInt32(byteLength);
} else {
this._writeTo(tag, Tars.DataHelp.EN_STRING1);
this._binBuffer.writeUInt8(byteLength);
}
this._binBuffer.writeString(value, byteLength);
}
Tars.TarsOutputStream.prototype.writeBytes = function (tag, value) {
this._writeTo(tag, Tars.DataHelp.EN_SIMPLELIST);
this._writeTo(0, Tars.DataHelp.EN_INT8);
this.writeInt32(0, value.length);
this._binBuffer.writeBinBuffer(value);
}
var writeListDeprecateWarnning = util.deprecate(function(){},"bRaw in writeList is deprecated, use List(TarsStream.String, bRaw) instead")
Tars.TarsOutputStream.prototype.writeList = function (tag, value, bRaw) {
this._writeTo(tag, Tars.DataHelp.EN_LIST);
this.writeInt32(0, value.length);
//3.0.21版本之前通过writeList(xxx, true)来表示字符串转buffer,long转string表示
//3.0.21版本之后通过构造 List<T, bValue>来表示是否转换,这里以后要废弃掉
if(bRaw === true ){
writeListDeprecateWarnning();
}
var bValue = value._bValue || bRaw;
for (var i = 0, len = value.value.length; i < len; i++) {
value._proto._write(this, 0, value.value[i], bValue);
}
}
Tars.TarsOutputStream.prototype.writeMap = function (tag, value) {
this._writeTo(tag, Tars.DataHelp.EN_MAP);
this.writeInt32(0, value.size());
var self = this;
var bKey = value._bKey, bValue = value._bValue;
if(value._kproto == Tars.String){
bKey = false;
}
value.forEach(function (key, val){
value._kproto._write(self, 0, key, bKey);
value._vproto._write(self, 1, val, bValue);
}, bKey);
}
Tars.TarsOutputStream.prototype.getBinBuffer = function() {
return this._binBuffer;
}
/**
* TARS-TARS输入编解码包裹类
*/
Tars.TarsInputStream = function (binBuffer) {
this._binBuffer = binBuffer;
this._binBuffer._position = 0;
}
Tars.TarsInputStream.prototype.setBinBuffer = function (binBuffer) {
this._binBuffer = binBuffer;
this._binBuffer._position = 0;
}
Tars.TarsInputStream.prototype._readFrom = function () {
var temp = this._binBuffer.readUInt8();
var tag = (temp & 0xF0) >> 4;
var type = (temp & 0x0F);
if (tag >= 15) tag = this._binBuffer.readUInt8();
return {tag:tag, type:type};
}
Tars.TarsInputStream.prototype._peekFrom = function () {
var pos = this._binBuffer._position;
var head = this._readFrom();
this._binBuffer.position = pos;
return {tag:head.tag, type:head.type, size:(head.tag >= 15) ? 2 : 1};
}
Tars.TarsInputStream.prototype._skipField = function (type) {
switch (type) {
case Tars.DataHelp.EN_INT8 : this._binBuffer._position += 1; break;
case Tars.DataHelp.EN_INT16 : this._binBuffer._position += 2; break;
case Tars.DataHelp.EN_INT32 : this._binBuffer._position += 4; break;
case Tars.DataHelp.EN_INT64 : this._binBuffer._position += 8; break;
case Tars.DataHelp.EN_FLOAT : this._binBuffer._position += 4; break;
case Tars.DataHelp.EN_DOUBLE : this._binBuffer._position += 8; break;
case Tars.DataHelp.EN_STRING1 : {
var Length = this._binBuffer.readUInt8();
this._binBuffer._position += Length;
break;
}
case Tars.DataHelp.EN_STRING4 : {
var Length = this._binBuffer.readUInt32();
this._binBuffer._position += Length;
break;
}
case Tars.DataHelp.EN_STRUCTBEGIN : this._skipToStructEnd(); break;
case Tars.DataHelp.EN_STRUCTEND :
case Tars.DataHelp.EN_ZERO : break;
case Tars.DataHelp.EN_MAP : {
var size = this.readInt32(0, true);
for (var i = 0; i < size * 2; ++i) {
var head = this._readFrom();
this._skipField(head.type);
}
break;
}
case Tars.DataHelp.EN_SIMPLELIST : {
var head = this._readFrom();
if (head.type != Tars.DataHelp.EN_INT8) {
throw new Tars.DecodeInvalidValue("skipField with invalid type, type value: " + type + "," + head.type);
}
var Length = this.readInt32(0, true);
this._binBuffer._position += Length;
break;
}
case Tars.DataHelp.EN_LIST : {
var size = this.readInt32(0, true);
for (var i = 0; i < size; ++i) {
var head = this._readFrom();
this._skipField(head.type);
}
break;
}
default : throw new Tars.DecodeInvalidValue("skipField with invalid type, type value: " + type);
}
}
Tars.TarsInputStream.prototype._skipToStructEnd = function () {
for ( ; ; ) {
var head = this._readFrom();
this._skipField(head.type);
if (head.type == Tars.DataHelp.EN_STRUCTEND) {
return;
}
}
}
Tars.TarsInputStream.prototype._skipToTag = function (tag, require) {
while (this._binBuffer._position < this._binBuffer._length) {
var head = this._peekFrom();
//记录tag的位置,struct随读随解码
if(this._tagPosMap){
this._tagPosMap[head.tag] = this._binBuffer._position;
this._tagPosMap._current = this._binBuffer._position;
}
if (tag <= head.tag || head.type == Tars.DataHelp.EN_STRUCTEND) {
if ((head.type === Tars.DataHelp.EN_STRUCTEND)?false:(tag === head.tag)) {
return true;
}
break;
}
this._binBuffer._position += head.size;
this._skipField(head.type);
}
if (require) throw new Tars.DecodeRequireNotExist("require field not exist, tag:" + tag);
return false;
}
Tars.TarsInputStream.prototype.readBoolean = function (tag, require, DEFAULT_VALUE) {
return this.readInt8(tag, require, DEFAULT_VALUE) == 1 ? true : false;
}
Tars.TarsInputStream.prototype.readInt8 = function (tag, require, DEFAULT_VALUE) {
if (this._skipToTag(tag, require) == false) { return DEFAULT_VALUE; }
var head = this._readFrom();
switch (head.type) {
case Tars.DataHelp.EN_ZERO: return 0;
case Tars.DataHelp.EN_INT8: return this._binBuffer.readInt8();
}
throw new Tars.DecodeMismatch("read int8 type mismatch, tag:" + tag + ", get type:" + head.type);
}
Tars.TarsInputStream.prototype.readInt16 = function (tag, require, DEFAULT_VALUE) {
if (this._skipToTag(tag, require) == false) { return DEFAULT_VALUE; }
var head = this._readFrom();
switch (head.type) {
case Tars.DataHelp.EN_ZERO : return 0;
case Tars.DataHelp.EN_INT8 : return this._binBuffer.readInt8();
case Tars.DataHelp.EN_INT16 : return this._binBuffer.readInt16();
}
throw new Tars.DecodeMismatch("read int8 type mismatch, tag:" + tag + ", get type:" + head.type);
}
Tars.TarsInputStream.prototype.readInt32 = function (tag, requrire, DEFAULT_VALUE) {
if (this._skipToTag(tag, requrire) == false) { return DEFAULT_VALUE; }
var head = this._readFrom();
switch (head.type) {
case Tars.DataHelp.EN_ZERO : return 0;
case Tars.DataHelp.EN_INT8 : return this._binBuffer.readInt8();
case Tars.DataHelp.EN_INT16 : return this._binBuffer.readInt16();
case Tars.DataHelp.EN_INT32 : return this._binBuffer.readInt32();
}
throw new Tars.DecodeMismatch("read int8 type mismatch, tag:" + tag + ", get type:" + head.type);
}
Tars.TarsInputStream.prototype.readInt64 = function (tag, require, DEFAULT_VALUE, bString) {
if (this._skipToTag(tag, require) == false) { return DEFAULT_VALUE; }
var head = this._readFrom();
switch (head.type) {
case Tars.DataHelp.EN_ZERO : return 0;
case Tars.DataHelp.EN_INT8 : return this._binBuffer.readInt8();
case Tars.DataHelp.EN_INT16 : return this._binBuffer.readInt16();
case Tars.DataHelp.EN_INT32 : return this._binBuffer.readInt32();
case Tars.DataHelp.EN_INT64 : return this._binBuffer.readInt64(bString);
}
throw new Tars.DecodeMismatch("read int64 type mismatch, tag:" + tag + ", get type:" + head.type);
}
Tars.TarsInputStream.prototype.readFloat = function (tag, require, DEFAULT_VALUE) {
if (this._skipToTag(tag, require) == false) { return DEFAULT_VALUE; }
var head = this._readFrom();
switch (head.type) {
case Tars.DataHelp.EN_ZERO : return 0;
case Tars.DataHelp.EN_FLOAT : return this._binBuffer.readFloat();
}
throw new Tars.DecodeMismatch("read float type mismatch, tag:" + tag + ", get type:" + head.type);
}
Tars.TarsInputStream.prototype.readDouble = function (tag, require, DEFAULT_VALUE) {
if (this._skipToTag(tag, require) == false) { return DEFAULT_VALUE; }
var head = this._readFrom();
switch (head.type) {
case Tars.DataHelp.EN_ZERO : return 0;
case Tars.DataHelp.EN_DOUBLE : return this._binBuffer.readDouble();
}
throw new Tars.DecodeMismatch("read double type mismatch, tag:" + tag + ", get type:" + head.type);
}
Tars.TarsInputStream.prototype.readUInt8 = function (tag, require, DEFAULT_VALUE) {
return this.readInt16(tag, require, DEFAULT_VALUE);
}
Tars.TarsInputStream.prototype.readUInt16 = function (tag, require, DEFAULT_VALUE) {
return this.readInt32(tag, require, DEFAULT_VALUE);
}
Tars.TarsInputStream.prototype.readUInt32 = function (tag, require, DEFAULT_VALUE) {
return this.readInt64(tag, require, DEFAULT_VALUE);
}
Tars.TarsInputStream.prototype.readString = function (tag, require, DEFAULT_VALUE, bRaw) {
if (this._skipToTag(tag, require) == false) { return DEFAULT_VALUE; }
var head = this._readFrom();
if (head.type == Tars.DataHelp.EN_STRING1) {
return this._binBuffer.readString(this._binBuffer.readUInt8(), bRaw);
}
if (head.type == Tars.DataHelp.EN_STRING4) {
return this._binBuffer.readString(this._binBuffer.readUInt32(), bRaw);
}
throw new Tars.DecodeMismatch("read 'string' type mismatch, tag: " + tag + ", get type: " + head.type + ".");
}
Tars.TarsInputStream.prototype.readStruct = function (tag, require, TYPE_T) {
if (this._skipToTag(tag, require) == false) { return new TYPE_T(); }
var head = this._readFrom();
if (head.type != Tars.DataHelp.EN_STRUCTBEGIN) {
throw new Tars.DecodeMismatch("read struct type mismatch, tag: " + tag + ", get type:" + head.type);
}
var temp = TYPE_T._readFrom(this);
this._skipToStructEnd();
return temp;
}
Tars.TarsInputStream.prototype.readBytes = function(tag, require, TYPE_T, bRaw) {
if (this._skipToTag(tag, require) == false) { return new TYPE_T(); }
var head = this._readFrom();
if (head.type == Tars.DataHelp.EN_SIMPLELIST) {
var temp = this._readFrom();
if (temp.type != Tars.DataHelp.EN_INT8) {
throw new Tars.DecodeMismatch("type mismatch, tag:" + tag + ",type:" + head.type + "," + temp.type);
}
var size = this.readInt32(0, true);
if (size < 0) {
throw new Tars.DecodeInvalidValue("invalid size, tag:" + tag + ",type:" + head.type + "," + temp.type);
}
var bytes = this._binBuffer.readBinBuffer(size, bRaw);
bytes.position = 0;
return bytes;
}
throw new Tars.DecodeMismatch("type mismatch, tag:" + tag + ",type:" + head.type);
}
var readListDeprecateWarnning = util.deprecate(function(){},"bRaw in readList is deprecated, use List(TarsStream.String, bRaw) instead");
Tars.TarsInputStream.prototype.readList = function(tag, require, TYPE_T, bRaw) {
if (this._skipToTag(tag, require) == false) { return TYPE_T; }
var head = this._readFrom();
if (head.type != Tars.DataHelp.EN_LIST) {
throw new Tars.DecodeMismatch("read 'vector' type mismatch, tag: " + tag + ", get type: " + head.type);
}
var size = this.readInt32(0, true);
if (size < 0) {
throw new Tars.DecodeInvalidValue("invalid size, tag: " + tag + ", type: " + head.type + ", size: " + size);
}
//3.0.21版本之前通过readList(xxx, true)来表示字符串转buffer,long转string表示
//3.0.21版本之后通过构造 List<T, bValue>来表示是否转换,这里以后要废弃掉
if(bRaw === true){
readListDeprecateWarnning();
}
var bValue = TYPE_T._bValue || bRaw;
var TEMP = new Tars.List(TYPE_T._proto);
for (var i = 0; i < size; ++i) {
TEMP.value.push(TEMP._proto._read(this, 0, TEMP._proto, bValue));
}
return TEMP;
}
Tars.TarsInputStream.prototype.readMap = function(tag, require, TYPE_T) {
if (this._skipToTag(tag, require) == false) { return TYPE_T; }
var head = this._readFrom();
if (head.type != Tars.DataHelp.EN_MAP) {
throw new Tars.DecodeMismatch("read 'map' type mismatch, tag: " + tag + ", get type: " + head.type);
}
var size = this.readInt32(0, true);
if (size < 0) {
throw new Tars.DecodeMismatch("invalid map, tag: " + tag + ", size: " + size);
}
var bKey = TYPE_T._bKey, bValue = TYPE_T._bValue;
if(TYPE_T._kproto == Tars.String){
bKey = false;
}
var TEMP = new Tars.Map(TYPE_T._kproto, TYPE_T._vproto, bKey, bValue);
for (var i = 0; i < size; i++) {
var key = TEMP._kproto._read(this, 0, TEMP._kproto, bKey);
var val = TEMP._vproto._read(this, 1, TEMP._vproto, bValue);
TEMP.insert(key, val);
}
return TEMP;
}
/**
* TUP包裹类
*/
Tars.UniAttribute = function () {
this._data = new Tars.Map(Tars.String, Tars.BinBuffer);
this._mmap = new Tars.Map(Tars.String, Tars.Map(Tars.String, Tars.BinBuffer));
this._buff = new Tars.TarsOutputStream();
this._temp = new Tars.TarsInputStream(new Tars.BinBuffer());
this._iver = Tars.UniAttribute.TUP_SIMPLE;
this.__defineGetter__("tupVersion", function() { return this._iver; });
this.__defineSetter__("tupVersion", function(value) { this._iver = value; });
}
Tars.UniAttribute.TUP_COMPLEX = 2;
Tars.UniAttribute.TUP_SIMPLE = 3;
Tars.UniAttribute.JSON_VERSION = 5;
Tars.UniAttribute.prototype._getkey = function(name, DEFAULT_VALUE, TYPE_T, FUNC, bValue) {
if (this._iver == Tars.UniAttribute.TUP_SIMPLE) {
var binBuffer = this._data.get(name);
if (binBuffer == undefined && DEFAULT_VALUE == undefined) {
throw new Tars.TupNotFoundKey("UniAttribute not found key:" + name);
}
if (binBuffer == undefined && DEFAULT_VALUE != undefined) {
return DEFAULT_VALUE;
}
} else {
var item = this._mmap.get(name);
if (item == undefined && DEFAULT_VALUE == undefined) {
throw new Tars.TupNotFoundKey("UniAttribute not found key:" + name);
}
if (item == undefined && DEFAULT_VALUE != undefined) {
return DEFAULT_VALUE;
}
var binBuffer = item.get(TYPE_T._classname);
if (binBuffer == undefined) {
throw new Tars.TupNotFoundKey("UniAttribute type match fail,key:" + name + ",type:" + TYPE_T._classname);
}
}
this._temp.setBinBuffer(binBuffer);
return FUNC.call(this._temp, 0, true, TYPE_T, bValue)
};
Tars.UniAttribute.prototype._setkey = function(name, value, TYPE_T, FUNC, bValue) {
this._buff._binBuffer.reset();
FUNC.call(this._buff, 0, value, bValue);
if (this._iver == Tars.UniAttribute.TUP_SIMPLE) {
this._data.set(name, new Tars.BinBuffer(this._buff.getBinBuffer().toNodeBuffer()));
} else {
var temp = new Tars.Map(Tars.String, Tars.BinBuffer);
temp.set(TYPE_T._classname, new Tars.BinBuffer(this._buff.getBinBuffer().toNodeBuffer()));
this._mmap.set(name, temp);
}
};
Tars.UniAttribute.prototype.decode = function(binBuffer) {
var is = new Tars.TarsInputStream(binBuffer);
if (this._iver == Tars.UniAttribute.TUP_SIMPLE) {
this._data.clear();
this._data = is.readMap(0, true, Tars.Map(Tars.String, Tars.BinBuffer));
} else {
this._mmap.clear();
this._mmap = is.readMap(0, true, Tars.Map(Tars.String, Tars.Map(Tars.String, Tars.BinBuffer)));
}
};
Tars.UniAttribute.prototype.encode = function() {
var os = new Tars.TarsOutputStream();
os.writeMap(0, this._iver == Tars.UniAttribute.TUP_SIMPLE?this._data:this._mmap);
return os.getBinBuffer();
};
Tars.UniAttribute.prototype.writeBoolean = function(name, value) { this._setkey(name, value, Tars.Boolean, this._buff.writeBoolean); };
Tars.UniAttribute.prototype.writeInt8 = function(name, value) { this._setkey(name, value, Tars.Int8, this._buff.writeInt8); };
Tars.UniAttribute.prototype.writeUInt8 = function(name, value) { this._setkey(name, value, Tars.UInt8, this._buff.writeUInt8); };
Tars.UniAttribute.prototype.writeInt16 = function(name, value) { this._setkey(name, value, Tars.Int16, this._buff.writeInt16); };
Tars.UniAttribute.prototype.writeUInt16 = function(name, value) { this._setkey(name, value, Tars.UInt16, this._buff.writeUInt16); };
Tars.UniAttribute.prototype.writeInt32 = function(name, value) { this._setkey(name, value, Tars.Int32, this._buff.writeInt32); };
Tars.UniAttribute.prototype.writeUInt32 = function(name, value) { this._setkey(name, value, Tars.UInt32, this._buff.writeUInt32); };
Tars.UniAttribute.prototype.writeInt64 = function(name, value, bValue) { this._setkey(name, value, Tars.Int64, this._buff.writeInt64, bValue); };
Tars.UniAttribute.prototype.writeFloat = function(name, value) { this._setkey(name, value, Tars.Float, this._buff.writeFloat); };
Tars.UniAttribute.prototype.writeDouble = function(name, value) { this._setkey(name, value, Tars.Double, this._buff.writeDouble); };
Tars.UniAttribute.prototype.writeBytes = function(name, value) { this._setkey(name, value, Tars.BinBuffer, this._buff.writeBytes); };
Tars.UniAttribute.prototype.writeString = function(name, value, bValue) { this._setkey(name, value, Tars.String, this._buff.writeString, bValue); };
Tars.UniAttribute.prototype.writeStruct = function(name, value) { this._setkey(name, value, value, this._buff.writeStruct); };
Tars.UniAttribute.prototype.writeList = function(name, value) { this._setkey(name, value, value, this._buff.writeList); };
Tars.UniAttribute.prototype.writeMap = function(name, value) { this._setkey(name, value, value, this._buff.writeMap); };
Tars.UniAttribute.prototype.readBoolean = function(name, DEFAULT_VALUE) { return this._getkey(name, DEFAULT_VALUE, Tars.Boolean, this._temp.readBoolean); };
Tars.UniAttribute.prototype.readInt8 = function(name, DEFAULT_VALUE) { return this._getkey(name, DEFAULT_VALUE, Tars.Int8, this._temp.readInt8); };
Tars.UniAttribute.prototype.readUInt8 = function(name, DEFAULT_VALUE) { return this._getkey(name, DEFAULT_VALUE, Tars.UInt8, this._temp.readUInt8); };
Tars.UniAttribute.prototype.readInt16 = function(name, DEFAULT_VALUE) { return this._getkey(name, DEFAULT_VALUE, Tars.Int16, this._temp.readInt16); };
Tars.UniAttribute.prototype.readUInt16 = function(name, DEFAULT_VALUE) { return this._getkey(name, DEFAULT_VALUE, Tars.UInt16, this._temp.readUInt16); };
Tars.UniAttribute.prototype.readInt32 = function(name, DEFAULT_VALUE) { return this._getkey(name, DEFAULT_VALUE, Tars.Int32, this._temp.readInt32); };
Tars.UniAttribute.prototype.readUInt32 = function(name, DEFAULT_VALUE) { return this._getkey(name, DEFAULT_VALUE, Tars.UInt32, this._temp.readUInt32); };
Tars.UniAttribute.prototype.readInt64 = function(name, DEFAULT_VALUE, bValue) { return this._getkey(name, DEFAULT_VALUE, Tars.Int64, this._temp.readInt64, bValue); };
Tars.UniAttribute.prototype.readFloat = function(name, DEFAULT_VALUE) { return this._getkey(name, DEFAULT_VALUE, Tars.Float, this._temp.readFloat); };
Tars.UniAttribute.prototype.readDouble = function(name, DEFAULT_VALUE) { return this._getkey(name, DEFAULT_VALUE, Tars.Double, this._temp.readDouble); };
Tars.UniAttribute.prototype.readBytes = function(name, DEFAULT_VALUE) { return this._getkey(name, DEFAULT_VALUE, Tars.BinBuffer, this._temp.readBytes); };
Tars.UniAttribute.prototype.readString = function(name, DEFAULT_VALUE, bValue) { return this._getkey(name, DEFAULT_VALUE, Tars.String, this._temp.readString, bValue); };
Tars.UniAttribute.prototype.readStruct = function(name, TYPE_T, DEFAULT_VALUE) { return this._getkey(name, DEFAULT_VALUE, TYPE_T, this._temp.readStruct); };
Tars.UniAttribute.prototype.readList = function(name, TYPE_T, DEFAULT_VALUE) { return this._getkey(name, DEFAULT_VALUE, TYPE_T, this._temp.readList); };
Tars.UniAttribute.prototype.readMap = function(name, TYPE_T, DEFAULT_VALUE) { return this._getkey(name, DEFAULT_VALUE, TYPE_T, this._temp.readMap); };
Tars.Tup = function () {
this._iVersion = 0;
this._cPacketType = 0;
this._iMessageType = 0;
this._iRequestId = 0;
this._sServantName = '';
this._sFuncName = '';
this._binBuffer = new Tars.BinBuffer();
this._iTimeout = 0;
this._context = new Tars.Map(Tars.String, Tars.String);
this._status = new Tars.Map(Tars.String, Tars.String);
this._attribute = new Tars.UniAttribute();
this.__defineGetter__("servantName", function() { return this._sServantName; });
this.__defineSetter__("servantName", function(value) { this._sServantName = value; });
this.__defineGetter__("funcName", function() { return this._sFuncName; });
this.__defineSetter__("funcName", function(value) { this._sFuncName = value; });
this.__defineGetter__("requestId", function() { return this._iRequestId; });
this.__defineSetter__("requestId", function(value) { this._iRequestId = value; });
this.__defineGetter__("tupVersion", function() { return this._attribute.tupVersion; });
this.__defineSetter__("tupVersion", function(value) { this._attribute.tupVersion = value; });
};
Tars.Tup.TUP_COMPLEX = Tars.UniAttribute.TUP_COMPLEX; //复杂TUP协议
Tars.Tup.TUP_SIMPLE = Tars.UniAttribute.TUP_SIMPLE; //精简TUP协议
Tars.Tup.JSON_VERSION = Tars.UniAttribute.JSON_VERSION; //tars-json协议
Tars.Tup.prototype._writeTo = function() {
var os = new Tars.TarsOutputStream();
os._binBuffer.writeInt32(0);
os.writeInt16 (1, this._attribute.tupVersion);
os.writeInt8 (2, this._cPacketType);
os.writeInt32 (3, this._iMessageType);
os.writeInt32 (4, this._iRequestId);
os.writeString (5, this._sServantName);
os.writeString (6, this._sFuncName);
os.writeBytes (7, this._binBuffer);
os.writeInt32 (8, this._iTimeout);
os.writeMap (9, this._context);
os.writeMap (10, this._status);
var pos = os._binBuffer._position;
var len = os._binBuffer._length;
os._binBuffer._position = 0;
os._binBuffer.writeInt32(os._binBuffer._length);
os._binBuffer._length = len;
os._binBuffer._position = pos;
return os.getBinBuffer();
}
Tars.Tup.prototype._readFrom = function(is) {
this._iVersion = is.readInt16(1, true);
this._cPacketType = is.readInt8(2, true);
this._iMessageType = is.readInt32(3, true);
this._iRequestId = is.readInt32(4, true);
this._sServantName = is.readString(5, true);
this._sFuncName = is.readString(6, true);
this._binBuffer = is.readBytes(7, true);
this._iTimeout = is.readInt32(8, true);
this._context = is.readMap(9, false, Tars.Map(Tars.String, Tars.String));
this._status = is.readMap(10, false, Tars.Map(Tars.String, Tars.String));
this._attribute.tupVersion = this._iVersion;
}
Tars.Tup.prototype.encode = function() {
this._binBuffer = this._attribute.encode();
return this._writeTo();
}
Tars.Tup.prototype.decode = function (binBuffer) {
var is = new Tars.TarsInputStream(binBuffer);
var len = is._binBuffer.readInt32();
if (len < 4) {
throw Error("packet length too short");
}
this._readFrom(is);
this._attribute.decode(this._binBuffer);
}
Tars.Tup.prototype.getTarsResultCode = function () {
var code = this._status.get("STATUS_RESULT_CODE");
return code === undefined?0:parseInt(code);
}
Tars.Tup.prototype.getTarsResultDesc = function () {
var desc = this._status.get("STATUS_RESULT_DESC");
return desc === undefined?"":desc;
}
Tars.Tup.prototype.writeBoolean = function(name, value) { this._attribute.writeBoolean(name, value); }
Tars.Tup.prototype.writeInt8 = function(name, value) { this._attribute.writeInt8(name, value); }
Tars.Tup.prototype.writeUInt8 = function(name, value) { this._attribute.writeUInt8(name, value); }
Tars.Tup.prototype.writeInt16 = function(name, value) { this._attribute.writeInt16(name, value); }
Tars.Tup.prototype.writeUInt16 = function(name, value) { this._attribute.writeUInt16(name, value); }
Tars.Tup.prototype.writeInt32 = function(name, value) { this._attribute.writeInt32(name, value); }
Tars.Tup.prototype.writeUInt32 = function(name, value) { this._attribute.writeUInt32(name, value); }
Tars.Tup.prototype.writeInt64 = function(name, value, bValue) { this._attribute.writeInt64(name, value, bValue); }
Tars.Tup.prototype.writeFloat = function(name, value) { this._attribute.writeFloat(name, value); }
Tars.Tup.prototype.writeDouble = function(name, value) { this._attribute.writeDouble(name, value); }
Tars.Tup.prototype.writeBytes = function(name, value) { this._attribute.writeBytes(name, value); }
Tars.Tup.prototype.writeString = function(name, value, bValue) { this._attribute.writeString(name, value, bValue); }
Tars.Tup.prototype.writeStruct = function(name, value) { this._attribute.writeStruct(name, value); }
Tars.Tup.prototype.writeList = function(name, value) { this._attribute.writeList(name, value); }
Tars.Tup.prototype.writeMap = function(name, value) { this._attribute.writeMap(name, value); }
Tars.Tup.prototype.readBoolean = function(name, DEFAULT_VALUE) { return this._attribute.readBoolean(name, DEFAULT_VALUE); }
Tars.Tup.prototype.readInt8 = function(name, DEFAULT_VALUE) { return this._attribute.readInt8(name, DEFAULT_VALUE); }
Tars.Tup.prototype.readUInt8 = function(name, DEFAULT_VALUE) { return this._attribute.readUInt8(name, DEFAULT_VALUE); }
Tars.Tup.prototype.readInt16 = function(name, DEFAULT_VALUE) { return this._attribute.readInt16(name, DEFAULT_VALUE); }
Tars.Tup.prototype.readUInt16 = function(name, DEFAULT_VALUE) { return this._attribute.readUInt16(name, DEFAULT_VALUE); }
Tars.Tup.prototype.readInt32 = function(name, DEFAULT_VALUE) { return this._attribute.readInt32(name, DEFAULT_VALUE); }
Tars.Tup.prototype.readUInt32 = function(name, DEFAULT_VALUE) { return this._attribute.readUInt32(name, DEFAULT_VALUE); }
Tars.Tup.prototype.readInt64 = function(name, DEFAULT_VALUE, bValue) { return this._attribute.readInt64(name, DEFAULT_VALUE, bValue); }
Tars.Tup.prototype.readFloat = function(name, DEFAULT_VALUE) { return this._attribute.readFloat(name, DEFAULT_VALUE); }
Tars.Tup.prototype.readDouble = function(name, DEFAULT_VALUE) { return this._attribute.readDouble(name, DEFAULT_VALUE); }
Tars.Tup.prototype.readBytes = function(name, DEFAULT_VALUE) { return this._attribute.readBytes(name, DEFAULT_VALUE); }
Tars.Tup.prototype.readString = function(name, DEFAULT_VALUE, bValue) { return this._attribute.readString(name, DEFAULT_VALUE, bValue); }
Tars.Tup.prototype.readStruct = function(name, TYPE_T, DEFAULT_VALUE) { return this._attribute.readStruct(name, TYPE_T, DEFAULT_VALUE); }
Tars.Tup.prototype.readList = function(name, TYPE_T, DEFAULT_VALUE) { return this._attribute.readList(name, TYPE_T, DEFAULT_VALUE); }
Tars.Tup.prototype.readMap = function(name, TYPE_T, DEFAULT_VALUE) { return this._attribute.readMap(name, TYPE_T, DEFAULT_VALUE); }
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
JavaScript
1
https://gitee.com/tars-node/stream.git
git@gitee.com:tars-node/stream.git
tars-node
stream
stream
master

搜索帮助