@chr33s/pdf-restructure 5.0.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.
Files changed (93) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +323 -0
  3. package/dist/array.d.ts +15 -0
  4. package/dist/array.js +95 -0
  5. package/dist/array.js.map +1 -0
  6. package/dist/base.d.ts +4 -0
  7. package/dist/base.js +16 -0
  8. package/dist/base.js.map +1 -0
  9. package/dist/bitfield.d.ts +11 -0
  10. package/dist/bitfield.js +37 -0
  11. package/dist/bitfield.js.map +1 -0
  12. package/dist/boolean.d.ts +10 -0
  13. package/dist/boolean.js +18 -0
  14. package/dist/boolean.js.map +1 -0
  15. package/dist/buffer.d.ts +11 -0
  16. package/dist/buffer.js +31 -0
  17. package/dist/buffer.js.map +1 -0
  18. package/dist/decode-stream.d.ts +26 -0
  19. package/dist/decode-stream.js +84 -0
  20. package/dist/decode-stream.js.map +1 -0
  21. package/dist/encode-stream.d.ts +19 -0
  22. package/dist/encode-stream.js +137 -0
  23. package/dist/encode-stream.js.map +1 -0
  24. package/dist/enum.d.ts +11 -0
  25. package/dist/enum.js +25 -0
  26. package/dist/enum.js.map +1 -0
  27. package/dist/index.d.ts +17 -0
  28. package/dist/index.js +18 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/lazy-array.d.ts +22 -0
  31. package/dist/lazy-array.js +75 -0
  32. package/dist/lazy-array.js.map +1 -0
  33. package/dist/number.d.ts +51 -0
  34. package/dist/number.js +76 -0
  35. package/dist/number.js.map +1 -0
  36. package/dist/optional.d.ts +14 -0
  37. package/dist/optional.js +34 -0
  38. package/dist/optional.js.map +1 -0
  39. package/dist/pointer.d.ts +28 -0
  40. package/dist/pointer.js +160 -0
  41. package/dist/pointer.js.map +1 -0
  42. package/dist/reserved.d.ts +12 -0
  43. package/dist/reserved.js +23 -0
  44. package/dist/reserved.js.map +1 -0
  45. package/dist/string.d.ts +14 -0
  46. package/dist/string.js +123 -0
  47. package/dist/string.js.map +1 -0
  48. package/dist/struct.d.ts +15 -0
  49. package/dist/struct.js +93 -0
  50. package/dist/struct.js.map +1 -0
  51. package/dist/utils.d.ts +13 -0
  52. package/dist/utils.js +45 -0
  53. package/dist/utils.js.map +1 -0
  54. package/dist/versioned-struct.d.ts +18 -0
  55. package/dist/versioned-struct.js +129 -0
  56. package/dist/versioned-struct.js.map +1 -0
  57. package/package.json +47 -0
  58. package/src/array.ts +113 -0
  59. package/src/base.ts +17 -0
  60. package/src/bitfield.ts +46 -0
  61. package/src/boolean.ts +24 -0
  62. package/src/buffer.ts +40 -0
  63. package/src/decode-stream.ts +97 -0
  64. package/src/encode-stream.ts +161 -0
  65. package/src/enum.ts +32 -0
  66. package/src/index.ts +17 -0
  67. package/src/lazy-array.ts +91 -0
  68. package/src/number.ts +88 -0
  69. package/src/optional.ts +46 -0
  70. package/src/pointer.ts +204 -0
  71. package/src/reserved.ts +29 -0
  72. package/src/string.ts +154 -0
  73. package/src/struct.ts +127 -0
  74. package/src/utils.ts +55 -0
  75. package/src/versioned-struct.ts +174 -0
  76. package/test/array.test.ts +95 -0
  77. package/test/bitfield.test.ts +52 -0
  78. package/test/boolean.test.ts +35 -0
  79. package/test/buffer.test.ts +49 -0
  80. package/test/decode-stream.test.ts +104 -0
  81. package/test/encode-stream.test.ts +111 -0
  82. package/test/enum.test.ts +30 -0
  83. package/test/lazy-array.test.ts +70 -0
  84. package/test/number.test.ts +222 -0
  85. package/test/optional.test.ts +105 -0
  86. package/test/pointer.test.ts +248 -0
  87. package/test/reserved.test.ts +28 -0
  88. package/test/string.test.ts +114 -0
  89. package/test/struct.test.ts +164 -0
  90. package/test/versioned-struct.test.ts +462 -0
  91. package/tsconfig.json +9 -0
  92. package/tsconfig.typecheck.json +14 -0
  93. package/vitest.config.ts +12 -0
