@yume-chan/struct 1.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +1 -1
  3. package/esm/bipedal.d.ts +2 -1
  4. package/esm/bipedal.d.ts.map +1 -1
  5. package/esm/bipedal.js +10 -3
  6. package/esm/bipedal.js.map +1 -1
  7. package/esm/buffer.d.ts +20 -11
  8. package/esm/buffer.d.ts.map +1 -1
  9. package/esm/buffer.js +137 -140
  10. package/esm/buffer.js.map +1 -1
  11. package/esm/concat.d.ts +13 -0
  12. package/esm/concat.d.ts.map +1 -0
  13. package/esm/concat.js +10 -0
  14. package/esm/concat.js.map +1 -0
  15. package/esm/extend.d.ts +6 -0
  16. package/esm/extend.d.ts.map +1 -0
  17. package/esm/extend.js +10 -0
  18. package/esm/extend.js.map +1 -0
  19. package/esm/field/factory.d.ts +13 -0
  20. package/esm/field/factory.d.ts.map +1 -0
  21. package/esm/field/factory.js +21 -0
  22. package/esm/field/factory.js.map +1 -0
  23. package/esm/field/index.d.ts +4 -0
  24. package/esm/field/index.d.ts.map +1 -0
  25. package/esm/field/index.js +4 -0
  26. package/esm/field/index.js.map +1 -0
  27. package/esm/field/serialize.d.ts +8 -0
  28. package/esm/field/serialize.d.ts.map +1 -0
  29. package/esm/field/serialize.js +33 -0
  30. package/esm/field/serialize.js.map +1 -0
  31. package/esm/field/types.d.ts +33 -0
  32. package/esm/field/types.d.ts.map +1 -0
  33. package/esm/field/types.js +2 -0
  34. package/esm/field/types.js.map +1 -0
  35. package/esm/index.d.ts +4 -1
  36. package/esm/index.d.ts.map +1 -1
  37. package/esm/index.js +4 -1
  38. package/esm/index.js.map +1 -1
  39. package/esm/number.d.ts +3 -3
  40. package/esm/number.d.ts.map +1 -1
  41. package/esm/number.js +29 -31
  42. package/esm/number.js.map +1 -1
  43. package/esm/readable.d.ts +6 -0
  44. package/esm/readable.d.ts.map +1 -1
  45. package/esm/readable.js +19 -0
  46. package/esm/readable.js.map +1 -1
  47. package/esm/string.d.ts +1 -1
  48. package/esm/string.d.ts.map +1 -1
  49. package/esm/string.js +4 -5
  50. package/esm/string.js.map +1 -1
  51. package/esm/struct.d.ts +20 -22
  52. package/esm/struct.d.ts.map +1 -1
  53. package/esm/struct.js +64 -20
  54. package/esm/struct.js.map +1 -1
  55. package/esm/types.d.ts +18 -0
  56. package/esm/types.d.ts.map +1 -0
  57. package/esm/types.js +2 -0
  58. package/esm/types.js.map +1 -0
  59. package/package.json +6 -6
  60. package/src/bipedal.ts +18 -8
  61. package/src/buffer.ts +236 -162
  62. package/src/concat.ts +78 -0
  63. package/src/extend.ts +37 -0
  64. package/src/field/factory.ts +64 -0
  65. package/src/field/index.ts +3 -0
  66. package/src/field/serialize.ts +58 -0
  67. package/src/field/types.ts +48 -0
  68. package/src/index.ts +4 -1
  69. package/src/number.ts +48 -37
  70. package/src/readable.ts +28 -0
  71. package/src/string.ts +6 -8
  72. package/src/struct.ts +140 -88
  73. package/src/types.ts +34 -0
  74. package/tsconfig.build.tsbuildinfo +1 -1
  75. package/esm/field.d.ts +0 -21
  76. package/esm/field.d.ts.map +0 -1
  77. package/esm/field.js +0 -2
  78. package/esm/field.js.map +0 -1
  79. package/src/field.ts +0 -27
