@carbonenginejs/runtime-resource 0.18.0 → 0.19.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/dist/format/carbonEffect/CjsCarbonEffectWriter.js +16 -4
- package/dist/format/carbonEffect/CjsCarbonEffectWriter.js.map +1 -1
- package/dist/format/carbonEffect/buildCarbonEffectContainer.js +11 -1
- package/dist/format/carbonEffect/buildCarbonEffectContainer.js.map +1 -1
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js +36 -0
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -1
- package/dist/format/carbonEffect/carbonEffectRecords.js +45 -1
- package/dist/format/carbonEffect/carbonEffectRecords.js.map +1 -1
- package/dist/format/carbonEffect/carbonEffectResourceTransform.js +120 -60
- package/dist/format/carbonEffect/carbonEffectResourceTransform.js.map +1 -1
- package/dist/format/index.js +1 -1
- package/dist/formats/dds/core/helpers.js +35 -6
- package/dist/formats/dds/core/helpers.js.map +1 -1
- package/dist/formats/fbx/core/helpers.js +1 -1
- package/dist/formats/fbx/core/helpers.js.map +1 -1
- package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js +53 -1
- package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js.map +1 -1
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js +10 -1
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js.map +1 -1
- package/dist/formats/index.js +3 -0
- package/dist/formats/index.js.map +1 -1
- package/dist/formats/jpeg/core/helpers.js +1 -1
- package/dist/formats/jpeg/core/helpers.js.map +1 -1
- package/dist/formats/pickle/core/CjsPickleProtocol0Reader.js +205 -44
- package/dist/formats/pickle/core/CjsPickleProtocol0Reader.js.map +1 -1
- package/dist/formats/schemabound/CjsSchemaBoundFormat.js +236 -0
- package/dist/formats/schemabound/CjsSchemaBoundFormat.js.map +1 -0
- package/dist/formats/schemabound/core/schemaBoundErrors.js +9 -0
- package/dist/formats/schemabound/core/schemaBoundErrors.js.map +1 -0
- package/dist/formats/schemabound/core/schemaBoundValues.js +336 -0
- package/dist/formats/schemabound/core/schemaBoundValues.js.map +1 -0
- package/dist/formats/schemabound/index.js +2 -0
- package/dist/formats/schemabound/index.js.map +1 -0
- package/dist/formats/sqlite/CjsSqliteFormat.js +244 -0
- package/dist/formats/sqlite/CjsSqliteFormat.js.map +1 -0
- package/dist/formats/sqlite/core/sqlitePages.js +159 -0
- package/dist/formats/sqlite/core/sqlitePages.js.map +1 -0
- package/dist/formats/sqlite/core/sqliteRecords.js +174 -0
- package/dist/formats/sqlite/core/sqliteRecords.js.map +1 -0
- package/dist/formats/sqlite/core/sqliteSchema.js +100 -0
- package/dist/formats/sqlite/core/sqliteSchema.js.map +1 -0
- package/dist/formats/sqlite/index.js +2 -0
- package/dist/formats/sqlite/index.js.map +1 -0
- package/dist/formats/static/CjsStaticFormat.js +222 -0
- package/dist/formats/static/CjsStaticFormat.js.map +1 -0
- package/dist/formats/static/index.js +3 -0
- package/dist/formats/static/index.js.map +1 -0
- package/dist/formats/static/staticContainers.js +157 -0
- package/dist/formats/static/staticContainers.js.map +1 -0
- package/dist/formats/webgl/core/buildGlslEffectContainer.js +3 -1
- package/dist/formats/webgl/core/buildGlslEffectContainer.js.map +1 -1
- package/dist/formats/webgl/core/effectPackage.js +11 -2
- package/dist/formats/webgl/core/effectPackage.js.map +1 -1
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +10 -2
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
- package/dist/formats/webgpu/core/buildCarbonEffectContainer.js +3 -1
- package/dist/formats/webgpu/core/buildCarbonEffectContainer.js.map +1 -1
- package/dist/formats/webgpu/core/carbonWebgpu/containerViews.js +179 -131
- package/dist/formats/webgpu/core/carbonWebgpu/containerViews.js.map +1 -1
- package/dist/formats/webgpu/core/effectBackendBodySet.js +20 -20
- package/dist/formats/webgpu/core/effectBackendBodySet.js.map +1 -1
- package/dist/formats/webgpu/core/packageEffect.js +14 -1
- package/dist/formats/webgpu/core/packageEffect.js.map +1 -1
- package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js +9 -1
- package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js +14 -0
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
- package/docs/concepts/shader-resource-model.md +34 -1
- package/docs/formats/README.md +21 -0
- package/docs/formats/carbon-effect-container.md +54 -27
- package/docs/formats/pickle.md +36 -0
- package/docs/formats/schemabound.md +123 -0
- package/docs/formats/static.md +166 -0
- package/docs/formats/webgl/README.md +5 -3
- package/docs/formats/webgpu/README.md +2 -2
- package/docs/formats/webgpu/architecture.md +2 -2
- package/docs/formats/webgpu/formats/carbon-webgpu.md +13 -2
- package/docs/formats/webgpu/guides/effect-packaging.md +1 -2
- package/docs/formats/webgpu/reference/wgsl-compatibility.md +2 -2
- package/docs/reference/classes/formats.md +33 -0
- package/package.json +4 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sources":["../../../../../src/formats/jpeg/core/helpers.js"],"sourcesContent":["export const OUTPUT_IMAGE = \"image\";\nexport const OUTPUT_TEXTURE = \"texture\";\nexport const OUTPUT_RGBA = \"rgba\";\nexport const OUTPUT_RAW = \"raw\";\nexport const OUTPUT_JSON = \"json\";\n\nimport { canDecodeJpeg, decodeJpegToRgba } from \"./jpeg.js\";\n\nexport const DEFAULT_VALUES = Object.freeze({\n emit: OUTPUT_RAW,\n inputType: \"\",\n source: \"\"\n});\n\nconst DEBUG_OUTPUTS = Object.freeze({\n png: \"pngJson\",\n jpeg: \"jpegJson\",\n jpg: \"jpegJson\",\n tga: \"tgaJson\",\n dds: \"ddsJson\"\n});\n\nconst IMAGE_MIME_TYPES = Object.freeze({\n png: \"image/png\",\n jpeg: \"image/jpeg\",\n jpg: \"image/jpeg\",\n tga: \"image/x-tga\",\n dds: \"image/vnd-ms.dds\"\n});\n\n/**\n * Normalizes reader options against their supported defaults for the JPEG format\n * reader.\n */\nexport function normalizeValues(base = DEFAULT_VALUES, options = {}, readerName = \"CjsImageFormat\")\n{\n const values = { ...DEFAULT_VALUES, ...(base || {}), ...(options || {}) };\n values.inputType = normalizeInputType(values.inputType);\n values.emit = normalizeEmit(values.emit, values.inputType, readerName);\n return values;\n}\n\n/** Normalizes the requested input representation for the JPEG format reader. */\nexport function normalizeInputType(inputType)\n{\n if (!inputType) return \"\";\n const value = String(inputType).replace(/^\\./u, \"\").toLowerCase();\n return value === \"jpg\" ? \"jpeg\" : value;\n}\n\n/** Normalizes the requested output representation for the JPEG format reader. */\nexport function normalizeEmit(emit, inputType, readerName)\n{\n if (emit === undefined || emit === null) return OUTPUT_RAW;\n if (emit === OUTPUT_JSON && inputType) return DEBUG_OUTPUTS[inputType] || OUTPUT_JSON;\n if ([ OUTPUT_IMAGE, OUTPUT_RGBA, OUTPUT_RAW, OUTPUT_JSON ].includes(emit)) return emit;\n if (Object.values(DEBUG_OUTPUTS).includes(emit)) return emit;\n throw new TypeError(`${readerName}: unknown emit value ${JSON.stringify(emit)}`);\n}\n\n/** Returns a byte view over the supplied binary input for the JPEG format reader. */\nexport function toBytes(input)\n{\n if (input instanceof Uint8Array) return input;\n if (input instanceof ArrayBuffer) return new Uint8Array(input);\n if (ArrayBuffer.isView(input)) return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n throw new TypeError(\"Image input must be Uint8Array, ArrayBuffer, or DataView\");\n}\n\n/** Inspects input using normalized format options for the JPEG format reader. */\nexport function inspectWithValues(input, values = DEFAULT_VALUES, expectedType = \"\")\n{\n const bytes = toBytes(input);\n const detected = inspectBytes(bytes);\n const sourceFormat = expectedType || values.inputType || detected.sourceFormat;\n\n if (expectedType && detected.sourceFormat && detected.sourceFormat !== expectedType)\n {\n throw new TypeError(`CjsFormat${capitalize(expectedType)}: expected ${expectedType}, got ${detected.sourceFormat}`);\n }\n\n return {\n payloadType: sourceFormat === \"dds\" ? \"texture\" : \"image\",\n mediaTypes: sourceFormat === \"dds\" ? [ \"texture\", \"image\" ] : [ \"image\" ],\n sourceFormat,\n byteLength: bytes.byteLength,\n ...detected\n };\n}\n\n/**\n * Reports whether input is supported under normalized format options for the\n * JPEG format reader.\n */\nexport function isSupportedWithValues(input, values = DEFAULT_VALUES, expectedType = \"\")\n{\n try\n {\n const metadata = inspectWithValues(input, values, expectedType);\n const canDecode = metadata.sourceFormat === \"jpeg\" && canDecodeJpeg(metadata);\n const variants = [\n { kind: \"rgba\", payloadType: \"rgba\", codec: \"rgba8unorm\", supported: canDecode, reason: canDecode ? \"\" : jpegDecodeReason(metadata), containerOnly: false, isDecoded: canDecode, rgbaDecodeSupported: canDecode },\n rawVariant(metadata, canDecode)\n ];\n\n return {\n format: metadata.sourceFormat,\n source: values.source || \"buffer\",\n supported: metadata.sourceFormat ? (variants.some(variant => variant.supported && variant.kind === \"rgba\") ? \"full\" : \"partial\") : \"none\",\n confidence: metadata.sourceFormat ? 1 : 0,\n preferred: variants.find(v => v.supported)?.codec || \"\",\n reason: metadata.sourceFormat ? \"Container/header recognized.\" : \"Unrecognized image format.\",\n metadata,\n variants,\n warnings: [],\n errors: []\n };\n }\n catch (error)\n {\n return {\n format: expectedType || values.inputType || \"\",\n source: values.source || \"buffer\",\n supported: \"none\",\n confidence: 0,\n preferred: \"\",\n reason: error.message,\n metadata: null,\n variants: [],\n warnings: [],\n errors: [ error.message ]\n };\n }\n}\n\n/** Reads input using normalized format options for the JPEG format reader. */\nexport function readWithValues(input, values = DEFAULT_VALUES, expectedType = \"\")\n{\n const bytes = toBytes(input);\n const metadata = inspectWithValues(bytes, values, expectedType);\n\n if (values.emit === OUTPUT_RAW)\n {\n return {\n payloadType: \"raw\",\n sourceFormat: metadata.sourceFormat,\n mimeType: imageMimeType(metadata.sourceFormat),\n containerOnly: true,\n isDecoded: false,\n rgbaDecodeSupported: metadata.sourceFormat === \"jpeg\" && canDecodeJpeg(metadata),\n metadata,\n bytes\n };\n }\n\n if (values.emit === OUTPUT_JSON || values.emit === DEBUG_OUTPUTS[metadata.sourceFormat])\n {\n return metadata;\n }\n\n if ((values.emit === OUTPUT_RGBA || values.emit === OUTPUT_IMAGE) && metadata.sourceFormat === \"jpeg\")\n {\n if (!canDecodeJpeg(metadata))\n {\n const error = new Error(`jpeg: ${jpegDecodeReason(metadata)}`);\n error.code = \"CJS_FORMAT_OUTPUT_UNSUPPORTED\";\n throw error;\n }\n return decodeJpegToRgba(bytes, metadata);\n }\n\n const error = new Error(`${metadata.sourceFormat}: emit \"${values.emit}\" is not implemented yet`);\n error.code = \"CJS_FORMAT_OUTPUT_NOT_IMPLEMENTED\";\n error.sourceFormat = metadata.sourceFormat;\n error.emit = values.emit;\n throw error;\n}\n\nfunction rawVariant(metadata, canDecode)\n{\n return {\n kind: \"raw\",\n payloadType: \"raw\",\n codec: metadata.sourceFormat,\n mimeType: imageMimeType(metadata.sourceFormat),\n supported: true,\n containerOnly: true,\n isDecoded: false,\n rgbaDecodeSupported: metadata.sourceFormat === \"jpeg\" && canDecode === true\n };\n}\n\nfunction imageMimeType(sourceFormat)\n{\n return IMAGE_MIME_TYPES[sourceFormat] || \"application/octet-stream\";\n}\n\n/** Converts a parsed payload into a JSON-safe value for the JPEG format reader. */\nexport function toJsonValue(value)\n{\n if (value instanceof Uint8Array)\n {\n return { byteLength: value.byteLength };\n }\n if (Array.isArray(value)) return value.map(toJsonValue);\n if (value && typeof value === \"object\")\n {\n const output = {};\n for (const [ key, entry ] of Object.entries(value)) output[key] = toJsonValue(entry);\n return output;\n }\n return value;\n}\n\n/**\n * Inspects the supplied bytes without decoding their payload for the JPEG format\n * reader.\n */\nexport function inspectBytes(bytes)\n{\n if (isPNG(bytes)) return inspectPNG(bytes);\n if (isJPEG(bytes)) return inspectJPEG(bytes);\n if (isDDS(bytes)) return inspectDDS(bytes);\n if (isTGA(bytes)) return inspectTGA(bytes);\n return { sourceFormat: \"\", width: 0, height: 0 };\n}\n\n/**\n * Reports whether the supplied bytes begin with a PNG signature for the JPEG\n * format reader.\n */\nexport function isPNG(bytes)\n{\n return bytes.byteLength >= 24 &&\n bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47 &&\n bytes[4] === 0x0d && bytes[5] === 0x0a && bytes[6] === 0x1a && bytes[7] === 0x0a;\n}\n\n/**\n * Reports whether the supplied bytes begin with a JPEG signature for the JPEG\n * format reader.\n */\nexport function isJPEG(bytes)\n{\n return bytes.byteLength >= 4 && bytes[0] === 0xff && bytes[1] === 0xd8;\n}\n\n/**\n * Reports whether the supplied bytes begin with a JPEG signature accepted as JPG\n * for the JPEG format reader.\n */\nexport function isJPG(bytes)\n{\n return isJPEG(bytes);\n}\n\n/**\n * Reports whether the supplied bytes begin with a DDS signature for the JPEG\n * format reader.\n */\nexport function isDDS(bytes)\n{\n return bytes.byteLength >= 128 && bytes[0] === 0x44 && bytes[1] === 0x44 && bytes[2] === 0x53 && bytes[3] === 0x20;\n}\n\n/**\n * Reports whether the supplied bytes have a supported TGA header for the JPEG\n * format reader.\n */\nexport function isTGA(bytes)\n{\n if (bytes.byteLength < 18) return false;\n const imageType = bytes[2], width = readU16LE(bytes, 12), height = readU16LE(bytes, 14), bpp = bytes[16];\n return width > 0 && height > 0 && [ 1, 2, 3, 9, 10, 11 ].includes(imageType) && [ 8, 16, 24, 32 ].includes(bpp);\n}\n\nfunction inspectPNG(bytes)\n{\n const colorType = bytes[25], bitDepth = bytes[24];\n return {\n sourceFormat: \"png\",\n width: readU32BE(bytes, 16),\n height: readU32BE(bytes, 20),\n bitDepth,\n colorType,\n channels: pngChannels(colorType),\n pixelFormat: `png-${bitDepth}-${colorType}`,\n isCompressed: false\n };\n}\n\nfunction inspectJPEG(bytes)\n{\n let offset = 2;\n let frame = null;\n const summary = {\n appMarkerCount: 0,\n commentCount: 0,\n hasExif: false,\n hasIccProfile: false\n };\n while (offset + 9 < bytes.byteLength)\n {\n if (bytes[offset] !== 0xff)\n {\n offset++;\n continue;\n }\n const marker = bytes[offset + 1], length = readU16BE(bytes, offset + 2);\n const dataStart = offset + 4;\n const dataEnd = offset + 2 + length;\n if (marker >= 0xe0 && marker <= 0xef)\n {\n summary.appMarkerCount++;\n if (marker === 0xe1 && ascii(bytes, dataStart, Math.min(6, dataEnd - dataStart)) === \"Exif\\0\\0\") summary.hasExif = true;\n if (marker === 0xe2 && ascii(bytes, dataStart, Math.min(12, dataEnd - dataStart)) === \"ICC_PROFILE\\0\") summary.hasIccProfile = true;\n }\n else if (marker === 0xfe)\n {\n summary.commentCount++;\n }\n if ([ 0xc0, 0xc1, 0xc2, 0xc3 ].includes(marker))\n {\n frame = {\n sourceFormat: \"jpeg\",\n width: readU16BE(bytes, offset + 7),\n height: readU16BE(bytes, offset + 5),\n channels: bytes[offset + 9],\n components: bytes[offset + 9],\n precision: bytes[offset + 4],\n marker,\n progressive: marker === 0xc2 || marker === 0xc3,\n pixelFormat: \"jpeg-ycbcr\",\n isCompressed: true\n };\n }\n if (marker === 0xda && frame)\n {\n const scanStart = offset + 4;\n const scanComponents = bytes[scanStart];\n const spectralStart = bytes[scanStart + 1 + scanComponents * 2];\n const spectralEnd = bytes[scanStart + 2 + scanComponents * 2];\n const successive = bytes[scanStart + 3 + scanComponents * 2];\n return {\n ...frame,\n ...summary,\n scanComponents,\n spectralStart,\n spectralEnd,\n successive,\n progressive: frame.progressive || spectralStart !== 0 || spectralEnd !== 63 || successive !== 0\n };\n }\n offset += Math.max(length + 2, 2);\n }\n return frame ? { ...frame, ...summary } : { sourceFormat: \"jpeg\", width: 0, height: 0, channels: 0, pixelFormat: \"jpeg\", isCompressed: true, ...summary };\n}\n\nfunction jpegDecodeReason(metadata)\n{\n if (metadata.sourceFormat !== \"jpeg\") return `${metadata.sourceFormat.toUpperCase()} RGBA decode is not implemented yet.`;\n if (metadata.progressive) return \"Progressive JPEG software decode is not implemented yet.\";\n if (metadata.marker !== undefined && metadata.marker !== 0xc0 && metadata.marker !== 0xc1)\n {\n return \"Only sequential baseline JPEG frames are supported by the software decoder.\";\n }\n if (metadata.precision !== undefined && metadata.precision !== 8)\n {\n return `JPEG sample precision ${metadata.precision} is not supported by the software decoder.`;\n }\n if (metadata.components > 3) return \"CMYK/YCCK JPEG software decode is not implemented yet.\";\n return \"JPEG baseline frame metadata is incomplete or unsupported.\";\n}\n\nfunction inspectDDS(bytes)\n{\n const fourCc = String.fromCharCode(bytes[84], bytes[85], bytes[86], bytes[87]).replace(/\\0+$/u, \"\");\n return {\n sourceFormat: \"dds\",\n width: readU32LE(bytes, 16),\n height: readU32LE(bytes, 12),\n mipCount: Math.max(readU32LE(bytes, 28), 1),\n fourCc,\n textureFormat: fourCc || \"dds-legacy\",\n isCompressed: !!fourCc,\n hasMipMaps: readU32LE(bytes, 28) > 1\n };\n}\n\nfunction inspectTGA(bytes)\n{\n return {\n sourceFormat: \"tga\",\n width: readU16LE(bytes, 12),\n height: readU16LE(bytes, 14),\n channels: Math.max(bytes[16] / 8, 1),\n imageType: bytes[2],\n pixelFormat: `tga-${bytes[16]}`,\n isCompressed: [ 9, 10, 11 ].includes(bytes[2])\n };\n}\n\nfunction pngChannels(colorType)\n{\n if (colorType === 0) return 1;\n if (colorType === 2) return 3;\n if (colorType === 3) return 1;\n if (colorType === 4) return 2;\n if (colorType === 6) return 4;\n return 0;\n}\n\nfunction readU16BE(bytes, offset)\n{\n return (bytes[offset] << 8) | bytes[offset + 1];\n}\n\nfunction readU16LE(bytes, offset)\n{\n return bytes[offset] | (bytes[offset + 1] << 8);\n}\n\nfunction readU32BE(bytes, offset)\n{\n return ((bytes[offset] * 0x1000000) + ((bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3])) >>> 0;\n}\n\nfunction readU32LE(bytes, offset)\n{\n return (bytes[offset] | (bytes[offset + 1] << 8) | (bytes[offset + 2] << 16) | (bytes[offset + 3] * 0x1000000)) >>> 0;\n}\n\nfunction ascii(bytes, offset, length)\n{\n return String.fromCharCode(...bytes.subarray(offset, offset + length));\n}\n\nfunction capitalize(value)\n{\n return value ? value[0].toUpperCase() + value.slice(1) : \"Image\";\n}\n"],"names":["OUTPUT_IMAGE","OUTPUT_RGBA","OUTPUT_RAW","OUTPUT_JSON","DEFAULT_VALUES","Object","freeze","emit","inputType","source","DEBUG_OUTPUTS","png","jpeg","jpg","tga","dds","IMAGE_MIME_TYPES","normalizeValues","base","options","readerName","values","normalizeInputType","normalizeEmit","value","String","replace","toLowerCase","undefined","includes","TypeError","JSON","stringify","toBytes","input","Uint8Array","ArrayBuffer","isView","buffer","byteOffset","byteLength","inspectWithValues","expectedType","bytes","detected","inspectBytes","sourceFormat","capitalize","payloadType","mediaTypes","isSupportedWithValues","metadata","canDecode","canDecodeJpeg","variants","kind","codec","supported","reason","jpegDecodeReason","containerOnly","isDecoded","rgbaDecodeSupported","rawVariant","format","some","variant","confidence","preferred","find","v","warnings","errors","error","message","readWithValues","mimeType","imageMimeType","Error","code","decodeJpegToRgba","toJsonValue","Array","isArray","map","output","key","entry","entries","isPNG","inspectPNG","isJPEG","inspectJPEG","isDDS","inspectDDS","isTGA","inspectTGA","width","height","isJPG","imageType","readU16LE","bpp","colorType","bitDepth","readU32BE","channels","pngChannels","pixelFormat","isCompressed","offset","frame","summary","appMarkerCount","commentCount","hasExif","hasIccProfile","marker","length","readU16BE","dataStart","dataEnd","ascii","Math","min","components","precision","progressive","scanStart","scanComponents","spectralStart","spectralEnd","successive","max","toUpperCase","fourCc","fromCharCode","readU32LE","mipCount","textureFormat","hasMipMaps","subarray","slice"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helpers.js","sources":["../../../../../src/formats/jpeg/core/helpers.js"],"sourcesContent":["export const OUTPUT_IMAGE = \"image\";\nexport const OUTPUT_TEXTURE = \"texture\";\nexport const OUTPUT_RGBA = \"rgba\";\nexport const OUTPUT_RAW = \"raw\";\nexport const OUTPUT_JSON = \"json\";\n\nimport { canDecodeJpeg, decodeJpegToRgba } from \"./jpeg.js\";\n\nexport const DEFAULT_VALUES = Object.freeze({\n emit: OUTPUT_RAW,\n inputType: \"\",\n source: \"\"\n});\n\nconst DEBUG_OUTPUTS = Object.freeze({\n png: \"pngJson\",\n jpeg: \"jpegJson\",\n jpg: \"jpegJson\",\n tga: \"tgaJson\",\n dds: \"ddsJson\"\n});\n\nconst IMAGE_MIME_TYPES = Object.freeze({\n png: \"image/png\",\n jpeg: \"image/jpeg\",\n jpg: \"image/jpeg\",\n tga: \"image/x-tga\",\n dds: \"image/vnd-ms.dds\"\n});\n\n/**\n * Normalizes reader options against their supported defaults for the JPEG format\n * reader.\n */\nexport function normalizeValues(base = DEFAULT_VALUES, options = {}, readerName = \"CjsImageFormat\")\n{\n const values = { ...DEFAULT_VALUES, ...(base || {}), ...(options || {}) };\n values.inputType = normalizeInputType(values.inputType);\n values.emit = normalizeEmit(values.emit, values.inputType, readerName);\n return values;\n}\n\n/** Normalizes the requested input representation for the JPEG format reader. */\nexport function normalizeInputType(inputType)\n{\n if (!inputType) return \"\";\n const value = String(inputType).replace(/^\\./u, \"\").toLowerCase();\n return value === \"jpg\" ? \"jpeg\" : value;\n}\n\n/** Normalizes the requested output representation for the JPEG format reader. */\nexport function normalizeEmit(emit, inputType, readerName)\n{\n if (emit === undefined || emit === null) return OUTPUT_RAW;\n if (emit === OUTPUT_JSON && inputType) return DEBUG_OUTPUTS[inputType] || OUTPUT_JSON;\n if ([ OUTPUT_IMAGE, OUTPUT_RGBA, OUTPUT_RAW, OUTPUT_JSON ].includes(emit)) return emit;\n if (Object.values(DEBUG_OUTPUTS).includes(emit)) return emit;\n throw new TypeError(`${readerName}: unknown emit value ${JSON.stringify(emit)}`);\n}\n\n/** Returns a byte view over the supplied binary input for the JPEG format reader. */\nexport function toBytes(input)\n{\n if (input instanceof Uint8Array) return input;\n if (input instanceof ArrayBuffer) return new Uint8Array(input);\n if (ArrayBuffer.isView(input)) return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n throw new TypeError(\"Image input must be Uint8Array, ArrayBuffer, or DataView\");\n}\n\n/** Inspects input using normalized format options for the JPEG format reader. */\nexport function inspectWithValues(input, values = DEFAULT_VALUES, expectedType = \"\")\n{\n const bytes = toBytes(input);\n const detected = inspectBytes(bytes);\n const sourceFormat = expectedType || values.inputType || detected.sourceFormat;\n\n if (expectedType && detected.sourceFormat && detected.sourceFormat !== expectedType)\n {\n throw new TypeError(`CjsFormat${capitalize(expectedType)}: expected ${expectedType}, got ${detected.sourceFormat}`);\n }\n\n return {\n payloadType: sourceFormat === \"dds\" ? \"texture\" : \"image\",\n mediaTypes: sourceFormat === \"dds\" ? [ \"texture\", \"image\" ] : [ \"image\" ],\n sourceFormat,\n byteLength: bytes.byteLength,\n ...detected\n };\n}\n\n/**\n * Reports whether input is supported under normalized format options for the\n * JPEG format reader.\n */\nexport function isSupportedWithValues(input, values = DEFAULT_VALUES, expectedType = \"\")\n{\n try\n {\n const metadata = inspectWithValues(input, values, expectedType);\n const canDecode = metadata.sourceFormat === \"jpeg\" && canDecodeJpeg(metadata);\n const variants = [\n { kind: \"rgba\", payloadType: \"rgba\", codec: \"rgba8unorm\", supported: canDecode, reason: canDecode ? \"\" : jpegDecodeReason(metadata), containerOnly: false, isDecoded: canDecode, rgbaDecodeSupported: canDecode },\n rawVariant(metadata, canDecode)\n ];\n\n return {\n format: metadata.sourceFormat,\n source: values.source || \"buffer\",\n supported: metadata.sourceFormat ? (variants.some(variant => variant.supported && variant.kind === \"rgba\") ? \"full\" : \"partial\") : \"none\",\n confidence: metadata.sourceFormat ? 1 : 0,\n preferred: variants.find(v => v.supported)?.codec || \"\",\n reason: metadata.sourceFormat ? \"Container/header recognized.\" : \"Unrecognized image format.\",\n metadata,\n variants,\n warnings: [],\n errors: []\n };\n }\n catch (error)\n {\n return {\n format: expectedType || values.inputType || \"\",\n source: values.source || \"buffer\",\n supported: \"none\",\n confidence: 0,\n preferred: \"\",\n reason: error.message,\n metadata: null,\n variants: [],\n warnings: [],\n errors: [ error.message ]\n };\n }\n}\n\n/** Reads input using normalized format options for the JPEG format reader. */\nexport function readWithValues(input, values = DEFAULT_VALUES, expectedType = \"\")\n{\n const bytes = toBytes(input);\n const metadata = inspectWithValues(bytes, values, expectedType);\n\n if (values.emit === OUTPUT_RAW)\n {\n return {\n payloadType: \"raw\",\n sourceFormat: metadata.sourceFormat,\n mimeType: imageMimeType(metadata.sourceFormat),\n containerOnly: true,\n isDecoded: false,\n rgbaDecodeSupported: metadata.sourceFormat === \"jpeg\" && canDecodeJpeg(metadata),\n metadata,\n bytes\n };\n }\n\n if (values.emit === OUTPUT_JSON || values.emit === DEBUG_OUTPUTS[metadata.sourceFormat])\n {\n return metadata;\n }\n\n if ((values.emit === OUTPUT_RGBA || values.emit === OUTPUT_IMAGE) && metadata.sourceFormat === \"jpeg\")\n {\n if (!canDecodeJpeg(metadata))\n {\n const error = new Error(`jpeg: ${jpegDecodeReason(metadata)}`);\n error.code = \"CJS_FORMAT_OUTPUT_NOT_SUPPORTED\";\n throw error;\n }\n return decodeJpegToRgba(bytes, metadata);\n }\n\n const error = new Error(`${metadata.sourceFormat}: emit \"${values.emit}\" is not implemented yet`);\n error.code = \"CJS_FORMAT_OUTPUT_NOT_IMPLEMENTED\";\n error.sourceFormat = metadata.sourceFormat;\n error.emit = values.emit;\n throw error;\n}\n\nfunction rawVariant(metadata, canDecode)\n{\n return {\n kind: \"raw\",\n payloadType: \"raw\",\n codec: metadata.sourceFormat,\n mimeType: imageMimeType(metadata.sourceFormat),\n supported: true,\n containerOnly: true,\n isDecoded: false,\n rgbaDecodeSupported: metadata.sourceFormat === \"jpeg\" && canDecode === true\n };\n}\n\nfunction imageMimeType(sourceFormat)\n{\n return IMAGE_MIME_TYPES[sourceFormat] || \"application/octet-stream\";\n}\n\n/** Converts a parsed payload into a JSON-safe value for the JPEG format reader. */\nexport function toJsonValue(value)\n{\n if (value instanceof Uint8Array)\n {\n return { byteLength: value.byteLength };\n }\n if (Array.isArray(value)) return value.map(toJsonValue);\n if (value && typeof value === \"object\")\n {\n const output = {};\n for (const [ key, entry ] of Object.entries(value)) output[key] = toJsonValue(entry);\n return output;\n }\n return value;\n}\n\n/**\n * Inspects the supplied bytes without decoding their payload for the JPEG format\n * reader.\n */\nexport function inspectBytes(bytes)\n{\n if (isPNG(bytes)) return inspectPNG(bytes);\n if (isJPEG(bytes)) return inspectJPEG(bytes);\n if (isDDS(bytes)) return inspectDDS(bytes);\n if (isTGA(bytes)) return inspectTGA(bytes);\n return { sourceFormat: \"\", width: 0, height: 0 };\n}\n\n/**\n * Reports whether the supplied bytes begin with a PNG signature for the JPEG\n * format reader.\n */\nexport function isPNG(bytes)\n{\n return bytes.byteLength >= 24 &&\n bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47 &&\n bytes[4] === 0x0d && bytes[5] === 0x0a && bytes[6] === 0x1a && bytes[7] === 0x0a;\n}\n\n/**\n * Reports whether the supplied bytes begin with a JPEG signature for the JPEG\n * format reader.\n */\nexport function isJPEG(bytes)\n{\n return bytes.byteLength >= 4 && bytes[0] === 0xff && bytes[1] === 0xd8;\n}\n\n/**\n * Reports whether the supplied bytes begin with a JPEG signature accepted as JPG\n * for the JPEG format reader.\n */\nexport function isJPG(bytes)\n{\n return isJPEG(bytes);\n}\n\n/**\n * Reports whether the supplied bytes begin with a DDS signature for the JPEG\n * format reader.\n */\nexport function isDDS(bytes)\n{\n return bytes.byteLength >= 128 && bytes[0] === 0x44 && bytes[1] === 0x44 && bytes[2] === 0x53 && bytes[3] === 0x20;\n}\n\n/**\n * Reports whether the supplied bytes have a supported TGA header for the JPEG\n * format reader.\n */\nexport function isTGA(bytes)\n{\n if (bytes.byteLength < 18) return false;\n const imageType = bytes[2], width = readU16LE(bytes, 12), height = readU16LE(bytes, 14), bpp = bytes[16];\n return width > 0 && height > 0 && [ 1, 2, 3, 9, 10, 11 ].includes(imageType) && [ 8, 16, 24, 32 ].includes(bpp);\n}\n\nfunction inspectPNG(bytes)\n{\n const colorType = bytes[25], bitDepth = bytes[24];\n return {\n sourceFormat: \"png\",\n width: readU32BE(bytes, 16),\n height: readU32BE(bytes, 20),\n bitDepth,\n colorType,\n channels: pngChannels(colorType),\n pixelFormat: `png-${bitDepth}-${colorType}`,\n isCompressed: false\n };\n}\n\nfunction inspectJPEG(bytes)\n{\n let offset = 2;\n let frame = null;\n const summary = {\n appMarkerCount: 0,\n commentCount: 0,\n hasExif: false,\n hasIccProfile: false\n };\n while (offset + 9 < bytes.byteLength)\n {\n if (bytes[offset] !== 0xff)\n {\n offset++;\n continue;\n }\n const marker = bytes[offset + 1], length = readU16BE(bytes, offset + 2);\n const dataStart = offset + 4;\n const dataEnd = offset + 2 + length;\n if (marker >= 0xe0 && marker <= 0xef)\n {\n summary.appMarkerCount++;\n if (marker === 0xe1 && ascii(bytes, dataStart, Math.min(6, dataEnd - dataStart)) === \"Exif\\0\\0\") summary.hasExif = true;\n if (marker === 0xe2 && ascii(bytes, dataStart, Math.min(12, dataEnd - dataStart)) === \"ICC_PROFILE\\0\") summary.hasIccProfile = true;\n }\n else if (marker === 0xfe)\n {\n summary.commentCount++;\n }\n if ([ 0xc0, 0xc1, 0xc2, 0xc3 ].includes(marker))\n {\n frame = {\n sourceFormat: \"jpeg\",\n width: readU16BE(bytes, offset + 7),\n height: readU16BE(bytes, offset + 5),\n channels: bytes[offset + 9],\n components: bytes[offset + 9],\n precision: bytes[offset + 4],\n marker,\n progressive: marker === 0xc2 || marker === 0xc3,\n pixelFormat: \"jpeg-ycbcr\",\n isCompressed: true\n };\n }\n if (marker === 0xda && frame)\n {\n const scanStart = offset + 4;\n const scanComponents = bytes[scanStart];\n const spectralStart = bytes[scanStart + 1 + scanComponents * 2];\n const spectralEnd = bytes[scanStart + 2 + scanComponents * 2];\n const successive = bytes[scanStart + 3 + scanComponents * 2];\n return {\n ...frame,\n ...summary,\n scanComponents,\n spectralStart,\n spectralEnd,\n successive,\n progressive: frame.progressive || spectralStart !== 0 || spectralEnd !== 63 || successive !== 0\n };\n }\n offset += Math.max(length + 2, 2);\n }\n return frame ? { ...frame, ...summary } : { sourceFormat: \"jpeg\", width: 0, height: 0, channels: 0, pixelFormat: \"jpeg\", isCompressed: true, ...summary };\n}\n\nfunction jpegDecodeReason(metadata)\n{\n if (metadata.sourceFormat !== \"jpeg\") return `${metadata.sourceFormat.toUpperCase()} RGBA decode is not implemented yet.`;\n if (metadata.progressive) return \"Progressive JPEG software decode is not implemented yet.\";\n if (metadata.marker !== undefined && metadata.marker !== 0xc0 && metadata.marker !== 0xc1)\n {\n return \"Only sequential baseline JPEG frames are supported by the software decoder.\";\n }\n if (metadata.precision !== undefined && metadata.precision !== 8)\n {\n return `JPEG sample precision ${metadata.precision} is not supported by the software decoder.`;\n }\n if (metadata.components > 3) return \"CMYK/YCCK JPEG software decode is not implemented yet.\";\n return \"JPEG baseline frame metadata is incomplete or unsupported.\";\n}\n\nfunction inspectDDS(bytes)\n{\n const fourCc = String.fromCharCode(bytes[84], bytes[85], bytes[86], bytes[87]).replace(/\\0+$/u, \"\");\n return {\n sourceFormat: \"dds\",\n width: readU32LE(bytes, 16),\n height: readU32LE(bytes, 12),\n mipCount: Math.max(readU32LE(bytes, 28), 1),\n fourCc,\n textureFormat: fourCc || \"dds-legacy\",\n isCompressed: !!fourCc,\n hasMipMaps: readU32LE(bytes, 28) > 1\n };\n}\n\nfunction inspectTGA(bytes)\n{\n return {\n sourceFormat: \"tga\",\n width: readU16LE(bytes, 12),\n height: readU16LE(bytes, 14),\n channels: Math.max(bytes[16] / 8, 1),\n imageType: bytes[2],\n pixelFormat: `tga-${bytes[16]}`,\n isCompressed: [ 9, 10, 11 ].includes(bytes[2])\n };\n}\n\nfunction pngChannels(colorType)\n{\n if (colorType === 0) return 1;\n if (colorType === 2) return 3;\n if (colorType === 3) return 1;\n if (colorType === 4) return 2;\n if (colorType === 6) return 4;\n return 0;\n}\n\nfunction readU16BE(bytes, offset)\n{\n return (bytes[offset] << 8) | bytes[offset + 1];\n}\n\nfunction readU16LE(bytes, offset)\n{\n return bytes[offset] | (bytes[offset + 1] << 8);\n}\n\nfunction readU32BE(bytes, offset)\n{\n return ((bytes[offset] * 0x1000000) + ((bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3])) >>> 0;\n}\n\nfunction readU32LE(bytes, offset)\n{\n return (bytes[offset] | (bytes[offset + 1] << 8) | (bytes[offset + 2] << 16) | (bytes[offset + 3] * 0x1000000)) >>> 0;\n}\n\nfunction ascii(bytes, offset, length)\n{\n return String.fromCharCode(...bytes.subarray(offset, offset + length));\n}\n\nfunction capitalize(value)\n{\n return value ? value[0].toUpperCase() + value.slice(1) : \"Image\";\n}\n"],"names":["OUTPUT_IMAGE","OUTPUT_RGBA","OUTPUT_RAW","OUTPUT_JSON","DEFAULT_VALUES","Object","freeze","emit","inputType","source","DEBUG_OUTPUTS","png","jpeg","jpg","tga","dds","IMAGE_MIME_TYPES","normalizeValues","base","options","readerName","values","normalizeInputType","normalizeEmit","value","String","replace","toLowerCase","undefined","includes","TypeError","JSON","stringify","toBytes","input","Uint8Array","ArrayBuffer","isView","buffer","byteOffset","byteLength","inspectWithValues","expectedType","bytes","detected","inspectBytes","sourceFormat","capitalize","payloadType","mediaTypes","isSupportedWithValues","metadata","canDecode","canDecodeJpeg","variants","kind","codec","supported","reason","jpegDecodeReason","containerOnly","isDecoded","rgbaDecodeSupported","rawVariant","format","some","variant","confidence","preferred","find","v","warnings","errors","error","message","readWithValues","mimeType","imageMimeType","Error","code","decodeJpegToRgba","toJsonValue","Array","isArray","map","output","key","entry","entries","isPNG","inspectPNG","isJPEG","inspectJPEG","isDDS","inspectDDS","isTGA","inspectTGA","width","height","isJPG","imageType","readU16LE","bpp","colorType","bitDepth","readU32BE","channels","pngChannels","pixelFormat","isCompressed","offset","frame","summary","appMarkerCount","commentCount","hasExif","hasIccProfile","marker","length","readU16BE","dataStart","dataEnd","ascii","Math","min","components","precision","progressive","scanStart","scanComponents","spectralStart","spectralEnd","successive","max","toUpperCase","fourCc","fromCharCode","readU32LE","mipCount","textureFormat","hasMipMaps","subarray","slice"],"mappings":"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"}
|
|
@@ -32,7 +32,7 @@ class CjsPickleProtocol0Reader {
|
|
|
32
32
|
this.#bytes = normalizeBytes(input);
|
|
33
33
|
this.#limits = normalizeLimits(options.limits ?? options);
|
|
34
34
|
if (this.#bytes.byteLength > this.#limits.maxInputBytes) {
|
|
35
|
-
throw pickleError("
|
|
35
|
+
throw pickleError("CJS_PICKLE_FORMAT_LIMIT_EXCEEDED", `Pickle input exceeds maxInputBytes (${this.#limits.maxInputBytes}).`, 0);
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
|
|
@@ -78,6 +78,13 @@ function decode(bytes, limits) {
|
|
|
78
78
|
memo: new Map(),
|
|
79
79
|
offset: 0,
|
|
80
80
|
operations: 0,
|
|
81
|
+
// Every global marker created, and separately those no REDUCE has consumed.
|
|
82
|
+
// A marker is a decoding artifact, never data: it may sit on the stack and
|
|
83
|
+
// in the memo on its way to a REDUCE, and it may reach nothing else.
|
|
84
|
+
globalMarkers: new WeakSet(),
|
|
85
|
+
pendingGlobals: new Set(),
|
|
86
|
+
// Properties built by REDUCE across the WHOLE decode, not per container.
|
|
87
|
+
rebuiltItems: 0,
|
|
81
88
|
stack: []
|
|
82
89
|
};
|
|
83
90
|
while (state.offset < bytes.byteLength) {
|
|
@@ -85,7 +92,7 @@ function decode(bytes, limits) {
|
|
|
85
92
|
const opcode = bytes[state.offset++];
|
|
86
93
|
state.operations += 1;
|
|
87
94
|
if (state.operations > limits.maxOperations) {
|
|
88
|
-
throw pickleError("
|
|
95
|
+
throw pickleError("CJS_PICKLE_FORMAT_LIMIT_EXCEEDED", `Pickle operation count exceeds maxOperations (${limits.maxOperations}).`, opcodeOffset);
|
|
89
96
|
}
|
|
90
97
|
switch (opcode) {
|
|
91
98
|
case 0x28:
|
|
@@ -148,29 +155,43 @@ function decode(bytes, limits) {
|
|
|
148
155
|
// SETITEM
|
|
149
156
|
setItem(state, opcodeOffset);
|
|
150
157
|
break;
|
|
158
|
+
case 0x63:
|
|
159
|
+
// GLOBAL
|
|
160
|
+
push(state, readGlobal(state, opcodeOffset), opcodeOffset);
|
|
161
|
+
break;
|
|
162
|
+
case 0x52:
|
|
163
|
+
// REDUCE
|
|
164
|
+
reduce(state, opcodeOffset);
|
|
165
|
+
break;
|
|
151
166
|
default:
|
|
152
|
-
throw pickleError("
|
|
167
|
+
throw pickleError("CJS_PICKLE_FORMAT_OPCODE_UNSUPPORTED", `Data-only pickle protocol 0 rejects opcode ${displayOpcode(opcode)}.`, opcodeOffset);
|
|
153
168
|
}
|
|
154
169
|
}
|
|
155
|
-
throw pickleError("
|
|
170
|
+
throw pickleError("CJS_PICKLE_FORMAT_STOP_MISSING", "Pickle input ended without a STOP opcode.", state.offset);
|
|
156
171
|
}
|
|
157
172
|
function stop(state, offset) {
|
|
173
|
+
// A GLOBAL that no REDUCE consumed would otherwise reach the caller as an
|
|
174
|
+
// empty object, indistinguishable from an empty dictionary.
|
|
175
|
+
if (state.pendingGlobals.size) {
|
|
176
|
+
throw pickleError("CJS_PICKLE_FORMAT_GLOBAL_UNSUPPORTED", "Pickle names a global that no REDUCE consumes.", offset);
|
|
177
|
+
}
|
|
178
|
+
rejectGlobalMarker(state, state.stack[0], offset);
|
|
158
179
|
if (state.marks.length || state.stack.length !== 1 || state.stack[0] === MARK) {
|
|
159
|
-
throw pickleError("
|
|
180
|
+
throw pickleError("CJS_PICKLE_FORMAT_STACK_INVALID", "Pickle STOP requires one completed value and no open marks.", offset);
|
|
160
181
|
}
|
|
161
182
|
if (state.offset !== state.bytes.byteLength) {
|
|
162
|
-
throw pickleError("
|
|
183
|
+
throw pickleError("CJS_PICKLE_FORMAT_TRAILING_DATA", "Pickle input contains bytes after STOP.", state.offset);
|
|
163
184
|
}
|
|
164
185
|
return state.stack[0];
|
|
165
186
|
}
|
|
166
187
|
function readFloat(state, offset) {
|
|
167
188
|
const value = readAsciiLine(state, state.limits.maxStringBytes, offset);
|
|
168
189
|
if (!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/u.test(value)) {
|
|
169
|
-
throw pickleError("
|
|
190
|
+
throw pickleError("CJS_PICKLE_FORMAT_NUMBER_INVALID", `Pickle FLOAT value is invalid: ${JSON.stringify(value)}.`, offset);
|
|
170
191
|
}
|
|
171
192
|
const result = Number(value);
|
|
172
193
|
if (!Number.isFinite(result)) {
|
|
173
|
-
throw pickleError("
|
|
194
|
+
throw pickleError("CJS_PICKLE_FORMAT_NUMBER_INVALID", "Pickle FLOAT must be finite for JSON-compatible output.", offset);
|
|
174
195
|
}
|
|
175
196
|
return result;
|
|
176
197
|
}
|
|
@@ -180,7 +201,7 @@ function readInteger(state, offset, isLong) {
|
|
|
180
201
|
if (!isLong && value === "01") return true;
|
|
181
202
|
if (isLong && value.endsWith("L")) value = value.slice(0, -1);
|
|
182
203
|
if (!/^[+-]?\d+$/u.test(value)) {
|
|
183
|
-
throw pickleError("
|
|
204
|
+
throw pickleError("CJS_PICKLE_FORMAT_NUMBER_INVALID", `Pickle integer value is invalid: ${JSON.stringify(value)}.`, offset);
|
|
184
205
|
}
|
|
185
206
|
const result = BigInt(value);
|
|
186
207
|
if (result >= BigInt(Number.MIN_SAFE_INTEGER) && result <= BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
@@ -191,11 +212,11 @@ function readInteger(state, offset, isLong) {
|
|
|
191
212
|
function readString(state, offset) {
|
|
192
213
|
const bytes = readLine(state, state.limits.maxStringBytes, offset);
|
|
193
214
|
if (bytes.byteLength < 2) {
|
|
194
|
-
throw pickleError("
|
|
215
|
+
throw pickleError("CJS_PICKLE_FORMAT_STRING_INVALID", "Pickle STRING must be a quoted Python string literal.", offset);
|
|
195
216
|
}
|
|
196
217
|
const quote = bytes[0];
|
|
197
218
|
if (quote !== 0x27 && quote !== 0x22 || bytes[bytes.byteLength - 1] !== quote) {
|
|
198
|
-
throw pickleError("
|
|
219
|
+
throw pickleError("CJS_PICKLE_FORMAT_STRING_INVALID", "Pickle STRING must use matching single or double quotes.", offset);
|
|
199
220
|
}
|
|
200
221
|
const result = [];
|
|
201
222
|
for (let index = 1; index < bytes.byteLength - 1; index += 1) {
|
|
@@ -206,7 +227,7 @@ function readString(state, offset) {
|
|
|
206
227
|
}
|
|
207
228
|
index += 1;
|
|
208
229
|
if (index >= bytes.byteLength - 1) {
|
|
209
|
-
throw pickleError("
|
|
230
|
+
throw pickleError("CJS_PICKLE_FORMAT_STRING_INVALID", "Pickle STRING ends with an incomplete escape.", offset);
|
|
210
231
|
}
|
|
211
232
|
const escaped = bytes[index];
|
|
212
233
|
const simple = decodeSimpleEscape(escaped);
|
|
@@ -223,7 +244,7 @@ function readString(state, offset) {
|
|
|
223
244
|
}
|
|
224
245
|
result.push(String.fromCharCode(Number.parseInt(digits, 8)));
|
|
225
246
|
} else {
|
|
226
|
-
throw pickleError("
|
|
247
|
+
throw pickleError("CJS_PICKLE_FORMAT_STRING_INVALID", `Pickle STRING contains unsupported escape \\${String.fromCharCode(escaped)}.`, offset);
|
|
227
248
|
}
|
|
228
249
|
}
|
|
229
250
|
return result.join("");
|
|
@@ -244,7 +265,7 @@ function readUnicode(state, offset) {
|
|
|
244
265
|
} else if (escaped === 0x55) {
|
|
245
266
|
const codePoint = readHex(bytes, index + 2, 8, offset);
|
|
246
267
|
if (codePoint > 0x10ffff) {
|
|
247
|
-
throw pickleError("
|
|
268
|
+
throw pickleError("CJS_PICKLE_FORMAT_STRING_INVALID", `Pickle UNICODE code point is out of range: ${codePoint}.`, offset);
|
|
248
269
|
}
|
|
249
270
|
result.push(String.fromCodePoint(codePoint));
|
|
250
271
|
index += 9;
|
|
@@ -264,7 +285,7 @@ function readSequence(state, offset, isList) {
|
|
|
264
285
|
function readDictionary(state, offset) {
|
|
265
286
|
const values = popMarkedValues(state, offset);
|
|
266
287
|
if (values.length % 2 !== 0) {
|
|
267
|
-
throw pickleError("
|
|
288
|
+
throw pickleError("CJS_PICKLE_FORMAT_CONTAINER_INVALID", "Pickle DICT requires key/value pairs.", offset);
|
|
268
289
|
}
|
|
269
290
|
requireContainerLimit(state, values.length / 2, offset);
|
|
270
291
|
const result = {};
|
|
@@ -278,10 +299,10 @@ function readDictionary(state, offset) {
|
|
|
278
299
|
}
|
|
279
300
|
function append(state, offset) {
|
|
280
301
|
requireStack(state, 2, offset);
|
|
281
|
-
const value = state.stack.pop();
|
|
302
|
+
const value = rejectGlobalMarker(state, state.stack.pop(), offset);
|
|
282
303
|
const target = state.stack[state.stack.length - 1];
|
|
283
304
|
if (!Array.isArray(target) || !state.lists.has(target)) {
|
|
284
|
-
throw pickleError("
|
|
305
|
+
throw pickleError("CJS_PICKLE_FORMAT_CONTAINER_INVALID", "Pickle APPEND target must be a list.", offset);
|
|
285
306
|
}
|
|
286
307
|
requireContainerLimit(state, target.length + 1, offset);
|
|
287
308
|
target.push(value);
|
|
@@ -289,11 +310,11 @@ function append(state, offset) {
|
|
|
289
310
|
}
|
|
290
311
|
function setItem(state, offset) {
|
|
291
312
|
requireStack(state, 3, offset);
|
|
292
|
-
const value = state.stack.pop();
|
|
313
|
+
const value = rejectGlobalMarker(state, state.stack.pop(), offset);
|
|
293
314
|
const key = state.stack.pop();
|
|
294
315
|
const target = state.stack[state.stack.length - 1];
|
|
295
316
|
if (!isDictionary(target)) {
|
|
296
|
-
throw pickleError("
|
|
317
|
+
throw pickleError("CJS_PICKLE_FORMAT_CONTAINER_INVALID", "Pickle SETITEM target must be a dictionary.", offset);
|
|
297
318
|
}
|
|
298
319
|
const count = defineDictionaryValue(state, target, key, value, state.containers.get(target) ?? Object.keys(target).length, offset);
|
|
299
320
|
requireContainerLimit(state, count, offset);
|
|
@@ -304,7 +325,7 @@ function defineDictionaryValue(state, target, key, value, count, offset) {
|
|
|
304
325
|
const keyTypes = state.dictionaryKeys.get(target) ?? new Map();
|
|
305
326
|
const previousType = keyTypes.get(normalized.value);
|
|
306
327
|
if (previousType && previousType !== normalized.type) {
|
|
307
|
-
throw pickleError("
|
|
328
|
+
throw pickleError("CJS_PICKLE_FORMAT_CONTAINER_INVALID", `Pickle dictionary keys collide after JSON normalization: ${JSON.stringify(normalized.value)}.`, offset);
|
|
308
329
|
}
|
|
309
330
|
const exists = Object.hasOwn(target, normalized.value);
|
|
310
331
|
Object.defineProperty(target, normalized.value, {
|
|
@@ -328,63 +349,203 @@ function normalizeDictionaryKey(key, offset) {
|
|
|
328
349
|
value: String(key)
|
|
329
350
|
};
|
|
330
351
|
}
|
|
331
|
-
throw pickleError("
|
|
352
|
+
throw pickleError("CJS_PICKLE_FORMAT_CONTAINER_INVALID", "Data-only pickle dictionaries require string or safe-integer keys.", offset);
|
|
332
353
|
}
|
|
333
354
|
function putMemo(state, offset) {
|
|
334
355
|
requireStack(state, 1, offset);
|
|
335
356
|
if (state.stack[state.stack.length - 1] === MARK) {
|
|
336
|
-
throw pickleError("
|
|
357
|
+
throw pickleError("CJS_PICKLE_FORMAT_MARK_INVALID", "Pickle MARK cannot be stored in the memo.", offset);
|
|
337
358
|
}
|
|
338
359
|
const id = readMemoID(state, offset);
|
|
339
360
|
if (!state.memo.has(id) && state.memo.size >= state.limits.maxMemoEntries) {
|
|
340
|
-
throw pickleError("
|
|
361
|
+
throw pickleError("CJS_PICKLE_FORMAT_LIMIT_EXCEEDED", `Pickle memo exceeds maxMemoEntries (${state.limits.maxMemoEntries}).`, offset);
|
|
341
362
|
}
|
|
342
363
|
state.memo.set(id, state.stack[state.stack.length - 1]);
|
|
343
364
|
}
|
|
344
365
|
function getMemo(state, offset) {
|
|
345
366
|
const id = readMemoID(state, offset);
|
|
346
367
|
if (!state.memo.has(id)) {
|
|
347
|
-
throw pickleError("
|
|
368
|
+
throw pickleError("CJS_PICKLE_FORMAT_MEMO_INVALID", `Pickle memo entry ${id} does not exist.`, offset);
|
|
348
369
|
}
|
|
349
370
|
push(state, state.memo.get(id), offset);
|
|
350
371
|
}
|
|
351
372
|
function readMemoID(state, offset) {
|
|
352
373
|
const value = readAsciiLine(state, 64, offset);
|
|
353
374
|
if (!/^\d+$/u.test(value)) {
|
|
354
|
-
throw pickleError("
|
|
375
|
+
throw pickleError("CJS_PICKLE_FORMAT_MEMO_INVALID", `Pickle memo ID is invalid: ${JSON.stringify(value)}.`, offset);
|
|
355
376
|
}
|
|
356
377
|
const result = Number(value);
|
|
357
378
|
if (!Number.isSafeInteger(result) || result > state.limits.maxMemoID) {
|
|
358
|
-
throw pickleError("
|
|
379
|
+
throw pickleError("CJS_PICKLE_FORMAT_LIMIT_EXCEEDED", `Pickle memo ID exceeds maxMemoID (${state.limits.maxMemoID}).`, offset);
|
|
359
380
|
}
|
|
360
381
|
return result;
|
|
361
382
|
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* The one closed set of globals this reader will name, and how each rebuilds.
|
|
386
|
+
*
|
|
387
|
+
* `GLOBAL` is the opcode that makes a pickle dangerous: it names a module and an
|
|
388
|
+
* attribute for the unpickler to import, and `REDUCE` then calls it. The general
|
|
389
|
+
* form stays refused, and nothing here imports, resolves or invokes anything.
|
|
390
|
+
* What this table does instead is recognize a fixed name and build the plain
|
|
391
|
+
* data it stands for.
|
|
392
|
+
*
|
|
393
|
+
* `collections.OrderedDict` earns its place because it is not a behaviour, it is
|
|
394
|
+
* a dictionary that remembers insertion order — and a JavaScript object already
|
|
395
|
+
* does. It is also, measured across every self-describing container CCP ships,
|
|
396
|
+
* **the only global any of them uses**: 25 files, one name, once each. They use
|
|
397
|
+
* it because a schema's attribute order is its field order, which is exactly the
|
|
398
|
+
* property an ordinary dict would lose.
|
|
399
|
+
*
|
|
400
|
+
* **Adding to this table is not a small change.** A name belongs here only if
|
|
401
|
+
* reconstructing it is pure data with no behaviour of its own, and the entry has
|
|
402
|
+
* to build that data directly rather than defer to anything callable.
|
|
403
|
+
*/
|
|
404
|
+
const REBUILDABLE_GLOBALS = new Map([["collections.OrderedDict", RebuildOrderedDict]]);
|
|
405
|
+
const GLOBAL_NAME = Symbol("pickle-global");
|
|
406
|
+
|
|
407
|
+
/** Reads a GLOBAL, and refuses every name outside the closed set above. */
|
|
408
|
+
function readGlobal(state, offset) {
|
|
409
|
+
const module = decodeAscii(readLine(state, state.limits.maxStringBytes, offset));
|
|
410
|
+
const attribute = decodeAscii(readLine(state, state.limits.maxStringBytes, offset));
|
|
411
|
+
const name = `${module}.${attribute}`;
|
|
412
|
+
if (!REBUILDABLE_GLOBALS.has(name)) {
|
|
413
|
+
throw pickleError("CJS_PICKLE_FORMAT_GLOBAL_UNSUPPORTED", `Data-only pickle protocol 0 rejects the global ${JSON.stringify(name)}. ` + "Only a closed set of pure-data containers can be rebuilt, and this is not one.", offset);
|
|
414
|
+
}
|
|
415
|
+
const marker = {
|
|
416
|
+
[GLOBAL_NAME]: name
|
|
417
|
+
};
|
|
418
|
+
state.globalMarkers.add(marker);
|
|
419
|
+
state.pendingGlobals.add(marker);
|
|
420
|
+
return marker;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/** Rebuilds one allowed global from its arguments. Calls nothing. */
|
|
424
|
+
function reduce(state, offset) {
|
|
425
|
+
const args = state.stack.pop();
|
|
426
|
+
const callable = state.stack.pop();
|
|
427
|
+
const name = callable && typeof callable === "object" ? callable[GLOBAL_NAME] : undefined;
|
|
428
|
+
if (!name || !REBUILDABLE_GLOBALS.has(name)) {
|
|
429
|
+
throw pickleError("CJS_PICKLE_FORMAT_REDUCE_INVALID", "Pickle REDUCE applies only to a global this reader can rebuild.", offset);
|
|
430
|
+
}
|
|
431
|
+
if (!Array.isArray(args)) {
|
|
432
|
+
throw pickleError("CJS_PICKLE_FORMAT_REDUCE_INVALID", "Pickle REDUCE requires an argument tuple.", offset);
|
|
433
|
+
}
|
|
434
|
+
state.pendingGlobals.delete(callable);
|
|
435
|
+
push(state, REBUILDABLE_GLOBALS.get(name)(args, state, offset), offset);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Rebuilds `OrderedDict(pairs)` as a plain object.
|
|
440
|
+
*
|
|
441
|
+
* JavaScript preserves the insertion order of string keys, but NOT of keys that
|
|
442
|
+
* look like array indices — those sort ahead of everything else, in ascending
|
|
443
|
+
* numeric order. Refusing every numeric key was too blunt: real containers use
|
|
444
|
+
* them, and where they already ascend the object's order is the source's order
|
|
445
|
+
* and nothing is lost.
|
|
446
|
+
*
|
|
447
|
+
* So the order is checked rather than the keys. The result is compared against
|
|
448
|
+
* the order it was built in, and only a dictionary JavaScript would actually
|
|
449
|
+
* reorder is refused.
|
|
450
|
+
*/
|
|
451
|
+
function RebuildOrderedDict(args, state, offset) {
|
|
452
|
+
const pairs = args.length ? args[0] : [];
|
|
453
|
+
if (!Array.isArray(pairs)) {
|
|
454
|
+
throw pickleError("CJS_PICKLE_FORMAT_REDUCE_INVALID", "An ordered dictionary is rebuilt from a list of key/value pairs.", offset);
|
|
455
|
+
}
|
|
456
|
+
requireContainerLimit(state, pairs.length, offset);
|
|
457
|
+
const order = [];
|
|
458
|
+
|
|
459
|
+
// A per-container check is not enough here. REDUCE is the only path that
|
|
460
|
+
// builds N properties for a constant number of opcodes, so a memoized pair
|
|
461
|
+
// list rebuilt in a loop multiplies `maxOperations` by `maxContainerItems`
|
|
462
|
+
// instead of being bounded by either. A decode-wide budget is what bounds it.
|
|
463
|
+
state.rebuiltItems += pairs.length;
|
|
464
|
+
if (state.rebuiltItems > state.limits.maxContainerItems) {
|
|
465
|
+
throw pickleError("CJS_PICKLE_FORMAT_LIMIT_EXCEEDED", `Rebuilt items exceed maxContainerItems (${state.limits.maxContainerItems}) across the decode.`, offset);
|
|
466
|
+
}
|
|
467
|
+
const result = {};
|
|
468
|
+
for (const pair of pairs) {
|
|
469
|
+
if (!Array.isArray(pair) || pair.length !== 2) {
|
|
470
|
+
throw pickleError("CJS_PICKLE_FORMAT_REDUCE_INVALID", "An ordered dictionary entry must be a key/value pair.", offset);
|
|
471
|
+
}
|
|
472
|
+
const key = pair[0];
|
|
473
|
+
if (typeof key !== "string") {
|
|
474
|
+
throw pickleError("CJS_PICKLE_FORMAT_REDUCE_INVALID", "An ordered dictionary key must be a string.", offset);
|
|
475
|
+
}
|
|
476
|
+
order.push(key);
|
|
477
|
+
|
|
478
|
+
// Defined rather than assigned, as the dictionary path already does. A
|
|
479
|
+
// plain assignment to `__proto__` sets the object's prototype instead of
|
|
480
|
+
// storing a property: the field silently disappears from the decoded record
|
|
481
|
+
// and, if its value is an object, becomes a phantom the JSON never shows.
|
|
482
|
+
Object.defineProperty(result, key, {
|
|
483
|
+
configurable: true,
|
|
484
|
+
enumerable: true,
|
|
485
|
+
value: pair[1],
|
|
486
|
+
writable: true
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
// Order is the one thing this type exists to carry, so it is checked rather
|
|
491
|
+
// than assumed. A repeated key keeps its first position, which is what both
|
|
492
|
+
// Python and JavaScript do.
|
|
493
|
+
const expected = [...new Set(order)];
|
|
494
|
+
const kept = Object.keys(result);
|
|
495
|
+
if (kept.length !== expected.length || kept.some((key, index) => key !== expected[index])) {
|
|
496
|
+
throw pickleError("CJS_PICKLE_FORMAT_REDUCE_INVALID", "An ordered dictionary's key order would not survive as a JavaScript object.", offset);
|
|
497
|
+
}
|
|
498
|
+
return result;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/** Decodes a GLOBAL's module or attribute line, which is always ASCII. */
|
|
502
|
+
function decodeAscii(bytes) {
|
|
503
|
+
let result = "";
|
|
504
|
+
for (const byte of bytes) result += String.fromCharCode(byte);
|
|
505
|
+
return result.trim();
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* Refuses a global marker anywhere a decoded value is stored or returned.
|
|
510
|
+
*
|
|
511
|
+
* Consuming a marker with REDUCE is the only thing it is for. Appended to a
|
|
512
|
+
* list, set as a dictionary value or left as the result, it would reach the
|
|
513
|
+
* caller as `{}` - indistinguishable from an empty dictionary, and buryable
|
|
514
|
+
* anywhere in the graph through the memo.
|
|
515
|
+
*/
|
|
516
|
+
function rejectGlobalMarker(state, value, offset) {
|
|
517
|
+
if (value && typeof value === "object" && state.globalMarkers.has(value)) {
|
|
518
|
+
throw pickleError("CJS_PICKLE_FORMAT_GLOBAL_UNSUPPORTED", "A pickle global is only usable as the target of a REDUCE.", offset);
|
|
519
|
+
}
|
|
520
|
+
return value;
|
|
521
|
+
}
|
|
362
522
|
function popMarkedValues(state, offset) {
|
|
363
523
|
if (!state.marks.length) {
|
|
364
|
-
throw pickleError("
|
|
524
|
+
throw pickleError("CJS_PICKLE_FORMAT_MARK_INVALID", "Pickle container has no matching MARK.", offset);
|
|
365
525
|
}
|
|
366
526
|
const mark = state.marks.pop();
|
|
367
527
|
if (state.stack[mark] !== MARK) {
|
|
368
|
-
throw pickleError("
|
|
528
|
+
throw pickleError("CJS_PICKLE_FORMAT_MARK_INVALID", "Pickle MARK stack is inconsistent.", offset);
|
|
369
529
|
}
|
|
370
530
|
const values = state.stack.slice(mark + 1);
|
|
371
531
|
state.stack.length = mark;
|
|
532
|
+
for (const value of values) rejectGlobalMarker(state, value, offset);
|
|
372
533
|
return values;
|
|
373
534
|
}
|
|
374
535
|
function push(state, value, offset) {
|
|
375
536
|
if (state.stack.length >= state.limits.maxStackDepth) {
|
|
376
|
-
throw pickleError("
|
|
537
|
+
throw pickleError("CJS_PICKLE_FORMAT_LIMIT_EXCEEDED", `Pickle stack exceeds maxStackDepth (${state.limits.maxStackDepth}).`, offset);
|
|
377
538
|
}
|
|
378
539
|
state.stack.push(value);
|
|
379
540
|
}
|
|
380
541
|
function requireStack(state, count, offset) {
|
|
381
542
|
if (state.stack.length < count) {
|
|
382
|
-
throw pickleError("
|
|
543
|
+
throw pickleError("CJS_PICKLE_FORMAT_STACK_INVALID", `Pickle opcode requires ${count} stack values.`, offset);
|
|
383
544
|
}
|
|
384
545
|
}
|
|
385
546
|
function requireContainerLimit(state, count, offset) {
|
|
386
547
|
if (count > state.limits.maxContainerItems) {
|
|
387
|
-
throw pickleError("
|
|
548
|
+
throw pickleError("CJS_PICKLE_FORMAT_LIMIT_EXCEEDED", `Pickle container exceeds maxContainerItems (${state.limits.maxContainerItems}).`, offset);
|
|
388
549
|
}
|
|
389
550
|
}
|
|
390
551
|
function readAsciiLine(state, limit, offset) {
|
|
@@ -392,7 +553,7 @@ function readAsciiLine(state, limit, offset) {
|
|
|
392
553
|
let result = "";
|
|
393
554
|
for (const byte of bytes) {
|
|
394
555
|
if (byte > 0x7f) {
|
|
395
|
-
throw pickleError("
|
|
556
|
+
throw pickleError("CJS_PICKLE_FORMAT_STRING_INVALID", "Pickle control line must contain ASCII bytes.", offset);
|
|
396
557
|
}
|
|
397
558
|
result += String.fromCharCode(byte);
|
|
398
559
|
}
|
|
@@ -403,11 +564,11 @@ function readLine(state, limit, offset) {
|
|
|
403
564
|
while (state.offset < state.bytes.byteLength && state.bytes[state.offset] !== 0x0a) {
|
|
404
565
|
state.offset += 1;
|
|
405
566
|
if (state.offset - start > limit) {
|
|
406
|
-
throw pickleError("
|
|
567
|
+
throw pickleError("CJS_PICKLE_FORMAT_LIMIT_EXCEEDED", `Pickle line exceeds its ${limit}-byte limit.`, offset);
|
|
407
568
|
}
|
|
408
569
|
}
|
|
409
570
|
if (state.offset >= state.bytes.byteLength) {
|
|
410
|
-
throw pickleError("
|
|
571
|
+
throw pickleError("CJS_PICKLE_FORMAT_EOF", "Pickle line is missing its newline terminator.", offset);
|
|
411
572
|
}
|
|
412
573
|
const result = state.bytes.subarray(start, state.offset);
|
|
413
574
|
state.offset += 1;
|
|
@@ -415,13 +576,13 @@ function readLine(state, limit, offset) {
|
|
|
415
576
|
}
|
|
416
577
|
function readHex(bytes, start, length, offset) {
|
|
417
578
|
if (start + length > bytes.byteLength) {
|
|
418
|
-
throw pickleError("
|
|
579
|
+
throw pickleError("CJS_PICKLE_FORMAT_STRING_INVALID", "Pickle escape sequence is truncated.", offset);
|
|
419
580
|
}
|
|
420
581
|
let result = 0;
|
|
421
582
|
for (let index = 0; index < length; index += 1) {
|
|
422
583
|
const value = hexValue(bytes[start + index]);
|
|
423
584
|
if (value === -1) {
|
|
424
|
-
throw pickleError("
|
|
585
|
+
throw pickleError("CJS_PICKLE_FORMAT_STRING_INVALID", "Pickle escape sequence contains a non-hexadecimal digit.", offset);
|
|
425
586
|
}
|
|
426
587
|
result = result * 16 + value;
|
|
427
588
|
}
|
|
@@ -463,12 +624,12 @@ function assertJSONCompatible(value) {
|
|
|
463
624
|
}
|
|
464
625
|
if (typeof current === "number") {
|
|
465
626
|
if (!Number.isFinite(current)) {
|
|
466
|
-
throw pickleError("
|
|
627
|
+
throw pickleError("CJS_PICKLE_FORMAT_JSON_INVALID", "Pickle output contains a non-finite number.", null);
|
|
467
628
|
}
|
|
468
629
|
continue;
|
|
469
630
|
}
|
|
470
631
|
if (!current || typeof current !== "object") {
|
|
471
|
-
throw pickleError("
|
|
632
|
+
throw pickleError("CJS_PICKLE_FORMAT_JSON_INVALID", `Pickle output contains unsupported ${typeof current} data.`, null);
|
|
472
633
|
}
|
|
473
634
|
if (item.exit) {
|
|
474
635
|
active.delete(current);
|
|
@@ -477,7 +638,7 @@ function assertJSONCompatible(value) {
|
|
|
477
638
|
}
|
|
478
639
|
if (verified.has(current)) continue;
|
|
479
640
|
if (active.has(current)) {
|
|
480
|
-
throw pickleError("
|
|
641
|
+
throw pickleError("CJS_PICKLE_FORMAT_JSON_INVALID", "Pickle output contains a cyclic reference.", null);
|
|
481
642
|
}
|
|
482
643
|
active.add(current);
|
|
483
644
|
pending.push({
|
|
@@ -500,7 +661,7 @@ function assertJSONCompatible(value) {
|
|
|
500
661
|
});
|
|
501
662
|
}
|
|
502
663
|
} else {
|
|
503
|
-
throw pickleError("
|
|
664
|
+
throw pickleError("CJS_PICKLE_FORMAT_JSON_INVALID", "Pickle output contains a non-plain object.", null);
|
|
504
665
|
}
|
|
505
666
|
}
|
|
506
667
|
}
|
|
@@ -509,22 +670,22 @@ function normalizeBytes(input) {
|
|
|
509
670
|
if (ArrayBuffer.isView(input)) {
|
|
510
671
|
return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
|
|
511
672
|
}
|
|
512
|
-
throw pickleError("
|
|
673
|
+
throw pickleError("CJS_PICKLE_FORMAT_INPUT_INVALID", "Pickle input must be an ArrayBuffer or an ArrayBuffer view.", 0);
|
|
513
674
|
}
|
|
514
675
|
function normalizeLimits(options) {
|
|
515
676
|
if (!options || typeof options !== "object" || Array.isArray(options)) {
|
|
516
|
-
throw pickleError("
|
|
677
|
+
throw pickleError("CJS_PICKLE_FORMAT_LIMIT_INVALID", "Pickle limits must be an object.", 0);
|
|
517
678
|
}
|
|
518
679
|
for (const name of Object.keys(options)) {
|
|
519
680
|
if (!LIMIT_NAMES.includes(name)) {
|
|
520
|
-
throw pickleError("
|
|
681
|
+
throw pickleError("CJS_PICKLE_FORMAT_LIMIT_INVALID", `Pickle limits contain unknown value ${JSON.stringify(name)}.`, 0);
|
|
521
682
|
}
|
|
522
683
|
}
|
|
523
684
|
const result = {};
|
|
524
685
|
for (const name of LIMIT_NAMES) {
|
|
525
686
|
const value = options[name] ?? PICKLE_PROTOCOL_0_LIMITS[name];
|
|
526
687
|
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
527
|
-
throw pickleError("
|
|
688
|
+
throw pickleError("CJS_PICKLE_FORMAT_LIMIT_INVALID", `Pickle ${name} must be a positive safe integer.`, 0);
|
|
528
689
|
}
|
|
529
690
|
result[name] = value;
|
|
530
691
|
}
|