UNPKG

@metaplex-foundation/umi-serializers

Version:

A comprehensive set of serializers for the Umi framework

1 lines 5.96 kB
{"version":3,"file":"map.mjs","sources":["../../src/map.ts"],"sourcesContent":["import {\n BaseSerializerOptions,\n mergeBytes,\n Serializer,\n} from '@metaplex-foundation/umi-serializers-core';\nimport { u32 } from '@metaplex-foundation/umi-serializers-numbers';\nimport { ArrayLikeSerializerSize } from './arrayLikeSerializerSize';\nimport { InvalidNumberOfItemsError } from './errors';\nimport {\n getResolvedSize,\n getSizeDescription,\n getSizeFromChildren,\n getSizePrefix,\n} from './utils';\n\n/**\n * Defines the options for `Map` serializers.\n * @category Serializers\n */\nexport type MapSerializerOptions = BaseSerializerOptions & {\n /**\n * The size of the map.\n * @defaultValue `u32()`\n */\n size?: ArrayLikeSerializerSize;\n};\n\n/**\n * Creates a serializer for a map.\n *\n * @param key - The serializer to use for the map's keys.\n * @param value - The serializer to use for the map's values.\n * @param options - A set of options for the serializer.\n * @category Serializers\n */\nexport function map<TK, TV, UK extends TK = TK, UV extends TV = TV>(\n key: Serializer<TK, UK>,\n value: Serializer<TV, UV>,\n options: MapSerializerOptions = {}\n): Serializer<Map<TK, TV>, Map<UK, UV>> {\n const size = options.size ?? u32();\n return {\n description:\n options.description ??\n `map(${key.description}, ${value.description}; ${getSizeDescription(\n size\n )})`,\n fixedSize: getSizeFromChildren(size, [key.fixedSize, value.fixedSize]),\n maxSize: getSizeFromChildren(size, [key.maxSize, value.maxSize]),\n serialize: (map: Map<TK, TV>) => {\n if (typeof size === 'number' && map.size !== size) {\n throw new InvalidNumberOfItemsError('map', size, map.size);\n }\n const itemBytes = Array.from(map, ([k, v]) =>\n mergeBytes([key.serialize(k), value.serialize(v)])\n );\n return mergeBytes([getSizePrefix(size, map.size), ...itemBytes]);\n },\n deserialize: (bytes: Uint8Array, offset = 0) => {\n const map: Map<UK, UV> = new Map();\n if (typeof size === 'object' && bytes.slice(offset).length === 0) {\n return [map, offset];\n }\n if (size === 'remainder') {\n while (offset < bytes.length) {\n const [deserializedKey, kOffset] = key.deserialize(bytes, offset);\n offset = kOffset;\n const [deserializedValue, vOffset] = value.deserialize(bytes, offset);\n offset = vOffset;\n map.set(deserializedKey, deserializedValue);\n }\n return [map, offset];\n }\n const [resolvedSize, newOffset] = getResolvedSize(size, bytes, offset);\n offset = newOffset;\n for (let i = 0; i < resolvedSize; i += 1) {\n const [deserializedKey, kOffset] = key.deserialize(bytes, offset);\n offset = kOffset;\n const [deserializedValue, vOffset] = value.deserialize(bytes, offset);\n offset = vOffset;\n map.set(deserializedKey, deserializedValue);\n }\n return [map, offset];\n },\n };\n}\n"],"names":["map","key","value","options","size","u32","description","getSizeDescription","fixedSize","getSizeFromChildren","maxSize","serialize","InvalidNumberOfItemsError","itemBytes","Array","from","k","v","mergeBytes","getSizePrefix","deserialize","bytes","offset","Map","slice","length","deserializedKey","kOffset","deserializedValue","vOffset","set","resolvedSize","newOffset","getResolvedSize","i"],"mappings":"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"}