@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.
- package/LICENSE.md +21 -0
- package/README.md +323 -0
- package/dist/array.d.ts +15 -0
- package/dist/array.js +95 -0
- package/dist/array.js.map +1 -0
- package/dist/base.d.ts +4 -0
- package/dist/base.js +16 -0
- package/dist/base.js.map +1 -0
- package/dist/bitfield.d.ts +11 -0
- package/dist/bitfield.js +37 -0
- package/dist/bitfield.js.map +1 -0
- package/dist/boolean.d.ts +10 -0
- package/dist/boolean.js +18 -0
- package/dist/boolean.js.map +1 -0
- package/dist/buffer.d.ts +11 -0
- package/dist/buffer.js +31 -0
- package/dist/buffer.js.map +1 -0
- package/dist/decode-stream.d.ts +26 -0
- package/dist/decode-stream.js +84 -0
- package/dist/decode-stream.js.map +1 -0
- package/dist/encode-stream.d.ts +19 -0
- package/dist/encode-stream.js +137 -0
- package/dist/encode-stream.js.map +1 -0
- package/dist/enum.d.ts +11 -0
- package/dist/enum.js +25 -0
- package/dist/enum.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/lazy-array.d.ts +22 -0
- package/dist/lazy-array.js +75 -0
- package/dist/lazy-array.js.map +1 -0
- package/dist/number.d.ts +51 -0
- package/dist/number.js +76 -0
- package/dist/number.js.map +1 -0
- package/dist/optional.d.ts +14 -0
- package/dist/optional.js +34 -0
- package/dist/optional.js.map +1 -0
- package/dist/pointer.d.ts +28 -0
- package/dist/pointer.js +160 -0
- package/dist/pointer.js.map +1 -0
- package/dist/reserved.d.ts +12 -0
- package/dist/reserved.js +23 -0
- package/dist/reserved.js.map +1 -0
- package/dist/string.d.ts +14 -0
- package/dist/string.js +123 -0
- package/dist/string.js.map +1 -0
- package/dist/struct.d.ts +15 -0
- package/dist/struct.js +93 -0
- package/dist/struct.js.map +1 -0
- package/dist/utils.d.ts +13 -0
- package/dist/utils.js +45 -0
- package/dist/utils.js.map +1 -0
- package/dist/versioned-struct.d.ts +18 -0
- package/dist/versioned-struct.js +129 -0
- package/dist/versioned-struct.js.map +1 -0
- package/package.json +47 -0
- package/src/array.ts +113 -0
- package/src/base.ts +17 -0
- package/src/bitfield.ts +46 -0
- package/src/boolean.ts +24 -0
- package/src/buffer.ts +40 -0
- package/src/decode-stream.ts +97 -0
- package/src/encode-stream.ts +161 -0
- package/src/enum.ts +32 -0
- package/src/index.ts +17 -0
- package/src/lazy-array.ts +91 -0
- package/src/number.ts +88 -0
- package/src/optional.ts +46 -0
- package/src/pointer.ts +204 -0
- package/src/reserved.ts +29 -0
- package/src/string.ts +154 -0
- package/src/struct.ts +127 -0
- package/src/utils.ts +55 -0
- package/src/versioned-struct.ts +174 -0
- package/test/array.test.ts +95 -0
- package/test/bitfield.test.ts +52 -0
- package/test/boolean.test.ts +35 -0
- package/test/buffer.test.ts +49 -0
- package/test/decode-stream.test.ts +104 -0
- package/test/encode-stream.test.ts +111 -0
- package/test/enum.test.ts +30 -0
- package/test/lazy-array.test.ts +70 -0
- package/test/number.test.ts +222 -0
- package/test/optional.test.ts +105 -0
- package/test/pointer.test.ts +248 -0
- package/test/reserved.test.ts +28 -0
- package/test/string.test.ts +114 -0
- package/test/struct.test.ts +164 -0
- package/test/versioned-struct.test.ts +462 -0
- package/tsconfig.json +9 -0
- package/tsconfig.typecheck.json +14 -0
- package/vitest.config.ts +12 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import Base from "./base.js";
|
|
2
|
+
import type DecodeStream from "./decode-stream.js";
|
|
3
|
+
import type EncodeStream from "./encode-stream.js";
|
|
4
|
+
export type PointerType = "local" | "immediate" | "parent" | "global";
|
|
5
|
+
export interface PointerOptions {
|
|
6
|
+
type?: PointerType;
|
|
7
|
+
allowNull?: boolean;
|
|
8
|
+
nullValue?: number;
|
|
9
|
+
relativeTo?: string | ((ctx: any) => number);
|
|
10
|
+
lazy?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare class Pointer extends Base<any> {
|
|
13
|
+
#private;
|
|
14
|
+
options: Required<Omit<PointerOptions, "relativeTo">> & {
|
|
15
|
+
relativeTo?: string | ((ctx: any) => number);
|
|
16
|
+
};
|
|
17
|
+
type: any;
|
|
18
|
+
offsetType: any;
|
|
19
|
+
constructor(offsetType: any, type: any, options?: PointerOptions);
|
|
20
|
+
decode(stream: DecodeStream, ctx: any): any;
|
|
21
|
+
size(val?: any, ctx?: any): number;
|
|
22
|
+
encode(stream: EncodeStream, val: any, ctx: any): void;
|
|
23
|
+
}
|
|
24
|
+
export declare class VoidPointer {
|
|
25
|
+
type: any;
|
|
26
|
+
value: any;
|
|
27
|
+
constructor(type: any, value: any);
|
|
28
|
+
}
|
package/dist/pointer.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import Base from "./base.js";
|
|
2
|
+
import { PropertyDescriptor } from "./utils.js";
|
|
3
|
+
export class Pointer extends Base {
|
|
4
|
+
options;
|
|
5
|
+
type;
|
|
6
|
+
offsetType;
|
|
7
|
+
constructor(offsetType, type, options = {}) {
|
|
8
|
+
super();
|
|
9
|
+
this.offsetType = offsetType;
|
|
10
|
+
this.type = type === "void" ? null : type;
|
|
11
|
+
this.options = {
|
|
12
|
+
type: "local",
|
|
13
|
+
allowNull: true,
|
|
14
|
+
nullValue: 0,
|
|
15
|
+
lazy: false,
|
|
16
|
+
...options,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
#relativeToGetter(ctx) {
|
|
20
|
+
const { relativeTo } = this.options;
|
|
21
|
+
if (!relativeTo) {
|
|
22
|
+
return 0;
|
|
23
|
+
}
|
|
24
|
+
if (typeof relativeTo === "function") {
|
|
25
|
+
return relativeTo(ctx) ?? 0;
|
|
26
|
+
}
|
|
27
|
+
return relativeTo.split(".").reduce((obj, prop) => obj?.[prop], ctx) ?? 0;
|
|
28
|
+
}
|
|
29
|
+
decode(stream, ctx) {
|
|
30
|
+
const offset = this.offsetType.decode(stream, ctx);
|
|
31
|
+
if (offset === this.options.nullValue && this.options.allowNull) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
let relative = 0;
|
|
35
|
+
switch (this.options.type) {
|
|
36
|
+
case "local":
|
|
37
|
+
relative = ctx?._startOffset ?? 0;
|
|
38
|
+
break;
|
|
39
|
+
case "immediate":
|
|
40
|
+
relative = stream.pos - this.offsetType.size();
|
|
41
|
+
break;
|
|
42
|
+
case "parent":
|
|
43
|
+
relative = ctx?.parent?._startOffset ?? 0;
|
|
44
|
+
break;
|
|
45
|
+
default: {
|
|
46
|
+
let current = ctx;
|
|
47
|
+
while (current?.parent) {
|
|
48
|
+
current = current.parent;
|
|
49
|
+
}
|
|
50
|
+
relative = current?._startOffset ?? 0;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (this.options.relativeTo) {
|
|
54
|
+
relative += this.#relativeToGetter(ctx);
|
|
55
|
+
}
|
|
56
|
+
const ptr = offset + relative;
|
|
57
|
+
if (this.type) {
|
|
58
|
+
let value;
|
|
59
|
+
let decoded = false;
|
|
60
|
+
const decodeValue = () => {
|
|
61
|
+
if (decoded) {
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
const pos = stream.pos;
|
|
65
|
+
stream.pos = ptr;
|
|
66
|
+
value = this.type.decode(stream, ctx);
|
|
67
|
+
stream.pos = pos;
|
|
68
|
+
decoded = true;
|
|
69
|
+
return value;
|
|
70
|
+
};
|
|
71
|
+
if (this.options.lazy) {
|
|
72
|
+
return new PropertyDescriptor({ get: decodeValue });
|
|
73
|
+
}
|
|
74
|
+
return decodeValue();
|
|
75
|
+
}
|
|
76
|
+
return ptr;
|
|
77
|
+
}
|
|
78
|
+
size(val, ctx) {
|
|
79
|
+
const parent = ctx;
|
|
80
|
+
if (ctx) {
|
|
81
|
+
switch (this.options.type) {
|
|
82
|
+
case "local":
|
|
83
|
+
case "immediate":
|
|
84
|
+
break;
|
|
85
|
+
case "parent":
|
|
86
|
+
ctx = ctx.parent;
|
|
87
|
+
break;
|
|
88
|
+
default:
|
|
89
|
+
while (ctx.parent) {
|
|
90
|
+
ctx = ctx.parent;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
let type = this.type;
|
|
95
|
+
if (!type) {
|
|
96
|
+
if (!(val instanceof VoidPointer)) {
|
|
97
|
+
throw new Error("Must be a VoidPointer");
|
|
98
|
+
}
|
|
99
|
+
type = val.type;
|
|
100
|
+
val = val.value;
|
|
101
|
+
}
|
|
102
|
+
if (val != null && ctx) {
|
|
103
|
+
ctx.pointerSize += type.size(val, parent);
|
|
104
|
+
}
|
|
105
|
+
return this.offsetType.size();
|
|
106
|
+
}
|
|
107
|
+
encode(stream, val, ctx) {
|
|
108
|
+
const parent = ctx;
|
|
109
|
+
if (val == null) {
|
|
110
|
+
this.offsetType.encode(stream, this.options.nullValue);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
let relative;
|
|
114
|
+
switch (this.options.type) {
|
|
115
|
+
case "local":
|
|
116
|
+
relative = ctx.startOffset;
|
|
117
|
+
break;
|
|
118
|
+
case "immediate":
|
|
119
|
+
relative = stream.pos + this.offsetType.size(val, parent);
|
|
120
|
+
break;
|
|
121
|
+
case "parent":
|
|
122
|
+
ctx = ctx.parent;
|
|
123
|
+
relative = ctx.startOffset;
|
|
124
|
+
break;
|
|
125
|
+
default:
|
|
126
|
+
relative = 0;
|
|
127
|
+
while (ctx.parent) {
|
|
128
|
+
ctx = ctx.parent;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (this.options.relativeTo) {
|
|
132
|
+
const target = parent?.val ?? parent;
|
|
133
|
+
relative += this.#relativeToGetter(target);
|
|
134
|
+
}
|
|
135
|
+
this.offsetType.encode(stream, ctx.pointerOffset - relative);
|
|
136
|
+
let type = this.type;
|
|
137
|
+
if (!type) {
|
|
138
|
+
if (!(val instanceof VoidPointer)) {
|
|
139
|
+
throw new Error("Must be a VoidPointer");
|
|
140
|
+
}
|
|
141
|
+
type = val.type;
|
|
142
|
+
val = val.value;
|
|
143
|
+
}
|
|
144
|
+
ctx.pointers.push({
|
|
145
|
+
type,
|
|
146
|
+
val,
|
|
147
|
+
parent,
|
|
148
|
+
});
|
|
149
|
+
ctx.pointerOffset += type.size(val, parent);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
export class VoidPointer {
|
|
153
|
+
type;
|
|
154
|
+
value;
|
|
155
|
+
constructor(type, value) {
|
|
156
|
+
this.type = type;
|
|
157
|
+
this.value = value;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=pointer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pointer.js","sourceRoot":"","sources":["../src/pointer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import Base from "./base.js";
|
|
2
|
+
import type DecodeStream from "./decode-stream.js";
|
|
3
|
+
import type EncodeStream from "./encode-stream.js";
|
|
4
|
+
import { type LengthLike } from "./utils.js";
|
|
5
|
+
export default class Reserved extends Base<void> {
|
|
6
|
+
type: any;
|
|
7
|
+
count: LengthLike | number;
|
|
8
|
+
constructor(type: any, count?: LengthLike | number);
|
|
9
|
+
decode(stream: DecodeStream, parent?: any): undefined;
|
|
10
|
+
size(_data?: any, parent?: any): number;
|
|
11
|
+
encode(stream: EncodeStream, _val?: any, parent?: any): void;
|
|
12
|
+
}
|
package/dist/reserved.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import Base from "./base.js";
|
|
2
|
+
import { resolveLength } from "./utils.js";
|
|
3
|
+
export default class Reserved extends Base {
|
|
4
|
+
type;
|
|
5
|
+
count;
|
|
6
|
+
constructor(type, count = 1) {
|
|
7
|
+
super();
|
|
8
|
+
this.type = type;
|
|
9
|
+
this.count = count;
|
|
10
|
+
}
|
|
11
|
+
decode(stream, parent) {
|
|
12
|
+
stream.pos += this.size(undefined, parent);
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
size(_data, parent) {
|
|
16
|
+
const count = resolveLength(this.count, undefined, parent);
|
|
17
|
+
return this.type.size() * count;
|
|
18
|
+
}
|
|
19
|
+
encode(stream, _val, parent) {
|
|
20
|
+
stream.fill(0, this.size(undefined, parent));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=reserved.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reserved.js","sourceRoot":"","sources":["../src/reserved.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,aAAa,EAAmB,MAAM,YAAY,CAAC;AAE5D,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,IAAU;IACvC,IAAI,CAAM;IACV,KAAK,CAAsB;IAElC,YAAY,IAAS,EAAE,QAA6B,CAAC;QACnD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,MAAoB,EAAE,MAAY;QACvC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,KAAW,EAAE,MAAY;QAC5B,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAmB,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,MAAoB,EAAE,IAAU,EAAE,MAAY;QACnD,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;CACF"}
|
package/dist/string.d.ts
ADDED
|
@@ -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
|
+
import { type LengthLike } from "./utils.js";
|
|
5
|
+
type EncodingResolver = string | ((this: any, parent?: any) => string | undefined);
|
|
6
|
+
export default class StringT extends Base<string | Uint8Array> {
|
|
7
|
+
length?: LengthLike;
|
|
8
|
+
encoding: EncodingResolver;
|
|
9
|
+
constructor(length?: LengthLike, encoding?: EncodingResolver);
|
|
10
|
+
decode(stream: DecodeStream, parent?: any): string | Uint8Array;
|
|
11
|
+
size(value?: string, parent?: any): number;
|
|
12
|
+
encode(stream: EncodeStream, value: string, parent?: any): void;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
package/dist/string.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import Base from "./base.js";
|
|
2
|
+
import { Number as NumberT } from "./number.js";
|
|
3
|
+
import { resolveLength } from "./utils.js";
|
|
4
|
+
const ENCODING_ALIASES = {
|
|
5
|
+
"utf-8": "utf8",
|
|
6
|
+
utf8: "utf8",
|
|
7
|
+
ascii: "ascii",
|
|
8
|
+
utf16: "utf16le",
|
|
9
|
+
"utf-16": "utf16le",
|
|
10
|
+
utf16le: "utf16le",
|
|
11
|
+
"utf-16le": "utf16le",
|
|
12
|
+
"utf16-le": "utf16le",
|
|
13
|
+
"utf-16-le": "utf16le",
|
|
14
|
+
utf16be: "utf16be",
|
|
15
|
+
"utf-16be": "utf16be",
|
|
16
|
+
"utf16-be": "utf16be",
|
|
17
|
+
"utf-16-be": "utf16be",
|
|
18
|
+
ucs2: "ucs2",
|
|
19
|
+
};
|
|
20
|
+
function normalizeEncoding(encoding) {
|
|
21
|
+
if (!encoding) {
|
|
22
|
+
return "ascii";
|
|
23
|
+
}
|
|
24
|
+
const key = encoding.toLowerCase();
|
|
25
|
+
return ENCODING_ALIASES[key] ?? key;
|
|
26
|
+
}
|
|
27
|
+
function resolveEncodingValue(resolver, parent, useParentVal = false) {
|
|
28
|
+
if (typeof resolver === "function") {
|
|
29
|
+
const ctx = useParentVal ? (parent?.val ?? parent) : parent;
|
|
30
|
+
return normalizeEncoding(resolver.call(ctx, ctx));
|
|
31
|
+
}
|
|
32
|
+
return normalizeEncoding(resolver);
|
|
33
|
+
}
|
|
34
|
+
function encodingWidth(encoding) {
|
|
35
|
+
switch (encoding) {
|
|
36
|
+
case "ascii":
|
|
37
|
+
case "utf8":
|
|
38
|
+
return 1;
|
|
39
|
+
case "utf16le":
|
|
40
|
+
case "utf16be":
|
|
41
|
+
case "ucs2":
|
|
42
|
+
return 2;
|
|
43
|
+
default:
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const textEncoder = new TextEncoder();
|
|
48
|
+
function byteLength(string, encoding) {
|
|
49
|
+
switch (encoding) {
|
|
50
|
+
case "utf8":
|
|
51
|
+
return textEncoder.encode(string).length;
|
|
52
|
+
case "utf16le":
|
|
53
|
+
case "utf16be":
|
|
54
|
+
case "ucs2":
|
|
55
|
+
return string.length * 2;
|
|
56
|
+
case "ascii":
|
|
57
|
+
default:
|
|
58
|
+
return string.length;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export default class StringT extends Base {
|
|
62
|
+
length;
|
|
63
|
+
encoding;
|
|
64
|
+
constructor(length, encoding = "ascii") {
|
|
65
|
+
super();
|
|
66
|
+
this.length = length;
|
|
67
|
+
this.encoding = encoding;
|
|
68
|
+
}
|
|
69
|
+
decode(stream, parent) {
|
|
70
|
+
const encoding = resolveEncodingValue(this.encoding, parent);
|
|
71
|
+
const width = encodingWidth(encoding);
|
|
72
|
+
let length;
|
|
73
|
+
if (typeof this.length !== "undefined") {
|
|
74
|
+
length = resolveLength(this.length, stream, parent);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const { buffer } = stream;
|
|
78
|
+
let pos = stream.pos;
|
|
79
|
+
const limit = stream.length;
|
|
80
|
+
const maxPos = Math.max(limit - width + 1, stream.pos);
|
|
81
|
+
while (pos < maxPos && (buffer[pos] !== 0x00 || (width === 2 && buffer[pos + 1] !== 0x00))) {
|
|
82
|
+
pos += width;
|
|
83
|
+
}
|
|
84
|
+
length = Math.max(pos - stream.pos, 0);
|
|
85
|
+
}
|
|
86
|
+
const value = stream.readString(length, encoding);
|
|
87
|
+
if (typeof this.length === "undefined" && stream.pos < stream.length) {
|
|
88
|
+
stream.pos += width;
|
|
89
|
+
}
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
size(value, parent) {
|
|
93
|
+
if (value == null) {
|
|
94
|
+
return resolveLength(this.length, undefined, parent);
|
|
95
|
+
}
|
|
96
|
+
const encoding = resolveEncodingValue(this.encoding, parent, true);
|
|
97
|
+
let size = byteLength(value, encoding);
|
|
98
|
+
if (this.length instanceof NumberT) {
|
|
99
|
+
size += this.length.size();
|
|
100
|
+
}
|
|
101
|
+
if (typeof this.length === "undefined") {
|
|
102
|
+
size += encodingWidth(encoding);
|
|
103
|
+
}
|
|
104
|
+
return size;
|
|
105
|
+
}
|
|
106
|
+
encode(stream, value, parent) {
|
|
107
|
+
const encoding = resolveEncodingValue(this.encoding, parent, true);
|
|
108
|
+
const width = encodingWidth(encoding);
|
|
109
|
+
if (this.length instanceof NumberT) {
|
|
110
|
+
this.length.encode(stream, byteLength(value, encoding));
|
|
111
|
+
}
|
|
112
|
+
stream.writeString(value, encoding);
|
|
113
|
+
if (typeof this.length === "undefined") {
|
|
114
|
+
if (width === 2) {
|
|
115
|
+
stream.writeUInt16LE(0x0000);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
stream.writeUInt8(0x00);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.js","sourceRoot":"","sources":["../src/string.ts"],"names":[],"mappings":"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"}
|
package/dist/struct.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type DecodeStream from "./decode-stream.js";
|
|
2
|
+
import type EncodeStream from "./encode-stream.js";
|
|
3
|
+
type FieldMap = Record<string, any>;
|
|
4
|
+
export default class Struct<T extends Record<string, any> = Record<string, any>> {
|
|
5
|
+
process?: (this: T, stream: DecodeStream) => void;
|
|
6
|
+
preEncode?: (this: T, stream?: EncodeStream) => void;
|
|
7
|
+
fields: FieldMap;
|
|
8
|
+
constructor(fields?: FieldMap);
|
|
9
|
+
decode(stream: DecodeStream, parent?: any, length?: number): T;
|
|
10
|
+
protected _setup(stream: DecodeStream, parent: any, length: number): Record<string, any>;
|
|
11
|
+
protected _parseFields(stream: DecodeStream, target: Record<string, any>, fields: FieldMap): void;
|
|
12
|
+
size(val?: T, parent?: any, includePointers?: boolean): number;
|
|
13
|
+
encode(stream: EncodeStream, val: T, parent?: any): void;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
package/dist/struct.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { PropertyDescriptor } from "./utils.js";
|
|
2
|
+
export default class Struct {
|
|
3
|
+
process;
|
|
4
|
+
preEncode;
|
|
5
|
+
fields;
|
|
6
|
+
constructor(fields = {}) {
|
|
7
|
+
this.fields = fields;
|
|
8
|
+
}
|
|
9
|
+
decode(stream, parent, length = 0) {
|
|
10
|
+
const result = this._setup(stream, parent, length);
|
|
11
|
+
this._parseFields(stream, result, this.fields);
|
|
12
|
+
if (this.process) {
|
|
13
|
+
this.process.call(result, stream);
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
_setup(stream, parent, length) {
|
|
18
|
+
const result = {};
|
|
19
|
+
Object.defineProperties(result, {
|
|
20
|
+
parent: { value: parent },
|
|
21
|
+
_startOffset: { value: stream.pos },
|
|
22
|
+
_currentOffset: { value: 0, writable: true },
|
|
23
|
+
_length: { value: length },
|
|
24
|
+
});
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
_parseFields(stream, target, fields) {
|
|
28
|
+
for (const [key, type] of Object.entries(fields)) {
|
|
29
|
+
let value;
|
|
30
|
+
if (typeof type === "function" && typeof type.decode !== "function") {
|
|
31
|
+
value = type.call(target, target);
|
|
32
|
+
}
|
|
33
|
+
else if (type && typeof type.decode === "function") {
|
|
34
|
+
value = type.decode(stream, target);
|
|
35
|
+
}
|
|
36
|
+
if (typeof value !== "undefined") {
|
|
37
|
+
if (value instanceof PropertyDescriptor) {
|
|
38
|
+
Object.defineProperty(target, key, value);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
target[key] = value;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
target._currentOffset = stream.pos - target._startOffset;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
size(val = {}, parent, includePointers = true) {
|
|
48
|
+
const ctx = {
|
|
49
|
+
parent,
|
|
50
|
+
val,
|
|
51
|
+
pointerSize: 0,
|
|
52
|
+
};
|
|
53
|
+
if (this.preEncode) {
|
|
54
|
+
this.preEncode.call(val);
|
|
55
|
+
}
|
|
56
|
+
let total = 0;
|
|
57
|
+
for (const [key, type] of Object.entries(this.fields)) {
|
|
58
|
+
if (type && typeof type.size === "function") {
|
|
59
|
+
const fieldVal = val ? val[key] : undefined;
|
|
60
|
+
total += type.size(fieldVal, ctx);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (includePointers) {
|
|
64
|
+
total += ctx.pointerSize;
|
|
65
|
+
}
|
|
66
|
+
return total;
|
|
67
|
+
}
|
|
68
|
+
encode(stream, val, parent) {
|
|
69
|
+
if (this.preEncode) {
|
|
70
|
+
this.preEncode.call(val, stream);
|
|
71
|
+
}
|
|
72
|
+
const ctx = {
|
|
73
|
+
pointers: [],
|
|
74
|
+
startOffset: stream.pos,
|
|
75
|
+
pointerOffset: 0,
|
|
76
|
+
pointerSize: 0,
|
|
77
|
+
parent,
|
|
78
|
+
val,
|
|
79
|
+
};
|
|
80
|
+
ctx.pointerOffset = stream.pos + this.size(val, ctx, false);
|
|
81
|
+
for (const [key, type] of Object.entries(this.fields)) {
|
|
82
|
+
if (type && typeof type.encode === "function") {
|
|
83
|
+
type.encode(stream, val[key], ctx);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
let i = 0;
|
|
87
|
+
while (i < ctx.pointers.length) {
|
|
88
|
+
const ptr = ctx.pointers[i++];
|
|
89
|
+
ptr.type.encode(stream, ptr.val, ptr.parent);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=struct.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"struct.js","sourceRoot":"","sources":["../src/struct.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type DecodeStream from "./decode-stream.js";
|
|
2
|
+
import { NumberT } from "./number.js";
|
|
3
|
+
export type LengthLike = number | string | ((this: any, parent?: any) => number) | NumberT;
|
|
4
|
+
export declare function resolveLength(length: LengthLike | undefined, stream?: DecodeStream, parent?: any): number;
|
|
5
|
+
export declare class PropertyDescriptor<T = unknown> {
|
|
6
|
+
enumerable: boolean;
|
|
7
|
+
configurable: boolean;
|
|
8
|
+
writable?: boolean;
|
|
9
|
+
value?: T;
|
|
10
|
+
get?: () => T;
|
|
11
|
+
set?: (value: T) => void;
|
|
12
|
+
constructor(opts?: Partial<PropertyDescriptor<T>>);
|
|
13
|
+
}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { NumberT } from "./number.js";
|
|
2
|
+
export function resolveLength(length, stream, parent) {
|
|
3
|
+
let resolved;
|
|
4
|
+
if (typeof length === "number") {
|
|
5
|
+
resolved = length;
|
|
6
|
+
}
|
|
7
|
+
else if (typeof length === "function") {
|
|
8
|
+
resolved = length.call(parent, parent);
|
|
9
|
+
}
|
|
10
|
+
else if (parent && typeof length === "string") {
|
|
11
|
+
resolved = parent[length];
|
|
12
|
+
}
|
|
13
|
+
else if (stream && length instanceof NumberT) {
|
|
14
|
+
resolved = length.decode(stream);
|
|
15
|
+
}
|
|
16
|
+
if (typeof resolved !== "number" || Number.isNaN(resolved)) {
|
|
17
|
+
throw new Error("Not a fixed size");
|
|
18
|
+
}
|
|
19
|
+
return resolved;
|
|
20
|
+
}
|
|
21
|
+
export class PropertyDescriptor {
|
|
22
|
+
enumerable = true;
|
|
23
|
+
configurable = true;
|
|
24
|
+
writable;
|
|
25
|
+
value;
|
|
26
|
+
get;
|
|
27
|
+
set;
|
|
28
|
+
constructor(opts = {}) {
|
|
29
|
+
Object.assign(this, opts);
|
|
30
|
+
const provided = new Set(Object.keys(opts));
|
|
31
|
+
if (!provided.has("value")) {
|
|
32
|
+
delete this.value;
|
|
33
|
+
}
|
|
34
|
+
if (!provided.has("get")) {
|
|
35
|
+
delete this.get;
|
|
36
|
+
}
|
|
37
|
+
if (!provided.has("set")) {
|
|
38
|
+
delete this.set;
|
|
39
|
+
}
|
|
40
|
+
if (!provided.has("writable")) {
|
|
41
|
+
delete this.writable;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAItC,MAAM,UAAU,aAAa,CAC3B,MAA8B,EAC9B,MAAqB,EACrB,MAAY;IAEZ,IAAI,QAA4B,CAAC;IAEjC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,QAAQ,GAAG,MAAM,CAAC;IACpB,CAAC;SAAM,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACxC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;SAAM,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChD,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;SAAM,IAAI,MAAM,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;QAC/C,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,kBAAkB;IAC7B,UAAU,GAAG,IAAI,CAAC;IAClB,YAAY,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAW;IACnB,KAAK,CAAK;IACV,GAAG,CAAW;IACd,GAAG,CAAsB;IAEzB,YAAY,OAAuC,EAAE;QACnD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAE1B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAQ,IAAgC,CAAC,KAAK,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAQ,IAAgC,CAAC,GAAG,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAQ,IAAgC,CAAC,GAAG,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAQ,IAAgC,CAAC,QAAQ,CAAC;QACpD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type DecodeStream from "./decode-stream.js";
|
|
2
|
+
import type EncodeStream from "./encode-stream.js";
|
|
3
|
+
import Struct from "./struct.js";
|
|
4
|
+
type FieldMap = Record<string, any>;
|
|
5
|
+
type VersionDefinitions = {
|
|
6
|
+
header?: FieldMap;
|
|
7
|
+
[version: string]: FieldMap | VersionedStruct | undefined;
|
|
8
|
+
};
|
|
9
|
+
export default class VersionedStruct extends Struct {
|
|
10
|
+
#private;
|
|
11
|
+
type: any;
|
|
12
|
+
versions: VersionDefinitions;
|
|
13
|
+
constructor(type: any, versions?: VersionDefinitions);
|
|
14
|
+
decode(stream: DecodeStream, parent?: any, length?: number): any;
|
|
15
|
+
size(val: any, parent?: any, includePointers?: boolean): number;
|
|
16
|
+
encode(stream: EncodeStream, val: any, parent?: any): void;
|
|
17
|
+
}
|
|
18
|
+
export {};
|