Spaces:
Sleeping
Sleeping
| ; | |
| var codecsCore = require('@solana/codecs-core'); | |
| var codecsNumbers = require('@solana/codecs-numbers'); | |
| var errors = require('@solana/errors'); | |
| // src/array.ts | |
| function assertValidNumberOfItemsForCodec(codecDescription, expected, actual) { | |
| if (expected !== actual) { | |
| throw new errors.SolanaError(errors.SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS, { | |
| actual, | |
| codecDescription, | |
| expected | |
| }); | |
| } | |
| } | |
| function maxCodecSizes(sizes) { | |
| return sizes.reduce( | |
| (all, size) => all === null || size === null ? null : Math.max(all, size), | |
| 0 | |
| ); | |
| } | |
| function sumCodecSizes(sizes) { | |
| return sizes.reduce((all, size) => all === null || size === null ? null : all + size, 0); | |
| } | |
| function getFixedSize(codec) { | |
| return codecsCore.isFixedSize(codec) ? codec.fixedSize : null; | |
| } | |
| function getMaxSize(codec) { | |
| return codecsCore.isFixedSize(codec) ? codec.fixedSize : codec.maxSize ?? null; | |
| } | |
| // src/array.ts | |
| function getArrayEncoder(item, config = {}) { | |
| const size = config.size ?? codecsNumbers.getU32Encoder(); | |
| const fixedSize = computeArrayLikeCodecSize(size, getFixedSize(item)); | |
| const maxSize = computeArrayLikeCodecSize(size, getMaxSize(item)) ?? void 0; | |
| return codecsCore.createEncoder({ | |
| ...fixedSize !== null ? { fixedSize } : { | |
| getSizeFromValue: (array) => { | |
| const prefixSize = typeof size === "object" ? codecsCore.getEncodedSize(array.length, size) : 0; | |
| return prefixSize + [...array].reduce((all, value) => all + codecsCore.getEncodedSize(value, item), 0); | |
| }, | |
| maxSize | |
| }, | |
| write: (array, bytes, offset) => { | |
| if (typeof size === "number") { | |
| assertValidNumberOfItemsForCodec("array", size, array.length); | |
| } | |
| if (typeof size === "object") { | |
| offset = size.write(array.length, bytes, offset); | |
| } | |
| array.forEach((value) => { | |
| offset = item.write(value, bytes, offset); | |
| }); | |
| return offset; | |
| } | |
| }); | |
| } | |
| function getArrayDecoder(item, config = {}) { | |
| const size = config.size ?? codecsNumbers.getU32Decoder(); | |
| const itemSize = getFixedSize(item); | |
| const fixedSize = computeArrayLikeCodecSize(size, itemSize); | |
| const maxSize = computeArrayLikeCodecSize(size, getMaxSize(item)) ?? void 0; | |
| return codecsCore.createDecoder({ | |
| ...fixedSize !== null ? { fixedSize } : { maxSize }, | |
| read: (bytes, offset) => { | |
| const array = []; | |
| if (typeof size === "object" && bytes.slice(offset).length === 0) { | |
| return [array, offset]; | |
| } | |
| if (size === "remainder") { | |
| while (offset < bytes.length) { | |
| const [value, newOffset2] = item.read(bytes, offset); | |
| offset = newOffset2; | |
| array.push(value); | |
| } | |
| return [array, offset]; | |
| } | |
| const [resolvedSize, newOffset] = typeof size === "number" ? [size, offset] : size.read(bytes, offset); | |
| offset = newOffset; | |
| for (let i = 0; i < resolvedSize; i += 1) { | |
| const [value, newOffset2] = item.read(bytes, offset); | |
| offset = newOffset2; | |
| array.push(value); | |
| } | |
| return [array, offset]; | |
| } | |
| }); | |
| } | |
| function getArrayCodec(item, config = {}) { | |
| return codecsCore.combineCodec(getArrayEncoder(item, config), getArrayDecoder(item, config)); | |
| } | |
| function computeArrayLikeCodecSize(size, itemSize) { | |
| if (typeof size !== "number") return null; | |
| if (size === 0) return 0; | |
| return itemSize === null ? null : itemSize * size; | |
| } | |
| function getBitArrayEncoder(size, config = {}) { | |
| const parsedConfig = typeof config === "boolean" ? { backward: config } : config; | |
| const backward = parsedConfig.backward ?? false; | |
| return codecsCore.createEncoder({ | |
| fixedSize: size, | |
| write(value, bytes, offset) { | |
| const bytesToAdd = []; | |
| for (let i = 0; i < size; i += 1) { | |
| let byte = 0; | |
| for (let j = 0; j < 8; j += 1) { | |
| const feature = Number(value[i * 8 + j] ?? 0); | |
| byte |= feature << (backward ? j : 7 - j); | |
| } | |
| if (backward) { | |
| bytesToAdd.unshift(byte); | |
| } else { | |
| bytesToAdd.push(byte); | |
| } | |
| } | |
| bytes.set(bytesToAdd, offset); | |
| return size; | |
| } | |
| }); | |
| } | |
| function getBitArrayDecoder(size, config = {}) { | |
| const parsedConfig = typeof config === "boolean" ? { backward: config } : config; | |
| const backward = parsedConfig.backward ?? false; | |
| return codecsCore.createDecoder({ | |
| fixedSize: size, | |
| read(bytes, offset) { | |
| codecsCore.assertByteArrayHasEnoughBytesForCodec("bitArray", size, bytes, offset); | |
| const booleans = []; | |
| let slice = bytes.slice(offset, offset + size); | |
| slice = backward ? slice.reverse() : slice; | |
| slice.forEach((byte) => { | |
| for (let i = 0; i < 8; i += 1) { | |
| if (backward) { | |
| booleans.push(Boolean(byte & 1)); | |
| byte >>= 1; | |
| } else { | |
| booleans.push(Boolean(byte & 128)); | |
| byte <<= 1; | |
| } | |
| } | |
| }); | |
| return [booleans, offset + size]; | |
| } | |
| }); | |
| } | |
| function getBitArrayCodec(size, config = {}) { | |
| return codecsCore.combineCodec(getBitArrayEncoder(size, config), getBitArrayDecoder(size, config)); | |
| } | |
| function getBooleanEncoder(config = {}) { | |
| return codecsCore.transformEncoder(config.size ?? codecsNumbers.getU8Encoder(), (value) => value ? 1 : 0); | |
| } | |
| function getBooleanDecoder(config = {}) { | |
| return codecsCore.transformDecoder(config.size ?? codecsNumbers.getU8Decoder(), (value) => Number(value) === 1); | |
| } | |
| function getBooleanCodec(config = {}) { | |
| return codecsCore.combineCodec(getBooleanEncoder(config), getBooleanDecoder(config)); | |
| } | |
| function getBytesEncoder() { | |
| return codecsCore.createEncoder({ | |
| getSizeFromValue: (value) => value.length, | |
| write: (value, bytes, offset) => { | |
| bytes.set(value, offset); | |
| return offset + value.length; | |
| } | |
| }); | |
| } | |
| function getBytesDecoder() { | |
| return codecsCore.createDecoder({ | |
| read: (bytes, offset) => { | |
| const slice = bytes.slice(offset); | |
| return [slice, offset + slice.length]; | |
| } | |
| }); | |
| } | |
| function getBytesCodec() { | |
| return codecsCore.combineCodec(getBytesEncoder(), getBytesDecoder()); | |
| } | |
| var getBase16Decoder = () => codecsCore.createDecoder({ | |
| read(bytes, offset) { | |
| const value = bytes.slice(offset).reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), ""); | |
| return [value, bytes.length]; | |
| } | |
| }); | |
| function getConstantEncoder(constant) { | |
| return codecsCore.createEncoder({ | |
| fixedSize: constant.length, | |
| write: (_, bytes, offset) => { | |
| bytes.set(constant, offset); | |
| return offset + constant.length; | |
| } | |
| }); | |
| } | |
| function getConstantDecoder(constant) { | |
| return codecsCore.createDecoder({ | |
| fixedSize: constant.length, | |
| read: (bytes, offset) => { | |
| const base16 = getBase16Decoder(); | |
| if (!codecsCore.containsBytes(bytes, constant, offset)) { | |
| throw new errors.SolanaError(errors.SOLANA_ERROR__CODECS__INVALID_CONSTANT, { | |
| constant, | |
| data: bytes, | |
| hexConstant: base16.decode(constant), | |
| hexData: base16.decode(bytes), | |
| offset | |
| }); | |
| } | |
| return [void 0, offset + constant.length]; | |
| } | |
| }); | |
| } | |
| function getConstantCodec(constant) { | |
| return codecsCore.combineCodec(getConstantEncoder(constant), getConstantDecoder(constant)); | |
| } | |
| function getTupleEncoder(items) { | |
| const fixedSize = sumCodecSizes(items.map(getFixedSize)); | |
| const maxSize = sumCodecSizes(items.map(getMaxSize)) ?? void 0; | |
| return codecsCore.createEncoder({ | |
| ...fixedSize === null ? { | |
| getSizeFromValue: (value) => items.map((item, index) => codecsCore.getEncodedSize(value[index], item)).reduce((all, one) => all + one, 0), | |
| maxSize | |
| } : { fixedSize }, | |
| write: (value, bytes, offset) => { | |
| assertValidNumberOfItemsForCodec("tuple", items.length, value.length); | |
| items.forEach((item, index) => { | |
| offset = item.write(value[index], bytes, offset); | |
| }); | |
| return offset; | |
| } | |
| }); | |
| } | |
| function getTupleDecoder(items) { | |
| const fixedSize = sumCodecSizes(items.map(getFixedSize)); | |
| const maxSize = sumCodecSizes(items.map(getMaxSize)) ?? void 0; | |
| return codecsCore.createDecoder({ | |
| ...fixedSize === null ? { maxSize } : { fixedSize }, | |
| read: (bytes, offset) => { | |
| const values = []; | |
| items.forEach((item) => { | |
| const [newValue, newOffset] = item.read(bytes, offset); | |
| values.push(newValue); | |
| offset = newOffset; | |
| }); | |
| return [values, offset]; | |
| } | |
| }); | |
| } | |
| function getTupleCodec(items) { | |
| return codecsCore.combineCodec( | |
| getTupleEncoder(items), | |
| getTupleDecoder(items) | |
| ); | |
| } | |
| function getUnionEncoder(variants, getIndexFromValue) { | |
| const fixedSize = getUnionFixedSize(variants); | |
| const write = (variant, bytes, offset) => { | |
| const index = getIndexFromValue(variant); | |
| assertValidVariantIndex(variants, index); | |
| return variants[index].write(variant, bytes, offset); | |
| }; | |
| if (fixedSize !== null) { | |
| return codecsCore.createEncoder({ fixedSize, write }); | |
| } | |
| const maxSize = getUnionMaxSize(variants); | |
| return codecsCore.createEncoder({ | |
| ...maxSize !== null ? { maxSize } : {}, | |
| getSizeFromValue: (variant) => { | |
| const index = getIndexFromValue(variant); | |
| assertValidVariantIndex(variants, index); | |
| return codecsCore.getEncodedSize(variant, variants[index]); | |
| }, | |
| write | |
| }); | |
| } | |
| function getUnionDecoder(variants, getIndexFromBytes) { | |
| const fixedSize = getUnionFixedSize(variants); | |
| const read = (bytes, offset) => { | |
| const index = getIndexFromBytes(bytes, offset); | |
| assertValidVariantIndex(variants, index); | |
| return variants[index].read(bytes, offset); | |
| }; | |
| if (fixedSize !== null) { | |
| return codecsCore.createDecoder({ fixedSize, read }); | |
| } | |
| const maxSize = getUnionMaxSize(variants); | |
| return codecsCore.createDecoder({ ...maxSize !== null ? { maxSize } : {}, read }); | |
| } | |
| function getUnionCodec(variants, getIndexFromValue, getIndexFromBytes) { | |
| return codecsCore.combineCodec( | |
| getUnionEncoder(variants, getIndexFromValue), | |
| getUnionDecoder(variants, getIndexFromBytes) | |
| ); | |
| } | |
| function assertValidVariantIndex(variants, index) { | |
| if (typeof variants[index] === "undefined") { | |
| throw new errors.SolanaError(errors.SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE, { | |
| maxRange: variants.length - 1, | |
| minRange: 0, | |
| variant: index | |
| }); | |
| } | |
| } | |
| function getUnionFixedSize(variants) { | |
| if (variants.length === 0) return 0; | |
| if (!codecsCore.isFixedSize(variants[0])) return null; | |
| const variantSize = variants[0].fixedSize; | |
| const sameSizedVariants = variants.every((variant) => codecsCore.isFixedSize(variant) && variant.fixedSize === variantSize); | |
| return sameSizedVariants ? variantSize : null; | |
| } | |
| function getUnionMaxSize(variants) { | |
| return maxCodecSizes(variants.map((variant) => getMaxSize(variant))); | |
| } | |
| // src/discriminated-union.ts | |
| function getDiscriminatedUnionEncoder(variants, config = {}) { | |
| const discriminatorProperty = config.discriminator ?? "__kind"; | |
| const prefix = config.size ?? codecsNumbers.getU8Encoder(); | |
| return getUnionEncoder( | |
| variants.map( | |
| ([, variant], index) => codecsCore.transformEncoder(getTupleEncoder([prefix, variant]), (value) => [index, value]) | |
| ), | |
| (value) => getVariantDiscriminator(variants, value[discriminatorProperty]) | |
| ); | |
| } | |
| function getDiscriminatedUnionDecoder(variants, config = {}) { | |
| const discriminatorProperty = config.discriminator ?? "__kind"; | |
| const prefix = config.size ?? codecsNumbers.getU8Decoder(); | |
| return getUnionDecoder( | |
| variants.map( | |
| ([discriminator, variant]) => codecsCore.transformDecoder(getTupleDecoder([prefix, variant]), ([, value]) => ({ | |
| [discriminatorProperty]: discriminator, | |
| ...value | |
| })) | |
| ), | |
| (bytes, offset) => Number(prefix.read(bytes, offset)[0]) | |
| ); | |
| } | |
| function getDiscriminatedUnionCodec(variants, config = {}) { | |
| return codecsCore.combineCodec( | |
| getDiscriminatedUnionEncoder(variants, config), | |
| getDiscriminatedUnionDecoder(variants, config) | |
| ); | |
| } | |
| function getVariantDiscriminator(variants, discriminatorValue) { | |
| const discriminator = variants.findIndex(([key]) => discriminatorValue === key); | |
| if (discriminator < 0) { | |
| throw new errors.SolanaError(errors.SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT, { | |
| value: discriminatorValue, | |
| variants: variants.map(([key]) => key) | |
| }); | |
| } | |
| return discriminator; | |
| } | |
| var getDataEnumEncoder = getDiscriminatedUnionEncoder; | |
| var getDataEnumDecoder = getDiscriminatedUnionDecoder; | |
| var getDataEnumCodec = getDiscriminatedUnionCodec; | |
| // src/enum-helpers.ts | |
| function getEnumStats(constructor) { | |
| const numericalValues = [ | |
| ...new Set(Object.values(constructor).filter((v) => typeof v === "number")) | |
| ].sort(); | |
| const enumRecord = Object.fromEntries(Object.entries(constructor).slice(numericalValues.length)); | |
| const enumKeys = Object.keys(enumRecord); | |
| const enumValues = Object.values(enumRecord); | |
| const stringValues = [ | |
| .../* @__PURE__ */ new Set([...enumKeys, ...enumValues.filter((v) => typeof v === "string")]) | |
| ]; | |
| return { enumKeys, enumRecord, enumValues, numericalValues, stringValues }; | |
| } | |
| function getEnumIndexFromVariant({ | |
| enumKeys, | |
| enumValues, | |
| variant | |
| }) { | |
| const valueIndex = findLastIndex(enumValues, (value) => value === variant); | |
| if (valueIndex >= 0) return valueIndex; | |
| return enumKeys.findIndex((key) => key === variant); | |
| } | |
| function getEnumIndexFromDiscriminator({ | |
| discriminator, | |
| enumKeys, | |
| enumValues, | |
| useValuesAsDiscriminators | |
| }) { | |
| if (!useValuesAsDiscriminators) { | |
| return discriminator >= 0 && discriminator < enumKeys.length ? discriminator : -1; | |
| } | |
| return findLastIndex(enumValues, (value) => value === discriminator); | |
| } | |
| function findLastIndex(array, predicate) { | |
| let l = array.length; | |
| while (l--) { | |
| if (predicate(array[l], l, array)) return l; | |
| } | |
| return -1; | |
| } | |
| function formatNumericalValues(values) { | |
| if (values.length === 0) return ""; | |
| let range = [values[0], values[0]]; | |
| const ranges = []; | |
| for (let index = 1; index < values.length; index++) { | |
| const value = values[index]; | |
| if (range[1] + 1 === value) { | |
| range[1] = value; | |
| } else { | |
| ranges.push(range[0] === range[1] ? `${range[0]}` : `${range[0]}-${range[1]}`); | |
| range = [value, value]; | |
| } | |
| } | |
| ranges.push(range[0] === range[1] ? `${range[0]}` : `${range[0]}-${range[1]}`); | |
| return ranges.join(", "); | |
| } | |
| // src/enum.ts | |
| function getEnumEncoder(constructor, config = {}) { | |
| const prefix = config.size ?? codecsNumbers.getU8Encoder(); | |
| const useValuesAsDiscriminators = config.useValuesAsDiscriminators ?? false; | |
| const { enumKeys, enumValues, numericalValues, stringValues } = getEnumStats(constructor); | |
| if (useValuesAsDiscriminators && enumValues.some((value) => typeof value === "string")) { | |
| throw new errors.SolanaError(errors.SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS, { | |
| stringValues: enumValues.filter((v) => typeof v === "string") | |
| }); | |
| } | |
| return codecsCore.transformEncoder(prefix, (variant) => { | |
| const index = getEnumIndexFromVariant({ enumKeys, enumValues, variant }); | |
| if (index < 0) { | |
| throw new errors.SolanaError(errors.SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT, { | |
| formattedNumericalValues: formatNumericalValues(numericalValues), | |
| numericalValues, | |
| stringValues, | |
| variant | |
| }); | |
| } | |
| return useValuesAsDiscriminators ? enumValues[index] : index; | |
| }); | |
| } | |
| function getEnumDecoder(constructor, config = {}) { | |
| const prefix = config.size ?? codecsNumbers.getU8Decoder(); | |
| const useValuesAsDiscriminators = config.useValuesAsDiscriminators ?? false; | |
| const { enumKeys, enumValues, numericalValues } = getEnumStats(constructor); | |
| if (useValuesAsDiscriminators && enumValues.some((value) => typeof value === "string")) { | |
| throw new errors.SolanaError(errors.SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS, { | |
| stringValues: enumValues.filter((v) => typeof v === "string") | |
| }); | |
| } | |
| return codecsCore.transformDecoder(prefix, (value) => { | |
| const discriminator = Number(value); | |
| const index = getEnumIndexFromDiscriminator({ | |
| discriminator, | |
| enumKeys, | |
| enumValues, | |
| useValuesAsDiscriminators | |
| }); | |
| if (index < 0) { | |
| const validDiscriminators = useValuesAsDiscriminators ? numericalValues : [...Array(enumKeys.length).keys()]; | |
| throw new errors.SolanaError(errors.SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE, { | |
| discriminator, | |
| formattedValidDiscriminators: formatNumericalValues(validDiscriminators), | |
| validDiscriminators | |
| }); | |
| } | |
| return enumValues[index]; | |
| }); | |
| } | |
| function getEnumCodec(constructor, config = {}) { | |
| return codecsCore.combineCodec(getEnumEncoder(constructor, config), getEnumDecoder(constructor, config)); | |
| } | |
| var getScalarEnumEncoder = getEnumEncoder; | |
| var getScalarEnumDecoder = getEnumDecoder; | |
| var getScalarEnumCodec = getEnumCodec; | |
| function getHiddenPrefixEncoder(encoder, prefixedEncoders) { | |
| return codecsCore.transformEncoder( | |
| getTupleEncoder([...prefixedEncoders, encoder]), | |
| (value) => [...prefixedEncoders.map(() => void 0), value] | |
| ); | |
| } | |
| function getHiddenPrefixDecoder(decoder, prefixedDecoders) { | |
| return codecsCore.transformDecoder( | |
| getTupleDecoder([...prefixedDecoders, decoder]), | |
| (tuple) => tuple[tuple.length - 1] | |
| ); | |
| } | |
| function getHiddenPrefixCodec(codec, prefixedCodecs) { | |
| return codecsCore.combineCodec(getHiddenPrefixEncoder(codec, prefixedCodecs), getHiddenPrefixDecoder(codec, prefixedCodecs)); | |
| } | |
| function getHiddenSuffixEncoder(encoder, suffixedEncoders) { | |
| return codecsCore.transformEncoder( | |
| getTupleEncoder([encoder, ...suffixedEncoders]), | |
| (value) => [value, ...suffixedEncoders.map(() => void 0)] | |
| ); | |
| } | |
| function getHiddenSuffixDecoder(decoder, suffixedDecoders) { | |
| return codecsCore.transformDecoder( | |
| getTupleDecoder([decoder, ...suffixedDecoders]), | |
| (tuple) => tuple[0] | |
| ); | |
| } | |
| function getHiddenSuffixCodec(codec, suffixedCodecs) { | |
| return codecsCore.combineCodec(getHiddenSuffixEncoder(codec, suffixedCodecs), getHiddenSuffixDecoder(codec, suffixedCodecs)); | |
| } | |
| function getMapEncoder(key, value, config = {}) { | |
| return codecsCore.transformEncoder( | |
| getArrayEncoder(getTupleEncoder([key, value]), config), | |
| (map) => [...map.entries()] | |
| ); | |
| } | |
| function getMapDecoder(key, value, config = {}) { | |
| return codecsCore.transformDecoder( | |
| getArrayDecoder(getTupleDecoder([key, value]), config), | |
| (entries) => new Map(entries) | |
| ); | |
| } | |
| function getMapCodec(key, value, config = {}) { | |
| return codecsCore.combineCodec(getMapEncoder(key, value, config), getMapDecoder(key, value, config)); | |
| } | |
| function getUnitEncoder() { | |
| return codecsCore.createEncoder({ | |
| fixedSize: 0, | |
| write: (_value, _bytes, offset) => offset | |
| }); | |
| } | |
| function getUnitDecoder() { | |
| return codecsCore.createDecoder({ | |
| fixedSize: 0, | |
| read: (_bytes, offset) => [void 0, offset] | |
| }); | |
| } | |
| function getUnitCodec() { | |
| return codecsCore.combineCodec(getUnitEncoder(), getUnitDecoder()); | |
| } | |
| // src/nullable.ts | |
| function getNullableEncoder(item, config = {}) { | |
| const prefix = (() => { | |
| if (config.prefix === null) { | |
| return codecsCore.transformEncoder(getUnitEncoder(), (_boolean) => void 0); | |
| } | |
| return getBooleanEncoder({ size: config.prefix ?? codecsNumbers.getU8Encoder() }); | |
| })(); | |
| const noneValue = (() => { | |
| if (config.noneValue === "zeroes") { | |
| codecsCore.assertIsFixedSize(item); | |
| return codecsCore.fixEncoderSize(getUnitEncoder(), item.fixedSize); | |
| } | |
| if (!config.noneValue) { | |
| return getUnitEncoder(); | |
| } | |
| return getConstantEncoder(config.noneValue); | |
| })(); | |
| return getUnionEncoder( | |
| [ | |
| codecsCore.transformEncoder(getTupleEncoder([prefix, noneValue]), (_value) => [ | |
| false, | |
| void 0 | |
| ]), | |
| codecsCore.transformEncoder(getTupleEncoder([prefix, item]), (value) => [true, value]) | |
| ], | |
| (variant) => Number(variant !== null) | |
| ); | |
| } | |
| function getNullableDecoder(item, config = {}) { | |
| const prefix = (() => { | |
| if (config.prefix === null) { | |
| return codecsCore.transformDecoder(getUnitDecoder(), () => false); | |
| } | |
| return getBooleanDecoder({ size: config.prefix ?? codecsNumbers.getU8Decoder() }); | |
| })(); | |
| const noneValue = (() => { | |
| if (config.noneValue === "zeroes") { | |
| codecsCore.assertIsFixedSize(item); | |
| return codecsCore.fixDecoderSize(getUnitDecoder(), item.fixedSize); | |
| } | |
| if (!config.noneValue) { | |
| return getUnitDecoder(); | |
| } | |
| return getConstantDecoder(config.noneValue); | |
| })(); | |
| return getUnionDecoder( | |
| [ | |
| codecsCore.transformDecoder(getTupleDecoder([prefix, noneValue]), () => null), | |
| codecsCore.transformDecoder(getTupleDecoder([prefix, item]), ([, value]) => value) | |
| ], | |
| (bytes, offset) => { | |
| if (config.prefix === null && !config.noneValue) { | |
| return Number(offset < bytes.length); | |
| } | |
| if (config.prefix === null && config.noneValue != null) { | |
| const zeroValue = config.noneValue === "zeroes" ? new Uint8Array(noneValue.fixedSize).fill(0) : config.noneValue; | |
| return codecsCore.containsBytes(bytes, zeroValue, offset) ? 0 : 1; | |
| } | |
| return Number(prefix.read(bytes, offset)[0]); | |
| } | |
| ); | |
| } | |
| function getNullableCodec(item, config = {}) { | |
| return codecsCore.combineCodec( | |
| getNullableEncoder(item, config), | |
| getNullableDecoder(item, config) | |
| ); | |
| } | |
| function getSetEncoder(item, config = {}) { | |
| return codecsCore.transformEncoder(getArrayEncoder(item, config), (set) => [...set]); | |
| } | |
| function getSetDecoder(item, config = {}) { | |
| return codecsCore.transformDecoder(getArrayDecoder(item, config), (entries) => new Set(entries)); | |
| } | |
| function getSetCodec(item, config = {}) { | |
| return codecsCore.combineCodec(getSetEncoder(item, config), getSetDecoder(item, config)); | |
| } | |
| function getStructEncoder(fields) { | |
| const fieldCodecs = fields.map(([, codec]) => codec); | |
| const fixedSize = sumCodecSizes(fieldCodecs.map(getFixedSize)); | |
| const maxSize = sumCodecSizes(fieldCodecs.map(getMaxSize)) ?? void 0; | |
| return codecsCore.createEncoder({ | |
| ...fixedSize === null ? { | |
| getSizeFromValue: (value) => fields.map(([key, codec]) => codecsCore.getEncodedSize(value[key], codec)).reduce((all, one) => all + one, 0), | |
| maxSize | |
| } : { fixedSize }, | |
| write: (struct, bytes, offset) => { | |
| fields.forEach(([key, codec]) => { | |
| offset = codec.write(struct[key], bytes, offset); | |
| }); | |
| return offset; | |
| } | |
| }); | |
| } | |
| function getStructDecoder(fields) { | |
| const fieldCodecs = fields.map(([, codec]) => codec); | |
| const fixedSize = sumCodecSizes(fieldCodecs.map(getFixedSize)); | |
| const maxSize = sumCodecSizes(fieldCodecs.map(getMaxSize)) ?? void 0; | |
| return codecsCore.createDecoder({ | |
| ...fixedSize === null ? { maxSize } : { fixedSize }, | |
| read: (bytes, offset) => { | |
| const struct = {}; | |
| fields.forEach(([key, codec]) => { | |
| const [value, newOffset] = codec.read(bytes, offset); | |
| offset = newOffset; | |
| struct[key] = value; | |
| }); | |
| return [struct, offset]; | |
| } | |
| }); | |
| } | |
| function getStructCodec(fields) { | |
| return codecsCore.combineCodec( | |
| getStructEncoder(fields), | |
| getStructDecoder(fields) | |
| ); | |
| } | |
| exports.assertValidNumberOfItemsForCodec = assertValidNumberOfItemsForCodec; | |
| exports.getArrayCodec = getArrayCodec; | |
| exports.getArrayDecoder = getArrayDecoder; | |
| exports.getArrayEncoder = getArrayEncoder; | |
| exports.getBitArrayCodec = getBitArrayCodec; | |
| exports.getBitArrayDecoder = getBitArrayDecoder; | |
| exports.getBitArrayEncoder = getBitArrayEncoder; | |
| exports.getBooleanCodec = getBooleanCodec; | |
| exports.getBooleanDecoder = getBooleanDecoder; | |
| exports.getBooleanEncoder = getBooleanEncoder; | |
| exports.getBytesCodec = getBytesCodec; | |
| exports.getBytesDecoder = getBytesDecoder; | |
| exports.getBytesEncoder = getBytesEncoder; | |
| exports.getConstantCodec = getConstantCodec; | |
| exports.getConstantDecoder = getConstantDecoder; | |
| exports.getConstantEncoder = getConstantEncoder; | |
| exports.getDataEnumCodec = getDataEnumCodec; | |
| exports.getDataEnumDecoder = getDataEnumDecoder; | |
| exports.getDataEnumEncoder = getDataEnumEncoder; | |
| exports.getDiscriminatedUnionCodec = getDiscriminatedUnionCodec; | |
| exports.getDiscriminatedUnionDecoder = getDiscriminatedUnionDecoder; | |
| exports.getDiscriminatedUnionEncoder = getDiscriminatedUnionEncoder; | |
| exports.getEnumCodec = getEnumCodec; | |
| exports.getEnumDecoder = getEnumDecoder; | |
| exports.getEnumEncoder = getEnumEncoder; | |
| exports.getHiddenPrefixCodec = getHiddenPrefixCodec; | |
| exports.getHiddenPrefixDecoder = getHiddenPrefixDecoder; | |
| exports.getHiddenPrefixEncoder = getHiddenPrefixEncoder; | |
| exports.getHiddenSuffixCodec = getHiddenSuffixCodec; | |
| exports.getHiddenSuffixDecoder = getHiddenSuffixDecoder; | |
| exports.getHiddenSuffixEncoder = getHiddenSuffixEncoder; | |
| exports.getMapCodec = getMapCodec; | |
| exports.getMapDecoder = getMapDecoder; | |
| exports.getMapEncoder = getMapEncoder; | |
| exports.getNullableCodec = getNullableCodec; | |
| exports.getNullableDecoder = getNullableDecoder; | |
| exports.getNullableEncoder = getNullableEncoder; | |
| exports.getScalarEnumCodec = getScalarEnumCodec; | |
| exports.getScalarEnumDecoder = getScalarEnumDecoder; | |
| exports.getScalarEnumEncoder = getScalarEnumEncoder; | |
| exports.getSetCodec = getSetCodec; | |
| exports.getSetDecoder = getSetDecoder; | |
| exports.getSetEncoder = getSetEncoder; | |
| exports.getStructCodec = getStructCodec; | |
| exports.getStructDecoder = getStructDecoder; | |
| exports.getStructEncoder = getStructEncoder; | |
| exports.getTupleCodec = getTupleCodec; | |
| exports.getTupleDecoder = getTupleDecoder; | |
| exports.getTupleEncoder = getTupleEncoder; | |
| exports.getUnionCodec = getUnionCodec; | |
| exports.getUnionDecoder = getUnionDecoder; | |
| exports.getUnionEncoder = getUnionEncoder; | |
| exports.getUnitCodec = getUnitCodec; | |
| exports.getUnitDecoder = getUnitDecoder; | |
| exports.getUnitEncoder = getUnitEncoder; | |
| //# sourceMappingURL=index.node.cjs.map | |
| //# sourceMappingURL=index.node.cjs.map |