package/esm/struct.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"struct.js","sourceRoot":"","sources":["../src/struct.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"struct.js","sourceRoot":"","sources":["../src/struct.ts"],"names":[],"mappings":"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"}
package/esm/types.d.ts ADDED
@@ -0,0 +1,18 @@
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
+ serialize(source: T): Uint8Array;
7
+ serialize(source: T, buffer: Uint8Array): number;
8
+ serialize(source: T, context: StructSerializeContext): number;
9
+ }
10
+ export type StructInit<T extends StructSerializer<unknown>> = T extends StructSerializer<infer U> ? U : never;
11
+ export interface StructDeserializer<T> extends FieldDeserializer<T, never> {
12
+ size: number;
13
+ deserialize(reader: ExactReadable): T;
14
+ deserialize(reader: AsyncExactReadable): MaybePromiseLike<T>;
15
+ }
16
+ export type StructValue<T extends StructDeserializer<unknown>> = T extends StructDeserializer<infer P> ? P : never;
17
+ export type StructLike<T> = StructSerializer<T> & StructDeserializer<T>;
18
+ //# 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,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
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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": "1.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "C-style structure serializer and deserializer.",
5
5
  "keywords": [
6
6
  "structure",
@@ -29,14 +29,14 @@
29
29
  "sideEffects": false,
30
30
  "dependencies": {
31
31
  "@yume-chan/async": "^4.0.2",
32
- "@yume-chan/no-data-view": "^1.0.0"
32
+ "@yume-chan/no-data-view": "^2.0.0"
33
33
  },
34
34
  "devDependencies": {
35
- "@types/node": "^22.10.0",
36
- "prettier": "^3.4.1",
37
- "typescript": "^5.7.2",
38
- "@yume-chan/tsconfig": "^1.0.0",
35
+ "@types/node": "^22.13.10",
36
+ "prettier": "^3.5.3",
37
+ "typescript": "^5.8.2",
39
38
  "@yume-chan/eslint-config": "^1.0.0",
39
+ "@yume-chan/tsconfig": "^1.0.0",
40
40
  "@yume-chan/test-runner": "^1.0.0"
41
41
  },
42
42
  "scripts": {
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
- this: This,
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
- return function (this: This, ...args: A) {
34
+ function result(this: This, ...args: A): MaybePromiseLike<T> {
31
35
  const iterator = fn.call(
32
36
  this,
33
37
  function* <U>(
34
- value: U | PromiseLike<U>,
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 { bipedal } from "./bipedal.js";
2
- import type { Field } from "./field.js";
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>(lengthField: K): Field<Uint8Array, K, Record<K, number>>;
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
- <KOmitInit extends string, KS>(
35
- length: Field<number, KOmitInit, KS>,
36
- ): Field<Uint8Array, KOmitInit, KS>;
37
- <KOmitInit extends string, KS, U>(
38
- length: Field<number, KOmitInit, KS>,
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, KOmitInit, KS>;
44
+ ): Field<U, LengthOmitInit, LengthDependencies, Uint8Array>;
41
45
  }
42
46
 
43
- export const EmptyUint8Array = new Uint8Array(0);
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
- export const buffer: BufferLike = function (
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, never, unknown>
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
- size: 0,
58
- serialize: () => {},
59
- deserialize: () => converter.convert(EmptyUint8Array),
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
- size: lengthOrField,
65
- serialize: (value, { buffer, index }) => {
66
- buffer.set(
67
- converter.back(value).slice(0, lengthOrField),
68
- index,
69
- );
101
+ return field(
102
+ lengthOrField,
103
+ "byob",
104
+ (value, { buffer, index }) => {
105
+ buffer.set(value.slice(0, lengthOrField), index);
70
106
  },
71
- deserialize: bipedal(function* (then, { reader }) {
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
- size: 0,
83
- serialize: () => {},
84
- deserialize: () => EmptyUint8Array,
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
- size: lengthOrField,
90
- serialize: (value, { buffer, index }) => {
91
- buffer.set(
92
- (value as Uint8Array).slice(0, lengthOrField),
93
- index,
94
- );
133
+ return field(
134
+ lengthOrField,
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
- deserialize: ({ reader }) => reader.readExactly(lengthOrField),
97
- };
143
+ );
98
144
  }
99
145
 
100
- // Some Field type might be `function`s
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: 0,
109
- dynamicSize(value) {
110
- const array = converter.back(value);
111
- const lengthFieldSize =
112
- lengthOrField.dynamicSize?.(array.length) ??
113
- lengthOrField.size;
114
- return lengthFieldSize + array.length;
115
- },
116
- serialize(value, context) {
117
- const array = converter.back(value);
118
- const lengthFieldSize =
119
- lengthOrField.dynamicSize?.(array.length) ??
120
- lengthOrField.size;
121
- lengthOrField.serialize(array.length, context);
122
- context.buffer.set(array, context.index + lengthFieldSize);
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
- deserialize: bipedal(function* (then, context) {
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: 0,
138
- dynamicSize(value) {
139
- const lengthFieldSize =
140
- lengthOrField.dynamicSize?.((value as Uint8Array).length) ??
141
- lengthOrField.size;
142
- return lengthFieldSize + (value as Uint8Array).length;
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
- serialize(value, context) {
145
- const lengthFieldSize =
146
- lengthOrField.dynamicSize?.((value as Uint8Array).length) ??
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
- deserialize: bipedal(function* (then, context) {
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
- size: 0,
165
- preSerialize: (value, runtimeStruct) => {
166
- runtimeStruct[lengthOrField] = converter.back(value).length;
167
- },
168
- dynamicSize: (value) => {
169
- return converter.back(value).length;
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 converter.convert(EmptyUint8Array);
244
+ return EmptyUint8Array;
181
245
  }
182
246
 
183
- const value = yield* then(reader.readExactly(length));
184
- return converter.convert(value);
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
- size: 0,
191
- preSerialize: (value, runtimeStruct) => {
192
- runtimeStruct[lengthOrField] = (value as Uint8Array).length;
193
- },
194
- dynamicSize: (value) => {
195
- return (value as Uint8Array).length;
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
- size: 0,
214
- preSerialize: (value, runtimeStruct) => {
215
- const length = converter.back(value).length;
216
- runtimeStruct[lengthOrField.field] = lengthOrField.back(length);
217
- },
218
- dynamicSize: (value) => {
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 converter.convert(EmptyUint8Array);
292
+ return EmptyUint8Array;
229
293
  }
230
294
 
231
- const value = yield* then(reader.readExactly(length));
232
- return converter.convert(value);
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
- size: 0,
239
- preSerialize: (value, runtimeStruct) => {
240
- runtimeStruct[lengthOrField.field] = lengthOrField.back(
241
- (value as Uint8Array).length,
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
- } as never;
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;