@solana/codecs-numbers 6.3.1 → 6.3.2-canary-20260313112147

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solana/codecs-numbers",
3
- "version": "6.3.1",
3
+ "version": "6.3.2-canary-20260313112147",
4
4
  "description": "Codecs for numbers of different sizes and endianness",
5
5
  "homepage": "https://www.solanakit.com/api#solanacodecs-numbers",
6
6
  "exports": {
@@ -33,7 +33,8 @@
33
33
  "types": "./dist/types/index.d.ts",
34
34
  "type": "commonjs",
35
35
  "files": [
36
- "./dist/"
36
+ "./dist/",
37
+ "./src/"
37
38
  ],
38
39
  "sideEffects": false,
39
40
  "keywords": [
@@ -55,8 +56,8 @@
55
56
  "maintained node versions"
56
57
  ],
57
58
  "dependencies": {
58
- "@solana/codecs-core": "6.3.1",
59
- "@solana/errors": "6.3.1"
59
+ "@solana/codecs-core": "6.3.2-canary-20260313112147",
60
+ "@solana/errors": "6.3.2-canary-20260313112147"
60
61
  },
61
62
  "peerDependencies": {
62
63
  "typescript": "^5.0.0"
@@ -0,0 +1,42 @@
1
+ import { SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE, SolanaError } from '@solana/errors';
2
+
3
+ /**
4
+ * Ensures that a given number falls within a specified range.
5
+ *
6
+ * If the number is outside the allowed range, an error is thrown.
7
+ * This function is primarily used to validate values before encoding them in a codec.
8
+ *
9
+ * @param codecDescription - A string describing the codec that is performing the validation.
10
+ * @param min - The minimum allowed value (inclusive).
11
+ * @param max - The maximum allowed value (inclusive).
12
+ * @param value - The number to validate.
13
+ *
14
+ * @throws {@link SolanaError} if the value is out of range.
15
+ *
16
+ * @example
17
+ * Validating a number within range.
18
+ * ```ts
19
+ * assertNumberIsBetweenForCodec('u8', 0, 255, 42); // Passes
20
+ * ```
21
+ *
22
+ * @example
23
+ * Throwing an error for an out-of-range value.
24
+ * ```ts
25
+ * assertNumberIsBetweenForCodec('u8', 0, 255, 300); // Throws
26
+ * ```
27
+ */
28
+ export function assertNumberIsBetweenForCodec(
29
+ codecDescription: string,
30
+ min: bigint | number,
31
+ max: bigint | number,
32
+ value: bigint | number,
33
+ ) {
34
+ if (value < min || value > max) {
35
+ throw new SolanaError(SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE, {
36
+ codecDescription,
37
+ max,
38
+ min,
39
+ value,
40
+ });
41
+ }
42
+ }
package/src/common.ts ADDED
@@ -0,0 +1,94 @@
1
+ import { Codec, Decoder, Encoder, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';
2
+ /**
3
+ * Represents an encoder for numbers and bigints.
4
+ *
5
+ * This type allows encoding values that are either `number` or `bigint`.
6
+ * Depending on the specific implementation, the encoded output may have a fixed or variable size.
7
+ *
8
+ * @see {@link FixedSizeNumberEncoder}
9
+ */
10
+ export type NumberEncoder = Encoder<bigint | number>;
11
+
12
+ /**
13
+ * Represents a fixed-size encoder for numbers and bigints.
14
+ *
15
+ * This encoder serializes values using an exact number of bytes, defined by `TSize`.
16
+ *
17
+ * @typeParam TSize - The number of bytes used for encoding.
18
+ *
19
+ * @see {@link NumberEncoder}
20
+ */
21
+ export type FixedSizeNumberEncoder<TSize extends number = number> = FixedSizeEncoder<bigint | number, TSize>;
22
+
23
+ /**
24
+ * Represents a decoder for numbers and bigints.
25
+ *
26
+ * This type supports decoding values as either `number` or `bigint`, depending on the implementation.
27
+ *
28
+ * @see {@link FixedSizeNumberDecoder}
29
+ */
30
+ export type NumberDecoder = Decoder<bigint> | Decoder<number>;
31
+
32
+ /**
33
+ * Represents a fixed-size decoder for numbers and bigints.
34
+ *
35
+ * This decoder reads a fixed number of bytes (`TSize`) and converts them into a `number` or `bigint`.
36
+ *
37
+ * @typeParam TSize - The number of bytes expected for decoding.
38
+ *
39
+ * @see {@link NumberDecoder}
40
+ */
41
+ export type FixedSizeNumberDecoder<TSize extends number = number> =
42
+ | FixedSizeDecoder<bigint, TSize>
43
+ | FixedSizeDecoder<number, TSize>;
44
+
45
+ /**
46
+ * Represents a codec for encoding and decoding numbers and bigints.
47
+ *
48
+ * - The encoded value can be either a `number` or a `bigint`.
49
+ * - The decoded value will always be either a `number` or `bigint`, depending on the implementation.
50
+ *
51
+ * @see {@link FixedSizeNumberCodec}
52
+ */
53
+ export type NumberCodec = Codec<bigint | number, bigint> | Codec<bigint | number, number>;
54
+
55
+ /**
56
+ * Represents a fixed-size codec for encoding and decoding numbers and bigints.
57
+ *
58
+ * This codec uses a specific number of bytes (`TSize`) for serialization.
59
+ * The encoded value can be either a `number` or `bigint`, but the decoded value will always be a `number` or `bigint`,
60
+ * depending on the implementation.
61
+ *
62
+ * @typeParam TSize - The number of bytes used for encoding and decoding.
63
+ *
64
+ * @see {@link NumberCodec}
65
+ */
66
+ export type FixedSizeNumberCodec<TSize extends number = number> =
67
+ | FixedSizeCodec<bigint | number, bigint, TSize>
68
+ | FixedSizeCodec<bigint | number, number, TSize>;
69
+
70
+ /**
71
+ * Configuration options for number codecs that use more than one byte.
72
+ *
73
+ * This configuration applies to all number codecs except `u8` and `i8`,
74
+ * allowing the user to specify the endianness of serialization.
75
+ */
76
+ export type NumberCodecConfig = {
77
+ /**
78
+ * Specifies whether numbers should be encoded in little-endian or big-endian format.
79
+ *
80
+ * @defaultValue `Endian.Little`
81
+ */
82
+ endian?: Endian;
83
+ };
84
+
85
+ /**
86
+ * Defines the byte order used for number serialization.
87
+ *
88
+ * - `Little`: The least significant byte is stored first.
89
+ * - `Big`: The most significant byte is stored first.
90
+ */
91
+ export enum Endian {
92
+ Little,
93
+ Big,
94
+ }
package/src/f32.ts ADDED
@@ -0,0 +1,104 @@
1
+ import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';
2
+
3
+ import { NumberCodecConfig } from './common';
4
+ import { numberDecoderFactory, numberEncoderFactory } from './utils';
5
+
6
+ /**
7
+ * Returns an encoder for 32-bit floating-point numbers (`f32`).
8
+ *
9
+ * This encoder serializes `f32` values using 4 bytes.
10
+ * Floating-point values may lose precision when encoded.
11
+ *
12
+ * For more details, see {@link getF32Codec}.
13
+ *
14
+ * @param config - Optional configuration to specify endianness (little by default).
15
+ * @returns A `FixedSizeEncoder<number, 4>` for encoding `f32` values.
16
+ *
17
+ * @example
18
+ * Encoding an `f32` value.
19
+ * ```ts
20
+ * const encoder = getF32Encoder();
21
+ * const bytes = encoder.encode(-1.5); // 0x0000c0bf
22
+ * ```
23
+ *
24
+ * @see {@link getF32Codec}
25
+ */
26
+ export const getF32Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder<bigint | number, 4> =>
27
+ numberEncoderFactory({
28
+ config,
29
+ name: 'f32',
30
+ set: (view, value, le) => view.setFloat32(0, Number(value), le),
31
+ size: 4,
32
+ });
33
+
34
+ /**
35
+ * Returns a decoder for 32-bit floating-point numbers (`f32`).
36
+ *
37
+ * This decoder deserializes `f32` values from 4 bytes.
38
+ * Some precision may be lost during decoding due to floating-point representation.
39
+ *
40
+ * For more details, see {@link getF32Codec}.
41
+ *
42
+ * @param config - Optional configuration to specify endianness (little by default).
43
+ * @returns A `FixedSizeDecoder<number, 4>` for decoding `f32` values.
44
+ *
45
+ * @example
46
+ * Decoding an `f32` value.
47
+ * ```ts
48
+ * const decoder = getF32Decoder();
49
+ * const value = decoder.decode(new Uint8Array([0x00, 0x00, 0xc0, 0xbf])); // -1.5
50
+ * ```
51
+ *
52
+ * @see {@link getF32Codec}
53
+ */
54
+ export const getF32Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder<number, 4> =>
55
+ numberDecoderFactory({
56
+ config,
57
+ get: (view, le) => view.getFloat32(0, le),
58
+ name: 'f32',
59
+ size: 4,
60
+ });
61
+
62
+ /**
63
+ * Returns a codec for encoding and decoding 32-bit floating-point numbers (`f32`).
64
+ *
65
+ * This codec serializes `f32` values using 4 bytes.
66
+ * Due to the IEEE 754 floating-point representation, some precision loss may occur.
67
+ *
68
+ * @param config - Optional configuration to specify endianness (little by default).
69
+ * @returns A `FixedSizeCodec<number, number, 4>` for encoding and decoding `f32` values.
70
+ *
71
+ * @example
72
+ * Encoding and decoding an `f32` value.
73
+ * ```ts
74
+ * const codec = getF32Codec();
75
+ * const bytes = codec.encode(-1.5); // 0x0000c0bf
76
+ * const value = codec.decode(bytes); // -1.5
77
+ * ```
78
+ *
79
+ * @example
80
+ * Using big-endian encoding.
81
+ * ```ts
82
+ * const codec = getF32Codec({ endian: Endian.Big });
83
+ * const bytes = codec.encode(-1.5); // 0xbfc00000
84
+ * ```
85
+ *
86
+ * @remarks
87
+ * `f32` values follow the IEEE 754 single-precision floating-point standard.
88
+ * Precision loss may occur for certain values.
89
+ *
90
+ * - If you need higher precision, consider using {@link getF64Codec}.
91
+ * - If you need integer values, consider using {@link getI32Codec} or {@link getU32Codec}.
92
+ *
93
+ * Separate {@link getF32Encoder} and {@link getF32Decoder} functions are available.
94
+ *
95
+ * ```ts
96
+ * const bytes = getF32Encoder().encode(-1.5);
97
+ * const value = getF32Decoder().decode(bytes);
98
+ * ```
99
+ *
100
+ * @see {@link getF32Encoder}
101
+ * @see {@link getF32Decoder}
102
+ */
103
+ export const getF32Codec = (config: NumberCodecConfig = {}): FixedSizeCodec<bigint | number, number, 4> =>
104
+ combineCodec(getF32Encoder(config), getF32Decoder(config));
package/src/f64.ts ADDED
@@ -0,0 +1,104 @@
1
+ import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';
2
+
3
+ import { NumberCodecConfig } from './common';
4
+ import { numberDecoderFactory, numberEncoderFactory } from './utils';
5
+
6
+ /**
7
+ * Returns an encoder for 64-bit floating-point numbers (`f64`).
8
+ *
9
+ * This encoder serializes `f64` values using 8 bytes.
10
+ * Floating-point values may lose precision when encoded.
11
+ *
12
+ * For more details, see {@link getF64Codec}.
13
+ *
14
+ * @param config - Optional configuration to specify endianness (little by default).
15
+ * @returns A `FixedSizeEncoder<number, 8>` for encoding `f64` values.
16
+ *
17
+ * @example
18
+ * Encoding an `f64` value.
19
+ * ```ts
20
+ * const encoder = getF64Encoder();
21
+ * const bytes = encoder.encode(-1.5); // 0x000000000000f8bf
22
+ * ```
23
+ *
24
+ * @see {@link getF64Codec}
25
+ */
26
+ export const getF64Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder<bigint | number, 8> =>
27
+ numberEncoderFactory({
28
+ config,
29
+ name: 'f64',
30
+ set: (view, value, le) => view.setFloat64(0, Number(value), le),
31
+ size: 8,
32
+ });
33
+
34
+ /**
35
+ * Returns a decoder for 64-bit floating-point numbers (`f64`).
36
+ *
37
+ * This decoder deserializes `f64` values from 8 bytes.
38
+ * Some precision may be lost during decoding due to floating-point representation.
39
+ *
40
+ * For more details, see {@link getF64Codec}.
41
+ *
42
+ * @param config - Optional configuration to specify endianness (little by default).
43
+ * @returns A `FixedSizeDecoder<number, 8>` for decoding `f64` values.
44
+ *
45
+ * @example
46
+ * Decoding an `f64` value.
47
+ * ```ts
48
+ * const decoder = getF64Decoder();
49
+ * const value = decoder.decode(new Uint8Array([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xbf])); // -1.5
50
+ * ```
51
+ *
52
+ * @see {@link getF64Codec}
53
+ */
54
+ export const getF64Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder<number, 8> =>
55
+ numberDecoderFactory({
56
+ config,
57
+ get: (view, le) => view.getFloat64(0, le),
58
+ name: 'f64',
59
+ size: 8,
60
+ });
61
+
62
+ /**
63
+ * Returns a codec for encoding and decoding 64-bit floating-point numbers (`f64`).
64
+ *
65
+ * This codec serializes `f64` values using 8 bytes.
66
+ * Due to the IEEE 754 floating-point representation, some precision loss may occur.
67
+ *
68
+ * @param config - Optional configuration to specify endianness (little by default).
69
+ * @returns A `FixedSizeCodec<number, number, 8>` for encoding and decoding `f64` values.
70
+ *
71
+ * @example
72
+ * Encoding and decoding an `f64` value.
73
+ * ```ts
74
+ * const codec = getF64Codec();
75
+ * const bytes = codec.encode(-1.5); // 0x000000000000f8bf
76
+ * const value = codec.decode(bytes); // -1.5
77
+ * ```
78
+ *
79
+ * @example
80
+ * Using big-endian encoding.
81
+ * ```ts
82
+ * const codec = getF64Codec({ endian: Endian.Big });
83
+ * const bytes = codec.encode(-1.5); // 0xbff8000000000000
84
+ * ```
85
+ *
86
+ * @remarks
87
+ * `f64` values follow the IEEE 754 double-precision floating-point standard.
88
+ * Precision loss may still occur but is significantly lower than `f32`.
89
+ *
90
+ * - If you need smaller floating-point values, consider using {@link getF32Codec}.
91
+ * - If you need integer values, consider using {@link getI64Codec} or {@link getU64Codec}.
92
+ *
93
+ * Separate {@link getF64Encoder} and {@link getF64Decoder} functions are available.
94
+ *
95
+ * ```ts
96
+ * const bytes = getF64Encoder().encode(-1.5);
97
+ * const value = getF64Decoder().decode(bytes);
98
+ * ```
99
+ *
100
+ * @see {@link getF64Encoder}
101
+ * @see {@link getF64Decoder}
102
+ */
103
+ export const getF64Codec = (config: NumberCodecConfig = {}): FixedSizeCodec<bigint | number, number, 8> =>
104
+ combineCodec(getF64Encoder(config), getF64Decoder(config));
package/src/i128.ts ADDED
@@ -0,0 +1,121 @@
1
+ import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';
2
+
3
+ import { NumberCodecConfig } from './common';
4
+ import { numberDecoderFactory, numberEncoderFactory } from './utils';
5
+
6
+ /**
7
+ * Returns an encoder for 128-bit signed integers (`i128`).
8
+ *
9
+ * This encoder serializes `i128` values using 16 bytes.
10
+ * Values can be provided as either `number` or `bigint`.
11
+ *
12
+ * For more details, see {@link getI128Codec}.
13
+ *
14
+ * @param config - Optional configuration to specify endianness (little by default).
15
+ * @returns A `FixedSizeEncoder<number | bigint, 16>` for encoding `i128` values.
16
+ *
17
+ * @example
18
+ * Encoding an `i128` value.
19
+ * ```ts
20
+ * const encoder = getI128Encoder();
21
+ * const bytes = encoder.encode(-42n); // 0xd6ffffffffffffffffffffffffffffff
22
+ * ```
23
+ *
24
+ * @see {@link getI128Codec}
25
+ */
26
+ export const getI128Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder<bigint | number, 16> =>
27
+ numberEncoderFactory({
28
+ config,
29
+ name: 'i128',
30
+ range: [-BigInt('0x7fffffffffffffffffffffffffffffff') - 1n, BigInt('0x7fffffffffffffffffffffffffffffff')],
31
+ set: (view, value, le) => {
32
+ const leftOffset = le ? 8 : 0;
33
+ const rightOffset = le ? 0 : 8;
34
+ const rightMask = 0xffffffffffffffffn;
35
+ view.setBigInt64(leftOffset, BigInt(value) >> 64n, le);
36
+ view.setBigUint64(rightOffset, BigInt(value) & rightMask, le);
37
+ },
38
+ size: 16,
39
+ });
40
+
41
+ /**
42
+ * Returns a decoder for 128-bit signed integers (`i128`).
43
+ *
44
+ * This decoder deserializes `i128` values from 16 bytes.
45
+ * The decoded value is always a `bigint`.
46
+ *
47
+ * For more details, see {@link getI128Codec}.
48
+ *
49
+ * @param config - Optional configuration to specify endianness (little by default).
50
+ * @returns A `FixedSizeDecoder<bigint, 16>` for decoding `i128` values.
51
+ *
52
+ * @example
53
+ * Decoding an `i128` value.
54
+ * ```ts
55
+ * const decoder = getI128Decoder();
56
+ * const value = decoder.decode(new Uint8Array([
57
+ * 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
58
+ * 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
59
+ * ])); // -42n
60
+ * ```
61
+ *
62
+ * @see {@link getI128Codec}
63
+ */
64
+ export const getI128Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder<bigint, 16> =>
65
+ numberDecoderFactory({
66
+ config,
67
+ get: (view, le) => {
68
+ const leftOffset = le ? 8 : 0;
69
+ const rightOffset = le ? 0 : 8;
70
+ const left = view.getBigInt64(leftOffset, le);
71
+ const right = view.getBigUint64(rightOffset, le);
72
+ return (left << 64n) + right;
73
+ },
74
+ name: 'i128',
75
+ size: 16,
76
+ });
77
+
78
+ /**
79
+ * Returns a codec for encoding and decoding 128-bit signed integers (`i128`).
80
+ *
81
+ * This codec serializes `i128` values using 16 bytes.
82
+ * Values can be provided as either `number` or `bigint`, but the decoded value is always a `bigint`.
83
+ *
84
+ * @param config - Optional configuration to specify endianness (little by default).
85
+ * @returns A `FixedSizeCodec<number | bigint, bigint, 16>` for encoding and decoding `i128` values.
86
+ *
87
+ * @example
88
+ * Encoding and decoding an `i128` value.
89
+ * ```ts
90
+ * const codec = getI128Codec();
91
+ * const bytes = codec.encode(-42n); // 0xd6ffffffffffffffffffffffffffffff
92
+ * const value = codec.decode(bytes); // -42n
93
+ * ```
94
+ *
95
+ * @example
96
+ * Using big-endian encoding.
97
+ * ```ts
98
+ * const codec = getI128Codec({ endian: Endian.Big });
99
+ * const bytes = codec.encode(-42n); // 0xffffffffffffffffffffffffffffd6
100
+ * ```
101
+ *
102
+ * @remarks
103
+ * This codec supports values between `-2^127` and `2^127 - 1`.
104
+ * Since JavaScript `number` cannot safely represent values beyond `2^53 - 1`, the decoded value is always a `bigint`.
105
+ *
106
+ * - If you need a smaller signed integer, consider using {@link getI64Codec} or {@link getI32Codec}.
107
+ * - If you need a larger signed integer, consider using a custom codec.
108
+ * - If you need unsigned integers, consider using {@link getU128Codec}.
109
+ *
110
+ * Separate {@link getI128Encoder} and {@link getI128Decoder} functions are available.
111
+ *
112
+ * ```ts
113
+ * const bytes = getI128Encoder().encode(-42);
114
+ * const value = getI128Decoder().decode(bytes);
115
+ * ```
116
+ *
117
+ * @see {@link getI128Encoder}
118
+ * @see {@link getI128Decoder}
119
+ */
120
+ export const getI128Codec = (config: NumberCodecConfig = {}): FixedSizeCodec<bigint | number, bigint, 16> =>
121
+ combineCodec(getI128Encoder(config), getI128Decoder(config));
package/src/i16.ts ADDED
@@ -0,0 +1,105 @@
1
+ import { combineCodec, FixedSizeCodec, FixedSizeDecoder, FixedSizeEncoder } from '@solana/codecs-core';
2
+
3
+ import { NumberCodecConfig } from './common';
4
+ import { numberDecoderFactory, numberEncoderFactory } from './utils';
5
+
6
+ /**
7
+ * Returns an encoder for 16-bit signed integers (`i16`).
8
+ *
9
+ * This encoder serializes `i16` values using 2 bytes.
10
+ * Values can be provided as either `number` or `bigint`.
11
+ *
12
+ * For more details, see {@link getI16Codec}.
13
+ *
14
+ * @param config - Optional configuration to specify endianness (little by default).
15
+ * @returns A `FixedSizeEncoder<number | bigint, 2>` for encoding `i16` values.
16
+ *
17
+ * @example
18
+ * Encoding an `i16` value.
19
+ * ```ts
20
+ * const encoder = getI16Encoder();
21
+ * const bytes = encoder.encode(-42); // 0xd6ff
22
+ * ```
23
+ *
24
+ * @see {@link getI16Codec}
25
+ */
26
+ export const getI16Encoder = (config: NumberCodecConfig = {}): FixedSizeEncoder<bigint | number, 2> =>
27
+ numberEncoderFactory({
28
+ config,
29
+ name: 'i16',
30
+ range: [-Number('0x7fff') - 1, Number('0x7fff')],
31
+ set: (view, value, le) => view.setInt16(0, Number(value), le),
32
+ size: 2,
33
+ });
34
+
35
+ /**
36
+ * Returns a decoder for 16-bit signed integers (`i16`).
37
+ *
38
+ * This decoder deserializes `i16` values from 2 bytes.
39
+ * The decoded value is always a `number`.
40
+ *
41
+ * For more details, see {@link getI16Codec}.
42
+ *
43
+ * @param config - Optional configuration to specify endianness (little by default).
44
+ * @returns A `FixedSizeDecoder<number, 2>` for decoding `i16` values.
45
+ *
46
+ * @example
47
+ * Decoding an `i16` value.
48
+ * ```ts
49
+ * const decoder = getI16Decoder();
50
+ * const value = decoder.decode(new Uint8Array([0xd6, 0xff])); // -42
51
+ * ```
52
+ *
53
+ * @see {@link getI16Codec}
54
+ */
55
+ export const getI16Decoder = (config: NumberCodecConfig = {}): FixedSizeDecoder<number, 2> =>
56
+ numberDecoderFactory({
57
+ config,
58
+ get: (view, le) => view.getInt16(0, le),
59
+ name: 'i16',
60
+ size: 2,
61
+ });
62
+
63
+ /**
64
+ * Returns a codec for encoding and decoding 16-bit signed integers (`i16`).
65
+ *
66
+ * This codec serializes `i16` values using 2 bytes.
67
+ * Values can be provided as either `number` or `bigint`, but the decoded value is always a `number`.
68
+ *
69
+ * @param config - Optional configuration to specify endianness (little by default).
70
+ * @returns A `FixedSizeCodec<number | bigint, number, 2>` for encoding and decoding `i16` values.
71
+ *
72
+ * @example
73
+ * Encoding and decoding an `i16` value.
74
+ * ```ts
75
+ * const codec = getI16Codec();
76
+ * const bytes = codec.encode(-42); // 0xd6ff
77
+ * const value = codec.decode(bytes); // -42
78
+ * ```
79
+ *
80
+ * @example
81
+ * Using big-endian encoding.
82
+ * ```ts
83
+ * const codec = getI16Codec({ endian: Endian.Big });
84
+ * const bytes = codec.encode(-42); // 0xffd6
85
+ * ```
86
+ *
87
+ * @remarks
88
+ * This codec supports values between `-2^15` (`-32,768`) and `2^15 - 1` (`32,767`).
89
+ *
90
+ * - If you need a smaller signed integer, consider using {@link getI8Codec}.
91
+ * - If you need a larger signed integer, consider using {@link getI32Codec}.
92
+ * - If you need unsigned integers, consider using {@link getU16Codec}.
93
+ *
94
+ * Separate {@link getI16Encoder} and {@link getI16Decoder} functions are available.
95
+ *
96
+ * ```ts
97
+ * const bytes = getI16Encoder().encode(-42);
98
+ * const value = getI16Decoder().decode(bytes);
99
+ * ```
100
+ *
101
+ * @see {@link getI16Encoder}
102
+ * @see {@link getI16Decoder}
103
+ */
104
+ export const getI16Codec = (config: NumberCodecConfig = {}): FixedSizeCodec<bigint | number, number, 2> =>
105
+ combineCodec(getI16Encoder(config), getI16Decoder(config));