@yume-chan/struct 1.0.0 → 2.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/CHANGELOG.md +11 -0
- package/LICENSE +1 -1
- package/esm/bipedal.d.ts +2 -1
- package/esm/bipedal.d.ts.map +1 -1
- package/esm/bipedal.js +10 -3
- package/esm/bipedal.js.map +1 -1
- package/esm/buffer.d.ts +20 -11
- package/esm/buffer.d.ts.map +1 -1
- package/esm/buffer.js +137 -140
- package/esm/buffer.js.map +1 -1
- package/esm/concat.d.ts +13 -0
- package/esm/concat.d.ts.map +1 -0
- package/esm/concat.js +10 -0
- package/esm/concat.js.map +1 -0
- package/esm/extend.d.ts +6 -0
- package/esm/extend.d.ts.map +1 -0
- package/esm/extend.js +10 -0
- package/esm/extend.js.map +1 -0
- package/esm/field/factory.d.ts +13 -0
- package/esm/field/factory.d.ts.map +1 -0
- package/esm/field/factory.js +21 -0
- package/esm/field/factory.js.map +1 -0
- package/esm/field/index.d.ts +4 -0
- package/esm/field/index.d.ts.map +1 -0
- package/esm/field/index.js +4 -0
- package/esm/field/index.js.map +1 -0
- package/esm/field/serialize.d.ts +8 -0
- package/esm/field/serialize.d.ts.map +1 -0
- package/esm/field/serialize.js +33 -0
- package/esm/field/serialize.js.map +1 -0
- package/esm/field/types.d.ts +33 -0
- package/esm/field/types.d.ts.map +1 -0
- package/esm/field/types.js +2 -0
- package/esm/field/types.js.map +1 -0
- package/esm/index.d.ts +4 -1
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +4 -1
- package/esm/index.js.map +1 -1
- package/esm/number.d.ts +3 -3
- package/esm/number.d.ts.map +1 -1
- package/esm/number.js +29 -31
- package/esm/number.js.map +1 -1
- package/esm/readable.d.ts +6 -0
- package/esm/readable.d.ts.map +1 -1
- package/esm/readable.js +19 -0
- package/esm/readable.js.map +1 -1
- package/esm/string.d.ts +1 -1
- package/esm/string.d.ts.map +1 -1
- package/esm/string.js +4 -5
- package/esm/string.js.map +1 -1
- package/esm/struct.d.ts +20 -22
- package/esm/struct.d.ts.map +1 -1
- package/esm/struct.js +55 -18
- package/esm/struct.js.map +1 -1
- package/esm/types.d.ts +20 -0
- package/esm/types.d.ts.map +1 -0
- package/esm/types.js +2 -0
- package/esm/types.js.map +1 -0
- package/package.json +7 -7
- package/src/bipedal.ts +18 -8
- package/src/buffer.ts +236 -162
- package/src/concat.ts +78 -0
- package/src/extend.ts +37 -0
- package/src/field/factory.ts +64 -0
- package/src/field/index.ts +3 -0
- package/src/field/serialize.ts +58 -0
- package/src/field/types.ts +48 -0
- package/src/index.ts +4 -1
- package/src/number.ts +48 -37
- package/src/readable.ts +28 -0
- package/src/string.ts +6 -8
- package/src/struct.ts +129 -86
- package/src/types.ts +37 -0
- package/tsconfig.build.tsbuildinfo +1 -1
- package/esm/field.d.ts +0 -21
- package/esm/field.d.ts.map +0 -1
- package/esm/field.js +0 -2
- package/esm/field.js.map +0 -1
- package/src/field.ts +0 -27
package/esm/types.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { MaybePromiseLike } from "@yume-chan/async";
|
|
2
|
+
import type { FieldByobSerializeContext, FieldDeserializer, FieldSerializer } from "./field/index.js";
|
|
3
|
+
import type { AsyncExactReadable, ExactReadable } from "./readable.js";
|
|
4
|
+
export type StructSerializeContext = Omit<FieldByobSerializeContext, "littleEndian">;
|
|
5
|
+
export interface StructSerializer<T> extends FieldSerializer<T> {
|
|
6
|
+
type: "byob";
|
|
7
|
+
size: number;
|
|
8
|
+
serialize(source: T): Uint8Array;
|
|
9
|
+
serialize(source: T, buffer: Uint8Array): number;
|
|
10
|
+
serialize(source: T, context: StructSerializeContext): number;
|
|
11
|
+
}
|
|
12
|
+
export type StructInit<T extends StructSerializer<unknown>> = T extends StructSerializer<infer U> ? U : never;
|
|
13
|
+
export interface StructDeserializer<T> extends FieldDeserializer<T, never> {
|
|
14
|
+
size: number;
|
|
15
|
+
deserialize(reader: ExactReadable): T;
|
|
16
|
+
deserialize(reader: AsyncExactReadable): MaybePromiseLike<T>;
|
|
17
|
+
}
|
|
18
|
+
export type StructValue<T extends StructDeserializer<unknown>> = T extends StructDeserializer<infer P> ? P : never;
|
|
19
|
+
export type StructLike<T> = StructSerializer<T> & StructDeserializer<T>;
|
|
20
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,KAAK,EACR,yBAAyB,EACzB,iBAAiB,EACjB,eAAe,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACrC,yBAAyB,EACzB,cAAc,CACjB,CAAC;AAEF,MAAM,WAAW,gBAAgB,CAAC,CAAC,CAAE,SAAQ,eAAe,CAAC,CAAC,CAAC;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IAEb,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC;IACjC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;IACjD,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAAC;CACjE;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,gBAAgB,CAAC,OAAO,CAAC,IACtD,CAAC,SAAS,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEpD,MAAM,WAAW,kBAAkB,CAAC,CAAC,CAAE,SAAQ,iBAAiB,CAAC,CAAC,EAAE,KAAK,CAAC;IACtE,IAAI,EAAE,MAAM,CAAC;IAEb,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,CAAC,CAAC;IACtC,WAAW,CAAC,MAAM,EAAE,kBAAkB,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAChE;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,kBAAkB,CAAC,OAAO,CAAC,IACzD,CAAC,SAAS,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEtD,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC"}
|
package/esm/types.js
ADDED
package/esm/types.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yume-chan/struct",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "C-style structure serializer and deserializer.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"structure",
|
|
@@ -29,15 +29,15 @@
|
|
|
29
29
|
"sideEffects": false,
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@yume-chan/async": "^4.0.2",
|
|
32
|
-
"@yume-chan/no-data-view": "^
|
|
32
|
+
"@yume-chan/no-data-view": "^2.0.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@types/node": "^22.10
|
|
36
|
-
"prettier": "^3.
|
|
37
|
-
"typescript": "^5.
|
|
38
|
-
"@yume-chan/
|
|
35
|
+
"@types/node": "^22.13.10",
|
|
36
|
+
"prettier": "^3.5.3",
|
|
37
|
+
"typescript": "^5.8.2",
|
|
38
|
+
"@yume-chan/test-runner": "^1.0.0",
|
|
39
39
|
"@yume-chan/eslint-config": "^1.0.0",
|
|
40
|
-
"@yume-chan/
|
|
40
|
+
"@yume-chan/tsconfig": "^1.0.0"
|
|
41
41
|
},
|
|
42
42
|
"scripts": {
|
|
43
43
|
"build": "tsc -b tsconfig.build.json",
|
package/src/bipedal.ts
CHANGED
|
@@ -20,18 +20,22 @@ function advance<T>(
|
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
export type BipedalGenerator<This, T, A extends unknown[]> = (
|
|
24
|
+
this: This,
|
|
25
|
+
then: <U>(value: MaybePromiseLike<U>) => Iterable<unknown, U, unknown>,
|
|
26
|
+
...args: A
|
|
27
|
+
) => Generator<unknown, T, unknown>;
|
|
28
|
+
|
|
29
|
+
/* #__NO_SIDE_EFFECTS__ */
|
|
23
30
|
export function bipedal<This, T, A extends unknown[]>(
|
|
24
|
-
fn:
|
|
25
|
-
|
|
26
|
-
then: <U>(value: U | PromiseLike<U>) => Iterable<unknown, U, unknown>,
|
|
27
|
-
...args: A
|
|
28
|
-
) => Generator<unknown, T, unknown>,
|
|
31
|
+
fn: BipedalGenerator<This, T, A>,
|
|
32
|
+
bindThis?: This,
|
|
29
33
|
): { (this: This, ...args: A): MaybePromiseLike<T> } {
|
|
30
|
-
|
|
34
|
+
function result(this: This, ...args: A): MaybePromiseLike<T> {
|
|
31
35
|
const iterator = fn.call(
|
|
32
36
|
this,
|
|
33
37
|
function* <U>(
|
|
34
|
-
value:
|
|
38
|
+
value: MaybePromiseLike<U>,
|
|
35
39
|
): Generator<
|
|
36
40
|
PromiseLike<U>,
|
|
37
41
|
U,
|
|
@@ -51,5 +55,11 @@ export function bipedal<This, T, A extends unknown[]>(
|
|
|
51
55
|
...args,
|
|
52
56
|
) as never;
|
|
53
57
|
return advance(iterator, undefined);
|
|
54
|
-
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (bindThis) {
|
|
61
|
+
return result.bind(bindThis);
|
|
62
|
+
} else {
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
55
65
|
}
|
package/src/buffer.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import type { Field } from "./field/index.js";
|
|
2
|
+
import { field } from "./field/index.js";
|
|
3
|
+
|
|
4
|
+
export const EmptyUint8Array = new Uint8Array(0);
|
|
3
5
|
|
|
4
6
|
export interface Converter<From, To> {
|
|
5
7
|
convert: (value: From) => To;
|
|
@@ -11,244 +13,306 @@ export interface BufferLengthConverter<K, KT> extends Converter<KT, number> {
|
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
export interface BufferLike {
|
|
14
|
-
(length: number): Field<Uint8Array, never, never>;
|
|
16
|
+
(length: number): Field<Uint8Array, never, never, Uint8Array>;
|
|
15
17
|
<U>(
|
|
16
18
|
length: number,
|
|
17
19
|
converter: Converter<Uint8Array, U>,
|
|
18
|
-
): Field<U, never, never>;
|
|
20
|
+
): Field<U, never, never, Uint8Array>;
|
|
19
21
|
|
|
20
|
-
<K extends string>(
|
|
22
|
+
<K extends string>(
|
|
23
|
+
lengthField: K,
|
|
24
|
+
): Field<Uint8Array, K, Record<K, number>, Uint8Array>;
|
|
21
25
|
<K extends string, U>(
|
|
22
26
|
lengthField: K,
|
|
23
27
|
converter: Converter<Uint8Array, U>,
|
|
24
|
-
): Field<U, K, Record<K, number
|
|
28
|
+
): Field<U, K, Record<K, number>, Uint8Array>;
|
|
25
29
|
|
|
26
30
|
<K extends string, KT>(
|
|
27
31
|
length: BufferLengthConverter<K, KT>,
|
|
28
|
-
): Field<Uint8Array, K, Record<K, KT
|
|
32
|
+
): Field<Uint8Array, K, Record<K, KT>, Uint8Array>;
|
|
29
33
|
<K extends string, KT, U>(
|
|
30
34
|
length: BufferLengthConverter<K, KT>,
|
|
31
35
|
converter: Converter<Uint8Array, U>,
|
|
32
|
-
): Field<U, K, Record<K, KT
|
|
36
|
+
): Field<U, K, Record<K, KT>, Uint8Array>;
|
|
33
37
|
|
|
34
|
-
<
|
|
35
|
-
length: Field<number,
|
|
36
|
-
): Field<Uint8Array,
|
|
37
|
-
<
|
|
38
|
-
length: Field<number,
|
|
38
|
+
<LengthOmitInit extends string, LengthDependencies>(
|
|
39
|
+
length: Field<number, LengthOmitInit, LengthDependencies, number>,
|
|
40
|
+
): Field<Uint8Array, LengthOmitInit, LengthDependencies, Uint8Array>;
|
|
41
|
+
<LengthOmitInit extends string, LengthDependencies, U>(
|
|
42
|
+
length: Field<number, LengthOmitInit, LengthDependencies, number>,
|
|
39
43
|
converter: Converter<Uint8Array, U>,
|
|
40
|
-
): Field<U,
|
|
44
|
+
): Field<U, LengthOmitInit, LengthDependencies, Uint8Array>;
|
|
41
45
|
}
|
|
42
46
|
|
|
43
|
-
|
|
47
|
+
function _buffer(length: number): Field<Uint8Array, never, never, Uint8Array>;
|
|
48
|
+
function _buffer<U>(
|
|
49
|
+
length: number,
|
|
50
|
+
converter: Converter<Uint8Array, U>,
|
|
51
|
+
): Field<U, never, never, Uint8Array>;
|
|
44
52
|
|
|
45
|
-
|
|
53
|
+
function _buffer<K extends string>(
|
|
54
|
+
lengthField: K,
|
|
55
|
+
): Field<Uint8Array, K, Record<K, number>, Uint8Array>;
|
|
56
|
+
function _buffer<K extends string, U>(
|
|
57
|
+
lengthField: K,
|
|
58
|
+
converter: Converter<Uint8Array, U>,
|
|
59
|
+
): Field<U, K, Record<K, number>, Uint8Array>;
|
|
60
|
+
|
|
61
|
+
function _buffer<K extends string, KT>(
|
|
62
|
+
length: BufferLengthConverter<K, KT>,
|
|
63
|
+
): Field<Uint8Array, K, Record<K, KT>, Uint8Array>;
|
|
64
|
+
function _buffer<K extends string, KT, U>(
|
|
65
|
+
length: BufferLengthConverter<K, KT>,
|
|
66
|
+
converter: Converter<Uint8Array, U>,
|
|
67
|
+
): Field<U, K, Record<K, KT>, Uint8Array>;
|
|
68
|
+
|
|
69
|
+
function _buffer<LengthOmitInit extends string, LengthDependencies>(
|
|
70
|
+
length: Field<number, LengthOmitInit, LengthDependencies, number>,
|
|
71
|
+
): Field<Uint8Array, LengthOmitInit, LengthDependencies, Uint8Array>;
|
|
72
|
+
function _buffer<LengthOmitInit extends string, LengthDependencies, U>(
|
|
73
|
+
length: Field<number, LengthOmitInit, LengthDependencies, number>,
|
|
74
|
+
converter: Converter<Uint8Array, U>,
|
|
75
|
+
): Field<U, LengthOmitInit, LengthDependencies, Uint8Array>;
|
|
76
|
+
|
|
77
|
+
/* #__NO_SIDE_EFFECTS__ */
|
|
78
|
+
function _buffer(
|
|
46
79
|
lengthOrField:
|
|
47
80
|
| string
|
|
48
81
|
| number
|
|
49
|
-
| Field<number,
|
|
82
|
+
| Field<number, string, unknown, number>
|
|
50
83
|
| BufferLengthConverter<string, unknown>,
|
|
51
84
|
converter?: Converter<Uint8Array, unknown>,
|
|
52
|
-
): Field<unknown, string, Record<string, unknown
|
|
85
|
+
): Field<unknown, string, Record<string, unknown>, Uint8Array> {
|
|
86
|
+
// Fixed length
|
|
53
87
|
if (typeof lengthOrField === "number") {
|
|
54
88
|
if (converter) {
|
|
55
89
|
if (lengthOrField === 0) {
|
|
56
|
-
return
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
90
|
+
return field(
|
|
91
|
+
0,
|
|
92
|
+
"byob",
|
|
93
|
+
() => {},
|
|
94
|
+
// eslint-disable-next-line require-yield
|
|
95
|
+
function* () {
|
|
96
|
+
return converter.convert(EmptyUint8Array);
|
|
97
|
+
},
|
|
98
|
+
);
|
|
61
99
|
}
|
|
62
100
|
|
|
63
|
-
return
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
index,
|
|
69
|
-
);
|
|
101
|
+
return field(
|
|
102
|
+
0,
|
|
103
|
+
"byob",
|
|
104
|
+
(value, { buffer, index }) => {
|
|
105
|
+
buffer.set(value.slice(0, lengthOrField), index);
|
|
70
106
|
},
|
|
71
|
-
|
|
107
|
+
function* (then, reader) {
|
|
72
108
|
const array = yield* then(
|
|
73
109
|
reader.readExactly(lengthOrField),
|
|
74
110
|
);
|
|
75
111
|
return converter.convert(array);
|
|
76
|
-
}
|
|
77
|
-
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
init(value) {
|
|
115
|
+
return converter.back(value);
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
);
|
|
78
119
|
}
|
|
79
120
|
|
|
80
121
|
if (lengthOrField === 0) {
|
|
81
|
-
return
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
122
|
+
return field(
|
|
123
|
+
0,
|
|
124
|
+
"byob",
|
|
125
|
+
() => {},
|
|
126
|
+
// eslint-disable-next-line require-yield
|
|
127
|
+
function* () {
|
|
128
|
+
return EmptyUint8Array;
|
|
129
|
+
},
|
|
130
|
+
);
|
|
86
131
|
}
|
|
87
132
|
|
|
88
|
-
return
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
133
|
+
return field(
|
|
134
|
+
0,
|
|
135
|
+
"byob",
|
|
136
|
+
(value, { buffer, index }) => {
|
|
137
|
+
buffer.set(value.slice(0, lengthOrField), index);
|
|
138
|
+
},
|
|
139
|
+
// eslint-disable-next-line require-yield
|
|
140
|
+
function* (_then, reader) {
|
|
141
|
+
return reader.readExactly(lengthOrField);
|
|
95
142
|
},
|
|
96
|
-
|
|
97
|
-
};
|
|
143
|
+
);
|
|
98
144
|
}
|
|
99
145
|
|
|
100
|
-
//
|
|
146
|
+
// Declare length field
|
|
147
|
+
// Some field types are `function`s
|
|
101
148
|
if (
|
|
102
149
|
(typeof lengthOrField === "object" ||
|
|
103
150
|
typeof lengthOrField === "function") &&
|
|
104
151
|
"serialize" in lengthOrField
|
|
105
152
|
) {
|
|
106
153
|
if (converter) {
|
|
107
|
-
return
|
|
108
|
-
size
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
lengthOrField.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
154
|
+
return field(
|
|
155
|
+
lengthOrField.size,
|
|
156
|
+
"default",
|
|
157
|
+
(value, { littleEndian }) => {
|
|
158
|
+
if (lengthOrField.type === "default") {
|
|
159
|
+
const lengthBuffer = lengthOrField.serialize(
|
|
160
|
+
value.length,
|
|
161
|
+
{ littleEndian },
|
|
162
|
+
);
|
|
163
|
+
const result = new Uint8Array(
|
|
164
|
+
lengthBuffer.length + value.length,
|
|
165
|
+
);
|
|
166
|
+
result.set(lengthBuffer, 0);
|
|
167
|
+
result.set(value, lengthBuffer.length);
|
|
168
|
+
return result;
|
|
169
|
+
} else {
|
|
170
|
+
const result = new Uint8Array(
|
|
171
|
+
lengthOrField.size + value.length,
|
|
172
|
+
);
|
|
173
|
+
lengthOrField.serialize(value.length, {
|
|
174
|
+
buffer: result,
|
|
175
|
+
index: 0,
|
|
176
|
+
littleEndian,
|
|
177
|
+
});
|
|
178
|
+
result.set(value, lengthOrField.size);
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
123
181
|
},
|
|
124
|
-
|
|
182
|
+
function* (then, reader, context) {
|
|
125
183
|
const length = yield* then(
|
|
126
|
-
lengthOrField.deserialize(context),
|
|
127
|
-
);
|
|
128
|
-
const array = yield* then(
|
|
129
|
-
context.reader.readExactly(length),
|
|
184
|
+
lengthOrField.deserialize(reader, context),
|
|
130
185
|
);
|
|
186
|
+
const array = yield* then(reader.readExactly(length));
|
|
131
187
|
return converter.convert(array);
|
|
132
|
-
}
|
|
133
|
-
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
init(value) {
|
|
191
|
+
return converter.back(value);
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
);
|
|
134
195
|
}
|
|
135
196
|
|
|
136
|
-
return
|
|
137
|
-
size
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
lengthOrField.
|
|
142
|
-
|
|
197
|
+
return field(
|
|
198
|
+
lengthOrField.size,
|
|
199
|
+
"default",
|
|
200
|
+
(value, { littleEndian }) => {
|
|
201
|
+
if (lengthOrField.type === "default") {
|
|
202
|
+
const lengthBuffer = lengthOrField.serialize(value.length, {
|
|
203
|
+
littleEndian,
|
|
204
|
+
});
|
|
205
|
+
const result = new Uint8Array(
|
|
206
|
+
lengthBuffer.length + value.length,
|
|
207
|
+
);
|
|
208
|
+
result.set(lengthBuffer, 0);
|
|
209
|
+
result.set(value, lengthBuffer.length);
|
|
210
|
+
return result;
|
|
211
|
+
} else {
|
|
212
|
+
const result = new Uint8Array(
|
|
213
|
+
lengthOrField.size + value.length,
|
|
214
|
+
);
|
|
215
|
+
lengthOrField.serialize(value.length, {
|
|
216
|
+
buffer: result,
|
|
217
|
+
index: 0,
|
|
218
|
+
littleEndian,
|
|
219
|
+
});
|
|
220
|
+
result.set(value, lengthOrField.size);
|
|
221
|
+
return result;
|
|
222
|
+
}
|
|
143
223
|
},
|
|
144
|
-
|
|
145
|
-
const
|
|
146
|
-
lengthOrField.
|
|
147
|
-
lengthOrField.size;
|
|
148
|
-
lengthOrField.serialize((value as Uint8Array).length, context);
|
|
149
|
-
context.buffer.set(
|
|
150
|
-
value as Uint8Array,
|
|
151
|
-
context.index + lengthFieldSize,
|
|
224
|
+
function* (then, reader, context) {
|
|
225
|
+
const length = yield* then(
|
|
226
|
+
lengthOrField.deserialize(reader, context),
|
|
152
227
|
);
|
|
228
|
+
return yield* then(reader.readExactly(length));
|
|
153
229
|
},
|
|
154
|
-
|
|
155
|
-
const length = yield* then(lengthOrField.deserialize(context));
|
|
156
|
-
return context.reader.readExactly(length);
|
|
157
|
-
}),
|
|
158
|
-
};
|
|
230
|
+
);
|
|
159
231
|
}
|
|
160
232
|
|
|
233
|
+
// Reference exiting length field
|
|
161
234
|
if (typeof lengthOrField === "string") {
|
|
162
235
|
if (converter) {
|
|
163
|
-
return
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
},
|
|
171
|
-
serialize: (value, { buffer, index }) => {
|
|
172
|
-
buffer.set(converter.back(value), index);
|
|
173
|
-
},
|
|
174
|
-
deserialize: bipedal(function* (
|
|
175
|
-
then,
|
|
176
|
-
{ reader, runtimeStruct },
|
|
177
|
-
) {
|
|
178
|
-
const length = runtimeStruct[lengthOrField] as number;
|
|
236
|
+
return field(
|
|
237
|
+
0,
|
|
238
|
+
"default",
|
|
239
|
+
(source) => source,
|
|
240
|
+
// eslint-disable-next-line require-yield
|
|
241
|
+
function* (_then, reader, { dependencies }) {
|
|
242
|
+
const length = dependencies[lengthOrField] as number;
|
|
179
243
|
if (length === 0) {
|
|
180
|
-
return
|
|
244
|
+
return EmptyUint8Array;
|
|
181
245
|
}
|
|
182
246
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
247
|
+
return reader.readExactly(length);
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
init(value, dependencies) {
|
|
251
|
+
const array = converter.back(value);
|
|
252
|
+
dependencies[lengthOrField] = array.length;
|
|
253
|
+
return array;
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
);
|
|
187
257
|
}
|
|
188
258
|
|
|
189
|
-
return
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
},
|
|
197
|
-
serialize: (value, { buffer, index }) => {
|
|
198
|
-
buffer.set(value as Uint8Array, index);
|
|
199
|
-
},
|
|
200
|
-
deserialize: ({ reader, runtimeStruct }) => {
|
|
201
|
-
const length = runtimeStruct[lengthOrField] as number;
|
|
259
|
+
return field(
|
|
260
|
+
0,
|
|
261
|
+
"default",
|
|
262
|
+
(source) => source,
|
|
263
|
+
// eslint-disable-next-line require-yield
|
|
264
|
+
function* (_then, reader, { dependencies }) {
|
|
265
|
+
const length = dependencies[lengthOrField] as number;
|
|
202
266
|
if (length === 0) {
|
|
203
267
|
return EmptyUint8Array;
|
|
204
268
|
}
|
|
205
269
|
|
|
206
270
|
return reader.readExactly(length);
|
|
207
271
|
},
|
|
208
|
-
|
|
272
|
+
{
|
|
273
|
+
init(value, dependencies) {
|
|
274
|
+
dependencies[lengthOrField] = (value as Uint8Array).length;
|
|
275
|
+
return undefined;
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
);
|
|
209
279
|
}
|
|
210
280
|
|
|
281
|
+
// Reference existing length field + converter
|
|
211
282
|
if (converter) {
|
|
212
|
-
return
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
return converter.back(value).length;
|
|
220
|
-
},
|
|
221
|
-
serialize: (value, { buffer, index }) => {
|
|
222
|
-
buffer.set(converter.back(value), index);
|
|
223
|
-
},
|
|
224
|
-
deserialize: bipedal(function* (then, { reader, runtimeStruct }) {
|
|
225
|
-
const rawLength = runtimeStruct[lengthOrField.field];
|
|
283
|
+
return field(
|
|
284
|
+
0,
|
|
285
|
+
"default",
|
|
286
|
+
(source) => source,
|
|
287
|
+
// eslint-disable-next-line require-yield
|
|
288
|
+
function* (_then, reader, { dependencies }) {
|
|
289
|
+
const rawLength = dependencies[lengthOrField.field];
|
|
226
290
|
const length = lengthOrField.convert(rawLength);
|
|
227
291
|
if (length === 0) {
|
|
228
|
-
return
|
|
292
|
+
return EmptyUint8Array;
|
|
229
293
|
}
|
|
230
294
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
295
|
+
return reader.readExactly(length);
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
init(value, dependencies) {
|
|
299
|
+
const array = converter.back(value);
|
|
300
|
+
dependencies[lengthOrField.field] = lengthOrField.back(
|
|
301
|
+
array.length,
|
|
302
|
+
);
|
|
303
|
+
return array;
|
|
304
|
+
},
|
|
305
|
+
},
|
|
306
|
+
);
|
|
235
307
|
}
|
|
236
308
|
|
|
237
|
-
return
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
dynamicSize: (value) => {
|
|
245
|
-
return (value as Uint8Array).length;
|
|
246
|
-
},
|
|
247
|
-
serialize: (value, { buffer, index }) => {
|
|
248
|
-
buffer.set(value as Uint8Array, index);
|
|
249
|
-
},
|
|
250
|
-
deserialize: ({ reader, runtimeStruct }) => {
|
|
251
|
-
const rawLength = runtimeStruct[lengthOrField.field];
|
|
309
|
+
return field(
|
|
310
|
+
0,
|
|
311
|
+
"default",
|
|
312
|
+
(source) => source,
|
|
313
|
+
// eslint-disable-next-line require-yield
|
|
314
|
+
function* (_then, reader, { dependencies }) {
|
|
315
|
+
const rawLength = dependencies[lengthOrField.field];
|
|
252
316
|
const length = lengthOrField.convert(rawLength);
|
|
253
317
|
if (length === 0) {
|
|
254
318
|
return EmptyUint8Array;
|
|
@@ -256,5 +320,15 @@ export const buffer: BufferLike = function (
|
|
|
256
320
|
|
|
257
321
|
return reader.readExactly(length);
|
|
258
322
|
},
|
|
259
|
-
|
|
260
|
-
|
|
323
|
+
{
|
|
324
|
+
init(value, dependencies) {
|
|
325
|
+
dependencies[lengthOrField.field] = lengthOrField.back(
|
|
326
|
+
(value as Uint8Array).length,
|
|
327
|
+
);
|
|
328
|
+
return undefined;
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
export const buffer = _buffer;
|