@@ -0,0 +1,84 @@
1
+ // Node back-compat.
2
+ const ENCODING_MAPPING = {
3
+ utf16le: "utf-16le",
4
+ ucs2: "utf-16le",
5
+ utf16be: "utf-16be",
6
+ };
7
+ export default class DecodeStream {
8
+ static TYPES = {
9
+ UInt8: 1,
10
+ UInt16: 2,
11
+ UInt24: 3,
12
+ UInt32: 4,
13
+ Int8: 1,
14
+ Int16: 2,
15
+ Int24: 3,
16
+ Int32: 4,
17
+ Float: 4,
18
+ Double: 8,
19
+ };
20
+ pos = 0;
21
+ length;
22
+ buffer;
23
+ view;
24
+ constructor(buffer) {
25
+ this.buffer = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
26
+ this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);
27
+ this.length = this.buffer.length;
28
+ }
29
+ readString(length, encoding = "ascii") {
30
+ encoding = ENCODING_MAPPING[encoding] || encoding;
31
+ const buf = this.readBuffer(length);
32
+ try {
33
+ const decoder = new TextDecoder(encoding);
34
+ return decoder.decode(buf);
35
+ }
36
+ catch {
37
+ return buf;
38
+ }
39
+ }
40
+ readBuffer(length) {
41
+ return this.buffer.slice(this.pos, (this.pos += length));
42
+ }
43
+ readUInt24BE() {
44
+ return (this.readUInt16BE() << 8) + this.readUInt8();
45
+ }
46
+ readUInt24LE() {
47
+ return this.readUInt16LE() + (this.readUInt8() << 16);
48
+ }
49
+ readInt24BE() {
50
+ return (this.readInt16BE() << 8) + this.readUInt8();
51
+ }
52
+ readInt24LE() {
53
+ return this.readUInt16LE() + (this.readInt8() << 16);
54
+ }
55
+ }
56
+ // Generate read methods from DataView prototype
57
+ for (const key of Object.getOwnPropertyNames(DataView.prototype)) {
58
+ if (key.slice(0, 3) === "get") {
59
+ let type = key.slice(3).replace("Ui", "UI");
60
+ if (type === "Float32") {
61
+ type = "Float";
62
+ }
63
+ else if (type === "Float64") {
64
+ type = "Double";
65
+ }
66
+ const bytes = DecodeStream.TYPES[type];
67
+ if (!bytes) {
68
+ continue;
69
+ }
70
+ DecodeStream.prototype["read" + type + (bytes === 1 ? "" : "BE")] = function () {
71
+ const ret = this.view[key](this.pos, false);
72
+ this.pos += bytes;
73
+ return ret;
74
+ };
75
+ if (bytes !== 1) {
76
+ DecodeStream.prototype["read" + type + "LE"] = function () {
77
+ const ret = this.view[key](this.pos, true);
78
+ this.pos += bytes;
79
+ return ret;
80
+ };
81
+ }
82
+ }
83
+ }
84
+ //# sourceMappingURL=decode-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode-stream.js","sourceRoot":"","sources":["../src/decode-stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export default class EncodeStream {
2
+ buffer: Uint8Array;
3
+ view: DataView;
4
+ pos: number;
5
+ [key: string]: any;
6
+ constructor(buffer: Uint8Array);
7
+ /**
8
+ * Ensure the buffer has enough space for the given number of bytes.
9
+ * If not, grow the buffer.
10
+ */
11
+ ensureCapacity(bytes: number): void;
12
+ writeBuffer(buffer: Uint8Array): void;
13
+ writeString(string: string, encoding?: string): void;
14
+ writeUInt24BE(val: number): void;
15
+ writeUInt24LE(val: number): void;
16
+ writeInt24BE(val: number): void;
17
+ writeInt24LE(val: number): void;
18
+ fill(val: number, length: number): void;
19
+ }
@@ -0,0 +1,137 @@
1
+ import DecodeStream from "./decode-stream.js";
2
+ const textEncoder = new TextEncoder();
3
+ const isBigEndian = new Uint8Array(new Uint16Array([0x1234]).buffer)[0] === 0x12;
4
+ export default class EncodeStream {
5
+ buffer;
6
+ view;
7
+ pos = 0;
8
+ constructor(buffer) {
9
+ this.buffer = buffer;
10
+ this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);
11
+ }
12
+ /**
13
+ * Ensure the buffer has enough space for the given number of bytes.
14
+ * If not, grow the buffer.
15
+ */
16
+ ensureCapacity(bytes) {
17
+ const needed = this.pos + bytes;
18
+ if (needed <= this.buffer.length) {
19
+ return;
20
+ }
21
+ // Grow by at least 2x or to the needed size, whichever is larger
22
+ const newSize = Math.max(this.buffer.length * 2, needed);
23
+ const newBuffer = new Uint8Array(newSize);
24
+ newBuffer.set(this.buffer);
25
+ this.buffer = newBuffer;
26
+ this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);
27
+ }
28
+ writeBuffer(buffer) {
29
+ this.ensureCapacity(buffer.length);
30
+ this.buffer.set(buffer, this.pos);
31
+ this.pos += buffer.length;
32
+ }
33
+ writeString(string, encoding = "ascii") {
34
+ let buf;
35
+ switch (encoding) {
36
+ case "utf16le":
37
+ case "utf16-le":
38
+ case "ucs2": // node treats this the same as utf16.
39
+ buf = stringToUtf16(string, isBigEndian);
40
+ break;
41
+ case "utf16be":
42
+ case "utf16-be":
43
+ buf = stringToUtf16(string, !isBigEndian);
44
+ break;
45
+ case "utf8":
46
+ buf = textEncoder.encode(string);
47
+ break;
48
+ case "ascii":
49
+ buf = stringToAscii(string);
50
+ break;
51
+ default:
52
+ throw new Error(`Unsupported encoding: ${encoding}`);
53
+ }
54
+ this.writeBuffer(buf);
55
+ }
56
+ writeUInt24BE(val) {
57
+ this.ensureCapacity(3);
58
+ this.buffer[this.pos++] = (val >>> 16) & 0xff;
59
+ this.buffer[this.pos++] = (val >>> 8) & 0xff;
60
+ this.buffer[this.pos++] = val & 0xff;
61
+ }
62
+ writeUInt24LE(val) {
63
+ this.ensureCapacity(3);
64
+ this.buffer[this.pos++] = val & 0xff;
65
+ this.buffer[this.pos++] = (val >>> 8) & 0xff;
66
+ this.buffer[this.pos++] = (val >>> 16) & 0xff;
67
+ }
68
+ writeInt24BE(val) {
69
+ if (val >= 0) {
70
+ this.writeUInt24BE(val);
71
+ }
72
+ else {
73
+ this.writeUInt24BE(val + 0xffffff + 1);
74
+ }
75
+ }
76
+ writeInt24LE(val) {
77
+ if (val >= 0) {
78
+ this.writeUInt24LE(val);
79
+ }
80
+ else {
81
+ this.writeUInt24LE(val + 0xffffff + 1);
82
+ }
83
+ }
84
+ fill(val, length) {
85
+ this.ensureCapacity(length);
86
+ this.buffer.fill(val, this.pos, this.pos + length);
87
+ this.pos += length;
88
+ }
89
+ }
90
+ function stringToUtf16(string, swap) {
91
+ const buf = new Uint16Array(string.length);
92
+ for (let i = 0; i < string.length; i++) {
93
+ let code = string.charCodeAt(i);
94
+ if (swap) {
95
+ code = (code >> 8) | ((code & 0xff) << 8);
96
+ }
97
+ buf[i] = code;
98
+ }
99
+ return new Uint8Array(buf.buffer);
100
+ }
101
+ function stringToAscii(string) {
102
+ const buf = new Uint8Array(string.length);
103
+ for (let i = 0; i < string.length; i++) {
104
+ // Match node.js behavior - encoding allows 8-bit rather than 7-bit.
105
+ buf[i] = string.charCodeAt(i);
106
+ }
107
+ return buf;
108
+ }
109
+ // Generate write methods from DataView prototype
110
+ for (const key of Object.getOwnPropertyNames(DataView.prototype)) {
111
+ if (key.slice(0, 3) === "set") {
112
+ let type = key.slice(3).replace("Ui", "UI");
113
+ if (type === "Float32") {
114
+ type = "Float";
115
+ }
116
+ else if (type === "Float64") {
117
+ type = "Double";
118
+ }
119
+ const bytes = DecodeStream.TYPES[type];
120
+ if (!bytes) {
121
+ continue;
122
+ }
123
+ EncodeStream.prototype["write" + type + (bytes === 1 ? "" : "BE")] = function (value) {
124
+ this.ensureCapacity(bytes);
125
+ this.view[key](this.pos, value, false);
126
+ this.pos += bytes;
127
+ };
128
+ if (bytes !== 1) {
129
+ EncodeStream.prototype["write" + type + "LE"] = function (value) {
130
+ this.ensureCapacity(bytes);
131
+ this.view[key](this.pos, value, true);
132
+ this.pos += bytes;
133
+ };
134
+ }
135
+ }
136
+ }
137
+ //# sourceMappingURL=encode-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encode-stream.js","sourceRoot":"","sources":["../src/encode-stream.ts"],"names":[],"mappings":"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"}
package/dist/enum.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ import Base from "./base.js";
2
+ import type DecodeStream from "./decode-stream.js";
3
+ import type EncodeStream from "./encode-stream.js";
4
+ export default class Enum<T = unknown> extends Base<T> {
5
+ type: any;
6
+ options: T[];
7
+ constructor(type: any, options?: T[]);
8
+ decode(stream: DecodeStream): T;
9
+ size(): number;
10
+ encode(stream: EncodeStream, value: T): void;
11
+ }
package/dist/enum.js ADDED
@@ -0,0 +1,25 @@
1
+ import Base from "./base.js";
2
+ export default class Enum extends Base {
3
+ type;
4
+ options;
5
+ constructor(type, options = []) {
6
+ super();
7
+ this.type = type;
8
+ this.options = options;
9
+ }
10
+ decode(stream) {
11
+ const index = this.type.decode(stream);
12
+ return this.options[index] ?? index;
13
+ }
14
+ size() {
15
+ return this.type.size();
16
+ }
17
+ encode(stream, value) {
18
+ const index = this.options.indexOf(value);
19
+ if (index === -1) {
20
+ throw new Error(`Unknown option in enum: ${String(value)}`);
21
+ }
22
+ this.type.encode(stream, index);
23
+ }
24
+ }
25
+ //# sourceMappingURL=enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enum.js","sourceRoot":"","sources":["../src/enum.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,CAAC,OAAO,OAAO,IAAkB,SAAQ,IAAO;IAC7C,IAAI,CAAM;IACV,OAAO,CAAM;IAEpB,YAAY,IAAS,EAAE,UAAe,EAAE;QACtC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,MAAoB;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;IACtC,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,MAAoB,EAAE,KAAQ;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ export { default as Array } from "./array.js";
2
+ export { default as Base } from "./base.js";
3
+ export { default as Bitfield } from "./bitfield.js";
4
+ export { default as Boolean } from "./boolean.js";
5
+ export { default as Buffer } from "./buffer.js";
6
+ export { default as DecodeStream } from "./decode-stream.js";
7
+ export { default as EncodeStream } from "./encode-stream.js";
8
+ export { default as Enum } from "./enum.js";
9
+ export { default as LazyArray } from "./lazy-array.js";
10
+ export * from "./number.js";
11
+ export { default as Optional } from "./optional.js";
12
+ export * from "./pointer.js";
13
+ export { default as Reserved } from "./reserved.js";
14
+ export { default as String } from "./string.js";
15
+ export { default as Struct } from "./struct.js";
16
+ export * from "./utils.js";
17
+ export { default as VersionedStruct } from "./versioned-struct.js";
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ export { default as Array } from "./array.js";
2
+ export { default as Base } from "./base.js";
3
+ export { default as Bitfield } from "./bitfield.js";
4
+ export { default as Boolean } from "./boolean.js";
5
+ export { default as Buffer } from "./buffer.js";
6
+ export { default as DecodeStream } from "./decode-stream.js";
7
+ export { default as EncodeStream } from "./encode-stream.js";
8
+ export { default as Enum } from "./enum.js";
9
+ export { default as LazyArray } from "./lazy-array.js";
10
+ export * from "./number.js";
11
+ export { default as Optional } from "./optional.js";
12
+ export * from "./pointer.js";
13
+ export { default as Reserved } from "./reserved.js";
14
+ export { default as String } from "./string.js";
15
+ export { default as Struct } from "./struct.js";
16
+ export * from "./utils.js";
17
+ export { default as VersionedStruct } from "./versioned-struct.js";
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvD,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import ArrayT from "./array.js";
2
+ import type DecodeStream from "./decode-stream.js";
3
+ import type EncodeStream from "./encode-stream.js";
4
+ declare const inspectSymbol: unique symbol;
5
+ export declare class LazyArray<T = unknown> {
6
+ #private;
7
+ type: any;
8
+ length: number;
9
+ stream: DecodeStream;
10
+ ctx: any;
11
+ constructor(type: any, length: number, stream: DecodeStream, ctx: any);
12
+ get(index: number): T | undefined;
13
+ toArray(): T[];
14
+ inspect(): string;
15
+ [inspectSymbol](): string;
16
+ }
17
+ export default class LazyArrayT<T = unknown> extends ArrayT<T, LazyArray<T>> {
18
+ decode(stream: DecodeStream, parent?: any): LazyArray<T>;
19
+ size(value?: LazyArray<T> | T[], ctx?: any): number;
20
+ encode(stream: EncodeStream, value: LazyArray<T> | T[], ctx?: any): void;
21
+ }
22
+ export {};
@@ -0,0 +1,75 @@
1
+ import ArrayT from "./array.js";
2
+ import { Number as NumberT } from "./number.js";
3
+ import { resolveLength } from "./utils.js";
4
+ // Node.js inspect symbol for custom formatting
5
+ const inspectSymbol = Symbol.for("nodejs.util.inspect.custom");
6
+ export class LazyArray {
7
+ #base;
8
+ #items = [];
9
+ type;
10
+ length;
11
+ stream;
12
+ ctx;
13
+ constructor(type, length, stream, ctx) {
14
+ this.type = type;
15
+ this.length = length;
16
+ this.stream = stream;
17
+ this.ctx = ctx;
18
+ this.#base = stream.pos;
19
+ }
20
+ get(index) {
21
+ if (index < 0 || index >= this.length) {
22
+ return undefined;
23
+ }
24
+ if (typeof this.#items[index] === "undefined") {
25
+ const pos = this.stream.pos;
26
+ this.stream.pos = this.#base + this.type.size(null, this.ctx) * index;
27
+ this.#items[index] = this.type.decode(this.stream, this.ctx);
28
+ this.stream.pos = pos;
29
+ }
30
+ return this.#items[index];
31
+ }
32
+ toArray() {
33
+ const values = [];
34
+ for (let i = 0; i < this.length; i += 1) {
35
+ const value = this.get(i);
36
+ if (typeof value !== "undefined") {
37
+ values.push(value);
38
+ }
39
+ }
40
+ return values;
41
+ }
42
+ inspect() {
43
+ return JSON.stringify(this.toArray());
44
+ }
45
+ [inspectSymbol]() {
46
+ return JSON.stringify(this.toArray());
47
+ }
48
+ }
49
+ export default class LazyArrayT extends ArrayT {
50
+ decode(stream, parent) {
51
+ const pos = stream.pos;
52
+ const length = resolveLength(this.length, stream, parent);
53
+ let ctx = parent;
54
+ if (this.length instanceof NumberT) {
55
+ ctx = {
56
+ parent,
57
+ _startOffset: pos,
58
+ _currentOffset: 0,
59
+ _length: length,
60
+ };
61
+ }
62
+ const result = new LazyArray(this.type, length, stream, ctx);
63
+ stream.pos += length * this.type.size(null, ctx);
64
+ return result;
65
+ }
66
+ size(value, ctx) {
67
+ const resolved = value instanceof LazyArray ? value.toArray() : value;
68
+ return super.size(resolved, ctx);
69
+ }
70
+ encode(stream, value, ctx) {
71
+ const resolved = value instanceof LazyArray ? value.toArray() : value;
72
+ super.encode(stream, resolved, ctx);
73
+ }
74
+ }
75
+ //# sourceMappingURL=lazy-array.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy-array.js","sourceRoot":"","sources":["../src/lazy-array.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import Base from "./base.js";
2
+ import DecodeStream from "./decode-stream.js";
3
+ import type EncodeStream from "./encode-stream.js";
4
+ export declare class NumberT extends Base<number> {
5
+ #private;
6
+ type: string;
7
+ endian: "BE" | "LE";
8
+ constructor(type: string, endian?: "BE" | "LE");
9
+ size(): number;
10
+ decode(stream: DecodeStream): number;
11
+ encode(stream: EncodeStream, value: number): void;
12
+ }
13
+ export declare const Number: typeof NumberT;
14
+ export declare const uint8: NumberT;
15
+ export declare const uint16be: NumberT;
16
+ export declare const uint16le: NumberT;
17
+ export declare const uint16: NumberT;
18
+ export declare const uint24be: NumberT;
19
+ export declare const uint24le: NumberT;
20
+ export declare const uint24: NumberT;
21
+ export declare const uint32be: NumberT;
22
+ export declare const uint32le: NumberT;
23
+ export declare const uint32: NumberT;
24
+ export declare const int8: NumberT;
25
+ export declare const int16be: NumberT;
26
+ export declare const int16le: NumberT;
27
+ export declare const int16: NumberT;
28
+ export declare const int24be: NumberT;
29
+ export declare const int24le: NumberT;
30
+ export declare const int24: NumberT;
31
+ export declare const int32be: NumberT;
32
+ export declare const int32le: NumberT;
33
+ export declare const int32: NumberT;
34
+ export declare const floatbe: NumberT;
35
+ export declare const floatle: NumberT;
36
+ export declare const float: NumberT;
37
+ export declare const doublebe: NumberT;
38
+ export declare const doublele: NumberT;
39
+ export declare const double: NumberT;
40
+ export declare class Fixed extends NumberT {
41
+ #private;
42
+ constructor(size: number, endian: "BE" | "LE", fracBits?: number);
43
+ decode(stream: DecodeStream): number;
44
+ encode(stream: EncodeStream, value: number): void;
45
+ }
46
+ export declare const fixed16be: Fixed;
47
+ export declare const fixed16le: Fixed;
48
+ export declare const fixed16: Fixed;
49
+ export declare const fixed32be: Fixed;
50
+ export declare const fixed32le: Fixed;
51
+ export declare const fixed32: Fixed;
package/dist/number.js ADDED
@@ -0,0 +1,76 @@
1
+ import Base from "./base.js";
2
+ import DecodeStream from "./decode-stream.js";
3
+ export class NumberT extends Base {
4
+ #fn;
5
+ type;
6
+ endian;
7
+ constructor(type, endian = "BE") {
8
+ super();
9
+ this.type = type;
10
+ this.endian = endian;
11
+ this.#fn = type;
12
+ if (this.type[this.type.length - 1] !== "8") {
13
+ this.#fn += this.endian;
14
+ }
15
+ }
16
+ size() {
17
+ const size = DecodeStream.TYPES[this.type];
18
+ if (!size) {
19
+ throw new Error(`Unknown number type: ${this.type}`);
20
+ }
21
+ return size;
22
+ }
23
+ decode(stream) {
24
+ return stream[`read${this.#fn}`]();
25
+ }
26
+ encode(stream, value) {
27
+ stream[`write${this.#fn}`](value);
28
+ }
29
+ }
30
+ export const Number = NumberT;
31
+ export const uint8 = new NumberT("UInt8");
32
+ export const uint16be = new NumberT("UInt16", "BE");
33
+ export const uint16le = new NumberT("UInt16", "LE");
34
+ export const uint16 = uint16be;
35
+ export const uint24be = new NumberT("UInt24", "BE");
36
+ export const uint24le = new NumberT("UInt24", "LE");
37
+ export const uint24 = uint24be;
38
+ export const uint32be = new NumberT("UInt32", "BE");
39
+ export const uint32le = new NumberT("UInt32", "LE");
40
+ export const uint32 = uint32be;
41
+ export const int8 = new NumberT("Int8");
42
+ export const int16be = new NumberT("Int16", "BE");
43
+ export const int16le = new NumberT("Int16", "LE");
44
+ export const int16 = int16be;
45
+ export const int24be = new NumberT("Int24", "BE");
46
+ export const int24le = new NumberT("Int24", "LE");
47
+ export const int24 = int24be;
48
+ export const int32be = new NumberT("Int32", "BE");
49
+ export const int32le = new NumberT("Int32", "LE");
50
+ export const int32 = int32be;
51
+ export const floatbe = new NumberT("Float", "BE");
52
+ export const floatle = new NumberT("Float", "LE");
53
+ export const float = floatbe;
54
+ export const doublebe = new NumberT("Double", "BE");
55
+ export const doublele = new NumberT("Double", "LE");
56
+ export const double = doublebe;
57
+ export class Fixed extends NumberT {
58
+ #point;
59
+ constructor(size, endian, fracBits = size >> 1) {
60
+ super(`Int${size}`, endian);
61
+ this.#point = 1 << fracBits;
62
+ }
63
+ decode(stream) {
64
+ return super.decode(stream) / this.#point;
65
+ }
66
+ encode(stream, value) {
67
+ super.encode(stream, (value * this.#point) | 0);
68
+ }
69
+ }
70
+ export const fixed16be = new Fixed(16, "BE");
71
+ export const fixed16le = new Fixed(16, "LE");
72
+ export const fixed16 = fixed16be;
73
+ export const fixed32be = new Fixed(32, "BE");
74
+ export const fixed32le = new Fixed(32, "LE");
75
+ export const fixed32 = fixed32be;
76
+ //# sourceMappingURL=number.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number.js","sourceRoot":"","sources":["../src/number.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import Base from "./base.js";
2
+ import type DecodeStream from "./decode-stream.js";
3
+ import type EncodeStream from "./encode-stream.js";
4
+ type Condition = boolean | ((this: any, parent?: any) => boolean);
5
+ export default class Optional<T = unknown> extends Base<T | undefined> {
6
+ #private;
7
+ type: any;
8
+ condition: Condition;
9
+ constructor(type: any, condition?: Condition);
10
+ decode(stream: DecodeStream, parent?: any): T | undefined;
11
+ size(value?: T, parent?: any): number;
12
+ encode(stream: EncodeStream, value: T, parent?: any): void;
13
+ }
14
+ export {};
@@ -0,0 +1,34 @@
1
+ import Base from "./base.js";
2
+ export default class Optional extends Base {
3
+ type;
4
+ condition;
5
+ constructor(type, condition = true) {
6
+ super();
7
+ this.type = type;
8
+ this.condition = condition;
9
+ }
10
+ #evaluateCondition(parent) {
11
+ if (typeof this.condition === "function") {
12
+ return this.condition.call(parent, parent);
13
+ }
14
+ return this.condition;
15
+ }
16
+ decode(stream, parent) {
17
+ if (this.#evaluateCondition(parent)) {
18
+ return this.type.decode(stream, parent);
19
+ }
20
+ return undefined;
21
+ }
22
+ size(value, parent) {
23
+ if (this.#evaluateCondition(parent)) {
24
+ return this.type.size(value, parent);
25
+ }
26
+ return 0;
27
+ }
28
+ encode(stream, value, parent) {
29
+ if (this.#evaluateCondition(parent)) {
30
+ this.type.encode(stream, value, parent);
31
+ }
32
+ }
33
+ }
34
+ //# sourceMappingURL=optional.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optional.js","sourceRoot":"","sources":["../src/optional.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,MAAM,CAAC,OAAO,OAAO,QAAsB,SAAQ,IAAmB;IAC7D,IAAI,CAAM;IACV,SAAS,CAAY;IAE5B,YAAY,IAAS,EAAE,YAAuB,IAAI;QAChD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,kBAAkB,CAAC,MAAY;QAC7B,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,MAAoB,EAAE,MAAY;QACvC,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,KAAS,EAAE,MAAY;QAC1B,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,CAAC,MAAoB,EAAE,KAAQ,EAAE,MAAY;QACjD,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;CACF"}