forked from circlecloud/tera
327 lines
11 KiB
TypeScript
327 lines
11 KiB
TypeScript
/*
|
|
* @project: TERA
|
|
* @version: Development (beta)
|
|
* @license: MIT (not for evil)
|
|
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
|
* Web: https://terafoundation.org
|
|
* Twitter: https://twitter.com/terafoundation
|
|
* Telegram: https://t.me/terafoundation
|
|
*/
|
|
|
|
|
|
function Write(e, r, t, n?, l?) {
|
|
if (!(e.len >= e.length)) {
|
|
if ("number" == typeof t)
|
|
throw global.ToLogTrace("ERRR StringFormat "), "ERR!!";
|
|
var a = t;
|
|
if ("buffer" === a.substr(0, 6) && 6 < a.length)
|
|
n = parseInt(a.substr(6)), a = "buffer";
|
|
else
|
|
if ("arr" === a.substr(0, 3) && 3 < a.length)
|
|
n = parseInt(a.substr(3)), a = "arr";
|
|
else
|
|
if ("str" === a.substr(0, 3) && 3 < a.length) {
|
|
var i = parseInt(a.substr(3));
|
|
return r && e.write(r, e.len, i), void (e.len += i);
|
|
}
|
|
switch (a) {
|
|
case "str":
|
|
var f = global.toUTF8Array(r);
|
|
65535 < (i = f.length) && (i = 0), e[e.len] = 255 & i, e[e.len + 1] = i >>> 8 & 255, e.len += 2;
|
|
for (var s = 0; s < i; s++)
|
|
e[e.len + s] = f[s];
|
|
e.len += i;
|
|
break;
|
|
case "byte":
|
|
r < 0 && (r = 0), e[e.len] = r, e.len += 1;
|
|
break;
|
|
case "double":
|
|
e.writeDoubleLE(r, e.len, 8), e.len += 8;
|
|
break;
|
|
case "uint":
|
|
r < 0 && (r = 0), 0xffffffffffff <= r && (r = 0), e.writeUIntLE(r, e.len, 6), e.len += 6;
|
|
break;
|
|
case "uint16":
|
|
r < 0 && (r = 0), e[e.len] = 255 & r, e[e.len + 1] = r >>> 8 & 255, e.len += 2;
|
|
break;
|
|
case "uint32":
|
|
r < 0 && (r = 0), e.writeUInt32LE(r, e.len, 4), e.len += 4;
|
|
break;
|
|
case "time":
|
|
var u = r.valueOf();
|
|
e.writeUIntLE(u, e.len, 6), e.len += 6;
|
|
break;
|
|
case "addres":
|
|
case "hash":
|
|
i = r ? Math.min(32, r.length) : 0;
|
|
for (s = 0; s < i; s++)
|
|
e[e.len + s] = r[s];
|
|
e.len += 32;
|
|
break;
|
|
case "buffer":
|
|
i = void 0 === n ? r.length : Math.min(n, r.length);
|
|
for (s = 0; s < i; s++)
|
|
e[e.len + s] = r[s];
|
|
e.len += n;
|
|
break;
|
|
case "arr":
|
|
i = r ? Math.min(n, r.length) : 0;
|
|
for (s = 0; s < i; s++)
|
|
e[e.len + s] = r[s];
|
|
e.len += n;
|
|
break;
|
|
case "tr":
|
|
i = r.length;
|
|
global.MAX_TRANSACTION_SIZE > global.MAX_TRANSACTION_SIZE && (i = global.MAX_TRANSACTION_SIZE), e[e.len] = 255 & i, e[e.len + 1] = i >>> 8 & 255,
|
|
e.len += 2;
|
|
for (s = 0; s < i; s++)
|
|
e[e.len + s] = r[s];
|
|
e.len += i;
|
|
break;
|
|
case "data":
|
|
i = r.length;
|
|
e.writeUInt32LE(i, e.len, 4), e.len += 4;
|
|
for (s = 0; s < i; s++)
|
|
e[e.len + s] = r[s];
|
|
e.len += i;
|
|
break;
|
|
case "hashSTR":
|
|
var o = global.GetHexFromAddres(r);
|
|
e.write(o, e.len, 64), e.len += 64;
|
|
break;
|
|
case "uintSTR":
|
|
o = r.toString();
|
|
e.write(o, e.len, 10), e.len += 10;
|
|
break;
|
|
default:
|
|
l = l || {};
|
|
var d = t.substr(0, 1);
|
|
if ("[" === d) {
|
|
r && (i = r.length);
|
|
var b = GetMiddleString(a);
|
|
Write(e, i, "uint32");
|
|
for (s = 0; s < i; s++)
|
|
Write(e, r[s], b, void 0, l);
|
|
}
|
|
else
|
|
if ("<" === d) {
|
|
r && (i = r.length);
|
|
b = GetMiddleString(a);
|
|
var h = 0, c = e.len;
|
|
e.len += 4;
|
|
for (s = 0; s < i; s++)
|
|
r[s] && (h++ , Write(e, s, "uint32"), Write(e, r[s], b, void 0, l));
|
|
e.writeUInt32LE(h, c, 4);
|
|
}
|
|
else {
|
|
if ("{" !== d)
|
|
throw "Bad write type params: " + a;
|
|
var g = l[a];
|
|
g || (g = GetAttributes(GetMiddleString(a)), l[a] = g);
|
|
for (s = 0; s < g.length; s++) {
|
|
var v = g[s];
|
|
Write(e, r[v.Key], v.Value, void 0, l);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
function Read(e, r, t?, n?, l?) {
|
|
var a;
|
|
if ("number" == typeof r)
|
|
throw global.ToLogTrace("ERR StringFormat"), "ERRR!";
|
|
var i = r;
|
|
if ("buffer" === i.substr(0, 6))
|
|
6 < i.length ? (t = parseInt(i.substr(6)), i = "buffer") : t = 0;
|
|
else
|
|
if ("arr" === i.substr(0, 3))
|
|
3 < i.length ? (t = parseInt(i.substr(3)), i = "arr") : t = 0;
|
|
else
|
|
if ("str" === i.substr(0, 3)) {
|
|
if (3 < i.length) {
|
|
var f = parseInt(i.substr(3));
|
|
a = e.toString("utf8", e.len, e.len + f), e.len += f;
|
|
for (var s = - 1, u = a.length - 1; 0 <= u; u--)
|
|
if (0 !== a.charCodeAt(u)) {
|
|
s = u;
|
|
break;
|
|
}
|
|
return a = 0 <= s ? a.substr(0, u + 1) : "";
|
|
}
|
|
t = 0;
|
|
}
|
|
switch (i) {
|
|
case "str":
|
|
f = e.len + 2 <= e.length ? e[e.len] + 256 * e[e.len + 1] : 0, e.len += 2;
|
|
var o = e.slice(e.len, e.len + f);
|
|
a = global.Utf8ArrayToStr(o), e.len += f;
|
|
break;
|
|
case "byte":
|
|
a = e.len + 1 <= e.length ? e[e.len] : 0, e.len += 1;
|
|
break;
|
|
case "double":
|
|
a = e.len + 8 <= e.length ? e.readDoubleLE(e.len, 8) : 0, e.len += 8;
|
|
break;
|
|
case "uint":
|
|
a = e.len + 6 <= e.length ? e.readUIntLE(e.len, 6) : 0, e.len += 6;
|
|
break;
|
|
case "uint16":
|
|
a = e.len + 2 <= e.length ? e[e.len] + 256 * e[e.len + 1] : 0, e.len += 2;
|
|
break;
|
|
case "uint32":
|
|
a = e.len + 4 <= e.length ? e.readUInt32LE(e.len, 4) : 0, e.len += 4;
|
|
break;
|
|
case "time":
|
|
if (l)
|
|
throw "Bad read type params: time - DisableTime ON";
|
|
a = e.len + 6 <= e.length ? e.readUIntLE(e.len, 6) : 0, a = new Date(a), e.len += 6;
|
|
break;
|
|
case "addres":
|
|
case "hash":
|
|
a = [];
|
|
for (u = 0; u < 32; u++)
|
|
e.len + u <= e.length ? a[u] = e[e.len + u] : a[u] = 0;
|
|
e.len += 32;
|
|
break;
|
|
case "buffer":
|
|
case "arr":
|
|
a = e.len + t <= e.length ? e.slice(e.len, e.len + t) : Buffer.alloc(t), e.len += t;
|
|
break;
|
|
case "tr":
|
|
if (e.len + 1 >= e.length) {
|
|
a = void 0;
|
|
break;
|
|
}
|
|
f = e[e.len] + 256 * e[e.len + 1];
|
|
e.len += 2, a = e.slice(e.len, e.len + f), e.len += f;
|
|
break;
|
|
case "data":
|
|
(f = e.len + 4 <= e.length ? e.readUInt32LE(e.len, 4) : 0) > e.length - e.len - 4 && (f = 0), e.len += 4, a = e.slice(e.len,
|
|
e.len + f), e.len += f;
|
|
break;
|
|
case "hashSTR":
|
|
var d = e.toString("utf8", e.len, e.len + 64);
|
|
a = global.GetAddresFromHex(d), e.len += 64;
|
|
break;
|
|
case "uintSTR":
|
|
d = e.toString("utf8", e.len, e.len + 10);
|
|
a = parseInt(d), e.len += 10;
|
|
break;
|
|
default:
|
|
n = n || {};
|
|
var b = i.substr(0, 1);
|
|
if ("[" === b || "<" === b) {
|
|
var h = "<" === b;
|
|
a = [];
|
|
var c = GetMiddleString(i);
|
|
for (f = Read(e, "uint32"), u = 0; u < f && e.len <= e.length; u++) {
|
|
h ? a[Read(e, "uint32")] = Read(e, c, void 0, n, l) : a[u] = Read(e, c, void 0, n, l);
|
|
}
|
|
}
|
|
else {
|
|
if ("{" !== b)
|
|
throw "Bad read type params: " + i;
|
|
var g = n[i];
|
|
g || (g = GetAttributes(GetMiddleString(i)), n[i] = g), a = {};
|
|
for (u = 0; u < g.length; u++) {
|
|
var v = g[u];
|
|
a[v.Key] = Read(e, v.Value, void 0, n, l);
|
|
}
|
|
}
|
|
}
|
|
return a;
|
|
};
|
|
|
|
function BufWriteByte(e) {
|
|
this[this.len] = e, this.len += 1;
|
|
};
|
|
|
|
function BufWrite(e, r, t) {
|
|
Write(this, e, r, t);
|
|
};
|
|
|
|
function BufRead(e, r) {
|
|
return Read(this, e, r);
|
|
};
|
|
|
|
function GetNewBuffer(e) {
|
|
var r = Buffer.alloc(e);
|
|
return r.Read = BufRead.bind(r), r.Write = BufWrite.bind(r), r.len = 0, r;
|
|
};
|
|
|
|
function GetReadBuffer(e) {
|
|
var r = Buffer.from(e);
|
|
return r.Read = BufRead.bind(r), r.Write = BufWrite.bind(r), r.len = 0, r;
|
|
};
|
|
|
|
function GetObjectFromBuffer(e, r, t, n) {
|
|
var l = Buffer.from(e);
|
|
return l.len = 0, Read(l, r, void 0, t, n);
|
|
};
|
|
|
|
function GetBufferFromObject(e, r, t?, n?, l?) {
|
|
var a = Buffer.alloc(t);
|
|
return a.len = 0, Write(a, e, r, void 0, n), l || (a = a.slice(0, a.len)), a;
|
|
};
|
|
|
|
function GetMiddleString(e) {
|
|
return e.substr(1, e.length - 2);
|
|
};
|
|
|
|
function GetMiddleString2(e, r, t) {
|
|
for (var n = 0, l = "", a = 0; a < e.length; a++) {
|
|
var i = e.substr(a, 1);
|
|
if (" " !== i && "\n" !== i && (i !== r || 1 != ++n)) {
|
|
if (i === t && 0 === --n)
|
|
break;
|
|
n && (l += i);
|
|
}
|
|
}
|
|
return l;
|
|
};
|
|
|
|
function GetAttributeStrings(e) {
|
|
for (var r = 0, t = [], n = "", l = 0; l < e.length; l++) {
|
|
var a = e.substr(l, 1);
|
|
if ("{" === a)
|
|
r++;
|
|
else
|
|
if ("}" === a)
|
|
r--;
|
|
else {
|
|
if ("," === a && 0 === r) {
|
|
0 < n.length && t.push(n), n = "";
|
|
continue;
|
|
}
|
|
if (" " === a || "\n" === a)
|
|
continue;
|
|
}
|
|
n += a;
|
|
}
|
|
return 0 < n.length && t.push(n), t;
|
|
};
|
|
|
|
function GetKeyValueStrings(e) {
|
|
for (var r = "", t = 0; t < e.length; t++) {
|
|
var n = e.substr(t, 1);
|
|
if (" " !== n && "\n" !== n) {
|
|
if (":" === n)
|
|
return { Key: r, Value: e.substr(t + 1) };
|
|
r += n;
|
|
}
|
|
}
|
|
throw "Error format Key:Value = " + e;
|
|
};
|
|
|
|
function GetAttributes(e) {
|
|
for (var r = [], t = GetAttributeStrings(e), n = 0; n < t.length; n++) {
|
|
var l = GetKeyValueStrings(t[n]);
|
|
r.push(l);
|
|
}
|
|
return r;
|
|
};
|
|
module.exports.GetNewBuffer = GetNewBuffer, module.exports.GetReadBuffer = GetReadBuffer, module.exports.alloc = GetNewBuffer,
|
|
module.exports.from = GetReadBuffer, module.exports.Write = Write, module.exports.Read = Read, module.exports.GetObjectFromBuffer = GetObjectFromBuffer,
|
|
module.exports.GetBufferFromObject = GetBufferFromObject;
|