bin-serde 1.4.2 → 1.5.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/.prettierrc +9 -0
- package/index.ts +102 -93
- package/lib/index.d.ts +9 -6
- package/lib/index.js +77 -67
- package/package.json +1 -1
package/.prettierrc
ADDED
package/index.ts
CHANGED
|
@@ -3,118 +3,101 @@ import utf8Size from "utf8-buffer-size";
|
|
|
3
3
|
|
|
4
4
|
export class Writer {
|
|
5
5
|
private pos = 0;
|
|
6
|
-
private view: DataView;
|
|
7
6
|
private bytes: Uint8Array;
|
|
7
|
+
private _view: DataView | null = null;
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
this.
|
|
11
|
-
this.bytes = new Uint8Array(this.view.buffer);
|
|
9
|
+
constructor(initialSize = 256) {
|
|
10
|
+
this.bytes = new Uint8Array(Math.max(initialSize, 16));
|
|
12
11
|
}
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
writeUInt8(val: number) {
|
|
15
14
|
this.ensureSize(1);
|
|
16
|
-
this.
|
|
17
|
-
this.pos += 1;
|
|
15
|
+
this.bytes[this.pos++] = val;
|
|
18
16
|
return this;
|
|
19
17
|
}
|
|
20
18
|
|
|
21
|
-
|
|
22
|
-
this.ensureSize(
|
|
23
|
-
this.view.
|
|
24
|
-
this.pos +=
|
|
19
|
+
writeUInt16(val: number) {
|
|
20
|
+
this.ensureSize(2);
|
|
21
|
+
this.view.setUint16(this.pos, val);
|
|
22
|
+
this.pos += 2;
|
|
25
23
|
return this;
|
|
26
24
|
}
|
|
27
25
|
|
|
28
|
-
|
|
29
|
-
this.ensureSize(
|
|
30
|
-
this.view.
|
|
31
|
-
this.pos +=
|
|
26
|
+
writeUInt32(val: number) {
|
|
27
|
+
this.ensureSize(4);
|
|
28
|
+
this.view.setUint32(this.pos, val);
|
|
29
|
+
this.pos += 4;
|
|
32
30
|
return this;
|
|
33
31
|
}
|
|
34
32
|
|
|
35
|
-
|
|
33
|
+
writeUVarint(val: number) {
|
|
36
34
|
if (val < 0x80) {
|
|
37
|
-
this.
|
|
38
|
-
this.view.setUint8(this.pos, val);
|
|
39
|
-
this.pos += 1;
|
|
35
|
+
this.writeUInt8(val);
|
|
40
36
|
} else if (val < 0x4000) {
|
|
41
|
-
this.
|
|
42
|
-
this.view.setUint16(this.pos, (val & 0x7f) | ((val & 0x3f80) << 1) | 0x8000);
|
|
43
|
-
this.pos += 2;
|
|
37
|
+
this.writeUInt16((val & 0x7f) | ((val & 0x3f80) << 1) | 0x8000);
|
|
44
38
|
} else if (val < 0x200000) {
|
|
45
|
-
this.
|
|
46
|
-
this.
|
|
47
|
-
this.view.setUint16(this.pos + 1, (val & 0x7f) | ((val & 0x3f80) << 1) | 0x8000);
|
|
48
|
-
this.pos += 3;
|
|
39
|
+
this.writeUInt8((val >> 14) | 0x80);
|
|
40
|
+
this.writeUInt16((val & 0x7f) | ((val & 0x3f80) << 1) | 0x8000);
|
|
49
41
|
} else if (val < 0x10000000) {
|
|
50
|
-
this.
|
|
51
|
-
this.view.setUint32(
|
|
52
|
-
this.pos,
|
|
42
|
+
this.writeUInt32(
|
|
53
43
|
(val & 0x7f) | ((val & 0x3f80) << 1) | ((val & 0x1fc000) << 2) | ((val & 0xfe00000) << 3) | 0x80808000
|
|
54
44
|
);
|
|
55
|
-
this.pos += 4;
|
|
56
45
|
} else if (val < 0x800000000) {
|
|
57
|
-
this.
|
|
58
|
-
this.
|
|
59
|
-
this.view.setUint32(
|
|
60
|
-
this.pos + 1,
|
|
46
|
+
this.writeUInt8(Math.floor(val / 0x10000000) | 0x80);
|
|
47
|
+
this.writeUInt32(
|
|
61
48
|
(val & 0x7f) | ((val & 0x3f80) << 1) | ((val & 0x1fc000) << 2) | ((val & 0xfe00000) << 3) | 0x80808000
|
|
62
49
|
);
|
|
63
|
-
this.pos += 5;
|
|
64
50
|
} else if (val < 0x40000000000) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
this.
|
|
68
|
-
this.view.setUint32(
|
|
69
|
-
this.pos + 2,
|
|
51
|
+
const shiftedVal = Math.floor(val / 0x10000000);
|
|
52
|
+
this.writeUInt16((shiftedVal & 0x7f) | ((shiftedVal & 0x3f80) << 1) | 0x8080);
|
|
53
|
+
this.writeUInt32(
|
|
70
54
|
(val & 0x7f) | ((val & 0x3f80) << 1) | ((val & 0x1fc000) << 2) | ((val & 0xfe00000) << 3) | 0x80808000
|
|
71
55
|
);
|
|
72
|
-
this.pos += 6;
|
|
73
56
|
} else {
|
|
74
57
|
throw new Error("Value out of range");
|
|
75
58
|
}
|
|
76
59
|
return this;
|
|
77
60
|
}
|
|
78
61
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
this.writeUVarint(Number((bigval >> 63n) ^ (bigval << 1n)));
|
|
62
|
+
writeVarint(val: number) {
|
|
63
|
+
this.writeUVarint((val << 1) ^ (val >> 31));
|
|
82
64
|
return this;
|
|
83
65
|
}
|
|
84
66
|
|
|
85
|
-
|
|
67
|
+
writeFloat(val: number) {
|
|
86
68
|
this.ensureSize(4);
|
|
87
69
|
this.view.setFloat32(this.pos, val, true);
|
|
88
70
|
this.pos += 4;
|
|
89
71
|
return this;
|
|
90
72
|
}
|
|
91
73
|
|
|
92
|
-
|
|
74
|
+
writeBits(bits: boolean[]) {
|
|
75
|
+
const numBytes = Math.ceil(bits.length / 8);
|
|
76
|
+
this.ensureSize(numBytes);
|
|
93
77
|
for (let i = 0; i < bits.length; i += 8) {
|
|
94
78
|
let byte = 0;
|
|
95
|
-
for (let j = 0; j < 8; j++) {
|
|
96
|
-
if (i + j
|
|
97
|
-
|
|
79
|
+
for (let j = 0; j < 8 && i + j < bits.length; j++) {
|
|
80
|
+
if (bits[i + j]) {
|
|
81
|
+
byte |= 1 << j;
|
|
98
82
|
}
|
|
99
|
-
byte |= (bits[i + j] ? 1 : 0) << j;
|
|
100
83
|
}
|
|
101
|
-
this.
|
|
84
|
+
this.bytes[this.pos++] = byte;
|
|
102
85
|
}
|
|
103
86
|
return this;
|
|
104
87
|
}
|
|
105
88
|
|
|
106
|
-
|
|
89
|
+
writeStringAscii(val: string) {
|
|
107
90
|
if (val.length === 0) {
|
|
108
91
|
return this;
|
|
109
92
|
}
|
|
110
93
|
this.ensureSize(val.length);
|
|
111
94
|
for (let i = 0; i < val.length; i++) {
|
|
112
|
-
this.
|
|
95
|
+
this.bytes[this.pos++] = val.charCodeAt(i);
|
|
113
96
|
}
|
|
114
97
|
return this;
|
|
115
98
|
}
|
|
116
99
|
|
|
117
|
-
|
|
100
|
+
writeStringUtf8(val: string, len?: number) {
|
|
118
101
|
if (len != null) {
|
|
119
102
|
if (len === 0) {
|
|
120
103
|
return this;
|
|
@@ -136,60 +119,87 @@ export class Writer {
|
|
|
136
119
|
return this;
|
|
137
120
|
}
|
|
138
121
|
|
|
139
|
-
|
|
122
|
+
writeBuffer(buf: Uint8Array) {
|
|
140
123
|
this.ensureSize(buf.length);
|
|
141
124
|
this.bytes.set(buf, this.pos);
|
|
142
125
|
this.pos += buf.length;
|
|
143
126
|
return this;
|
|
144
127
|
}
|
|
145
128
|
|
|
146
|
-
|
|
129
|
+
concat(other: Writer) {
|
|
130
|
+
const otherLen = other.pos;
|
|
131
|
+
this.ensureSize(otherLen);
|
|
132
|
+
if (otherLen < 64) {
|
|
133
|
+
for (let i = 0; i < otherLen; i++) {
|
|
134
|
+
this.bytes[this.pos++] = other.bytes[i];
|
|
135
|
+
}
|
|
136
|
+
} else {
|
|
137
|
+
this.bytes.set(other.bytes.subarray(0, otherLen), this.pos);
|
|
138
|
+
this.pos += otherLen;
|
|
139
|
+
}
|
|
140
|
+
return this;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
toBuffer() {
|
|
147
144
|
return this.bytes.subarray(0, this.pos);
|
|
148
145
|
}
|
|
149
146
|
|
|
147
|
+
get size(): number {
|
|
148
|
+
return this.pos;
|
|
149
|
+
}
|
|
150
|
+
|
|
150
151
|
private ensureSize(size: number) {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
152
|
+
if (this.bytes.length >= this.pos + size) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
let newSize = this.bytes.length * 2;
|
|
156
|
+
while (newSize < this.pos + size) {
|
|
157
|
+
newSize *= 2;
|
|
157
158
|
}
|
|
159
|
+
const newBytes = new Uint8Array(newSize);
|
|
160
|
+
newBytes.set(this.bytes);
|
|
161
|
+
this.bytes = newBytes;
|
|
162
|
+
this._view = null;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
private get view(): DataView {
|
|
166
|
+
if (!this._view) {
|
|
167
|
+
this._view = new DataView(this.bytes.buffer);
|
|
168
|
+
}
|
|
169
|
+
return this._view;
|
|
158
170
|
}
|
|
159
171
|
}
|
|
160
172
|
|
|
161
173
|
export class Reader {
|
|
162
174
|
private pos = 0;
|
|
163
|
-
private view: DataView;
|
|
164
175
|
private bytes: Uint8Array;
|
|
176
|
+
private view: DataView;
|
|
165
177
|
|
|
166
|
-
|
|
178
|
+
constructor(buf: Uint8Array) {
|
|
179
|
+
this.bytes = buf;
|
|
167
180
|
this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
168
|
-
this.bytes = new Uint8Array(this.view.buffer, buf.byteOffset, buf.byteLength);
|
|
169
181
|
}
|
|
170
182
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
this.pos += 1;
|
|
174
|
-
return val;
|
|
183
|
+
readUInt8() {
|
|
184
|
+
return this.bytes[this.pos++];
|
|
175
185
|
}
|
|
176
186
|
|
|
177
|
-
|
|
178
|
-
const val = this.view.
|
|
179
|
-
this.pos +=
|
|
187
|
+
readUInt16() {
|
|
188
|
+
const val = this.view.getUint16(this.pos);
|
|
189
|
+
this.pos += 2;
|
|
180
190
|
return val;
|
|
181
191
|
}
|
|
182
192
|
|
|
183
|
-
|
|
184
|
-
const val = this.view.
|
|
185
|
-
this.pos +=
|
|
193
|
+
readUInt32() {
|
|
194
|
+
const val = this.view.getUint32(this.pos);
|
|
195
|
+
this.pos += 4;
|
|
186
196
|
return val;
|
|
187
197
|
}
|
|
188
198
|
|
|
189
|
-
|
|
199
|
+
readUVarint() {
|
|
190
200
|
let val = 0;
|
|
191
201
|
while (true) {
|
|
192
|
-
|
|
202
|
+
const byte = this.readUInt8();
|
|
193
203
|
if (byte < 0x80) {
|
|
194
204
|
return val + byte;
|
|
195
205
|
}
|
|
@@ -197,42 +207,41 @@ export class Reader {
|
|
|
197
207
|
}
|
|
198
208
|
}
|
|
199
209
|
|
|
200
|
-
|
|
201
|
-
const val =
|
|
202
|
-
return
|
|
210
|
+
readVarint() {
|
|
211
|
+
const val = this.readUVarint();
|
|
212
|
+
return (val >>> 1) ^ -(val & 1);
|
|
203
213
|
}
|
|
204
214
|
|
|
205
|
-
|
|
215
|
+
readFloat() {
|
|
206
216
|
const val = this.view.getFloat32(this.pos, true);
|
|
207
217
|
this.pos += 4;
|
|
208
218
|
return val;
|
|
209
219
|
}
|
|
210
220
|
|
|
211
|
-
|
|
221
|
+
readBits(numBits: number) {
|
|
212
222
|
const numBytes = Math.ceil(numBits / 8);
|
|
213
|
-
const bytes = this.bytes.slice(this.pos, this.pos + numBytes);
|
|
214
223
|
const bits: boolean[] = [];
|
|
215
|
-
for (
|
|
216
|
-
|
|
217
|
-
|
|
224
|
+
for (let i = 0; i < numBytes; i++) {
|
|
225
|
+
const byte = this.readUInt8();
|
|
226
|
+
for (let j = 0; j < 8 && bits.length < numBits; j++) {
|
|
227
|
+
bits.push(((byte >> j) & 1) === 1);
|
|
218
228
|
}
|
|
219
229
|
}
|
|
220
|
-
this.pos += numBytes;
|
|
221
230
|
return bits;
|
|
222
231
|
}
|
|
223
232
|
|
|
224
|
-
|
|
233
|
+
readStringAscii(len: number) {
|
|
225
234
|
if (len === 0) {
|
|
226
235
|
return "";
|
|
227
236
|
}
|
|
228
237
|
let val = "";
|
|
229
238
|
for (let i = 0; i < len; i++) {
|
|
230
|
-
val += String.fromCharCode(this.
|
|
239
|
+
val += String.fromCharCode(this.readUInt8());
|
|
231
240
|
}
|
|
232
241
|
return val;
|
|
233
242
|
}
|
|
234
243
|
|
|
235
|
-
|
|
244
|
+
readStringUtf8(len?: number) {
|
|
236
245
|
if (len == null) {
|
|
237
246
|
len = this.readUVarint();
|
|
238
247
|
}
|
|
@@ -244,13 +253,13 @@ export class Reader {
|
|
|
244
253
|
return val;
|
|
245
254
|
}
|
|
246
255
|
|
|
247
|
-
|
|
256
|
+
readBuffer(numBytes: number) {
|
|
248
257
|
const bytes = this.bytes.slice(this.pos, this.pos + numBytes);
|
|
249
258
|
this.pos += numBytes;
|
|
250
259
|
return bytes;
|
|
251
260
|
}
|
|
252
261
|
|
|
253
|
-
|
|
254
|
-
return this.
|
|
262
|
+
remaining() {
|
|
263
|
+
return this.bytes.length - this.pos;
|
|
255
264
|
}
|
|
256
265
|
}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export declare class Writer {
|
|
2
2
|
private pos;
|
|
3
|
-
private view;
|
|
4
3
|
private bytes;
|
|
5
|
-
|
|
4
|
+
private _view;
|
|
5
|
+
constructor(initialSize?: number);
|
|
6
6
|
writeUInt8(val: number): this;
|
|
7
|
+
writeUInt16(val: number): this;
|
|
7
8
|
writeUInt32(val: number): this;
|
|
8
|
-
writeUInt64(val: bigint): this;
|
|
9
9
|
writeUVarint(val: number): this;
|
|
10
10
|
writeVarint(val: number): this;
|
|
11
11
|
writeFloat(val: number): this;
|
|
@@ -13,17 +13,20 @@ export declare class Writer {
|
|
|
13
13
|
writeStringAscii(val: string): this;
|
|
14
14
|
writeStringUtf8(val: string, len?: number): this;
|
|
15
15
|
writeBuffer(buf: Uint8Array): this;
|
|
16
|
+
concat(other: Writer): this;
|
|
16
17
|
toBuffer(): Uint8Array;
|
|
18
|
+
get size(): number;
|
|
17
19
|
private ensureSize;
|
|
20
|
+
private get view();
|
|
18
21
|
}
|
|
19
22
|
export declare class Reader {
|
|
20
23
|
private pos;
|
|
21
|
-
private view;
|
|
22
24
|
private bytes;
|
|
23
|
-
|
|
25
|
+
private view;
|
|
26
|
+
constructor(buf: Uint8Array);
|
|
24
27
|
readUInt8(): number;
|
|
28
|
+
readUInt16(): number;
|
|
25
29
|
readUInt32(): number;
|
|
26
|
-
readUInt64(): bigint;
|
|
27
30
|
readUVarint(): number;
|
|
28
31
|
readVarint(): number;
|
|
29
32
|
readFloat(): number;
|
package/lib/index.js
CHANGED
|
@@ -2,16 +2,20 @@ import { pack, unpack } from "./utf8-buffer.js";
|
|
|
2
2
|
import utf8Size from "utf8-buffer-size";
|
|
3
3
|
export class Writer {
|
|
4
4
|
pos = 0;
|
|
5
|
-
view;
|
|
6
5
|
bytes;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
this.bytes = new Uint8Array(
|
|
6
|
+
_view = null;
|
|
7
|
+
constructor(initialSize = 256) {
|
|
8
|
+
this.bytes = new Uint8Array(Math.max(initialSize, 16));
|
|
10
9
|
}
|
|
11
10
|
writeUInt8(val) {
|
|
12
11
|
this.ensureSize(1);
|
|
13
|
-
this.
|
|
14
|
-
this
|
|
12
|
+
this.bytes[this.pos++] = val;
|
|
13
|
+
return this;
|
|
14
|
+
}
|
|
15
|
+
writeUInt16(val) {
|
|
16
|
+
this.ensureSize(2);
|
|
17
|
+
this.view.setUint16(this.pos, val);
|
|
18
|
+
this.pos += 2;
|
|
15
19
|
return this;
|
|
16
20
|
}
|
|
17
21
|
writeUInt32(val) {
|
|
@@ -20,46 +24,28 @@ export class Writer {
|
|
|
20
24
|
this.pos += 4;
|
|
21
25
|
return this;
|
|
22
26
|
}
|
|
23
|
-
writeUInt64(val) {
|
|
24
|
-
this.ensureSize(8);
|
|
25
|
-
this.view.setBigUint64(this.pos, val);
|
|
26
|
-
this.pos += 8;
|
|
27
|
-
return this;
|
|
28
|
-
}
|
|
29
27
|
writeUVarint(val) {
|
|
30
28
|
if (val < 0x80) {
|
|
31
|
-
this.
|
|
32
|
-
this.view.setUint8(this.pos, val);
|
|
33
|
-
this.pos += 1;
|
|
29
|
+
this.writeUInt8(val);
|
|
34
30
|
}
|
|
35
31
|
else if (val < 0x4000) {
|
|
36
|
-
this.
|
|
37
|
-
this.view.setUint16(this.pos, (val & 0x7f) | ((val & 0x3f80) << 1) | 0x8000);
|
|
38
|
-
this.pos += 2;
|
|
32
|
+
this.writeUInt16((val & 0x7f) | ((val & 0x3f80) << 1) | 0x8000);
|
|
39
33
|
}
|
|
40
34
|
else if (val < 0x200000) {
|
|
41
|
-
this.
|
|
42
|
-
this.
|
|
43
|
-
this.view.setUint16(this.pos + 1, (val & 0x7f) | ((val & 0x3f80) << 1) | 0x8000);
|
|
44
|
-
this.pos += 3;
|
|
35
|
+
this.writeUInt8((val >> 14) | 0x80);
|
|
36
|
+
this.writeUInt16((val & 0x7f) | ((val & 0x3f80) << 1) | 0x8000);
|
|
45
37
|
}
|
|
46
38
|
else if (val < 0x10000000) {
|
|
47
|
-
this.
|
|
48
|
-
this.view.setUint32(this.pos, (val & 0x7f) | ((val & 0x3f80) << 1) | ((val & 0x1fc000) << 2) | ((val & 0xfe00000) << 3) | 0x80808000);
|
|
49
|
-
this.pos += 4;
|
|
39
|
+
this.writeUInt32((val & 0x7f) | ((val & 0x3f80) << 1) | ((val & 0x1fc000) << 2) | ((val & 0xfe00000) << 3) | 0x80808000);
|
|
50
40
|
}
|
|
51
41
|
else if (val < 0x800000000) {
|
|
52
|
-
this.
|
|
53
|
-
this.
|
|
54
|
-
this.view.setUint32(this.pos + 1, (val & 0x7f) | ((val & 0x3f80) << 1) | ((val & 0x1fc000) << 2) | ((val & 0xfe00000) << 3) | 0x80808000);
|
|
55
|
-
this.pos += 5;
|
|
42
|
+
this.writeUInt8(Math.floor(val / 0x10000000) | 0x80);
|
|
43
|
+
this.writeUInt32((val & 0x7f) | ((val & 0x3f80) << 1) | ((val & 0x1fc000) << 2) | ((val & 0xfe00000) << 3) | 0x80808000);
|
|
56
44
|
}
|
|
57
45
|
else if (val < 0x40000000000) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
this.
|
|
61
|
-
this.view.setUint32(this.pos + 2, (val & 0x7f) | ((val & 0x3f80) << 1) | ((val & 0x1fc000) << 2) | ((val & 0xfe00000) << 3) | 0x80808000);
|
|
62
|
-
this.pos += 6;
|
|
46
|
+
const shiftedVal = Math.floor(val / 0x10000000);
|
|
47
|
+
this.writeUInt16((shiftedVal & 0x7f) | ((shiftedVal & 0x3f80) << 1) | 0x8080);
|
|
48
|
+
this.writeUInt32((val & 0x7f) | ((val & 0x3f80) << 1) | ((val & 0x1fc000) << 2) | ((val & 0xfe00000) << 3) | 0x80808000);
|
|
63
49
|
}
|
|
64
50
|
else {
|
|
65
51
|
throw new Error("Value out of range");
|
|
@@ -67,8 +53,7 @@ export class Writer {
|
|
|
67
53
|
return this;
|
|
68
54
|
}
|
|
69
55
|
writeVarint(val) {
|
|
70
|
-
|
|
71
|
-
this.writeUVarint(Number((bigval >> 63n) ^ (bigval << 1n)));
|
|
56
|
+
this.writeUVarint((val << 1) ^ (val >> 31));
|
|
72
57
|
return this;
|
|
73
58
|
}
|
|
74
59
|
writeFloat(val) {
|
|
@@ -78,15 +63,16 @@ export class Writer {
|
|
|
78
63
|
return this;
|
|
79
64
|
}
|
|
80
65
|
writeBits(bits) {
|
|
66
|
+
const numBytes = Math.ceil(bits.length / 8);
|
|
67
|
+
this.ensureSize(numBytes);
|
|
81
68
|
for (let i = 0; i < bits.length; i += 8) {
|
|
82
69
|
let byte = 0;
|
|
83
|
-
for (let j = 0; j < 8; j++) {
|
|
84
|
-
if (i + j
|
|
85
|
-
|
|
70
|
+
for (let j = 0; j < 8 && i + j < bits.length; j++) {
|
|
71
|
+
if (bits[i + j]) {
|
|
72
|
+
byte |= 1 << j;
|
|
86
73
|
}
|
|
87
|
-
byte |= (bits[i + j] ? 1 : 0) << j;
|
|
88
74
|
}
|
|
89
|
-
this.
|
|
75
|
+
this.bytes[this.pos++] = byte;
|
|
90
76
|
}
|
|
91
77
|
return this;
|
|
92
78
|
}
|
|
@@ -96,7 +82,7 @@ export class Writer {
|
|
|
96
82
|
}
|
|
97
83
|
this.ensureSize(val.length);
|
|
98
84
|
for (let i = 0; i < val.length; i++) {
|
|
99
|
-
this.
|
|
85
|
+
this.bytes[this.pos++] = val.charCodeAt(i);
|
|
100
86
|
}
|
|
101
87
|
return this;
|
|
102
88
|
}
|
|
@@ -127,30 +113,60 @@ export class Writer {
|
|
|
127
113
|
this.pos += buf.length;
|
|
128
114
|
return this;
|
|
129
115
|
}
|
|
116
|
+
concat(other) {
|
|
117
|
+
const otherLen = other.pos;
|
|
118
|
+
this.ensureSize(otherLen);
|
|
119
|
+
if (otherLen < 64) {
|
|
120
|
+
for (let i = 0; i < otherLen; i++) {
|
|
121
|
+
this.bytes[this.pos++] = other.bytes[i];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
this.bytes.set(other.bytes.subarray(0, otherLen), this.pos);
|
|
126
|
+
this.pos += otherLen;
|
|
127
|
+
}
|
|
128
|
+
return this;
|
|
129
|
+
}
|
|
130
130
|
toBuffer() {
|
|
131
131
|
return this.bytes.subarray(0, this.pos);
|
|
132
132
|
}
|
|
133
|
+
get size() {
|
|
134
|
+
return this.pos;
|
|
135
|
+
}
|
|
133
136
|
ensureSize(size) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
if (this.bytes.length >= this.pos + size) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
let newSize = this.bytes.length * 2;
|
|
141
|
+
while (newSize < this.pos + size) {
|
|
142
|
+
newSize *= 2;
|
|
143
|
+
}
|
|
144
|
+
const newBytes = new Uint8Array(newSize);
|
|
145
|
+
newBytes.set(this.bytes);
|
|
146
|
+
this.bytes = newBytes;
|
|
147
|
+
this._view = null;
|
|
148
|
+
}
|
|
149
|
+
get view() {
|
|
150
|
+
if (!this._view) {
|
|
151
|
+
this._view = new DataView(this.bytes.buffer);
|
|
140
152
|
}
|
|
153
|
+
return this._view;
|
|
141
154
|
}
|
|
142
155
|
}
|
|
143
156
|
export class Reader {
|
|
144
157
|
pos = 0;
|
|
145
|
-
view;
|
|
146
158
|
bytes;
|
|
159
|
+
view;
|
|
147
160
|
constructor(buf) {
|
|
161
|
+
this.bytes = buf;
|
|
148
162
|
this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
149
|
-
this.bytes = new Uint8Array(this.view.buffer, buf.byteOffset, buf.byteLength);
|
|
150
163
|
}
|
|
151
164
|
readUInt8() {
|
|
152
|
-
|
|
153
|
-
|
|
165
|
+
return this.bytes[this.pos++];
|
|
166
|
+
}
|
|
167
|
+
readUInt16() {
|
|
168
|
+
const val = this.view.getUint16(this.pos);
|
|
169
|
+
this.pos += 2;
|
|
154
170
|
return val;
|
|
155
171
|
}
|
|
156
172
|
readUInt32() {
|
|
@@ -158,15 +174,10 @@ export class Reader {
|
|
|
158
174
|
this.pos += 4;
|
|
159
175
|
return val;
|
|
160
176
|
}
|
|
161
|
-
readUInt64() {
|
|
162
|
-
const val = this.view.getBigUint64(this.pos);
|
|
163
|
-
this.pos += 8;
|
|
164
|
-
return val;
|
|
165
|
-
}
|
|
166
177
|
readUVarint() {
|
|
167
178
|
let val = 0;
|
|
168
179
|
while (true) {
|
|
169
|
-
|
|
180
|
+
const byte = this.readUInt8();
|
|
170
181
|
if (byte < 0x80) {
|
|
171
182
|
return val + byte;
|
|
172
183
|
}
|
|
@@ -174,8 +185,8 @@ export class Reader {
|
|
|
174
185
|
}
|
|
175
186
|
}
|
|
176
187
|
readVarint() {
|
|
177
|
-
const val =
|
|
178
|
-
return
|
|
188
|
+
const val = this.readUVarint();
|
|
189
|
+
return (val >>> 1) ^ -(val & 1);
|
|
179
190
|
}
|
|
180
191
|
readFloat() {
|
|
181
192
|
const val = this.view.getFloat32(this.pos, true);
|
|
@@ -184,14 +195,13 @@ export class Reader {
|
|
|
184
195
|
}
|
|
185
196
|
readBits(numBits) {
|
|
186
197
|
const numBytes = Math.ceil(numBits / 8);
|
|
187
|
-
const bytes = this.bytes.slice(this.pos, this.pos + numBytes);
|
|
188
198
|
const bits = [];
|
|
189
|
-
for (
|
|
190
|
-
|
|
191
|
-
|
|
199
|
+
for (let i = 0; i < numBytes; i++) {
|
|
200
|
+
const byte = this.readUInt8();
|
|
201
|
+
for (let j = 0; j < 8 && bits.length < numBits; j++) {
|
|
202
|
+
bits.push(((byte >> j) & 1) === 1);
|
|
192
203
|
}
|
|
193
204
|
}
|
|
194
|
-
this.pos += numBytes;
|
|
195
205
|
return bits;
|
|
196
206
|
}
|
|
197
207
|
readStringAscii(len) {
|
|
@@ -200,7 +210,7 @@ export class Reader {
|
|
|
200
210
|
}
|
|
201
211
|
let val = "";
|
|
202
212
|
for (let i = 0; i < len; i++) {
|
|
203
|
-
val += String.fromCharCode(this.
|
|
213
|
+
val += String.fromCharCode(this.readUInt8());
|
|
204
214
|
}
|
|
205
215
|
return val;
|
|
206
216
|
}
|
|
@@ -221,6 +231,6 @@ export class Reader {
|
|
|
221
231
|
return bytes;
|
|
222
232
|
}
|
|
223
233
|
remaining() {
|
|
224
|
-
return this.
|
|
234
|
+
return this.bytes.length - this.pos;
|
|
225
235
|
}
|
|
226
236
|
}
|