@yume-chan/struct 0.0.23 → 0.0.24
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/CHANGELOG.json +12 -0
- package/CHANGELOG.md +8 -1
- package/LICENSE +1 -1
- package/esm/basic/field-value.d.ts +2 -2
- package/esm/basic/field-value.d.ts.map +1 -1
- package/esm/basic/field-value.js.map +1 -1
- package/esm/basic/struct-value.d.ts +6 -2
- package/esm/basic/struct-value.d.ts.map +1 -1
- package/esm/basic/struct-value.js +5 -0
- package/esm/basic/struct-value.js.map +1 -1
- package/esm/struct.d.ts +27 -14
- package/esm/struct.d.ts.map +1 -1
- package/esm/struct.js +31 -18
- package/esm/struct.js.map +1 -1
- package/esm/sync-promise.d.ts +2 -2
- package/esm/sync-promise.d.ts.map +1 -1
- package/esm/sync-promise.js.map +1 -1
- package/esm/types/bigint.d.ts +13 -14
- package/esm/types/bigint.d.ts.map +1 -1
- package/esm/types/bigint.js +16 -17
- package/esm/types/bigint.js.map +1 -1
- package/esm/types/buffer/base.d.ts +31 -27
- package/esm/types/buffer/base.d.ts.map +1 -1
- package/esm/types/buffer/base.js +25 -26
- package/esm/types/buffer/base.js.map +1 -1
- package/esm/types/buffer/fixed-length.d.ts +2 -2
- package/esm/types/buffer/fixed-length.d.ts.map +1 -1
- package/esm/types/buffer/fixed-length.js.map +1 -1
- package/esm/types/buffer/variable-length.d.ts +10 -9
- package/esm/types/buffer/variable-length.d.ts.map +1 -1
- package/esm/types/buffer/variable-length.js +30 -19
- package/esm/types/buffer/variable-length.js.map +1 -1
- package/esm/types/number.d.ts +13 -13
- package/esm/types/number.d.ts.map +1 -1
- package/esm/types/number.js +22 -34
- package/esm/types/number.js.map +1 -1
- package/esm/utils.d.ts.map +1 -1
- package/esm/utils.js +6 -4
- package/esm/utils.js.map +1 -1
- package/package.json +8 -10
- package/src/basic/field-value.ts +7 -7
- package/src/basic/struct-value.ts +21 -3
- package/src/struct.ts +106 -65
- package/src/sync-promise.ts +9 -9
- package/src/types/bigint.ts +40 -37
- package/src/types/buffer/base.ts +48 -47
- package/src/types/buffer/fixed-length.ts +9 -4
- package/src/types/buffer/variable-length.ts +55 -31
- package/src/types/number.ts +32 -39
- package/src/utils.ts +6 -4
- package/tsconfig.build.tsbuildinfo +1 -1
package/esm/types/number.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/types/number.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/types/number.ts"],"names":[],"mappings":"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"}
|
package/esm/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAE5B;;GAEG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,KAAK,CAAC;AAE/E;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,KAAK,SAAS,MAAM,EAAE,IAAI,SAAS,MAAM,IAAI,QAAQ,CACvE,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,GAAG,IAAI,CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,IAAI,CAC3B,CAAC,EACD;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC;CAAE,CAAC,MAAM,CAAC,CAAC,CAClE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,MAAM,IAAI;KAC/B,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,KAAK;CAC3D,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAEnD;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,KAAK,CAAC,CAElC;AAgCD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAEpD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAE5B;;GAEG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,KAAK,CAAC;AAE/E;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,KAAK,SAAS,MAAM,EAAE,IAAI,SAAS,MAAM,IAAI,QAAQ,CACvE,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,GAAG,IAAI,CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,IAAI,CAC3B,CAAC,EACD;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC;CAAE,CAAC,MAAM,CAAC,CAAC,CAClE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,MAAM,IAAI;KAC/B,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,KAAK;CAC3D,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAEnD;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,KAAK,CAAC,CAElC;AAgCD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAEpD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW,GAAG,MAAM,CAIxE"}
|
package/esm/utils.js
CHANGED
|
@@ -5,12 +5,14 @@ export function placeholder() {
|
|
|
5
5
|
return undefined;
|
|
6
6
|
}
|
|
7
7
|
const { TextEncoder, TextDecoder } = globalThis;
|
|
8
|
-
const
|
|
9
|
-
const
|
|
8
|
+
const SharedEncoder = new TextEncoder();
|
|
9
|
+
const SharedDecoder = new TextDecoder();
|
|
10
10
|
export function encodeUtf8(input) {
|
|
11
|
-
return
|
|
11
|
+
return SharedEncoder.encode(input);
|
|
12
12
|
}
|
|
13
13
|
export function decodeUtf8(buffer) {
|
|
14
|
-
|
|
14
|
+
// `TextDecoder` has internal states in stream mode,
|
|
15
|
+
// but this method is not for stream mode, so the instance can be reused
|
|
16
|
+
return SharedDecoder.decode(buffer);
|
|
15
17
|
}
|
|
16
18
|
//# sourceMappingURL=utils.js.map
|
package/esm/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAgDA;;GAEG;AACH,MAAM,UAAU,WAAW;IACvB,OAAO,SAAyB,CAAC;AACrC,CAAC;AA2BD,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,UAAwC,CAAC;AAE9E,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAgDA;;GAEG;AACH,MAAM,UAAU,WAAW;IACvB,OAAO,SAAyB,CAAC;AACrC,CAAC;AA2BD,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,UAAwC,CAAC;AAE9E,MAAM,aAAa,GAAG,IAAI,WAAW,EAAE,CAAC;AACxC,MAAM,aAAa,GAAG,IAAI,WAAW,EAAE,CAAC;AAExC,MAAM,UAAU,UAAU,CAAC,KAAa;IACpC,OAAO,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAqC;IAC5D,oDAAoD;IACpD,wEAAwE;IACxE,OAAO,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yume-chan/struct",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.24",
|
|
4
4
|
"description": "C-style structure serializer and deserializer.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"structure",
|
|
@@ -27,24 +27,22 @@
|
|
|
27
27
|
"main": "esm/index.js",
|
|
28
28
|
"types": "esm/index.d.ts",
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@yume-chan/
|
|
31
|
-
"tslib": "^2.6.2"
|
|
30
|
+
"@yume-chan/no-data-view": "^0.0.24"
|
|
32
31
|
},
|
|
33
32
|
"devDependencies": {
|
|
34
|
-
"@jest/globals": "^30.0.0-alpha.
|
|
33
|
+
"@jest/globals": "^30.0.0-alpha.4",
|
|
35
34
|
"@yume-chan/eslint-config": "^1.0.0",
|
|
36
35
|
"@yume-chan/tsconfig": "^1.0.0",
|
|
37
36
|
"cross-env": "^7.0.3",
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"typescript": "^5.4.2"
|
|
37
|
+
"jest": "^30.0.0-alpha.4",
|
|
38
|
+
"prettier": "^3.3.2",
|
|
39
|
+
"ts-jest": "^29.1.4",
|
|
40
|
+
"typescript": "^5.4.5"
|
|
43
41
|
},
|
|
44
42
|
"scripts": {
|
|
45
43
|
"build": "tsc -b tsconfig.build.json",
|
|
46
44
|
"build:watch": "tsc -b tsconfig.build.json",
|
|
47
45
|
"test": "cross-env NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" TS_JEST_DISABLE_VER_CHECKER=true jest --coverage",
|
|
48
|
-
"lint": "eslint
|
|
46
|
+
"lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4"
|
|
49
47
|
}
|
|
50
48
|
}
|
package/src/basic/field-value.ts
CHANGED
|
@@ -9,11 +9,7 @@ import type { StructValue } from "./struct-value.js";
|
|
|
9
9
|
* helpful for the serialization process.
|
|
10
10
|
*/
|
|
11
11
|
export abstract class StructFieldValue<
|
|
12
|
-
TDefinition extends StructFieldDefinition<
|
|
13
|
-
any,
|
|
14
|
-
any,
|
|
15
|
-
any
|
|
16
|
-
> = StructFieldDefinition<any, any, any>,
|
|
12
|
+
TDefinition extends StructFieldDefinition<unknown, unknown, PropertyKey>,
|
|
17
13
|
> {
|
|
18
14
|
/** Gets the definition associated with this runtime value */
|
|
19
15
|
readonly definition: TDefinition;
|
|
@@ -58,7 +54,7 @@ export abstract class StructFieldValue<
|
|
|
58
54
|
* When implemented in derived classes, reads current field's value.
|
|
59
55
|
*/
|
|
60
56
|
get(): TDefinition["TValue"] {
|
|
61
|
-
return this.value;
|
|
57
|
+
return this.value as never;
|
|
62
58
|
}
|
|
63
59
|
|
|
64
60
|
/**
|
|
@@ -71,5 +67,9 @@ export abstract class StructFieldValue<
|
|
|
71
67
|
/**
|
|
72
68
|
* When implemented in derived classes, serializes this field into `dataView` at `offset`
|
|
73
69
|
*/
|
|
74
|
-
abstract serialize(
|
|
70
|
+
abstract serialize(
|
|
71
|
+
dataView: DataView,
|
|
72
|
+
array: Uint8Array,
|
|
73
|
+
offset: number,
|
|
74
|
+
): void;
|
|
75
75
|
}
|
|
@@ -1,14 +1,25 @@
|
|
|
1
|
+
import type { StructFieldDefinition } from "./definition.js";
|
|
1
2
|
import type { StructFieldValue } from "./field-value.js";
|
|
2
3
|
|
|
3
4
|
export const STRUCT_VALUE_SYMBOL = Symbol("struct-value");
|
|
4
5
|
|
|
6
|
+
export function isStructValueInit(
|
|
7
|
+
value: unknown,
|
|
8
|
+
): value is { [STRUCT_VALUE_SYMBOL]: StructValue } {
|
|
9
|
+
return (
|
|
10
|
+
typeof value === "object" &&
|
|
11
|
+
value !== null &&
|
|
12
|
+
STRUCT_VALUE_SYMBOL in value
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
|
|
5
16
|
/**
|
|
6
17
|
* A struct value is a map between keys in a struct and their field values.
|
|
7
18
|
*/
|
|
8
19
|
export class StructValue {
|
|
9
20
|
/** @internal */ readonly fieldValues: Record<
|
|
10
21
|
PropertyKey,
|
|
11
|
-
StructFieldValue
|
|
22
|
+
StructFieldValue<StructFieldDefinition<unknown, unknown, PropertyKey>>
|
|
12
23
|
> = {};
|
|
13
24
|
|
|
14
25
|
/**
|
|
@@ -35,7 +46,12 @@ export class StructValue {
|
|
|
35
46
|
* @param name The field name
|
|
36
47
|
* @param fieldValue The associated `StructFieldValue`
|
|
37
48
|
*/
|
|
38
|
-
set(
|
|
49
|
+
set(
|
|
50
|
+
name: PropertyKey,
|
|
51
|
+
fieldValue: StructFieldValue<
|
|
52
|
+
StructFieldDefinition<unknown, unknown, PropertyKey>
|
|
53
|
+
>,
|
|
54
|
+
): void {
|
|
39
55
|
this.fieldValues[name] = fieldValue;
|
|
40
56
|
|
|
41
57
|
// PERF: `Object.defineProperty` is slow
|
|
@@ -61,7 +77,9 @@ export class StructValue {
|
|
|
61
77
|
*
|
|
62
78
|
* @param name The field name
|
|
63
79
|
*/
|
|
64
|
-
get(
|
|
80
|
+
get(
|
|
81
|
+
name: PropertyKey,
|
|
82
|
+
): StructFieldValue<StructFieldDefinition<unknown, unknown, PropertyKey>> {
|
|
65
83
|
return this.fieldValues[name]!;
|
|
66
84
|
}
|
|
67
85
|
}
|
package/src/struct.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
|
|
1
3
|
import type {
|
|
2
4
|
AsyncExactReadable,
|
|
3
5
|
ExactReadable,
|
|
@@ -10,22 +12,23 @@ import {
|
|
|
10
12
|
STRUCT_VALUE_SYMBOL,
|
|
11
13
|
StructDefaultOptions,
|
|
12
14
|
StructValue,
|
|
15
|
+
isStructValueInit,
|
|
13
16
|
} from "./basic/index.js";
|
|
14
17
|
import { SyncPromise } from "./sync-promise.js";
|
|
15
18
|
import type {
|
|
16
|
-
|
|
19
|
+
BufferFieldConverter,
|
|
17
20
|
FixedLengthBufferLikeFieldOptions,
|
|
18
21
|
LengthField,
|
|
19
22
|
VariableLengthBufferLikeFieldOptions,
|
|
20
23
|
} from "./types/index.js";
|
|
21
24
|
import {
|
|
22
25
|
BigIntFieldDefinition,
|
|
23
|
-
|
|
26
|
+
BigIntFieldVariant,
|
|
24
27
|
FixedLengthBufferLikeFieldDefinition,
|
|
25
28
|
NumberFieldDefinition,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
NumberFieldVariant,
|
|
30
|
+
StringBufferFieldConverter,
|
|
31
|
+
Uint8ArrayBufferFieldConverter,
|
|
29
32
|
VariableLengthBufferLikeFieldDefinition,
|
|
30
33
|
} from "./types/index.js";
|
|
31
34
|
import type { Evaluate, Identity, Overwrite, ValueOrPromise } from "./utils.js";
|
|
@@ -50,7 +53,7 @@ type AddFieldDescriptor<
|
|
|
50
53
|
TExtra extends object,
|
|
51
54
|
TPostDeserialized,
|
|
52
55
|
TFieldName extends PropertyKey,
|
|
53
|
-
TDefinition extends StructFieldDefinition<
|
|
56
|
+
TDefinition extends StructFieldDefinition<unknown, unknown, PropertyKey>,
|
|
54
57
|
> = Identity<
|
|
55
58
|
Struct<
|
|
56
59
|
// Merge two types
|
|
@@ -83,7 +86,7 @@ interface ArrayBufferLikeFieldCreator<
|
|
|
83
86
|
*/
|
|
84
87
|
<
|
|
85
88
|
TName extends PropertyKey,
|
|
86
|
-
TType extends
|
|
89
|
+
TType extends BufferFieldConverter<unknown, unknown>,
|
|
87
90
|
TTypeScriptType = TType["TTypeScriptType"],
|
|
88
91
|
>(
|
|
89
92
|
name: TName,
|
|
@@ -107,7 +110,7 @@ interface ArrayBufferLikeFieldCreator<
|
|
|
107
110
|
*/
|
|
108
111
|
<
|
|
109
112
|
TName extends PropertyKey,
|
|
110
|
-
TType extends
|
|
113
|
+
TType extends BufferFieldConverter<unknown, unknown>,
|
|
111
114
|
TOptions extends VariableLengthBufferLikeFieldOptions<TFields>,
|
|
112
115
|
TTypeScriptType = TType["TTypeScriptType"],
|
|
113
116
|
>(
|
|
@@ -133,7 +136,7 @@ interface BoundArrayBufferLikeFieldDefinitionCreator<
|
|
|
133
136
|
TOmitInitKey extends PropertyKey,
|
|
134
137
|
TExtra extends object,
|
|
135
138
|
TPostDeserialized,
|
|
136
|
-
TType extends
|
|
139
|
+
TType extends BufferFieldConverter<unknown, unknown>,
|
|
137
140
|
> {
|
|
138
141
|
<TName extends PropertyKey, TTypeScriptType = TType["TTypeScriptType"]>(
|
|
139
142
|
name: TName,
|
|
@@ -154,10 +157,9 @@ interface BoundArrayBufferLikeFieldDefinitionCreator<
|
|
|
154
157
|
|
|
155
158
|
<
|
|
156
159
|
TName extends PropertyKey,
|
|
157
|
-
TLengthField extends LengthField<TFields>,
|
|
158
160
|
TOptions extends VariableLengthBufferLikeFieldOptions<
|
|
159
161
|
TFields,
|
|
160
|
-
|
|
162
|
+
LengthField<TFields>
|
|
161
163
|
>,
|
|
162
164
|
TTypeScriptType = TType["TTypeScriptType"],
|
|
163
165
|
>(
|
|
@@ -212,6 +214,20 @@ export class StructEmptyError extends StructDeserializeError {
|
|
|
212
214
|
}
|
|
213
215
|
}
|
|
214
216
|
|
|
217
|
+
interface StructDefinition<
|
|
218
|
+
TFields extends object,
|
|
219
|
+
TOmitInitKey extends PropertyKey,
|
|
220
|
+
TExtra extends object,
|
|
221
|
+
> {
|
|
222
|
+
readonly TFields: TFields;
|
|
223
|
+
|
|
224
|
+
readonly TOmitInitKey: TOmitInitKey;
|
|
225
|
+
|
|
226
|
+
readonly TExtra: TExtra;
|
|
227
|
+
|
|
228
|
+
readonly TInit: Evaluate<Omit<TFields, TOmitInitKey>>;
|
|
229
|
+
}
|
|
230
|
+
|
|
215
231
|
export class Struct<
|
|
216
232
|
TFields extends object = Record<never, never>,
|
|
217
233
|
TOmitInitKey extends PropertyKey = never,
|
|
@@ -248,18 +264,18 @@ export class Struct<
|
|
|
248
264
|
|
|
249
265
|
#fields: [
|
|
250
266
|
name: PropertyKey,
|
|
251
|
-
definition: StructFieldDefinition<
|
|
267
|
+
definition: StructFieldDefinition<unknown, unknown, PropertyKey>,
|
|
252
268
|
][] = [];
|
|
253
269
|
get fields(): readonly [
|
|
254
270
|
name: PropertyKey,
|
|
255
|
-
definition: StructFieldDefinition<
|
|
271
|
+
definition: StructFieldDefinition<unknown, unknown, PropertyKey>,
|
|
256
272
|
][] {
|
|
257
273
|
return this.#fields;
|
|
258
274
|
}
|
|
259
275
|
|
|
260
276
|
#extra: Record<PropertyKey, unknown> = {};
|
|
261
277
|
|
|
262
|
-
#postDeserialized?: StructPostDeserialized<
|
|
278
|
+
#postDeserialized?: StructPostDeserialized<never, unknown> | undefined;
|
|
263
279
|
|
|
264
280
|
constructor(options?: Partial<Readonly<StructOptions>>) {
|
|
265
281
|
this.options = { ...StructDefaultOptions, ...options };
|
|
@@ -270,7 +286,11 @@ export class Struct<
|
|
|
270
286
|
*/
|
|
271
287
|
field<
|
|
272
288
|
TName extends PropertyKey,
|
|
273
|
-
TDefinition extends StructFieldDefinition<
|
|
289
|
+
TDefinition extends StructFieldDefinition<
|
|
290
|
+
unknown,
|
|
291
|
+
unknown,
|
|
292
|
+
PropertyKey
|
|
293
|
+
>,
|
|
274
294
|
>(
|
|
275
295
|
name: TName,
|
|
276
296
|
definition: TDefinition,
|
|
@@ -298,13 +318,15 @@ export class Struct<
|
|
|
298
318
|
this.#size += size;
|
|
299
319
|
|
|
300
320
|
// Force cast `this` to another type
|
|
301
|
-
return this as
|
|
321
|
+
return this as never;
|
|
302
322
|
}
|
|
303
323
|
|
|
304
324
|
/**
|
|
305
325
|
* Merges (flats) another `Struct`'s fields and extra fields into this one.
|
|
326
|
+
*
|
|
327
|
+
* `other`'s `postDeserialize` will be ignored.
|
|
306
328
|
*/
|
|
307
|
-
concat<TOther extends
|
|
329
|
+
concat<TOther extends StructDefinition<object, PropertyKey, object>>(
|
|
308
330
|
other: TOther,
|
|
309
331
|
): Struct<
|
|
310
332
|
TFields & TOther["TFields"],
|
|
@@ -312,6 +334,10 @@ export class Struct<
|
|
|
312
334
|
TExtra & TOther["TExtra"],
|
|
313
335
|
TPostDeserialized
|
|
314
336
|
> {
|
|
337
|
+
if (!(other instanceof Struct)) {
|
|
338
|
+
throw new TypeError("The other value must be a `Struct` instance");
|
|
339
|
+
}
|
|
340
|
+
|
|
315
341
|
for (const field of other.#fields) {
|
|
316
342
|
this.#fields.push(field);
|
|
317
343
|
}
|
|
@@ -320,12 +346,12 @@ export class Struct<
|
|
|
320
346
|
this.#extra,
|
|
321
347
|
Object.getOwnPropertyDescriptors(other.#extra),
|
|
322
348
|
);
|
|
323
|
-
return this as
|
|
349
|
+
return this as never;
|
|
324
350
|
}
|
|
325
351
|
|
|
326
352
|
#number<
|
|
327
353
|
TName extends PropertyKey,
|
|
328
|
-
TType extends
|
|
354
|
+
TType extends NumberFieldVariant = NumberFieldVariant,
|
|
329
355
|
TTypeScriptType = number,
|
|
330
356
|
>(name: TName, type: TType, typeScriptType?: TTypeScriptType) {
|
|
331
357
|
return this.field(
|
|
@@ -341,7 +367,7 @@ export class Struct<
|
|
|
341
367
|
name: TName,
|
|
342
368
|
typeScriptType?: TTypeScriptType,
|
|
343
369
|
) {
|
|
344
|
-
return this.#number(name,
|
|
370
|
+
return this.#number(name, NumberFieldVariant.Int8, typeScriptType);
|
|
345
371
|
}
|
|
346
372
|
|
|
347
373
|
/**
|
|
@@ -351,7 +377,7 @@ export class Struct<
|
|
|
351
377
|
name: TName,
|
|
352
378
|
typeScriptType?: TTypeScriptType,
|
|
353
379
|
) {
|
|
354
|
-
return this.#number(name,
|
|
380
|
+
return this.#number(name, NumberFieldVariant.Uint8, typeScriptType);
|
|
355
381
|
}
|
|
356
382
|
|
|
357
383
|
/**
|
|
@@ -361,7 +387,7 @@ export class Struct<
|
|
|
361
387
|
name: TName,
|
|
362
388
|
typeScriptType?: TTypeScriptType,
|
|
363
389
|
) {
|
|
364
|
-
return this.#number(name,
|
|
390
|
+
return this.#number(name, NumberFieldVariant.Int16, typeScriptType);
|
|
365
391
|
}
|
|
366
392
|
|
|
367
393
|
/**
|
|
@@ -371,7 +397,7 @@ export class Struct<
|
|
|
371
397
|
name: TName,
|
|
372
398
|
typeScriptType?: TTypeScriptType,
|
|
373
399
|
) {
|
|
374
|
-
return this.#number(name,
|
|
400
|
+
return this.#number(name, NumberFieldVariant.Uint16, typeScriptType);
|
|
375
401
|
}
|
|
376
402
|
|
|
377
403
|
/**
|
|
@@ -381,7 +407,7 @@ export class Struct<
|
|
|
381
407
|
name: TName,
|
|
382
408
|
typeScriptType?: TTypeScriptType,
|
|
383
409
|
) {
|
|
384
|
-
return this.#number(name,
|
|
410
|
+
return this.#number(name, NumberFieldVariant.Int32, typeScriptType);
|
|
385
411
|
}
|
|
386
412
|
|
|
387
413
|
/**
|
|
@@ -391,12 +417,12 @@ export class Struct<
|
|
|
391
417
|
name: TName,
|
|
392
418
|
typeScriptType?: TTypeScriptType,
|
|
393
419
|
) {
|
|
394
|
-
return this.#number(name,
|
|
420
|
+
return this.#number(name, NumberFieldVariant.Uint32, typeScriptType);
|
|
395
421
|
}
|
|
396
422
|
|
|
397
423
|
#bigint<
|
|
398
424
|
TName extends PropertyKey,
|
|
399
|
-
TType extends
|
|
425
|
+
TType extends BigIntFieldVariant = BigIntFieldVariant,
|
|
400
426
|
TTypeScriptType = TType["TTypeScriptType"],
|
|
401
427
|
>(name: TName, type: TType, typeScriptType?: TTypeScriptType) {
|
|
402
428
|
return this.field(
|
|
@@ -412,9 +438,9 @@ export class Struct<
|
|
|
412
438
|
*/
|
|
413
439
|
int64<
|
|
414
440
|
TName extends PropertyKey,
|
|
415
|
-
TTypeScriptType =
|
|
441
|
+
TTypeScriptType = BigIntFieldVariant["TTypeScriptType"],
|
|
416
442
|
>(name: TName, typeScriptType?: TTypeScriptType) {
|
|
417
|
-
return this.#bigint(name,
|
|
443
|
+
return this.#bigint(name, BigIntFieldVariant.Int64, typeScriptType);
|
|
418
444
|
}
|
|
419
445
|
|
|
420
446
|
/**
|
|
@@ -424,9 +450,9 @@ export class Struct<
|
|
|
424
450
|
*/
|
|
425
451
|
uint64<
|
|
426
452
|
TName extends PropertyKey,
|
|
427
|
-
TTypeScriptType =
|
|
453
|
+
TTypeScriptType = BigIntFieldVariant["TTypeScriptType"],
|
|
428
454
|
>(name: TName, typeScriptType?: TTypeScriptType) {
|
|
429
|
-
return this.#bigint(name,
|
|
455
|
+
return this.#bigint(name, BigIntFieldVariant.Uint64, typeScriptType);
|
|
430
456
|
}
|
|
431
457
|
|
|
432
458
|
#arrayBufferLike: ArrayBufferLikeFieldCreator<
|
|
@@ -436,21 +462,21 @@ export class Struct<
|
|
|
436
462
|
TPostDeserialized
|
|
437
463
|
> = (
|
|
438
464
|
name: PropertyKey,
|
|
439
|
-
type:
|
|
465
|
+
type: BufferFieldConverter,
|
|
440
466
|
options:
|
|
441
467
|
| FixedLengthBufferLikeFieldOptions
|
|
442
468
|
| VariableLengthBufferLikeFieldOptions,
|
|
443
|
-
):
|
|
469
|
+
): never => {
|
|
444
470
|
if ("length" in options) {
|
|
445
471
|
return this.field(
|
|
446
472
|
name,
|
|
447
473
|
new FixedLengthBufferLikeFieldDefinition(type, options),
|
|
448
|
-
);
|
|
474
|
+
) as never;
|
|
449
475
|
} else {
|
|
450
476
|
return this.field(
|
|
451
477
|
name,
|
|
452
478
|
new VariableLengthBufferLikeFieldDefinition(type, options),
|
|
453
|
-
);
|
|
479
|
+
) as never;
|
|
454
480
|
}
|
|
455
481
|
};
|
|
456
482
|
|
|
@@ -459,14 +485,18 @@ export class Struct<
|
|
|
459
485
|
TOmitInitKey,
|
|
460
486
|
TExtra,
|
|
461
487
|
TPostDeserialized,
|
|
462
|
-
|
|
463
|
-
> = (
|
|
488
|
+
Uint8ArrayBufferFieldConverter
|
|
489
|
+
> = (
|
|
490
|
+
name: PropertyKey,
|
|
491
|
+
options: unknown,
|
|
492
|
+
typeScriptType: unknown,
|
|
493
|
+
): never => {
|
|
464
494
|
return this.#arrayBufferLike(
|
|
465
495
|
name,
|
|
466
|
-
|
|
467
|
-
options,
|
|
496
|
+
Uint8ArrayBufferFieldConverter.Instance,
|
|
497
|
+
options as never,
|
|
468
498
|
typeScriptType,
|
|
469
|
-
);
|
|
499
|
+
) as never;
|
|
470
500
|
};
|
|
471
501
|
|
|
472
502
|
string: BoundArrayBufferLikeFieldDefinitionCreator<
|
|
@@ -474,14 +504,18 @@ export class Struct<
|
|
|
474
504
|
TOmitInitKey,
|
|
475
505
|
TExtra,
|
|
476
506
|
TPostDeserialized,
|
|
477
|
-
|
|
478
|
-
> = (
|
|
507
|
+
StringBufferFieldConverter
|
|
508
|
+
> = (
|
|
509
|
+
name: PropertyKey,
|
|
510
|
+
options: unknown,
|
|
511
|
+
typeScriptType: unknown,
|
|
512
|
+
): never => {
|
|
479
513
|
return this.#arrayBufferLike(
|
|
480
514
|
name,
|
|
481
|
-
|
|
482
|
-
options,
|
|
515
|
+
StringBufferFieldConverter.Instance,
|
|
516
|
+
options as never,
|
|
483
517
|
typeScriptType,
|
|
484
|
-
);
|
|
518
|
+
) as never;
|
|
485
519
|
};
|
|
486
520
|
|
|
487
521
|
/**
|
|
@@ -507,7 +541,7 @@ export class Struct<
|
|
|
507
541
|
this.#extra,
|
|
508
542
|
Object.getOwnPropertyDescriptors(value),
|
|
509
543
|
);
|
|
510
|
-
return this as
|
|
544
|
+
return this as never;
|
|
511
545
|
}
|
|
512
546
|
|
|
513
547
|
/**
|
|
@@ -537,9 +571,9 @@ export class Struct<
|
|
|
537
571
|
postDeserialize<TPostSerialize>(
|
|
538
572
|
callback?: StructPostDeserialized<TFields, TPostSerialize>,
|
|
539
573
|
): Struct<TFields, TOmitInitKey, TExtra, TPostSerialize>;
|
|
540
|
-
postDeserialize(callback?: StructPostDeserialized<TFields,
|
|
574
|
+
postDeserialize(callback?: StructPostDeserialized<TFields, unknown>) {
|
|
541
575
|
this.#postDeserialized = callback;
|
|
542
|
-
return this as
|
|
576
|
+
return this as never;
|
|
543
577
|
}
|
|
544
578
|
|
|
545
579
|
/**
|
|
@@ -590,31 +624,35 @@ export class Struct<
|
|
|
590
624
|
|
|
591
625
|
// Run `postDeserialized`
|
|
592
626
|
if (this.#postDeserialized) {
|
|
593
|
-
const override = this.#postDeserialized.call(
|
|
627
|
+
const override = this.#postDeserialized.call(
|
|
628
|
+
value as never,
|
|
629
|
+
value as never,
|
|
630
|
+
);
|
|
594
631
|
// If it returns a new value, use that as result
|
|
595
632
|
// Otherwise it only inspects/mutates the object in place.
|
|
596
633
|
if (override !== undefined) {
|
|
597
|
-
return override;
|
|
634
|
+
return override as never;
|
|
598
635
|
}
|
|
599
636
|
}
|
|
600
637
|
|
|
601
|
-
return value;
|
|
638
|
+
return value as never;
|
|
602
639
|
})
|
|
603
640
|
.valueOrPromise();
|
|
604
641
|
}
|
|
605
642
|
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
643
|
+
/**
|
|
644
|
+
* Serialize a struct value to a buffer.
|
|
645
|
+
* @param init Fields of the struct
|
|
646
|
+
* @param output The buffer to serialize the struct to. It must be large enough to hold the entire struct. If not provided, a new buffer will be created.
|
|
647
|
+
* @returns A view of `output` that contains the serialized struct, or a new buffer if `output` is not provided.
|
|
648
|
+
*/
|
|
611
649
|
serialize(
|
|
612
650
|
init: Evaluate<Omit<TFields, TOmitInitKey>>,
|
|
613
651
|
output?: Uint8Array,
|
|
614
|
-
): Uint8Array
|
|
652
|
+
): Uint8Array {
|
|
615
653
|
let structValue: StructValue;
|
|
616
|
-
if (
|
|
617
|
-
structValue =
|
|
654
|
+
if (isStructValueInit(init)) {
|
|
655
|
+
structValue = init[STRUCT_VALUE_SYMBOL];
|
|
618
656
|
for (const [key, value] of Object.entries(init)) {
|
|
619
657
|
const fieldValue = structValue.get(key);
|
|
620
658
|
if (fieldValue) {
|
|
@@ -627,14 +665,17 @@ export class Struct<
|
|
|
627
665
|
const fieldValue = definition.create(
|
|
628
666
|
this.options,
|
|
629
667
|
structValue,
|
|
630
|
-
(init as
|
|
668
|
+
(init as Record<PropertyKey, unknown>)[name],
|
|
631
669
|
);
|
|
632
670
|
structValue.set(name, fieldValue);
|
|
633
671
|
}
|
|
634
672
|
}
|
|
635
673
|
|
|
636
674
|
let structSize = 0;
|
|
637
|
-
const fieldsInfo: {
|
|
675
|
+
const fieldsInfo: {
|
|
676
|
+
fieldValue: StructFieldValue<any>;
|
|
677
|
+
size: number;
|
|
678
|
+
}[] = [];
|
|
638
679
|
|
|
639
680
|
for (const [name] of this.#fields) {
|
|
640
681
|
const fieldValue = structValue.get(name);
|
|
@@ -643,10 +684,10 @@ export class Struct<
|
|
|
643
684
|
structSize += size;
|
|
644
685
|
}
|
|
645
686
|
|
|
646
|
-
let outputType = "number";
|
|
647
687
|
if (!output) {
|
|
648
688
|
output = new Uint8Array(structSize);
|
|
649
|
-
|
|
689
|
+
} else if (output.length < structSize) {
|
|
690
|
+
throw new TypeError("Output buffer is too small");
|
|
650
691
|
}
|
|
651
692
|
|
|
652
693
|
const dataView = new DataView(
|
|
@@ -656,12 +697,12 @@ export class Struct<
|
|
|
656
697
|
);
|
|
657
698
|
let offset = 0;
|
|
658
699
|
for (const { fieldValue, size } of fieldsInfo) {
|
|
659
|
-
fieldValue.serialize(dataView, offset);
|
|
700
|
+
fieldValue.serialize(dataView, output, offset);
|
|
660
701
|
offset += size;
|
|
661
702
|
}
|
|
662
703
|
|
|
663
|
-
if (
|
|
664
|
-
return structSize;
|
|
704
|
+
if (output.length !== structSize) {
|
|
705
|
+
return output.subarray(0, structSize);
|
|
665
706
|
} else {
|
|
666
707
|
return output;
|
|
667
708
|
}
|