@isopodlabs/binary_libs 0.0.1 → 0.1.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/dist/binary.js DELETED
@@ -1,802 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.field = exports.withNames = exports.RemainingArrayType = exports.ArrayType = exports.writen = exports.readn = exports.RemainingStringType = exports.NullTerminatedStringType = exports.StringType = exports.ULEB128 = exports.Float64 = exports.Float32 = exports.Float64_BE = exports.Float64_LE = exports.Float32_BE = exports.Float32_LE = exports.INT = exports.UINT = exports.INT64 = exports.INT64_BE = exports.INT64_LE = exports.UINT64 = exports.UINT64_BE = exports.UINT64_LE = exports.INT32 = exports.UINT32 = exports.INT32_BE = exports.INT32_LE = exports.UINT32_BE = exports.UINT32_LE = exports.INT16 = exports.UINT16 = exports.INT16_BE = exports.INT16_LE = exports.UINT16_BE = exports.UINT16_LE = exports.INT8 = exports.UINT8 = exports.dummy = exports.stream_grow = exports.stream = exports.write = exports.read_more = exports.read = exports.isType = exports.isWriter = exports.isReader = exports.ReadWriteStruct = exports.ReadStruct = exports.utils = void 0;
27
- exports.stream_endian = exports.asFixed = exports.asInt = exports.asFlags = exports.asEnum = exports.BitFields = exports.Flags = exports.Enum = exports.EnumV = exports.XINT64_LE = exports.XINT32_LE = exports.XINT16_LE = exports.XINT64 = exports.XINT32 = exports.XINT16 = exports.hex = exports.Switch = exports.Optional = exports.If = exports.FuncType = exports.Func = exports.Const = exports.as = exports.MaybeOffsetType = exports.OffsetType = exports.SizeType = exports.DontRead = exports.Discard = exports.AlignType = exports.SkipType = exports.Buffer = exports.Remainder = exports.Struct = exports.objectWithNames = exports.arrayWithNames = exports.names = void 0;
28
- const utils = __importStar(require("./binary_helpers"));
29
- exports.utils = __importStar(require("./binary_helpers"));
30
- function ReadStruct(spec) {
31
- return class ReadStruct {
32
- static get(s) {
33
- return new this(s);
34
- }
35
- constructor(s) {
36
- return Object.assign(this, read(s, spec));
37
- }
38
- };
39
- }
40
- exports.ReadStruct = ReadStruct;
41
- function ReadWriteStruct(spec) {
42
- return class ReadWriteStruct {
43
- static get(s) {
44
- return new this(s);
45
- }
46
- static put(s, v) {
47
- write(s, spec, v);
48
- }
49
- constructor(s) {
50
- Object.assign(this, read(s, spec));
51
- }
52
- write(s) {
53
- write(s, spec, this);
54
- }
55
- };
56
- }
57
- exports.ReadWriteStruct = ReadWriteStruct;
58
- function isReader(type) {
59
- return typeof type.get === 'function';
60
- }
61
- exports.isReader = isReader;
62
- function isWriter(type) {
63
- return typeof type.put === 'function';
64
- }
65
- exports.isWriter = isWriter;
66
- function isType(type) {
67
- return isReader(type) && isWriter(type);
68
- }
69
- exports.isType = isType;
70
- function read(s, spec, obj) {
71
- return isReader(spec)
72
- ? spec.get(s, obj)
73
- : Object.entries(spec).reduce((obj, [k, t]) => (obj[k] = read(s, t, obj), obj), { obj });
74
- }
75
- exports.read = read;
76
- function read_more(s, specs, obj) {
77
- return Object.entries(specs).reduce((obj, spec) => {
78
- obj[spec[0]] = isReader(spec[1])
79
- ? spec[1].get(s, obj)
80
- : read_more(s, spec[1], obj[spec[0]]);
81
- return obj;
82
- }, obj);
83
- }
84
- exports.read_more = read_more;
85
- function write(s, type, value) {
86
- if (isWriter(type))
87
- type.put(s, value);
88
- else
89
- Object.entries(type).map(([k, t]) => write(s, t, value[k]));
90
- }
91
- exports.write = write;
92
- function readx(s, type, obj) {
93
- return typeof type === 'function' ? type(obj)
94
- : isReader(type) ? type.get(s, obj)
95
- : type;
96
- }
97
- function writex(s, type, value) {
98
- if (isWriter(type))
99
- type.put(s, value);
100
- }
101
- //-----------------------------------------------------------------------------
102
- // stream
103
- //-----------------------------------------------------------------------------
104
- class stream {
105
- // public buffer: ArrayBuffer;
106
- buffer;
107
- offset0;
108
- offset;
109
- end;
110
- constructor(data) {
111
- this.buffer = data.buffer;
112
- this.offset = this.offset0 = data.byteOffset;
113
- this.end = data.byteOffset + data.byteLength;
114
- }
115
- remaining() {
116
- return this.end - this.offset;
117
- }
118
- remainder() {
119
- return new Uint8Array(this.buffer, this.offset);
120
- }
121
- tell() {
122
- return this.offset - this.offset0;
123
- }
124
- seek(offset) {
125
- this.offset = this.offset0 + offset;
126
- return this;
127
- }
128
- skip(offset) {
129
- this.offset += offset;
130
- return this;
131
- }
132
- align(align) {
133
- const offset = this.tell() % align;
134
- if (offset)
135
- this.skip(align - offset);
136
- }
137
- dataview(len) {
138
- if (this.offset + len > this.end)
139
- throw new Error('stream: out of bounds');
140
- const dv = new DataView(this.buffer, this.offset);
141
- this.offset += len;
142
- return dv;
143
- }
144
- buffer_at(offset, len) {
145
- return new Uint8Array(this.buffer, this.offset0 + offset, len ?? this.end - (this.offset0 + offset));
146
- }
147
- read_buffer(len) {
148
- const offset = this.offset;
149
- this.offset = Math.min(this.end, offset + len);
150
- const len2 = this.offset - offset;
151
- return new Uint8Array(this.buffer, offset, this.offset - offset);
152
- // this.offset += len;
153
- // return new Uint8Array(this.buffer, offset, len);
154
- }
155
- write_buffer(v) {
156
- const dv = this.dataview(v.length);
157
- let offset = 0;
158
- for (const i of v)
159
- dv.setUint8(offset++, v[i]);
160
- }
161
- }
162
- exports.stream = stream;
163
- class stream_grow extends stream {
164
- constructor(data) {
165
- super(data ?? new Uint8Array(1024));
166
- }
167
- checksize(len) {
168
- if (this.offset + len > this.buffer.byteLength) {
169
- const newBuffer = new ArrayBuffer(this.buffer.byteLength * 2);
170
- new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));
171
- this.buffer = newBuffer;
172
- this.offset -= this.offset0;
173
- this.offset0 = 0;
174
- }
175
- }
176
- dataview(len) {
177
- this.checksize(len);
178
- return super.dataview(len);
179
- }
180
- buffer_at(offset, len) {
181
- this.checksize(offset + len - this.offset);
182
- return super.buffer_at(offset, len);
183
- }
184
- read_buffer(len) {
185
- this.checksize(len);
186
- return super.read_buffer(len);
187
- }
188
- write_buffer(v) {
189
- this.checksize(v.length);
190
- super.write_buffer(v);
191
- }
192
- terminate() {
193
- return new Uint8Array(this.buffer, this.offset0, this.offset - this.offset0);
194
- }
195
- }
196
- exports.stream_grow = stream_grow;
197
- class dummy_dataview {
198
- offset;
199
- buffer;
200
- byteLength;
201
- byteOffset;
202
- [Symbol.toStringTag];
203
- constructor(offset) {
204
- this.offset = offset;
205
- }
206
- getFloat32(byteOffset, littleEndian) { return this.offset; }
207
- getFloat64(byteOffset, littleEndian) { return this.offset; }
208
- getInt8(byteOffset) { return this.offset; }
209
- getInt16(byteOffset, littleEndian) { return this.offset; }
210
- getInt32(byteOffset, littleEndian) { return this.offset; }
211
- getUint8(byteOffset) { return this.offset; }
212
- getUint16(byteOffset, littleEndian) { return this.offset; }
213
- getUint32(byteOffset, littleEndian) { return this.offset; }
214
- getBigInt64(byteOffset, littleEndian) { return BigInt(this.offset); }
215
- getBigUint64(byteOffset, littleEndian) { return BigInt(this.offset); }
216
- setFloat32(byteOffset, value, littleEndian) { }
217
- setFloat64(byteOffset, value, littleEndian) { }
218
- setInt8(byteOffset, value) { }
219
- setInt16(byteOffset, value, littleEndian) { }
220
- setInt32(byteOffset, value, littleEndian) { }
221
- setUint8(byteOffset, value) { }
222
- setUint16(byteOffset, value, littleEndian) { }
223
- setUint32(byteOffset, value, littleEndian) { }
224
- setBigInt64(byteOffset, value, littleEndian) { }
225
- setBigUint64(byteOffset, value, littleEndian) { }
226
- }
227
- class dummy {
228
- offset = 0;
229
- remaining() { return 0; }
230
- remainder() { return this.offset; }
231
- tell() { return this.offset; }
232
- seek(offset) { this.offset = offset; }
233
- skip(offset) { this.offset += offset; }
234
- align(align) { const offset = this.tell() % align; if (offset)
235
- this.skip(align - offset); }
236
- dataview(len) {
237
- const dv = new dummy_dataview(this.offset);
238
- this.offset += len;
239
- return dv;
240
- }
241
- read_buffer(len) {
242
- const offset = this.offset;
243
- this.offset += len;
244
- return offset;
245
- }
246
- write_buffer(v) { }
247
- }
248
- exports.dummy = dummy;
249
- //-----------------------------------------------------------------------------
250
- // numeric types
251
- //-----------------------------------------------------------------------------
252
- function endian_from_stream(type) {
253
- return {
254
- get(s) { return type(s.be).get(s); },
255
- put(s, v) { type(s.be).put(s, v); }
256
- };
257
- }
258
- function endian(type, be) {
259
- return be === undefined ? endian_from_stream(type) : type(be);
260
- }
261
- //8 bit
262
- exports.UINT8 = {
263
- get(s) { return s.dataview(1).getUint8(0); },
264
- put(s, v) { s.dataview(1).setUint8(0, v); }
265
- };
266
- exports.INT8 = {
267
- get(s) { return s.dataview(1).getInt8(0); },
268
- put(s, v) { s.dataview(1).setInt8(0, v); }
269
- };
270
- //16 bit
271
- function _UINT16(be) {
272
- return {
273
- get(s) { return s.dataview(2).getUint16(0, !be); },
274
- put(s, v) { s.dataview(2).setUint16(0, v, !be); }
275
- };
276
- }
277
- function _INT16(be) {
278
- return {
279
- get(s) { return s.dataview(2).getInt16(0, !be); },
280
- put(s, v) { s.dataview(2).setInt16(0, v, !be); }
281
- };
282
- }
283
- exports.UINT16_LE = _UINT16(false);
284
- exports.UINT16_BE = _UINT16(true);
285
- exports.INT16_LE = _INT16(false);
286
- exports.INT16_BE = _INT16(true);
287
- exports.UINT16 = endian_from_stream(_UINT16);
288
- exports.INT16 = endian_from_stream(_INT16);
289
- //32 bit
290
- function _UINT32(be) {
291
- return {
292
- get(s) { return s.dataview(4).getUint32(0, !be); },
293
- put(s, v) { s.dataview(4).setUint32(0, v, !be); }
294
- };
295
- }
296
- function _INT32(be) {
297
- return {
298
- get(s) { return s.dataview(4).getInt32(0, !be); },
299
- put(s, v) { s.dataview(4).setInt32(0, v, !be); }
300
- };
301
- }
302
- exports.UINT32_LE = _UINT32(false);
303
- exports.UINT32_BE = _UINT32(true);
304
- exports.INT32_LE = _INT32(false);
305
- exports.INT32_BE = _INT32(true);
306
- exports.UINT32 = endian_from_stream(_UINT32);
307
- exports.INT32 = endian_from_stream(_INT32);
308
- //64 bit
309
- function _UINT64(be) {
310
- return {
311
- get(s) { return utils.getBigUint(s.dataview(8), 8, !be); },
312
- put(s, v) { utils.putBigUint(s.dataview(8), v, 8, !be); }
313
- };
314
- }
315
- function _INT64(be) {
316
- return {
317
- get(s) { return utils.getBigInt(s.dataview(8), 8, !be); },
318
- put(s, v) { utils.putBigUint(s.dataview(8), v, 8, !be); }
319
- };
320
- }
321
- exports.UINT64_LE = _UINT64(false);
322
- exports.UINT64_BE = _UINT64(true);
323
- exports.UINT64 = endian_from_stream(_UINT64);
324
- exports.INT64_LE = _INT64(false);
325
- exports.INT64_BE = _INT64(true);
326
- exports.INT64 = endian_from_stream(_INT64);
327
- //computed int
328
- function UINT(bits, be) {
329
- if (bits & 7)
330
- throw new Error('bits must be multiple of 8');
331
- return bits === 8 ? exports.UINT8
332
- : bits > 56
333
- ? endian((be) => ({
334
- get(s) { return utils.getBigUint(s.dataview(bits / 8), bits / 8, !be); },
335
- put(s, v) { utils.putBigUint(s.dataview(bits / 8), v, bits / 8, !be); }
336
- }), be)
337
- : endian(bits == 16 ? _UINT16 : bits == 32 ? _UINT32 :
338
- (be) => ({
339
- get(s) { return utils.getUint(s.dataview(bits / 8), bits / 8, !be); },
340
- put(s, v) { utils.putUint(s.dataview(bits / 8), v, bits / 8, !be); }
341
- }), be);
342
- }
343
- exports.UINT = UINT;
344
- function INT(bits, be) {
345
- if (bits & 7)
346
- throw new Error('bits must be multiple of 8');
347
- return bits === 8 ? exports.UINT8
348
- : bits > 56
349
- ? endian((be) => ({
350
- get(s) { return utils.getBigInt(s.dataview(bits / 8), bits / 8, !be); },
351
- put(s, v) { utils.putBigUint(s.dataview(bits / 8), v, bits / 8, !be); }
352
- }), be)
353
- : endian(bits == 16 ? _INT16 : bits == 32 ? _INT32 :
354
- (be) => ({
355
- get(s) { return utils.getInt(s.dataview(bits / 8), bits / 8, !be); },
356
- put(s, v) { utils.putUint(s.dataview(bits / 8), v, bits / 8, !be); }
357
- }), be);
358
- }
359
- exports.INT = INT;
360
- //float
361
- function _Float32(be) {
362
- return {
363
- get(s) { return s.dataview(4).getFloat32(0, !be); },
364
- put(s, v) { s.dataview(4).setFloat32(0, v, !be); }
365
- };
366
- }
367
- function _Float64(be) {
368
- return {
369
- get(s) { return s.dataview(8).getFloat64(0, !be); },
370
- put(s, v) { s.dataview(8).setFloat64(0, v, !be); }
371
- };
372
- }
373
- exports.Float32_LE = _Float32(false);
374
- exports.Float32_BE = _Float32(true);
375
- exports.Float64_LE = _Float64(false);
376
- exports.Float64_BE = _Float64(true);
377
- exports.Float32 = endian_from_stream(_Float32);
378
- exports.Float64 = endian_from_stream(_Float64);
379
- //leb128
380
- exports.ULEB128 = {
381
- get(s) {
382
- const buffer = s.remainder();
383
- let t = 0;
384
- let i = 0;
385
- let b;
386
- while ((b = buffer[i]) & 0x80 && i < 6)
387
- t |= (b & 0x7f) << (i++ * 7);
388
- if (!(b & 0x80)) {
389
- s.skip(i);
390
- return t;
391
- }
392
- let tn = BigInt(t);
393
- while ((b = buffer[i]) & 0x80)
394
- tn |= BigInt(b & 0x7f) << BigInt(i++ * 7);
395
- tn |= BigInt(b) << BigInt(i++ * 7);
396
- s.skip(i);
397
- return tn;
398
- },
399
- put(s, v) {
400
- const n = utils.highestSetIndex(v) / 7 + 1;
401
- const buffer = new Uint8Array(n);
402
- let i = 0;
403
- if (typeof v === 'number') {
404
- while (v > 127) {
405
- buffer[i++] = (v & 0x7f) | 0x80;
406
- v >>= 7;
407
- }
408
- }
409
- else {
410
- while (v > 127) {
411
- buffer[i++] = Number(v & 0x7fn) | 0x80;
412
- v >>= 7n;
413
- }
414
- }
415
- buffer[i++] = Number(v);
416
- s.write_buffer(buffer);
417
- }
418
- };
419
- //-----------------------------------------------------------------------------
420
- // string types
421
- //-----------------------------------------------------------------------------
422
- function StringType(len, encoding = 'utf8', zeroTerminated = false, lenScale) {
423
- const lenScale2 = lenScale ?? (encoding == 'utf8' ? 1 : 2);
424
- return {
425
- get(s, obj) {
426
- const len2 = readx(s, len, obj);
427
- const v = utils.decodeText(s.read_buffer(len2 * lenScale2), encoding);
428
- return zeroTerminated ? v.slice(0, -1) : v;
429
- },
430
- put(s, v) {
431
- if (zeroTerminated)
432
- v += '\0';
433
- writex(s, len, v.length * 2 / lenScale2);
434
- utils.encodeTextInto(v, s.read_buffer(v.length * lenScale2), encoding);
435
- }
436
- };
437
- }
438
- exports.StringType = StringType;
439
- exports.NullTerminatedStringType = {
440
- get(s) {
441
- const buf = [];
442
- let b;
443
- while ((b = s.dataview(1).getUint8(0)) != 0)
444
- buf.push(b);
445
- return String.fromCharCode(...buf);
446
- },
447
- put(s, v) {
448
- return utils.encodeTextInto(v + '\0', s.read_buffer(v.length + 1), 'utf8');
449
- }
450
- };
451
- function RemainingStringType(encoding = 'utf8', zeroTerminated = false) {
452
- return {
453
- get(s) { return utils.decodeText(s.remainder(), encoding); },
454
- put(s, v) {
455
- if (zeroTerminated)
456
- v += '\0';
457
- utils.encodeTextInto(v, s.remainder(), encoding);
458
- }
459
- };
460
- }
461
- exports.RemainingStringType = RemainingStringType;
462
- //-----------------------------------------------------------------------------
463
- // array types
464
- //-----------------------------------------------------------------------------
465
- function readn(s, type, n, obj) {
466
- const result = [];
467
- //try {
468
- for (let i = 0; i < n; i++)
469
- result.push(read(s, type, obj));
470
- //} catch (e) {
471
- // console.log(`binary.readn wanted ${n} items, but failed after ${result.length}`)
472
- //}
473
- return result;
474
- }
475
- exports.readn = readn;
476
- function writen(s, type, v) {
477
- for (const i of v)
478
- write(s, type, i);
479
- }
480
- exports.writen = writen;
481
- function ArrayType(len, elemtype) {
482
- return {
483
- get: (s, obj) => readn(s, elemtype, readx(s, len, obj), obj),
484
- put: (s, v) => { writex(s, len, v.length); writen(s, elemtype, v); }
485
- };
486
- }
487
- exports.ArrayType = ArrayType;
488
- function RemainingArrayType(elemtype) {
489
- return {
490
- get: (s, obj) => {
491
- const result = [];
492
- try {
493
- let value;
494
- while (s.remaining() && (value = read(s, elemtype, obj)) !== undefined)
495
- result.push(value);
496
- }
497
- catch (e) {
498
- //meh
499
- }
500
- return result;
501
- },
502
- put: (s, v) => writen(s, elemtype, v)
503
- };
504
- }
505
- exports.RemainingArrayType = RemainingArrayType;
506
- function withNames(array, func) {
507
- return array.map((v, i) => [func(v, i) ?? `#${i}`, v]);
508
- }
509
- exports.withNames = withNames;
510
- const field = (field) => (v, i) => v[field];
511
- exports.field = field;
512
- const names = (names) => (v, i) => names[i];
513
- exports.names = names;
514
- function arrayWithNames(type, func) {
515
- return {
516
- get: (s) => withNames(read(s, type), func),
517
- put: (s, v) => write(s, type, v.map(([, v]) => v))
518
- };
519
- }
520
- exports.arrayWithNames = arrayWithNames;
521
- function objectWithNames(type, func) {
522
- return {
523
- get: (s) => Object.fromEntries(withNames(read(s, type), func)),
524
- put: (s, v) => write(s, type, Object.values(v))
525
- };
526
- }
527
- exports.objectWithNames = objectWithNames;
528
- function isConstructor(maker) {
529
- return maker.prototype?.constructor.name;
530
- // return typeof maker === 'function' && maker.prototype && !!maker.prototype.constructor;
531
- }
532
- function make(maker, arg, opt) {
533
- return isConstructor(maker) ? new maker(arg, opt) : maker(arg, opt);
534
- }
535
- function clone(obj) {
536
- return Object.assign(Object.create(Object.getPrototypeOf(obj)), obj);
537
- }
538
- function Struct(spec) {
539
- return {
540
- get: (s, obj) => read(s, spec, obj),
541
- put: (s, v) => { write(s, spec, v); }
542
- };
543
- }
544
- exports.Struct = Struct;
545
- exports.Remainder = {
546
- get: (s) => s.remainder(),
547
- put: (s, v) => s.write_buffer(v)
548
- };
549
- function Buffer(len) {
550
- return {
551
- get: (s, obj) => s.read_buffer(readx(s, len, obj)),
552
- put: (s, v) => { writex(s, len, v.length); s.write_buffer(v); }
553
- };
554
- }
555
- exports.Buffer = Buffer;
556
- function SkipType(len) {
557
- return {
558
- get: (s) => s.skip(len),
559
- put: (s, v) => s.skip(len)
560
- };
561
- }
562
- exports.SkipType = SkipType;
563
- function AlignType(align) {
564
- return {
565
- get: (s) => s.align(align),
566
- put: (s, v) => s.align(align)
567
- };
568
- }
569
- exports.AlignType = AlignType;
570
- function Discard(type) {
571
- return {
572
- get(s) { read(s, type); return undefined; },
573
- };
574
- }
575
- exports.Discard = Discard;
576
- function DontRead() {
577
- return {
578
- get(s) { return undefined; },
579
- put(s, v) { }
580
- };
581
- }
582
- exports.DontRead = DontRead;
583
- function SizeType(len, targettype) {
584
- return {
585
- get(s, obj) {
586
- const size = readx(s, len, obj);
587
- const s2 = clone(s);
588
- s2.end = s2.offset + size;
589
- return read(s2, targettype, obj);
590
- },
591
- put(s) { }
592
- };
593
- }
594
- exports.SizeType = SizeType;
595
- function OffsetType(offsettype, targettype) {
596
- return {
597
- get(s, obj) {
598
- const offset = readx(s, offsettype, obj);
599
- const s2 = clone(s);
600
- s2.offset = s2.offset0 += offset;
601
- return read(s2, targettype, obj);
602
- },
603
- put(s) { }
604
- };
605
- }
606
- exports.OffsetType = OffsetType;
607
- function MaybeOffsetType(offsettype, targettype) {
608
- return {
609
- get(s, obj) {
610
- const offset = readx(s, offsettype, obj);
611
- if (offset) {
612
- const s2 = clone(s);
613
- s2.offset = s2.offset0 += offset;
614
- return read(s2, targettype, obj);
615
- }
616
- },
617
- put(s) { }
618
- };
619
- }
620
- exports.MaybeOffsetType = MaybeOffsetType;
621
- function as(type, maker) {
622
- return {
623
- get(s, obj) { return make(maker, read(s, type), obj); },
624
- put(s, v) { write(s, type, v); }
625
- };
626
- }
627
- exports.as = as;
628
- function Const(t) {
629
- return {
630
- get(s, obj) { return t; },
631
- put(s, v) { }
632
- };
633
- }
634
- exports.Const = Const;
635
- function Func(func) {
636
- return {
637
- get(s, obj) { return func(obj); },
638
- put(s, v) { }
639
- };
640
- }
641
- exports.Func = Func;
642
- function FuncType(func) {
643
- return {
644
- get(s, obj) { return read(s, func(obj), obj); },
645
- put(s, v) { }
646
- };
647
- }
648
- exports.FuncType = FuncType;
649
- function If(test, true_type, false_type) {
650
- return {
651
- get(s, obj) {
652
- const x = readx(s, test, obj);
653
- if (false_type)
654
- read_more(s, x ? true_type : false_type, obj);
655
- else if (x)
656
- read_more(s, true_type, obj);
657
- return {};
658
- },
659
- put(s, v) { }
660
- };
661
- }
662
- exports.If = If;
663
- function Optional(test, type) {
664
- return {
665
- get(s, obj) { return readx(s, test, obj) ? read(s, type) : undefined; },
666
- put(s, v) { }
667
- };
668
- }
669
- exports.Optional = Optional;
670
- function Switch(test, switches) {
671
- return {
672
- get(s, obj) { const t = switches[readx(s, test, obj)]; return (t && read(s, t, obj)); },
673
- put(s, v) { } // writex(s, test, )}// write(s, switches[test(obj)], v); }
674
- };
675
- }
676
- exports.Switch = Switch;
677
- //-----------------------------------------------------------------------------
678
- // TYPED types
679
- //-----------------------------------------------------------------------------
680
- class hex {
681
- value;
682
- constructor(value) {
683
- this.value = value;
684
- }
685
- valueOf() { return this.value; }
686
- toString() { return '0x' + this.value.toString(16); }
687
- }
688
- exports.hex = hex;
689
- exports.XINT16 = as(exports.UINT16, hex);
690
- exports.XINT32 = as(exports.UINT32, hex);
691
- exports.XINT64 = as(exports.UINT64, hex);
692
- exports.XINT16_LE = as(exports.UINT16_LE, hex);
693
- exports.XINT32_LE = as(exports.UINT32_LE, hex);
694
- exports.XINT64_LE = as(exports.UINT64_LE, hex);
695
- function EnumV(e) {
696
- return (x) => x;
697
- }
698
- exports.EnumV = EnumV;
699
- function Enum(e) {
700
- const e1 = Object.entries(e).filter(([k, v]) => typeof v === 'number').sort(([, v1], [, v2]) => v2 - v1);
701
- const e2 = Object.fromEntries(e1.map(([k, v]) => [v, k]));
702
- function split_enum(x) {
703
- const results = [];
704
- for (const k of e1) {
705
- if (k[1] === 0) {
706
- if (x == 0)
707
- return k[0];
708
- break;
709
- }
710
- const n = Math.floor(x / k[1]);
711
- if (n) {
712
- results.push(n > 1 ? `${k[0]}*${n}` : k[0]);
713
- x %= k[1];
714
- if (!x)
715
- break;
716
- }
717
- }
718
- if (results.length == 0)
719
- return x.toString();
720
- if (x)
721
- results.push(x.toString());
722
- return results.join('+');
723
- }
724
- return (x) => e2[x] ?? split_enum(x);
725
- }
726
- exports.Enum = Enum;
727
- function Flags(e, noFalse) {
728
- const e1 = Object.entries(e).filter(([k, v]) => typeof v === 'number');
729
- return (x) => typeof x === 'bigint'
730
- ? e1.reduce((obj, [k, v]) => {
731
- const y = x & BigInt(v);
732
- if (y || !noFalse)
733
- obj[k] = !utils.isPow2(v) ? y / BigInt(utils.lowestSet(v)) : !!y;
734
- return obj;
735
- }, {})
736
- : e1.reduce((obj, [k, v]) => {
737
- const y = x & v;
738
- if (y || !noFalse)
739
- obj[k] = !utils.isPow2(v) ? y / utils.lowestSet(v) : !!y;
740
- return obj;
741
- }, {});
742
- }
743
- exports.Flags = Flags;
744
- function BitFields(bitfields) {
745
- return (x) => {
746
- if (typeof x === 'bigint') {
747
- let y = x;
748
- const obj = {};
749
- for (const i in bitfields) {
750
- const bf = bitfields[i];
751
- const bits = typeof bf === 'number' ? bf : bf[0];
752
- const v = y & ((1n << BigInt(bits)) - 1n);
753
- y >>= BigInt(bits);
754
- obj[i] = typeof bf === 'number' ? v : make(bf[1], Number(v));
755
- }
756
- return obj;
757
- }
758
- else {
759
- const obj = {};
760
- let y = x;
761
- for (const i in bitfields) {
762
- const bf = bitfields[i];
763
- const bits = typeof bf === 'number' ? bf : bf[0];
764
- const v = y & ((1 << bits) - 1);
765
- y >>= bits;
766
- obj[i] = typeof bf === 'number' ? v : make(bf[1], v);
767
- }
768
- return obj;
769
- }
770
- };
771
- }
772
- exports.BitFields = BitFields;
773
- //shortcuts
774
- function asEnum(type, e) {
775
- return as(type, Enum(e));
776
- }
777
- exports.asEnum = asEnum;
778
- function asFlags(type, e, noFalse = true) {
779
- return as(type, Flags(e, noFalse));
780
- }
781
- exports.asFlags = asFlags;
782
- function asInt(type, radix = 10) {
783
- return as(type, x => parseInt(x.trim(), radix));
784
- }
785
- exports.asInt = asInt;
786
- function asFixed(type, fracbits) {
787
- const scale = 1 / (1 << fracbits);
788
- return as(type, x => x * scale);
789
- }
790
- exports.asFixed = asFixed;
791
- //-----------------------------------------------------------------------------
792
- // stream_endian:
793
- // endianness stored in stream
794
- //-----------------------------------------------------------------------------
795
- class stream_endian extends stream {
796
- be;
797
- constructor(data, be) {
798
- super(data);
799
- this.be = be;
800
- }
801
- }
802
- exports.stream_endian = stream_endian;