@solana/codecs-data-structures 2.0.0-experimental.5586a1b → 2.0.0-experimental.58ab189

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 (46) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +482 -4
  3. package/dist/index.browser.cjs +408 -482
  4. package/dist/index.browser.cjs.map +1 -1
  5. package/dist/index.browser.js +412 -480
  6. package/dist/index.browser.js.map +1 -1
  7. package/dist/index.native.js +410 -480
  8. package/dist/index.native.js.map +1 -1
  9. package/dist/index.node.cjs +408 -482
  10. package/dist/index.node.cjs.map +1 -1
  11. package/dist/index.node.js +410 -480
  12. package/dist/index.node.js.map +1 -1
  13. package/dist/types/array.d.ts +39 -10
  14. package/dist/types/array.d.ts.map +1 -0
  15. package/dist/types/assertions.d.ts.map +1 -0
  16. package/dist/types/bit-array.d.ts +9 -9
  17. package/dist/types/bit-array.d.ts.map +1 -0
  18. package/dist/types/boolean.d.ts +22 -10
  19. package/dist/types/boolean.d.ts.map +1 -0
  20. package/dist/types/bytes.d.ts +18 -9
  21. package/dist/types/bytes.d.ts.map +1 -0
  22. package/dist/types/data-enum.d.ts +22 -24
  23. package/dist/types/data-enum.d.ts.map +1 -0
  24. package/dist/types/index.d.ts +13 -14
  25. package/dist/types/index.d.ts.map +1 -0
  26. package/dist/types/map.d.ts +28 -10
  27. package/dist/types/map.d.ts.map +1 -0
  28. package/dist/types/nullable.d.ts +28 -10
  29. package/dist/types/nullable.d.ts.map +1 -0
  30. package/dist/types/scalar-enum.d.ts +46 -15
  31. package/dist/types/scalar-enum.d.ts.map +1 -0
  32. package/dist/types/set.d.ts +28 -10
  33. package/dist/types/set.d.ts.map +1 -0
  34. package/dist/types/struct.d.ts +16 -21
  35. package/dist/types/struct.d.ts.map +1 -0
  36. package/dist/types/tuple.d.ts +22 -15
  37. package/dist/types/tuple.d.ts.map +1 -0
  38. package/dist/types/unit.d.ts +4 -12
  39. package/dist/types/unit.d.ts.map +1 -0
  40. package/dist/types/utils.d.ts +10 -2
  41. package/dist/types/utils.d.ts.map +1 -0
  42. package/package.json +13 -35
  43. package/dist/index.development.js +0 -865
  44. package/dist/index.development.js.map +0 -1
  45. package/dist/index.production.min.js +0 -51
  46. package/dist/types/array-like-codec-size.d.ts +0 -20
@@ -5,7 +5,12 @@ var codecsNumbers = require('@solana/codecs-numbers');
5
5
 
6
6
  // src/array.ts
7
7
 
