feat: optimize code

Signed-off-by: MiaoWoo <admin@yumc.pw>
master
MiaoWoo 2019-07-22 16:08:35 +08:00
parent 8c849ed49f
commit 9c300cd191
1 changed files with 370 additions and 401 deletions

View File

@ -16,217 +16,206 @@ function Write(buf, data, StringFormat?, ParamValue?, WorkStruct?) {
global.ToLogTrace("ERRR StringFormat "); global.ToLogTrace("ERRR StringFormat ");
throw "ERR!!"; throw "ERR!!";
} }
else { var format = StringFormat;
var format = StringFormat; if (format.substr(0, 6) === "buffer" && format.length > 6) {
if (format.substr(0, 6) === "buffer" && format.length > 6) { ParamValue = parseInt(format.substr(6));
ParamValue = parseInt(format.substr(6)); format = "buffer";
format = "buffer"; } else if (format.substr(0, 3) === "arr" && format.length > 3) {
} ParamValue = parseInt(format.substr(3));
else format = "arr";
if (format.substr(0, 3) === "arr" && format.length > 3) { } else if (format.substr(0, 3) === "str" && format.length > 3) {
ParamValue = parseInt(format.substr(3)); var length = parseInt(format.substr(3));
format = "arr"; if (data)
buf.write(data, buf.len, length);
buf.len += length;
return;
}
switch (format) {
case "str":
{
var arr = global.toUTF8Array(data);
let length = arr.length;
if (length > 65535)
length = 0;
buf[buf.len] = length & 255;
buf[buf.len + 1] = (length >>> 8) & 255;
buf.len += 2;
for (var i = 0; i < length; i++) {
buf[buf.len + i] = arr[i];
}
buf.len += length;
break;
} }
else case "byte":
if (format.substr(0, 3) === "str" && format.length > 3) { {
var length = parseInt(format.substr(3)); if (data < 0)
if (data) data = 0;
buf.write(data, buf.len, length); buf[buf.len] = data;
buf.len += length; buf.len += 1;
return; break;
}
case "double":
{
buf.writeDoubleLE(data, buf.len, 8);
buf.len += 8;
break;
}
case "uint":
{
if (data < 0)
data = 0;
if (data >= 281474976710655)
data = 0;
buf.writeUIntLE(data, buf.len, 6);
buf.len += 6;
break;
}
case "uint16":
{
if (data < 0)
data = 0;
buf[buf.len] = data & 255;
buf[buf.len + 1] = (data >>> 8) & 255;
buf.len += 2;
break;
}
case "uint32":
{
if (data < 0)
data = 0;
buf.writeUInt32LE(data, buf.len, 4);
buf.len += 4;
break;
}
case "time":
{
var Time = data.valueOf();
buf.writeUIntLE(Time, buf.len, 6);
buf.len += 6;
break;
}
case "addres":
case "hash":
{
let length;
if (data)
length = Math.min(32, data.length);
else
length = 0;
for (var i = 0; i < length; i++) {
buf[buf.len + i] = data[i];
} }
switch (format) { buf.len += 32;
case "str": break;
{ }
var arr = global.toUTF8Array(data); case "buffer":
let length = arr.length; {
if (length > 65535) let length;
length = 0; if (ParamValue === undefined)
buf[buf.len] = length & 255; length = data.length;
buf[buf.len + 1] = (length >>> 8) & 255; else
buf.len += 2; length = Math.min(ParamValue, data.length);
for (var i = 0; i < length; i++) { for (var i = 0; i < length; i++) {
buf[buf.len + i] = arr[i]; buf[buf.len + i] = data[i];
}
buf.len += length;
break;
} }
case "byte": buf.len += ParamValue;
{ break;
if (data < 0) }
data = 0; case "arr":
buf[buf.len] = data; {
buf.len += 1; let length;
break; if (data)
length = Math.min(ParamValue, data.length);
else
length = 0;
for (var i = 0; i < length; i++) {
buf[buf.len + i] = data[i];
} }
case "double": buf.len += ParamValue;
{ break;
buf.writeDoubleLE(data, buf.len, 8); }
buf.len += 8; case "tr":
break; {
let length = data.length;
if (global.MAX_TRANSACTION_SIZE > global.MAX_TRANSACTION_SIZE)
length = global.MAX_TRANSACTION_SIZE;
buf[buf.len] = length & 255;
buf[buf.len + 1] = (length >>> 8) & 255;
buf.len += 2;
for (var i = 0; i < length; i++) {
buf[buf.len + i] = data[i];
} }
case "uint": buf.len += length;
{ break;
if (data < 0) }
data = 0; case "data":
if (data >= 281474976710655) {
data = 0; let length = data.length;
buf.writeUIntLE(data, buf.len, 6); buf.writeUInt32LE(length, buf.len, 4);
buf.len += 6; buf.len += 4;
break; for (var i = 0; i < length; i++) {
buf[buf.len + i] = data[i];
} }
case "uint16": buf.len += length;
{ break;
if (data < 0) }
data = 0; case "hashSTR":
buf[buf.len] = data & 255; {
buf[buf.len + 1] = (data >>> 8) & 255; var Str = global.GetHexFromAddres(data);
buf.len += 2; buf.write(Str, buf.len, 64);
break; buf.len += 64;
} break;
case "uint32": }
{ case "uintSTR":
if (data < 0) {
data = 0; var Str = data.toString();
buf.writeUInt32LE(data, buf.len, 4); buf.write(Str, buf.len, 10);
buf.len += 4; buf.len += 10;
break; break;
} }
case "time": default:
{ {
var Time = data.valueOf(); WorkStruct = WorkStruct || {};
buf.writeUIntLE(Time, buf.len, 6); var CurFormat = StringFormat.substr(0, 1);
buf.len += 6; if (CurFormat === "[") {
break;
}
case "addres":
case "hash":
{
let length; let length;
if (data) if (data)
length = Math.min(32, data.length);
else
length = 0;
for (var i = 0; i < length; i++) {
buf[buf.len + i] = data[i];
}
buf.len += 32;
break;
}
case "buffer":
{
let length;
if (ParamValue === undefined)
length = data.length; length = data.length;
else var formatNext = GetMiddleString(format);
length = Math.min(ParamValue, data.length); Write(buf, length, "uint32");
for (var i = 0; i < length; i++) { for (var i = 0; i < length; i++) {
buf[buf.len + i] = data[i]; Write(buf, data[i], formatNext, undefined, WorkStruct);
} }
buf.len += ParamValue; } else if (CurFormat === "<") {
break;
}
case "arr":
{
let length; let length;
if (data) if (data)
length = Math.min(ParamValue, data.length); length = data.length;
else var formatNext = GetMiddleString(format);
length = 0; var IndexCount = 0;
for (var i = 0; i < length; i++) { var len = buf.len;
buf[buf.len + i] = data[i];
}
buf.len += ParamValue;
break;
}
case "tr":
{
let length = data.length;
if (global.MAX_TRANSACTION_SIZE > global.MAX_TRANSACTION_SIZE)
length = global.MAX_TRANSACTION_SIZE;
buf[buf.len] = length & 255;
buf[buf.len + 1] = (length >>> 8) & 255;
buf.len += 2;
for (var i = 0; i < length; i++) {
buf[buf.len + i] = data[i];
}
buf.len += length;
break;
}
case "data":
{
let length = data.length;
buf.writeUInt32LE(length, buf.len, 4);
buf.len += 4; buf.len += 4;
for (var i = 0; i < length; i++) { for (var i = 0; i < length; i++) {
buf[buf.len + i] = data[i]; if (data[i]) {
} IndexCount++;
buf.len += length; Write(buf, i, "uint32");
break;
}
case "hashSTR":
{
var Str = global.GetHexFromAddres(data);
buf.write(Str, buf.len, 64);
buf.len += 64;
break;
}
case "uintSTR":
{
var Str = data.toString();
buf.write(Str, buf.len, 10);
buf.len += 10;
break;
}
default:
{
WorkStruct = WorkStruct || {};
var CurFormat = StringFormat.substr(0, 1);
if (CurFormat === "[") {
let length;
if (data)
length = data.length;
var formatNext = GetMiddleString(format);
Write(buf, length, "uint32");
for (var i = 0; i < length; i++) {
Write(buf, data[i], formatNext, undefined, WorkStruct); Write(buf, data[i], formatNext, undefined, WorkStruct);
} }
} }
else buf.writeUInt32LE(IndexCount, len, 4);
if (CurFormat === "<") { } else if (CurFormat === "{") {
let length; var attrs = WorkStruct[format];
if (data) if (!attrs) {
length = data.length; attrs = GetAttributes(GetMiddleString(format));
var formatNext = GetMiddleString(format); WorkStruct[format] = attrs;
var IndexCount = 0; }
var len = buf.len; for (var i = 0; i < attrs.length; i++) {
buf.len += 4; var type = attrs[i];
for (var i = 0; i < length; i++) { Write(buf, data[type.Key], type.Value, undefined, WorkStruct);
if (data[i]) { }
IndexCount++; } else {
Write(buf, i, "uint32"); throw "Bad write type params: " + format;
Write(buf, data[i], formatNext, undefined, WorkStruct);
}
}
buf.writeUInt32LE(IndexCount, len, 4);
}
else
if (CurFormat === "{") {
var attrs = WorkStruct[format];
if (!attrs) {
attrs = GetAttributes(GetMiddleString(format));
WorkStruct[format] = attrs;
}
for (var i = 0; i < attrs.length; i++) {
var type = attrs[i];
Write(buf, data[type.Key], type.Value, undefined, WorkStruct);
}
}
else {
throw "Bad write type params: " + format;
}
} }
} }
} }
}; };
@ -236,225 +225,205 @@ function Read(buf, StringFormat, ParamValue?, WorkStruct?, bDisableTime?) {
global.ToLogTrace("ERR StringFormat"); global.ToLogTrace("ERR StringFormat");
throw "ERRR!"; throw "ERRR!";
} }
else { var format = StringFormat;
var format = StringFormat; if (format.substr(0, 6) === "buffer") {
if (format.substr(0, 6) === "buffer") { if (format.length > 6) {
if (format.length > 6) { ParamValue = parseInt(format.substr(6));
ParamValue = parseInt(format.substr(6)); format = "buffer";
format = "buffer"; } else {
} ParamValue = 0;
else {
ParamValue = 0;
}
} }
else } else if (format.substr(0, 3) === "arr") {
if (format.substr(0, 3) === "arr") { if (format.length > 3) {
if (format.length > 3) { ParamValue = parseInt(format.substr(3));
ParamValue = parseInt(format.substr(3)); format = "arr";
format = "arr"; } else {
} ParamValue = 0;
else { }
ParamValue = 0; } else if (format.substr(0, 3) === "str") {
if (format.length > 3) {
var length = parseInt(format.substr(3));
ret = buf.toString('utf8', buf.len, buf.len + length);
buf.len += length;
var nEnd = - 1;
for (var i = ret.length - 1; i >= 0; i--) {
if (ret.charCodeAt(i) !== 0) {
nEnd = i;
break;
} }
} }
else return nEnd >= 0 ? ret.substr(0, i + 1) : "";
if (format.substr(0, 3) === "str") { } else {
if (format.length > 3) { ParamValue = 0;
var length = parseInt(format.substr(3)); }
ret = buf.toString('utf8', buf.len, buf.len + length); }
buf.len += length; switch (format) {
var nEnd = - 1; case "str":
for (var i = ret.length - 1; i >= 0; i--) { {
if (ret.charCodeAt(i) !== 0) { let length;
nEnd = i; if (buf.len + 2 <= buf.length)
break; length = buf[buf.len] + buf[buf.len + 1] * 256;
} else
} length = 0;
if (nEnd >= 0) buf.len += 2;
ret = ret.substr(0, i + 1); var arr = buf.slice(buf.len, buf.len + length);
else ret = global.Utf8ArrayToStr(arr);
ret = ""; buf.len += length;
return ret; break;
} }
else { case "byte":
ParamValue = 0; {
} if (buf.len + 1 <= buf.length)
} ret = buf[buf.len];
switch (format) { else
case "str": ret = 0;
{ buf.len += 1;
let length; break;
if (buf.len + 2 <= buf.length) }
length = buf[buf.len] + buf[buf.len + 1] * 256; case "double":
{
if (buf.len + 8 <= buf.length)
ret = buf.readDoubleLE(buf.len, 8);
else
ret = 0;
buf.len += 8;
break;
}
case "uint":
{
if (buf.len + 6 <= buf.length)
ret = buf.readUIntLE(buf.len, 6);
else
ret = 0;
buf.len += 6;
break;
}
case "uint16":
{
if (buf.len + 2 <= buf.length)
ret = buf[buf.len] + buf[buf.len + 1] * 256;
else
ret = 0;
buf.len += 2;
break;
}
case "uint32":
{
if (buf.len + 4 <= buf.length)
ret = buf.readUInt32LE(buf.len, 4);
else
ret = 0;
buf.len += 4;
break;
}
case "time":
{
if (bDisableTime)
throw "Bad read type params: time - DisableTime ON";
if (buf.len + 6 <= buf.length)
ret = buf.readUIntLE(buf.len, 6);
else
ret = 0;
ret = new Date(ret);
buf.len += 6;
break;
}
case "addres":
case "hash":
{
ret = [];
for (var i = 0; i < 32; i++) {
if (buf.len + i <= buf.length)
ret[i] = buf[buf.len + i];
else else
length = 0; ret[i] = 0;
buf.len += 2; }
var arr = buf.slice(buf.len, buf.len + length); buf.len += 32;
ret = global.Utf8ArrayToStr(arr); break;
buf.len += length; }
case "buffer":
case "arr":
{
if (buf.len + ParamValue <= buf.length)
ret = buf.slice(buf.len, buf.len + ParamValue);
else
ret = Buffer.alloc(ParamValue);
buf.len += ParamValue;
break;
}
case "tr":
{
if (buf.len + 1 >= buf.length) {
ret = undefined;
break; break;
} }
case "byte": let length = buf[buf.len] + buf[buf.len + 1] * 256;
{ buf.len += 2;
if (buf.len + 1 <= buf.length) ret = buf.slice(buf.len, buf.len + length);
ret = buf[buf.len]; buf.len += length;
else break;
ret = 0; }
buf.len += 1; case "data":
break; {
} let length;
case "double": if (buf.len + 4 <= buf.length)
{ length = buf.readUInt32LE(buf.len, 4);
if (buf.len + 8 <= buf.length) else
ret = buf.readDoubleLE(buf.len, 8); length = 0;
else if (length > buf.length - buf.len - 4)
ret = 0; length = 0;
buf.len += 8; buf.len += 4;
break; ret = buf.slice(buf.len, buf.len + length);
} buf.len += length;
case "uint": break;
{ }
if (buf.len + 6 <= buf.length) case "hashSTR":
ret = buf.readUIntLE(buf.len, 6); {
else var Str = buf.toString('utf8', buf.len, buf.len + 64);
ret = 0; ret = global.GetAddresFromHex(Str);
buf.len += 6; buf.len += 64;
break; break;
} }
case "uint16": case "uintSTR":
{ {
if (buf.len + 2 <= buf.length) var Str = buf.toString('utf8', buf.len, buf.len + 10);
ret = buf[buf.len] + buf[buf.len + 1] * 256; ret = parseInt(Str);
else buf.len += 10;
ret = 0; break;
buf.len += 2; }
break; default:
} {
case "uint32": WorkStruct = WorkStruct || {};
{ var LStr = format.substr(0, 1);
if (buf.len + 4 <= buf.length) if (LStr === "[" || LStr === "<") {
ret = buf.readUInt32LE(buf.len, 4); var bIndexArr = (LStr === "<");
else
ret = 0;
buf.len += 4;
break;
}
case "time":
{
if (bDisableTime)
throw "Bad read type params: time - DisableTime ON";
if (buf.len + 6 <= buf.length)
ret = buf.readUIntLE(buf.len, 6);
else
ret = 0;
ret = new Date(ret);
buf.len += 6;
break;
}
case "addres":
case "hash":
{
ret = []; ret = [];
for (var i = 0; i < 32; i++) { var formatNext = GetMiddleString(format);
if (buf.len + i <= buf.length) let length = Read(buf, "uint32");
ret[i] = buf[buf.len + i]; for (var i = 0; i < length; i++) {
else if (buf.len > buf.length) { break; }
ret[i] = 0; if (bIndexArr) {
} var index = Read(buf, "uint32");
buf.len += 32; ret[index] = Read(buf, formatNext, undefined, WorkStruct, bDisableTime);
break; } else {
} ret[i] = Read(buf, formatNext, undefined, WorkStruct, bDisableTime);
case "buffer":
case "arr":
{
if (buf.len + ParamValue <= buf.length)
ret = buf.slice(buf.len, buf.len + ParamValue);
else
ret = Buffer.alloc(ParamValue);
buf.len += ParamValue;
break;
}
case "tr":
{
if (buf.len + 1 >= buf.length) {
ret = undefined;
break;
}
let length = buf[buf.len] + buf[buf.len + 1] * 256;
buf.len += 2;
ret = buf.slice(buf.len, buf.len + length);
buf.len += length;
break;
}
case "data":
{
let length;
if (buf.len + 4 <= buf.length)
length = buf.readUInt32LE(buf.len, 4);
else
length = 0;
if (length > buf.length - buf.len - 4)
length = 0;
buf.len += 4;
ret = buf.slice(buf.len, buf.len + length);
buf.len += length;
break;
}
case "hashSTR":
{
var Str = buf.toString('utf8', buf.len, buf.len + 64);
ret = global.GetAddresFromHex(Str);
buf.len += 64;
break;
}
case "uintSTR":
{
var Str = buf.toString('utf8', buf.len, buf.len + 10);
ret = parseInt(Str);
buf.len += 10;
break;
}
default:
{
WorkStruct = WorkStruct || {};
var LStr = format.substr(0, 1);
if (LStr === "[" || LStr === "<") {
var bIndexArr = (LStr === "<");
ret = [];
var formatNext = GetMiddleString(format);
let length = Read(buf, "uint32");
for (var i = 0; i < length; i++) {
if (buf.len <= buf.length) {
if (bIndexArr) {
var index = Read(buf, "uint32");
ret[index] = Read(buf, formatNext, undefined, WorkStruct, bDisableTime);
}
else {
ret[i] = Read(buf, formatNext, undefined, WorkStruct, bDisableTime);
}
}
else
break;
} }
} }
else } else if (LStr === "{") {
if (LStr === "{") { var attrs = WorkStruct[format];
var attrs = WorkStruct[format]; if (!attrs) {
if (!attrs) { attrs = GetAttributes(GetMiddleString(format));
attrs = GetAttributes(GetMiddleString(format)); WorkStruct[format] = attrs;
WorkStruct[format] = attrs; }
} ret = {};
ret = {}; for (var i = 0; i < attrs.length; i++) {
for (var i = 0; i < attrs.length; i++) { var type = attrs[i];
var type = attrs[i]; ret[type.Key] = Read(buf, type.Value, undefined, WorkStruct, bDisableTime);
ret[type.Key] = Read(buf, type.Value, undefined, WorkStruct, bDisableTime); }
} } else {
} throw "Bad read type params: " + format;
else {
throw "Bad read type params: " + format;
}
} }
} }
} }
return ret; return ret;
}; };