{"version":3,"file":"utils.cjs","sources":["../../src/utils.ts"],"sourcesContent":["import {\n  DeserializingEmptyBufferError,\n  NotEnoughBytesError,\n  Serializer,\n} from '@metaplex-foundation/umi-serializers-core';\nimport {\n  Endian,\n  NumberSerializer,\n  NumberSerializerOptions,\n  SingleByteNumberSerializerOptions,\n} from './common';\nimport { NumberOutOfRangeError } from './errors';\n\nexport function numberFactory(input: {\n  name: string;\n  size: number;\n  range?: [number | bigint, number | bigint];\n  set: (view: DataView, value: number | bigint, littleEndian?: boolean) => void;\n  get: (view: DataView, littleEndian?: boolean) => number;\n  options: SingleByteNumberSerializerOptions | NumberSerializerOptions;\n}): Serializer<number>;\nexport function numberFactory(input: {\n  name: string;\n  size: number;\n  range?: [number | bigint, number | bigint];\n  set: (view: DataView, value: number | bigint, littleEndian?: boolean) => void;\n  get: (view: DataView, littleEndian?: boolean) => bigint;\n  options: SingleByteNumberSerializerOptions | NumberSerializerOptions;\n}): Serializer<number | bigint, bigint>;\nexport function numberFactory(input: {\n  name: string;\n  size: number;\n  range?: [number | bigint, number | bigint];\n  set: (view: DataView, value: number | bigint, littleEndian?: boolean) => void;\n  get: (view: DataView, littleEndian?: boolean) => number | bigint;\n  options: SingleByteNumberSerializerOptions | NumberSerializerOptions;\n}): NumberSerializer {\n  let littleEndian: boolean | undefined;\n  let defaultDescription: string = input.name;\n\n  if (input.size > 1) {\n    littleEndian =\n      !('endian' in input.options) || input.options.endian === Endian.Little;\n    defaultDescription += littleEndian ? '(le)' : '(be)';\n  }\n\n  return {\n    description: input.options.description ?? defaultDescription,\n    fixedSize: input.size,\n    maxSize: input.size,\n    serialize(value: number | bigint): Uint8Array {\n      if (input.range) {\n        assertRange(input.name, input.range[0], input.range[1], value);\n      }\n      const buffer = new ArrayBuffer(input.size);\n      input.set(new DataView(buffer), value, littleEndian);\n      return new Uint8Array(buffer);\n    },\n    deserialize(bytes, offset = 0): [number | bigint, number] {\n      const slice = bytes.slice(offset, offset + input.size);\n      assertEnoughBytes('i8', slice, input.size);\n      const view = toDataView(slice);\n      return [input.get(view, littleEndian), offset + input.size];\n    },\n  } as NumberSerializer;\n}\n\n/**\n * Helper function to ensure that the array buffer is converted properly from a uint8array\n * Source: https://stackoverflow.com/questions/37228285/uint8array-to-arraybuffer\n * @param {Uint8Array} array Uint8array that's being converted into an array buffer\n * @returns {ArrayBuffer} An array buffer that's necessary to construct a data view\n */\nexport const toArrayBuffer = (array: Uint8Array): ArrayBuffer =>\n  array.buffer.slice(array.byteOffset, array.byteLength + array.byteOffset);\n\nexport const toDataView = (array: Uint8Array): DataView =>\n  new DataView(toArrayBuffer(array));\n\nexport const assertRange = (\n  serializer: string,\n  min: number | bigint,\n  max: number | bigint,\n  value: number | bigint\n) => {\n  if (value < min || value > max) {\n    throw new NumberOutOfRangeError(serializer, min, max, value);\n  }\n};\n\nexport const assertEnoughBytes = (\n  serializer: string,\n  bytes: Uint8Array,\n  expected: number\n) => {\n  if (bytes.length === 0) {\n    throw new DeserializingEmptyBufferError(serializer);\n  }\n  if (bytes.length < expected) {\n    throw new NotEnoughBytesError(serializer, expected, bytes.length);\n  }\n};\n"],"names":["numberFactory","input","littleEndian","defaultDescription","name","size","options","endian","Endian","Little","description","fixedSize","maxSize","serialize","value","range","assertRange","buffer","ArrayBuffer","set","DataView","Uint8Array","deserialize","bytes","offset","slice","assertEnoughBytes","view","toDataView","get","toArrayBuffer","array","byteOffset","byteLength","serializer","min","max","NumberOutOfRangeError","expected","length","DeserializingEmptyBufferError","NotEnoughBytesError"],"mappings":"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"}