edinburgh 0.1.2 → 0.3.0
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 +146 -84
- package/build/src/datapack.d.ts +119 -0
- package/build/src/datapack.js +620 -0
- package/build/src/datapack.js.map +1 -0
- package/build/src/edinburgh.d.ts +15 -3
- package/build/src/edinburgh.js +64 -30
- package/build/src/edinburgh.js.map +1 -1
- package/build/src/indexes.d.ts +58 -91
- package/build/src/indexes.js +360 -285
- package/build/src/indexes.js.map +1 -1
- package/build/src/models.d.ts +41 -45
- package/build/src/models.js +191 -239
- package/build/src/models.js.map +1 -1
- package/build/src/types.d.ts +188 -256
- package/build/src/types.js +381 -316
- package/build/src/types.js.map +1 -1
- package/build/src/utils.d.ts +9 -5
- package/build/src/utils.js +34 -5
- package/build/src/utils.js.map +1 -1
- package/package.json +17 -15
- package/src/datapack.ts +655 -0
- package/src/edinburgh.ts +68 -29
- package/src/indexes.ts +398 -319
- package/src/models.ts +224 -262
- package/src/types.ts +461 -385
- package/src/utils.ts +37 -9
- package/build/src/bytes.d.ts +0 -155
- package/build/src/bytes.js +0 -455
- package/build/src/bytes.js.map +0 -1
- package/src/bytes.ts +0 -500
|
@@ -0,0 +1,620 @@
|
|
|
1
|
+
const encoder = new TextEncoder();
|
|
2
|
+
const decoder = new TextDecoder('utf-8', { fatal: true });
|
|
3
|
+
// EOD marker for container parsing
|
|
4
|
+
const EOD = Symbol('EOD');
|
|
5
|
+
const BASE64_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$';
|
|
6
|
+
const BASE64_LOOKUP = new Uint8Array(128).fill(255); // Use 255 as invalid marker;
|
|
7
|
+
for (let i = 0; i < BASE64_CHARS.length; ++i)
|
|
8
|
+
BASE64_LOOKUP[BASE64_CHARS.charCodeAt(i)] = i;
|
|
9
|
+
const COLORS = ['\x1b[32m', '\x1b[33m', '\x1b[34m', '\x1b[35m']; // green, yellow, blue, magenta
|
|
10
|
+
const RESET_COLOR = '\x1b[0m';
|
|
11
|
+
const ERROR_COLOR = '\x1b[31m'; // red
|
|
12
|
+
let toStringTermCount = 0;
|
|
13
|
+
let useExtendedLogging = !!process.env.DATAPACK_EXTENDED_LOGGING;
|
|
14
|
+
/**
|
|
15
|
+
* A byte buffer for efficient reading and writing of primitive values and bit sequences.
|
|
16
|
+
*
|
|
17
|
+
* The DataPack class provides methods for serializing and deserializing various data types
|
|
18
|
+
* including numbers, strings, bit sequences, and other primitive values to/from byte buffers.
|
|
19
|
+
* It supports both reading and writing operations with automatic buffer management.
|
|
20
|
+
*/
|
|
21
|
+
export class DataPack {
|
|
22
|
+
buffer;
|
|
23
|
+
dataView;
|
|
24
|
+
readPos = 0;
|
|
25
|
+
writePos = 0;
|
|
26
|
+
/**
|
|
27
|
+
* Backward compatibility: Access to the internal buffer
|
|
28
|
+
*/
|
|
29
|
+
get _buffer() {
|
|
30
|
+
return this.buffer;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a new DataPack instance.
|
|
34
|
+
* @param data - Optional initial data as Uint8Array or buffer size as number.
|
|
35
|
+
*/
|
|
36
|
+
constructor(data = 3900) {
|
|
37
|
+
if (data instanceof Uint8Array) {
|
|
38
|
+
this.buffer = data;
|
|
39
|
+
this.writePos = data.length;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
this.buffer = new Uint8Array(data);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Helper function to write a multi-byte integer with length prefix
|
|
47
|
+
* @param value - The value to write
|
|
48
|
+
* @param headerType - The type bits (0-7) for the header
|
|
49
|
+
* @param invertBytes - Whether to invert bytes (for negative numbers)
|
|
50
|
+
* @param invertByteCount - Whether to invert the byte count (for type 0)
|
|
51
|
+
*/
|
|
52
|
+
writeMultiByteNumber(value, headerType, invertBytes = false, invertByteCount = false) {
|
|
53
|
+
let byteCount = 0;
|
|
54
|
+
let temp = value;
|
|
55
|
+
while (temp > 0) {
|
|
56
|
+
byteCount++;
|
|
57
|
+
temp = Math.floor(temp / 256);
|
|
58
|
+
}
|
|
59
|
+
const encodedByteCount = invertByteCount ? ((~byteCount) & 0x1F) : byteCount;
|
|
60
|
+
this.buffer[this.writePos++] = (headerType << 5) | encodedByteCount;
|
|
61
|
+
let max = 1;
|
|
62
|
+
for (let j = 0; j < byteCount; j++)
|
|
63
|
+
max *= 256;
|
|
64
|
+
for (let i = 0; i < byteCount; i++) {
|
|
65
|
+
max = Math.floor(max / 256);
|
|
66
|
+
let byte = Math.floor(value / max) % 256;
|
|
67
|
+
if (invertBytes)
|
|
68
|
+
byte ^= 0xFF;
|
|
69
|
+
this.buffer[this.writePos++] = byte;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Helper function to read a multi-byte integer with length prefix
|
|
74
|
+
* @param byteCount - Number of bytes to read
|
|
75
|
+
* @param invertBytes - Whether to invert bytes (for negative numbers)
|
|
76
|
+
* @returns The read value
|
|
77
|
+
*/
|
|
78
|
+
readMultiByteNumber(byteCount, invertBytes = false) {
|
|
79
|
+
if (this.readPos + byteCount > this.writePos)
|
|
80
|
+
this.notEnoughData('number');
|
|
81
|
+
let value = 0;
|
|
82
|
+
let multiplier = 1;
|
|
83
|
+
for (let i = byteCount - 1; i >= 0; i--) {
|
|
84
|
+
let byte = this.buffer[this.readPos + i];
|
|
85
|
+
if (invertBytes)
|
|
86
|
+
byte ^= 0xFF;
|
|
87
|
+
value += byte * multiplier;
|
|
88
|
+
multiplier *= 256;
|
|
89
|
+
}
|
|
90
|
+
this.readPos += byteCount;
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
notEnoughData(type) {
|
|
94
|
+
throw new Error(`Not enough data to read a ${type} at position ${this.readPos} in\n${this.toString(true)}`);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Each data item starts with a single byte. The high 3 bits indicate the type.
|
|
98
|
+
* The low 5 bits indicate a size or a subtype, depending on the type.
|
|
99
|
+
*
|
|
100
|
+
* 0: negative integer (byte count encoded as bitwise NOT in lower bits)
|
|
101
|
+
* 1: small integer 0..31 (encoded in lower bits)
|
|
102
|
+
* 2: small integer 32...63 (encoded in lower bits)
|
|
103
|
+
* 3: integer (byte count encoded in lower bits)
|
|
104
|
+
* 4:
|
|
105
|
+
* 0: float64 (8 bytes follow)
|
|
106
|
+
* 1: undefined
|
|
107
|
+
* 2: null
|
|
108
|
+
* 3: true
|
|
109
|
+
* 4: false
|
|
110
|
+
* 5: array start (followed by a items until EOD)
|
|
111
|
+
* 6: object start (followed by key+value pairs until EOD)
|
|
112
|
+
* 7: map start (followed by key+value pairs until EOD)
|
|
113
|
+
* 8: set start (followed by items until EOD)
|
|
114
|
+
* 9: EOD
|
|
115
|
+
* 10: identifier (6 byte positive int follows, represented as a base64 string of length 8)
|
|
116
|
+
* 11: null-terminated string
|
|
117
|
+
* 5: short string (length in lower bits, 0-31)
|
|
118
|
+
* 6: string (byte count of length in lower bits)
|
|
119
|
+
* 7: blob (byte count of length in lower bits)
|
|
120
|
+
*/
|
|
121
|
+
write(data) {
|
|
122
|
+
// Pessimistic capacity allocation - covers most cases
|
|
123
|
+
this.ensureCapacity(33); // 1 byte header + up to 32 bytes for large integers/length encoding
|
|
124
|
+
if (typeof data === 'number') {
|
|
125
|
+
if (Number.isInteger(data) && data <= Number.MAX_SAFE_INTEGER && data >= Number.MIN_SAFE_INTEGER) {
|
|
126
|
+
if (data >= 0) {
|
|
127
|
+
if (data < 32) { // Type 1: small positive integer 0...31
|
|
128
|
+
this.buffer[this.writePos++] = (1 << 5) | data;
|
|
129
|
+
}
|
|
130
|
+
else if (data < 64) { // Type 2: small positive integer 32...63
|
|
131
|
+
this.buffer[this.writePos++] = (2 << 5) | (data - 32);
|
|
132
|
+
}
|
|
133
|
+
else { // Type 3: positive integer (byte count in lower bits)
|
|
134
|
+
this.writeMultiByteNumber(data - 64, 3);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
// Type 0: negative integer (byte count as bitwise NOT in lower bits)
|
|
139
|
+
this.writeMultiByteNumber(-data, 0, true, true);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// Type 4, subtype 0: float64
|
|
144
|
+
this.buffer[this.writePos++] = (4 << 5) | 0;
|
|
145
|
+
this.dataView ||= new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);
|
|
146
|
+
this.dataView.setFloat64(this.writePos, data);
|
|
147
|
+
this.writePos += 8;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else if (data === undefined) {
|
|
151
|
+
this.buffer[this.writePos++] = (4 << 5) | 1;
|
|
152
|
+
}
|
|
153
|
+
else if (data === null) {
|
|
154
|
+
this.buffer[this.writePos++] = (4 << 5) | 2;
|
|
155
|
+
}
|
|
156
|
+
else if (data === true) {
|
|
157
|
+
this.buffer[this.writePos++] = (4 << 5) | 3;
|
|
158
|
+
}
|
|
159
|
+
else if (data === false) {
|
|
160
|
+
this.buffer[this.writePos++] = (4 << 5) | 4;
|
|
161
|
+
}
|
|
162
|
+
else if (typeof data === 'string') {
|
|
163
|
+
const encoded = encoder.encode(data);
|
|
164
|
+
if (encoded.length < 32) {
|
|
165
|
+
// Type 5: short string (length in lower bits, 0-31)
|
|
166
|
+
this.buffer[this.writePos++] = (5 << 5) | encoded.length;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
// Type 6: string (byte count of length in lower bits)
|
|
170
|
+
this.writeMultiByteNumber(encoded.length, 6);
|
|
171
|
+
}
|
|
172
|
+
this.ensureCapacity(encoded.length);
|
|
173
|
+
this.buffer.set(encoded, this.writePos);
|
|
174
|
+
this.writePos += encoded.length;
|
|
175
|
+
}
|
|
176
|
+
else if (data instanceof Uint8Array) {
|
|
177
|
+
// Type 7: blob (byte count of length in lower bits)
|
|
178
|
+
this.writeMultiByteNumber(data.length, 7);
|
|
179
|
+
this.ensureCapacity(data.length);
|
|
180
|
+
this.buffer.set(data, this.writePos);
|
|
181
|
+
this.writePos += data.length;
|
|
182
|
+
}
|
|
183
|
+
else if (Array.isArray(data)) {
|
|
184
|
+
// Type 4, subtype 5: array start
|
|
185
|
+
this.buffer[this.writePos++] = (4 << 5) | 5;
|
|
186
|
+
for (const item of data) {
|
|
187
|
+
this.write(item);
|
|
188
|
+
}
|
|
189
|
+
this.buffer[this.writePos++] = (4 << 5) | 9; // EOD
|
|
190
|
+
}
|
|
191
|
+
else if (data instanceof Map) {
|
|
192
|
+
// Type 4, subtype 7: map start
|
|
193
|
+
this.buffer[this.writePos++] = (4 << 5) | 7;
|
|
194
|
+
for (const [key, value] of data) {
|
|
195
|
+
this.write(key);
|
|
196
|
+
this.write(value);
|
|
197
|
+
}
|
|
198
|
+
this.buffer[this.writePos++] = (4 << 5) | 9; // EOD
|
|
199
|
+
}
|
|
200
|
+
else if (data instanceof Set) {
|
|
201
|
+
// Type 4, subtype 8: set start
|
|
202
|
+
this.buffer[this.writePos++] = (4 << 5) | 8;
|
|
203
|
+
for (const item of data) {
|
|
204
|
+
this.write(item);
|
|
205
|
+
}
|
|
206
|
+
this.buffer[this.writePos++] = (4 << 5) | 9; // EOD
|
|
207
|
+
}
|
|
208
|
+
else if (data instanceof Date) {
|
|
209
|
+
// Type 4, subtype 12: Date/Time
|
|
210
|
+
this.buffer[this.writePos++] = (4 << 5) | 12;
|
|
211
|
+
// Write a varint -- whole seconds should be plenty of resolution
|
|
212
|
+
this.write(Math.floor(data.getTime() / 1000));
|
|
213
|
+
}
|
|
214
|
+
else if (typeof data === 'object' && data.constructor === Object) {
|
|
215
|
+
// Type 4, subtype 6: object start
|
|
216
|
+
this.buffer[this.writePos++] = (4 << 5) | 6;
|
|
217
|
+
for (const [key, value] of Object.entries(data)) {
|
|
218
|
+
this.write(key);
|
|
219
|
+
this.write(value);
|
|
220
|
+
}
|
|
221
|
+
this.buffer[this.writePos++] = (4 << 5) | 9; // EOD
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
throw new Error(`Unsupported data type: ${typeof data}`);
|
|
225
|
+
}
|
|
226
|
+
return this;
|
|
227
|
+
}
|
|
228
|
+
read() {
|
|
229
|
+
if (this.readPos > this.writePos) {
|
|
230
|
+
throw new Error('Not enough data');
|
|
231
|
+
}
|
|
232
|
+
const header = this.buffer[this.readPos++];
|
|
233
|
+
const type = (header >> 5) & 0x07;
|
|
234
|
+
const subtype = header & 0x1F;
|
|
235
|
+
switch (type) {
|
|
236
|
+
case 0: {
|
|
237
|
+
// Negative integer (byte count as bitwise NOT in lower bits)
|
|
238
|
+
const byteCount = (~subtype) & 0x1F;
|
|
239
|
+
return -this.readMultiByteNumber(byteCount, true);
|
|
240
|
+
}
|
|
241
|
+
case 1: {
|
|
242
|
+
// Small positive integer 0...31
|
|
243
|
+
return subtype;
|
|
244
|
+
}
|
|
245
|
+
case 2: {
|
|
246
|
+
// Small positive integer 32..63
|
|
247
|
+
return subtype + 32;
|
|
248
|
+
}
|
|
249
|
+
case 3: {
|
|
250
|
+
// Positive integer (byte count in lower bits)
|
|
251
|
+
return this.readMultiByteNumber(subtype) + 64;
|
|
252
|
+
}
|
|
253
|
+
case 4: {
|
|
254
|
+
// Special values and container starts
|
|
255
|
+
switch (subtype) {
|
|
256
|
+
case 0: {
|
|
257
|
+
// float64
|
|
258
|
+
if (this.readPos + 8 > this.writePos)
|
|
259
|
+
this.notEnoughData('float64');
|
|
260
|
+
this.dataView ||= new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);
|
|
261
|
+
const result = this.dataView.getFloat64(this.readPos);
|
|
262
|
+
this.readPos += 8;
|
|
263
|
+
return result;
|
|
264
|
+
}
|
|
265
|
+
case 1: return undefined;
|
|
266
|
+
case 2: return null;
|
|
267
|
+
case 3: return true;
|
|
268
|
+
case 4: return false;
|
|
269
|
+
case 5: {
|
|
270
|
+
// Array start
|
|
271
|
+
const result = [];
|
|
272
|
+
while (true) {
|
|
273
|
+
const nextValue = this.read();
|
|
274
|
+
if (nextValue === EOD)
|
|
275
|
+
break;
|
|
276
|
+
result.push(nextValue);
|
|
277
|
+
}
|
|
278
|
+
return result;
|
|
279
|
+
}
|
|
280
|
+
case 6: {
|
|
281
|
+
// Object start
|
|
282
|
+
const result = {};
|
|
283
|
+
while (true) {
|
|
284
|
+
const key = this.read();
|
|
285
|
+
if (key === EOD)
|
|
286
|
+
break;
|
|
287
|
+
const value = this.read();
|
|
288
|
+
result[key] = value;
|
|
289
|
+
}
|
|
290
|
+
return result;
|
|
291
|
+
}
|
|
292
|
+
case 7: {
|
|
293
|
+
// Map start
|
|
294
|
+
const result = new Map();
|
|
295
|
+
while (true) {
|
|
296
|
+
const key = this.read();
|
|
297
|
+
if (key === EOD)
|
|
298
|
+
break;
|
|
299
|
+
const value = this.read();
|
|
300
|
+
result.set(key, value);
|
|
301
|
+
}
|
|
302
|
+
return result;
|
|
303
|
+
}
|
|
304
|
+
case 8: {
|
|
305
|
+
// Set start
|
|
306
|
+
const result = new Set();
|
|
307
|
+
while (true) {
|
|
308
|
+
const value = this.read();
|
|
309
|
+
if (value === EOD)
|
|
310
|
+
break;
|
|
311
|
+
result.add(value);
|
|
312
|
+
}
|
|
313
|
+
return result;
|
|
314
|
+
}
|
|
315
|
+
case 9: return EOD;
|
|
316
|
+
case 10: {
|
|
317
|
+
// Identifier (6 byte positive int follows, represented as a base64 string of length 8)
|
|
318
|
+
--this.readPos;
|
|
319
|
+
return this.readIdentifier();
|
|
320
|
+
}
|
|
321
|
+
case 11: {
|
|
322
|
+
// Null-terminated string
|
|
323
|
+
const start = this.readPos;
|
|
324
|
+
let end = start;
|
|
325
|
+
while (true) {
|
|
326
|
+
if (end >= this.writePos)
|
|
327
|
+
this.notEnoughData('null-terminated string');
|
|
328
|
+
if (this.buffer[end] === 0)
|
|
329
|
+
break;
|
|
330
|
+
end++;
|
|
331
|
+
}
|
|
332
|
+
this.readPos = end + 1; // Skip the null terminator
|
|
333
|
+
return decoder.decode(this.buffer.subarray(start, end));
|
|
334
|
+
}
|
|
335
|
+
case 12: {
|
|
336
|
+
// Date/Time (varint with whole seconds since epoch follows)
|
|
337
|
+
const seconds = this.readPositiveInt();
|
|
338
|
+
return new Date(seconds * 1000);
|
|
339
|
+
}
|
|
340
|
+
default: throw new Error(`Unknown type 4 subtype: ${subtype}`);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
case 5: {
|
|
344
|
+
// Short string (length in lower bits, 0-31)
|
|
345
|
+
const length = subtype;
|
|
346
|
+
if (this.readPos + length > this.writePos)
|
|
347
|
+
this.notEnoughData('short string');
|
|
348
|
+
const bytes = this.buffer.subarray(this.readPos, this.readPos + length);
|
|
349
|
+
this.readPos += length;
|
|
350
|
+
return decoder.decode(bytes);
|
|
351
|
+
}
|
|
352
|
+
case 6: {
|
|
353
|
+
// String (byte count of length in lower bits)
|
|
354
|
+
const length = this.readMultiByteNumber(subtype);
|
|
355
|
+
if (this.readPos + length > this.writePos)
|
|
356
|
+
this.notEnoughData('string');
|
|
357
|
+
const bytes = this.buffer.subarray(this.readPos, this.readPos + length);
|
|
358
|
+
this.readPos += length;
|
|
359
|
+
return decoder.decode(bytes);
|
|
360
|
+
}
|
|
361
|
+
case 7: {
|
|
362
|
+
// Blob (byte count of length in lower bits)
|
|
363
|
+
const length = this.readMultiByteNumber(subtype);
|
|
364
|
+
if (this.readPos + length > this.writePos)
|
|
365
|
+
this.notEnoughData('blob');
|
|
366
|
+
// This makes an actual copy of the underlying buffer data
|
|
367
|
+
const result = this.buffer.slice(this.readPos, this.readPos + length);
|
|
368
|
+
this.readPos += length;
|
|
369
|
+
return new Uint8Array(result); // Return a copy
|
|
370
|
+
}
|
|
371
|
+
default: throw new Error(`Unknown type: ${type}`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Ensure the buffer has capacity for additional bytes.
|
|
376
|
+
* @param bytesNeeded - Number of additional bytes needed.
|
|
377
|
+
*/
|
|
378
|
+
ensureCapacity(bytesNeeded) {
|
|
379
|
+
const needed = this.writePos + bytesNeeded;
|
|
380
|
+
if (needed <= this.buffer.length)
|
|
381
|
+
return;
|
|
382
|
+
// Grow by 1.5x or the needed amount, whichever is larger
|
|
383
|
+
const newCapacity = Math.max(needed, Math.floor(this.buffer.length * 1.5));
|
|
384
|
+
const newBuffer = new Uint8Array(newCapacity);
|
|
385
|
+
newBuffer.set(this.buffer.subarray(0, this.writePos));
|
|
386
|
+
this.buffer = newBuffer;
|
|
387
|
+
delete this.dataView;
|
|
388
|
+
}
|
|
389
|
+
readNumber() {
|
|
390
|
+
const result = this.read();
|
|
391
|
+
if (typeof result !== 'number') {
|
|
392
|
+
throw new Error('Expected number but got ' + typeof result);
|
|
393
|
+
}
|
|
394
|
+
return result;
|
|
395
|
+
}
|
|
396
|
+
readDate() {
|
|
397
|
+
const result = this.read();
|
|
398
|
+
if (!(result instanceof Date)) {
|
|
399
|
+
throw new Error('Expected Date but got ' + typeof result);
|
|
400
|
+
}
|
|
401
|
+
return result;
|
|
402
|
+
}
|
|
403
|
+
readPositiveInt(limit) {
|
|
404
|
+
const result = this.read();
|
|
405
|
+
if (typeof result !== 'number' || !Number.isInteger(result) || result < 0 || (limit !== undefined && result >= limit)) {
|
|
406
|
+
throw new Error(`Expected positive integer < ${limit} but got ${result}`);
|
|
407
|
+
}
|
|
408
|
+
return result;
|
|
409
|
+
}
|
|
410
|
+
readBoolean() {
|
|
411
|
+
const result = this.read();
|
|
412
|
+
if (typeof result !== 'boolean') {
|
|
413
|
+
throw new Error('Expected boolean but got ' + typeof result);
|
|
414
|
+
}
|
|
415
|
+
return result;
|
|
416
|
+
}
|
|
417
|
+
readUint8Array() {
|
|
418
|
+
const result = this.read();
|
|
419
|
+
if (!(result instanceof Uint8Array)) {
|
|
420
|
+
throw new Error('Expected Uint8Array but got ' + typeof result);
|
|
421
|
+
}
|
|
422
|
+
return result;
|
|
423
|
+
}
|
|
424
|
+
readString() {
|
|
425
|
+
const result = this.read();
|
|
426
|
+
if (typeof result !== 'string') {
|
|
427
|
+
throw new Error('Expected string but got ' + typeof result);
|
|
428
|
+
}
|
|
429
|
+
return result;
|
|
430
|
+
}
|
|
431
|
+
writeIdentifier(id) {
|
|
432
|
+
if (id.length !== 8) {
|
|
433
|
+
throw new Error(`Identifier must be exactly 8 characters, got ${id.length}`);
|
|
434
|
+
}
|
|
435
|
+
// Convert base64 string to 48-bit number
|
|
436
|
+
let value, num = 0;
|
|
437
|
+
for (let i = 0; i < 8; i++) {
|
|
438
|
+
const char = id.charCodeAt(i);
|
|
439
|
+
if (char > 127 || (value = BASE64_LOOKUP[char]) === 255) {
|
|
440
|
+
throw new Error(`Invalid base64 character: ${id[i]}`);
|
|
441
|
+
}
|
|
442
|
+
num = num * 64 + value;
|
|
443
|
+
}
|
|
444
|
+
// Write type 4, subtype 10 header
|
|
445
|
+
this.ensureCapacity(7); // 1 byte header + 6 bytes for the number
|
|
446
|
+
this.buffer[this.writePos++] = (4 << 5) | 10;
|
|
447
|
+
// Write the 6-byte number in big-endian format
|
|
448
|
+
for (let i = 5; i >= 0; i--) {
|
|
449
|
+
this.buffer[this.writePos++] = Math.floor(num / Math.pow(256, i)) & 0xFF;
|
|
450
|
+
}
|
|
451
|
+
return this;
|
|
452
|
+
}
|
|
453
|
+
readIdentifier() {
|
|
454
|
+
// Read the 6-byte number in big-endian format
|
|
455
|
+
if (this.readPos + 7 > this.writePos)
|
|
456
|
+
this.notEnoughData('identifier');
|
|
457
|
+
const header = this.buffer[this.readPos++];
|
|
458
|
+
if (header !== ((4 << 5) | 10)) {
|
|
459
|
+
throw new Error('Invalid identifier header');
|
|
460
|
+
}
|
|
461
|
+
let num = 0;
|
|
462
|
+
for (let i = 0; i < 6; i++) {
|
|
463
|
+
num = (num * 256) + this.buffer[this.readPos++];
|
|
464
|
+
}
|
|
465
|
+
// Convert 48-bit number back to 8-character base64 string
|
|
466
|
+
let id = '';
|
|
467
|
+
for (let i = 0; i < 8; i++) {
|
|
468
|
+
id = BASE64_CHARS[num % 64] + id;
|
|
469
|
+
num = Math.floor(num / 64);
|
|
470
|
+
}
|
|
471
|
+
return id;
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Like writeString but writes without a length prefix and with a null terminator, for ordered storage.
|
|
475
|
+
* Can be read with {@link read} or {@link readString} just like any other string.
|
|
476
|
+
* @param str - The string to write. May not contain null characters.
|
|
477
|
+
*/
|
|
478
|
+
writeOrderedString(str) {
|
|
479
|
+
const utf8Bytes = new TextEncoder().encode(str);
|
|
480
|
+
if (utf8Bytes.includes(0)) {
|
|
481
|
+
throw new Error('String contains null character');
|
|
482
|
+
}
|
|
483
|
+
this.ensureCapacity(utf8Bytes.length + 2);
|
|
484
|
+
this.buffer[this.writePos++] = (4 << 5) | 11; // Null-terminated string
|
|
485
|
+
this.buffer.set(utf8Bytes, this.writePos);
|
|
486
|
+
this.writePos += utf8Bytes.length;
|
|
487
|
+
this.buffer[this.writePos++] = 0; // Null terminator
|
|
488
|
+
return this;
|
|
489
|
+
}
|
|
490
|
+
toUint8Array(copyBuffer = true, startPos = 0, endPos = this.writePos) {
|
|
491
|
+
return copyBuffer ? this.buffer.slice(startPos, endPos) : this.buffer.subarray(startPos, endPos);
|
|
492
|
+
}
|
|
493
|
+
clone(copyBuffer, readPos = 0, writePos = this.writePos) {
|
|
494
|
+
if (copyBuffer) {
|
|
495
|
+
return new DataPack(this.buffer.slice(readPos, writePos));
|
|
496
|
+
}
|
|
497
|
+
else {
|
|
498
|
+
const pack = new DataPack(this.buffer);
|
|
499
|
+
pack.readPos = readPos;
|
|
500
|
+
pack.writePos = writePos;
|
|
501
|
+
return pack;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
writeCollection(type, bodyFunc) {
|
|
505
|
+
let subType = { 'array': 5, 'object': 6, 'map': 7, 'set': 8 }[type];
|
|
506
|
+
if (!subType)
|
|
507
|
+
throw new Error(`Invalid collection type: ${type}`);
|
|
508
|
+
this.buffer[this.writePos++] = (4 << 5) | subType; // Collection start
|
|
509
|
+
bodyFunc((type === 'array' || type === 'set') ? (value) => {
|
|
510
|
+
this.write(value);
|
|
511
|
+
} : (name, value) => {
|
|
512
|
+
this.write(name);
|
|
513
|
+
this.write(value);
|
|
514
|
+
});
|
|
515
|
+
this.buffer[this.writePos++] = (4 << 5) | 9; // EOD
|
|
516
|
+
return this;
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Increment the last byte of the buffer. If it was already 255 set it to 0 and
|
|
520
|
+
* increment the previous byte, and so on. If all bytes were 255, return undefined.
|
|
521
|
+
* This is useful for creating an exclusive end key for range scans.
|
|
522
|
+
* This may result in a DataPack instance that cannot be parsed (or represented by
|
|
523
|
+
* {@link toString}).
|
|
524
|
+
*/
|
|
525
|
+
increment() {
|
|
526
|
+
for (let byte = this.writePos - 1; byte >= 0; byte--) {
|
|
527
|
+
if (this.buffer[byte] === 255) {
|
|
528
|
+
// Byte is all 1s, set to 0 and continue
|
|
529
|
+
this.buffer[byte] = 0;
|
|
530
|
+
}
|
|
531
|
+
else {
|
|
532
|
+
this.buffer[byte]++;
|
|
533
|
+
return this;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return undefined; // All bytes were 255 (and are now 0)
|
|
537
|
+
}
|
|
538
|
+
toString(extended = undefined, startPos = 0, endPos = this.writePos) {
|
|
539
|
+
if (extended === undefined)
|
|
540
|
+
extended = useExtendedLogging;
|
|
541
|
+
let oldReadPos = this.readPos;
|
|
542
|
+
this.readPos = startPos;
|
|
543
|
+
let lastPos = 0;
|
|
544
|
+
let vals = '';
|
|
545
|
+
let hexs = '';
|
|
546
|
+
const orgTermCount = toStringTermCount;
|
|
547
|
+
const resetColor = orgTermCount > 0 ? COLORS[(orgTermCount - 1) % COLORS.length] : RESET_COLOR;
|
|
548
|
+
try {
|
|
549
|
+
while (this.readPos < endPos) {
|
|
550
|
+
const color = COLORS[toStringTermCount++ % COLORS.length];
|
|
551
|
+
vals += color + toText(this.read()) + ' ';
|
|
552
|
+
if (extended) {
|
|
553
|
+
hexs += color;
|
|
554
|
+
while (lastPos < this.readPos) {
|
|
555
|
+
hexs += this.buffer[lastPos].toString(16).padStart(2, '0') + ' ';
|
|
556
|
+
lastPos++;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
catch (e) {
|
|
562
|
+
if (!extended) {
|
|
563
|
+
this.readPos = oldReadPos;
|
|
564
|
+
toStringTermCount = orgTermCount;
|
|
565
|
+
return this.toString(true, startPos, endPos);
|
|
566
|
+
}
|
|
567
|
+
vals += ERROR_COLOR + "ERROR ";
|
|
568
|
+
hexs += ERROR_COLOR;
|
|
569
|
+
while (lastPos < this.writePos) {
|
|
570
|
+
hexs += this.buffer[lastPos].toString(16).padStart(2, '0') + ' ';
|
|
571
|
+
lastPos++;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
this.readPos = oldReadPos;
|
|
575
|
+
if (!orgTermCount)
|
|
576
|
+
toStringTermCount = 0;
|
|
577
|
+
if (extended) {
|
|
578
|
+
return "DataPack{" + hexs + resetColor + "→ " + vals.trimEnd() + resetColor + "}";
|
|
579
|
+
}
|
|
580
|
+
else {
|
|
581
|
+
return "DataPack{" + vals.trimEnd() + resetColor + "}";
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
[Symbol.for('nodejs.util.inspect.custom')]() {
|
|
585
|
+
return this.toString();
|
|
586
|
+
}
|
|
587
|
+
readAvailable() {
|
|
588
|
+
return this.readPos < this.writePos;
|
|
589
|
+
}
|
|
590
|
+
static generateIdentifier() {
|
|
591
|
+
// Combine a timestamp with randomness, to create locality of reference as well as a high chance of uniqueness.
|
|
592
|
+
// Bits 9...48 are the date in ms (wrapping about every 34 years), providing some `locality of reference
|
|
593
|
+
// Bit 0...14 are random bits (partly overlapping with the date, adding up to 62ms of jitter)
|
|
594
|
+
let num = Math.floor(+new Date() * (1 << 8) + Math.random() * (1 << 14));
|
|
595
|
+
let id = '';
|
|
596
|
+
for (let i = 0; i < 8; i++) {
|
|
597
|
+
id = BASE64_CHARS[num & 0x3f] + id;
|
|
598
|
+
num = Math.floor(num / 64);
|
|
599
|
+
}
|
|
600
|
+
return id;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
function toText(v) {
|
|
604
|
+
if (v === undefined)
|
|
605
|
+
return 'undefined';
|
|
606
|
+
if (typeof v === 'object' && v !== null) {
|
|
607
|
+
if (v instanceof Uint8Array)
|
|
608
|
+
return new DataPack(v).toString();
|
|
609
|
+
if (v instanceof Array)
|
|
610
|
+
return '[' + v.map(vv => toText(vv)).join(', ') + ']';
|
|
611
|
+
if (v instanceof Map)
|
|
612
|
+
return 'Map{' + Array.from(v.entries()).map(([k, val]) => `${toText(k)}=>${toText(val)}`).join(', ') + '}';
|
|
613
|
+
if (v instanceof Set)
|
|
614
|
+
return 'Set{' + Array.from(v.values()).map(vv => toText(vv)).join(', ') + '}';
|
|
615
|
+
if (typeof v === 'object' && v !== null)
|
|
616
|
+
return '{' + Object.entries(v).map(([k, val]) => `${k}:${toText(val)}`).join(', ') + '}';
|
|
617
|
+
}
|
|
618
|
+
return JSON.stringify(v);
|
|
619
|
+
}
|
|
620
|
+
//# sourceMappingURL=datapack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datapack.js","sourceRoot":"","sources":["../../src/datapack.ts"],"names":[],"mappings":"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"}
|