@solana/codecs-strings 2.0.0-experimental.efe6f4d → 2.0.0-experimental.f2a2e5b

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/README.md CHANGED
@@ -16,10 +16,200 @@
16
16
 
17
17
  This package contains codecs for strings of different sizes and encodings. It can be used standalone, but it is also exported as part of the Solana JavaScript SDK [`@solana/web3.js@experimental`](https://github.com/solana-labs/solana-web3.js/tree/master/packages/library).
18
18
 
19
- ## Types
19
+ This package is also part of the [`@solana/codecs` package](https://github.com/solana-labs/solana-web3.js/tree/master/packages/codecs) which acts as an entry point for all codec packages as well as for their documentation.
20
20
 
21
- TODO
21
+ ## String helper codec
22
22
 
23
- ## Functions
23
+ The `getStringCodec` function returns a `Codec<string>` that can be used to encode strings using various encodings and size strategies. It contains the following options:
24
24
 
25
- TODO
25
+ - `encoding`: A `VariableSizeCodec<string>` responsible for encoding and decoding a string in a specific way without worrying about its size. Examples are UTF-8, base58, base64, etc. You can see all available encodings below in this documentation.
26
+ - `size`: This option tells the codec how long the string goes on for in the byte array. It can be one of the following three strategies:
27
+ - `Codec<number>`: When a number codec is provided, that codec will be used to encode and decode a size prefix for that string. This prefix allows us to know when to stop reading the string when decoding a given byte array.
28
+ - `number`: When a fixed number is provided, a `FixedSizeCodec` of that size will be returned such that exactly that amount of bytes will be used to encode and decode the string.
29
+ - `"variable"`: When the string `"variable"` is passed as a size, a `VariableSizeCodec` will be returned without any size boundary. That is, when providing a byte array to decode, the entire byte array will be decoded as a string.
30
+
31
+ When using `getStringCodec` without any options, the default encoding used is UTF-8 and the default size strategy used is a `u32` prefix codec.
32
+
33
+ ```ts
34
+ const bytes = getStringCodec().encode('hello');
35
+ // 0x0500000068656c6c6f
36
+ // | └-- The 5 bytes of content.
37
+ // └-- 4-byte prefix telling us to read 5 bytes.
38
+
39
+ const value = getStringCodec().decode(bytes);
40
+ // "hello"
41
+ ```
42
+
43
+ We can use the `size` option to provide a different integer codec for the prefix.
44
+
45
+ ```ts
46
+ getStringCodec({ size: getU8Codec() }).encode('hello');
47
+ // 0x0568656c6c6f
48
+ // | └-- The 5 bytes of content.
49
+ // └-- 1-byte prefix telling us to read 5 bytes.
50
+ ```
51
+
52
+ Or to provide a fixed size such that any string longer or smaller than that size will be truncated or padded respectively.
53
+
54
+ ```ts
55
+ getStringCodec({ size: 5 }).encode('hello');
56
+ // 0x68656c6c6f
57
+ // └-- The exact 5 bytes of content.
58
+
59
+ getStringCodec({ size: 5 }).encode('hello world');
60
+ // 0x68656c6c6f
61
+ // └-- The truncated 5 bytes of content.
62
+
63
+ getStringCodec({ size: 5 }).encode('hell');
64
+ // 0x68656c6c00
65
+ // └-- The padded 5 bytes of content.
66
+ ```
67
+
68
+ Or to tell the codec we do not want to create a size boundary for our string.
69
+
70
+ ```ts
71
+ getStringCodec({ size: 'variable' }).encode('hello');
72
+ // 0x68656c6c6f
73
+ // └-- Any bytes necessary to encode our content.
74
+ ```
75
+
76
+ On top of customizing the size, we may provide a custom `encoding` option like so.
77
+
78
+ ```ts
79
+ getStringCodec({ encoding: getUtf8Codec() }).encode('hello');
80
+ // 0x0500000068656c6c6f (Default encoding).
81
+
82
+ getStringCodec({ encoding: getBase64Codec() }).encode('hello');
83
+ // 0x0300000085e965
84
+
85
+ getStringCodec({ encoding: getBase58Codec() }).encode('heLLo');
86
+ // 0x040000001b6a3070
87
+ ```
88
+
89
+ Finally, separate `getStringEncoder` and `getStringDecoder` functions are also available.
90
+
91
+ ```ts
92
+ const bytes = getStringEncoder().encode('hello');
93
+ const value = getStringDecoder().decode(bytes);
94
+ ```
95
+
96
+ ## Utf8 codec
97
+
98
+ The `getUtf8Codec` function encodes and decodes a UTF-8 string to and from a byte array.
99
+
100
+ ```ts
101
+ const bytes = getUtf8Codec().encode('hello'); // 0x68656c6c6f
102
+ const value = getUtf8Codec().decode(bytes); // "hello"
103
+ ```
104
+
105
+ As usual, separate `getUtf8Encoder` and `getUtf8Decoder` functions are also available.
106
+
107
+ ```ts
108
+ const bytes = getUtf8Encoder().encode('hello'); // 0x68656c6c6f
109
+ const value = getUtf8Decoder().decode(bytes); // "hello"
110
+ ```
111
+
112
+ ## Base 64 codec
113
+
114
+ The `getBase64Codec` function encodes and decodes a base-64 string to and from a byte array.
115
+
116
+ ```ts
117
+ const bytes = getBase64Codec().encode('hello+world'); // 0x85e965a3ec28ae57
118
+ const value = getBase64Codec().decode(bytes); // "hello+world"
119
+ ```
120
+
121
+ As usual, separate `getBase64Encoder` and `getBase64Decoder` functions are also available.
122
+
123
+ ```ts
124
+ const bytes = getBase64Encoder().encode('hello+world'); // 0x85e965a3ec28ae57
125
+ const value = getBase64Decoder().decode(bytes); // "hello+world"
126
+ ```
127
+
128
+ ## Base 58 codec
129
+
130
+ The `getBase58Codec` function encodes and decodes a base-58 string to and from a byte array.
131
+
132
+ ```ts
133
+ const bytes = getBase58Codec().encode('heLLo'); // 0x1b6a3070
134
+ const value = getBase58Codec().decode(bytes); // "heLLo"
135
+ ```
136
+
137
+ As usual, separate `getBase58Encoder` and `getBase58Decoder` functions are also available.
138
+
139
+ ```ts
140
+ const bytes = getBase58Encoder().encode('heLLo'); // 0x1b6a3070
141
+ const value = getBase58Decoder().decode(bytes); // "heLLo"
142
+ ```
143
+
144
+ ## Base 16 codec
145
+
146
+ The `getBase16Codec` function encodes and decodes a base-16 string to and from a byte array.
147
+
148
+ ```ts
149
+ const bytes = getBase16Codec().encode('deadface'); // 0xdeadface
150
+ const value = getBase16Codec().decode(bytes); // "deadface"
151
+ ```
152
+
153
+ As usual, separate `getBase16Encoder` and `getBase16Decoder` functions are also available.
154
+
155
+ ```ts
156
+ const bytes = getBase16Encoder().encode('deadface'); // 0xdeadface
157
+ const value = getBase16Decoder().decode(bytes); // "deadface"
158
+ ```
159
+
160
+ ## Base 10 codec
161
+
162
+ The `getBase10Codec` function encodes and decodes a base-10 string to and from a byte array.
163
+
164
+ ```ts
165
+ const bytes = getBase10Codec().encode('1024'); // 0x0400
166
+ const value = getBase10Codec().decode(bytes); // "1024"
167
+ ```
168
+
169
+ As usual, separate `getBase10Encoder` and `getBase10Decoder` functions are also available.
170
+
171
+ ```ts
172
+ const bytes = getBase10Encoder().encode('1024'); // 0x0400
173
+ const value = getBase10Decoder().decode(bytes); // "1024"
174
+ ```
175
+
176
+ ## Base X codec
177
+
178
+ The `getBaseXCodec` accepts a custom `alphabet` of `X` characters and creates a base-X codec using that alphabet. It does so by iteratively dividing by `X` and handling leading zeros.
179
+
180
+ The base-10 and base-58 codecs use this base-x codec under the hood.
181
+
182
+ ```ts
183
+ const alphabet = '0ehlo';
184
+ const bytes = getBaseXCodec(alphabet).encode('hello'); // 0x05bd
185
+ const value = getBaseXCodec(alphabet).decode(bytes); // "hello"
186
+ ```
187
+
188
+ As usual, separate `getBaseXEncoder` and `getBaseXDecoder` functions are also available.
189
+
190
+ ```ts
191
+ const bytes = getBaseXEncoder(alphabet).encode('hello'); // 0x05bd
192
+ const value = getBaseXDecoder(alphabet).decode(bytes); // "hello"
193
+ ```
194
+
195
+ ## Re-slicing base X codec
196
+
197
+ The `getBaseXResliceCodec` also creates a base-x codec but uses a different strategy. It re-slices bytes into custom chunks of bits that are then mapped to a provided `alphabet`. The number of bits per chunk is also provided and should typically be set to `log2(alphabet.length)`.
198
+
199
+ This is typically used to create codecs whose alphabet’s length is a power of 2 such as base-16 or base-64.
200
+
201
+ ```ts
202
+ const bytes = getBaseXResliceCodec('elho', 2).encode('hellolol'); // 0x4aee
203
+ const value = getBaseXResliceCodec('elho', 2).decode(bytes); // "hellolol"
204
+ ```
205
+
206
+ As usual, separate `getBaseXResliceEncoder` and `getBaseXResliceDecoder` functions are also available.
207
+
208
+ ```ts
209
+ const bytes = getBaseXResliceEncoder('elho', 2).encode('hellolol'); // 0x4aee
210
+ const value = getBaseXResliceDecoder('elho', 2).decode(bytes); // "hellolol"
211
+ ```
212
+
213
+ ---
214
+
215
+ To read more about the available codecs and how to use them, check out the documentation of the main [`@solana/codecs` package](https://github.com/solana-labs/solana-web3.js/tree/master/packages/codecs).
@@ -10,43 +10,38 @@ function assertValidBaseString(alphabet4, testValue, givenValue = testValue) {
10
10
  }
11
11
  }
12
12
  var getBaseXEncoder = (alphabet4) => {
13
- const base = alphabet4.length;
14
- const baseBigInt = BigInt(base);
15
- return {
16
- description: `base${base}`,
17
- encode(value) {
13
+ return codecsCore.createEncoder({
14
+ getSizeFromValue: (value) => {
15
+ const [leadingZeroes, tailChars] = partitionLeadingZeroes(value, alphabet4[0]);
16
+ if (tailChars === "")
17
+ return value.length;
18
+ const base10Number = getBigIntFromBaseX(tailChars, alphabet4);
19
+ return leadingZeroes.length + Math.ceil(base10Number.toString(16).length / 2);
20
+ },
21
+ write(value, bytes, offset) {
18
22
  assertValidBaseString(alphabet4, value);
19
23
  if (value === "")
20
- return new Uint8Array();
21
- const chars = [...value];
22
- let trailIndex = chars.findIndex((c) => c !== alphabet4[0]);
23
- trailIndex = trailIndex === -1 ? chars.length : trailIndex;
24
- const leadingZeroes = Array(trailIndex).fill(0);
25
- if (trailIndex === chars.length)
26
- return Uint8Array.from(leadingZeroes);
27
- const tailChars = chars.slice(trailIndex);
28
- let base10Number = 0n;
29
- let baseXPower = 1n;
30
- for (let i = tailChars.length - 1; i >= 0; i -= 1) {
31
- base10Number += baseXPower * BigInt(alphabet4.indexOf(tailChars[i]));
32
- baseXPower *= baseBigInt;
24
+ return offset;
25
+ const [leadingZeroes, tailChars] = partitionLeadingZeroes(value, alphabet4[0]);
26
+ if (tailChars === "") {
27
+ bytes.set(new Uint8Array(leadingZeroes.length).fill(0), offset);
28
+ return offset + leadingZeroes.length;
33
29
  }
30
+ let base10Number = getBigIntFromBaseX(tailChars, alphabet4);
34
31
  const tailBytes = [];
35
32
  while (base10Number > 0n) {
36
33
  tailBytes.unshift(Number(base10Number % 256n));
37
34
  base10Number /= 256n;
38
35
  }
39
- return Uint8Array.from(leadingZeroes.concat(tailBytes));
40
- },
41
- fixedSize: null,
42
- maxSize: null
43
- };
36
+ const bytesToAdd = [...Array(leadingZeroes.length).fill(0), ...tailBytes];
37
+ bytes.set(bytesToAdd, offset);
38
+ return offset + bytesToAdd.length;
39
+ }
40
+ });
44
41
  };
45
42
  var getBaseXDecoder = (alphabet4) => {
46
- const base = alphabet4.length;
47
- const baseBigInt = BigInt(base);
48
- return {
49
- decode(rawBytes, offset = 0) {
43
+ return codecsCore.createDecoder({
44
+ read(rawBytes, offset) {
50
45
  const bytes = offset === 0 ? rawBytes : rawBytes.slice(offset);
51
46
  if (bytes.length === 0)
52
47
  return ["", 0];
@@ -55,45 +50,52 @@ var getBaseXDecoder = (alphabet4) => {
55
50
  const leadingZeroes = alphabet4[0].repeat(trailIndex);
56
51
  if (trailIndex === bytes.length)
57
52
  return [leadingZeroes, rawBytes.length];
58
- let base10Number = bytes.slice(trailIndex).reduce((sum, byte) => sum * 256n + BigInt(byte), 0n);
59
- const tailChars = [];
60
- while (base10Number > 0n) {
61
- tailChars.unshift(alphabet4[Number(base10Number % baseBigInt)]);
62
- base10Number /= baseBigInt;
63
- }
64
- return [leadingZeroes + tailChars.join(""), rawBytes.length];
65
- },
66
- description: `base${base}`,
67
- fixedSize: null,
68
- maxSize: null
69
- };
53
+ const base10Number = bytes.slice(trailIndex).reduce((sum, byte) => sum * 256n + BigInt(byte), 0n);
54
+ const tailChars = getBaseXFromBigInt(base10Number, alphabet4);
55
+ return [leadingZeroes + tailChars, rawBytes.length];
56
+ }
57
+ });
70
58
  };
71
59
  var getBaseXCodec = (alphabet4) => codecsCore.combineCodec(getBaseXEncoder(alphabet4), getBaseXDecoder(alphabet4));
60
+ function partitionLeadingZeroes(value, zeroCharacter) {
61
+ const leadingZeroIndex = [...value].findIndex((c) => c !== zeroCharacter);
62
+ return leadingZeroIndex === -1 ? [value, ""] : [value.slice(0, leadingZeroIndex), value.slice(leadingZeroIndex)];
63
+ }
64
+ function getBigIntFromBaseX(value, alphabet4) {
65
+ const base = BigInt(alphabet4.length);
66
+ return [...value].reduce((sum, char) => sum * base + BigInt(alphabet4.indexOf(char)), 0n);
67
+ }
68
+ function getBaseXFromBigInt(value, alphabet4) {
69
+ const base = BigInt(alphabet4.length);
70
+ const tailChars = [];
71
+ while (value > 0n) {
72
+ tailChars.unshift(alphabet4[Number(value % base)]);
73
+ value /= base;
74
+ }
75
+ return tailChars.join("");
76
+ }
72
77
 
73
78
  // src/base10.ts
74
79
  var alphabet = "0123456789";
75
80
  var getBase10Encoder = () => getBaseXEncoder(alphabet);
76
81
  var getBase10Decoder = () => getBaseXDecoder(alphabet);
77
82
  var getBase10Codec = () => getBaseXCodec(alphabet);
78
- var getBase16Encoder = () => ({
79
- description: "base16",
80
- encode(value) {
83
+ var getBase16Encoder = () => codecsCore.createEncoder({
84
+ getSizeFromValue: (value) => Math.ceil(value.length / 2),
85
+ write(value, bytes, offset) {
81
86
  const lowercaseValue = value.toLowerCase();
82
87
  assertValidBaseString("0123456789abcdef", lowercaseValue, value);
83
88
  const matches = lowercaseValue.match(/.{1,2}/g);
84
- return Uint8Array.from(matches ? matches.map((byte) => parseInt(byte, 16)) : []);
85
- },
86
- fixedSize: null,
87
- maxSize: null
89
+ const hexBytes = matches ? matches.map((byte) => parseInt(byte, 16)) : [];
90
+ bytes.set(hexBytes, offset);
91
+ return hexBytes.length + offset;
92
+ }
88
93
  });
89
- var getBase16Decoder = () => ({
90
- decode(bytes, offset = 0) {
94
+ var getBase16Decoder = () => codecsCore.createDecoder({
95
+ read(bytes, offset) {
91
96
  const value = bytes.slice(offset).reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), "");
92
97
  return [value, bytes.length];
93
- },
94
- description: "base16",
95
- fixedSize: null,
96
- maxSize: null
98
+ }
97
99
  });
98
100
  var getBase16Codec = () => codecsCore.combineCodec(getBase16Encoder(), getBase16Decoder());
99
101
 
@@ -102,29 +104,26 @@ var alphabet2 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
102
104
  var getBase58Encoder = () => getBaseXEncoder(alphabet2);
103
105
  var getBase58Decoder = () => getBaseXDecoder(alphabet2);
104
106
  var getBase58Codec = () => getBaseXCodec(alphabet2);
105
- var getBaseXResliceEncoder = (alphabet4, bits) => ({
106
- description: `base${alphabet4.length}`,
107
- encode(value) {
107
+ var getBaseXResliceEncoder = (alphabet4, bits) => codecsCore.createEncoder({
108
+ getSizeFromValue: (value) => Math.floor(value.length * bits / 8),
109
+ write(value, bytes, offset) {
108
110
  assertValidBaseString(alphabet4, value);
109
111
  if (value === "")
110
- return new Uint8Array();
112
+ return offset;
111
113
  const charIndices = [...value].map((c) => alphabet4.indexOf(c));
112
- return new Uint8Array(reslice(charIndices, bits, 8, false));
113
- },
114
- fixedSize: null,
115
- maxSize: null
114
+ const reslicedBytes = reslice(charIndices, bits, 8, false);
115
+ bytes.set(reslicedBytes, offset);
116
+ return reslicedBytes.length + offset;
117
+ }
116
118
  });
117
- var getBaseXResliceDecoder = (alphabet4, bits) => ({
118
- decode(rawBytes, offset = 0) {
119
+ var getBaseXResliceDecoder = (alphabet4, bits) => codecsCore.createDecoder({
120
+ read(rawBytes, offset = 0) {
119
121
  const bytes = offset === 0 ? rawBytes : rawBytes.slice(offset);
120
122
  if (bytes.length === 0)
121
123
  return ["", rawBytes.length];
122
124
  const charIndices = reslice([...bytes], 8, bits, true);
123
125
  return [charIndices.map((i) => alphabet4[i]).join(""), rawBytes.length];
124
- },
125
- description: `base${alphabet4.length}`,
126
- fixedSize: null,
127
- maxSize: null
126
+ }
128
127
  });
129
128
  var getBaseXResliceCodec = (alphabet4, bits) => codecsCore.combineCodec(getBaseXResliceEncoder(alphabet4, bits), getBaseXResliceDecoder(alphabet4, bits));
130
129
  function reslice(input, inputBits, outputBits, useRemainder) {
@@ -147,33 +146,35 @@ function reslice(input, inputBits, outputBits, useRemainder) {
147
146
  }
148
147
  var getBase64Encoder = () => {
149
148
  {
150
- return {
151
- description: `base64`,
152
- encode(value) {
149
+ return codecsCore.createEncoder({
150
+ getSizeFromValue: (value) => {
153
151
  try {
154
- const bytes = atob(value).split("").map((c) => c.charCodeAt(0));
155
- return new Uint8Array(bytes);
152
+ return atob(value).length;
156
153
  } catch (e2) {
157
154
  throw new Error(`Expected a string of base 64, got [${value}].`);
158
155
  }
159
156
  },
160
- fixedSize: null,
161
- maxSize: null
162
- };
157
+ write(value, bytes, offset) {
158
+ try {
159
+ const bytesToAdd = atob(value).split("").map((c) => c.charCodeAt(0));
160
+ bytes.set(bytesToAdd, offset);
161
+ return bytesToAdd.length + offset;
162
+ } catch (e2) {
163
+ throw new Error(`Expected a string of base 64, got [${value}].`);
164
+ }
165
+ }
166
+ });
163
167
  }
164
168
  };
165
169
  var getBase64Decoder = () => {
166
170
  {
167
- return {
168
- decode(bytes, offset = 0) {
171
+ return codecsCore.createDecoder({
172
+ read(bytes, offset = 0) {
169
173
  const slice = bytes.slice(offset);
170
174
  const value = btoa(String.fromCharCode(...slice));
171
175
  return [value, bytes.length];
172
- },
173
- description: `base64`,
174
- fixedSize: null,
175
- maxSize: null
176
- };
176
+ }
177
+ });
177
178
  }
178
179
  };
179
180
  var getBase64Codec = () => codecsCore.combineCodec(getBase64Encoder(), getBase64Decoder());
@@ -192,79 +193,73 @@ var o = globalThis.TextEncoder;
192
193
  // src/utf8.ts
193
194
  var getUtf8Encoder = () => {
194
195
  let textEncoder;
195
- return {
196
- description: "utf8",
197
- encode: (value) => new Uint8Array((textEncoder || (textEncoder = new o())).encode(value)),
198
- fixedSize: null,
199
- maxSize: null
200
- };
196
+ return codecsCore.createEncoder({
197
+ getSizeFromValue: (value) => (textEncoder ||= new o()).encode(value).length,
198
+ write: (value, bytes, offset) => {
199
+ const bytesToAdd = (textEncoder ||= new o()).encode(value);
200
+ bytes.set(bytesToAdd, offset);
201
+ return offset + bytesToAdd.length;
202
+ }
203
+ });
201
204
  };
202
205
  var getUtf8Decoder = () => {
203
206
  let textDecoder;
204
- return {
205
- decode(bytes, offset = 0) {
206
- const value = (textDecoder || (textDecoder = new e())).decode(bytes.slice(offset));
207
+ return codecsCore.createDecoder({
208
+ read(bytes, offset) {
209
+ const value = (textDecoder ||= new e()).decode(bytes.slice(offset));
207
210
  return [removeNullCharacters(value), bytes.length];
208
- },
209
- description: "utf8",
210
- fixedSize: null,
211
- maxSize: null
212
- };
211
+ }
212
+ });
213
213
  };
214
214
  var getUtf8Codec = () => codecsCore.combineCodec(getUtf8Encoder(), getUtf8Decoder());
215
215
 
216
216
  // src/string.ts
217
- var getStringEncoder = (config = {}) => {
217
+ function getStringEncoder(config = {}) {
218
218
  const size = config.size ?? codecsNumbers.getU32Encoder();
219
219
  const encoding = config.encoding ?? getUtf8Encoder();
220
- const description = config.description ?? `string(${encoding.description}; ${getSizeDescription(size)})`;
221
220
  if (size === "variable") {
222
- return { ...encoding, description };
221
+ return encoding;
223
222
  }
224
223
  if (typeof size === "number") {
225
- return codecsCore.fixEncoder(encoding, size, description);
224
+ return codecsCore.fixEncoder(encoding, size);
226
225
  }
227
- return {
228
- description,
229
- encode: (value) => {
230
- const contentBytes = encoding.encode(value);
231
- const lengthBytes = size.encode(contentBytes.length);
232
- return codecsCore.mergeBytes([lengthBytes, contentBytes]);
226
+ return codecsCore.createEncoder({
227
+ getSizeFromValue: (value) => {
228
+ const contentSize = codecsCore.getEncodedSize(value, encoding);
229
+ return codecsCore.getEncodedSize(contentSize, size) + contentSize;
233
230
  },
234
- fixedSize: null,
235
- maxSize: null
236
- };
237
- };
238
- var getStringDecoder = (config = {}) => {
231
+ write: (value, bytes, offset) => {
232
+ const contentSize = codecsCore.getEncodedSize(value, encoding);
233
+ offset = size.write(contentSize, bytes, offset);
234
+ return encoding.write(value, bytes, offset);
235
+ }
236
+ });
237
+ }
238
+ function getStringDecoder(config = {}) {
239
239
  const size = config.size ?? codecsNumbers.getU32Decoder();
240
240
  const encoding = config.encoding ?? getUtf8Decoder();
241
- const description = config.description ?? `string(${encoding.description}; ${getSizeDescription(size)})`;
242
241
  if (size === "variable") {
243
- return { ...encoding, description };
242
+ return encoding;
244
243
  }
245
244
  if (typeof size === "number") {
246
- return codecsCore.fixDecoder(encoding, size, description);
245
+ return codecsCore.fixDecoder(encoding, size);
247
246
  }
248
- return {
249
- decode: (bytes, offset = 0) => {
247
+ return codecsCore.createDecoder({
248
+ read: (bytes, offset = 0) => {
250
249
  codecsCore.assertByteArrayIsNotEmptyForCodec("string", bytes, offset);
251
- const [lengthBigInt, lengthOffset] = size.decode(bytes, offset);
250
+ const [lengthBigInt, lengthOffset] = size.read(bytes, offset);
252
251
  const length = Number(lengthBigInt);
253
252
  offset = lengthOffset;
254
253
  const contentBytes = bytes.slice(offset, offset + length);
255
254
  codecsCore.assertByteArrayHasEnoughBytesForCodec("string", length, contentBytes);
256
- const [value, contentOffset] = encoding.decode(contentBytes);
255
+ const [value, contentOffset] = encoding.read(contentBytes, 0);
257
256
  offset += contentOffset;
258
257
  return [value, offset];
259
- },
260
- description,
261
- fixedSize: null,
262
- maxSize: null
263
- };
264
- };
265
- var getStringCodec = (config = {}) => codecsCore.combineCodec(getStringEncoder(config), getStringDecoder(config));
266
- function getSizeDescription(size) {
267
- return typeof size === "object" ? size.description : `${size}`;
258
+ }
259
+ });
260
+ }
261
+ function getStringCodec(config = {}) {
262
+ return codecsCore.combineCodec(getStringEncoder(config), getStringDecoder(config));
268
263
  }
269
264
 
270
265
  exports.assertValidBaseString = assertValidBaseString;