harmony-erlpack 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/decode.d.ts +4 -0
- package/dist/decode.d.ts.map +1 -0
- package/dist/decode.js +108 -0
- package/dist/decode.js.map +1 -0
- package/dist/encode.d.ts +2 -0
- package/dist/encode.d.ts.map +1 -0
- package/dist/encode.js +175 -0
- package/dist/encode.js.map +1 -0
- package/dist/erltype.d.ts +15 -0
- package/dist/erltype.d.ts.map +1 -0
- package/dist/erltype.js +2 -0
- package/dist/erltype.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/test.js +57 -0
- package/dist/test.js.map +1 -0
- package/package.json +31 -0
- package/src/decode.ts +108 -0
- package/src/dump.bin +0 -0
- package/src/encode.ts +170 -0
- package/src/erltype.ts +14 -0
- package/src/index.ts +2 -0
- package/src/ready.ts +4099 -0
- package/src/test.ts +57 -0
- package/tsconfig.json +21 -0
package/README.md
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Harmony Erlpack
|
|
2
|
+
This is an implementation of erlpack for use within harmony, it is already faster than `@yukikaze-bot/erlpack` in tests of encoding large JSON objects, (many READY payloads were tested) in both encoding and decoding performance. This is not production ready yet, but it's pretty decent so far. Though I still want to make this faster if I can. This is also optimized for harmonies use cases, so it caches short strings for later re-use so it doesn't have to re-encode the utf16 to utf8 again and again.
|
|
3
|
+
|
|
4
|
+
## Goals
|
|
5
|
+
The goals are in this order:
|
|
6
|
+
- Discord Erlpack support
|
|
7
|
+
- Performance
|
|
8
|
+
- General Erlpack support
|
|
9
|
+
|
|
10
|
+
Which means if there's a feature that Erlpack has that discord does not use that would cost performance, we will not implement that, though I doubt that'll come into play here.
|
package/dist/decode.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.d.ts","sourceRoot":"","sources":["../src/decode.ts"],"names":[],"mappings":"AA+BA,wBAAgB,MAAM,CAAC,IAAI,EAAE,eAAe,EAAE,EAAC,MAAM,EAAC;;CAAc,iGA4EnE"}
|
package/dist/decode.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
class ByteReader {
|
|
2
|
+
buff;
|
|
3
|
+
view;
|
|
4
|
+
index = 0;
|
|
5
|
+
constructor(buff, { offset } = { offset: 0 }) {
|
|
6
|
+
this.view = new DataView(buff);
|
|
7
|
+
this.buff = buff;
|
|
8
|
+
this.index = offset;
|
|
9
|
+
}
|
|
10
|
+
readByte() {
|
|
11
|
+
return this.view.getUint8(this.index++);
|
|
12
|
+
}
|
|
13
|
+
readI32() {
|
|
14
|
+
const val = this.view.getInt32(this.index);
|
|
15
|
+
this.index += 4;
|
|
16
|
+
return val;
|
|
17
|
+
}
|
|
18
|
+
readDouble() {
|
|
19
|
+
const val = this.view.getFloat64(this.index);
|
|
20
|
+
this.index += 8;
|
|
21
|
+
return val;
|
|
22
|
+
}
|
|
23
|
+
readSub(len) {
|
|
24
|
+
const arr = new Uint8Array(this.buff, this.index, len);
|
|
25
|
+
this.index += len;
|
|
26
|
+
return arr;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const decoder = new TextDecoder();
|
|
30
|
+
export function unpack(buff, { offset } = { offset: 0 }) {
|
|
31
|
+
const reader = new ByteReader(buff, { offset });
|
|
32
|
+
const ver = reader.readByte();
|
|
33
|
+
function unpack() {
|
|
34
|
+
const type = reader.readByte();
|
|
35
|
+
switch (type) {
|
|
36
|
+
case 97 /* erlTypes.u8 */: {
|
|
37
|
+
return reader.readByte();
|
|
38
|
+
}
|
|
39
|
+
case 98 /* erlTypes.i32 */: {
|
|
40
|
+
return reader.readI32();
|
|
41
|
+
}
|
|
42
|
+
case 110 /* erlTypes.sbigint */: {
|
|
43
|
+
const len = reader.readByte();
|
|
44
|
+
const sign = reader.readByte();
|
|
45
|
+
const arr = reader.readSub(len);
|
|
46
|
+
let int = 0n;
|
|
47
|
+
for (let i = 0; i < arr.length; i++) {
|
|
48
|
+
int += BigInt(arr[i] ?? 0) << (BigInt(i) * 8n);
|
|
49
|
+
}
|
|
50
|
+
if (Number.isSafeInteger(int)) {
|
|
51
|
+
return Number(int) * (sign ? -1 : 1);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
return int * (sign ? -1n : 1n);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
case 70 /* erlTypes.double */: {
|
|
58
|
+
return reader.readDouble();
|
|
59
|
+
}
|
|
60
|
+
case 115 /* erlTypes.sAtom */: {
|
|
61
|
+
const len = reader.readByte();
|
|
62
|
+
const arr = reader.readSub(len);
|
|
63
|
+
const text = decoder.decode(arr);
|
|
64
|
+
switch (text) {
|
|
65
|
+
case "true":
|
|
66
|
+
return true;
|
|
67
|
+
case "false":
|
|
68
|
+
return false;
|
|
69
|
+
case "nil":
|
|
70
|
+
return undefined;
|
|
71
|
+
default:
|
|
72
|
+
throw new Error(text);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
case 109 /* erlTypes.bin */: {
|
|
76
|
+
const len = reader.readI32();
|
|
77
|
+
const arr = reader.readSub(len);
|
|
78
|
+
const str = decoder.decode(arr);
|
|
79
|
+
return str;
|
|
80
|
+
}
|
|
81
|
+
case 108 /* erlTypes.array */: {
|
|
82
|
+
const len = reader.readI32();
|
|
83
|
+
const arr = [];
|
|
84
|
+
for (let i = 0; i < len; i++) {
|
|
85
|
+
arr.push(unpack());
|
|
86
|
+
}
|
|
87
|
+
reader.readByte();
|
|
88
|
+
return arr;
|
|
89
|
+
}
|
|
90
|
+
case 116 /* erlTypes.object */: {
|
|
91
|
+
const len = reader.readI32();
|
|
92
|
+
const obj2 = {};
|
|
93
|
+
for (let i = 0; i < len; i++) {
|
|
94
|
+
obj2[unpack()] = unpack();
|
|
95
|
+
}
|
|
96
|
+
return obj2;
|
|
97
|
+
}
|
|
98
|
+
case 106 /* erlTypes.endList */: {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
default: {
|
|
102
|
+
throw new Error(`Unknown type:${type}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return unpack();
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=decode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.js","sourceRoot":"","sources":["../src/decode.ts"],"names":[],"mappings":"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"}
|
package/dist/encode.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../src/encode.ts"],"names":[],"mappings":"AA4DA,wBAAgB,IAAI,CAAC,GAAG,EAAE,OAAO,eA6GhC"}
|
package/dist/encode.js
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { version } from "./erltype.js";
|
|
2
|
+
class ByteLayer {
|
|
3
|
+
buffer = new ArrayBuffer(1 << 6);
|
|
4
|
+
view = new DataView(this.buffer);
|
|
5
|
+
index = 0;
|
|
6
|
+
getSpace(len) {
|
|
7
|
+
if (this.index + len >= this.buffer.byteLength) {
|
|
8
|
+
let llen = this.buffer.byteLength;
|
|
9
|
+
while (this.index + len >= llen)
|
|
10
|
+
llen *= 2;
|
|
11
|
+
this.buffer = this.buffer.transfer(llen);
|
|
12
|
+
this.view = new DataView(this.buffer);
|
|
13
|
+
}
|
|
14
|
+
const old = this.index;
|
|
15
|
+
this.index += len;
|
|
16
|
+
return old;
|
|
17
|
+
}
|
|
18
|
+
appendByte(num) {
|
|
19
|
+
const i = this.getSpace(1);
|
|
20
|
+
this.view.setInt8(i, num);
|
|
21
|
+
}
|
|
22
|
+
append32IntDelayed() {
|
|
23
|
+
const i = this.getSpace(4);
|
|
24
|
+
return (num) => {
|
|
25
|
+
this.view.setInt32(i, num);
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
append32Int(num) {
|
|
29
|
+
const i = this.getSpace(4);
|
|
30
|
+
this.view.setInt32(i, num);
|
|
31
|
+
}
|
|
32
|
+
append16Int(num) {
|
|
33
|
+
const i = this.getSpace(2);
|
|
34
|
+
this.view.setInt16(i, num);
|
|
35
|
+
}
|
|
36
|
+
appendDouble(num) {
|
|
37
|
+
const i = this.getSpace(8);
|
|
38
|
+
this.view.setFloat64(i, num);
|
|
39
|
+
}
|
|
40
|
+
getBuffer(len) {
|
|
41
|
+
const i = this.getSpace(len);
|
|
42
|
+
return {
|
|
43
|
+
buff: new Uint8Array(this.buffer, i),
|
|
44
|
+
ret: (num) => {
|
|
45
|
+
this.index -= num;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
appendBuffer(buf) {
|
|
50
|
+
const i = this.getSpace(buf.length);
|
|
51
|
+
//console.error(i, this.index, this.buffer.byteLength);
|
|
52
|
+
new Uint8Array(this.buffer).set(buf, i);
|
|
53
|
+
}
|
|
54
|
+
toBuffer() {
|
|
55
|
+
return this.buffer.transfer(this.index);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const encoder = new TextEncoder();
|
|
59
|
+
const preAtoms = new Map();
|
|
60
|
+
export function pack(obj) {
|
|
61
|
+
const layer = new ByteLayer();
|
|
62
|
+
const strMap = new Map();
|
|
63
|
+
function appendAtom(str) {
|
|
64
|
+
const buf = preAtoms.get(str) ?? encoder.encode(str);
|
|
65
|
+
if (!preAtoms.has(str))
|
|
66
|
+
preAtoms.set(str, buf);
|
|
67
|
+
layer.appendByte(115 /* erlTypes.sAtom */);
|
|
68
|
+
layer.appendByte(buf.length);
|
|
69
|
+
layer.appendBuffer(buf);
|
|
70
|
+
}
|
|
71
|
+
function layBigint(d) {
|
|
72
|
+
const bytes = [];
|
|
73
|
+
const sign = d < 0n;
|
|
74
|
+
d = sign ? d * -1n : d;
|
|
75
|
+
while (d > 0n) {
|
|
76
|
+
bytes.push(Number(d & 0xffn));
|
|
77
|
+
d >>= 8n;
|
|
78
|
+
}
|
|
79
|
+
if (bytes.length < 255) {
|
|
80
|
+
layer.appendByte(110 /* erlTypes.sbigint */);
|
|
81
|
+
layer.appendByte(bytes.length);
|
|
82
|
+
layer.appendByte(+sign);
|
|
83
|
+
layer.appendBuffer(bytes);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
layer.appendByte(version);
|
|
87
|
+
function packObj(obj) {
|
|
88
|
+
switch (typeof obj) {
|
|
89
|
+
case "number": {
|
|
90
|
+
if (Number.isInteger(obj) && obj < 2 ** 32 && obj >= -(2 ** 31)) {
|
|
91
|
+
if (obj > 0 && obj < 256) {
|
|
92
|
+
layer.appendByte(97 /* erlTypes.u8 */);
|
|
93
|
+
layer.appendByte(obj);
|
|
94
|
+
}
|
|
95
|
+
else if (obj < 2 ** 31 && obj >= -(2 ** 31)) {
|
|
96
|
+
layer.appendByte(98 /* erlTypes.i32 */);
|
|
97
|
+
layer.append32Int(obj);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
layBigint(BigInt(obj));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
layer.appendByte(70 /* erlTypes.double */);
|
|
105
|
+
layer.appendDouble(obj);
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
case "undefined": {
|
|
110
|
+
appendAtom("nil");
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case "boolean": {
|
|
114
|
+
appendAtom(obj + "");
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case "string": {
|
|
118
|
+
if (obj.length < 100) {
|
|
119
|
+
const buf = strMap.get(obj) ?? encoder.encode(obj);
|
|
120
|
+
strMap.set(obj, buf);
|
|
121
|
+
layer.appendByte(109 /* erlTypes.bin */);
|
|
122
|
+
layer.append32Int(buf.length);
|
|
123
|
+
layer.appendBuffer(buf);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
layer.appendByte(109 /* erlTypes.bin */);
|
|
127
|
+
const len = layer.append32IntDelayed();
|
|
128
|
+
const size = obj.length * 3;
|
|
129
|
+
const { buff, ret } = layer.getBuffer(size);
|
|
130
|
+
const { written } = encoder.encodeInto(obj, buff);
|
|
131
|
+
ret(size - written);
|
|
132
|
+
len(written);
|
|
133
|
+
}
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
case "object": {
|
|
137
|
+
if (obj instanceof Array) {
|
|
138
|
+
layer.appendByte(108 /* erlTypes.array */);
|
|
139
|
+
layer.append32Int(obj.length);
|
|
140
|
+
for (const item of obj) {
|
|
141
|
+
packObj(item);
|
|
142
|
+
}
|
|
143
|
+
//Leaving this off will make @yukikaze-bot/erlpack segfault
|
|
144
|
+
layer.appendByte(106 /* erlTypes.endList */);
|
|
145
|
+
}
|
|
146
|
+
else if (obj === null) {
|
|
147
|
+
appendAtom("nil");
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
layer.appendByte(116 /* erlTypes.object */);
|
|
151
|
+
const pairs = Object.entries(obj);
|
|
152
|
+
layer.append32Int(pairs.length);
|
|
153
|
+
for (const [key, value] of pairs) {
|
|
154
|
+
if (typeof value === "function" || typeof value === "symbol")
|
|
155
|
+
continue;
|
|
156
|
+
packObj(key);
|
|
157
|
+
packObj(value);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
case "bigint": {
|
|
163
|
+
layBigint(obj);
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
default: {
|
|
167
|
+
const type = typeof obj;
|
|
168
|
+
throw new Error(`unsupported type: ${type}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
packObj(obj);
|
|
173
|
+
return layer.toBuffer();
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=encode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.js","sourceRoot":"","sources":["../src/encode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const version = 131;
|
|
2
|
+
export declare const enum erlTypes {
|
|
3
|
+
u8 = 97,
|
|
4
|
+
sAtom = 115,
|
|
5
|
+
i32 = 98,
|
|
6
|
+
double = 70,
|
|
7
|
+
sbigint = 110,
|
|
8
|
+
lbigint = 111,
|
|
9
|
+
string16 = 107,
|
|
10
|
+
bin = 109,
|
|
11
|
+
array = 108,
|
|
12
|
+
endList = 106,
|
|
13
|
+
object = 116
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=erltype.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erltype.d.ts","sourceRoot":"","sources":["../src/erltype.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,MAAM,CAAC;AAC3B,0BAAkB,QAAQ;IACzB,EAAE,KAAK;IACP,KAAK,MAAM;IACX,GAAG,KAAK;IACR,MAAM,KAAK;IACX,OAAO,MAAM;IACb,OAAO,MAAM;IACb,QAAQ,MAAM;IACd,GAAG,MAAM;IACT,KAAK,MAAM;IACX,OAAO,MAAM;IACb,MAAM,MAAM;CACZ"}
|
package/dist/erltype.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erltype.js","sourceRoot":"","sources":["../src/erltype.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
package/dist/test.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { pack, unpack } from "./index.js";
|
|
2
|
+
import { ready } from "./ready.js";
|
|
3
|
+
const bad = await import("@yukikaze-bot/erlpack");
|
|
4
|
+
const assert = await import("assert");
|
|
5
|
+
const testPack = (m, testWithErl = true) => {
|
|
6
|
+
const arr = new Uint8Array(pack(m));
|
|
7
|
+
if (testWithErl) {
|
|
8
|
+
try {
|
|
9
|
+
const after = bad.unpack(arr);
|
|
10
|
+
assert.deepEqual(after, m);
|
|
11
|
+
}
|
|
12
|
+
catch { }
|
|
13
|
+
}
|
|
14
|
+
{
|
|
15
|
+
const after = unpack(arr.buffer);
|
|
16
|
+
assert.deepEqual(after, m);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
testPack(1);
|
|
20
|
+
testPack(4);
|
|
21
|
+
testPack(4000);
|
|
22
|
+
testPack(-4000);
|
|
23
|
+
testPack(2 ** 32 - 1);
|
|
24
|
+
testPack(1.1);
|
|
25
|
+
testPack(undefined);
|
|
26
|
+
testPack(true);
|
|
27
|
+
testPack(false);
|
|
28
|
+
testPack("short string");
|
|
29
|
+
testPack([1, 2, 3, [], 2]);
|
|
30
|
+
testPack({ a: 1 });
|
|
31
|
+
testPack(2n ** 200n, false);
|
|
32
|
+
testPack(-1n, false);
|
|
33
|
+
testPack(1n, false);
|
|
34
|
+
const obj = ready;
|
|
35
|
+
console.time("new packer");
|
|
36
|
+
for (let i = 0; i < 100; i++) {
|
|
37
|
+
pack(obj);
|
|
38
|
+
}
|
|
39
|
+
console.timeEnd("new packer");
|
|
40
|
+
console.time("old packer");
|
|
41
|
+
for (let i = 0; i < 100; i++) {
|
|
42
|
+
bad.pack(obj);
|
|
43
|
+
}
|
|
44
|
+
console.timeEnd("old packer");
|
|
45
|
+
console.time("new unpacker");
|
|
46
|
+
const u = pack(obj);
|
|
47
|
+
for (let i = 0; i < 100; i++) {
|
|
48
|
+
unpack(u);
|
|
49
|
+
}
|
|
50
|
+
console.timeEnd("new unpacker");
|
|
51
|
+
const b = new Uint8Array(u);
|
|
52
|
+
console.time("old unpacker");
|
|
53
|
+
for (let i = 0; i < 100; i++) {
|
|
54
|
+
bad.unpack(b);
|
|
55
|
+
}
|
|
56
|
+
console.timeEnd("old unpacker");
|
|
57
|
+
//# sourceMappingURL=test.js.map
|
package/dist/test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "harmony-erlpack",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "An erlpack implementation in pure TS",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"erlpack"
|
|
7
|
+
],
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "ssh://git@codeberg.org/MelodyChat/erlpack.git"
|
|
11
|
+
},
|
|
12
|
+
"license": "AGPL-3.0",
|
|
13
|
+
"author": "Mathium05",
|
|
14
|
+
"type": "module",
|
|
15
|
+
"main": "dist/index.js",
|
|
16
|
+
"scripts": {
|
|
17
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@types/node": "^25.6.0",
|
|
21
|
+
"@yukikaze-bot/erlpack": "^1.0.1",
|
|
22
|
+
"prettier": "^3.8.3",
|
|
23
|
+
"typescript": "^6.0.3"
|
|
24
|
+
},
|
|
25
|
+
"prettier": {
|
|
26
|
+
"useTabs": true,
|
|
27
|
+
"printWidth": 100,
|
|
28
|
+
"semi": true,
|
|
29
|
+
"bracketSpacing": false
|
|
30
|
+
}
|
|
31
|
+
}
|
package/src/decode.ts
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import {erlTypes} from "./erltype.js";
|
|
2
|
+
|
|
3
|
+
class ByteReader {
|
|
4
|
+
private buff: ArrayBufferLike;
|
|
5
|
+
private view: DataView;
|
|
6
|
+
private index = 0;
|
|
7
|
+
constructor(buff: ArrayBufferLike, {offset} = {offset: 0}) {
|
|
8
|
+
this.view = new DataView(buff);
|
|
9
|
+
this.buff = buff;
|
|
10
|
+
this.index = offset;
|
|
11
|
+
}
|
|
12
|
+
readByte() {
|
|
13
|
+
return this.view.getUint8(this.index++);
|
|
14
|
+
}
|
|
15
|
+
readI32() {
|
|
16
|
+
const val = this.view.getInt32(this.index);
|
|
17
|
+
this.index += 4;
|
|
18
|
+
return val;
|
|
19
|
+
}
|
|
20
|
+
readDouble() {
|
|
21
|
+
const val = this.view.getFloat64(this.index);
|
|
22
|
+
this.index += 8;
|
|
23
|
+
return val;
|
|
24
|
+
}
|
|
25
|
+
readSub(len: number) {
|
|
26
|
+
const arr = new Uint8Array(this.buff, this.index, len);
|
|
27
|
+
this.index += len;
|
|
28
|
+
return arr;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const decoder = new TextDecoder();
|
|
32
|
+
export function unpack(buff: ArrayBufferLike, {offset} = {offset: 0}) {
|
|
33
|
+
const reader = new ByteReader(buff, {offset});
|
|
34
|
+
const ver = reader.readByte();
|
|
35
|
+
function unpack() {
|
|
36
|
+
const type = reader.readByte();
|
|
37
|
+
switch (type) {
|
|
38
|
+
case erlTypes.u8: {
|
|
39
|
+
return reader.readByte();
|
|
40
|
+
}
|
|
41
|
+
case erlTypes.i32: {
|
|
42
|
+
return reader.readI32();
|
|
43
|
+
}
|
|
44
|
+
case erlTypes.sbigint: {
|
|
45
|
+
const len = reader.readByte();
|
|
46
|
+
const sign = reader.readByte();
|
|
47
|
+
const arr = reader.readSub(len);
|
|
48
|
+
let int = 0n;
|
|
49
|
+
for (let i = 0; i < arr.length; i++) {
|
|
50
|
+
int += BigInt(arr[i] ?? 0) << (BigInt(i) * 8n);
|
|
51
|
+
}
|
|
52
|
+
if (Number.isSafeInteger(int)) {
|
|
53
|
+
return Number(int) * (sign ? -1 : 1);
|
|
54
|
+
} else {
|
|
55
|
+
return int * (sign ? -1n : 1n);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
case erlTypes.double: {
|
|
59
|
+
return reader.readDouble();
|
|
60
|
+
}
|
|
61
|
+
case erlTypes.sAtom: {
|
|
62
|
+
const len = reader.readByte();
|
|
63
|
+
const arr = reader.readSub(len);
|
|
64
|
+
const text = decoder.decode(arr);
|
|
65
|
+
switch (text) {
|
|
66
|
+
case "true":
|
|
67
|
+
return true;
|
|
68
|
+
case "false":
|
|
69
|
+
return false;
|
|
70
|
+
case "nil":
|
|
71
|
+
return undefined;
|
|
72
|
+
default:
|
|
73
|
+
throw new Error(text);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
case erlTypes.bin: {
|
|
77
|
+
const len = reader.readI32();
|
|
78
|
+
const arr = reader.readSub(len);
|
|
79
|
+
const str = decoder.decode(arr);
|
|
80
|
+
return str;
|
|
81
|
+
}
|
|
82
|
+
case erlTypes.array: {
|
|
83
|
+
const len = reader.readI32();
|
|
84
|
+
const arr = [] as unknown[];
|
|
85
|
+
for (let i = 0; i < len; i++) {
|
|
86
|
+
arr.push(unpack());
|
|
87
|
+
}
|
|
88
|
+
reader.readByte();
|
|
89
|
+
return arr;
|
|
90
|
+
}
|
|
91
|
+
case erlTypes.object: {
|
|
92
|
+
const len = reader.readI32();
|
|
93
|
+
const obj2 = {} as Record<string | number, unknown>;
|
|
94
|
+
for (let i = 0; i < len; i++) {
|
|
95
|
+
obj2[unpack() as string | number] = unpack();
|
|
96
|
+
}
|
|
97
|
+
return obj2;
|
|
98
|
+
}
|
|
99
|
+
case erlTypes.endList: {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
default: {
|
|
103
|
+
throw new Error(`Unknown type:${type}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return unpack();
|
|
108
|
+
}
|
package/src/dump.bin
ADDED
|
Binary file
|