@marcuspuchalla/nachos 0.1.4 → 0.2.0
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/CHANGELOG.md +52 -0
- package/dist/{chunk-RVG2BY32.cjs → chunk-3Z45RBZP.cjs} +96 -42
- package/dist/chunk-3Z45RBZP.cjs.map +1 -0
- package/dist/{chunk-UMAX5MX5.js → chunk-EDXZTSIA.js} +33 -5
- package/dist/chunk-EDXZTSIA.js.map +1 -0
- package/dist/{chunk-S4RXO6IB.cjs → chunk-HMUA5KLG.cjs} +48 -20
- package/dist/chunk-HMUA5KLG.cjs.map +1 -0
- package/dist/{chunk-ZDZ2B5PE.js → chunk-JESIF5IF.js} +7 -3
- package/dist/chunk-JESIF5IF.js.map +1 -0
- package/dist/{chunk-5IWW5H47.js → chunk-LWNWC2O7.js} +68 -14
- package/dist/chunk-LWNWC2O7.js.map +1 -0
- package/dist/{chunk-PD72MVTX.cjs → chunk-P6A2OOIY.cjs} +7 -3
- package/dist/chunk-P6A2OOIY.cjs.map +1 -0
- package/dist/encoder/index.cjs +14 -14
- package/dist/encoder/index.d.cts +5 -4
- package/dist/encoder/index.d.ts +5 -4
- package/dist/encoder/index.js +2 -2
- package/dist/index.cjs +46 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +15 -5
- package/dist/index.d.ts +15 -5
- package/dist/index.js +25 -5
- package/dist/index.js.map +1 -1
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/parser/index.cjs +21 -21
- package/dist/parser/index.d.cts +2 -2
- package/dist/parser/index.d.ts +2 -2
- package/dist/parser/index.js +2 -2
- package/dist/{types-DvNlfbKB.d.cts → types-eG2qalpr.d.cts} +27 -1
- package/dist/{types-DvNlfbKB.d.ts → types-eG2qalpr.d.ts} +27 -1
- package/dist/{useCborSimpleEncoder-BoKEmjP9.d.ts → useCborSimpleEncoder-CamvS-_N.d.ts} +7 -1
- package/dist/{useCborSimpleEncoder-C_OHxoB8.d.cts → useCborSimpleEncoder-DXgPx62d.d.cts} +7 -1
- package/dist/{useCborTag-QpZR-Er2.d.cts → useCborTag-D4d7xG3-.d.cts} +1 -1
- package/dist/{useCborTag-BD6Sqp7p.d.ts → useCborTag-TYst1KR6.d.ts} +1 -1
- package/package.json +1 -1
- package/src/__tests__/audit-fixes.test.ts +141 -0
- package/src/encoder/composables/useCborCollectionEncoder.ts +3 -2
- package/src/encoder/composables/useCborEncoder.ts +19 -0
- package/src/encoder/composables/useCborSimpleEncoder.ts +6 -2
- package/src/encoder/types.ts +9 -2
- package/src/encoder/utils.ts +33 -1
- package/src/index.ts +10 -0
- package/src/parser/__tests__/utils-errors.test.ts +11 -3
- package/src/parser/composables/useCborCollection.ts +7 -4
- package/src/parser/composables/useCborDiagnostic.ts +28 -0
- package/src/parser/composables/useCborParser.ts +63 -13
- package/src/parser/composables/useCborTag.ts +8 -1
- package/src/parser/types.ts +32 -1
- package/src/parser/utils.ts +41 -0
- package/dist/chunk-5IWW5H47.js.map +0 -1
- package/dist/chunk-PD72MVTX.cjs.map +0 -1
- package/dist/chunk-RVG2BY32.cjs.map +0 -1
- package/dist/chunk-S4RXO6IB.cjs.map +0 -1
- package/dist/chunk-UMAX5MX5.js.map +0 -1
- package/dist/chunk-ZDZ2B5PE.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/parser/utils.ts","../src/parser/composables/useCborInteger.ts","../src/parser/composables/useCborString.ts","../src/parser/composables/useCborFloat.ts","../src/parser/composables/useCborTag.ts","../src/utils/logger.ts","../src/parser/composables/useCborCollection.ts","../src/parser/composables/useCborParser.ts"],"names":["useCborByteString","useCborTextString","error","text","DEFAULT_LIMITS","INDEFINITE_SYMBOL","ALL_ENTRIES_SYMBOL","DEFAULT_OPTIONS"],"mappings":"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","file":"chunk-3Z45RBZP.cjs","sourcesContent":["/**\n * Common utility functions for CBOR parsing\n */\n\n/**\n * Converts hex string to Uint8Array\n *\n * Validates even length and hex-only characters.\n *\n * @param hex - Hex string (e.g., \"1864\")\n * @returns Byte array\n */\nexport const hexToBytes = (hex: string): Uint8Array => {\n if (hex.length === 0) {\n return new Uint8Array(0)\n }\n if (hex.length % 2 !== 0) {\n throw new Error('Hex string must have even length')\n }\n if (!/^[0-9a-fA-F]+$/.test(hex)) {\n throw new Error(`Invalid hex character in: ${hex}`)\n }\n const bytes = hex.match(/.{1,2}/g)\n if (!bytes) return new Uint8Array(0)\n return new Uint8Array(bytes.map(byte => parseInt(byte, 16)))\n}\n\n/**\n * Converts Uint8Array to hex string\n *\n * @param bytes - Byte array\n * @returns Hex string (e.g., \"1864\")\n */\nexport const bytesToHex = (bytes: Uint8Array): string => {\n return Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n}\n\n/**\n * Reads a single byte from buffer at offset\n * \n * @param buffer - Data buffer\n * @param offset - Byte offset\n * @returns Byte value (0-255)\n */\nexport const readByte = (buffer: Uint8Array, offset: number): number => {\n if (offset >= buffer.length) {\n throw new Error(`Offset ${offset} is out of bounds (buffer length: ${buffer.length})`)\n }\n const byte = buffer[offset]\n if (byte === undefined) {\n throw new Error(`Unexpected undefined byte at offset ${offset}`)\n }\n return byte\n}\n\n/**\n * Reads unsigned integer of specified byte length (big-endian)\n * \n * @param buffer - Data buffer\n * @param offset - Starting byte offset\n * @param length - Number of bytes to read (1-8)\n * @returns Integer value\n */\nexport const readUint = (buffer: Uint8Array, offset: number, length: number): number => {\n if (length < 1 || length > 8) {\n throw new Error(`Invalid length: ${length} (must be 1-8)`)\n }\n if (offset + length > buffer.length) {\n throw new Error(`Cannot read ${length} bytes at offset ${offset} (buffer length: ${buffer.length})`)\n }\n \n let result = 0\n for (let i = 0; i < length; i++) {\n result = result * 256 + readByte(buffer, offset + i)\n }\n // Guard against silent precision loss: values above 2^53 cannot be represented\n // exactly as a JS number. Callers needing the full 64-bit range must use\n // readBigUint instead (this helper is only invoked for <= 4-byte fields).\n if (result > Number.MAX_SAFE_INTEGER) {\n throw new Error(`Value at offset ${offset} (${length} bytes) exceeds MAX_SAFE_INTEGER; use readBigUint`)\n }\n return result\n}\n\n/**\n * Reads unsigned BigInt of specified byte length (big-endian)\n * \n * @param buffer - Data buffer\n * @param offset - Starting byte offset\n * @param length - Number of bytes to read (1-8)\n * @returns BigInt value\n */\nexport const readBigUint = (buffer: Uint8Array, offset: number, length: number): bigint => {\n if (length < 1 || length > 8) {\n throw new Error(`Invalid length: ${length} (must be 1-8)`)\n }\n if (offset + length > buffer.length) {\n throw new Error(`Cannot read ${length} bytes at offset ${offset} (buffer length: ${buffer.length})`)\n }\n \n let result = 0n\n for (let i = 0; i < length; i++) {\n result = result * 256n + BigInt(readByte(buffer, offset + i))\n }\n return result\n}\n\n/**\n * Extracts major type and additional info from initial byte\n *\n * @param initialByte - First byte of CBOR item\n * @returns Object with majorType (0-7) and additionalInfo (0-31)\n */\nexport const extractCborHeader = (initialByte: number): { majorType: number; additionalInfo: number } => {\n return {\n majorType: initialByte >> 5,\n additionalInfo: initialByte & 0x1f\n }\n}\n\n/**\n * Strictly validate UTF-8 encoding\n *\n * Rejects:\n * - Overlong encodings (security vulnerability)\n * - Surrogate halves (U+D800-U+DFFF)\n * - Values beyond U+10FFFF\n * - Invalid start bytes (0xC0, 0xC1, 0xF5-0xFF)\n * - Incomplete sequences\n *\n * @param bytes - UTF-8 bytes to validate\n * @throws Error if validation fails\n */\nexport function validateUtf8Strict(bytes: Uint8Array): void {\n let i = 0\n\n while (i < bytes.length) {\n const byte = bytes[i]\n if (byte === undefined) {\n throw new Error(`Unexpected undefined byte at position ${i}`)\n }\n\n // Invalid start bytes\n if (byte === 0xC0 || byte === 0xC1 || byte >= 0xF5) {\n throw new Error(\n `Invalid UTF-8 start byte 0x${byte.toString(16).padStart(2, '0')} at position ${i}`\n )\n }\n\n // 1-byte sequence (ASCII: 0x00-0x7F)\n if (byte < 0x80) {\n i++\n continue\n }\n\n // 2-byte sequence (0xC2-0xDF)\n if (byte >= 0xC2 && byte <= 0xDF) {\n if (i + 1 >= bytes.length) {\n throw new Error(`Incomplete UTF-8 sequence at position ${i}`)\n }\n\n const byte2 = bytes[i + 1]\n if (byte2 === undefined) {\n throw new Error(`Incomplete UTF-8 sequence at position ${i}`)\n }\n if ((byte2 & 0xC0) !== 0x80) {\n throw new Error(`Invalid UTF-8 continuation byte at position ${i + 1}`)\n }\n\n // Check for overlong encoding\n const codepoint = ((byte & 0x1F) << 6) | (byte2 & 0x3F)\n if (codepoint < 0x80) {\n throw new Error(\n `Overlong UTF-8 encoding at position ${i}: ` +\n `U+${codepoint.toString(16).padStart(4, '0').toUpperCase()} ` +\n `encoded as 2 bytes (should be 1 byte)`\n )\n }\n\n i += 2\n continue\n }\n\n // 3-byte sequence (0xE0-0xEF)\n if (byte >= 0xE0 && byte <= 0xEF) {\n if (i + 2 >= bytes.length) {\n throw new Error(`Incomplete UTF-8 sequence at position ${i}`)\n }\n\n const byte2 = bytes[i + 1]\n const byte3 = bytes[i + 2]\n\n if (byte2 === undefined || byte3 === undefined) {\n throw new Error(`Incomplete UTF-8 sequence at position ${i}`)\n }\n\n if ((byte2 & 0xC0) !== 0x80 || (byte3 & 0xC0) !== 0x80) {\n throw new Error(\n `Invalid UTF-8 continuation byte at position ${i + 1} or ${i + 2}`\n )\n }\n\n const codepoint = ((byte & 0x0F) << 12) | ((byte2 & 0x3F) << 6) | (byte3 & 0x3F)\n\n // Check for overlong encoding\n if (codepoint < 0x800) {\n throw new Error(\n `Overlong UTF-8 encoding at position ${i}: ` +\n `U+${codepoint.toString(16).padStart(4, '0').toUpperCase()} ` +\n `encoded as 3 bytes (should be 2 bytes or less)`\n )\n }\n\n // Check for surrogate range (U+D800-U+DFFF are invalid)\n if (codepoint >= 0xD800 && codepoint <= 0xDFFF) {\n throw new Error(\n `Invalid UTF-8 surrogate codepoint U+${codepoint.toString(16).padStart(4, '0').toUpperCase()} ` +\n `at position ${i} (surrogates are not valid Unicode scalar values)`\n )\n }\n\n i += 3\n continue\n }\n\n // 4-byte sequence (0xF0-0xF4)\n if (byte >= 0xF0 && byte <= 0xF4) {\n if (i + 3 >= bytes.length) {\n throw new Error(`Incomplete UTF-8 sequence at position ${i}`)\n }\n\n const byte2 = bytes[i + 1]\n const byte3 = bytes[i + 2]\n const byte4 = bytes[i + 3]\n\n if (byte2 === undefined || byte3 === undefined || byte4 === undefined) {\n throw new Error(`Incomplete UTF-8 sequence at position ${i}`)\n }\n\n if ((byte2 & 0xC0) !== 0x80 || (byte3 & 0xC0) !== 0x80 || (byte4 & 0xC0) !== 0x80) {\n throw new Error(\n `Invalid UTF-8 continuation byte at position ${i + 1}, ${i + 2}, or ${i + 3}`\n )\n }\n\n const codepoint =\n ((byte & 0x07) << 18) |\n ((byte2 & 0x3F) << 12) |\n ((byte3 & 0x3F) << 6) |\n (byte4 & 0x3F)\n\n // Check for overlong encoding\n if (codepoint < 0x10000) {\n throw new Error(\n `Overlong UTF-8 encoding at position ${i}: ` +\n `U+${codepoint.toString(16).padStart(6, '0').toUpperCase()} ` +\n `encoded as 4 bytes (should be 3 bytes or less)`\n )\n }\n\n // Check maximum codepoint (U+10FFFF)\n if (codepoint > 0x10FFFF) {\n throw new Error(\n `UTF-8 codepoint U+${codepoint.toString(16).padStart(6, '0').toUpperCase()} ` +\n `exceeds maximum U+10FFFF at position ${i}`\n )\n }\n\n i += 4\n continue\n }\n\n // If we get here, it's an invalid byte\n throw new Error(\n `Invalid UTF-8 byte 0x${byte.toString(16).padStart(2, '0')} at position ${i}`\n )\n }\n}\n\n/**\n * Validate integer is in canonical (shortest) form\n */\nexport function validateCanonicalInteger(value: number | bigint, ai: number): void {\n const v = typeof value === 'bigint' ? value : BigInt(value)\n\n // Values 0-23 must use direct encoding (AI = value)\n if (v >= 0n && v <= 23n && ai !== Number(v)) {\n throw new Error(\n `Non-canonical integer: value ${v} must use AI ${v}, not AI ${ai}`\n )\n }\n\n // Values 24-255 must use 1-byte encoding (AI = 24)\n if (v >= 24n && v <= 255n && ai !== 24) {\n throw new Error(\n `Non-canonical integer: value ${v} must use AI 24 (1-byte), not AI ${ai}`\n )\n }\n\n // Values 256-65535 must use 2-byte encoding (AI = 25)\n if (v >= 256n && v <= 65535n && ai !== 25) {\n throw new Error(\n `Non-canonical integer: value ${v} must use AI 25 (2-byte), not AI ${ai}`\n )\n }\n\n // Values 65536-4294967295 must use 4-byte encoding (AI = 26)\n if (v >= 65536n && v <= 4294967295n && ai !== 26) {\n throw new Error(\n `Non-canonical integer: value ${v} must use AI 26 (4-byte), not AI ${ai}`\n )\n }\n\n // Values > 4294967295 must use 8-byte encoding (AI = 27)\n if (v > 4294967295n && ai !== 27) {\n throw new Error(\n `Non-canonical integer: value ${v} must use AI 27 (8-byte), not AI ${ai}`\n )\n }\n}\n\n/**\n * Compare two byte arrays lexicographically\n * Returns: -1 if a < b, 0 if a === b, 1 if a > b\n */\nexport function compareBytes(a: Uint8Array, b: Uint8Array): number {\n if (!a || !b) {\n throw new Error('compareBytes: arguments cannot be null or undefined')\n }\n\n // Shorter arrays come first\n if (a.length !== b.length) {\n return a.length - b.length\n }\n\n // Same length: lexicographic comparison\n for (let i = 0; i < a.length; i++) {\n const byteA = a[i]\n const byteB = b[i]\n if (byteA === undefined || byteB === undefined) {\n throw new Error(`Unexpected undefined byte at index ${i}`)\n }\n if (byteA !== byteB) {\n return byteA - byteB\n }\n }\n\n return 0 // Equal\n}\n\n/**\n * Compare two byte arrays in pure bytewise lexicographic order.\n * This is RFC 8949 Section 4.2.1 \"Core Deterministic Encoding\" ordering:\n * compare byte-by-byte; if one is a prefix of the other, the shorter sorts first.\n * (Contrast with compareBytes above, which sorts length-first per RFC 7049 §3.9.)\n */\nexport function compareBytesLexicographic(a: Uint8Array, b: Uint8Array): number {\n if (!a || !b) {\n throw new Error('compareBytesLexicographic: arguments cannot be null or undefined')\n }\n const min = Math.min(a.length, b.length)\n for (let i = 0; i < min; i++) {\n const byteA = a[i]!\n const byteB = b[i]!\n if (byteA !== byteB) {\n return byteA - byteB\n }\n }\n return a.length - b.length\n}\n\n/**\n * Compare two encoded map keys according to the requested ordering.\n *\n * @param order - 'length-first' (CIP-21 / RFC 7049 §3.9, default) or\n * 'bytewise' (RFC 8949 §4.2.1 core deterministic)\n */\nexport function compareMapKeys(\n a: Uint8Array,\n b: Uint8Array,\n order: 'length-first' | 'bytewise' = 'length-first'\n): number {\n return order === 'bytewise' ? compareBytesLexicographic(a, b) : compareBytes(a, b)\n}\n\n/**\n * Serializes a CBOR value to a normalized string for comparison\n * Used for detecting duplicates in sets and ensuring uniqueness\n *\n * @param value - CBOR value to serialize\n * @returns Normalized string representation\n */\nexport function serializeValueForComparison(value: unknown): string {\n // Handle primitives\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (typeof value === 'boolean') return value.toString()\n if (typeof value === 'number') return `num:${value}`\n if (typeof value === 'bigint') return `bigint:${value.toString()}`\n if (typeof value === 'string') return `str:${value}`\n\n // Handle Uint8Array (byte strings)\n if (value instanceof Uint8Array) {\n return `bytes:${Array.from(value).map(b => b.toString(16).padStart(2, '0')).join('')}`\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n return `array:[${value.map(v => serializeValueForComparison(v)).join(',')}]`\n }\n\n // Handle objects (maps and tagged values)\n if (typeof value === 'object') {\n // Check if it's a tagged value\n if ('tag' in value && 'value' in value) {\n return `tag:${(value as any).tag}:${serializeValueForComparison((value as any).value)}`\n }\n\n // Regular object (map)\n const keys = Object.keys(value).sort()\n const pairs = keys.map(k => `${k}:${serializeValueForComparison((value as any)[k])}`)\n return `map:{${pairs.join(',')}}`\n }\n\n // Fallback for unknown types\n return String(value)\n}\n\n/**\n * Checks if a set (array) contains duplicate values\n * Uses serialization-based comparison to handle nested structures\n *\n * @param items - Array of CBOR values\n * @returns True if duplicates found, false otherwise\n */\nexport function hasDuplicates(items: unknown[]): boolean {\n const seen = new Set<string>()\n\n for (const item of items) {\n const serialized = serializeValueForComparison(item)\n if (seen.has(serialized)) {\n return true\n }\n seen.add(serialized)\n }\n\n return false\n}\n","/**\n * CBOR Integer Parser Composable\n * Handles Major Types 0 (Unsigned) and 1 (Negative)\n * Supports BigInt for 64-bit values outside Number.MAX_SAFE_INTEGER\n */\n\nimport type { ParseResult, ParseOptions } from '../types'\nimport { hexToBytes, readByte, readUint, readBigUint, extractCborHeader, validateCanonicalInteger } from '../utils'\n\n/**\n * Composable for parsing CBOR integers (Major Types 0 and 1)\n * \n * @returns Object with parseInteger function\n * \n * @example\n * ```ts\n * const { parseInteger } = useCborInteger()\n * const result = parseInteger('1864') // 100\n * ```\n */\nexport function useCborInteger() {\n /**\n * Parses CBOR integer (Major Type 0 or 1) from a buffer at a given offset\n *\n * @param buffer - Data buffer\n * @param offset - Current offset into the buffer\n * @param options - Parser options (optional)\n * @returns Parsed integer value and bytes read\n */\n const parseIntegerFromBuffer = (buffer: Uint8Array, offset: number, options?: ParseOptions): ParseResult => {\n const initialByte = readByte(buffer, offset)\n\n const { majorType, additionalInfo } = extractCborHeader(initialByte)\n\n // Get the raw value based on additional info\n let rawValue: number | bigint\n let bytesRead: number\n\n if (additionalInfo < 24) {\n // Direct encoding (0-23)\n rawValue = additionalInfo\n bytesRead = 1\n } else if (additionalInfo === 24) {\n // 1 byte follows\n rawValue = readByte(buffer, offset + 1)\n bytesRead = 2\n } else if (additionalInfo === 25) {\n // 2 bytes follow\n rawValue = readUint(buffer, offset + 1, 2)\n bytesRead = 3\n } else if (additionalInfo === 26) {\n // 4 bytes follow\n rawValue = readUint(buffer, offset + 1, 4)\n bytesRead = 5\n } else if (additionalInfo === 27) {\n // 8 bytes follow - use BigInt for large values\n const bigValue = readBigUint(buffer, offset + 1, 8)\n\n // Check if value fits in Number.MAX_SAFE_INTEGER\n if (bigValue <= BigInt(Number.MAX_SAFE_INTEGER)) {\n rawValue = Number(bigValue)\n } else {\n rawValue = bigValue\n }\n bytesRead = 9\n } else {\n throw new Error(`Invalid additional info: ${additionalInfo}`)\n }\n\n // Validate canonical encoding if requested\n if (options?.validateCanonical) {\n validateCanonicalInteger(rawValue, additionalInfo)\n }\n\n // Calculate final value based on major type\n let finalValue: number | bigint\n\n if (majorType === 0) {\n // Unsigned integer\n finalValue = rawValue\n } else if (majorType === 1) {\n // Negative integer: -1 - N\n if (typeof rawValue === 'bigint') {\n const negValue = -1n - rawValue\n // Check if result fits in safe integer range\n if (negValue >= BigInt(Number.MIN_SAFE_INTEGER) && negValue <= BigInt(Number.MAX_SAFE_INTEGER)) {\n finalValue = Number(negValue)\n } else {\n finalValue = negValue\n }\n } else {\n const negValue = -1 - rawValue\n // Check if the negative value is still within safe integer range\n if (negValue >= Number.MIN_SAFE_INTEGER) {\n finalValue = negValue\n } else {\n // Convert to BigInt if outside safe range\n finalValue = BigInt(negValue)\n }\n }\n } else {\n throw new Error(`Expected major type 0 or 1, got ${majorType}`)\n }\n\n return {\n value: finalValue,\n bytesRead\n }\n }\n\n /**\n * Parses CBOR integer (Major Type 0 or 1) from hex string\n * Thin wrapper around parseIntegerFromBuffer\n *\n * @param hexString - CBOR hex string\n * @param options - Parser options (optional)\n * @returns Parsed integer value and bytes read\n */\n const parseInteger = (hexString: string, options?: ParseOptions): ParseResult => {\n const buffer = hexToBytes(hexString)\n return parseIntegerFromBuffer(buffer, 0, options)\n }\n\n return {\n parseInteger,\n parseIntegerFromBuffer\n }\n}\n","/**\n * CBOR String Parser Composable\n * Handles Major Types 2 (Byte Strings) and 3 (Text Strings)\n * Supports definite and indefinite length encoding\n */\n\nimport type { ParseResult, ParseOptions } from '../types'\nimport { hexToBytes, readByte, readUint, readBigUint, extractCborHeader, validateUtf8Strict } from '../utils'\nimport { useCborByteString, useCborTextString } from './useCborStringTypes'\n\n/**\n * Composable for parsing CBOR strings (Major Types 2 and 3)\n * \n * @returns Object with string parsing functions\n * \n * @example\n * ```ts\n * const { parseString } = useCborString()\n * const result = parseString('6449455446') // \"IETF\"\n * ```\n */\nexport function useCborString() {\n const { create: createByteString } = useCborByteString()\n const { create: createTextString } = useCborTextString()\n\n /**\n * Parses the length from CBOR additional info field\n *\n * @param buffer - Data buffer\n * @param offset - Current offset (after initial byte)\n * @param ai - Additional info field (0-31)\n * @returns Object with length and bytes consumed\n */\n const parseLength = (buffer: Uint8Array, offset: number, ai: number, options?: ParseOptions): { length: number; bytesConsumed: number } => {\n if (ai < 24) {\n // Direct encoding (0-23)\n return { length: ai, bytesConsumed: 0 }\n } else if (ai === 24) {\n // 1 byte follows\n const length = readByte(buffer, offset)\n\n // RFC 8949 Section 4.2.1: Canonical encoding requires shortest form\n if (options?.validateCanonical && length < 24) {\n throw new Error(`Non-canonical length encoding: ${length} should use direct encoding (AI < 24), not AI=24`)\n }\n\n return { length, bytesConsumed: 1 }\n } else if (ai === 25) {\n // 2 bytes follow\n const length = readUint(buffer, offset, 2)\n\n // RFC 8949 Section 4.2.1: Value must be >= 256 to justify 2-byte encoding\n if (options?.validateCanonical && length < 256) {\n throw new Error(`Non-canonical length encoding: ${length} should use ${length < 24 ? 'direct encoding' : '1-byte encoding (AI=24)'}, not AI=25`)\n }\n\n return { length, bytesConsumed: 2 }\n } else if (ai === 26) {\n // 4 bytes follow\n const length = readUint(buffer, offset, 4)\n\n // RFC 8949 Section 4.2.1: Value must be >= 65536 to justify 4-byte encoding\n if (options?.validateCanonical && length < 65536) {\n throw new Error(`Non-canonical length encoding: ${length} should use shorter encoding, not AI=26`)\n }\n\n return { length, bytesConsumed: 4 }\n } else if (ai === 27) {\n // 8 bytes follow - rare for strings, but supported\n const lengthBigInt = readBigUint(buffer, offset, 8)\n\n // Check if value fits in safe integer range\n if (lengthBigInt > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(`String length ${lengthBigInt} exceeds maximum safe integer`)\n }\n const length = Number(lengthBigInt)\n\n // RFC 8949 Section 4.2.1: Value must be >= 2^32 to justify 8-byte encoding\n if (options?.validateCanonical && length < 4294967296) {\n throw new Error(`Non-canonical length encoding: ${length} should use shorter encoding, not AI=27`)\n }\n\n return { length, bytesConsumed: 8 }\n } else if (ai === 31) {\n // Indefinite length (break-terminated) - special marker\n return { length: -1, bytesConsumed: 0 }\n } else {\n throw new Error(`Invalid additional info: ${ai}`)\n }\n }\n\n /**\n * Parses CBOR byte string (Major Type 2)\n *\n * @param buffer - Data buffer\n * @param offset - Current offset\n * @param options - Parser options (optional)\n * @returns Parsed byte array and bytes read\n */\n const parseByteString = (buffer: Uint8Array, offset: number = 0, options?: ParseOptions): ParseResult => {\n const initialByte = readByte(buffer, offset)\n const { majorType, additionalInfo } = extractCborHeader(initialByte)\n\n if (majorType !== 2) {\n throw new Error(`Expected major type 2 (byte string), got ${majorType}`)\n }\n\n // Check if indefinite length is allowed\n if (additionalInfo === 31 && options?.allowIndefinite === false) {\n throw new Error('Indefinite-length encoding is not allowed in strict mode')\n }\n\n // Parse the length\n const { length, bytesConsumed } = parseLength(buffer, offset + 1, additionalInfo, options)\n\n // Handle indefinite-length byte string\n if (length === -1) {\n const chunks: Uint8Array[] = []\n let currentOffset = offset + 1 + bytesConsumed\n let totalLength = 0\n\n while (currentOffset < buffer.length) {\n // Peek at next byte to check for break marker\n if (currentOffset >= buffer.length) {\n throw new Error(`Incomplete indefinite byte string: missing break marker`)\n }\n\n const nextByte = buffer[currentOffset]\n\n // Check for break marker (0xff)\n if (nextByte === 0xff) {\n currentOffset++ // Consume break byte\n break\n }\n\n // Validate chunk is definite-length (RFC 8949 Section 3.2.3)\n const chunkInitialByte = readByte(buffer, currentOffset)\n const chunkHeader = extractCborHeader(chunkInitialByte)\n if (chunkHeader.majorType !== 2) {\n throw new Error(`Indefinite byte string chunks must be byte strings (major type 2), got ${chunkHeader.majorType}`)\n }\n if (chunkHeader.additionalInfo === 31) {\n throw new Error('Indefinite byte string chunks must be definite-length (RFC 8949 Section 3.2.3)')\n }\n\n // Parse chunk\n let chunkResult\n try {\n chunkResult = parseByteString(buffer, currentOffset, options)\n } catch (error) {\n throw new Error(`Error parsing indefinite byte string chunk at offset ${currentOffset}: ${(error as Error).message}`)\n }\n\n // Validate chunk is a byte string\n if (!(chunkResult.value instanceof Uint8Array)) {\n throw new Error('Indefinite byte string must contain only byte string chunks')\n }\n\n chunks.push(chunkResult.value)\n totalLength += chunkResult.value.length\n currentOffset += chunkResult.bytesRead\n\n // Check length limit during accumulation\n if (options?.limits?.maxStringLength && totalLength > options.limits.maxStringLength) {\n throw new Error(`Byte string length ${totalLength} exceeds limit of ${options.limits.maxStringLength} bytes`)\n }\n }\n\n // Concatenate all chunks\n const bytes = new Uint8Array(totalLength)\n let destOffset = 0\n for (const chunk of chunks) {\n bytes.set(chunk, destOffset)\n destOffset += chunk.length\n }\n\n // Return CborByteString with indefinite marker and original chunks\n return {\n value: createByteString(bytes, true, chunks),\n bytesRead: currentOffset - offset\n }\n }\n\n // Definite-length byte string\n // Check length limit before allocating\n if (options?.limits?.maxStringLength && length > options.limits.maxStringLength) {\n throw new Error(`Byte string length ${length} exceeds limit of ${options.limits.maxStringLength} bytes`)\n }\n\n const payloadOffset = offset + 1 + bytesConsumed\n\n // Validate buffer has enough bytes\n if (payloadOffset + length > buffer.length) {\n throw new Error(`Insufficient data: expected ${length} bytes at offset ${payloadOffset}, but only ${buffer.length - payloadOffset} bytes available`)\n }\n\n const payload = buffer.slice(payloadOffset, payloadOffset + length)\n\n return {\n value: payload,\n bytesRead: 1 + bytesConsumed + length\n }\n }\n\n /**\n * Parses CBOR text string (Major Type 3)\n *\n * @param buffer - Data buffer\n * @param offset - Current offset\n * @param options - Parser options (optional)\n * @returns Parsed text string and bytes read\n */\n const parseTextString = (buffer: Uint8Array, offset: number = 0, options?: ParseOptions): ParseResult => {\n const initialByte = readByte(buffer, offset)\n const { majorType, additionalInfo } = extractCborHeader(initialByte)\n\n if (majorType !== 3) {\n throw new Error(`Expected major type 3 (text string), got ${majorType}`)\n }\n\n // Check if indefinite length is allowed\n if (additionalInfo === 31 && options?.allowIndefinite === false) {\n throw new Error('Indefinite-length encoding is not allowed in strict mode')\n }\n\n // Parse the length\n const { length, bytesConsumed } = parseLength(buffer, offset + 1, additionalInfo, options)\n\n // Handle indefinite-length text string\n if (length === -1) {\n const chunks: string[] = []\n let currentOffset = offset + 1 + bytesConsumed\n let totalLength = 0\n\n while (currentOffset < buffer.length) {\n // Peek at next byte to check for break marker\n if (currentOffset >= buffer.length) {\n throw new Error(`Incomplete indefinite text string: missing break marker`)\n }\n\n const nextByte = buffer[currentOffset]\n\n // Check for break marker (0xff)\n if (nextByte === 0xff) {\n currentOffset++ // Consume break byte\n break\n }\n\n // Validate chunk is definite-length (RFC 8949 Section 3.2.3)\n const chunkInitialByte = readByte(buffer, currentOffset)\n const chunkHeader = extractCborHeader(chunkInitialByte)\n if (chunkHeader.majorType !== 3) {\n throw new Error(`Indefinite text string chunks must be text strings (major type 3), got ${chunkHeader.majorType}`)\n }\n if (chunkHeader.additionalInfo === 31) {\n throw new Error('Indefinite text string chunks must be definite-length (RFC 8949 Section 3.2.3)')\n }\n\n // Parse chunk\n let chunkResult\n try {\n chunkResult = parseTextString(buffer, currentOffset, options)\n } catch (error) {\n throw new Error(`Error parsing indefinite text string chunk at offset ${currentOffset}: ${(error as Error).message}`)\n }\n\n // Validate chunk is a text string\n if (typeof chunkResult.value !== 'string') {\n throw new Error('Indefinite text string must contain only text string chunks')\n }\n\n chunks.push(chunkResult.value)\n totalLength += chunkResult.value.length\n currentOffset += chunkResult.bytesRead\n\n // Check length limit during accumulation\n if (options?.limits?.maxStringLength && totalLength > options.limits.maxStringLength) {\n throw new Error(`Text string length ${totalLength} exceeds limit of ${options.limits.maxStringLength} characters`)\n }\n }\n\n // Concatenate all chunks\n const text = chunks.join('')\n\n // Return CborTextString with indefinite marker and original chunks\n return {\n value: createTextString(text, true, chunks),\n bytesRead: currentOffset - offset\n }\n }\n\n // Definite-length text string\n // Check length limit before allocating\n if (options?.limits?.maxStringLength && length > options.limits.maxStringLength) {\n throw new Error(`Text string length ${length} bytes exceeds limit of ${options.limits.maxStringLength} bytes`)\n }\n\n const payloadOffset = offset + 1 + bytesConsumed\n\n // Validate buffer has enough bytes\n if (payloadOffset + length > buffer.length) {\n throw new Error(`Insufficient data: expected ${length} bytes at offset ${payloadOffset}, but only ${buffer.length - payloadOffset} bytes available`)\n }\n\n const payload = buffer.slice(payloadOffset, payloadOffset + length)\n\n // Validate UTF-8 if strict validation is enabled\n if (options?.validateUtf8Strict) {\n validateUtf8Strict(payload)\n }\n\n // Decode UTF-8 bytes to string\n const decoder = new TextDecoder('utf-8')\n const text = decoder.decode(payload)\n\n return {\n value: text,\n bytesRead: 1 + bytesConsumed + length\n }\n }\n\n /**\n * Parses CBOR string (auto-detects byte or text string)\n *\n * @param hexString - CBOR hex string\n * @param options - Parser options (optional)\n * @returns Parsed string (Uint8Array for MT 2, string for MT 3) and bytes read\n */\n const parseString = (hexString: string, options?: ParseOptions): ParseResult => {\n const buffer = hexToBytes(hexString)\n const initialByte = readByte(buffer, 0)\n const { majorType } = extractCborHeader(initialByte)\n\n if (majorType === 2) {\n return parseByteString(buffer, 0, options)\n } else if (majorType === 3) {\n return parseTextString(buffer, 0, options)\n } else {\n throw new Error(`Expected major type 2 or 3 (string), got ${majorType}`)\n }\n }\n\n return {\n parseString,\n parseByteString,\n parseTextString\n }\n}\n","/**\n * CBOR Float and Simple Values Parser Composable\n * Handles Major Type 7 (Simple Values and Floats)\n * Supports Float16, Float32, Float64, and simple values (true, false, null, undefined)\n */\n\nimport type { ParseResult, ParseOptions } from '../types'\nimport { hexToBytes, readByte, extractCborHeader } from '../utils'\n\n/**\n * Composable for parsing CBOR floats and simple values (Major Type 7)\n *\n * @returns Object with parse, parseFloat, and parseSimple functions\n *\n * @example\n * ```ts\n * const { parse } = useCborFloat()\n * const result = parse('f5') // true\n * ```\n */\nexport function useCborFloat() {\n /**\n * Converts IEEE 754 binary16 (Float16) to JavaScript number\n * Manual conversion required as JavaScript doesn't have native Float16 support\n *\n * @param buffer - Data buffer\n * @param offset - Starting offset\n * @returns Float64 number representation\n */\n const float16ToFloat64 = (buffer: Uint8Array, offset: number): number => {\n // Read 16-bit value in big-endian\n const byte1 = readByte(buffer, offset)\n const byte2 = readByte(buffer, offset + 1)\n const value = (byte1 << 8) | byte2\n\n // Extract components\n const sign = (value & 0x8000) >> 15\n const exponent = (value & 0x7c00) >> 10\n const fraction = value & 0x03ff\n\n // Handle special cases\n if (exponent === 0) {\n if (fraction === 0) {\n // Zero (positive or negative)\n return sign === 0 ? 0.0 : -0.0\n }\n // Subnormal number\n return (sign === 0 ? 1 : -1) * Math.pow(2, -14) * (fraction / 1024)\n }\n\n if (exponent === 0x1f) {\n if (fraction === 0) {\n // Infinity (positive or negative)\n return sign === 0 ? Infinity : -Infinity\n }\n // NaN\n return NaN\n }\n\n // Normal number\n // Formula: (-1)^sign * 2^(exponent - 15) * (1 + fraction/1024)\n return (sign === 0 ? 1 : -1) * Math.pow(2, exponent - 15) * (1 + fraction / 1024)\n }\n\n /**\n * Checks if a float64 value can be exactly represented as float16\n * Used for canonical encoding validation (RFC 8949 Section 4.2.2)\n */\n const fitsInFloat16 = (value: number): boolean => {\n if (Number.isNaN(value) || value === Infinity || value === -Infinity) return true\n if (Object.is(value, 0) || Object.is(value, -0)) return true\n\n const abs = Math.abs(value)\n // Float16 range: subnormals ~5.96e-8 to max normal 65504\n if (abs > 65504) return false\n if (abs < 5.960464477539063e-8) return false\n\n // Encode to float16 and back to see if value is preserved\n const sign = value < 0 ? 1 : 0\n const buf = new ArrayBuffer(8)\n const view = new DataView(buf)\n view.setFloat64(0, abs, false)\n const bits64 = view.getBigUint64(0, false)\n const exp64 = Number((bits64 >> 52n) & 0x7ffn) - 1023\n const mant64 = Number(bits64 & 0xfffffffffffffn)\n\n let exp16: number\n let mant16: number\n if (exp64 < -14) {\n // Subnormal float16\n exp16 = 0\n const shift = -14 - exp64\n mant16 = ((1 << 10) | (mant64 >> 42)) >> shift\n } else if (exp64 > 15) {\n return false\n } else {\n exp16 = exp64 + 15\n mant16 = mant64 >> 42\n }\n\n const float16Bits = (sign << 15) | (exp16 << 10) | mant16\n // Decode back\n const s = (float16Bits & 0x8000) >> 15\n const e = (float16Bits & 0x7c00) >> 10\n const f = float16Bits & 0x03ff\n let reconstructed: number\n if (e === 0) {\n reconstructed = (s === 0 ? 1 : -1) * Math.pow(2, -14) * (f / 1024)\n } else if (e === 0x1f) {\n reconstructed = f === 0 ? (s === 0 ? Infinity : -Infinity) : NaN\n } else {\n reconstructed = (s === 0 ? 1 : -1) * Math.pow(2, e - 15) * (1 + f / 1024)\n }\n return reconstructed === value\n }\n\n /**\n * Parses simple values (booleans, null, undefined, unassigned)\n *\n * @param buffer - Data buffer\n * @param offset - Current offset\n * @returns Parsed simple value and bytes read\n */\n const parseSimpleFromBuffer = (buffer: Uint8Array, offset: number): ParseResult => {\n const initialByte = readByte(buffer, offset)\n const { majorType, additionalInfo } = extractCborHeader(initialByte)\n\n if (majorType !== 7) {\n throw new Error(`Expected major type 7 (simple/float), got ${majorType}`)\n }\n\n // Simple values based on additional info\n if (additionalInfo < 20) {\n // Unassigned simple values (0-19)\n return {\n value: { simpleValue: additionalInfo },\n bytesRead: 1\n }\n }\n\n switch (additionalInfo) {\n case 20: // false\n return { value: false, bytesRead: 1 }\n\n case 21: // true\n return { value: true, bytesRead: 1 }\n\n case 22: // null\n return { value: null, bytesRead: 1 }\n\n case 23: // undefined\n return { value: undefined, bytesRead: 1 }\n\n case 24: // 1-byte simple value\n {\n if (offset + 1 >= buffer.length) {\n throw new Error('Unexpected end of buffer while reading simple value')\n }\n const simpleValue = readByte(buffer, offset + 1)\n // Simple values 0-19 should not use 1-byte encoding\n if (simpleValue < 32) {\n throw new Error(`Invalid 1-byte encoding for simple value ${simpleValue}`)\n }\n return {\n value: { simpleValue },\n bytesRead: 2\n }\n }\n\n case 25: // Float16\n case 26: // Float32\n case 27: // Float64\n // These are floats, not simple values - should use parseFloatFromBuffer\n throw new Error(`Additional info ${additionalInfo} is a float, use parseFloat instead`)\n\n case 28:\n case 29:\n case 30:\n // Reserved\n throw new Error(`Reserved additional info value: ${additionalInfo}`)\n\n case 31: // Break marker\n throw new Error('Break marker (0xff) should only appear in indefinite-length items')\n\n default:\n throw new Error(`Invalid additional info: ${additionalInfo}`)\n }\n }\n\n /**\n * Parses floating point numbers (Float16, Float32, Float64)\n *\n * @param buffer - Data buffer\n * @param offset - Current offset\n * @returns Parsed float and bytes read\n */\n const parseFloatFromBuffer = (buffer: Uint8Array, offset: number, options?: ParseOptions): ParseResult => {\n const initialByte = readByte(buffer, offset)\n const { majorType, additionalInfo } = extractCborHeader(initialByte)\n\n if (majorType !== 7) {\n throw new Error(`Expected major type 7 (simple/float), got ${majorType}`)\n }\n\n switch (additionalInfo) {\n case 25: // Float16 (2 bytes)\n {\n if (offset + 2 >= buffer.length) {\n throw new Error('Unexpected end of buffer while reading Float16')\n }\n if (options?.validateCanonical) {\n const byte1 = readByte(buffer, offset + 1)\n const byte2 = readByte(buffer, offset + 2)\n const bits = (byte1 << 8) | byte2\n const exp = (bits >> 10) & 0x1f\n const mant = bits & 0x03ff\n if (exp === 0x1f && mant !== 0 && bits !== 0x7e00) {\n throw new Error('Non-canonical NaN encoding: use 0xf97e00')\n }\n }\n const value = float16ToFloat64(buffer, offset + 1)\n return { value, bytesRead: 3 }\n }\n\n case 26: // Float32 (4 bytes)\n {\n if (offset + 4 >= buffer.length) {\n throw new Error('Unexpected end of buffer while reading Float32')\n }\n // Use DataView for proper IEEE 754 parsing\n const dataView = new DataView(buffer.buffer, buffer.byteOffset + offset + 1, 4)\n const value = dataView.getFloat32(0, false) // false = big-endian\n if (options?.validateCanonical) {\n if (Number.isNaN(value)) {\n throw new Error('Non-canonical NaN encoding: NaN must use float16 0xf97e00')\n }\n // Check if value could be represented as float16 (shortest form)\n if (fitsInFloat16(value)) {\n throw new Error('Non-canonical float32: value fits in float16, use shortest encoding')\n }\n }\n return { value, bytesRead: 5 }\n }\n\n case 27: // Float64 (8 bytes)\n {\n if (offset + 8 >= buffer.length) {\n throw new Error('Unexpected end of buffer while reading Float64')\n }\n // Use DataView for proper IEEE 754 parsing\n const dataView = new DataView(buffer.buffer, buffer.byteOffset + offset + 1, 8)\n const value = dataView.getFloat64(0, false) // false = big-endian\n if (options?.validateCanonical) {\n if (Number.isNaN(value)) {\n throw new Error('Non-canonical NaN encoding: NaN must use float16 0xf97e00')\n }\n // Check if value could be represented in a smaller float\n if (fitsInFloat16(value)) {\n throw new Error('Non-canonical float64: value fits in float16/float32, use shortest encoding')\n }\n // Check if float64 value fits in float32\n const f32 = Math.fround(value)\n if (f32 === value || (Object.is(value, -0) && Object.is(f32, -0))) {\n throw new Error('Non-canonical float64: value fits in float16/float32, use shortest encoding')\n }\n }\n return { value, bytesRead: 9 }\n }\n\n default:\n throw new Error(`Additional info ${additionalInfo} is not a float type`)\n }\n }\n\n /**\n * Auto-detects and parses any Major Type 7 value (simple or float)\n *\n * @param buffer - Data buffer\n * @param offset - Current offset\n * @returns Parsed value and bytes read\n */\n const parseFromBuffer = (buffer: Uint8Array, offset: number, options?: ParseOptions): ParseResult => {\n const initialByte = readByte(buffer, offset)\n const { majorType, additionalInfo } = extractCborHeader(initialByte)\n\n if (majorType !== 7) {\n throw new Error(`Expected major type 7 (simple/float), got ${majorType}`)\n }\n\n // Determine if it's a float or simple value based on additional info\n if (additionalInfo === 25 || additionalInfo === 26 || additionalInfo === 27) {\n // Float16, Float32, or Float64\n return parseFloatFromBuffer(buffer, offset, options)\n } else {\n // Simple value (including false, true, null, undefined)\n return parseSimpleFromBuffer(buffer, offset)\n }\n }\n\n /**\n * Parses CBOR simple value from hex string\n *\n * @param hexString - CBOR hex string\n * @param _options - Parser options (reserved for future use)\n * @returns Parsed simple value and bytes read\n */\n const parseSimple = (hexString: string, _options?: ParseOptions): ParseResult => {\n const buffer = hexToBytes(hexString)\n return parseSimpleFromBuffer(buffer, 0)\n }\n\n /**\n * Parses CBOR float from hex string\n *\n * @param hexString - CBOR hex string\n * @param _options - Parser options (optional, for future use)\n * @returns Parsed float and bytes read\n */\n const parseFloat = (hexString: string, options?: ParseOptions): ParseResult => {\n const buffer = hexToBytes(hexString)\n return parseFloatFromBuffer(buffer, 0, options)\n }\n\n /**\n * Auto-detects and parses any Major Type 7 value from hex string\n *\n * @param hexString - CBOR hex string\n * @param _options - Parser options (optional, for future use)\n * @returns Parsed value and bytes read\n */\n const parse = (hexString: string, options?: ParseOptions): ParseResult => {\n const buffer = hexToBytes(hexString)\n return parseFromBuffer(buffer, 0, options)\n }\n\n return {\n parse,\n parseFloat,\n parseSimple,\n parseFromBuffer\n }\n}\n","/**\n * CBOR Tag Parser Composable\n * Handles Major Type 6 (Semantic Tags)\n * Supports standard tags (0-5), encoding hints (21-36), self-describe (55799), and Cardano tags\n */\n\nimport type { ParseResult, CborValue, TaggedValue, CborMap, ParseOptions, PlutusConstr, CborByteString } from '../types'\nimport { INDEFINITE_SYMBOL, DEFAULT_LIMITS } from '../types'\nimport { hexToBytes, readByte, readUint, readBigUint, extractCborHeader, hasDuplicates, validateCanonicalInteger } from '../utils'\nimport { useCborInteger } from './useCborInteger'\nimport { useCborString } from './useCborString'\nimport { useCborFloat } from './useCborFloat'\n\n/**\n * Composable for parsing CBOR tags (Major Type 6)\n *\n * @returns Object with parseTag and parse functions\n *\n * @example\n * ```ts\n * const { parseTag } = useCborTag()\n * const result = parseTag('c11a514b67b0') // 1(1363896240) - epoch timestamp\n * ```\n */\nexport function useCborTag() {\n const { parseIntegerFromBuffer } = useCborInteger()\n const { parseByteString, parseTextString } = useCborString()\n const { parseFromBuffer: parseFloatOrSimpleFromBuffer } = useCborFloat()\n\n /** Tracks when parsing started for timeout enforcement */\n let parseStartTime = 0\n\n /**\n * Internal parser dispatcher for CBOR items\n * Handles recursive parsing of tagged values\n *\n * @param buffer - Data buffer\n * @param offset - Current offset\n * @param options - Parser options\n * @param tagDepth - Current tag nesting depth (for limit checking)\n * @returns Parsed value and bytes consumed\n */\n const parseItem = (buffer: Uint8Array, offset: number, options?: ParseOptions, tagDepth: number = 0, collectionDepth: number = 0): ParseResult => {\n // Check timeout on every recursive call\n if (parseStartTime > 0 && options?.limits?.maxParseTime) {\n const elapsed = Date.now() - parseStartTime\n if (elapsed > options.limits.maxParseTime) {\n throw new Error(`Parse timeout: exceeded ${options.limits.maxParseTime}ms limit`)\n }\n }\n\n if (offset >= buffer.length) {\n throw new Error(`Unexpected end of buffer at offset ${offset}`)\n }\n\n const initialByte = readByte(buffer, offset)\n const { majorType } = extractCborHeader(initialByte)\n\n switch (majorType) {\n case 0: // Unsigned integer\n case 1: // Negative integer\n return parseIntegerFromBuffer(buffer, offset, options)\n\n case 2: // Byte string\n return parseByteString(buffer, offset, options)\n\n case 3: // Text string\n return parseTextString(buffer, offset, options)\n\n case 4: // Array\n return parseArrayInternal(buffer, offset, options, collectionDepth)\n\n case 5: // Map\n return parseMapInternal(buffer, offset, options, collectionDepth)\n\n case 6: // Tag (recursive)\n return parseTagFromBuffer(buffer, offset, options, tagDepth)\n\n case 7: // Simple/Float\n return parseFloatOrSimpleFromBuffer(buffer, offset, options)\n\n default:\n throw new Error(`Unknown major type: ${majorType}`)\n }\n }\n\n /**\n * Internal array parser with full security checks\n * Mirrors useCborCollection.parseArrayFromBuffer security hardening\n */\n const parseArrayInternal = (buffer: Uint8Array, offset: number, options?: ParseOptions, depth: number = 0): ParseResult => {\n const initialByte = readByte(buffer, offset)\n const { majorType, additionalInfo } = extractCborHeader(initialByte)\n\n if (majorType !== 4) {\n throw new Error(`Expected major type 4 (array), got ${majorType}`)\n }\n\n // Check if indefinite length is allowed\n const isIndefiniteAllowed = options?.allowIndefinite ?? !(options?.validateCanonical || options?.strict)\n if (additionalInfo === 31 && !isIndefiniteAllowed) {\n throw new Error('Indefinite-length encoding is not allowed (strict/canonical mode)')\n }\n\n // Check depth limit before descending\n const maxDepth = options?.limits?.maxDepth ?? DEFAULT_LIMITS.maxDepth\n if (depth >= maxDepth) {\n throw new Error(`Maximum nesting depth ${maxDepth} exceeded`)\n }\n\n // Parse length\n let length: number | null\n let bytesConsumed: number\n\n if (additionalInfo < 24) {\n length = additionalInfo\n bytesConsumed = 0\n } else if (additionalInfo === 24) {\n length = readByte(buffer, offset + 1)\n bytesConsumed = 1\n } else if (additionalInfo === 25) {\n length = readUint(buffer, offset + 1, 2)\n bytesConsumed = 2\n } else if (additionalInfo === 26) {\n length = readUint(buffer, offset + 1, 4)\n bytesConsumed = 4\n } else if (additionalInfo === 27) {\n const lengthBigInt = readBigUint(buffer, offset + 1, 8)\n if (lengthBigInt > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(`Array length ${lengthBigInt} exceeds maximum safe integer`)\n }\n length = Number(lengthBigInt)\n bytesConsumed = 8\n } else if (additionalInfo === 31) {\n length = null // Indefinite\n bytesConsumed = 0\n } else {\n throw new Error(`Invalid additional info for array: ${additionalInfo}`)\n }\n\n // Check array length limit before parsing\n if (length !== null && options?.limits?.maxArrayLength && length > options.limits.maxArrayLength) {\n throw new Error(`Array length ${length} exceeds limit of ${options.limits.maxArrayLength}`)\n }\n\n let currentOffset = offset + 1 + bytesConsumed\n const items: CborValue[] = []\n\n if (length === null) {\n // Indefinite-length array\n let index = 0\n let foundBreak = false\n while (currentOffset < buffer.length) {\n const nextByte = readByte(buffer, currentOffset)\n if (nextByte === 0xff) {\n currentOffset++\n foundBreak = true\n break\n }\n\n // Check array length limit\n if (options?.limits?.maxArrayLength && index >= options.limits.maxArrayLength) {\n throw new Error(`Array length exceeds limit of ${options.limits.maxArrayLength}`)\n }\n\n const itemResult = parseItem(buffer, currentOffset, options, 0, depth + 1)\n items.push(itemResult.value)\n currentOffset += itemResult.bytesRead\n index++\n }\n\n if (!foundBreak) {\n throw new Error('Indefinite-length array missing break code (0xFF)')\n }\n\n // Mark as indefinite-length for round-trip preservation\n ;(items as any)[INDEFINITE_SYMBOL] = true\n } else {\n // Definite-length array\n for (let i = 0; i < length; i++) {\n if (currentOffset >= buffer.length) {\n throw new Error(`Unexpected end of buffer while parsing array element ${i}/${length}`)\n }\n const itemResult = parseItem(buffer, currentOffset, options, 0, depth + 1)\n items.push(itemResult.value)\n currentOffset += itemResult.bytesRead\n }\n }\n\n return {\n value: items,\n bytesRead: currentOffset - offset\n }\n }\n\n /**\n * Internal map parser with full security checks\n * Mirrors useCborCollection.parseMapFromBuffer security hardening\n */\n const parseMapInternal = (buffer: Uint8Array, offset: number, options?: ParseOptions, depth: number = 0): ParseResult => {\n const initialByte = readByte(buffer, offset)\n const { majorType, additionalInfo } = extractCborHeader(initialByte)\n\n if (majorType !== 5) {\n throw new Error(`Expected major type 5 (map), got ${majorType}`)\n }\n\n // Check if indefinite length is allowed\n const isIndefiniteAllowed = options?.allowIndefinite ?? !(options?.validateCanonical || options?.strict)\n if (additionalInfo === 31 && !isIndefiniteAllowed) {\n throw new Error('Indefinite-length encoding is not allowed (strict/canonical mode)')\n }\n\n // Check depth limit before descending\n const maxDepth = options?.limits?.maxDepth ?? DEFAULT_LIMITS.maxDepth\n if (depth >= maxDepth) {\n throw new Error(`Maximum nesting depth ${maxDepth} exceeded`)\n }\n\n // Parse length\n let length: number | null\n let bytesConsumed: number\n\n if (additionalInfo < 24) {\n length = additionalInfo\n bytesConsumed = 0\n } else if (additionalInfo === 24) {\n length = readByte(buffer, offset + 1)\n bytesConsumed = 1\n } else if (additionalInfo === 25) {\n length = readUint(buffer, offset + 1, 2)\n bytesConsumed = 2\n } else if (additionalInfo === 26) {\n length = readUint(buffer, offset + 1, 4)\n bytesConsumed = 4\n } else if (additionalInfo === 27) {\n const lengthBigInt = readBigUint(buffer, offset + 1, 8)\n if (lengthBigInt > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(`Map length ${lengthBigInt} exceeds maximum safe integer`)\n }\n length = Number(lengthBigInt)\n bytesConsumed = 8\n } else if (additionalInfo === 31) {\n length = null // Indefinite\n bytesConsumed = 0\n } else {\n throw new Error(`Invalid additional info for map: ${additionalInfo}`)\n }\n\n // Check map size limit before parsing\n if (length !== null && options?.limits?.maxMapSize && length > options.limits.maxMapSize) {\n throw new Error(`Map size ${length} exceeds limit of ${options.limits.maxMapSize}`)\n }\n\n let currentOffset = offset + 1 + bytesConsumed\n const map: CborMap = new Map()\n\n if (length === null) {\n // Indefinite-length map\n let index = 0\n let foundBreak = false\n while (currentOffset < buffer.length) {\n const nextByte = readByte(buffer, currentOffset)\n if (nextByte === 0xff) {\n currentOffset++\n foundBreak = true\n break\n }\n\n // Check map size limit\n if (options?.limits?.maxMapSize && index >= options.limits.maxMapSize) {\n throw new Error(`Map size exceeds limit of ${options.limits.maxMapSize}`)\n }\n\n const keyResult = parseItem(buffer, currentOffset, options, 0, depth + 1)\n currentOffset += keyResult.bytesRead\n\n const valueResult = parseItem(buffer, currentOffset, options, 0, depth + 1)\n currentOffset += valueResult.bytesRead\n\n // Store with original key type (not string!)\n map.set(keyResult.value, valueResult.value)\n index++\n }\n\n if (!foundBreak) {\n throw new Error('Indefinite-length map missing break code (0xFF)')\n }\n\n // Mark as indefinite-length for round-trip preservation\n ;(map as any)[INDEFINITE_SYMBOL] = true\n } else {\n // Definite-length map\n for (let i = 0; i < length; i++) {\n if (currentOffset >= buffer.length) {\n throw new Error(`Unexpected end of buffer while parsing map entry ${i}/${length}`)\n }\n\n const keyResult = parseItem(buffer, currentOffset, options, 0, depth + 1)\n currentOffset += keyResult.bytesRead\n\n const valueResult = parseItem(buffer, currentOffset, options, 0, depth + 1)\n currentOffset += valueResult.bytesRead\n\n // Store with original key type (not string!)\n map.set(keyResult.value, valueResult.value)\n }\n }\n\n return {\n value: map,\n bytesRead: currentOffset - offset\n }\n }\n\n /**\n * Parses a tag number from the buffer\n *\n * @param buffer - Data buffer\n * @param offset - Current offset (at initial byte)\n * @param ai - Additional info field\n * @returns Tag number and bytes consumed for the tag number\n */\n const parseTagNumber = (\n buffer: Uint8Array,\n offset: number,\n ai: number\n ): { tagNumber: number, bytesConsumed: number } => {\n if (ai < 24) {\n // Direct encoding (tags 0-23)\n return { tagNumber: ai, bytesConsumed: 0 }\n } else if (ai === 24) {\n // 1 byte follows (tags 24-255)\n const tagNumber = readByte(buffer, offset)\n return { tagNumber, bytesConsumed: 1 }\n } else if (ai === 25) {\n // 2 bytes follow (tags 256-65535)\n const tagNumber = readUint(buffer, offset, 2)\n return { tagNumber, bytesConsumed: 2 }\n } else if (ai === 26) {\n // 4 bytes follow (tags 65536-4294967295)\n const tagNumber = readUint(buffer, offset, 4)\n return { tagNumber, bytesConsumed: 4 }\n } else if (ai === 27) {\n // 8 bytes follow (very large tag numbers)\n const tagBigInt = readBigUint(buffer, offset, 8)\n\n // Convert to number if it fits\n if (tagBigInt <= BigInt(Number.MAX_SAFE_INTEGER)) {\n return { tagNumber: Number(tagBigInt), bytesConsumed: 8 }\n } else {\n throw new Error(`Tag number ${tagBigInt} exceeds maximum safe integer`)\n }\n } else if (ai >= 28 && ai <= 30) {\n throw new Error(`Reserved additional info ${ai} for major type 6`)\n } else {\n throw new Error(`Invalid additional info ${ai} for tags`)\n }\n }\n\n /**\n * Validates semantic constraints for specific CBOR tags\n *\n * @param tagNumber - The tag number\n * @param value - The tagged value\n * @param options - Parser options\n * @throws Error if validation fails\n */\n /**\n * Validates RFC 3339 date/time string format\n */\n const isValidRfc3339 = (dateStr: string): boolean => {\n // RFC 3339 format: YYYY-MM-DDTHH:MM:SS[.fraction][Z|+/-HH:MM]\n const rfc3339Regex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?$/i\n return rfc3339Regex.test(dateStr)\n }\n\n /**\n * Validates URI format (basic check for scheme)\n */\n const isValidUri = (uri: string): boolean => {\n // Basic URI validation: must have scheme followed by colon\n // RFC 3986: scheme = ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\n const uriRegex = /^[a-zA-Z][a-zA-Z0-9+.-]*:/\n return uriRegex.test(uri)\n }\n\n /**\n * Checks if a value is a text string (CborTextString or plain string)\n */\n const isTextString = (value: CborValue): value is string => {\n if (typeof value === 'string') return true\n if (value && typeof value === 'object' && 'type' in value && (value as any).type === 'cbor-text-string') {\n return true\n }\n return false\n }\n\n const isByteString = (value: CborValue): value is Uint8Array | CborByteString => {\n if (value instanceof Uint8Array) return true\n if (value && typeof value === 'object' && 'type' in value && (value as any).type === 'cbor-byte-string') {\n return true\n }\n return false\n }\n\n /**\n * Gets string value from CborTextString or plain string\n */\n const getTextStringValue = (value: CborValue): string => {\n if (typeof value === 'string') return value\n if (value && typeof value === 'object' && 'text' in value) {\n return (value as any).text\n }\n return String(value)\n }\n\n const validateTagSemantics = (tagNumber: number, value: CborValue, options?: ParseOptions): void => {\n // Check different validation types separately\n // Standard tag semantics (Tags 0, 1, 4, 5, 32, 35, 36, 258)\n const shouldValidateStandard = options?.strict || options?.validateTagSemantics\n\n switch (tagNumber) {\n case 0: // Date/Time String (RFC 3339)\n if (!shouldValidateStandard) break\n\n if (!isTextString(value)) {\n throw new Error(`Tag 0 (date/time string) must contain a text string, got ${typeof value}`)\n }\n const dateStr = getTextStringValue(value)\n if (!isValidRfc3339(dateStr)) {\n throw new Error(`Tag 0 (date/time string) contains invalid RFC 3339 date format: \"${dateStr}\"`)\n }\n break\n\n case 1: // Epoch-Based Date/Time\n if (!shouldValidateStandard) break\n\n if (typeof value !== 'number' && typeof value !== 'bigint') {\n throw new Error(`Tag 1 (epoch time) must contain a number (integer or float), got ${typeof value}`)\n }\n break\n\n case 2: // Positive bignum\n case 3: // Negative bignum\n if (!shouldValidateStandard) break\n\n if (!isByteString(value)) {\n throw new Error(`Tag ${tagNumber} (bignum) must contain a byte string, got ${typeof value}`)\n }\n break\n\n case 4: // Decimal Fraction\n if (!shouldValidateStandard) break\n\n if (!Array.isArray(value)) {\n throw new Error(`Tag 4 (decimal fraction) must contain an array, got ${typeof value}`)\n }\n if (value.length !== 2) {\n throw new Error(`Tag 4 (decimal fraction) array must have exactly 2 elements [exponent, mantissa], got ${value.length}`)\n }\n if ((typeof value[0] !== 'number' && typeof value[0] !== 'bigint') ||\n (typeof value[0] === 'number' && !Number.isInteger(value[0]))) {\n throw new Error(`Tag 4 (decimal fraction) exponent must be an integer, got ${value[0]}`)\n }\n if ((typeof value[1] !== 'number' && typeof value[1] !== 'bigint') ||\n (typeof value[1] === 'number' && !Number.isInteger(value[1]))) {\n throw new Error(`Tag 4 (decimal fraction) mantissa must be an integer, got ${value[1]}`)\n }\n break\n\n case 5: // Bigfloat\n if (!shouldValidateStandard) break\n\n if (!Array.isArray(value)) {\n throw new Error(`Tag 5 (bigfloat) must contain an array, got ${typeof value}`)\n }\n if (value.length !== 2) {\n throw new Error(`Tag 5 (bigfloat) array must have exactly 2 elements [exponent, mantissa], got ${value.length}`)\n }\n if ((typeof value[0] !== 'number' && typeof value[0] !== 'bigint') ||\n (typeof value[0] === 'number' && !Number.isInteger(value[0]))) {\n throw new Error(`Tag 5 (bigfloat) exponent must be an integer, got ${value[0]}`)\n }\n if ((typeof value[1] !== 'number' && typeof value[1] !== 'bigint') ||\n (typeof value[1] === 'number' && !Number.isInteger(value[1]))) {\n throw new Error(`Tag 5 (bigfloat) mantissa must be an integer, got ${value[1]}`)\n }\n break\n\n case 32: // URI (RFC 3986)\n if (!shouldValidateStandard) break\n\n if (!isTextString(value)) {\n throw new Error(`Tag 32 (URI) must contain a text string, got ${typeof value}`)\n }\n const uriStr = getTextStringValue(value)\n if (!isValidUri(uriStr)) {\n throw new Error(`Tag 32 (URI) contains invalid URI format (missing scheme): \"${uriStr}\"`)\n }\n break\n\n case 33: // base64url without padding\n case 34: // base64 without padding\n if (!shouldValidateStandard) break\n\n if (!isTextString(value)) {\n throw new Error(`Tag ${tagNumber} (base64${tagNumber === 33 ? 'url' : ''}) must contain a text string, got ${typeof value}`)\n }\n break\n\n case 35: // Regular Expression\n if (!shouldValidateStandard) break\n\n if (!isTextString(value)) {\n throw new Error(`Tag 35 (regexp) must contain a text string, got ${typeof value}`)\n }\n break\n\n case 36: // MIME Message\n if (!shouldValidateStandard) break\n\n if (!isTextString(value)) {\n throw new Error(`Tag 36 (MIME message) must contain a text string, got ${typeof value}`)\n }\n break\n\n case 258: // Mathematical Finite Set\n {\n // Validate set uniqueness if enabled\n const shouldValidateUniqueness = options?.strict || options?.validateSetUniqueness\n\n if (shouldValidateUniqueness) {\n if (!Array.isArray(value)) {\n throw new Error(`Tag 258 (set) must contain an array, got ${typeof value}`)\n }\n\n if (hasDuplicates(value)) {\n throw new Error(\n `Tag 258 (set) contains duplicate items. ` +\n `Sets must contain only unique values (RFC 8949). ` +\n `Use validateSetUniqueness: false to allow duplicates.`\n )\n }\n }\n }\n break\n\n // Plutus Constructor tags\n case 102: // Alternative Plutus Constructor\n validatePlutusAlternativeConstructor(value, options)\n break\n\n // No validation needed for other tags (yet)\n default:\n // Plutus Compact Constructors (121-127)\n if (tagNumber >= 121 && tagNumber <= 127) {\n validatePlutusCompactConstructor(tagNumber, value, options)\n }\n // Plutus Extended Constructors (1280-1400)\n else if (tagNumber >= 1280 && tagNumber <= 1400) {\n validatePlutusExtendedConstructor(tagNumber, value, options)\n }\n break\n }\n }\n\n /**\n * Validates Plutus compact constructor (Tags 121-127)\n *\n * @param tagNumber - Tag number (121-127)\n * @param value - Tagged value (should be array)\n * @param options - Parser options\n */\n const validatePlutusCompactConstructor = (tagNumber: number, value: CborValue, options?: ParseOptions): void => {\n const shouldValidate = options?.strict || options?.validatePlutusSemantics\n\n if (!shouldValidate) {\n return\n }\n\n if (!Array.isArray(value)) {\n throw new Error(\n `Plutus constructor tag ${tagNumber} must contain an array, got ${typeof value}`\n )\n }\n\n // Tags 121-127 encode constructor index 0-6\n // Per Cardano CDDL: constr<tag> = #6.tag([* any])\n // The tag number encodes the constructor index, NOT the arity\n // Any number of fields (0 or more) is valid\n }\n\n /**\n * Validates Plutus alternative constructor (Tag 102)\n *\n * @param value - Tagged value (should be [uint, array])\n * @param options - Parser options\n */\n const validatePlutusAlternativeConstructor = (value: CborValue, options?: ParseOptions): void => {\n const shouldValidate = options?.strict || options?.validatePlutusSemantics\n\n if (!shouldValidate) {\n return\n }\n\n if (!Array.isArray(value)) {\n throw new Error(\n `Plutus alternative constructor (tag 102) must contain an array, got ${typeof value}`\n )\n }\n\n if (value.length !== 2) {\n throw new Error(\n `Plutus alternative constructor (tag 102) must be [constructor_index, fields], got array of length ${value.length}`\n )\n }\n\n const constructorIndex = value[0]\n const fields = value[1]\n\n if (typeof constructorIndex !== 'number' || constructorIndex < 0 || !Number.isInteger(constructorIndex)) {\n throw new Error(\n `Plutus constructor index must be non-negative integer, got ${typeof constructorIndex}`\n )\n }\n\n if (!Array.isArray(fields)) {\n throw new Error(\n `Plutus constructor fields must be an array, got ${typeof fields}`\n )\n }\n }\n\n /**\n * Validates Plutus extended constructor (Tags 1280-1400)\n *\n * @param tagNumber - Tag number (1280-1400)\n * @param value - Tagged value (should be array)\n * @param options - Parser options\n */\n const validatePlutusExtendedConstructor = (tagNumber: number, value: CborValue, options?: ParseOptions): void => {\n const shouldValidate = options?.strict || options?.validatePlutusSemantics\n\n if (!shouldValidate) {\n return\n }\n\n if (!Array.isArray(value)) {\n throw new Error(\n `Plutus constructor tag ${tagNumber} must contain an array, got ${typeof value}`\n )\n }\n\n const constructorIndex = (tagNumber - 1280) + 7\n\n // Extended constructors can have any number of fields (0 to unlimited)\n // Constructor index is 7-127\n if (constructorIndex < 7 || constructorIndex > 127) {\n throw new Error(\n `Plutus extended constructor tag ${tagNumber} produces invalid constructor index ${constructorIndex} ` +\n `(expected 7-127)`\n )\n }\n }\n\n /**\n * Decodes a Plutus constructor from a tag\n *\n * @param tagNumber - CBOR tag number\n * @param value - Tagged value\n * @returns PlutusConstr or null if not a Plutus constructor\n */\n const decodePlutusConstructor = (tagNumber: number, value: CborValue): PlutusConstr | null => {\n // Tag 102: Alternative constructor [index, fields]\n if (tagNumber === 102) {\n if (!Array.isArray(value) || value.length !== 2) {\n return null\n }\n const [constructorIndex, fields] = value\n if (typeof constructorIndex !== 'number' || !Array.isArray(fields)) {\n return null\n }\n return {\n constructor: constructorIndex,\n fields: fields as any[]\n }\n }\n\n // Tags 121-127: Compact constructors\n if (tagNumber >= 121 && tagNumber <= 127) {\n if (!Array.isArray(value)) {\n return null\n }\n const constructorIndex = tagNumber - 121\n return {\n constructor: constructorIndex,\n fields: value as any[]\n }\n }\n\n // Tags 1280-1400: Extended constructors\n if (tagNumber >= 1280 && tagNumber <= 1400) {\n if (!Array.isArray(value)) {\n return null\n }\n const constructorIndex = (tagNumber - 1280) + 7\n return {\n constructor: constructorIndex,\n fields: value as any[]\n }\n }\n\n return null\n }\n\n /**\n * Internal tag parser that works with buffers\n *\n * @param buffer - Data buffer\n * @param offset - Current offset\n * @param options - Parser options\n * @returns Parsed tagged value and bytes read\n */\n const parseTagFromBuffer = (buffer: Uint8Array, offset: number, options?: ParseOptions, tagDepth: number = 0): ParseResult => {\n const initialByte = readByte(buffer, offset)\n const { majorType, additionalInfo } = extractCborHeader(initialByte)\n\n if (majorType !== 6) {\n throw new Error(`Expected major type 6 (tag), got ${majorType}`)\n }\n\n // Check tag nesting depth limit (RUSTSEC-2019-0025 mitigation)\n const maxTagDepth = options?.limits?.maxTagDepth ?? DEFAULT_LIMITS.maxTagDepth\n if (tagDepth >= maxTagDepth) {\n throw new Error(`Tag nesting depth ${tagDepth} exceeds limit of ${maxTagDepth}`)\n }\n\n // Parse the tag number\n const { tagNumber, bytesConsumed } = parseTagNumber(buffer, offset + 1, additionalInfo)\n\n // Enforce canonical (shortest-form) tag number encoding when requested.\n // RFC 8949 §4.2.1 preferred serialization applies to the tag number too.\n if (options?.validateCanonical) {\n validateCanonicalInteger(tagNumber, additionalInfo)\n }\n\n let currentOffset = offset + 1 + bytesConsumed\n\n // Parse the tagged value (recursively)\n if (currentOffset >= buffer.length) {\n throw new Error(`Unexpected end of buffer after tag ${tagNumber}`)\n }\n\n const valueResult = parseItem(buffer, currentOffset, options, tagDepth + 1)\n currentOffset += valueResult.bytesRead\n\n // Validate bignum size limits for tags 2 and 3 (CVE-2020-28491 mitigation)\n if ((tagNumber === 2 || tagNumber === 3) && valueResult.value instanceof Uint8Array) {\n const maxBignumBytes = options?.limits?.maxBignumBytes ?? 1024\n if (valueResult.value.length > maxBignumBytes) {\n throw new Error(\n `Bignum (tag ${tagNumber}) size ${valueResult.value.length} bytes exceeds limit of ${maxBignumBytes} bytes`\n )\n }\n\n // Convert bignum bytes to BigInt, then to decimal string\n // This provides the expected format for test compatibility\n const bytes = valueResult.value\n let bigintValue = 0n\n\n // Convert bytes to BigInt (big-endian)\n for (let i = 0; i < bytes.length; i++) {\n bigintValue = (bigintValue << 8n) | BigInt(bytes[i]!)\n }\n\n // Tag 2: Positive bignum - return as decimal string\n // Tag 3: Negative bignum - apply formula: -1 - n\n if (tagNumber === 2) {\n valueResult.value = bigintValue\n } else if (tagNumber === 3) {\n valueResult.value = -1n - bigintValue\n }\n }\n\n // Validate semantic constraints for specific tags\n validateTagSemantics(tagNumber, valueResult.value, options)\n\n // Decode Plutus constructor if applicable\n const plutusConstr = decodePlutusConstructor(tagNumber, valueResult.value)\n\n const taggedValue: TaggedValue = {\n tag: tagNumber,\n value: valueResult.value,\n ...(plutusConstr && { plutus: plutusConstr })\n }\n\n return {\n value: taggedValue,\n bytesRead: currentOffset - offset\n }\n }\n\n /**\n * Parses CBOR tag (Major Type 6) from hex string\n *\n * @param hexString - CBOR hex string\n * @param options - Parser options (optional)\n * @returns Parsed tagged value and bytes read\n */\n const parseTag = (hexString: string, options?: ParseOptions): ParseResult => {\n // Remove spaces from hex string\n const cleanHex = hexString.replace(/\\s+/g, '')\n const buffer = hexToBytes(cleanHex)\n\n // Set parse start time for timeout enforcement (only if not already set by caller)\n const isTopLevel = parseStartTime === 0\n if (isTopLevel && options?.limits?.maxParseTime) {\n parseStartTime = Date.now()\n }\n try {\n return parseTagFromBuffer(buffer, 0, options)\n } finally {\n if (isTopLevel) {\n parseStartTime = 0\n }\n }\n }\n\n /**\n * Alias for parseTag (for consistency with other composables)\n */\n const parse = parseTag\n\n return {\n parseTag,\n parse,\n parseTagFromBuffer,\n validateTagSemantics,\n decodePlutusConstructor\n }\n}\n","/**\n * Logger utility for CBOR decoder library\n * Provides configurable logging with different levels\n */\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent'\n\ninterface LoggerConfig {\n level: LogLevel\n prefix?: string\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4\n}\n\nlet config: LoggerConfig = {\n level: 'warn',\n prefix: '[CBOR]'\n}\n\n/**\n * Configure the logger\n */\nexport function configureLogger(newConfig: Partial<LoggerConfig>): void {\n config = { ...config, ...newConfig }\n}\n\n/**\n * Get current logger configuration\n */\nexport function getLoggerConfig(): LoggerConfig {\n return { ...config }\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] >= LOG_LEVELS[config.level]\n}\n\nfunction formatMessage(message: string): string {\n return config.prefix ? `${config.prefix} ${message}` : message\n}\n\n/**\n * Log a debug message\n */\nexport function debug(message: string, ...args: unknown[]): void {\n if (shouldLog('debug')) {\n console.debug(formatMessage(message), ...args)\n }\n}\n\n/**\n * Log an info message\n */\nexport function info(message: string, ...args: unknown[]): void {\n if (shouldLog('info')) {\n console.info(formatMessage(message), ...args)\n }\n}\n\n/**\n * Log a warning message\n */\nexport function warn(message: string, ...args: unknown[]): void {\n if (shouldLog('warn')) {\n console.warn(formatMessage(message), ...args)\n }\n}\n\n/**\n * Log an error message\n */\nexport function error(message: string, ...args: unknown[]): void {\n if (shouldLog('error')) {\n console.error(formatMessage(message), ...args)\n }\n}\n\n/**\n * Logger object for convenience\n */\nexport const logger = {\n debug,\n info,\n warn,\n error,\n configure: configureLogger,\n getConfig: getLoggerConfig\n}\n\nexport default logger\n","/**\n * CBOR Collection Parser Composable\n * Handles Major Types 4 (Arrays) and 5 (Maps)\n * Supports definite and indefinite length encoding\n */\n\nimport type { ParseResult, CborValue, CborMap, ParseOptions } from '../types'\nimport { INDEFINITE_SYMBOL, ALL_ENTRIES_SYMBOL } from '../types'\nimport { hexToBytes, readByte, readUint, readBigUint, extractCborHeader, compareMapKeys, serializeValueForComparison } from '../utils'\nimport { useCborInteger } from './useCborInteger'\nimport { useCborString } from './useCborString'\nimport { useCborFloat } from './useCborFloat'\nimport { useCborTag } from './useCborTag'\nimport { logger } from '../../utils/logger'\n\n/**\n * Composable for parsing CBOR collections (Major Types 4 and 5)\n *\n * @returns Object with parseArray and parseMap functions\n *\n * @example\n * ```ts\n * const { parseArray } = useCborCollection()\n * const result = parseArray('83010203') // [1, 2, 3]\n * ```\n */\nexport function useCborCollection() {\n const { parseIntegerFromBuffer } = useCborInteger()\n const { parseByteString, parseTextString } = useCborString()\n const { parseFromBuffer: parseFloatOrSimpleFromBuffer } = useCborFloat()\n const { parseTagFromBuffer } = useCborTag()\n\n /** Tracks when parsing started for timeout enforcement */\n let parseStartTime = 0\n\n /**\n * Internal parser dispatcher for CBOR items\n * Handles recursive parsing of nested structures\n *\n * @param buffer - Data buffer\n * @param offset - Current offset\n * @param options - Parser options\n * @param depth - Current nesting depth\n * @returns Parsed value and bytes consumed\n */\n const parseItem = (buffer: Uint8Array, offset: number, options?: ParseOptions, depth: number = 0): ParseResult => {\n // Check timeout on every recursive call\n if (parseStartTime > 0 && options?.limits?.maxParseTime) {\n const elapsed = Date.now() - parseStartTime\n if (elapsed > options.limits.maxParseTime) {\n throw new Error(`Parse timeout: exceeded ${options.limits.maxParseTime}ms limit`)\n }\n }\n\n if (offset >= buffer.length) {\n throw new Error(`Unexpected end of buffer at offset ${offset}`)\n }\n\n const initialByte = readByte(buffer, offset)\n const { majorType } = extractCborHeader(initialByte)\n\n switch (majorType) {\n case 0: // Unsigned integer\n case 1: // Negative integer\n return parseIntegerFromBuffer(buffer, offset, options)\n\n case 2: // Byte string\n return parseByteString(buffer, offset, options)\n\n case 3: // Text string\n return parseTextString(buffer, offset, options)\n\n case 4: // Array\n return parseArrayFromBuffer(buffer, offset, options, depth)\n\n case 5: // Map\n return parseMapFromBuffer(buffer, offset, options, depth)\n\n case 6: // Tag\n return parseTagFromBuffer(buffer, offset, options)\n\n case 7: // Simple/Float\n return parseFloatOrSimpleFromBuffer(buffer, offset, options)\n\n default:\n throw new Error(`Unknown major type: ${majorType}`)\n }\n }\n\n /**\n * Parses the length from CBOR additional info field\n *\n * @param buffer - Data buffer\n * @param offset - Current offset (after initial byte)\n * @param ai - Additional info field (0-31)\n * @returns Object with length and bytes consumed, or null for indefinite\n */\n const parseLength = (\n buffer: Uint8Array,\n offset: number,\n ai: number,\n options?: ParseOptions\n ): { length: number | null; bytesConsumed: number } => {\n if (ai < 24) {\n // Direct encoding (0-23)\n return { length: ai, bytesConsumed: 0 }\n } else if (ai === 24) {\n // 1 byte follows\n const length = readByte(buffer, offset)\n\n // RFC 8949 Section 4.2.1: Canonical encoding requires shortest form\n if (options?.validateCanonical && length < 24) {\n throw new Error(`Non-canonical length encoding: ${length} should use direct encoding (AI < 24), not AI=24`)\n }\n\n return { length, bytesConsumed: 1 }\n } else if (ai === 25) {\n // 2 bytes follow\n const length = readUint(buffer, offset, 2)\n\n // RFC 8949 Section 4.2.1: Value must be >= 256 to justify 2-byte encoding\n if (options?.validateCanonical && length < 256) {\n throw new Error(`Non-canonical length encoding: ${length} should use ${length < 24 ? 'direct encoding' : '1-byte encoding (AI=24)'}, not AI=25`)\n }\n\n return { length, bytesConsumed: 2 }\n } else if (ai === 26) {\n // 4 bytes follow\n const length = readUint(buffer, offset, 4)\n\n // RFC 8949 Section 4.2.1: Value must be >= 65536 to justify 4-byte encoding\n if (options?.validateCanonical && length < 65536) {\n throw new Error(`Non-canonical length encoding: ${length} should use shorter encoding, not AI=26`)\n }\n\n return { length, bytesConsumed: 4 }\n } else if (ai === 27) {\n // 8 bytes follow\n const lengthBigInt = readBigUint(buffer, offset, 8)\n\n // Check if value fits in safe integer range\n if (lengthBigInt > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(`Collection length ${lengthBigInt} exceeds maximum safe integer`)\n }\n const length = Number(lengthBigInt)\n\n // RFC 8949 Section 4.2.1: Value must be >= 2^32 to justify 8-byte encoding\n if (options?.validateCanonical && length < 4294967296) {\n throw new Error(`Non-canonical length encoding: ${length} should use shorter encoding, not AI=27`)\n }\n\n return { length, bytesConsumed: 8 }\n } else if (ai === 31) {\n // Indefinite length (break-terminated)\n return { length: null, bytesConsumed: 0 }\n } else {\n throw new Error(`Invalid additional info: ${ai}`)\n }\n }\n\n /**\n * Internal array parser that works with buffers\n *\n * @param buffer - Data buffer\n * @param offset - Current offset\n * @param options - Parser options\n * @param depth - Current nesting depth\n * @returns Parsed array and bytes read\n */\n const parseArrayFromBuffer = (buffer: Uint8Array, offset: number, options?: ParseOptions, depth: number = 0): ParseResult => {\n const initialByte = readByte(buffer, offset)\n const { majorType, additionalInfo } = extractCborHeader(initialByte)\n\n if (majorType !== 4) {\n throw new Error(`Expected major type 4 (array), got ${majorType}`)\n }\n\n // Check if indefinite length is allowed\n // RFC 8949: Deterministic encoding MUST NOT use indefinite-length\n const isIndefiniteAllowed = options?.allowIndefinite ?? !(options?.validateCanonical || options?.strict)\n if (additionalInfo === 31 && !isIndefiniteAllowed) {\n throw new Error('Indefinite-length encoding is not allowed (strict/canonical mode)')\n }\n\n // Check depth limit before descending\n if (options?.limits?.maxDepth && depth >= options.limits.maxDepth) {\n throw new Error(`Maximum nesting depth ${options.limits.maxDepth} exceeded`)\n }\n\n const { length, bytesConsumed } = parseLength(buffer, offset + 1, additionalInfo, options)\n let currentOffset = offset + 1 + bytesConsumed\n const items: CborValue[] = []\n\n if (length === null) {\n // Indefinite-length array - read until break (0xff)\n let index = 0\n let foundBreak = false\n\n while (currentOffset < buffer.length) {\n const nextByte = readByte(buffer, currentOffset)\n\n // Check for break marker (0xff)\n if (nextByte === 0xff) {\n currentOffset++ // Consume the break byte\n foundBreak = true\n break\n }\n\n // Check array length limit\n if (options?.limits?.maxArrayLength && index >= options.limits.maxArrayLength) {\n throw new Error(`Array length exceeds limit of ${options.limits.maxArrayLength}`)\n }\n\n const itemResult = parseItem(buffer, currentOffset, options, depth + 1)\n items.push(itemResult.value)\n currentOffset += itemResult.bytesRead\n index++\n }\n\n // Ensure we found a break code\n if (!foundBreak) {\n throw new Error('Indefinite-length array missing break code (0xFF)')\n }\n\n // Mark as indefinite-length for round-trip preservation\n ;(items as any)[INDEFINITE_SYMBOL] = true\n } else {\n // Definite-length array\n // Check array length limit before parsing\n if (options?.limits?.maxArrayLength && length > options.limits.maxArrayLength) {\n throw new Error(`Array length ${length} exceeds limit of ${options.limits.maxArrayLength}`)\n }\n\n for (let i = 0; i < length; i++) {\n if (currentOffset >= buffer.length) {\n throw new Error(`Unexpected end of buffer while parsing array element ${i}/${length}`)\n }\n\n const itemResult = parseItem(buffer, currentOffset, options, depth + 1)\n items.push(itemResult.value)\n currentOffset += itemResult.bytesRead\n }\n }\n\n return {\n value: items,\n bytesRead: currentOffset - offset\n }\n }\n\n /**\n * Converts a CBOR value to its canonical byte representation for comparison\n * Note: Currently unused but kept for future canonical encoding validation\n */\n // const valueToBytes = (value: CborValue, buffer: Uint8Array, start: number, end: number): Uint8Array => {\n // // For canonical comparison, we use the raw bytes from the buffer\n // return buffer.slice(start, end)\n // }\n\n /**\n * Internal map parser that works with buffers\n *\n * @param buffer - Data buffer\n * @param offset - Current offset\n * @param options - Parser options\n * @param depth - Current nesting depth\n * @returns Parsed map and bytes read\n */\n const parseMapFromBuffer = (buffer: Uint8Array, offset: number, options?: ParseOptions, depth: number = 0): ParseResult => {\n const initialByte = readByte(buffer, offset)\n const { majorType, additionalInfo } = extractCborHeader(initialByte)\n\n if (majorType !== 5) {\n throw new Error(`Expected major type 5 (map), got ${majorType}`)\n }\n\n // Check if indefinite length is allowed\n // RFC 8949: Deterministic encoding MUST NOT use indefinite-length\n const isIndefiniteAllowed = options?.allowIndefinite ?? !(options?.validateCanonical || options?.strict)\n if (additionalInfo === 31 && !isIndefiniteAllowed) {\n throw new Error('Indefinite-length encoding is not allowed (strict/canonical mode)')\n }\n\n // Check depth limit before descending\n if (options?.limits?.maxDepth && depth >= options.limits.maxDepth) {\n throw new Error(`Maximum nesting depth ${options.limits.maxDepth} exceeded`)\n }\n\n const { length, bytesConsumed } = parseLength(buffer, offset + 1, additionalInfo, options)\n let currentOffset = offset + 1 + bytesConsumed\n const map: CborMap = new Map()\n\n // For duplicate key detection - store serialized keys\n const seenKeys = new Set<string>()\n\n // For canonical ordering validation\n const keyBytes: Uint8Array[] = []\n\n // Store ALL entries including duplicates for byte-perfect round-trips\n const allEntries: Array<[CborValue, CborValue]> = []\n\n if (length === null) {\n // Indefinite-length map - read until break (0xff)\n let index = 0\n let foundBreak = false\n\n while (currentOffset < buffer.length) {\n const nextByte = readByte(buffer, currentOffset)\n\n // Check for break marker (0xff)\n if (nextByte === 0xff) {\n currentOffset++ // Consume the break byte\n foundBreak = true\n break\n }\n\n // Check map size limit\n if (options?.limits?.maxMapSize && index >= options.limits.maxMapSize) {\n throw new Error(`Map size exceeds limit of ${options.limits.maxMapSize}`)\n }\n\n // Parse key\n const keyStart = currentOffset\n const keyResult = parseItem(buffer, currentOffset, options, depth + 1)\n const keyEnd = currentOffset + keyResult.bytesRead\n currentOffset += keyResult.bytesRead\n\n // Store key bytes for canonical validation\n if (options?.validateCanonical) {\n keyBytes.push(buffer.slice(keyStart, keyEnd))\n }\n\n // Parse value\n if (currentOffset >= buffer.length) {\n throw new Error('Unexpected end of buffer while parsing map value')\n }\n const valueResult = parseItem(buffer, currentOffset, options, depth + 1)\n currentOffset += valueResult.bytesRead\n\n // For duplicate key detection, serialize the parsed value semantically\n // RFC 8949 Section 5.6: comparison must be on semantic values, not raw bytes\n // (raw bytes differ when same value uses different byte widths)\n const keyString = serializeValueForComparison(keyResult.value)\n\n // Check for duplicate keys based on dupMapKeyMode\n // RFC 8949: Deterministic encoding SHOULD reject duplicate keys\n // Auto-enable rejection in canonical or strict mode (handled in mergeOptions)\n if (seenKeys.has(keyString)) {\n const mode: 'allow' | 'warn' | 'reject' = options?.dupMapKeyMode || 'allow'\n\n if (mode === 'reject') {\n throw new Error(`Duplicate map key detected: ${keyString} at offset ${keyStart}`)\n } else if (mode === 'warn') {\n logger.warn(`Duplicate map key detected: ${keyString} at offset ${keyStart}`)\n }\n // 'allow' mode: silently continue\n }\n seenKeys.add(keyString)\n\n // Store in Map with original key type (not string!)\n map.set(keyResult.value, valueResult.value)\n\n // Also store in allEntries to preserve order and duplicates\n allEntries.push([keyResult.value, valueResult.value])\n\n index++\n }\n\n // Ensure we found a break code\n if (!foundBreak) {\n throw new Error('Indefinite-length map missing break code (0xFF)')\n }\n\n // Mark as indefinite-length for round-trip preservation\n ;(map as any)[INDEFINITE_SYMBOL] = true\n } else {\n // Definite-length map\n // Check map size limit before parsing\n if (options?.limits?.maxMapSize && length > options.limits.maxMapSize) {\n throw new Error(`Map size ${length} exceeds limit of ${options.limits.maxMapSize}`)\n }\n\n for (let i = 0; i < length; i++) {\n if (currentOffset >= buffer.length) {\n throw new Error(`Unexpected end of buffer while parsing map entry ${i}/${length}`)\n }\n\n // Parse key\n const keyStart = currentOffset\n const keyResult = parseItem(buffer, currentOffset, options, depth + 1)\n const keyEnd = currentOffset + keyResult.bytesRead\n currentOffset += keyResult.bytesRead\n\n // Store key bytes for canonical validation\n if (options?.validateCanonical) {\n keyBytes.push(buffer.slice(keyStart, keyEnd))\n }\n\n // Parse value\n if (currentOffset >= buffer.length) {\n throw new Error(`Unexpected end of buffer while parsing map value for entry ${i}/${length}`)\n }\n const valueResult = parseItem(buffer, currentOffset, options, depth + 1)\n currentOffset += valueResult.bytesRead\n\n // For duplicate key detection, serialize the parsed value semantically\n // RFC 8949 Section 5.6: comparison must be on semantic values, not raw bytes\n // (raw bytes differ when same value uses different byte widths)\n const keyString = serializeValueForComparison(keyResult.value)\n\n // Check for duplicate keys based on dupMapKeyMode\n // RFC 8949: Deterministic encoding SHOULD reject duplicate keys\n // Auto-enable rejection in canonical or strict mode (handled in mergeOptions)\n if (seenKeys.has(keyString)) {\n const mode: 'allow' | 'warn' | 'reject' = options?.dupMapKeyMode || 'allow'\n\n if (mode === 'reject') {\n throw new Error(`Duplicate map key detected: ${keyString} at offset ${keyStart}`)\n } else if (mode === 'warn') {\n logger.warn(`Duplicate map key detected: ${keyString} at offset ${keyStart}`)\n }\n // 'allow' mode: silently continue\n }\n seenKeys.add(keyString)\n\n // Store in Map with original key type (not string!)\n map.set(keyResult.value, valueResult.value)\n\n // Also store in allEntries to preserve order and duplicates\n allEntries.push([keyResult.value, valueResult.value])\n }\n }\n\n // Attach allEntries to map for byte-perfect round-trips with duplicates\n ;(map as any)[ALL_ENTRIES_SYMBOL] = allEntries\n\n // Validate canonical key ordering (keys must be sorted by byte representation).\n // Ordering follows options.mapKeyOrder: 'length-first' (CIP-21 / RFC 7049 §3.9,\n // default) or 'bytewise' (RFC 8949 §4.2.1 core deterministic).\n if (options?.validateCanonical && keyBytes.length > 1) {\n const keyOrder = options?.mapKeyOrder ?? 'length-first'\n for (let i = 1; i < keyBytes.length; i++) {\n const prevKey = keyBytes[i - 1]\n const currKey = keyBytes[i]\n if (prevKey && currKey) {\n const cmp = compareMapKeys(prevKey, currKey, keyOrder)\n if (cmp > 0) {\n throw new Error(\n `Map keys are not in canonical order (${keyOrder}): key at index ${i} should come before key at index ${i - 1}`\n )\n }\n if (cmp === 0) {\n throw new Error(`Duplicate map keys detected in canonical validation`)\n }\n }\n }\n }\n\n return {\n value: map,\n bytesRead: currentOffset - offset\n }\n }\n\n /**\n * Parses CBOR array (Major Type 4) from hex string\n *\n * @param hexString - CBOR hex string\n * @param options - Parser options (optional)\n * @returns Parsed array and bytes read\n */\n const parseArray = (hexString: string, options?: ParseOptions): ParseResult => {\n // Remove spaces from hex string\n const cleanHex = hexString.replace(/\\s+/g, '')\n const buffer = hexToBytes(cleanHex)\n\n // Set parse start time for timeout enforcement\n if (options?.limits?.maxParseTime) {\n parseStartTime = Date.now()\n }\n try {\n return parseArrayFromBuffer(buffer, 0, options, 0)\n } finally {\n parseStartTime = 0\n }\n }\n\n /**\n * Parses CBOR map (Major Type 5) from hex string\n *\n * @param hexString - CBOR hex string\n * @param options - Parser options (optional)\n * @returns Parsed map and bytes read\n */\n const parseMap = (hexString: string, options?: ParseOptions): ParseResult => {\n // Remove spaces from hex string\n const cleanHex = hexString.replace(/\\s+/g, '')\n const buffer = hexToBytes(cleanHex)\n\n // Set parse start time for timeout enforcement\n if (options?.limits?.maxParseTime) {\n parseStartTime = Date.now()\n }\n try {\n return parseMapFromBuffer(buffer, 0, options, 0)\n } finally {\n parseStartTime = 0\n }\n }\n\n return {\n parseArray,\n parseMap\n }\n}\n","/**\n * CBOR Main Parser Composable\n * Orchestrates all CBOR parsers and provides a unified parse interface\n * Auto-detects major type and dispatches to appropriate parser\n */\n\nimport type { ParseResult, ParseResultWithMap, SourceMapEntry, ParseOptions, CborContext, CborValue, TaggedValue } from '../types'\nimport { DEFAULT_OPTIONS, DEFAULT_LIMITS } from '../types'\nimport { hexToBytes, readByte, readUint, readBigUint, extractCborHeader, serializeValueForComparison, validateCanonicalInteger } from '../utils'\nimport { useCborInteger } from './useCborInteger'\nimport { useCborString } from './useCborString'\nimport { useCborCollection } from './useCborCollection'\nimport { useCborTag } from './useCborTag'\nimport { useCborFloat } from './useCborFloat'\nimport { logger } from '../../utils/logger'\n\n/**\n * Main CBOR parser composable\n * Provides a unified interface for parsing any CBOR data\n *\n * @returns Object with parse function\n *\n * @example\n * ```ts\n * const { parse } = useCborParser()\n * const result = parse('1864') // { value: 100, bytesRead: 2 }\n * ```\n */\nexport function useCborParser() {\n /**\n * Merges user options with defaults\n */\n const mergeOptions = (options?: ParseOptions): Required<ParseOptions> => {\n if (!options) return DEFAULT_OPTIONS\n\n // Determine if canonical validation is enabled\n const isCanonical = options.validateCanonical ?? (options.strict ? true : false)\n\n return {\n strict: options.strict ?? DEFAULT_OPTIONS.strict,\n validateCanonical: isCanonical,\n // RFC 8949 Section 4.2: Deterministic encoding MUST NOT use indefinite-length\n allowIndefinite: options.allowIndefinite ?? (isCanonical || options.strict ? false : DEFAULT_OPTIONS.allowIndefinite),\n // Auto-enable duplicate key rejection for canonical or strict mode\n dupMapKeyMode: options.dupMapKeyMode ?? (isCanonical || options.strict ? 'reject' : DEFAULT_OPTIONS.dupMapKeyMode),\n validateUtf8Strict: options.validateUtf8Strict ?? (options.strict ? true : DEFAULT_OPTIONS.validateUtf8Strict),\n validateSetUniqueness: options.validateSetUniqueness ?? (options.strict ? true : DEFAULT_OPTIONS.validateSetUniqueness),\n validateTagSemantics: options.validateTagSemantics ?? (options.strict ? true : DEFAULT_OPTIONS.validateTagSemantics),\n validatePlutusSemantics: options.validatePlutusSemantics ?? (options.strict ? true : DEFAULT_OPTIONS.validatePlutusSemantics),\n mapKeyOrder: options.mapKeyOrder ?? DEFAULT_OPTIONS.mapKeyOrder,\n // Strict mode rejects trailing data after the top-level item (well-formedness).\n allowTrailingData: options.allowTrailingData ?? (options.strict ? false : DEFAULT_OPTIONS.allowTrailingData),\n limits: {\n maxInputSize: options.limits?.maxInputSize ?? DEFAULT_LIMITS.maxInputSize,\n maxOutputSize: options.limits?.maxOutputSize ?? DEFAULT_LIMITS.maxOutputSize,\n maxStringLength: options.limits?.maxStringLength ?? DEFAULT_LIMITS.maxStringLength,\n maxArrayLength: options.limits?.maxArrayLength ?? DEFAULT_LIMITS.maxArrayLength,\n maxMapSize: options.limits?.maxMapSize ?? DEFAULT_LIMITS.maxMapSize,\n maxDepth: options.limits?.maxDepth ?? DEFAULT_LIMITS.maxDepth,\n maxTagDepth: options.limits?.maxTagDepth ?? DEFAULT_LIMITS.maxTagDepth,\n maxBignumBytes: options.limits?.maxBignumBytes ?? DEFAULT_LIMITS.maxBignumBytes,\n maxParseTime: options.limits?.maxParseTime ?? DEFAULT_LIMITS.maxParseTime\n }\n }\n }\n\n /**\n * Checks if max parse time has been exceeded\n */\n const checkTimeout = (ctx: CborContext): void => {\n if (!ctx.startTime || !ctx.options?.limits?.maxParseTime) return\n\n const elapsed = Date.now() - ctx.startTime\n if (elapsed > ctx.options.limits.maxParseTime) {\n throw new Error(`Parse timeout: exceeded ${ctx.options.limits.maxParseTime}ms limit (elapsed: ${elapsed}ms)`)\n }\n }\n\n const { parseInteger, parseIntegerFromBuffer: integerFromBuffer } = useCborInteger()\n const { parseString, parseByteString: byteStringFromBuffer, parseTextString: textStringFromBuffer } = useCborString()\n const { parseArray, parseMap } = useCborCollection()\n const { parseTag, validateTagSemantics, decodePlutusConstructor } = useCborTag()\n const { parse: parseFloatOrSimple, parseFromBuffer: floatOrSimpleFromBuffer } = useCborFloat()\n\n /**\n * Parses a CBOR hex string, auto-detecting the type\n *\n * @param hexString - CBOR data as hex string\n * @param options - Parser options (optional)\n * @returns Parsed value and bytes read\n *\n * @example\n * ```ts\n * parse('00') // 0\n * parse('6449455446') // \"IETF\"\n * parse('83010203') // [1, 2, 3]\n * parse('a16161 01') // { a: 1 }\n * parse('c11a514b67b0') // { tag: 1, value: 1363896240 }\n * parse('f5') // true\n *\n * // With options\n * parse('1864', { validateCanonical: true })\n * parse('6449455446', { strict: true })\n * ```\n */\n const parse = (input: string | Uint8Array, options?: ParseOptions): ParseResult => {\n // Merge options with defaults\n const mergedOptions = mergeOptions(options)\n\n // Uint8Array fast path: skip hex conversion entirely\n if (input instanceof Uint8Array) {\n if (input.length === 0) {\n throw new Error('Empty input')\n }\n\n // Check input size limit\n if (mergedOptions.limits?.maxInputSize && input.length > mergedOptions.limits.maxInputSize) {\n throw new Error(`Input size ${input.length} bytes exceeds limit of ${mergedOptions.limits.maxInputSize} bytes`)\n }\n\n const bufResult = dispatchFromBuffer(input, 0, mergedOptions)\n checkTrailingData(bufResult.bytesRead, input.length, mergedOptions)\n return bufResult\n }\n\n // Hex string path\n const cleanHex = input.replace(/\\s+/g, '')\n\n // Validate hex string\n if (!cleanHex || cleanHex.length === 0) {\n throw new Error('Empty hex string')\n }\n\n if (cleanHex.length % 2 !== 0) {\n throw new Error('Hex string must have even length')\n }\n\n if (!/^[0-9a-fA-F]+$/.test(cleanHex)) {\n throw new Error(`Invalid hex character in: ${cleanHex}`)\n }\n\n // Check input size limit\n const inputSize = cleanHex.length / 2 // Convert hex chars to bytes\n if (mergedOptions.limits?.maxInputSize && inputSize > mergedOptions.limits.maxInputSize) {\n throw new Error(`Input size ${inputSize} bytes exceeds limit of ${mergedOptions.limits.maxInputSize} bytes`)\n }\n\n // Convert to buffer and extract major type\n const buffer = hexToBytes(cleanHex)\n const initialByte = readByte(buffer, 0)\n const { majorType } = extractCborHeader(initialByte)\n\n // Dispatch to appropriate parser based on major type\n let result: ParseResult\n switch (majorType) {\n case 0: // Unsigned integer\n case 1: // Negative integer\n result = parseInteger(cleanHex, mergedOptions)\n break\n\n case 2: // Byte string\n case 3: // Text string\n result = parseString(cleanHex, mergedOptions)\n break\n\n case 4: // Array\n result = parseArray(cleanHex, mergedOptions)\n break\n\n case 5: // Map\n result = parseMap(cleanHex, mergedOptions)\n break\n\n case 6: // Tagged value\n result = parseTag(cleanHex, mergedOptions)\n break\n\n case 7: // Floating-point or simple value\n result = parseFloatOrSimple(cleanHex, mergedOptions)\n break\n\n default:\n throw new Error(`Unknown major type: ${majorType}`)\n }\n\n checkTrailingData(result.bytesRead, buffer.length, mergedOptions)\n return result\n }\n\n /**\n * Rejects trailing bytes after the top-level data item when\n * allowTrailingData is false (RFC 8949 well-formedness for a single item).\n */\n const checkTrailingData = (\n bytesRead: number,\n totalLength: number,\n opts: Required<ParseOptions>\n ): void => {\n if (!opts.allowTrailingData && bytesRead < totalLength) {\n throw new Error(\n `Trailing data: ${totalLength - bytesRead} byte(s) remain after the top-level CBOR item ` +\n `(bytesRead=${bytesRead}, length=${totalLength}). Use parseSequence to decode multiple items.`\n )\n }\n }\n\n /**\n * Parses CBOR with source map generation for visualization\n *\n * @param hexString - CBOR data as hex string\n * @param options - Parser options (optional)\n * @returns Parsed value, bytes read, and source map\n */\n const parseWithSourceMap = (input: string | Uint8Array, options?: ParseOptions): ParseResultWithMap => {\n // Merge options with defaults\n const mergedOptions = mergeOptions(options)\n\n let buffer: Uint8Array\n\n if (input instanceof Uint8Array) {\n if (input.length === 0) {\n throw new Error('Empty input')\n }\n\n // Check input size limit\n if (mergedOptions.limits?.maxInputSize && input.length > mergedOptions.limits.maxInputSize) {\n throw new Error(`Input size ${input.length} bytes exceeds limit of ${mergedOptions.limits.maxInputSize} bytes`)\n }\n\n buffer = input\n } else {\n const cleanHex = input.replace(/\\s+/g, '')\n\n // Validate hex string\n if (!cleanHex || cleanHex.length === 0) {\n throw new Error('Empty hex string')\n }\n if (cleanHex.length % 2 !== 0) {\n throw new Error('Hex string must have even length')\n }\n if (!/^[0-9a-fA-F]+$/.test(cleanHex)) {\n throw new Error(`Invalid hex character in: ${cleanHex}`)\n }\n\n // Check input size limit\n const inputSize = cleanHex.length / 2\n if (mergedOptions.limits?.maxInputSize && inputSize > mergedOptions.limits.maxInputSize) {\n throw new Error(`Input size ${inputSize} bytes exceeds limit of ${mergedOptions.limits.maxInputSize} bytes`)\n }\n\n buffer = hexToBytes(cleanHex)\n }\n\n const sourceMap: SourceMapEntry[] = []\n\n // Create context with tracking\n const ctx: CborContext = {\n buffer,\n offset: 0,\n sourceMap,\n currentDepth: 0,\n startTime: Date.now(),\n bytesAllocated: 0,\n options: mergedOptions\n }\n\n // Parse with source map tracking\n const result = parseValueWithMap(ctx, 0, '', sourceMap)\n\n return {\n value: result.value,\n bytesRead: result.bytesRead,\n sourceMap\n }\n }\n\n /**\n * Internal recursive parser that builds source map\n */\n const parseValueWithMap = (\n ctx: CborContext,\n offset: number,\n path: string,\n sourceMap: SourceMapEntry[]\n ): ParseResult => {\n // Check timeout periodically\n checkTimeout(ctx)\n\n const initialByte = readByte(ctx.buffer, offset)\n const { majorType, additionalInfo } = extractCborHeader(initialByte)\n const startOffset = offset\n\n let result: ParseResult\n let typeDescription: string\n\n switch (majorType) {\n case 0: // Unsigned integer\n typeDescription = 'Unsigned Integer'\n result = parseIntegerFromBuffer(ctx.buffer, offset, ctx.options)\n // Add entry for simple values\n sourceMap.push({\n path,\n start: startOffset,\n end: startOffset + result.bytesRead,\n majorType,\n type: typeDescription\n })\n break\n\n case 1: // Negative integer\n typeDescription = 'Negative Integer'\n result = parseIntegerFromBuffer(ctx.buffer, offset, ctx.options)\n sourceMap.push({\n path,\n start: startOffset,\n end: startOffset + result.bytesRead,\n majorType,\n type: typeDescription\n })\n break\n\n case 2: // Byte string\n {\n result = parseStringFromBuffer(ctx.buffer, offset, ctx.options)\n // Track bytes allocated\n if (ctx.bytesAllocated !== undefined && result.value instanceof Uint8Array) {\n ctx.bytesAllocated += result.value.length\n if (ctx.options?.limits?.maxOutputSize && ctx.bytesAllocated > ctx.options.limits.maxOutputSize) {\n throw new Error(`Output size ${ctx.bytesAllocated} bytes exceeds limit of ${ctx.options.limits.maxOutputSize} bytes`)\n }\n }\n\n // Calculate header length (type byte + length encoding)\n const headerBytes = additionalInfo < 24 ? 1 :\n additionalInfo === 24 ? 2 :\n additionalInfo === 25 ? 3 :\n additionalInfo === 26 ? 5 :\n additionalInfo === 27 ? 9 : 1\n const headerEnd = startOffset + headerBytes\n const contentLength = result.value instanceof Uint8Array ? result.value.length : 0\n\n // Add header entry\n typeDescription = `bytes(${contentLength})`\n sourceMap.push({\n path,\n start: startOffset,\n end: headerEnd,\n majorType,\n type: typeDescription,\n isHeader: true,\n headerEnd,\n contentPath: contentLength > 0 ? `${path}#content` : undefined,\n children: contentLength > 0 ? [`${path}#content`] : []\n })\n\n // Add content entry (if non-empty)\n if (contentLength > 0) {\n sourceMap.push({\n path: `${path}#content`,\n start: headerEnd,\n end: startOffset + result.bytesRead,\n majorType: 2,\n type: `→ ${contentLength} bytes`,\n isContent: true,\n parent: path\n })\n }\n }\n break\n\n case 3: // Text string\n {\n result = parseStringFromBuffer(ctx.buffer, offset, ctx.options)\n // Track bytes allocated\n if (ctx.bytesAllocated !== undefined && typeof result.value === 'string') {\n ctx.bytesAllocated += result.value.length\n if (ctx.options?.limits?.maxOutputSize && ctx.bytesAllocated > ctx.options.limits.maxOutputSize) {\n throw new Error(`Output size ${ctx.bytesAllocated} bytes exceeds limit of ${ctx.options.limits.maxOutputSize} bytes`)\n }\n }\n\n // Calculate header length (type byte + length encoding)\n const headerBytes = additionalInfo < 24 ? 1 :\n additionalInfo === 24 ? 2 :\n additionalInfo === 25 ? 3 :\n additionalInfo === 26 ? 5 :\n additionalInfo === 27 ? 9 : 1\n const headerEnd = startOffset + headerBytes\n const contentLength = typeof result.value === 'string' ? result.value.length : 0\n\n // Add header entry\n typeDescription = `text(${contentLength})`\n sourceMap.push({\n path,\n start: startOffset,\n end: headerEnd,\n majorType,\n type: typeDescription,\n isHeader: true,\n headerEnd,\n contentPath: contentLength > 0 ? `${path}#content` : undefined,\n children: contentLength > 0 ? [`${path}#content`] : []\n })\n\n // Add content entry (if non-empty)\n if (contentLength > 0) {\n sourceMap.push({\n path: `${path}#content`,\n start: headerEnd,\n end: startOffset + result.bytesRead,\n majorType: 3,\n type: `→ \"${result.value}\"`,\n isContent: true,\n parent: path\n })\n }\n }\n break\n\n case 4: // Array\n typeDescription = 'Array'\n // For arrays and maps, the recursive function handles source map entries\n result = parseArrayWithMap(ctx, offset, path, sourceMap)\n break\n\n case 5: // Map\n typeDescription = 'Map'\n result = parseMapWithMap(ctx, offset, path, sourceMap)\n break\n\n case 6: // Tag\n // parseTagWithMap handles source map creation internally (with parent/child relationships)\n result = parseTagWithMap(ctx, offset, path, sourceMap)\n break\n\n case 7: // Float/Simple\n typeDescription = getSimpleTypeDescription(additionalInfo)\n result = parseFloatFromBuffer(ctx.buffer, offset, ctx.options)\n sourceMap.push({\n path,\n start: startOffset,\n end: startOffset + result.bytesRead,\n majorType,\n type: typeDescription\n })\n break\n\n default:\n throw new Error(`Unknown major type: ${majorType}`)\n }\n\n return result\n }\n\n /**\n * Dispatches CBOR parsing from buffer by major type\n * Used by parseSequence and parseValueWithMap helpers\n *\n * @param buffer - Data buffer\n * @param offset - Current offset\n * @param options - Parser options\n * @returns Parsed value and bytes read\n */\n const dispatchFromBuffer = (buffer: Uint8Array, offset: number, options?: ParseOptions): ParseResult => {\n const initialByte = readByte(buffer, offset)\n const { majorType } = extractCborHeader(initialByte)\n\n switch (majorType) {\n case 0: // Unsigned integer\n case 1: // Negative integer\n return integerFromBuffer(buffer, offset, options)\n\n case 2: // Byte string\n return byteStringFromBuffer(buffer, offset, options)\n\n case 3: // Text string\n return textStringFromBuffer(buffer, offset, options)\n\n case 4: // Array\n {\n // Use parseArray via hex for now - arrays/maps already use buffer internally\n const hexString = Array.from(buffer.slice(offset))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n return parseArray(hexString, options)\n }\n\n case 5: // Map\n {\n const hexString = Array.from(buffer.slice(offset))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n return parseMap(hexString, options)\n }\n\n case 6: // Tag\n {\n const hexString = Array.from(buffer.slice(offset))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n return parseTag(hexString, options)\n }\n\n case 7: // Float/Simple\n return floatOrSimpleFromBuffer(buffer, offset, options)\n\n default:\n throw new Error(`Unknown major type: ${majorType}`)\n }\n }\n\n /**\n * Helper to parse integer from buffer (delegates to buffer-native implementation)\n */\n const parseIntegerFromBuffer = (buffer: Uint8Array, offset: number, options?: ParseOptions): ParseResult => {\n return integerFromBuffer(buffer, offset, options)\n }\n\n /**\n * Helper to parse string from buffer\n * Dispatches to byte string or text string based on major type\n */\n const parseStringFromBuffer = (buffer: Uint8Array, offset: number, options?: ParseOptions): ParseResult => {\n const initialByte = readByte(buffer, offset)\n const { majorType } = extractCborHeader(initialByte)\n if (majorType === 2) {\n return byteStringFromBuffer(buffer, offset, options)\n }\n return textStringFromBuffer(buffer, offset, options)\n }\n\n /**\n * Helper to parse float/simple from buffer (delegates to buffer-native implementation)\n */\n const parseFloatFromBuffer = (buffer: Uint8Array, offset: number, options?: ParseOptions): ParseResult => {\n return floatOrSimpleFromBuffer(buffer, offset, options)\n }\n\n /**\n * Parse array with source map tracking\n */\n const parseArrayWithMap = (\n ctx: CborContext,\n offset: number,\n path: string,\n sourceMap: SourceMapEntry[]\n ): ParseResult => {\n const previousDepth = ctx.currentDepth ?? 0\n const maxDepth = ctx.options?.limits?.maxDepth\n if (maxDepth !== undefined && previousDepth >= maxDepth) {\n throw new Error(`Maximum nesting depth ${maxDepth} exceeded`)\n }\n ctx.currentDepth = previousDepth + 1\n\n const startOffset = offset\n const initialByte = readByte(ctx.buffer, offset)\n const { additionalInfo } = extractCborHeader(initialByte)\n\n let currentOffset = offset + 1\n const items: any[] = []\n\n // Determine array length\n let length: number\n let isIndefinite = false\n\n if (additionalInfo < 24) {\n length = additionalInfo\n } else if (additionalInfo === 24) {\n length = readByte(ctx.buffer, currentOffset)\n currentOffset += 1\n } else if (additionalInfo === 25) {\n length = readUint(ctx.buffer, currentOffset, 2)\n currentOffset += 2\n } else if (additionalInfo === 26) {\n length = readUint(ctx.buffer, currentOffset, 4)\n currentOffset += 4\n } else if (additionalInfo === 27) {\n const bigLength = readBigUint(ctx.buffer, currentOffset, 8)\n if (bigLength > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('Array length exceeds maximum safe integer')\n }\n length = Number(bigLength)\n currentOffset += 8\n } else if (additionalInfo === 31) {\n const isIndefiniteAllowed = ctx.options?.allowIndefinite ?? !(ctx.options?.validateCanonical || ctx.options?.strict)\n if (!isIndefiniteAllowed) {\n throw new Error('Indefinite-length encoding is not allowed (strict/canonical mode)')\n }\n isIndefinite = true\n length = 0\n } else {\n throw new Error(`Invalid additional info: ${additionalInfo}`)\n }\n\n // Calculate header length (where content starts)\n const headerEnd = currentOffset\n\n // Add header entry for array\n const arrayEntryIndex = sourceMap.length\n sourceMap.push({\n path,\n start: startOffset,\n end: headerEnd,\n majorType: 4,\n type: isIndefinite ? 'array(indefinite)' : `array(${length})`,\n isHeader: true,\n headerEnd\n })\n\n try {\n // Parse array elements\n const childPaths: string[] = []\n if (isIndefinite) {\n let index = 0\n let foundBreak = false\n while (currentOffset < ctx.buffer.length) {\n const nextByte = readByte(ctx.buffer, currentOffset)\n if (nextByte === 0xff) {\n currentOffset++\n foundBreak = true\n break\n }\n if (ctx.options?.limits?.maxArrayLength && index >= ctx.options.limits.maxArrayLength) {\n throw new Error(`Array length exceeds limit of ${ctx.options.limits.maxArrayLength}`)\n }\n const elementPath = `${path}[${index}]`\n childPaths.push(elementPath)\n const elementResult = parseValueWithMap(ctx, currentOffset, elementPath, sourceMap)\n items.push(elementResult.value)\n currentOffset += elementResult.bytesRead\n\n // Mark element as child of this array\n const elementEntry = sourceMap.find(e => e.path === elementPath)\n if (elementEntry) {\n elementEntry.parent = path\n }\n\n index++\n }\n if (!foundBreak) {\n throw new Error('Indefinite-length array missing break code (0xFF)')\n }\n } else {\n if (ctx.options?.limits?.maxArrayLength && length > ctx.options.limits.maxArrayLength) {\n throw new Error(`Array length ${length} exceeds limit of ${ctx.options.limits.maxArrayLength}`)\n }\n for (let i = 0; i < length; i++) {\n const elementPath = `${path}[${i}]`\n childPaths.push(elementPath)\n const elementResult = parseValueWithMap(ctx, currentOffset, elementPath, sourceMap)\n items.push(elementResult.value)\n currentOffset += elementResult.bytesRead\n\n // Mark element as child of this array\n const elementEntry = sourceMap.find(e => e.path === elementPath)\n if (elementEntry) {\n elementEntry.parent = path\n }\n }\n }\n\n const bytesRead = currentOffset - offset\n\n // Only set children if array is non-empty\n if (childPaths.length > 0 && sourceMap[arrayEntryIndex]) {\n sourceMap[arrayEntryIndex].children = childPaths\n }\n\n return {\n value: items,\n bytesRead\n }\n } finally {\n ctx.currentDepth = previousDepth\n }\n }\n\n /**\n * Parse map with source map tracking\n */\n const parseMapWithMap = (\n ctx: CborContext,\n offset: number,\n path: string,\n sourceMap: SourceMapEntry[]\n ): ParseResult => {\n const previousDepth = ctx.currentDepth ?? 0\n const maxDepth = ctx.options?.limits?.maxDepth\n if (maxDepth !== undefined && previousDepth >= maxDepth) {\n throw new Error(`Maximum nesting depth ${maxDepth} exceeded`)\n }\n ctx.currentDepth = previousDepth + 1\n\n const startOffset = offset\n const initialByte = readByte(ctx.buffer, offset)\n const { additionalInfo } = extractCborHeader(initialByte)\n\n let currentOffset = offset + 1\n const map = new Map()\n\n // Determine map length\n let length: number\n let isIndefinite = false\n\n if (additionalInfo < 24) {\n length = additionalInfo\n } else if (additionalInfo === 24) {\n length = readByte(ctx.buffer, currentOffset)\n currentOffset += 1\n } else if (additionalInfo === 25) {\n length = readUint(ctx.buffer, currentOffset, 2)\n currentOffset += 2\n } else if (additionalInfo === 26) {\n length = readUint(ctx.buffer, currentOffset, 4)\n currentOffset += 4\n } else if (additionalInfo === 27) {\n const bigLength = readBigUint(ctx.buffer, currentOffset, 8)\n if (bigLength > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('Map length exceeds maximum safe integer')\n }\n length = Number(bigLength)\n currentOffset += 8\n } else if (additionalInfo === 31) {\n const isIndefiniteAllowed = ctx.options?.allowIndefinite ?? !(ctx.options?.validateCanonical || ctx.options?.strict)\n if (!isIndefiniteAllowed) {\n throw new Error('Indefinite-length encoding is not allowed (strict/canonical mode)')\n }\n isIndefinite = true\n length = 0\n } else {\n throw new Error(`Invalid additional info: ${additionalInfo}`)\n }\n\n // Calculate header length (where content starts)\n const headerEnd = currentOffset\n\n // Add header entry for map\n const mapEntryIndex = sourceMap.length\n sourceMap.push({\n path,\n start: startOffset,\n end: headerEnd,\n majorType: 5,\n type: isIndefinite ? 'map(indefinite)' : `map(${length})`,\n isHeader: true,\n headerEnd\n })\n\n try {\n // Parse map entries\n const childPaths: string[] = []\n const seenKeys = new Set<string>()\n\n if (isIndefinite) {\n let count = 0\n let foundBreak = false\n while (currentOffset < ctx.buffer.length) {\n const nextByte = readByte(ctx.buffer, currentOffset)\n if (nextByte === 0xff) {\n currentOffset++\n foundBreak = true\n break\n }\n if (ctx.options?.limits?.maxMapSize && count >= ctx.options.limits.maxMapSize) {\n throw new Error(`Map size exceeds limit of ${ctx.options.limits.maxMapSize}`)\n }\n\n // Parse key with path suffix to indicate it's a key\n const keyPath = `${path}${path ? '.' : ''}#key`\n const keyResult = parseValueWithMap(ctx, currentOffset, keyPath, sourceMap)\n currentOffset += keyResult.bytesRead\n\n // For duplicate detection, use semantic comparison (RFC 8949 Section 5.6)\n const keyForDupCheck = serializeValueForComparison(keyResult.value)\n // For path generation, use display-friendly stringification\n const keyString = keyResult.value instanceof Uint8Array\n ? Array.from(keyResult.value).map(b => b.toString(16).padStart(2, '0')).join('')\n : String(keyResult.value)\n\n // Check for duplicate keys based on dupMapKeyMode\n if (seenKeys.has(keyForDupCheck)) {\n const mode = ctx.options?.dupMapKeyMode || 'allow'\n if (mode === 'reject') {\n throw new Error(`Duplicate map key detected: ${keyString} at offset ${currentOffset}`)\n } else if (mode === 'warn') {\n logger.warn(`Duplicate map key detected: ${keyString} at offset ${currentOffset}`)\n }\n }\n seenKeys.add(keyForDupCheck)\n\n // Parse value\n const valuePath = path ? `${path}.${keyString}` : `.${keyString}`\n childPaths.push(valuePath)\n const valueResult = parseValueWithMap(ctx, currentOffset, valuePath, sourceMap)\n map.set(keyResult.value, valueResult.value)\n currentOffset += valueResult.bytesRead\n\n // Mark value entry as child of this map\n const valueEntry = sourceMap.find(e => e.path === valuePath)\n if (valueEntry) {\n valueEntry.parent = path\n }\n\n count++\n }\n if (!foundBreak) {\n throw new Error('Indefinite-length map missing break code (0xFF)')\n }\n } else {\n if (ctx.options?.limits?.maxMapSize && length > ctx.options.limits.maxMapSize) {\n throw new Error(`Map size ${length} exceeds limit of ${ctx.options.limits.maxMapSize}`)\n }\n for (let i = 0; i < length; i++) {\n // Parse key with path suffix to indicate it's a key\n const keyPath = `${path}${path ? '.' : ''}#key${i}`\n const keyResult = parseValueWithMap(ctx, currentOffset, keyPath, sourceMap)\n currentOffset += keyResult.bytesRead\n\n // For duplicate detection, use semantic comparison (RFC 8949 Section 5.6)\n const keyForDupCheck = serializeValueForComparison(keyResult.value)\n // For path generation, use display-friendly stringification\n const keyString = keyResult.value instanceof Uint8Array\n ? Array.from(keyResult.value).map(b => b.toString(16).padStart(2, '0')).join('')\n : String(keyResult.value)\n\n // Check for duplicate keys based on dupMapKeyMode\n if (seenKeys.has(keyForDupCheck)) {\n const mode = ctx.options?.dupMapKeyMode || 'allow'\n if (mode === 'reject') {\n throw new Error(`Duplicate map key detected: ${keyString} at offset ${currentOffset}`)\n } else if (mode === 'warn') {\n logger.warn(`Duplicate map key detected: ${keyString} at offset ${currentOffset}`)\n }\n }\n seenKeys.add(keyForDupCheck)\n\n // Parse value\n const valuePath = path ? `${path}.${keyString}` : `.${keyString}`\n childPaths.push(valuePath)\n const valueResult = parseValueWithMap(ctx, currentOffset, valuePath, sourceMap)\n map.set(keyResult.value, valueResult.value)\n currentOffset += valueResult.bytesRead\n\n // Mark value entry as child of this map\n const valueEntry = sourceMap.find(e => e.path === valuePath)\n if (valueEntry) {\n valueEntry.parent = path\n }\n }\n }\n\n const bytesRead = currentOffset - offset\n\n // Set children for the map entry\n if (sourceMap[mapEntryIndex]) {\n sourceMap[mapEntryIndex].children = childPaths\n }\n\n return {\n value: map,\n bytesRead\n }\n } finally {\n ctx.currentDepth = previousDepth\n }\n }\n\n /**\n * Helper to parse tag number from buffer\n */\n const parseTagNumberHelper = (\n buffer: Uint8Array,\n offset: number,\n ai: number\n ): { tagNumber: number, bytesConsumed: number } => {\n if (ai < 24) {\n // Direct encoding (tags 0-23)\n return { tagNumber: ai, bytesConsumed: 0 }\n } else if (ai === 24) {\n // 1 byte follows (tags 24-255)\n const tagNumber = readByte(buffer, offset)\n return { tagNumber, bytesConsumed: 1 }\n } else if (ai === 25) {\n // 2 bytes follow (tags 256-65535)\n const tagNumber = readUint(buffer, offset, 2)\n return { tagNumber, bytesConsumed: 2 }\n } else if (ai === 26) {\n // 4 bytes follow (tags 65536-4294967295)\n const tagNumber = readUint(buffer, offset, 4)\n return { tagNumber, bytesConsumed: 4 }\n } else if (ai === 27) {\n // 8 bytes follow (very large tag numbers)\n const tagBigInt = readBigUint(buffer, offset, 8)\n if (tagBigInt <= BigInt(Number.MAX_SAFE_INTEGER)) {\n return { tagNumber: Number(tagBigInt), bytesConsumed: 8 }\n } else {\n throw new Error(`Tag number ${tagBigInt} exceeds maximum safe integer`)\n }\n } else if (ai >= 28 && ai <= 30) {\n throw new Error(`Reserved additional info ${ai} for major type 6`)\n } else {\n throw new Error(`Invalid additional info ${ai} for tags`)\n }\n }\n\n /**\n * Parse tag with source map tracking (RECURSIVE)\n * Creates source map entries for both the tag and its nested value\n */\n const parseTagWithMap = (\n ctx: CborContext,\n offset: number,\n path: string,\n sourceMap: SourceMapEntry[]\n ): ParseResult => {\n // Enforce tag nesting depth (RUSTSEC-2019-0025). The source-map path\n // previously lacked this guard, allowing a deeply nested tag chain to\n // overflow the call stack with an uncatchable RangeError instead of a\n // clean error — matching the decode() path's behaviour here.\n const previousTagDepth = ctx.currentTagDepth ?? 0\n const maxTagDepth = ctx.options?.limits?.maxTagDepth ?? DEFAULT_LIMITS.maxTagDepth\n if (previousTagDepth >= maxTagDepth) {\n throw new Error(`Tag nesting depth ${previousTagDepth} exceeds limit of ${maxTagDepth}`)\n }\n ctx.currentTagDepth = previousTagDepth + 1\n\n const startOffset = offset\n const initialByte = readByte(ctx.buffer, offset)\n const { additionalInfo } = extractCborHeader(initialByte)\n\n // Parse tag number\n const { tagNumber, bytesConsumed } = parseTagNumberHelper(\n ctx.buffer,\n offset + 1,\n additionalInfo\n )\n\n // Enforce canonical (shortest-form) tag number encoding when requested.\n if (ctx.options?.validateCanonical) {\n validateCanonicalInteger(tagNumber, additionalInfo)\n }\n\n let currentOffset = offset + 1 + bytesConsumed\n const headerEnd = currentOffset\n\n // Add header entry for this tag\n const tagEntryIndex = sourceMap.length\n sourceMap.push({\n path,\n start: startOffset,\n end: headerEnd,\n majorType: 6,\n type: `tag(${tagNumber})`,\n isHeader: true,\n headerEnd,\n children: []\n })\n\n // Parse the tagged value WITH source map tracking (RECURSIVE CALL)\n const valuePath = `${path}.value`\n const valueResult = parseValueWithMap(ctx, currentOffset, valuePath, sourceMap)\n currentOffset += valueResult.bytesRead\n\n // Set child path for the tag\n if (sourceMap[tagEntryIndex]) {\n sourceMap[tagEntryIndex].children = [valuePath]\n }\n\n // Mark value entry as child of this tag\n const valueEntry = sourceMap.find(e => e.path === valuePath)\n if (valueEntry) {\n valueEntry.parent = path\n }\n\n // Build TaggedValue directly from already-parsed value (no re-parsing)\n // This avoids O(D^2) complexity for nested tags (Task 2-B fix)\n let finalValue = valueResult.value\n\n // Handle bignum conversion (tags 2 and 3) - mirrors parseTagFromBuffer logic\n if ((tagNumber === 2 || tagNumber === 3) && finalValue instanceof Uint8Array) {\n const maxBignumBytes = ctx.options?.limits?.maxBignumBytes ?? DEFAULT_LIMITS.maxBignumBytes\n if (finalValue.length > maxBignumBytes) {\n throw new Error(\n `Bignum (tag ${tagNumber}) size ${finalValue.length} bytes exceeds limit of ${maxBignumBytes} bytes`\n )\n }\n\n // Convert bytes to BigInt (big-endian)\n let bigintValue = 0n\n for (let i = 0; i < finalValue.length; i++) {\n bigintValue = (bigintValue << 8n) | BigInt(finalValue[i]!)\n }\n\n // Tag 2: Positive bignum, Tag 3: Negative bignum (-1 - n)\n finalValue = tagNumber === 2 ? bigintValue : -1n - bigintValue\n }\n\n // Validate semantic constraints for specific tags\n validateTagSemantics(tagNumber, finalValue, ctx.options)\n\n // Decode Plutus constructor if applicable\n const plutusConstr = decodePlutusConstructor(tagNumber, finalValue)\n\n const taggedValue: TaggedValue = {\n tag: tagNumber,\n value: finalValue,\n ...(plutusConstr && { plutus: plutusConstr })\n }\n\n // Restore tag depth so sibling tags don't accumulate against the limit.\n ctx.currentTagDepth = previousTagDepth\n\n return {\n value: taggedValue,\n bytesRead: currentOffset - startOffset\n }\n }\n\n /**\n * Get simple type description\n */\n const getSimpleTypeDescription = (ai: number): string => {\n if (ai === 20) return 'Simple: false'\n if (ai === 21) return 'Simple: true'\n if (ai === 22) return 'Simple: null'\n if (ai === 23) return 'Simple: undefined'\n if (ai === 25) return 'Float16'\n if (ai === 26) return 'Float32'\n if (ai === 27) return 'Float64'\n if (ai < 20) return `Simple Value ${ai}`\n return 'Simple Value'\n }\n\n /**\n * Parses a CBOR Sequence (RFC 8742)\n * A CBOR sequence is a concatenation of zero or more CBOR data items\n *\n * @param hexString - CBOR sequence data as hex string\n * @param options - Parser options (optional)\n * @returns Array of parsed CBOR values\n *\n * @example\n * ```ts\n * const { parseSequence } = useCborParser()\n * parseSequence('010203') // [1, 2, 3] - three separate integers\n * parseSequence('83010203 05') // [[1,2,3], 5] - array followed by integer\n * parseSequence('') // [] - empty sequence\n * ```\n */\n const parseSequence = (input: string | Uint8Array, options?: ParseOptions): CborValue[] => {\n const mergedOptions = mergeOptions(options)\n let buffer: Uint8Array\n\n if (input instanceof Uint8Array) {\n // Empty sequence is valid\n if (input.length === 0) {\n return []\n }\n buffer = input\n } else {\n const cleanHex = input.replace(/\\s+/g, '')\n\n // Empty sequence is valid\n if (!cleanHex || cleanHex.length === 0) {\n return []\n }\n\n if (cleanHex.length % 2 !== 0) {\n throw new Error('Hex string must have even length')\n }\n\n if (!/^[0-9a-fA-F]+$/.test(cleanHex)) {\n throw new Error(`Invalid hex character in: ${cleanHex}`)\n }\n\n buffer = hexToBytes(cleanHex)\n }\n\n const results: CborValue[] = []\n let offset = 0\n\n // Track start time for timeout enforcement across the entire sequence\n const sequenceStartTime = mergedOptions.limits?.maxParseTime ? Date.now() : 0\n\n while (offset < buffer.length) {\n // Check timeout on each sequence item\n if (sequenceStartTime > 0 && mergedOptions.limits?.maxParseTime) {\n const elapsed = Date.now() - sequenceStartTime\n if (elapsed > mergedOptions.limits.maxParseTime) {\n throw new Error(`Parse timeout: exceeded ${mergedOptions.limits.maxParseTime}ms limit`)\n }\n }\n\n // Check for break code outside indefinite context (invalid in sequence)\n const byte = readByte(buffer, offset)\n if (byte === 0xff) {\n throw new Error(`Unexpected break code (0xff) at offset ${offset} - not inside indefinite-length item`)\n }\n\n // Parse next item directly from buffer (no hex conversion)\n const result = dispatchFromBuffer(buffer, offset, mergedOptions)\n results.push(result.value)\n offset += result.bytesRead\n }\n\n return results\n }\n\n /**\n * Parses a CBOR Sequence with source maps for each item\n *\n * @param hexString - CBOR sequence data as hex string\n * @param options - Parser options (optional)\n * @returns Object with values array and sourceMaps array\n */\n const parseSequenceWithSourceMap = (hexString: string, options?: ParseOptions): {\n values: CborValue[]\n sourceMaps: SourceMapEntry[][]\n } => {\n const cleanHex = hexString.replace(/\\s+/g, '')\n\n if (!cleanHex || cleanHex.length === 0) {\n return { values: [], sourceMaps: [] }\n }\n\n if (cleanHex.length % 2 !== 0) {\n throw new Error('Hex string must have even length')\n }\n\n if (!/^[0-9a-fA-F]+$/.test(cleanHex)) {\n throw new Error(`Invalid hex character in: ${cleanHex}`)\n }\n\n const mergedOptions = mergeOptions(options)\n const buffer = hexToBytes(cleanHex)\n const values: CborValue[] = []\n const sourceMaps: SourceMapEntry[][] = []\n let offset = 0\n\n while (offset < buffer.length) {\n const byte = readByte(buffer, offset)\n if (byte === 0xff) {\n throw new Error(`Unexpected break code (0xff) at offset ${offset}`)\n }\n\n // Zero-copy view of the remaining bytes (parseWithSourceMap accepts\n // Uint8Array). Avoids the previous O(N^2) per-item hex re-encode that\n // re-stringified the whole tail of the buffer on every sequence item.\n const result = parseWithSourceMap(buffer.subarray(offset), mergedOptions)\n\n // Adjust source map offsets to account for sequence position\n const adjustedSourceMap = result.sourceMap.map(entry => ({\n ...entry,\n start: entry.start + offset,\n end: entry.end + offset\n }))\n\n values.push(result.value)\n sourceMaps.push(adjustedSourceMap)\n offset += result.bytesRead\n }\n\n return { values, sourceMaps }\n }\n\n return {\n parse,\n parseWithSourceMap,\n parseSequence,\n parseSequenceWithSourceMap\n }\n}\n"]}
|