8
- // src/utils.ts
8
+ // src/assertions.ts
9
+ function assertValidNumberOfItemsForCodec(codecDescription, expected, actual) {
10
+ if (expected !== actual) {
11
+ throw new Error(`Expected [${codecDescription}] to have ${expected} items, got ${actual}.`);
12
+ }
13
+ }
9
14
  function maxCodecSizes(sizes) {
10
15
  return sizes.reduce(
11
16
  (all, size) => all === null || size === null ? null : Math.max(all, size),
@@ -15,106 +20,88 @@ function maxCodecSizes(sizes) {
15
20
  function sumCodecSizes(sizes) {
16
21
  return sizes.reduce((all, size) => all === null || size === null ? null : all + size, 0);
17
22
  }
18
-
19
- // src/array-like-codec-size.ts
20
- function decodeArrayLikeCodecSize(size, childrenSizes, bytes, offset) {
21
- if (typeof size === "number") {
22
- return [size, offset];
23
- }
24
- if (typeof size === "object") {
25
- return size.decode(bytes, offset);
26
- }
27
- if (size === "remainder") {
28
- const childrenSize = sumCodecSizes(childrenSizes);
29
- if (childrenSize === null) {
30
- throw new Error('Codecs of "remainder" size must have fixed-size items.');
31
- }
32
- const remainder = bytes.slice(offset).length;
33
- if (remainder % childrenSize !== 0) {
34
- throw new Error(
35
- `The remainder of the byte array (${remainder} bytes) cannot be split into chunks of ${childrenSize} bytes. Codecs of "remainder" size must have a remainder that is a multiple of its item size. In other words, ${remainder} modulo ${childrenSize} should be equal to zero.`
36
- );
37
- }
38
- return [remainder / childrenSize, offset];
39
- }
40
- throw new Error(`Unrecognized array-like codec size: ${JSON.stringify(size)}`);
41
- }
42
- function getArrayLikeCodecSizeDescription(size) {
43
- return typeof size === "object" ? size.description : `${size}`;
44
- }
45
- function getArrayLikeCodecSizeFromChildren(size, childrenSizes) {
46
- if (typeof size !== "number")
47
- return null;
48
- if (size === 0)
49
- return 0;
50
- const childrenSize = sumCodecSizes(childrenSizes);
51
- return childrenSize === null ? null : childrenSize * size;
23
+ function getFixedSize(codec) {
24
+ return codecsCore.isFixedSize(codec) ? codec.fixedSize : null;
52
25
  }
53
- function getArrayLikeCodecSizePrefix(size, realSize) {
54
- return typeof size === "object" ? size.encode(realSize) : new Uint8Array();
55
- }
56
-
57
- // src/assertions.ts
58
- function assertValidNumberOfItemsForCodec(codecDescription, expected, actual) {
59
- if (expected !== actual) {
60
- throw new Error(`Expected [${codecDescription}] to have ${expected} items, got ${actual}.`);
61
- }
26
+ function getMaxSize(codec) {
27
+ return codecsCore.isFixedSize(codec) ? codec.fixedSize : codec.maxSize ?? null;
62
28
  }
63
29
 
64
30
  // src/array.ts
65
- function arrayCodecHelper(item, size, description) {
66
- if (size === "remainder" && item.fixedSize === null) {
67
- throw new Error('Codecs of "remainder" size must have fixed-size items.');
68
- }
69
- return {
70
- description: description ?? `array(${item.description}; ${getArrayLikeCodecSizeDescription(size)})`,
71
- fixedSize: getArrayLikeCodecSizeFromChildren(size, [item.fixedSize]),
72
- maxSize: getArrayLikeCodecSizeFromChildren(size, [item.maxSize])
73
- };
74
- }
75
- function getArrayEncoder(item, options = {}) {
76
- const size = options.size ?? codecsNumbers.getU32Encoder();
77
- return {
78
- ...arrayCodecHelper(item, size, options.description),
79
- encode: (value) => {
31
+ function getArrayEncoder(item, config = {}) {
32
+ const size = config.size ?? codecsNumbers.getU32Encoder();
33
+ const fixedSize = computeArrayLikeCodecSize(size, getFixedSize(item));
34
+ const maxSize = computeArrayLikeCodecSize(size, getMaxSize(item)) ?? void 0;
35
+ return codecsCore.createEncoder({
36
+ ...fixedSize !== null ? { fixedSize } : {
37
+ getSizeFromValue: (array) => {
38
+ const prefixSize = typeof size === "object" ? codecsCore.getEncodedSize(array.length, size) : 0;
39
+ return prefixSize + [...array].reduce((all, value) => all + codecsCore.getEncodedSize(value, item), 0);
40
+ },
41
+ maxSize
42
+ },
43
+ write: (array, bytes, offset) => {
80
44
  if (typeof size === "number") {
81
- assertValidNumberOfItemsForCodec("array", size, value.length);
45
+ assertValidNumberOfItemsForCodec("array", size, array.length);
82
46
  }
83
- return codecsCore.mergeBytes([getArrayLikeCodecSizePrefix(size, value.length), ...value.map((v) => item.encode(v))]);
47
+ if (typeof size === "object") {
48
+ offset = size.write(array.length, bytes, offset);
49
+ }
50
+ array.forEach((value) => {
51
+ offset = item.write(value, bytes, offset);
52
+ });
53
+ return offset;
84
54
  }
85
- };
86
- }
87
- function getArrayDecoder(item, options = {}) {
88
- const size = options.size ?? codecsNumbers.getU32Decoder();
89
- return {
90
- ...arrayCodecHelper(item, size, options.description),
91
- decode: (bytes, offset = 0) => {
55
+ });
56
+ }
57
+ function getArrayDecoder(item, config = {}) {
58
+ const size = config.size ?? codecsNumbers.getU32Decoder();
59
+ const itemSize = getFixedSize(item);
60
+ const fixedSize = computeArrayLikeCodecSize(size, itemSize);
61
+ const maxSize = computeArrayLikeCodecSize(size, getMaxSize(item)) ?? void 0;
62
+ return codecsCore.createDecoder({
63
+ ...fixedSize !== null ? { fixedSize } : { maxSize },
64
+ read: (bytes, offset) => {
65
+ const array = [];
92
66
  if (typeof size === "object" && bytes.slice(offset).length === 0) {
93
- return [[], offset];
67
+ return [array, offset];
68
+ }
69
+ if (size === "remainder") {
70
+ while (offset < bytes.length) {
71
+ const [value, newOffset2] = item.read(bytes, offset);
72
+ offset = newOffset2;
73
+ array.push(value);
74
+ }
75
+ return [array, offset];
94
76
  }
95
- const [resolvedSize, newOffset] = decodeArrayLikeCodecSize(size, [item.fixedSize], bytes, offset);
77
+ const [resolvedSize, newOffset] = typeof size === "number" ? [size, offset] : size.read(bytes, offset);
96
78
  offset = newOffset;
97
- const values = [];
98
79
  for (let i = 0; i < resolvedSize; i += 1) {
99
- const [value, newOffset2] = item.decode(bytes, offset);
100
- values.push(value);
80
+ const [value, newOffset2] = item.read(bytes, offset);
101
81
  offset = newOffset2;
82
+ array.push(value);
102
83
  }
103
- return [values, offset];
84
+ return [array, offset];
104
85
  }
105
- };
86
+ });
106
87
  }
107
- function getArrayCodec(item, options = {}) {
108
- return codecsCore.combineCodec(getArrayEncoder(item, options), getArrayDecoder(item, options));
88
+ function getArrayCodec(item, config = {}) {
89
+ return codecsCore.combineCodec(getArrayEncoder(item, config), getArrayDecoder(item, config));
109
90
  }
110
- var getBitArrayEncoder = (size, options = {}) => {
111
- const parsedOptions = typeof options === "boolean" ? { backward: options } : options;
112
- const backward = parsedOptions.backward ?? false;
113
- const backwardSuffix = backward ? "; backward" : "";
114
- return {
115
- description: parsedOptions.description ?? `bitArray(${size}${backwardSuffix})`,
116
- encode(value) {
117
- const bytes = [];
91
+ function computeArrayLikeCodecSize(size, itemSize) {
92
+ if (typeof size !== "number")
93
+ return null;
94
+ if (size === 0)
95
+ return 0;
96
+ return itemSize === null ? null : itemSize * size;
97
+ }
98
+ function getBitArrayEncoder(size, config = {}) {
99
+ const parsedConfig = typeof config === "boolean" ? { backward: config } : config;
100
+ const backward = parsedConfig.backward ?? false;
101
+ return codecsCore.createEncoder({
102
+ fixedSize: size,
103
+ write(value, bytes, offset) {
104
+ const bytesToAdd = [];
118
105
  for (let i = 0; i < size; i += 1) {
119
106
  let byte = 0;
120
107
  for (let j = 0; j < 8; j += 1) {
@@ -122,23 +109,22 @@ var getBitArrayEncoder = (size, options = {}) => {
122
109
  byte |= feature << (backward ? j : 7 - j);
123
110
  }
124
111
  if (backward) {
125
- bytes.unshift(byte);
112
+ bytesToAdd.unshift(byte);
126
113
  } else {
127
- bytes.push(byte);
114
+ bytesToAdd.push(byte);
128
115
  }
129
116
  }
130
- return new Uint8Array(bytes);
131
- },
117
+ bytes.set(bytesToAdd, offset);
118
+ return size;
119
+ }
120
+ });
121
+ }
122
+ function getBitArrayDecoder(size, config = {}) {
123
+ const parsedConfig = typeof config === "boolean" ? { backward: config } : config;
124
+ const backward = parsedConfig.backward ?? false;
125
+ return codecsCore.createDecoder({
132
126
  fixedSize: size,
133
- maxSize: size
134
- };
135
- };
136
- var getBitArrayDecoder = (size, options = {}) => {
137
- const parsedOptions = typeof options === "boolean" ? { backward: options } : options;
138
- const backward = parsedOptions.backward ?? false;
139
- const backwardSuffix = backward ? "; backward" : "";
140
- return {
141
- decode(bytes, offset = 0) {
127
+ read(bytes, offset) {
142
128
  codecsCore.assertByteArrayHasEnoughBytesForCodec("bitArray", size, bytes, offset);
143
129
  const booleans = [];
144
130
  let slice = bytes.slice(offset, offset + size);
@@ -155,138 +141,115 @@ var getBitArrayDecoder = (size, options = {}) => {
155
141
  }
156
142
  });
157
143
  return [booleans, offset + size];
158
- },
159
- description: parsedOptions.description ?? `bitArray(${size}${backwardSuffix})`,
160
- fixedSize: size,
161
- maxSize: size
162
- };
163
- };
164
- var getBitArrayCodec = (size, options = {}) => codecsCore.combineCodec(getBitArrayEncoder(size, options), getBitArrayDecoder(size, options));
165
- function getBooleanEncoder(options = {}) {
166
- const size = options.size ?? codecsNumbers.getU8Encoder();
167
- codecsCore.assertFixedSizeCodec(size, "Codec [bool] requires a fixed size.");
168
- return {
169
- description: options.description ?? `bool(${size.description})`,
170
- encode: (value) => size.encode(value ? 1 : 0),
171
- fixedSize: size.fixedSize,
172
- maxSize: size.fixedSize
173
- };
144
+ }
145
+ });
174
146
  }
175
- function getBooleanDecoder(options = {}) {
176
- const size = options.size ?? codecsNumbers.getU8Decoder();
177
- codecsCore.assertFixedSizeCodec(size, "Codec [bool] requires a fixed size.");
178
- return {
179
- decode: (bytes, offset = 0) => {
180
- codecsCore.assertByteArrayIsNotEmptyForCodec("bool", bytes, offset);
181
- const [value, vOffset] = size.decode(bytes, offset);
182
- return [value === 1, vOffset];
183
- },
184
- description: options.description ?? `bool(${size.description})`,
185
- fixedSize: size.fixedSize,
186
- maxSize: size.fixedSize
187
- };
147
+ function getBitArrayCodec(size, config = {}) {
148
+ return codecsCore.combineCodec(getBitArrayEncoder(size, config), getBitArrayDecoder(size, config));
188
149
  }
189
- function getBooleanCodec(options = {}) {
190
- return codecsCore.combineCodec(getBooleanEncoder(options), getBooleanDecoder(options));
191
- }
192
- function getBytesEncoder(options = {}) {
193
- const size = options.size ?? "variable";
194
- const sizeDescription = typeof size === "object" ? size.description : `${size}`;
195
- const description = options.description ?? `bytes(${sizeDescription})`;
196
- const byteEncoder = {
197
- description,
198
- encode: (value) => value,
199
- fixedSize: null,
200
- maxSize: null
201
- };
150
+ function getBooleanEncoder(config = {}) {
151
+ const size = config.size ?? codecsNumbers.getU8Encoder();
152
+ try {
153
+ codecsCore.assertIsFixedSize(size);
154
+ } catch (e) {
155
+ throw new Error("Codec [bool] requires a fixed size.");
156
+ }
157
+ return codecsCore.mapEncoder(size, (value) => value ? 1 : 0);
158
+ }
159
+ function getBooleanDecoder(config = {}) {
160
+ const size = config.size ?? codecsNumbers.getU8Decoder();
161
+ try {
162
+ codecsCore.assertIsFixedSize(size);
163
+ } catch (e) {
164
+ throw new Error("Codec [bool] requires a fixed size.");
165
+ }
166
+ return codecsCore.mapDecoder(size, (value) => Number(value) === 1);
167
+ }
168
+ function getBooleanCodec(config = {}) {
169
+ return codecsCore.combineCodec(getBooleanEncoder(config), getBooleanDecoder(config));
170
+ }
171
+ function getBytesEncoder(config = {}) {
172
+ const size = config.size ?? "variable";
173
+ const byteEncoder = codecsCore.createEncoder({
174
+ getSizeFromValue: (value) => value.length,
175
+ write: (value, bytes, offset) => {
176
+ bytes.set(value, offset);
177
+ return offset + value.length;
178
+ }
179
+ });
202
180
  if (size === "variable") {
203
181
  return byteEncoder;
204
182
  }
205
183
  if (typeof size === "number") {
206
- return codecsCore.fixEncoder(byteEncoder, size, description);
184
+ return codecsCore.fixEncoder(byteEncoder, size);
207
185
  }
208
- return {
209
- ...byteEncoder,
210
- encode: (value) => {
211
- const contentBytes = byteEncoder.encode(value);
212
- const lengthBytes = size.encode(contentBytes.length);
213
- return codecsCore.mergeBytes([lengthBytes, contentBytes]);
186
+ return codecsCore.createEncoder({
187
+ getSizeFromValue: (value) => codecsCore.getEncodedSize(value.length, size) + value.length,
188
+ write: (value, bytes, offset) => {
189
+ offset = size.write(value.length, bytes, offset);
190
+ return byteEncoder.write(value, bytes, offset);
214
191
  }
215
- };
192
+ });
216
193
  }
217
- function getBytesDecoder(options = {}) {
218
- const size = options.size ?? "variable";
219
- const sizeDescription = typeof size === "object" ? size.description : `${size}`;
220
- const description = options.description ?? `bytes(${sizeDescription})`;
221
- const byteDecoder = {
222
- decode: (bytes, offset = 0) => {
194
+ function getBytesDecoder(config = {}) {
195
+ const size = config.size ?? "variable";
196
+ const byteDecoder = codecsCore.createDecoder({
197
+ read: (bytes, offset) => {
223
198
  const slice = bytes.slice(offset);
224
199
  return [slice, offset + slice.length];
225
- },
226
- description,
227
- fixedSize: null,
228
- maxSize: null
229
- };
200
+ }
201
+ });
230
202
  if (size === "variable") {
231
203
  return byteDecoder;
232
204
  }
233
205
  if (typeof size === "number") {
234
- return codecsCore.fixDecoder(byteDecoder, size, description);
206
+ return codecsCore.fixDecoder(byteDecoder, size);
235
207
  }
236
- return {
237
- ...byteDecoder,
238
- decode: (bytes, offset = 0) => {
208
+ return codecsCore.createDecoder({
209
+ read: (bytes, offset) => {
239
210
  codecsCore.assertByteArrayIsNotEmptyForCodec("bytes", bytes, offset);
240
- const [lengthBigInt, lengthOffset] = size.decode(bytes, offset);
211
+ const [lengthBigInt, lengthOffset] = size.read(bytes, offset);
241
212
  const length = Number(lengthBigInt);
242
213
  offset = lengthOffset;
243
214
  const contentBytes = bytes.slice(offset, offset + length);
244
215
  codecsCore.assertByteArrayHasEnoughBytesForCodec("bytes", length, contentBytes);
245
- const [value, contentOffset] = byteDecoder.decode(contentBytes);
216
+ const [value, contentOffset] = byteDecoder.read(contentBytes, 0);
246
217
  offset += contentOffset;
247
218
  return [value, offset];
248
219
  }
249
- };
250
- }
251
- function getBytesCodec(options = {}) {
252
- return codecsCore.combineCodec(getBytesEncoder(options), getBytesDecoder(options));
253
- }
254
- function dataEnumCodecHelper(variants, prefix, description) {
255
- const fieldDescriptions = variants.map(([name, codec]) => `${String(name)}${codec ? `: ${codec.description}` : ""}`).join(", ");
256
- const allVariantHaveTheSameFixedSize = variants.every((one, _i, all) => one[1].fixedSize === all[0][1].fixedSize);
257
- const fixedVariantSize = allVariantHaveTheSameFixedSize ? variants[0][1].fixedSize : null;
258
- const maxVariantSize = maxCodecSizes(variants.map(([, field]) => field.maxSize));
259
- return {
260
- description: description ?? `dataEnum(${fieldDescriptions}; ${prefix.description})`,
261
- fixedSize: variants.length === 0 ? prefix.fixedSize : sumCodecSizes([prefix.fixedSize, fixedVariantSize]),
262
- maxSize: variants.length === 0 ? prefix.maxSize : sumCodecSizes([prefix.maxSize, maxVariantSize])
263
- };
264
- }
265
- function getDataEnumEncoder(variants, options = {}) {
266
- const prefix = options.size ?? codecsNumbers.getU8Encoder();
267
- return {
268
- ...dataEnumCodecHelper(variants, prefix, options.description),
269
- encode: (variant) => {
270
- const discriminator = variants.findIndex(([key]) => variant.__kind === key);
271
- if (discriminator < 0) {
272
- throw new Error(
273
- `Invalid data enum variant. Expected one of [${variants.map(([key]) => key).join(", ")}], got "${variant.__kind}".`
274
- );
275
- }
276
- const variantPrefix = prefix.encode(discriminator);
277
- const variantSerializer = variants[discriminator][1];
278
- const variantBytes = variantSerializer.encode(variant);
279
- return codecsCore.mergeBytes([variantPrefix, variantBytes]);
220
+ });
221
+ }
222
+ function getBytesCodec(config = {}) {
223
+ return codecsCore.combineCodec(getBytesEncoder(config), getBytesDecoder(config));
224
+ }
225
+ function getDataEnumEncoder(variants, config = {}) {
226
+ const prefix = config.size ?? codecsNumbers.getU8Encoder();
227
+ const fixedSize = getDataEnumFixedSize(variants, prefix);
228
+ return codecsCore.createEncoder({
229
+ ...fixedSize !== null ? { fixedSize } : {
230
+ getSizeFromValue: (variant) => {
231
+ const discriminator = getVariantDiscriminator(variants, variant);
232
+ const variantEncoder = variants[discriminator][1];
233
+ return codecsCore.getEncodedSize(discriminator, prefix) + codecsCore.getEncodedSize(variant, variantEncoder);
234
+ },
235
+ maxSize: getDataEnumMaxSize(variants, prefix)
236
+ },
237
+ write: (variant, bytes, offset) => {
238
+ const discriminator = getVariantDiscriminator(variants, variant);
239
+ offset = prefix.write(discriminator, bytes, offset);
240
+ const variantEncoder = variants[discriminator][1];
241
+ return variantEncoder.write(variant, bytes, offset);
280
242
  }
281
- };
282
- }
283
- function getDataEnumDecoder(variants, options = {}) {
284
- const prefix = options.size ?? codecsNumbers.getU8Decoder();
285
- return {
286
- ...dataEnumCodecHelper(variants, prefix, options.description),
287
- decode: (bytes, offset = 0) => {
243
+ });
244
+ }
245
+ function getDataEnumDecoder(variants, config = {}) {
246
+ const prefix = config.size ?? codecsNumbers.getU8Decoder();
247
+ const fixedSize = getDataEnumFixedSize(variants, prefix);
248
+ return codecsCore.createDecoder({
249
+ ...fixedSize !== null ? { fixedSize } : { maxSize: getDataEnumMaxSize(variants, prefix) },
250
+ read: (bytes, offset) => {
288
251
  codecsCore.assertByteArrayIsNotEmptyForCodec("dataEnum", bytes, offset);
289
- const [discriminator, dOffset] = prefix.decode(bytes, offset);
252
+ const [discriminator, dOffset] = prefix.read(bytes, offset);
290
253
  offset = dOffset;
291
254
  const variantField = variants[Number(discriminator)] ?? null;
292
255
  if (!variantField) {
@@ -294,337 +257,300 @@ function getDataEnumDecoder(variants, options = {}) {
294
257
  `Enum discriminator out of range. Expected a number between 0 and ${variants.length - 1}, got ${discriminator}.`
295
258
  );
296
259
  }
297
- const [variant, vOffset] = variantField[1].decode(bytes, offset);
260
+ const [variant, vOffset] = variantField[1].read(bytes, offset);
298
261
  offset = vOffset;
299
262
  return [{ __kind: variantField[0], ...variant ?? {} }, offset];
300
263
  }
301
- };
264
+ });
302
265
  }
303
- function getDataEnumCodec(variants, options = {}) {
304
- return codecsCore.combineCodec(getDataEnumEncoder(variants, options), getDataEnumDecoder(variants, options));
266
+ function getDataEnumCodec(variants, config = {}) {
267
+ return codecsCore.combineCodec(
268
+ getDataEnumEncoder(variants, config),
269
+ getDataEnumDecoder(variants, config)
270
+ );
305
271
  }
306
- function mapCodecHelper(key, value, size, description) {
307
- if (size === "remainder" && (key.fixedSize === null || value.fixedSize === null)) {
308
- throw new Error('Codecs of "remainder" size must have fixed-size items.');
272
+ function getDataEnumFixedSize(variants, prefix) {
273
+ if (variants.length === 0)
274
+ return codecsCore.isFixedSize(prefix) ? prefix.fixedSize : null;
275
+ if (!codecsCore.isFixedSize(variants[0][1]))
276
+ return null;
277
+ const variantSize = variants[0][1].fixedSize;
278
+ const sameSizedVariants = variants.every(
279
+ (variant) => codecsCore.isFixedSize(variant[1]) && variant[1].fixedSize === variantSize
280
+ );
281
+ if (!sameSizedVariants)
282
+ return null;
283
+ return codecsCore.isFixedSize(prefix) ? prefix.fixedSize + variantSize : null;
284
+ }
285
+ function getDataEnumMaxSize(variants, prefix) {
286
+ const maxVariantSize = maxCodecSizes(variants.map(([, codec]) => getMaxSize(codec)));
287
+ return sumCodecSizes([getMaxSize(prefix), maxVariantSize]) ?? void 0;
288
+ }
289
+ function getVariantDiscriminator(variants, variant) {
290
+ const discriminator = variants.findIndex(([key]) => variant.__kind === key);
291
+ if (discriminator < 0) {
292
+ throw new Error(
293
+ `Invalid data enum variant. Expected one of [${variants.map(([key]) => key).join(", ")}], got "${variant.__kind}".`
294
+ );
309
295
  }
310
- return {
311
- description: description ?? `map(${key.description}, ${value.description}; ${getArrayLikeCodecSizeDescription(size)})`,
312
- fixedSize: getArrayLikeCodecSizeFromChildren(size, [key.fixedSize, value.fixedSize]),
313
- maxSize: getArrayLikeCodecSizeFromChildren(size, [key.maxSize, value.maxSize])
314
- };
315
- }
316
- function getMapEncoder(key, value, options = {}) {
317
- const size = options.size ?? codecsNumbers.getU32Encoder();
318
- return {
319
- ...mapCodecHelper(key, value, size, options.description),
320
- encode: (map) => {
321
- if (typeof size === "number") {
322
- assertValidNumberOfItemsForCodec("map", size, map.size);
323
- }
324
- const itemBytes = Array.from(map, ([k, v]) => codecsCore.mergeBytes([key.encode(k), value.encode(v)]));
325
- return codecsCore.mergeBytes([getArrayLikeCodecSizePrefix(size, map.size), ...itemBytes]);
296
+ return discriminator;
297
+ }
298
+ function getTupleEncoder(items) {
299
+ const fixedSize = sumCodecSizes(items.map(getFixedSize));
300
+ const maxSize = sumCodecSizes(items.map(getMaxSize)) ?? void 0;
301
+ return codecsCore.createEncoder({
302
+ ...fixedSize === null ? {
303
+ getSizeFromValue: (value) => items.map((item, index) => codecsCore.getEncodedSize(value[index], item)).reduce((all, one) => all + one, 0),
304
+ maxSize
305
+ } : { fixedSize },
306
+ write: (value, bytes, offset) => {
307
+ assertValidNumberOfItemsForCodec("tuple", items.length, value.length);
308
+ items.forEach((item, index) => {
309
+ offset = item.write(value[index], bytes, offset);
310
+ });
311
+ return offset;
326
312
  }
327
- };
313
+ });
314
+ }
315
+ function getTupleDecoder(items) {
316
+ const fixedSize = sumCodecSizes(items.map(getFixedSize));
317
+ const maxSize = sumCodecSizes(items.map(getMaxSize)) ?? void 0;
318
+ return codecsCore.createDecoder({
319
+ ...fixedSize === null ? { maxSize } : { fixedSize },
320
+ read: (bytes, offset) => {
321
+ const values = [];
322
+ items.forEach((item) => {
323
+ const [newValue, newOffset] = item.read(bytes, offset);
324
+ values.push(newValue);
325
+ offset = newOffset;
326
+ });
327
+ return [values, offset];
328
+ }
329
+ });
328
330
  }
329
- function getMapDecoder(key, value, options = {}) {
330
- const size = options.size ?? codecsNumbers.getU32Decoder();
331
- return {
332
- ...mapCodecHelper(key, value, size, options.description),
333
- decode: (bytes, offset = 0) => {
334
- const map = /* @__PURE__ */ new Map();
335
- if (typeof size === "object" && bytes.slice(offset).length === 0) {
336
- return [map, offset];
331
+ function getTupleCodec(items) {
332
+ return codecsCore.combineCodec(
333
+ getTupleEncoder(items),
334
+ getTupleDecoder(items)
335
+ );
336
+ }
337
+
338
+ // src/map.ts
339
+ function getMapEncoder(key, value, config = {}) {
340
+ return codecsCore.mapEncoder(
341
+ getArrayEncoder(getTupleEncoder([key, value]), config),
342
+ (map) => [...map.entries()]
343
+ );
344
+ }
345
+ function getMapDecoder(key, value, config = {}) {
346
+ return codecsCore.mapDecoder(
347
+ getArrayDecoder(getTupleDecoder([key, value]), config),
348
+ (entries) => new Map(entries)
349
+ );
350
+ }
351
+ function getMapCodec(key, value, config = {}) {
352
+ return codecsCore.combineCodec(getMapEncoder(key, value, config), getMapDecoder(key, value, config));
353
+ }
354
+ function getNullableEncoder(item, config = {}) {
355
+ const prefix = config.prefix ?? codecsNumbers.getU8Encoder();
356
+ const fixed = config.fixed ?? false;
357
+ const isZeroSizeItem = codecsCore.isFixedSize(item) && codecsCore.isFixedSize(prefix) && item.fixedSize === 0;
358
+ if (fixed || isZeroSizeItem) {
359
+ try {
360
+ codecsCore.assertIsFixedSize(item);
361
+ } catch (e) {
362
+ throw new Error("Fixed nullables can only be used with fixed-size codecs.");
363
+ }
364
+ try {
365
+ codecsCore.assertIsFixedSize(prefix);
366
+ } catch (e) {
367
+ throw new Error("Fixed nullables can only be used with fixed-size prefix.");
368
+ }
369
+ const fixedSize = prefix.fixedSize + item.fixedSize;
370
+ return codecsCore.createEncoder({
371
+ fixedSize,
372
+ write: (option, bytes, offset) => {
373
+ const prefixOffset = prefix.write(Number(option !== null), bytes, offset);
374
+ if (option !== null) {
375
+ item.write(option, bytes, prefixOffset);
376
+ }
377
+ return offset + fixedSize;
337
378
  }
338
- const [resolvedSize, newOffset] = decodeArrayLikeCodecSize(
339
- size,
340
- [key.fixedSize, value.fixedSize],
341
- bytes,
342
- offset
343
- );
344
- offset = newOffset;
345
- for (let i = 0; i < resolvedSize; i += 1) {
346
- const [decodedKey, kOffset] = key.decode(bytes, offset);
347
- offset = kOffset;
348
- const [decodedValue, vOffset] = value.decode(bytes, offset);
349
- offset = vOffset;
350
- map.set(decodedKey, decodedValue);
379
+ });
380
+ }
381
+ return codecsCore.createEncoder({
382
+ getSizeFromValue: (option) => codecsCore.getEncodedSize(Number(option !== null), prefix) + (option !== null ? codecsCore.getEncodedSize(option, item) : 0),
383
+ maxSize: sumCodecSizes([prefix, item].map(getMaxSize)) ?? void 0,
384
+ write: (option, bytes, offset) => {
385
+ offset = prefix.write(Number(option !== null), bytes, offset);
386
+ if (option !== null) {
387
+ offset = item.write(option, bytes, offset);
351
388
  }
352
- return [map, offset];
389
+ return offset;
390
+ }
391
+ });
392
+ }
393
+ function getNullableDecoder(item, config = {}) {
394
+ const prefix = config.prefix ?? codecsNumbers.getU8Decoder();
395
+ const fixed = config.fixed ?? false;
396
+ let fixedSize = null;
397
+ const isZeroSizeItem = codecsCore.isFixedSize(item) && codecsCore.isFixedSize(prefix) && item.fixedSize === 0;
398
+ if (fixed || isZeroSizeItem) {
399
+ try {
400
+ codecsCore.assertIsFixedSize(item);
401
+ } catch (e) {
402
+ throw new Error("Fixed nullables can only be used with fixed-size codecs.");
403
+ }
404
+ try {
405
+ codecsCore.assertIsFixedSize(prefix);
406
+ } catch (e) {
407
+ throw new Error("Fixed nullables can only be used with fixed-size prefix.");
353
408
  }
354
- };
355
- }
356
- function getMapCodec(key, value, options = {}) {
357
- return codecsCore.combineCodec(getMapEncoder(key, value, options), getMapDecoder(key, value, options));
358
- }
359
- function nullableCodecHelper(item, prefix, fixed, description) {
360
- let descriptionSuffix = `; ${prefix.description}`;
361
- let fixedSize = item.fixedSize === 0 ? prefix.fixedSize : null;
362
- if (fixed) {
363
- codecsCore.assertFixedSizeCodec(item, "Fixed nullables can only be used with fixed-size codecs.");
364
- codecsCore.assertFixedSizeCodec(prefix, "Fixed nullables can only be used with fixed-size prefix.");
365
- descriptionSuffix += "; fixed";
366
409
  fixedSize = prefix.fixedSize + item.fixedSize;
367
410
  }
368
- return {
369
- description: description ?? `nullable(${item.description + descriptionSuffix})`,
370
- fixedSize,
371
- maxSize: sumCodecSizes([prefix.maxSize, item.maxSize])
372
- };
373
- }
374
- function getNullableEncoder(item, options = {}) {
375
- const prefix = options.prefix ?? codecsNumbers.getU8Encoder();
376
- const fixed = options.fixed ?? false;
377
- return {
378
- ...nullableCodecHelper(item, prefix, fixed, options.description),
379
- encode: (option) => {
380
- const prefixByte = prefix.encode(Number(option !== null));
381
- let itemBytes = option !== null ? item.encode(option) : new Uint8Array();
382
- itemBytes = fixed ? codecsCore.fixBytes(itemBytes, item.fixedSize) : itemBytes;
383
- return codecsCore.mergeBytes([prefixByte, itemBytes]);
384
- }
385
- };
386
- }
387
- function getNullableDecoder(item, options = {}) {
388
- const prefix = options.prefix ?? codecsNumbers.getU8Decoder();
389
- const fixed = options.fixed ?? false;
390
- return {
391
- ...nullableCodecHelper(item, prefix, fixed, options.description),
392
- decode: (bytes, offset = 0) => {
411
+ return codecsCore.createDecoder({
412
+ ...fixedSize === null ? { maxSize: sumCodecSizes([prefix, item].map(getMaxSize)) ?? void 0 } : { fixedSize },
413
+ read: (bytes, offset) => {
393
414
  if (bytes.length - offset <= 0) {
394
415
  return [null, offset];
395
416
  }
396
- const fixedOffset = offset + (prefix.fixedSize ?? 0) + (item.fixedSize ?? 0);
397
- const [isSome, prefixOffset] = prefix.decode(bytes, offset);
398
- offset = prefixOffset;
417
+ const [isSome, prefixOffset] = prefix.read(bytes, offset);
399
418
  if (isSome === 0) {
400
- return [null, fixed ? fixedOffset : offset];
419
+ return [null, fixedSize !== null ? offset + fixedSize : prefixOffset];
401
420
  }
402
- const [value, newOffset] = item.decode(bytes, offset);
403
- offset = newOffset;
404
- return [value, fixed ? fixedOffset : offset];
421
+ const [value, newOffset] = item.read(bytes, prefixOffset);
422
+ return [value, fixedSize !== null ? offset + fixedSize : newOffset];
405
423
  }
406
- };
424
+ });
425
+ }
426
+ function getNullableCodec(item, config = {}) {
427
+ const configCast = config;
428
+ return codecsCore.combineCodec(getNullableEncoder(item, configCast), getNullableDecoder(item, configCast));
429
+ }
430
+ function getScalarEnumEncoder(constructor, config = {}) {
431
+ const prefix = config.size ?? codecsNumbers.getU8Encoder();
432
+ const { minRange, maxRange, allStringInputs, enumKeys, enumValues } = getScalarEnumStats(constructor);
433
+ return codecsCore.mapEncoder(prefix, (value) => {
434
+ const isInvalidNumber = typeof value === "number" && (value < minRange || value > maxRange);
435
+ const isInvalidString = typeof value === "string" && !allStringInputs.includes(value);
436
+ if (isInvalidNumber || isInvalidString) {
437
+ throw new Error(
438
+ `Invalid scalar enum variant. Expected one of [${allStringInputs.join(", ")}] or a number between ${minRange} and ${maxRange}, got "${value}".`
439
+ );
440
+ }
441
+ if (typeof value === "number")
442
+ return value;
443
+ const valueIndex = enumValues.indexOf(value);
444
+ if (valueIndex >= 0)
445
+ return valueIndex;
446
+ return enumKeys.indexOf(value);
447
+ });
448
+ }
449
+ function getScalarEnumDecoder(constructor, config = {}) {
450
+ const prefix = config.size ?? codecsNumbers.getU8Decoder();
451
+ const { minRange, maxRange, enumKeys } = getScalarEnumStats(constructor);
452
+ return codecsCore.mapDecoder(prefix, (value) => {
453
+ const valueAsNumber = Number(value);
454
+ if (valueAsNumber < minRange || valueAsNumber > maxRange) {
455
+ throw new Error(
456
+ `Enum discriminator out of range. Expected a number between ${minRange} and ${maxRange}, got ${valueAsNumber}.`
457
+ );
458
+ }
459
+ return constructor[enumKeys[valueAsNumber]];
460
+ });
407
461
  }
408
- function getNullableCodec(item, options = {}) {
409
- return codecsCore.combineCodec(getNullableEncoder(item, options), getNullableDecoder(item, options));
462
+ function getScalarEnumCodec(constructor, config = {}) {
463
+ return codecsCore.combineCodec(getScalarEnumEncoder(constructor, config), getScalarEnumDecoder(constructor, config));
410
464
  }
411
- function scalarEnumCoderHelper(constructor, prefix, description) {
412
- const enumKeys = Object.keys(constructor);
413
- const enumValues = Object.values(constructor);
414
- const isNumericEnum = enumValues.some((v) => typeof v === "number");
415
- const valueDescriptions = enumValues.filter((v) => typeof v === "string").join(", ");
465
+ function getScalarEnumStats(constructor) {
466
+ const numericValues = Object.values(constructor).filter((v) => typeof v === "number");
467
+ const deduplicatedConstructor = Object.fromEntries(
468
+ Object.entries(constructor).slice(numericValues.length)
469
+ );
470
+ const enumKeys = Object.keys(deduplicatedConstructor);
471
+ const enumValues = Object.values(deduplicatedConstructor);
416
472
  const minRange = 0;
417
- const maxRange = isNumericEnum ? enumValues.length / 2 - 1 : enumValues.length - 1;
418
- const stringValues = isNumericEnum ? [...enumKeys] : [.../* @__PURE__ */ new Set([...enumKeys, ...enumValues])];
473
+ const maxRange = enumValues.length - 1;
474
+ const allStringInputs = [
475
+ .../* @__PURE__ */ new Set([...enumKeys, ...enumValues.filter((v) => typeof v === "string")])
476
+ ];
419
477
  return {
420
- description: description ?? `enum(${valueDescriptions}; ${prefix.description})`,
478
+ allStringInputs,
421
479
  enumKeys,
422
480
  enumValues,
423
- fixedSize: prefix.fixedSize,
424
- isNumericEnum,
425
481
  maxRange,
426
- maxSize: prefix.maxSize,
427
- minRange,
428
- stringValues
482
+ minRange
429
483
  };
430
484
  }
431
- function getScalarEnumEncoder(constructor, options = {}) {
432
- const prefix = options.size ?? codecsNumbers.getU8Encoder();
433
- const { description, fixedSize, maxSize, minRange, maxRange, stringValues, enumKeys, enumValues } = scalarEnumCoderHelper(constructor, prefix, options.description);
434
- return {
435
- description,
436
- encode: (value) => {
437
- const isInvalidNumber = typeof value === "number" && (value < minRange || value > maxRange);
438
- const isInvalidString = typeof value === "string" && !stringValues.includes(value);
439
- if (isInvalidNumber || isInvalidString) {
440
- throw new Error(
441
- `Invalid scalar enum variant. Expected one of [${stringValues.join(", ")}] or a number between ${minRange} and ${maxRange}, got "${value}".`
442
- );
443
- }
444
- if (typeof value === "number")
445
- return prefix.encode(value);
446
- const valueIndex = enumValues.indexOf(value);
447
- if (valueIndex >= 0)
448
- return prefix.encode(valueIndex);
449
- return prefix.encode(enumKeys.indexOf(value));
450
- },
451
- fixedSize,
452
- maxSize
453
- };
485
+ function getSetEncoder(item, config = {}) {
486
+ return codecsCore.mapEncoder(getArrayEncoder(item, config), (set) => [...set]);
454
487
  }
455
- function getScalarEnumDecoder(constructor, options = {}) {
456
- const prefix = options.size ?? codecsNumbers.getU8Decoder();
457
- const { description, fixedSize, maxSize, minRange, maxRange, isNumericEnum, enumValues } = scalarEnumCoderHelper(
458
- constructor,
459
- prefix,
460
- options.description
461
- );
462
- return {
463
- decode: (bytes, offset = 0) => {
464
- codecsCore.assertByteArrayIsNotEmptyForCodec("enum", bytes, offset);
465
- const [value, newOffset] = prefix.decode(bytes, offset);
466
- const valueAsNumber = Number(value);
467
- offset = newOffset;
468
- if (valueAsNumber < minRange || valueAsNumber > maxRange) {
469
- throw new Error(
470
- `Enum discriminator out of range. Expected a number between ${minRange} and ${maxRange}, got ${valueAsNumber}.`
471
- );
472
- }
473
- return [isNumericEnum ? valueAsNumber : enumValues[valueAsNumber], offset];
474
- },
475
- description,
476
- fixedSize,
477
- maxSize
478
- };
479
- }
480
- function getScalarEnumCodec(constructor, options = {}) {
481
- return codecsCore.combineCodec(getScalarEnumEncoder(constructor, options), getScalarEnumDecoder(constructor, options));
488
+ function getSetDecoder(item, config = {}) {
489
+ return codecsCore.mapDecoder(getArrayDecoder(item, config), (entries) => new Set(entries));
482
490
  }
483
- function setCodecHelper(item, size, description) {
484
- if (size === "remainder" && item.fixedSize === null) {
485
- throw new Error('Codecs of "remainder" size must have fixed-size items.');
486
- }
487
- return {
488
- description: description ?? `set(${item.description}; ${getArrayLikeCodecSizeDescription(size)})`,
489
- fixedSize: getArrayLikeCodecSizeFromChildren(size, [item.fixedSize]),
490
- maxSize: getArrayLikeCodecSizeFromChildren(size, [item.maxSize])
491
- };
492
- }
493
- function getSetEncoder(item, options = {}) {
494
- const size = options.size ?? codecsNumbers.getU32Encoder();
495
- return {
496
- ...setCodecHelper(item, size, options.description),
497
- encode: (set) => {
498
- if (typeof size === "number" && set.size !== size) {
499
- assertValidNumberOfItemsForCodec("set", size, set.size);
500
- }
501
- const itemBytes = Array.from(set, (value) => item.encode(value));
502
- return codecsCore.mergeBytes([getArrayLikeCodecSizePrefix(size, set.size), ...itemBytes]);
503
- }
504
- };
491
+ function getSetCodec(item, config = {}) {
492
+ return codecsCore.combineCodec(getSetEncoder(item, config), getSetDecoder(item, config));
505
493
  }
506
- function getSetDecoder(item, options = {}) {
507
- const size = options.size ?? codecsNumbers.getU32Decoder();
508
- return {
509
- ...setCodecHelper(item, size, options.description),
510
- decode: (bytes, offset = 0) => {
511
- const set = /* @__PURE__ */ new Set();
512
- if (typeof size === "object" && bytes.slice(offset).length === 0) {
513
- return [set, offset];
514
- }
515
- const [resolvedSize, newOffset] = decodeArrayLikeCodecSize(size, [item.fixedSize], bytes, offset);
516
- offset = newOffset;
517
- for (let i = 0; i < resolvedSize; i += 1) {
518
- const [value, newOffset2] = item.decode(bytes, offset);
519
- offset = newOffset2;
520
- set.add(value);
521
- }
522
- return [set, offset];
523
- }
524
- };
525
- }
526
- function getSetCodec(item, options = {}) {
527
- return codecsCore.combineCodec(getSetEncoder(item, options), getSetDecoder(item, options));
528
- }
529
- function structCodecHelper(fields, description) {
530
- const fieldDescriptions = fields.map(([name, codec]) => `${String(name)}: ${codec.description}`).join(", ");
531
- return {
532
- description: description ?? `struct(${fieldDescriptions})`,
533
- fixedSize: sumCodecSizes(fields.map(([, field]) => field.fixedSize)),
534
- maxSize: sumCodecSizes(fields.map(([, field]) => field.maxSize))
535
- };
536
- }
537
- function getStructEncoder(fields, options = {}) {
538
- return {
539
- ...structCodecHelper(fields, options.description),
540
- encode: (struct) => {
541
- const fieldBytes = fields.map(([key, codec]) => codec.encode(struct[key]));
542
- return codecsCore.mergeBytes(fieldBytes);
494
+ function getStructEncoder(fields) {
495
+ const fieldCodecs = fields.map(([, codec]) => codec);
496
+ const fixedSize = sumCodecSizes(fieldCodecs.map(getFixedSize));
497
+ const maxSize = sumCodecSizes(fieldCodecs.map(getMaxSize)) ?? void 0;
498
+ return codecsCore.createEncoder({
499
+ ...fixedSize === null ? {
500
+ getSizeFromValue: (value) => fields.map(([key, codec]) => codecsCore.getEncodedSize(value[key], codec)).reduce((all, one) => all + one, 0),
501
+ maxSize
502
+ } : { fixedSize },
503
+ write: (struct, bytes, offset) => {
504
+ fields.forEach(([key, codec]) => {
505
+ offset = codec.write(struct[key], bytes, offset);
506
+ });
507
+ return offset;
543
508
  }
544
- };
545
- }
546
- function getStructDecoder(fields, options = {}) {
547
- return {
548
- ...structCodecHelper(fields, options.description),
549
- decode: (bytes, offset = 0) => {
509
+ });
510
+ }
511
+ function getStructDecoder(fields) {
512
+ const fieldCodecs = fields.map(([, codec]) => codec);
513
+ const fixedSize = sumCodecSizes(fieldCodecs.map(getFixedSize));
514
+ const maxSize = sumCodecSizes(fieldCodecs.map(getMaxSize)) ?? void 0;
515
+ return codecsCore.createDecoder({
516
+ ...fixedSize === null ? { maxSize } : { fixedSize },
517
+ read: (bytes, offset) => {
550
518
  const struct = {};
551
519
  fields.forEach(([key, codec]) => {
552
- const [value, newOffset] = codec.decode(bytes, offset);
520
+ const [value, newOffset] = codec.read(bytes, offset);
553
521
  offset = newOffset;
554
522
  struct[key] = value;
555
523
  });
556
524
  return [struct, offset];
557
525
  }
558
- };
559
- }
560
- function getStructCodec(fields, options = {}) {
561
- return codecsCore.combineCodec(getStructEncoder(fields, options), getStructDecoder(fields, options));
562
- }
563
- function tupleCodecHelper(items, description) {
564
- const itemDescriptions = items.map((item) => item.description).join(", ");
565
- return {
566
- description: description ?? `tuple(${itemDescriptions})`,
567
- fixedSize: sumCodecSizes(items.map((item) => item.fixedSize)),
568
- maxSize: sumCodecSizes(items.map((item) => item.maxSize))
569
- };
570
- }
571
- function getTupleEncoder(items, options = {}) {
572
- return {
573
- ...tupleCodecHelper(items, options.description),
574
- encode: (value) => {
575
- assertValidNumberOfItemsForCodec("tuple", items.length, value.length);
576
- return codecsCore.mergeBytes(items.map((item, index) => item.encode(value[index])));
577
- }
578
- };
579
- }
580
- function getTupleDecoder(items, options = {}) {
581
- return {
582
- ...tupleCodecHelper(items, options.description),
583
- decode: (bytes, offset = 0) => {
584
- const values = [];
585
- items.forEach((codec) => {
586
- const [newValue, newOffset] = codec.decode(bytes, offset);
587
- values.push(newValue);
588
- offset = newOffset;
589
- });
590
- return [values, offset];
591
- }
592
- };
526
+ });
593
527
  }
594
- function getTupleCodec(items, options = {}) {
528
+ function getStructCodec(fields) {
595
529
  return codecsCore.combineCodec(
596
- getTupleEncoder(items, options),
597
- getTupleDecoder(items, options)
530
+ getStructEncoder(fields),
531
+ getStructDecoder(fields)
598
532
  );
599
533
  }
600
- function getUnitEncoder(options = {}) {
601
- return {
602
- description: options.description ?? "unit",
603
- encode: () => new Uint8Array(),
534
+ function getUnitEncoder() {
535
+ return codecsCore.createEncoder({
604
536
  fixedSize: 0,
605
- maxSize: 0
606
- };
537
+ write: (_value, _bytes, offset) => offset
538
+ });
607
539
  }
608
- function getUnitDecoder(options = {}) {
609
- return {
610
- decode: (_bytes, offset = 0) => [void 0, offset],
611
- description: options.description ?? "unit",
540
+ function getUnitDecoder() {
541
+ return codecsCore.createDecoder({
612
542
  fixedSize: 0,
613
- maxSize: 0
614
- };
543
+ read: (_bytes, offset) => [void 0, offset]
544
+ });
615
545
  }
616
- function getUnitCodec(options = {}) {
617
- return codecsCore.combineCodec(getUnitEncoder(options), getUnitDecoder(options));
546
+ function getUnitCodec() {
547
+ return codecsCore.combineCodec(getUnitEncoder(), getUnitDecoder());
618
548
  }
619
549
 
620
550
  exports.assertValidNumberOfItemsForCodec = assertValidNumberOfItemsForCodec;
621
- exports.decodeArrayLikeCodecSize = decodeArrayLikeCodecSize;
622
551
  exports.getArrayCodec = getArrayCodec;
623
552
  exports.getArrayDecoder = getArrayDecoder;
624
553
  exports.getArrayEncoder = getArrayEncoder;
625
- exports.getArrayLikeCodecSizeDescription = getArrayLikeCodecSizeDescription;
626
- exports.getArrayLikeCodecSizeFromChildren = getArrayLikeCodecSizeFromChildren;
627
- exports.getArrayLikeCodecSizePrefix = getArrayLikeCodecSizePrefix;
628
554
  exports.getBitArrayCodec = getBitArrayCodec;
629
555
  exports.getBitArrayDecoder = getBitArrayDecoder;
630
556
  exports.getBitArrayEncoder = getBitArrayEncoder;