7z-iterator 0.2.9 → 0.2.11

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.
Files changed (114) hide show
  1. package/dist/cjs/FileEntry.js +1 -1
  2. package/dist/cjs/FileEntry.js.map +1 -1
  3. package/dist/cjs/SevenZipIterator.js +1 -1
  4. package/dist/cjs/SevenZipIterator.js.map +1 -1
  5. package/dist/cjs/compat.js +1 -1
  6. package/dist/cjs/compat.js.map +1 -1
  7. package/dist/cjs/index.js +1 -1
  8. package/dist/cjs/lib/Lock.js +1 -1
  9. package/dist/cjs/lib/streamToSource.js +1 -1
  10. package/dist/cjs/lib/streamToSource.js.map +1 -1
  11. package/dist/cjs/nextEntry.js +1 -1
  12. package/dist/cjs/nextEntry.js.map +1 -1
  13. package/dist/cjs/sevenz/NumberCodec.js +1 -1
  14. package/dist/cjs/sevenz/NumberCodec.js.map +1 -1
  15. package/dist/cjs/sevenz/SevenZipParser.js +1 -1
  16. package/dist/cjs/sevenz/SevenZipParser.js.map +1 -1
  17. package/dist/cjs/sevenz/codecs/Aes.js +1 -1
  18. package/dist/cjs/sevenz/codecs/Aes.js.map +1 -1
  19. package/dist/cjs/sevenz/codecs/BZip2.js +1 -1
  20. package/dist/cjs/sevenz/codecs/Bcj.js +2 -2
  21. package/dist/cjs/sevenz/codecs/Bcj.js.map +1 -1
  22. package/dist/cjs/sevenz/codecs/Bcj2.js +1 -1
  23. package/dist/cjs/sevenz/codecs/Bcj2.js.map +1 -1
  24. package/dist/cjs/sevenz/codecs/BcjArm.js +1 -1
  25. package/dist/cjs/sevenz/codecs/BcjArm.js.map +1 -1
  26. package/dist/cjs/sevenz/codecs/BcjArm64.js +1 -1
  27. package/dist/cjs/sevenz/codecs/BcjArm64.js.map +1 -1
  28. package/dist/cjs/sevenz/codecs/BcjArmt.js +1 -1
  29. package/dist/cjs/sevenz/codecs/BcjArmt.js.map +1 -1
  30. package/dist/cjs/sevenz/codecs/BcjIa64.js +1 -1
  31. package/dist/cjs/sevenz/codecs/BcjIa64.js.map +1 -1
  32. package/dist/cjs/sevenz/codecs/BcjPpc.js +1 -1
  33. package/dist/cjs/sevenz/codecs/BcjPpc.js.map +1 -1
  34. package/dist/cjs/sevenz/codecs/BcjSparc.js +1 -1
  35. package/dist/cjs/sevenz/codecs/BcjSparc.js.map +1 -1
  36. package/dist/cjs/sevenz/codecs/Copy.js +1 -1
  37. package/dist/cjs/sevenz/codecs/Deflate.js +1 -1
  38. package/dist/cjs/sevenz/codecs/Delta.js +1 -1
  39. package/dist/cjs/sevenz/codecs/Delta.js.map +1 -1
  40. package/dist/cjs/sevenz/codecs/Lzma.js +1 -1
  41. package/dist/cjs/sevenz/codecs/Lzma.js.map +1 -1
  42. package/dist/cjs/sevenz/codecs/Lzma2.js +1 -1
  43. package/dist/cjs/sevenz/codecs/Lzma2.js.map +1 -1
  44. package/dist/cjs/sevenz/codecs/createBufferingDecoder.js +1 -1
  45. package/dist/cjs/sevenz/codecs/createBufferingDecoder.js.map +1 -1
  46. package/dist/cjs/sevenz/codecs/index.js +1 -1
  47. package/dist/cjs/sevenz/codecs/index.js.map +1 -1
  48. package/dist/cjs/sevenz/codecs/lzmaCompat.d.cts +1 -1
  49. package/dist/cjs/sevenz/codecs/lzmaCompat.d.ts +1 -1
  50. package/dist/cjs/sevenz/codecs/lzmaCompat.js +1 -1
  51. package/dist/cjs/sevenz/codecs/lzmaCompat.js.map +1 -1
  52. package/dist/cjs/sevenz/codecs/streams.js +1 -1
  53. package/dist/cjs/sevenz/codecs/streams.js.map +1 -1
  54. package/dist/cjs/sevenz/constants.d.cts +8 -8
  55. package/dist/cjs/sevenz/constants.d.ts +8 -8
  56. package/dist/cjs/sevenz/constants.js +1 -1
  57. package/dist/cjs/sevenz/constants.js.map +1 -1
  58. package/dist/cjs/sevenz/headers.js +2 -2
  59. package/dist/cjs/sevenz/headers.js.map +1 -1
  60. package/dist/cjs/sevenz/index.js +1 -1
  61. package/dist/cjs/types.js +1 -1
  62. package/dist/esm/FileEntry.js +1 -1
  63. package/dist/esm/FileEntry.js.map +1 -1
  64. package/dist/esm/SevenZipIterator.js +6 -6
  65. package/dist/esm/SevenZipIterator.js.map +1 -1
  66. package/dist/esm/compat.js +2 -2
  67. package/dist/esm/compat.js.map +1 -1
  68. package/dist/esm/lib/streamToSource.js +12 -12
  69. package/dist/esm/lib/streamToSource.js.map +1 -1
  70. package/dist/esm/nextEntry.js +11 -11
  71. package/dist/esm/nextEntry.js.map +1 -1
  72. package/dist/esm/sevenz/NumberCodec.js +19 -19
  73. package/dist/esm/sevenz/NumberCodec.js.map +1 -1
  74. package/dist/esm/sevenz/SevenZipParser.js +191 -191
  75. package/dist/esm/sevenz/SevenZipParser.js.map +1 -1
  76. package/dist/esm/sevenz/codecs/Aes.js +29 -29
  77. package/dist/esm/sevenz/codecs/Aes.js.map +1 -1
  78. package/dist/esm/sevenz/codecs/Bcj.js +8 -8
  79. package/dist/esm/sevenz/codecs/Bcj.js.map +1 -1
  80. package/dist/esm/sevenz/codecs/Bcj2.js +35 -35
  81. package/dist/esm/sevenz/codecs/Bcj2.js.map +1 -1
  82. package/dist/esm/sevenz/codecs/BcjArm.js +4 -4
  83. package/dist/esm/sevenz/codecs/BcjArm.js.map +1 -1
  84. package/dist/esm/sevenz/codecs/BcjArm64.js +5 -5
  85. package/dist/esm/sevenz/codecs/BcjArm64.js.map +1 -1
  86. package/dist/esm/sevenz/codecs/BcjArmt.js +10 -10
  87. package/dist/esm/sevenz/codecs/BcjArmt.js.map +1 -1
  88. package/dist/esm/sevenz/codecs/BcjIa64.js +24 -24
  89. package/dist/esm/sevenz/codecs/BcjIa64.js.map +1 -1
  90. package/dist/esm/sevenz/codecs/BcjPpc.js +5 -5
  91. package/dist/esm/sevenz/codecs/BcjPpc.js.map +1 -1
  92. package/dist/esm/sevenz/codecs/BcjSparc.js +8 -8
  93. package/dist/esm/sevenz/codecs/BcjSparc.js.map +1 -1
  94. package/dist/esm/sevenz/codecs/Delta.js +6 -6
  95. package/dist/esm/sevenz/codecs/Delta.js.map +1 -1
  96. package/dist/esm/sevenz/codecs/Lzma.js +16 -16
  97. package/dist/esm/sevenz/codecs/Lzma.js.map +1 -1
  98. package/dist/esm/sevenz/codecs/Lzma2.js +35 -35
  99. package/dist/esm/sevenz/codecs/Lzma2.js.map +1 -1
  100. package/dist/esm/sevenz/codecs/createBufferingDecoder.js +3 -3
  101. package/dist/esm/sevenz/codecs/createBufferingDecoder.js.map +1 -1
  102. package/dist/esm/sevenz/codecs/index.js +6 -6
  103. package/dist/esm/sevenz/codecs/index.js.map +1 -1
  104. package/dist/esm/sevenz/codecs/lzmaCompat.d.ts +1 -1
  105. package/dist/esm/sevenz/codecs/lzmaCompat.js +5 -5
  106. package/dist/esm/sevenz/codecs/lzmaCompat.js.map +1 -1
  107. package/dist/esm/sevenz/codecs/streams.js +13 -13
  108. package/dist/esm/sevenz/codecs/streams.js.map +1 -1
  109. package/dist/esm/sevenz/constants.d.ts +8 -8
  110. package/dist/esm/sevenz/constants.js +9 -9
  111. package/dist/esm/sevenz/constants.js.map +1 -1
  112. package/dist/esm/sevenz/headers.js +134 -134
  113. package/dist/esm/sevenz/headers.js.map +1 -1
  114. package/package.json +20 -20
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/SevenZipParser.ts"],"sourcesContent":["// SevenZipParser - Main 7z archive parser\n// Handles reading archive structure and providing file streams\n\nimport { allocBuffer, crc32 } from 'extract-base-iterator';\nimport fs from 'fs';\nimport oo from 'on-one';\nimport Stream from 'stream';\nimport { decodeBcj2Multi, getCodec, getCodecName, isBcj2Codec, isCodecSupported } from './codecs/index.ts';\n\n// Use native streams when available, readable-stream only for Node 0.x\nconst major = +process.versions.node.split('.')[0];\nlet PassThrough: typeof Stream.PassThrough;\nif (major > 0) {\n PassThrough = Stream.PassThrough;\n} else {\n PassThrough = require('readable-stream').PassThrough;\n}\ntype Readable = Stream.Readable;\n\nimport { type CodedError, createCodedError, ErrorCode, FileAttribute, PropertyId, SIGNATURE_HEADER_SIZE } from './constants.ts';\nimport { type FileInfo, parseEncodedHeader, parseHeaderContent, parseSignatureHeader, type SignatureHeader, type StreamsInfo } from './headers.ts';\nimport { readNumber } from './NumberCodec.ts';\n\n// Callback type for async operations\ntype DecompressCallback = (err: Error | null, data?: Buffer) => void;\n\n// Entry type for iteration\nexport interface SevenZipEntry {\n name: string;\n path: string;\n type: 'file' | 'directory' | 'link';\n size: number;\n mtime?: Date;\n atime?: Date;\n ctime?: Date;\n mode?: number;\n isAntiFile: boolean;\n // Internal tracking\n _folderIndex: number;\n _streamIndex: number; // Global stream index\n _streamIndexInFolder: number; // Stream index within folder (for solid archives)\n _hasStream: boolean;\n _crc?: number; // Expected CRC32 for this file (if present in archive)\n}\n\n/**\n * Archive source abstraction - allows reading from file descriptor or buffer\n */\nexport interface ArchiveSource {\n read(position: number, length: number): Buffer;\n getSize(): number;\n close(): void;\n}\n\n/**\n * Buffer-based archive source\n */\nexport class BufferSource implements ArchiveSource {\n private buffer: Buffer;\n\n constructor(buffer: Buffer) {\n this.buffer = buffer;\n }\n\n read(position: number, length: number): Buffer {\n return this.buffer.slice(position, position + length);\n }\n\n getSize(): number {\n return this.buffer.length;\n }\n\n close(): void {\n // Nothing to close for buffer\n }\n}\n\n/**\n * File descriptor based archive source\n */\nexport class FileSource implements ArchiveSource {\n private fd: number;\n private size: number;\n\n constructor(fd: number, size: number) {\n this.fd = fd;\n this.size = size;\n }\n\n read(position: number, length: number): Buffer {\n var buf = allocBuffer(length);\n var bytesRead = fs.readSync(this.fd, buf, 0, length, position);\n if (bytesRead < length) {\n return buf.slice(0, bytesRead);\n }\n return buf;\n }\n\n getSize(): number {\n return this.size;\n }\n\n close(): void {\n try {\n fs.closeSync(this.fd);\n } catch (_e) {\n // Ignore close errors\n }\n }\n}\n\n/**\n * SevenZipParser - parses 7z archives and provides entry iteration\n */\nexport class SevenZipParser {\n private source: ArchiveSource;\n private signature: SignatureHeader | null = null;\n private streamsInfo: StreamsInfo | null = null;\n private filesInfo: FileInfo[] = [];\n private entries: SevenZipEntry[] = [];\n private parsed = false;\n // Smart cache for decompressed solid blocks\n // Only caches when multiple files share a block, releases when last file extracted\n private decompressedCache: { [key: number]: Buffer } = {};\n // Track files per folder and how many have been extracted\n private filesPerFolder: { [key: number]: number } = {};\n private extractedPerFolder: { [key: number]: number } = {};\n\n constructor(source: ArchiveSource) {\n this.source = source;\n }\n\n /**\n * Parse the archive structure\n * Must be called before iterating entries\n */\n parse(): void {\n if (this.parsed) return;\n\n // Read signature header\n var sigBuf = this.source.read(0, SIGNATURE_HEADER_SIZE);\n if (sigBuf.length < SIGNATURE_HEADER_SIZE) {\n throw createCodedError('Archive too small', ErrorCode.TRUNCATED_ARCHIVE);\n }\n\n this.signature = parseSignatureHeader(sigBuf);\n\n // Read encoded header\n var headerOffset = SIGNATURE_HEADER_SIZE + this.signature.nextHeaderOffset;\n var headerBuf = this.source.read(headerOffset, this.signature.nextHeaderSize);\n\n if (headerBuf.length < this.signature.nextHeaderSize) {\n throw createCodedError('Truncated header', ErrorCode.TRUNCATED_ARCHIVE);\n }\n\n // Parse encoded header (may need decompression)\n try {\n var headerResult = parseEncodedHeader(headerBuf, this.signature.nextHeaderCRC);\n this.streamsInfo = headerResult.streamsInfo || null;\n this.filesInfo = headerResult.filesInfo;\n } catch (err: unknown) {\n var codedErr = err as CodedError;\n if (codedErr && codedErr.code === ErrorCode.COMPRESSED_HEADER) {\n // Header is compressed - need to decompress first\n this.handleCompressedHeader(headerBuf);\n } else {\n throw err;\n }\n }\n\n // Build entries list\n this.buildEntries();\n this.parsed = true;\n }\n\n /**\n * Handle compressed header (kEncodedHeader)\n */\n private handleCompressedHeader(headerBuf: Buffer): void {\n // Parse the encoded header info to get decompression parameters\n var offset = 1; // Skip kEncodedHeader byte\n\n // Should have StreamsInfo for the header itself\n var propertyId = headerBuf[offset++];\n if (propertyId !== PropertyId.kMainStreamsInfo && propertyId !== PropertyId.kPackInfo) {\n throw createCodedError('Expected StreamsInfo in encoded header', ErrorCode.CORRUPT_HEADER);\n }\n\n // For now, we parse the streams info from the encoded header block\n // This tells us how to decompress the actual header\n\n // Read pack info from the encoded header structure\n var packInfoResult = this.parseEncodedHeaderStreams(headerBuf, 1);\n\n // Calculate compressed header position\n // For simple archives: header is at SIGNATURE_HEADER_SIZE + packPos\n // For BCJ2/complex archives: header may be at the END of pack data area\n // The pack data area ends at nextHeaderOffset (where encoded header starts)\n var compressedStart = SIGNATURE_HEADER_SIZE + packInfoResult.packPos;\n var compressedData = this.source.read(compressedStart, packInfoResult.packSize);\n\n // Decompress using the specified codec\n var codec = getCodec(packInfoResult.codecId);\n var decompressedHeader: Buffer | null = null;\n\n // Try decompressing from the calculated position first\n try {\n decompressedHeader = codec.decode(compressedData, packInfoResult.properties, packInfoResult.unpackSize);\n // Verify CRC if present\n if (packInfoResult.unpackCRC !== undefined) {\n var actualCRC = crc32(decompressedHeader);\n if (actualCRC !== packInfoResult.unpackCRC) {\n decompressedHeader = null; // CRC mismatch, need to search\n }\n }\n } catch {\n decompressedHeader = null; // Decompression failed, need to search\n }\n\n // If initial decompression failed, search for the correct position as a fallback\n // This handles edge cases where packPos doesn't point directly to header pack data\n if (decompressedHeader === null && this.signature) {\n var packAreaEnd = SIGNATURE_HEADER_SIZE + this.signature.nextHeaderOffset;\n var searchStart = packAreaEnd - packInfoResult.packSize;\n var searchEnd = Math.max(SIGNATURE_HEADER_SIZE, compressedStart - 100000);\n\n // Scan for LZMA data starting with 0x00 (range coder init)\n // Try each candidate and validate with CRC\n var scanChunkSize = 4096;\n searchLoop: for (var chunkStart = searchStart; chunkStart >= searchEnd; chunkStart -= scanChunkSize) {\n var chunk = this.source.read(chunkStart, scanChunkSize + packInfoResult.packSize);\n for (var i = 0; i < Math.min(chunk.length, scanChunkSize); i++) {\n if (chunk[i] === 0x00) {\n var candidateData = chunk.subarray(i, i + packInfoResult.packSize);\n if (candidateData.length === packInfoResult.packSize) {\n try {\n var candidateDecompressed = codec.decode(candidateData, packInfoResult.properties, packInfoResult.unpackSize);\n if (packInfoResult.unpackCRC !== undefined) {\n var candCRC = crc32(candidateDecompressed);\n if (candCRC === packInfoResult.unpackCRC) {\n decompressedHeader = candidateDecompressed;\n break searchLoop;\n }\n } else {\n decompressedHeader = candidateDecompressed;\n break searchLoop;\n }\n } catch {\n // Decompression failed, continue searching\n }\n }\n }\n }\n }\n }\n\n if (decompressedHeader === null) {\n throw createCodedError('Failed to decompress header - could not find valid LZMA data', ErrorCode.CORRUPT_HEADER);\n }\n\n // Now parse the decompressed header\n // It should start with kHeader\n var decompOffset = 0;\n var headerId = decompressedHeader[decompOffset++];\n if (headerId !== PropertyId.kHeader) {\n throw createCodedError('Expected kHeader in decompressed header', ErrorCode.CORRUPT_HEADER);\n }\n\n // Parse the decompressed header using shared function from headers.ts\n var result = parseHeaderContent(decompressedHeader, decompOffset);\n this.streamsInfo = result.streamsInfo || null;\n this.filesInfo = result.filesInfo;\n }\n\n /**\n * Parse streams info from encoded header block\n * This is a simplified parser for the header's own compression info\n */\n private parseEncodedHeaderStreams(\n buf: Buffer,\n offset: number\n ): {\n packPos: number;\n packSize: number;\n unpackSize: number;\n codecId: number[];\n properties?: Buffer;\n unpackCRC?: number;\n } {\n // This is a simplified parser for the encoded header's own streams info\n var packPos = 0;\n var packSize = 0;\n var unpackSize = 0;\n var codecId: number[] = [];\n var properties: Buffer | undefined;\n var unpackCRC: number | undefined;\n\n while (offset < buf.length) {\n var propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n switch (propertyId) {\n case PropertyId.kPackInfo: {\n var packPosResult = readNumber(buf, offset);\n packPos = packPosResult.value;\n offset += packPosResult.bytesRead;\n\n var numPackResult = readNumber(buf, offset);\n offset += numPackResult.bytesRead;\n\n // Read until kEnd\n while (buf[offset] !== PropertyId.kEnd) {\n if (buf[offset] === PropertyId.kSize) {\n offset++;\n var sizeResult = readNumber(buf, offset);\n packSize = sizeResult.value;\n offset += sizeResult.bytesRead;\n } else {\n offset++;\n }\n }\n offset++; // Skip kEnd\n break;\n }\n\n case PropertyId.kUnpackInfo:\n // Find folder/coder info\n while (offset < buf.length && buf[offset] !== PropertyId.kEnd) {\n if (buf[offset] === PropertyId.kFolder) {\n offset++;\n var numFoldersResult = readNumber(buf, offset);\n offset += numFoldersResult.bytesRead;\n offset++; // external flag\n\n // Parse coder\n var numCodersResult = readNumber(buf, offset);\n offset += numCodersResult.bytesRead;\n\n var flags = buf[offset++];\n var idSize = flags & 0x0f;\n var hasAttributes = (flags & 0x20) !== 0;\n\n codecId = [];\n for (var i = 0; i < idSize; i++) {\n codecId.push(buf[offset++]);\n }\n\n if (hasAttributes) {\n var propsLenResult = readNumber(buf, offset);\n offset += propsLenResult.bytesRead;\n properties = buf.slice(offset, offset + propsLenResult.value);\n offset += propsLenResult.value;\n }\n } else if (buf[offset] === PropertyId.kCodersUnpackSize) {\n offset++;\n // Read unpack size - needed for LZMA decoder\n var unpackSizeResult = readNumber(buf, offset);\n unpackSize = unpackSizeResult.value;\n offset += unpackSizeResult.bytesRead;\n } else if (buf[offset] === PropertyId.kCRC) {\n offset++;\n var allDefined = buf[offset++];\n if (allDefined) {\n unpackCRC = buf.readUInt32LE(offset);\n offset += 4;\n }\n } else {\n offset++;\n }\n }\n if (buf[offset] === PropertyId.kEnd) offset++;\n break;\n }\n }\n\n return { packPos: packPos, packSize: packSize, unpackSize: unpackSize, codecId: codecId, properties: properties, unpackCRC: unpackCRC };\n }\n\n /**\n * Build the entries list from parsed file info\n */\n private buildEntries(): void {\n this.entries = [];\n\n if (!this.streamsInfo) {\n // No streams info - just create entries from file info\n for (var i = 0; i < this.filesInfo.length; i++) {\n var file = this.filesInfo[i];\n this.entries.push(this.createEntry(file, 0, 0, 0));\n }\n return;\n }\n\n // Use the properly parsed numUnpackStreamsPerFolder from the archive header\n var streamsPerFolder = this.streamsInfo.numUnpackStreamsPerFolder;\n\n // Initialize files per folder count (for smart caching)\n for (var f = 0; f < streamsPerFolder.length; f++) {\n this.filesPerFolder[f] = streamsPerFolder[f];\n this.extractedPerFolder[f] = 0;\n }\n\n // Now build entries with proper folder/stream tracking\n var streamIndex = 0;\n var folderIndex = 0;\n var streamInFolder = 0;\n var folderStreamCount = streamsPerFolder[0] || 0;\n\n for (var j = 0; j < this.filesInfo.length; j++) {\n var fileInfo = this.filesInfo[j];\n\n // Get size from unpackSizes for files with streams\n var size = 0;\n if (fileInfo.hasStream && streamIndex < this.streamsInfo.unpackSizes.length) {\n size = this.streamsInfo.unpackSizes[streamIndex];\n }\n\n var entry = this.createEntry(fileInfo, size, folderIndex, streamInFolder);\n entry._streamIndex = streamIndex;\n // Set CRC if available\n if (fileInfo.hasStream && this.streamsInfo.unpackCRCs && this.streamsInfo.unpackCRCs[streamIndex] !== undefined) {\n entry._crc = this.streamsInfo.unpackCRCs[streamIndex];\n }\n this.entries.push(entry);\n\n // Advance stream tracking for files with streams\n if (fileInfo.hasStream) {\n streamIndex++;\n streamInFolder++;\n\n // Check if we've exhausted streams in this folder\n if (streamInFolder >= folderStreamCount) {\n folderIndex++;\n streamInFolder = 0;\n folderStreamCount = streamsPerFolder[folderIndex] || 0;\n }\n }\n }\n }\n\n /**\n * Create an entry from file info\n */\n private createEntry(file: FileInfo, size: number, folderIndex: number, streamInFolder: number): SevenZipEntry {\n // Determine entry type\n // Note: 7z format doesn't natively support symlinks. p7zip with -snl stores\n // symlinks as regular files with the target path as content.\n var type: 'file' | 'directory' | 'link' = 'file';\n if (file.isDirectory) {\n type = 'directory';\n }\n\n // Calculate mode from Windows attributes\n var mode: number | undefined;\n if (file.attributes !== undefined) {\n // Check for Unix extension bit\n if ((file.attributes & FileAttribute.UNIX_EXTENSION) !== 0) {\n mode = (file.attributes >>> 16) & 0xffff;\n // Check for symlink (S_IFLNK = 0xA000)\n // Note: Most 7z implementations don't preserve symlink mode bits\n if ((mode & 0xf000) === 0xa000) {\n type = 'link';\n }\n } else if (file.isDirectory) {\n mode = 493; // 0o755\n } else {\n mode = 420; // 0o644\n }\n }\n\n return {\n name: getBaseName(file.name),\n path: file.name,\n type: type,\n size: size,\n mtime: file.mtime,\n atime: file.atime,\n ctime: file.ctime,\n mode: mode,\n isAntiFile: file.isAntiFile,\n _folderIndex: folderIndex,\n _streamIndex: 0, // Set by caller\n _streamIndexInFolder: streamInFolder,\n _hasStream: file.hasStream,\n };\n }\n\n /**\n * Get the list of entries\n */\n getEntries(): SevenZipEntry[] {\n if (!this.parsed) {\n this.parse();\n }\n return this.entries;\n }\n\n /**\n * Get a readable stream for an entry's content\n */\n getEntryStream(entry: SevenZipEntry): Readable {\n if (!entry._hasStream || entry.type === 'directory') {\n // Return empty stream for directories and empty files\n var emptyStream = new PassThrough();\n emptyStream.end();\n return emptyStream;\n }\n\n if (!this.streamsInfo) {\n throw createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER);\n }\n\n // Get folder info\n var folder = this.streamsInfo.folders[entry._folderIndex];\n if (!folder) {\n throw createCodedError('Invalid folder index', ErrorCode.CORRUPT_HEADER);\n }\n\n // Check codec support\n for (var i = 0; i < folder.coders.length; i++) {\n var coder = folder.coders[i];\n if (!isCodecSupported(coder.id)) {\n var codecName = getCodecName(coder.id);\n throw createCodedError(`Unsupported codec: ${codecName}`, ErrorCode.UNSUPPORTED_CODEC);\n }\n }\n\n // Get decompressed data for this folder (with smart caching)\n var folderIdx = entry._folderIndex;\n var data = this.getDecompressedFolder(folderIdx);\n\n // Calculate file offset within the decompressed block\n // For solid archives, multiple files are concatenated in the block\n var fileStart = 0;\n for (var m = 0; m < entry._streamIndexInFolder; m++) {\n // Sum sizes of all streams before this one in the folder\n var prevStreamGlobalIndex = entry._streamIndex - entry._streamIndexInFolder + m;\n fileStart += this.streamsInfo.unpackSizes[prevStreamGlobalIndex];\n }\n\n var fileSize = entry.size;\n\n // Create a PassThrough stream with the file data\n var outputStream = new PassThrough();\n\n // Bounds check to prevent \"oob\" error on older Node versions\n if (fileStart + fileSize > data.length) {\n throw createCodedError(`File data out of bounds: offset ${fileStart} + size ${fileSize} > decompressed length ${data.length}`, ErrorCode.DECOMPRESSION_FAILED);\n }\n\n var fileData = data.slice(fileStart, fileStart + fileSize);\n\n // Verify CRC if present\n if (entry._crc !== undefined) {\n var actualCRC = crc32(fileData);\n if (actualCRC !== entry._crc) {\n throw createCodedError(`CRC mismatch for ${entry.path}: expected ${entry._crc.toString(16)}, got ${actualCRC.toString(16)}`, ErrorCode.CRC_MISMATCH);\n }\n }\n\n outputStream.end(fileData);\n\n // Track extraction and release cache when all files from this folder are done\n this.extractedPerFolder[folderIdx] = (this.extractedPerFolder[folderIdx] || 0) + 1;\n if (this.extractedPerFolder[folderIdx] >= this.filesPerFolder[folderIdx]) {\n // All files from this folder extracted, release cache\n delete this.decompressedCache[folderIdx];\n }\n\n return outputStream;\n }\n\n /**\n * Get a readable stream for an entry's content (callback-based async version)\n * Uses streaming decompression for non-blocking I/O\n */\n getEntryStreamAsync(entry: SevenZipEntry, callback: (err: Error | null, stream?: Readable) => void): void {\n if (!entry._hasStream || entry.type === 'directory') {\n // Return empty stream for directories and empty files\n var emptyStream = new PassThrough();\n emptyStream.end();\n callback(null, emptyStream);\n return;\n }\n\n if (!this.streamsInfo) {\n callback(createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER));\n return;\n }\n\n // Get folder info\n var folder = this.streamsInfo.folders[entry._folderIndex];\n if (!folder) {\n callback(createCodedError('Invalid folder index', ErrorCode.CORRUPT_HEADER));\n return;\n }\n\n // Check codec support\n for (var i = 0; i < folder.coders.length; i++) {\n var coder = folder.coders[i];\n if (!isCodecSupported(coder.id)) {\n var codecName = getCodecName(coder.id);\n callback(createCodedError(`Unsupported codec: ${codecName}`, ErrorCode.UNSUPPORTED_CODEC));\n return;\n }\n }\n\n // Get decompressed data for this folder using async method\n var folderIdx = entry._folderIndex;\n var streamsInfo = this.streamsInfo;\n\n this.getDecompressedFolderAsync(folderIdx, (err, data) => {\n if (err) return callback(err);\n if (!data) return callback(new Error('No data returned from decompression'));\n\n // Calculate file offset within the decompressed block\n var fileStart = 0;\n for (var m = 0; m < entry._streamIndexInFolder; m++) {\n var prevStreamGlobalIndex = entry._streamIndex - entry._streamIndexInFolder + m;\n fileStart += streamsInfo.unpackSizes[prevStreamGlobalIndex];\n }\n\n var fileSize = entry.size;\n\n // Bounds check\n if (fileStart + fileSize > data.length) {\n return callback(createCodedError(`File data out of bounds: offset ${fileStart} + size ${fileSize} > decompressed length ${data.length}`, ErrorCode.DECOMPRESSION_FAILED));\n }\n\n // Create a PassThrough stream with the file data\n var outputStream = new PassThrough();\n var fileData = data.slice(fileStart, fileStart + fileSize);\n\n // Verify CRC if present\n if (entry._crc !== undefined) {\n var actualCRC = crc32(fileData);\n if (actualCRC !== entry._crc) {\n return callback(createCodedError(`CRC mismatch for ${entry.path}: expected ${entry._crc.toString(16)}, got ${actualCRC.toString(16)}`, ErrorCode.CRC_MISMATCH));\n }\n }\n\n outputStream.end(fileData);\n\n // Track extraction and release cache when all files from this folder are done\n this.extractedPerFolder[folderIdx] = (this.extractedPerFolder[folderIdx] || 0) + 1;\n if (this.extractedPerFolder[folderIdx] >= this.filesPerFolder[folderIdx]) {\n delete this.decompressedCache[folderIdx];\n }\n\n callback(null, outputStream);\n });\n }\n\n /**\n * Check if a folder uses BCJ2 codec\n */\n private folderHasBcj2(folder: { coders: { id: number[] }[] }): boolean {\n for (var i = 0; i < folder.coders.length; i++) {\n if (isBcj2Codec(folder.coders[i].id)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Get decompressed data for a folder, with smart caching for solid archives\n * Only caches when multiple files share a block, releases when last file extracted\n */\n private getDecompressedFolder(folderIndex: number): Buffer {\n // Check cache first\n if (this.decompressedCache[folderIndex]) {\n return this.decompressedCache[folderIndex];\n }\n\n if (!this.streamsInfo) {\n throw createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER);\n }\n\n var folder = this.streamsInfo.folders[folderIndex];\n\n // Check how many files remain in this folder\n var filesInFolder = this.filesPerFolder[folderIndex] || 1;\n var extractedFromFolder = this.extractedPerFolder[folderIndex] || 0;\n var remainingFiles = filesInFolder - extractedFromFolder;\n // Only cache if more than 1 file remains (including the current one being extracted)\n var shouldCache = remainingFiles > 1;\n\n // Check if this folder uses BCJ2 (requires special multi-stream handling)\n if (this.folderHasBcj2(folder)) {\n var data = this.decompressBcj2Folder(folderIndex);\n if (shouldCache) {\n this.decompressedCache[folderIndex] = data;\n }\n return data;\n }\n\n // Calculate packed data position\n var packPos = SIGNATURE_HEADER_SIZE + this.streamsInfo.packPos;\n\n // Find which pack stream this folder uses\n var packStreamIndex = 0;\n for (var j = 0; j < folderIndex; j++) {\n packStreamIndex += this.streamsInfo.folders[j].packedStreams.length;\n }\n\n // Calculate position of this pack stream\n for (var k = 0; k < packStreamIndex; k++) {\n packPos += this.streamsInfo.packSizes[k];\n }\n\n var packSize = this.streamsInfo.packSizes[packStreamIndex];\n\n // Read packed data\n var packedData = this.source.read(packPos, packSize);\n\n // Decompress through codec chain\n var data2 = packedData;\n for (var l = 0; l < folder.coders.length; l++) {\n var coderInfo = folder.coders[l];\n var codec = getCodec(coderInfo.id);\n // Get unpack size for this coder (needed by LZMA)\n var unpackSize = folder.unpackSizes[l];\n data2 = codec.decode(data2, coderInfo.properties, unpackSize);\n }\n\n // Cache only if more files remain in this folder\n if (shouldCache) {\n this.decompressedCache[folderIndex] = data2;\n }\n\n return data2;\n }\n\n /**\n * Get decompressed data for a folder using streaming (callback-based async)\n * Uses createDecoder() streams for non-blocking decompression\n */\n private getDecompressedFolderAsync(folderIndex: number, callback: DecompressCallback): void {\n var self = this;\n\n // Check cache first\n if (this.decompressedCache[folderIndex]) {\n callback(null, this.decompressedCache[folderIndex]);\n return;\n }\n\n if (!this.streamsInfo) {\n callback(createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER));\n return;\n }\n\n var folder = this.streamsInfo.folders[folderIndex];\n\n // Check how many files remain in this folder\n var filesInFolder = this.filesPerFolder[folderIndex] || 1;\n var extractedFromFolder = this.extractedPerFolder[folderIndex] || 0;\n var remainingFiles = filesInFolder - extractedFromFolder;\n var shouldCache = remainingFiles > 1;\n\n // BCJ2 requires special handling - use sync version for now\n // TODO: Add async BCJ2 support\n if (this.folderHasBcj2(folder)) {\n try {\n var data = this.decompressBcj2Folder(folderIndex);\n if (shouldCache) {\n this.decompressedCache[folderIndex] = data;\n }\n callback(null, data);\n } catch (err) {\n callback(err as Error);\n }\n return;\n }\n\n // Calculate packed data position\n var packPos = SIGNATURE_HEADER_SIZE + this.streamsInfo.packPos;\n\n // Find which pack stream this folder uses\n var packStreamIndex = 0;\n for (var j = 0; j < folderIndex; j++) {\n packStreamIndex += this.streamsInfo.folders[j].packedStreams.length;\n }\n\n // Calculate position of this pack stream\n for (var k = 0; k < packStreamIndex; k++) {\n packPos += this.streamsInfo.packSizes[k];\n }\n\n var packSize = this.streamsInfo.packSizes[packStreamIndex];\n\n // Read packed data\n var packedData = this.source.read(packPos, packSize);\n\n // Create decoder stream chain and decompress\n var coders = folder.coders;\n var unpackSizes = folder.unpackSizes;\n\n // Helper to decompress through a single codec stream\n function decompressWithStream(input: Buffer, coderIdx: number, cb: DecompressCallback): void {\n var coderInfo = coders[coderIdx];\n var codec = getCodec(coderInfo.id);\n var decoder = codec.createDecoder(coderInfo.properties, unpackSizes[coderIdx]);\n\n var chunks: Buffer[] = [];\n var errorOccurred = false;\n\n decoder.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n oo(decoder, ['error', 'end', 'close', 'finish'], (err?: Error) => {\n if (errorOccurred) return;\n if (err) {\n errorOccurred = true;\n return cb(err);\n }\n cb(null, Buffer.concat(chunks));\n });\n\n // Write input data to decoder and signal end\n decoder.end(input);\n }\n\n // Chain decompression through all codecs\n function decompressChain(input: Buffer, idx: number): void {\n if (idx >= coders.length) {\n // All done - cache and return\n if (shouldCache) {\n self.decompressedCache[folderIndex] = input;\n }\n callback(null, input);\n return;\n }\n\n decompressWithStream(input, idx, (err, output) => {\n if (err) {\n callback(err);\n return;\n }\n decompressChain(output as Buffer, idx + 1);\n });\n }\n\n // Start the chain\n decompressChain(packedData, 0);\n }\n\n /**\n * Decompress a BCJ2 folder with multi-stream handling\n * BCJ2 uses 4 input streams: main, call, jump, range coder\n */\n private decompressBcj2Folder(folderIndex: number): Buffer {\n if (!this.streamsInfo) {\n throw createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER);\n }\n\n var folder = this.streamsInfo.folders[folderIndex];\n\n // Calculate starting pack position\n var packPos = SIGNATURE_HEADER_SIZE + this.streamsInfo.packPos;\n\n // Find which pack stream index this folder starts at\n var packStreamIndex = 0;\n for (var j = 0; j < folderIndex; j++) {\n packStreamIndex += this.streamsInfo.folders[j].packedStreams.length;\n }\n\n // Calculate position\n for (var k = 0; k < packStreamIndex; k++) {\n packPos += this.streamsInfo.packSizes[k];\n }\n\n // Read all pack streams for this folder\n var numPackStreams = folder.packedStreams.length;\n var packStreams: Buffer[] = [];\n var currentPos = packPos;\n\n for (var p = 0; p < numPackStreams; p++) {\n var size = this.streamsInfo.packSizes[packStreamIndex + p];\n packStreams.push(this.source.read(currentPos, size));\n currentPos += size;\n }\n\n // Build a map of coder outputs\n // For BCJ2, typical structure is:\n // Coder 0: LZMA2 (main stream) - 1 in, 1 out\n // Coder 1: LZMA (call stream) - 1 in, 1 out\n // Coder 2: LZMA (jump stream) - 1 in, 1 out\n // Coder 3: BCJ2 - 4 in, 1 out\n // Pack streams map to: coder inputs not bound to other coder outputs\n\n // First, decompress each non-BCJ2 coder\n var coderOutputs: { [key: number]: Buffer } = {};\n\n // Find the BCJ2 coder\n var bcj2CoderIndex = -1;\n for (var c = 0; c < folder.coders.length; c++) {\n if (isBcj2Codec(folder.coders[c].id)) {\n bcj2CoderIndex = c;\n break;\n }\n }\n\n if (bcj2CoderIndex === -1) {\n throw createCodedError('BCJ2 coder not found in folder', ErrorCode.CORRUPT_HEADER);\n }\n\n // Build input stream index -> pack stream mapping\n // folder.packedStreams tells us which input indices are unbound and their order\n var inputToPackStream: { [key: number]: number } = {};\n for (var pi = 0; pi < folder.packedStreams.length; pi++) {\n inputToPackStream[folder.packedStreams[pi]] = pi;\n }\n\n // Build output stream index -> coder mapping\n var outputToCoder: { [key: number]: number } = {};\n var totalOutputs = 0;\n for (var co = 0; co < folder.coders.length; co++) {\n var numOut = folder.coders[co].numOutStreams;\n for (var outp = 0; outp < numOut; outp++) {\n outputToCoder[totalOutputs + outp] = co;\n }\n totalOutputs += numOut;\n }\n\n // Decompress non-BCJ2 coders (LZMA, LZMA2)\n // We need to process in dependency order\n var processed: { [key: number]: boolean } = {};\n\n var processOrder = this.getCoderProcessOrder(folder, bcj2CoderIndex);\n\n for (var po = 0; po < processOrder.length; po++) {\n var coderIdx = processOrder[po];\n if (coderIdx === bcj2CoderIndex) continue;\n\n var coder = folder.coders[coderIdx];\n var codec = getCodec(coder.id);\n\n // Find input for this coder\n var coderInputStart = 0;\n for (var ci2 = 0; ci2 < coderIdx; ci2++) {\n coderInputStart += folder.coders[ci2].numInStreams;\n }\n\n // Get input data (from pack stream)\n var inputIdx = coderInputStart;\n var packStreamIdx = inputToPackStream[inputIdx];\n var inputData = packStreams[packStreamIdx];\n\n // Decompress\n var unpackSize = folder.unpackSizes[coderIdx];\n var outputData = codec.decode(inputData, coder.properties, unpackSize);\n\n // Store in coder outputs\n var coderOutputStart = 0;\n for (var co2 = 0; co2 < coderIdx; co2++) {\n coderOutputStart += folder.coders[co2].numOutStreams;\n }\n coderOutputs[coderOutputStart] = outputData;\n processed[coderIdx] = true;\n }\n\n // Now process BCJ2\n // BCJ2 has 4 inputs, need to map them correctly\n // Standard order: main(LZMA2 output), call(LZMA output), jump(LZMA output), range(raw pack)\n var bcj2InputStart = 0;\n for (var ci3 = 0; ci3 < bcj2CoderIndex; ci3++) {\n bcj2InputStart += folder.coders[ci3].numInStreams;\n }\n\n var bcj2Inputs: Buffer[] = [];\n for (var bi = 0; bi < 4; bi++) {\n var globalIdx = bcj2InputStart + bi;\n\n // Check if this input is bound to a coder output\n var boundOutput = -1;\n for (var bp2 = 0; bp2 < folder.bindPairs.length; bp2++) {\n if (folder.bindPairs[bp2].inIndex === globalIdx) {\n boundOutput = folder.bindPairs[bp2].outIndex;\n break;\n }\n }\n\n if (boundOutput >= 0) {\n // Get from coder outputs\n bcj2Inputs.push(coderOutputs[boundOutput]);\n } else {\n // Get from pack streams\n var psIdx = inputToPackStream[globalIdx];\n bcj2Inputs.push(packStreams[psIdx]);\n }\n }\n\n // Get BCJ2 unpack size\n var bcj2OutputStart = 0;\n for (var co3 = 0; co3 < bcj2CoderIndex; co3++) {\n bcj2OutputStart += folder.coders[co3].numOutStreams;\n }\n var bcj2UnpackSize = folder.unpackSizes[bcj2OutputStart];\n\n // Memory optimization: Clear intermediate buffers to help GC\n // These are no longer needed after bcj2Inputs is built\n for (var key in coderOutputs) {\n delete coderOutputs[key];\n }\n // Clear packStreams array (allows GC to free compressed data)\n packStreams.length = 0;\n\n // Decode BCJ2\n return decodeBcj2Multi(bcj2Inputs, undefined, bcj2UnpackSize);\n }\n\n /**\n * Get processing order for coders (dependency order)\n */\n private getCoderProcessOrder(folder: { coders: { numInStreams: number; numOutStreams: number }[]; bindPairs: { inIndex: number; outIndex: number }[] }, excludeIdx: number): number[] {\n var order: number[] = [];\n var processed: { [key: number]: boolean } = {};\n\n // Simple approach: process coders that don't depend on unprocessed outputs\n var changed = true;\n while (changed) {\n changed = false;\n for (var c = 0; c < folder.coders.length; c++) {\n if (processed[c] || c === excludeIdx) continue;\n\n // Check if all inputs are satisfied\n var inputStart = 0;\n for (var i = 0; i < c; i++) {\n inputStart += folder.coders[i].numInStreams;\n }\n\n var canProcess = true;\n for (var inp = 0; inp < folder.coders[c].numInStreams; inp++) {\n var globalIdx = inputStart + inp;\n // Check if bound to an unprocessed coder\n for (var bp = 0; bp < folder.bindPairs.length; bp++) {\n if (folder.bindPairs[bp].inIndex === globalIdx) {\n // Find which coder produces this output\n var outIdx = folder.bindPairs[bp].outIndex;\n var outStart = 0;\n for (var oc = 0; oc < folder.coders.length; oc++) {\n var numOut = folder.coders[oc].numOutStreams;\n if (outIdx < outStart + numOut) {\n if (!processed[oc] && oc !== excludeIdx) {\n canProcess = false;\n }\n break;\n }\n outStart += numOut;\n }\n }\n }\n }\n\n if (canProcess) {\n order.push(c);\n processed[c] = true;\n changed = true;\n }\n }\n }\n\n return order;\n }\n\n /**\n * Close the parser and release resources\n */\n close(): void {\n if (this.source) {\n this.source.close();\n }\n }\n}\n\n/**\n * Get base name from a path\n */\nfunction getBaseName(path: string): string {\n var lastSlash = path.lastIndexOf('/');\n var lastBackslash = path.lastIndexOf('\\\\');\n var lastSep = Math.max(lastSlash, lastBackslash);\n return lastSep >= 0 ? path.slice(lastSep + 1) : path;\n}\n"],"names":["BufferSource","FileSource","SevenZipParser","major","process","versions","node","split","PassThrough","Stream","require","buffer","read","position","length","slice","getSize","close","fd","size","buf","allocBuffer","bytesRead","fs","readSync","closeSync","_e","source","signature","streamsInfo","filesInfo","entries","parsed","decompressedCache","filesPerFolder","extractedPerFolder","parse","sigBuf","SIGNATURE_HEADER_SIZE","createCodedError","ErrorCode","TRUNCATED_ARCHIVE","parseSignatureHeader","headerOffset","nextHeaderOffset","headerBuf","nextHeaderSize","headerResult","parseEncodedHeader","nextHeaderCRC","err","codedErr","code","COMPRESSED_HEADER","handleCompressedHeader","buildEntries","offset","propertyId","PropertyId","kMainStreamsInfo","kPackInfo","CORRUPT_HEADER","packInfoResult","parseEncodedHeaderStreams","compressedStart","packPos","compressedData","packSize","codec","getCodec","codecId","decompressedHeader","decode","properties","unpackSize","unpackCRC","undefined","actualCRC","crc32","packAreaEnd","searchStart","searchEnd","Math","max","scanChunkSize","searchLoop","chunkStart","chunk","i","min","candidateData","subarray","candidateDecompressed","candCRC","decompOffset","headerId","kHeader","result","parseHeaderContent","kEnd","packPosResult","readNumber","value","numPackResult","kSize","sizeResult","kUnpackInfo","kFolder","numFoldersResult","numCodersResult","flags","idSize","hasAttributes","push","propsLenResult","kCodersUnpackSize","unpackSizeResult","kCRC","allDefined","readUInt32LE","file","createEntry","streamsPerFolder","numUnpackStreamsPerFolder","f","streamIndex","folderIndex","streamInFolder","folderStreamCount","j","fileInfo","hasStream","unpackSizes","entry","_streamIndex","unpackCRCs","_crc","type","isDirectory","mode","attributes","FileAttribute","UNIX_EXTENSION","name","getBaseName","path","mtime","atime","ctime","isAntiFile","_folderIndex","_streamIndexInFolder","_hasStream","getEntries","getEntryStream","emptyStream","end","folder","folders","coders","coder","isCodecSupported","id","codecName","getCodecName","UNSUPPORTED_CODEC","folderIdx","data","getDecompressedFolder","fileStart","m","prevStreamGlobalIndex","fileSize","outputStream","DECOMPRESSION_FAILED","fileData","toString","CRC_MISMATCH","getEntryStreamAsync","callback","getDecompressedFolderAsync","Error","folderHasBcj2","isBcj2Codec","filesInFolder","extractedFromFolder","remainingFiles","shouldCache","decompressBcj2Folder","packStreamIndex","packedStreams","k","packSizes","packedData","data2","l","coderInfo","self","decompressWithStream","input","coderIdx","cb","decoder","createDecoder","chunks","errorOccurred","on","oo","Buffer","concat","decompressChain","idx","output","numPackStreams","packStreams","currentPos","p","coderOutputs","bcj2CoderIndex","c","inputToPackStream","pi","outputToCoder","totalOutputs","co","numOut","numOutStreams","outp","processed","processOrder","getCoderProcessOrder","po","coderInputStart","ci2","numInStreams","inputIdx","packStreamIdx","inputData","outputData","coderOutputStart","co2","bcj2InputStart","ci3","bcj2Inputs","bi","globalIdx","boundOutput","bp2","bindPairs","inIndex","outIndex","psIdx","bcj2OutputStart","co3","bcj2UnpackSize","key","decodeBcj2Multi","excludeIdx","order","changed","inputStart","canProcess","inp","bp","outIdx","outStart","oc","lastSlash","lastIndexOf","lastBackslash","lastSep"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/SevenZipParser.ts"],"sourcesContent":["// SevenZipParser - Main 7z archive parser\n// Handles reading archive structure and providing file streams\n\nimport { allocBuffer, crc32 } from 'extract-base-iterator';\nimport fs from 'fs';\nimport oo from 'on-one';\nimport Stream from 'stream';\nimport { decodeBcj2Multi, getCodec, getCodecName, isBcj2Codec, isCodecSupported } from './codecs/index.ts';\n\n// Use native streams when available, readable-stream only for Node 0.x\nconst major = +process.versions.node.split('.')[0];\nlet PassThrough: typeof Stream.PassThrough;\nif (major > 0) {\n PassThrough = Stream.PassThrough;\n} else {\n PassThrough = require('readable-stream').PassThrough;\n}\ntype Readable = Stream.Readable;\n\nimport { type CodedError, createCodedError, ErrorCode, FileAttribute, PropertyId, SIGNATURE_HEADER_SIZE } from './constants.ts';\nimport { type FileInfo, parseEncodedHeader, parseHeaderContent, parseSignatureHeader, type SignatureHeader, type StreamsInfo } from './headers.ts';\nimport { readNumber } from './NumberCodec.ts';\n\n// Callback type for async operations\ntype DecompressCallback = (err: Error | null, data?: Buffer) => void;\n\n// Entry type for iteration\nexport interface SevenZipEntry {\n name: string;\n path: string;\n type: 'file' | 'directory' | 'link';\n size: number;\n mtime?: Date;\n atime?: Date;\n ctime?: Date;\n mode?: number;\n isAntiFile: boolean;\n // Internal tracking\n _folderIndex: number;\n _streamIndex: number; // Global stream index\n _streamIndexInFolder: number; // Stream index within folder (for solid archives)\n _hasStream: boolean;\n _crc?: number; // Expected CRC32 for this file (if present in archive)\n}\n\n/**\n * Archive source abstraction - allows reading from file descriptor or buffer\n */\nexport interface ArchiveSource {\n read(position: number, length: number): Buffer;\n getSize(): number;\n close(): void;\n}\n\n/**\n * Buffer-based archive source\n */\nexport class BufferSource implements ArchiveSource {\n private buffer: Buffer;\n\n constructor(buffer: Buffer) {\n this.buffer = buffer;\n }\n\n read(position: number, length: number): Buffer {\n return this.buffer.slice(position, position + length);\n }\n\n getSize(): number {\n return this.buffer.length;\n }\n\n close(): void {\n // Nothing to close for buffer\n }\n}\n\n/**\n * File descriptor based archive source\n */\nexport class FileSource implements ArchiveSource {\n private fd: number;\n private size: number;\n\n constructor(fd: number, size: number) {\n this.fd = fd;\n this.size = size;\n }\n\n read(position: number, length: number): Buffer {\n const buf = allocBuffer(length);\n const bytesRead = fs.readSync(this.fd, buf, 0, length, position);\n if (bytesRead < length) {\n return buf.slice(0, bytesRead);\n }\n return buf;\n }\n\n getSize(): number {\n return this.size;\n }\n\n close(): void {\n try {\n fs.closeSync(this.fd);\n } catch (_e) {\n // Ignore close errors\n }\n }\n}\n\n/**\n * SevenZipParser - parses 7z archives and provides entry iteration\n */\nexport class SevenZipParser {\n private source: ArchiveSource;\n private signature: SignatureHeader | null = null;\n private streamsInfo: StreamsInfo | null = null;\n private filesInfo: FileInfo[] = [];\n private entries: SevenZipEntry[] = [];\n private parsed = false;\n // Smart cache for decompressed solid blocks\n // Only caches when multiple files share a block, releases when last file extracted\n private decompressedCache: { [key: number]: Buffer } = {};\n // Track files per folder and how many have been extracted\n private filesPerFolder: { [key: number]: number } = {};\n private extractedPerFolder: { [key: number]: number } = {};\n\n constructor(source: ArchiveSource) {\n this.source = source;\n }\n\n /**\n * Parse the archive structure\n * Must be called before iterating entries\n */\n parse(): void {\n if (this.parsed) return;\n\n // Read signature header\n const sigBuf = this.source.read(0, SIGNATURE_HEADER_SIZE);\n if (sigBuf.length < SIGNATURE_HEADER_SIZE) {\n throw createCodedError('Archive too small', ErrorCode.TRUNCATED_ARCHIVE);\n }\n\n this.signature = parseSignatureHeader(sigBuf);\n\n // Read encoded header\n const headerOffset = SIGNATURE_HEADER_SIZE + this.signature.nextHeaderOffset;\n const headerBuf = this.source.read(headerOffset, this.signature.nextHeaderSize);\n\n if (headerBuf.length < this.signature.nextHeaderSize) {\n throw createCodedError('Truncated header', ErrorCode.TRUNCATED_ARCHIVE);\n }\n\n // Parse encoded header (may need decompression)\n try {\n const headerResult = parseEncodedHeader(headerBuf, this.signature.nextHeaderCRC);\n this.streamsInfo = headerResult.streamsInfo || null;\n this.filesInfo = headerResult.filesInfo;\n } catch (err: unknown) {\n const codedErr = err as CodedError;\n if (codedErr && codedErr.code === ErrorCode.COMPRESSED_HEADER) {\n // Header is compressed - need to decompress first\n this.handleCompressedHeader(headerBuf);\n } else {\n throw err;\n }\n }\n\n // Build entries list\n this.buildEntries();\n this.parsed = true;\n }\n\n /**\n * Handle compressed header (kEncodedHeader)\n */\n private handleCompressedHeader(headerBuf: Buffer): void {\n // Parse the encoded header info to get decompression parameters\n let offset = 1; // Skip kEncodedHeader byte\n\n // Should have StreamsInfo for the header itself\n const propertyId = headerBuf[offset++];\n if (propertyId !== PropertyId.kMainStreamsInfo && propertyId !== PropertyId.kPackInfo) {\n throw createCodedError('Expected StreamsInfo in encoded header', ErrorCode.CORRUPT_HEADER);\n }\n\n // For now, we parse the streams info from the encoded header block\n // This tells us how to decompress the actual header\n\n // Read pack info from the encoded header structure\n const packInfoResult = this.parseEncodedHeaderStreams(headerBuf, 1);\n\n // Calculate compressed header position\n // For simple archives: header is at SIGNATURE_HEADER_SIZE + packPos\n // For BCJ2/complex archives: header may be at the END of pack data area\n // The pack data area ends at nextHeaderOffset (where encoded header starts)\n const compressedStart = SIGNATURE_HEADER_SIZE + packInfoResult.packPos;\n const compressedData = this.source.read(compressedStart, packInfoResult.packSize);\n\n // Decompress using the specified codec\n const codec = getCodec(packInfoResult.codecId);\n let decompressedHeader: Buffer | null = null;\n\n // Try decompressing from the calculated position first\n try {\n decompressedHeader = codec.decode(compressedData, packInfoResult.properties, packInfoResult.unpackSize);\n // Verify CRC if present\n if (packInfoResult.unpackCRC !== undefined) {\n const actualCRC = crc32(decompressedHeader);\n if (actualCRC !== packInfoResult.unpackCRC) {\n decompressedHeader = null; // CRC mismatch, need to search\n }\n }\n } catch {\n decompressedHeader = null; // Decompression failed, need to search\n }\n\n // If initial decompression failed, search for the correct position as a fallback\n // This handles edge cases where packPos doesn't point directly to header pack data\n if (decompressedHeader === null && this.signature) {\n const packAreaEnd = SIGNATURE_HEADER_SIZE + this.signature.nextHeaderOffset;\n const searchStart = packAreaEnd - packInfoResult.packSize;\n const searchEnd = Math.max(SIGNATURE_HEADER_SIZE, compressedStart - 100000);\n\n // Scan for LZMA data starting with 0x00 (range coder init)\n // Try each candidate and validate with CRC\n const scanChunkSize = 4096;\n searchLoop: for (let chunkStart = searchStart; chunkStart >= searchEnd; chunkStart -= scanChunkSize) {\n const chunk = this.source.read(chunkStart, scanChunkSize + packInfoResult.packSize);\n for (let i = 0; i < Math.min(chunk.length, scanChunkSize); i++) {\n if (chunk[i] === 0x00) {\n const candidateData = chunk.subarray(i, i + packInfoResult.packSize);\n if (candidateData.length === packInfoResult.packSize) {\n try {\n const candidateDecompressed = codec.decode(candidateData, packInfoResult.properties, packInfoResult.unpackSize);\n if (packInfoResult.unpackCRC !== undefined) {\n const candCRC = crc32(candidateDecompressed);\n if (candCRC === packInfoResult.unpackCRC) {\n decompressedHeader = candidateDecompressed;\n break searchLoop;\n }\n } else {\n decompressedHeader = candidateDecompressed;\n break searchLoop;\n }\n } catch {\n // Decompression failed, continue searching\n }\n }\n }\n }\n }\n }\n\n if (decompressedHeader === null) {\n throw createCodedError('Failed to decompress header - could not find valid LZMA data', ErrorCode.CORRUPT_HEADER);\n }\n\n // Now parse the decompressed header\n // It should start with kHeader\n let decompOffset = 0;\n const headerId = decompressedHeader[decompOffset++];\n if (headerId !== PropertyId.kHeader) {\n throw createCodedError('Expected kHeader in decompressed header', ErrorCode.CORRUPT_HEADER);\n }\n\n // Parse the decompressed header using shared function from headers.ts\n const result = parseHeaderContent(decompressedHeader, decompOffset);\n this.streamsInfo = result.streamsInfo || null;\n this.filesInfo = result.filesInfo;\n }\n\n /**\n * Parse streams info from encoded header block\n * This is a simplified parser for the header's own compression info\n */\n private parseEncodedHeaderStreams(\n buf: Buffer,\n offset: number\n ): {\n packPos: number;\n packSize: number;\n unpackSize: number;\n codecId: number[];\n properties?: Buffer;\n unpackCRC?: number;\n } {\n // This is a simplified parser for the encoded header's own streams info\n let packPos = 0;\n let packSize = 0;\n let unpackSize = 0;\n let codecId: number[] = [];\n let properties: Buffer | undefined;\n let unpackCRC: number | undefined;\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n switch (propertyId) {\n case PropertyId.kPackInfo: {\n const packPosResult = readNumber(buf, offset);\n packPos = packPosResult.value;\n offset += packPosResult.bytesRead;\n\n const numPackResult = readNumber(buf, offset);\n offset += numPackResult.bytesRead;\n\n // Read until kEnd\n while (buf[offset] !== PropertyId.kEnd) {\n if (buf[offset] === PropertyId.kSize) {\n offset++;\n const sizeResult = readNumber(buf, offset);\n packSize = sizeResult.value;\n offset += sizeResult.bytesRead;\n } else {\n offset++;\n }\n }\n offset++; // Skip kEnd\n break;\n }\n\n case PropertyId.kUnpackInfo:\n // Find folder/coder info\n while (offset < buf.length && buf[offset] !== PropertyId.kEnd) {\n if (buf[offset] === PropertyId.kFolder) {\n offset++;\n const numFoldersResult = readNumber(buf, offset);\n offset += numFoldersResult.bytesRead;\n offset++; // external flag\n\n // Parse coder\n const numCodersResult = readNumber(buf, offset);\n offset += numCodersResult.bytesRead;\n\n const flags = buf[offset++];\n const idSize = flags & 0x0f;\n const hasAttributes = (flags & 0x20) !== 0;\n\n codecId = [];\n for (let i = 0; i < idSize; i++) {\n codecId.push(buf[offset++]);\n }\n\n if (hasAttributes) {\n const propsLenResult = readNumber(buf, offset);\n offset += propsLenResult.bytesRead;\n properties = buf.slice(offset, offset + propsLenResult.value);\n offset += propsLenResult.value;\n }\n } else if (buf[offset] === PropertyId.kCodersUnpackSize) {\n offset++;\n // Read unpack size - needed for LZMA decoder\n const unpackSizeResult = readNumber(buf, offset);\n unpackSize = unpackSizeResult.value;\n offset += unpackSizeResult.bytesRead;\n } else if (buf[offset] === PropertyId.kCRC) {\n offset++;\n const allDefined = buf[offset++];\n if (allDefined) {\n unpackCRC = buf.readUInt32LE(offset);\n offset += 4;\n }\n } else {\n offset++;\n }\n }\n if (buf[offset] === PropertyId.kEnd) offset++;\n break;\n }\n }\n\n return { packPos: packPos, packSize: packSize, unpackSize: unpackSize, codecId: codecId, properties: properties, unpackCRC: unpackCRC };\n }\n\n /**\n * Build the entries list from parsed file info\n */\n private buildEntries(): void {\n this.entries = [];\n\n if (!this.streamsInfo) {\n // No streams info - just create entries from file info\n for (let i = 0; i < this.filesInfo.length; i++) {\n const file = this.filesInfo[i];\n this.entries.push(this.createEntry(file, 0, 0, 0));\n }\n return;\n }\n\n // Use the properly parsed numUnpackStreamsPerFolder from the archive header\n const streamsPerFolder = this.streamsInfo.numUnpackStreamsPerFolder;\n\n // Initialize files per folder count (for smart caching)\n for (let f = 0; f < streamsPerFolder.length; f++) {\n this.filesPerFolder[f] = streamsPerFolder[f];\n this.extractedPerFolder[f] = 0;\n }\n\n // Now build entries with proper folder/stream tracking\n let streamIndex = 0;\n let folderIndex = 0;\n let streamInFolder = 0;\n let folderStreamCount = streamsPerFolder[0] || 0;\n\n for (let j = 0; j < this.filesInfo.length; j++) {\n const fileInfo = this.filesInfo[j];\n\n // Get size from unpackSizes for files with streams\n let size = 0;\n if (fileInfo.hasStream && streamIndex < this.streamsInfo.unpackSizes.length) {\n size = this.streamsInfo.unpackSizes[streamIndex];\n }\n\n const entry = this.createEntry(fileInfo, size, folderIndex, streamInFolder);\n entry._streamIndex = streamIndex;\n // Set CRC if available\n if (fileInfo.hasStream && this.streamsInfo.unpackCRCs && this.streamsInfo.unpackCRCs[streamIndex] !== undefined) {\n entry._crc = this.streamsInfo.unpackCRCs[streamIndex];\n }\n this.entries.push(entry);\n\n // Advance stream tracking for files with streams\n if (fileInfo.hasStream) {\n streamIndex++;\n streamInFolder++;\n\n // Check if we've exhausted streams in this folder\n if (streamInFolder >= folderStreamCount) {\n folderIndex++;\n streamInFolder = 0;\n folderStreamCount = streamsPerFolder[folderIndex] || 0;\n }\n }\n }\n }\n\n /**\n * Create an entry from file info\n */\n private createEntry(file: FileInfo, size: number, folderIndex: number, streamInFolder: number): SevenZipEntry {\n // Determine entry type\n // Note: 7z format doesn't natively support symlinks. p7zip with -snl stores\n // symlinks as regular files with the target path as content.\n let type: 'file' | 'directory' | 'link' = 'file';\n if (file.isDirectory) {\n type = 'directory';\n }\n\n // Calculate mode from Windows attributes\n let mode: number | undefined;\n if (file.attributes !== undefined) {\n // Check for Unix extension bit\n if ((file.attributes & FileAttribute.UNIX_EXTENSION) !== 0) {\n mode = (file.attributes >>> 16) & 0xffff;\n // Check for symlink (S_IFLNK = 0xA000)\n // Note: Most 7z implementations don't preserve symlink mode bits\n if ((mode & 0xf000) === 0xa000) {\n type = 'link';\n }\n } else if (file.isDirectory) {\n mode = 493; // 0o755\n } else {\n mode = 420; // 0o644\n }\n }\n\n return {\n name: getBaseName(file.name),\n path: file.name,\n type: type,\n size: size,\n mtime: file.mtime,\n atime: file.atime,\n ctime: file.ctime,\n mode: mode,\n isAntiFile: file.isAntiFile,\n _folderIndex: folderIndex,\n _streamIndex: 0, // Set by caller\n _streamIndexInFolder: streamInFolder,\n _hasStream: file.hasStream,\n };\n }\n\n /**\n * Get the list of entries\n */\n getEntries(): SevenZipEntry[] {\n if (!this.parsed) {\n this.parse();\n }\n return this.entries;\n }\n\n /**\n * Get a readable stream for an entry's content\n */\n getEntryStream(entry: SevenZipEntry): Readable {\n if (!entry._hasStream || entry.type === 'directory') {\n // Return empty stream for directories and empty files\n const emptyStream = new PassThrough();\n emptyStream.end();\n return emptyStream;\n }\n\n if (!this.streamsInfo) {\n throw createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER);\n }\n\n // Get folder info\n const folder = this.streamsInfo.folders[entry._folderIndex];\n if (!folder) {\n throw createCodedError('Invalid folder index', ErrorCode.CORRUPT_HEADER);\n }\n\n // Check codec support\n for (let i = 0; i < folder.coders.length; i++) {\n const coder = folder.coders[i];\n if (!isCodecSupported(coder.id)) {\n const codecName = getCodecName(coder.id);\n throw createCodedError(`Unsupported codec: ${codecName}`, ErrorCode.UNSUPPORTED_CODEC);\n }\n }\n\n // Get decompressed data for this folder (with smart caching)\n const folderIdx = entry._folderIndex;\n const data = this.getDecompressedFolder(folderIdx);\n\n // Calculate file offset within the decompressed block\n // For solid archives, multiple files are concatenated in the block\n let fileStart = 0;\n for (let m = 0; m < entry._streamIndexInFolder; m++) {\n // Sum sizes of all streams before this one in the folder\n const prevStreamGlobalIndex = entry._streamIndex - entry._streamIndexInFolder + m;\n fileStart += this.streamsInfo.unpackSizes[prevStreamGlobalIndex];\n }\n\n const fileSize = entry.size;\n\n // Create a PassThrough stream with the file data\n const outputStream = new PassThrough();\n\n // Bounds check to prevent \"oob\" error on older Node versions\n if (fileStart + fileSize > data.length) {\n throw createCodedError(`File data out of bounds: offset ${fileStart} + size ${fileSize} > decompressed length ${data.length}`, ErrorCode.DECOMPRESSION_FAILED);\n }\n\n const fileData = data.slice(fileStart, fileStart + fileSize);\n\n // Verify CRC if present\n if (entry._crc !== undefined) {\n const actualCRC = crc32(fileData);\n if (actualCRC !== entry._crc) {\n throw createCodedError(`CRC mismatch for ${entry.path}: expected ${entry._crc.toString(16)}, got ${actualCRC.toString(16)}`, ErrorCode.CRC_MISMATCH);\n }\n }\n\n outputStream.end(fileData);\n\n // Track extraction and release cache when all files from this folder are done\n this.extractedPerFolder[folderIdx] = (this.extractedPerFolder[folderIdx] || 0) + 1;\n if (this.extractedPerFolder[folderIdx] >= this.filesPerFolder[folderIdx]) {\n // All files from this folder extracted, release cache\n delete this.decompressedCache[folderIdx];\n }\n\n return outputStream;\n }\n\n /**\n * Get a readable stream for an entry's content (callback-based async version)\n * Uses streaming decompression for non-blocking I/O\n */\n getEntryStreamAsync(entry: SevenZipEntry, callback: (err: Error | null, stream?: Readable) => void): void {\n if (!entry._hasStream || entry.type === 'directory') {\n // Return empty stream for directories and empty files\n const emptyStream = new PassThrough();\n emptyStream.end();\n callback(null, emptyStream);\n return;\n }\n\n if (!this.streamsInfo) {\n callback(createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER));\n return;\n }\n\n // Get folder info\n const folder = this.streamsInfo.folders[entry._folderIndex];\n if (!folder) {\n callback(createCodedError('Invalid folder index', ErrorCode.CORRUPT_HEADER));\n return;\n }\n\n // Check codec support\n for (let i = 0; i < folder.coders.length; i++) {\n const coder = folder.coders[i];\n if (!isCodecSupported(coder.id)) {\n const codecName = getCodecName(coder.id);\n callback(createCodedError(`Unsupported codec: ${codecName}`, ErrorCode.UNSUPPORTED_CODEC));\n return;\n }\n }\n\n // Get decompressed data for this folder using async method\n const folderIdx = entry._folderIndex;\n const streamsInfo = this.streamsInfo;\n\n this.getDecompressedFolderAsync(folderIdx, (err, data) => {\n if (err) return callback(err);\n if (!data) return callback(new Error('No data returned from decompression'));\n\n // Calculate file offset within the decompressed block\n let fileStart = 0;\n for (let m = 0; m < entry._streamIndexInFolder; m++) {\n const prevStreamGlobalIndex = entry._streamIndex - entry._streamIndexInFolder + m;\n fileStart += streamsInfo.unpackSizes[prevStreamGlobalIndex];\n }\n\n const fileSize = entry.size;\n\n // Bounds check\n if (fileStart + fileSize > data.length) {\n return callback(createCodedError(`File data out of bounds: offset ${fileStart} + size ${fileSize} > decompressed length ${data.length}`, ErrorCode.DECOMPRESSION_FAILED));\n }\n\n // Create a PassThrough stream with the file data\n const outputStream = new PassThrough();\n const fileData = data.slice(fileStart, fileStart + fileSize);\n\n // Verify CRC if present\n if (entry._crc !== undefined) {\n const actualCRC = crc32(fileData);\n if (actualCRC !== entry._crc) {\n return callback(createCodedError(`CRC mismatch for ${entry.path}: expected ${entry._crc.toString(16)}, got ${actualCRC.toString(16)}`, ErrorCode.CRC_MISMATCH));\n }\n }\n\n outputStream.end(fileData);\n\n // Track extraction and release cache when all files from this folder are done\n this.extractedPerFolder[folderIdx] = (this.extractedPerFolder[folderIdx] || 0) + 1;\n if (this.extractedPerFolder[folderIdx] >= this.filesPerFolder[folderIdx]) {\n delete this.decompressedCache[folderIdx];\n }\n\n callback(null, outputStream);\n });\n }\n\n /**\n * Check if a folder uses BCJ2 codec\n */\n private folderHasBcj2(folder: { coders: { id: number[] }[] }): boolean {\n for (let i = 0; i < folder.coders.length; i++) {\n if (isBcj2Codec(folder.coders[i].id)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Get decompressed data for a folder, with smart caching for solid archives\n * Only caches when multiple files share a block, releases when last file extracted\n */\n private getDecompressedFolder(folderIndex: number): Buffer {\n // Check cache first\n if (this.decompressedCache[folderIndex]) {\n return this.decompressedCache[folderIndex];\n }\n\n if (!this.streamsInfo) {\n throw createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER);\n }\n\n const folder = this.streamsInfo.folders[folderIndex];\n\n // Check how many files remain in this folder\n const filesInFolder = this.filesPerFolder[folderIndex] || 1;\n const extractedFromFolder = this.extractedPerFolder[folderIndex] || 0;\n const remainingFiles = filesInFolder - extractedFromFolder;\n // Only cache if more than 1 file remains (including the current one being extracted)\n const shouldCache = remainingFiles > 1;\n\n // Check if this folder uses BCJ2 (requires special multi-stream handling)\n if (this.folderHasBcj2(folder)) {\n const data = this.decompressBcj2Folder(folderIndex);\n if (shouldCache) {\n this.decompressedCache[folderIndex] = data;\n }\n return data;\n }\n\n // Calculate packed data position\n let packPos = SIGNATURE_HEADER_SIZE + this.streamsInfo.packPos;\n\n // Find which pack stream this folder uses\n let packStreamIndex = 0;\n for (let j = 0; j < folderIndex; j++) {\n packStreamIndex += this.streamsInfo.folders[j].packedStreams.length;\n }\n\n // Calculate position of this pack stream\n for (let k = 0; k < packStreamIndex; k++) {\n packPos += this.streamsInfo.packSizes[k];\n }\n\n const packSize = this.streamsInfo.packSizes[packStreamIndex];\n\n // Read packed data\n const packedData = this.source.read(packPos, packSize);\n\n // Decompress through codec chain\n let data2 = packedData;\n for (let l = 0; l < folder.coders.length; l++) {\n const coderInfo = folder.coders[l];\n const codec = getCodec(coderInfo.id);\n // Get unpack size for this coder (needed by LZMA)\n const unpackSize = folder.unpackSizes[l];\n data2 = codec.decode(data2, coderInfo.properties, unpackSize);\n }\n\n // Cache only if more files remain in this folder\n if (shouldCache) {\n this.decompressedCache[folderIndex] = data2;\n }\n\n return data2;\n }\n\n /**\n * Get decompressed data for a folder using streaming (callback-based async)\n * Uses createDecoder() streams for non-blocking decompression\n */\n private getDecompressedFolderAsync(folderIndex: number, callback: DecompressCallback): void {\n const self = this;\n\n // Check cache first\n if (this.decompressedCache[folderIndex]) {\n callback(null, this.decompressedCache[folderIndex]);\n return;\n }\n\n if (!this.streamsInfo) {\n callback(createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER));\n return;\n }\n\n const folder = this.streamsInfo.folders[folderIndex];\n\n // Check how many files remain in this folder\n const filesInFolder = this.filesPerFolder[folderIndex] || 1;\n const extractedFromFolder = this.extractedPerFolder[folderIndex] || 0;\n const remainingFiles = filesInFolder - extractedFromFolder;\n const shouldCache = remainingFiles > 1;\n\n // BCJ2 requires special handling - use sync version for now\n // TODO: Add async BCJ2 support\n if (this.folderHasBcj2(folder)) {\n try {\n const data = this.decompressBcj2Folder(folderIndex);\n if (shouldCache) {\n this.decompressedCache[folderIndex] = data;\n }\n callback(null, data);\n } catch (err) {\n callback(err as Error);\n }\n return;\n }\n\n // Calculate packed data position\n let packPos = SIGNATURE_HEADER_SIZE + this.streamsInfo.packPos;\n\n // Find which pack stream this folder uses\n let packStreamIndex = 0;\n for (let j = 0; j < folderIndex; j++) {\n packStreamIndex += this.streamsInfo.folders[j].packedStreams.length;\n }\n\n // Calculate position of this pack stream\n for (let k = 0; k < packStreamIndex; k++) {\n packPos += this.streamsInfo.packSizes[k];\n }\n\n const packSize = this.streamsInfo.packSizes[packStreamIndex];\n\n // Read packed data\n const packedData = this.source.read(packPos, packSize);\n\n // Create decoder stream chain and decompress\n const coders = folder.coders;\n const unpackSizes = folder.unpackSizes;\n\n // Helper to decompress through a single codec stream\n function decompressWithStream(input: Buffer, coderIdx: number, cb: DecompressCallback): void {\n const coderInfo = coders[coderIdx];\n const codec = getCodec(coderInfo.id);\n const decoder = codec.createDecoder(coderInfo.properties, unpackSizes[coderIdx]);\n\n const chunks: Buffer[] = [];\n let errorOccurred = false;\n\n decoder.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n oo(decoder, ['error', 'end', 'close', 'finish'], (err?: Error) => {\n if (errorOccurred) return;\n if (err) {\n errorOccurred = true;\n return cb(err);\n }\n cb(null, Buffer.concat(chunks));\n });\n\n // Write input data to decoder and signal end\n decoder.end(input);\n }\n\n // Chain decompression through all codecs\n function decompressChain(input: Buffer, idx: number): void {\n if (idx >= coders.length) {\n // All done - cache and return\n if (shouldCache) {\n self.decompressedCache[folderIndex] = input;\n }\n callback(null, input);\n return;\n }\n\n decompressWithStream(input, idx, (err, output) => {\n if (err) {\n callback(err);\n return;\n }\n decompressChain(output as Buffer, idx + 1);\n });\n }\n\n // Start the chain\n decompressChain(packedData, 0);\n }\n\n /**\n * Decompress a BCJ2 folder with multi-stream handling\n * BCJ2 uses 4 input streams: main, call, jump, range coder\n */\n private decompressBcj2Folder(folderIndex: number): Buffer {\n if (!this.streamsInfo) {\n throw createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER);\n }\n\n const folder = this.streamsInfo.folders[folderIndex];\n\n // Calculate starting pack position\n let packPos = SIGNATURE_HEADER_SIZE + this.streamsInfo.packPos;\n\n // Find which pack stream index this folder starts at\n let packStreamIndex = 0;\n for (let j = 0; j < folderIndex; j++) {\n packStreamIndex += this.streamsInfo.folders[j].packedStreams.length;\n }\n\n // Calculate position\n for (let k = 0; k < packStreamIndex; k++) {\n packPos += this.streamsInfo.packSizes[k];\n }\n\n // Read all pack streams for this folder\n const numPackStreams = folder.packedStreams.length;\n const packStreams: Buffer[] = [];\n let currentPos = packPos;\n\n for (let p = 0; p < numPackStreams; p++) {\n const size = this.streamsInfo.packSizes[packStreamIndex + p];\n packStreams.push(this.source.read(currentPos, size));\n currentPos += size;\n }\n\n // Build a map of coder outputs\n // For BCJ2, typical structure is:\n // Coder 0: LZMA2 (main stream) - 1 in, 1 out\n // Coder 1: LZMA (call stream) - 1 in, 1 out\n // Coder 2: LZMA (jump stream) - 1 in, 1 out\n // Coder 3: BCJ2 - 4 in, 1 out\n // Pack streams map to: coder inputs not bound to other coder outputs\n\n // First, decompress each non-BCJ2 coder\n const coderOutputs: { [key: number]: Buffer } = {};\n\n // Find the BCJ2 coder\n let bcj2CoderIndex = -1;\n for (let c = 0; c < folder.coders.length; c++) {\n if (isBcj2Codec(folder.coders[c].id)) {\n bcj2CoderIndex = c;\n break;\n }\n }\n\n if (bcj2CoderIndex === -1) {\n throw createCodedError('BCJ2 coder not found in folder', ErrorCode.CORRUPT_HEADER);\n }\n\n // Build input stream index -> pack stream mapping\n // folder.packedStreams tells us which input indices are unbound and their order\n const inputToPackStream: { [key: number]: number } = {};\n for (let pi = 0; pi < folder.packedStreams.length; pi++) {\n inputToPackStream[folder.packedStreams[pi]] = pi;\n }\n\n // Build output stream index -> coder mapping\n const outputToCoder: { [key: number]: number } = {};\n let totalOutputs = 0;\n for (let co = 0; co < folder.coders.length; co++) {\n const numOut = folder.coders[co].numOutStreams;\n for (let outp = 0; outp < numOut; outp++) {\n outputToCoder[totalOutputs + outp] = co;\n }\n totalOutputs += numOut;\n }\n\n // Decompress non-BCJ2 coders (LZMA, LZMA2)\n // We need to process in dependency order\n const processed: { [key: number]: boolean } = {};\n\n const processOrder = this.getCoderProcessOrder(folder, bcj2CoderIndex);\n\n for (let po = 0; po < processOrder.length; po++) {\n const coderIdx = processOrder[po];\n if (coderIdx === bcj2CoderIndex) continue;\n\n const coder = folder.coders[coderIdx];\n const codec = getCodec(coder.id);\n\n // Find input for this coder\n let coderInputStart = 0;\n for (let ci2 = 0; ci2 < coderIdx; ci2++) {\n coderInputStart += folder.coders[ci2].numInStreams;\n }\n\n // Get input data (from pack stream)\n const inputIdx = coderInputStart;\n const packStreamIdx = inputToPackStream[inputIdx];\n const inputData = packStreams[packStreamIdx];\n\n // Decompress\n const unpackSize = folder.unpackSizes[coderIdx];\n const outputData = codec.decode(inputData, coder.properties, unpackSize);\n\n // Store in coder outputs\n let coderOutputStart = 0;\n for (let co2 = 0; co2 < coderIdx; co2++) {\n coderOutputStart += folder.coders[co2].numOutStreams;\n }\n coderOutputs[coderOutputStart] = outputData;\n processed[coderIdx] = true;\n }\n\n // Now process BCJ2\n // BCJ2 has 4 inputs, need to map them correctly\n // Standard order: main(LZMA2 output), call(LZMA output), jump(LZMA output), range(raw pack)\n let bcj2InputStart = 0;\n for (let ci3 = 0; ci3 < bcj2CoderIndex; ci3++) {\n bcj2InputStart += folder.coders[ci3].numInStreams;\n }\n\n const bcj2Inputs: Buffer[] = [];\n for (let bi = 0; bi < 4; bi++) {\n const globalIdx = bcj2InputStart + bi;\n\n // Check if this input is bound to a coder output\n let boundOutput = -1;\n for (let bp2 = 0; bp2 < folder.bindPairs.length; bp2++) {\n if (folder.bindPairs[bp2].inIndex === globalIdx) {\n boundOutput = folder.bindPairs[bp2].outIndex;\n break;\n }\n }\n\n if (boundOutput >= 0) {\n // Get from coder outputs\n bcj2Inputs.push(coderOutputs[boundOutput]);\n } else {\n // Get from pack streams\n const psIdx = inputToPackStream[globalIdx];\n bcj2Inputs.push(packStreams[psIdx]);\n }\n }\n\n // Get BCJ2 unpack size\n let bcj2OutputStart = 0;\n for (let co3 = 0; co3 < bcj2CoderIndex; co3++) {\n bcj2OutputStart += folder.coders[co3].numOutStreams;\n }\n const bcj2UnpackSize = folder.unpackSizes[bcj2OutputStart];\n\n // Memory optimization: Clear intermediate buffers to help GC\n // These are no longer needed after bcj2Inputs is built\n for (const key in coderOutputs) {\n delete coderOutputs[key];\n }\n // Clear packStreams array (allows GC to free compressed data)\n packStreams.length = 0;\n\n // Decode BCJ2\n return decodeBcj2Multi(bcj2Inputs, undefined, bcj2UnpackSize);\n }\n\n /**\n * Get processing order for coders (dependency order)\n */\n private getCoderProcessOrder(folder: { coders: { numInStreams: number; numOutStreams: number }[]; bindPairs: { inIndex: number; outIndex: number }[] }, excludeIdx: number): number[] {\n const order: number[] = [];\n const processed: { [key: number]: boolean } = {};\n\n // Simple approach: process coders that don't depend on unprocessed outputs\n let changed = true;\n while (changed) {\n changed = false;\n for (let c = 0; c < folder.coders.length; c++) {\n if (processed[c] || c === excludeIdx) continue;\n\n // Check if all inputs are satisfied\n let inputStart = 0;\n for (let i = 0; i < c; i++) {\n inputStart += folder.coders[i].numInStreams;\n }\n\n let canProcess = true;\n for (let inp = 0; inp < folder.coders[c].numInStreams; inp++) {\n const globalIdx = inputStart + inp;\n // Check if bound to an unprocessed coder\n for (let bp = 0; bp < folder.bindPairs.length; bp++) {\n if (folder.bindPairs[bp].inIndex === globalIdx) {\n // Find which coder produces this output\n const outIdx = folder.bindPairs[bp].outIndex;\n let outStart = 0;\n for (let oc = 0; oc < folder.coders.length; oc++) {\n const numOut = folder.coders[oc].numOutStreams;\n if (outIdx < outStart + numOut) {\n if (!processed[oc] && oc !== excludeIdx) {\n canProcess = false;\n }\n break;\n }\n outStart += numOut;\n }\n }\n }\n }\n\n if (canProcess) {\n order.push(c);\n processed[c] = true;\n changed = true;\n }\n }\n }\n\n return order;\n }\n\n /**\n * Close the parser and release resources\n */\n close(): void {\n if (this.source) {\n this.source.close();\n }\n }\n}\n\n/**\n * Get base name from a path\n */\nfunction getBaseName(path: string): string {\n const lastSlash = path.lastIndexOf('/');\n const lastBackslash = path.lastIndexOf('\\\\');\n const lastSep = Math.max(lastSlash, lastBackslash);\n return lastSep >= 0 ? path.slice(lastSep + 1) : path;\n}\n"],"names":["BufferSource","FileSource","SevenZipParser","major","process","versions","node","split","PassThrough","Stream","require","buffer","read","position","length","slice","getSize","close","fd","size","buf","allocBuffer","bytesRead","fs","readSync","closeSync","_e","source","signature","streamsInfo","filesInfo","entries","parsed","decompressedCache","filesPerFolder","extractedPerFolder","parse","sigBuf","SIGNATURE_HEADER_SIZE","createCodedError","ErrorCode","TRUNCATED_ARCHIVE","parseSignatureHeader","headerOffset","nextHeaderOffset","headerBuf","nextHeaderSize","headerResult","parseEncodedHeader","nextHeaderCRC","err","codedErr","code","COMPRESSED_HEADER","handleCompressedHeader","buildEntries","offset","propertyId","PropertyId","kMainStreamsInfo","kPackInfo","CORRUPT_HEADER","packInfoResult","parseEncodedHeaderStreams","compressedStart","packPos","compressedData","packSize","codec","getCodec","codecId","decompressedHeader","decode","properties","unpackSize","unpackCRC","undefined","actualCRC","crc32","packAreaEnd","searchStart","searchEnd","Math","max","scanChunkSize","searchLoop","chunkStart","chunk","i","min","candidateData","subarray","candidateDecompressed","candCRC","decompOffset","headerId","kHeader","result","parseHeaderContent","kEnd","packPosResult","readNumber","value","numPackResult","kSize","sizeResult","kUnpackInfo","kFolder","numFoldersResult","numCodersResult","flags","idSize","hasAttributes","push","propsLenResult","kCodersUnpackSize","unpackSizeResult","kCRC","allDefined","readUInt32LE","file","createEntry","streamsPerFolder","numUnpackStreamsPerFolder","f","streamIndex","folderIndex","streamInFolder","folderStreamCount","j","fileInfo","hasStream","unpackSizes","entry","_streamIndex","unpackCRCs","_crc","type","isDirectory","mode","attributes","FileAttribute","UNIX_EXTENSION","name","getBaseName","path","mtime","atime","ctime","isAntiFile","_folderIndex","_streamIndexInFolder","_hasStream","getEntries","getEntryStream","emptyStream","end","folder","folders","coders","coder","isCodecSupported","id","codecName","getCodecName","UNSUPPORTED_CODEC","folderIdx","data","getDecompressedFolder","fileStart","m","prevStreamGlobalIndex","fileSize","outputStream","DECOMPRESSION_FAILED","fileData","toString","CRC_MISMATCH","getEntryStreamAsync","callback","getDecompressedFolderAsync","Error","folderHasBcj2","isBcj2Codec","filesInFolder","extractedFromFolder","remainingFiles","shouldCache","decompressBcj2Folder","packStreamIndex","packedStreams","k","packSizes","packedData","data2","l","coderInfo","self","decompressWithStream","input","coderIdx","cb","decoder","createDecoder","chunks","errorOccurred","on","oo","Buffer","concat","decompressChain","idx","output","numPackStreams","packStreams","currentPos","p","coderOutputs","bcj2CoderIndex","c","inputToPackStream","pi","outputToCoder","totalOutputs","co","numOut","numOutStreams","outp","processed","processOrder","getCoderProcessOrder","po","coderInputStart","ci2","numInStreams","inputIdx","packStreamIdx","inputData","outputData","coderOutputStart","co2","bcj2InputStart","ci3","bcj2Inputs","bi","globalIdx","boundOutput","bp2","bindPairs","inIndex","outIndex","psIdx","bcj2OutputStart","co3","bcj2UnpackSize","key","decodeBcj2Multi","excludeIdx","order","changed","inputStart","canProcess","inp","bp","outIdx","outStart","oc","lastSlash","lastIndexOf","lastBackslash","lastSep"],"mappings":"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"}
@@ -176,4 +176,4 @@ function decodeAes(input, properties, _unpackSize) {
176
176
  function createAesDecoder(properties, unpackSize) {
177
177
  return (0, _createBufferingDecoderts.default)(decodeAes, properties, unpackSize);
178
178
  }
179
- /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
179
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (let key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Aes.ts"],"sourcesContent":["// 7z AES-256-CBC codec with SHA-256 key derivation\n// Implements password-based decryption for encrypted 7z archives\n//\n// Properties format:\n// Byte 0: bits 0-5 = NumCyclesPower (iterations = 2^NumCyclesPower)\n// bit 6 = IV present flag\n// bit 7 = Salt present flag\n// Byte 1: upper nibble = salt size extension\n// lower nibble = IV size extension\n// Following bytes: salt data, then IV data\n//\n// Key derivation:\n// For each round (2^NumCyclesPower times):\n// hash = SHA256(salt + password_utf16le + round_counter_8bytes)\n// Final key = first 32 bytes of accumulated hash\n\nimport crypto from 'crypto';\nimport { allocBuffer, bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n// Global password storage - set before decryption\nvar _password: string | null = null;\n\n/**\n * Set the password for AES decryption\n */\nexport function setPassword(password: string | null): void {\n _password = password;\n}\n\n/**\n * Get the current password\n */\nexport function getPassword(): string | null {\n return _password;\n}\n\n/**\n * Parse AES properties to extract key derivation parameters\n */\nfunction parseProperties(properties: Buffer): { numCyclesPower: number; salt: Buffer; iv: Buffer } {\n if (!properties || properties.length < 1) {\n throw new Error('AES: missing properties');\n }\n\n var b0 = properties[0];\n var numCyclesPower = b0 & 0x3f;\n\n // Check for special case: no salt/IV flags\n if ((b0 & 0xc0) === 0) {\n // No salt, no IV - use zeros\n return {\n numCyclesPower: numCyclesPower,\n salt: allocBuffer(0),\n iv: allocBuffer(16),\n };\n }\n\n if (properties.length < 2) {\n throw new Error('AES: properties too short');\n }\n\n var b1 = properties[1];\n\n // Calculate sizes\n // saltSize = ((b0 >> 7) & 1) + (b1 >> 4)\n // ivSize = ((b0 >> 6) & 1) + (b1 & 0x0F)\n var saltSize = ((b0 >>> 7) & 1) + (b1 >>> 4);\n var ivSize = ((b0 >>> 6) & 1) + (b1 & 0x0f);\n\n var expectedSize = 2 + saltSize + ivSize;\n if (properties.length < expectedSize) {\n throw new Error('AES: properties too short for salt/IV');\n }\n\n var salt = properties.slice(2, 2 + saltSize);\n var iv = allocBuffer(16);\n\n // Copy IV data (may be less than 16 bytes, rest is zeros)\n var ivData = properties.slice(2 + saltSize, 2 + saltSize + ivSize);\n for (var i = 0; i < ivData.length && i < 16; i++) {\n iv[i] = ivData[i];\n }\n\n return {\n numCyclesPower: numCyclesPower,\n salt: salt,\n iv: iv,\n };\n}\n\n/**\n * Convert password string to UTF-16LE buffer\n */\nfunction passwordToUtf16LE(password: string): Buffer {\n var buf = allocBuffer(password.length * 2);\n for (var i = 0; i < password.length; i++) {\n var code = password.charCodeAt(i);\n buf[i * 2] = code & 0xff;\n buf[i * 2 + 1] = (code >>> 8) & 0xff;\n }\n return buf;\n}\n\n/**\n * Derive AES-256 key from password using 7z's SHA-256 iteration scheme\n *\n * Algorithm:\n * For round = 0 to 2^numCyclesPower - 1:\n * hash.update(salt)\n * hash.update(password_utf16le)\n * hash.update(round as 8-byte little-endian)\n * key = hash.digest()\n */\nfunction deriveKey(password: string, salt: Buffer, numCyclesPower: number): Buffer {\n var passwordBuf = passwordToUtf16LE(password);\n var numRounds = 2 ** numCyclesPower;\n\n // For special case 0x3F, don't iterate\n if (numCyclesPower === 0x3f) {\n // Direct concatenation mode\n var key = allocBuffer(32);\n var offset = 0;\n for (var j = 0; j < salt.length && offset < 32; j++) {\n key[offset++] = salt[j];\n }\n for (var k = 0; k < passwordBuf.length && offset < 32; k++) {\n key[offset++] = passwordBuf[k];\n }\n return key;\n }\n\n // Counter buffer (8 bytes, little-endian)\n var counter = allocBuffer(8);\n\n // Create hash and iterate\n var hash = crypto.createHash('sha256');\n\n for (var round = 0; round < numRounds; round++) {\n // Write round counter as little-endian 64-bit\n counter[0] = round & 0xff;\n counter[1] = (round >>> 8) & 0xff;\n counter[2] = (round >>> 16) & 0xff;\n counter[3] = (round >>> 24) & 0xff;\n // Upper 32 bits - for large round counts\n var high = Math.floor(round / 0x100000000);\n counter[4] = high & 0xff;\n counter[5] = (high >>> 8) & 0xff;\n counter[6] = (high >>> 16) & 0xff;\n counter[7] = (high >>> 24) & 0xff;\n\n hash.update(salt);\n hash.update(passwordBuf);\n hash.update(counter);\n }\n\n return hash.digest() as Buffer;\n}\n\n/**\n * Decode AES-256-CBC encrypted data\n *\n * @param input - Encrypted data\n * @param properties - AES properties (numCyclesPower, salt, IV)\n * @param _unpackSize - Unused\n * @returns Decrypted data\n */\nexport function decodeAes(input: Buffer, properties?: Buffer, _unpackSize?: number): Buffer {\n if (!_password) {\n throw new Error('AES: password required but not set');\n }\n\n if (!properties) {\n throw new Error('AES: properties required');\n }\n\n var params = parseProperties(properties);\n var key = deriveKey(_password, params.salt, params.numCyclesPower);\n\n // Create AES-256-CBC decipher\n var decipher = crypto.createDecipheriv('aes-256-cbc', key, params.iv);\n decipher.setAutoPadding(false); // 7z doesn't use PKCS7 padding\n\n // Node 0.8 returns binary strings, newer Node returns Buffers\n // Use 'binary' encoding for compatibility\n // @ts-expect-error - 'binary' encoding is deprecated but required for Node 0.8 compatibility\n var decStr = decipher.update(input, 'binary', 'binary') + decipher.final('binary');\n var decrypted = bufferFrom(decStr, 'binary' as BufferEncoding);\n\n return decrypted;\n}\n\n/**\n * Create an AES decoder Transform stream\n */\nexport function createAesDecoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeAes, properties, unpackSize);\n}\n"],"names":["createAesDecoder","decodeAes","getPassword","setPassword","_password","password","parseProperties","properties","length","Error","b0","numCyclesPower","salt","allocBuffer","iv","b1","saltSize","ivSize","expectedSize","slice","ivData","i","passwordToUtf16LE","buf","code","charCodeAt","deriveKey","passwordBuf","numRounds","key","offset","j","k","counter","hash","crypto","createHash","round","high","Math","floor","update","digest","input","_unpackSize","params","decipher","createDecipheriv","setAutoPadding","decStr","final","decrypted","bufferFrom","unpackSize","createBufferingDecoder"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Aes.ts"],"sourcesContent":["// 7z AES-256-CBC codec with SHA-256 key derivation\n// Implements password-based decryption for encrypted 7z archives\n//\n// Properties format:\n// Byte 0: bits 0-5 = NumCyclesPower (iterations = 2^NumCyclesPower)\n// bit 6 = IV present flag\n// bit 7 = Salt present flag\n// Byte 1: upper nibble = salt size extension\n// lower nibble = IV size extension\n// Following bytes: salt data, then IV data\n//\n// Key derivation:\n// For each round (2^NumCyclesPower times):\n// hash = SHA256(salt + password_utf16le + round_counter_8bytes)\n// Final key = first 32 bytes of accumulated hash\n\nimport crypto from 'crypto';\nimport { allocBuffer, bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n// Global password storage - set before decryption\nlet _password: string | null = null;\n\n/**\n * Set the password for AES decryption\n */\nexport function setPassword(password: string | null): void {\n _password = password;\n}\n\n/**\n * Get the current password\n */\nexport function getPassword(): string | null {\n return _password;\n}\n\n/**\n * Parse AES properties to extract key derivation parameters\n */\nfunction parseProperties(properties: Buffer): { numCyclesPower: number; salt: Buffer; iv: Buffer } {\n if (!properties || properties.length < 1) {\n throw new Error('AES: missing properties');\n }\n\n const b0 = properties[0];\n const numCyclesPower = b0 & 0x3f;\n\n // Check for special case: no salt/IV flags\n if ((b0 & 0xc0) === 0) {\n // No salt, no IV - use zeros\n return {\n numCyclesPower: numCyclesPower,\n salt: allocBuffer(0),\n iv: allocBuffer(16),\n };\n }\n\n if (properties.length < 2) {\n throw new Error('AES: properties too short');\n }\n\n const b1 = properties[1];\n\n // Calculate sizes\n // saltSize = ((b0 >> 7) & 1) + (b1 >> 4)\n // ivSize = ((b0 >> 6) & 1) + (b1 & 0x0F)\n const saltSize = ((b0 >>> 7) & 1) + (b1 >>> 4);\n const ivSize = ((b0 >>> 6) & 1) + (b1 & 0x0f);\n\n const expectedSize = 2 + saltSize + ivSize;\n if (properties.length < expectedSize) {\n throw new Error('AES: properties too short for salt/IV');\n }\n\n const salt = properties.slice(2, 2 + saltSize);\n const iv = allocBuffer(16);\n\n // Copy IV data (may be less than 16 bytes, rest is zeros)\n const ivData = properties.slice(2 + saltSize, 2 + saltSize + ivSize);\n for (let i = 0; i < ivData.length && i < 16; i++) {\n iv[i] = ivData[i];\n }\n\n return {\n numCyclesPower: numCyclesPower,\n salt: salt,\n iv: iv,\n };\n}\n\n/**\n * Convert password string to UTF-16LE buffer\n */\nfunction passwordToUtf16LE(password: string): Buffer {\n const buf = allocBuffer(password.length * 2);\n for (let i = 0; i < password.length; i++) {\n const code = password.charCodeAt(i);\n buf[i * 2] = code & 0xff;\n buf[i * 2 + 1] = (code >>> 8) & 0xff;\n }\n return buf;\n}\n\n/**\n * Derive AES-256 key from password using 7z's SHA-256 iteration scheme\n *\n * Algorithm:\n * For round = 0 to 2^numCyclesPower - 1:\n * hash.update(salt)\n * hash.update(password_utf16le)\n * hash.update(round as 8-byte little-endian)\n * key = hash.digest()\n */\nfunction deriveKey(password: string, salt: Buffer, numCyclesPower: number): Buffer {\n const passwordBuf = passwordToUtf16LE(password);\n const numRounds = 2 ** numCyclesPower;\n\n // For special case 0x3F, don't iterate\n if (numCyclesPower === 0x3f) {\n // Direct concatenation mode\n const key = allocBuffer(32);\n let offset = 0;\n for (let j = 0; j < salt.length && offset < 32; j++) {\n key[offset++] = salt[j];\n }\n for (let k = 0; k < passwordBuf.length && offset < 32; k++) {\n key[offset++] = passwordBuf[k];\n }\n return key;\n }\n\n // Counter buffer (8 bytes, little-endian)\n const counter = allocBuffer(8);\n\n // Create hash and iterate\n const hash = crypto.createHash('sha256');\n\n for (let round = 0; round < numRounds; round++) {\n // Write round counter as little-endian 64-bit\n counter[0] = round & 0xff;\n counter[1] = (round >>> 8) & 0xff;\n counter[2] = (round >>> 16) & 0xff;\n counter[3] = (round >>> 24) & 0xff;\n // Upper 32 bits - for large round counts\n const high = Math.floor(round / 0x100000000);\n counter[4] = high & 0xff;\n counter[5] = (high >>> 8) & 0xff;\n counter[6] = (high >>> 16) & 0xff;\n counter[7] = (high >>> 24) & 0xff;\n\n hash.update(salt);\n hash.update(passwordBuf);\n hash.update(counter);\n }\n\n return hash.digest() as Buffer;\n}\n\n/**\n * Decode AES-256-CBC encrypted data\n *\n * @param input - Encrypted data\n * @param properties - AES properties (numCyclesPower, salt, IV)\n * @param _unpackSize - Unused\n * @returns Decrypted data\n */\nexport function decodeAes(input: Buffer, properties?: Buffer, _unpackSize?: number): Buffer {\n if (!_password) {\n throw new Error('AES: password required but not set');\n }\n\n if (!properties) {\n throw new Error('AES: properties required');\n }\n\n const params = parseProperties(properties);\n const key = deriveKey(_password, params.salt, params.numCyclesPower);\n\n // Create AES-256-CBC decipher\n const decipher = crypto.createDecipheriv('aes-256-cbc', key, params.iv);\n decipher.setAutoPadding(false); // 7z doesn't use PKCS7 padding\n\n // Node 0.8 returns binary strings, newer Node returns Buffers\n // Use 'binary' encoding for compatibility\n // @ts-expect-error - 'binary' encoding is deprecated but required for Node 0.8 compatibility\n const decStr = decipher.update(input, 'binary', 'binary') + decipher.final('binary');\n const decrypted = bufferFrom(decStr, 'binary' as BufferEncoding);\n\n return decrypted;\n}\n\n/**\n * Create an AES decoder Transform stream\n */\nexport function createAesDecoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeAes, properties, unpackSize);\n}\n"],"names":["createAesDecoder","decodeAes","getPassword","setPassword","_password","password","parseProperties","properties","length","Error","b0","numCyclesPower","salt","allocBuffer","iv","b1","saltSize","ivSize","expectedSize","slice","ivData","i","passwordToUtf16LE","buf","code","charCodeAt","deriveKey","passwordBuf","numRounds","key","offset","j","k","counter","hash","crypto","createHash","round","high","Math","floor","update","digest","input","_unpackSize","params","decipher","createDecipheriv","setAutoPadding","decStr","final","decrypted","bufferFrom","unpackSize","createBufferingDecoder"],"mappings":"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"}
@@ -34,4 +34,4 @@ function decodeBzip2(input, _properties, _unpackSize) {
34
34
  function createBzip2Decoder(properties, unpackSize) {
35
35
  return (0, _createBufferingDecoderts.default)(decodeBzip2, properties, unpackSize);
36
36
  }
37
- /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
37
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (let key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -61,7 +61,7 @@ function decodeBcj(input, _properties, _unpackSize) {
61
61
  var highByte = output[pos + 4];
62
62
  if (highByte === 0x00 || highByte === 0xff) {
63
63
  // Convert absolute to relative
64
- var newAddr;
64
+ var newAddr = void 0;
65
65
  if (highByte === 0x00) {
66
66
  // Positive offset - subtract position
67
67
  newAddr = addr - pos;
@@ -86,4 +86,4 @@ function decodeBcj(input, _properties, _unpackSize) {
86
86
  function createBcjDecoder(properties, unpackSize) {
87
87
  return (0, _createBufferingDecoderts.default)(decodeBcj, properties, unpackSize);
88
88
  }
89
- /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
89
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (let key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Bcj.ts"],"sourcesContent":["// BCJ (x86) filter codec - converts x86 CALL/JMP relative addresses\n// This is a simple filter that makes executables more compressible by LZMA\n//\n// BCJ transforms relative addresses in x86 CALL (0xE8) and JMP (0xE9) instructions\n// to absolute addresses, which creates more repetitive patterns for compression.\n//\n// Reference: https://github.com/jljusten/LZMA-SDK/blob/master/C/Bra86.c\n\nimport { bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n/**\n * Decode BCJ (x86) filtered data\n * Reverses the BCJ transformation by converting absolute addresses back to relative\n *\n * @param input - BCJ filtered data\n * @param _properties - Unused for BCJ\n * @param _unpackSize - Unused for BCJ\n * @returns Unfiltered data\n */\nexport function decodeBcj(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n // BCJ filter state\n var pos = 0;\n var prevMask = 0;\n var output = bufferFrom(input); // Copy since we modify in place\n\n while (pos < output.length - 4) {\n var b = output[pos];\n\n // Check for CALL (0xE8) or JMP (0xE9) opcode\n if (b !== 0xe8 && b !== 0xe9) {\n pos++;\n prevMask = 0;\n continue;\n }\n\n // Check mask to avoid false positives in data\n var offset = pos + 5;\n if (offset > output.length) {\n break;\n }\n\n // Skip if in masked region (previous conversion affected this area)\n if ((prevMask & 1) !== 0) {\n prevMask = (prevMask >> 1) | 4;\n pos++;\n continue;\n }\n\n // Read the 32-bit address (little-endian)\n var addr = output[pos + 1] | (output[pos + 2] << 8) | (output[pos + 3] << 16) | ((output[pos + 4] << 24) >>> 0);\n\n // Check if this looks like a converted address\n // High byte should be 0x00 or 0xFF for typical code\n var highByte = output[pos + 4];\n\n if (highByte === 0x00 || highByte === 0xff) {\n // Convert absolute to relative\n var newAddr: number;\n if (highByte === 0x00) {\n // Positive offset - subtract position\n newAddr = addr - pos;\n } else {\n // Negative offset (0xFF high byte)\n newAddr = addr + pos;\n }\n\n // Write back as little-endian\n output[pos + 1] = newAddr & 0xff;\n output[pos + 2] = (newAddr >>> 8) & 0xff;\n output[pos + 3] = (newAddr >>> 16) & 0xff;\n output[pos + 4] = (newAddr >>> 24) & 0xff;\n\n pos += 5;\n prevMask = 0;\n } else {\n pos++;\n prevMask = 0;\n }\n }\n\n return output;\n}\n\n/**\n * Create a BCJ decoder Transform stream\n */\nexport function createBcjDecoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcj, properties, unpackSize);\n}\n"],"names":["createBcjDecoder","decodeBcj","input","_properties","_unpackSize","pos","prevMask","output","bufferFrom","length","b","offset","addr","highByte","newAddr","properties","unpackSize","createBufferingDecoder"],"mappings":"AAAA,oEAAoE;AACpE,2EAA2E;AAC3E,EAAE;AACF,mFAAmF;AACnF,iFAAiF;AACjF,EAAE;AACF,wEAAwE;;;;;;;;;;;;QAkFxDA;eAAAA;;QAnEAC;eAAAA;;;mCAbW;+EAEQ;;;;;;AAW5B,SAASA,UAAUC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACjF,mBAAmB;IACnB,IAAIC,MAAM;IACV,IAAIC,WAAW;IACf,IAAIC,SAASC,IAAAA,+BAAU,EAACN,QAAQ,gCAAgC;IAEhE,MAAOG,MAAME,OAAOE,MAAM,GAAG,EAAG;QAC9B,IAAIC,IAAIH,MAAM,CAACF,IAAI;QAEnB,6CAA6C;QAC7C,IAAIK,MAAM,QAAQA,MAAM,MAAM;YAC5BL;YACAC,WAAW;YACX;QACF;QAEA,8CAA8C;QAC9C,IAAIK,SAASN,MAAM;QACnB,IAAIM,SAASJ,OAAOE,MAAM,EAAE;YAC1B;QACF;QAEA,oEAAoE;QACpE,IAAI,AAACH,CAAAA,WAAW,CAAA,MAAO,GAAG;YACxBA,WAAW,AAACA,YAAY,IAAK;YAC7BD;YACA;QACF;QAEA,0CAA0C;QAC1C,IAAIO,OAAOL,MAAM,CAACF,MAAM,EAAE,GAAIE,MAAM,CAACF,MAAM,EAAE,IAAI,IAAME,MAAM,CAACF,MAAM,EAAE,IAAI,KAAO,AAACE,MAAM,CAACF,MAAM,EAAE,IAAI,OAAQ;QAE7G,+CAA+C;QAC/C,oDAAoD;QACpD,IAAIQ,WAAWN,MAAM,CAACF,MAAM,EAAE;QAE9B,IAAIQ,aAAa,QAAQA,aAAa,MAAM;YAC1C,+BAA+B;YAC/B,IAAIC;YACJ,IAAID,aAAa,MAAM;gBACrB,sCAAsC;gBACtCC,UAAUF,OAAOP;YACnB,OAAO;gBACL,mCAAmC;gBACnCS,UAAUF,OAAOP;YACnB;YAEA,8BAA8B;YAC9BE,MAAM,CAACF,MAAM,EAAE,GAAGS,UAAU;YAC5BP,MAAM,CAACF,MAAM,EAAE,GAAG,AAACS,YAAY,IAAK;YACpCP,MAAM,CAACF,MAAM,EAAE,GAAG,AAACS,YAAY,KAAM;YACrCP,MAAM,CAACF,MAAM,EAAE,GAAG,AAACS,YAAY,KAAM;YAErCT,OAAO;YACPC,WAAW;QACb,OAAO;YACLD;YACAC,WAAW;QACb;IACF;IAEA,OAAOC;AACT;AAKO,SAASP,iBAAiBe,UAAmB,EAAEC,UAAmB;IACvE,OAAOC,IAAAA,iCAAsB,EAAChB,WAAWc,YAAYC;AACvD"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Bcj.ts"],"sourcesContent":["// BCJ (x86) filter codec - converts x86 CALL/JMP relative addresses\n// This is a simple filter that makes executables more compressible by LZMA\n//\n// BCJ transforms relative addresses in x86 CALL (0xE8) and JMP (0xE9) instructions\n// to absolute addresses, which creates more repetitive patterns for compression.\n//\n// Reference: https://github.com/jljusten/LZMA-SDK/blob/master/C/Bra86.c\n\nimport { bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n/**\n * Decode BCJ (x86) filtered data\n * Reverses the BCJ transformation by converting absolute addresses back to relative\n *\n * @param input - BCJ filtered data\n * @param _properties - Unused for BCJ\n * @param _unpackSize - Unused for BCJ\n * @returns Unfiltered data\n */\nexport function decodeBcj(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n // BCJ filter state\n let pos = 0;\n let prevMask = 0;\n const output = bufferFrom(input); // Copy since we modify in place\n\n while (pos < output.length - 4) {\n const b = output[pos];\n\n // Check for CALL (0xE8) or JMP (0xE9) opcode\n if (b !== 0xe8 && b !== 0xe9) {\n pos++;\n prevMask = 0;\n continue;\n }\n\n // Check mask to avoid false positives in data\n const offset = pos + 5;\n if (offset > output.length) {\n break;\n }\n\n // Skip if in masked region (previous conversion affected this area)\n if ((prevMask & 1) !== 0) {\n prevMask = (prevMask >> 1) | 4;\n pos++;\n continue;\n }\n\n // Read the 32-bit address (little-endian)\n const addr = output[pos + 1] | (output[pos + 2] << 8) | (output[pos + 3] << 16) | ((output[pos + 4] << 24) >>> 0);\n\n // Check if this looks like a converted address\n // High byte should be 0x00 or 0xFF for typical code\n const highByte = output[pos + 4];\n\n if (highByte === 0x00 || highByte === 0xff) {\n // Convert absolute to relative\n let newAddr: number;\n if (highByte === 0x00) {\n // Positive offset - subtract position\n newAddr = addr - pos;\n } else {\n // Negative offset (0xFF high byte)\n newAddr = addr + pos;\n }\n\n // Write back as little-endian\n output[pos + 1] = newAddr & 0xff;\n output[pos + 2] = (newAddr >>> 8) & 0xff;\n output[pos + 3] = (newAddr >>> 16) & 0xff;\n output[pos + 4] = (newAddr >>> 24) & 0xff;\n\n pos += 5;\n prevMask = 0;\n } else {\n pos++;\n prevMask = 0;\n }\n }\n\n return output;\n}\n\n/**\n * Create a BCJ decoder Transform stream\n */\nexport function createBcjDecoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcj, properties, unpackSize);\n}\n"],"names":["createBcjDecoder","decodeBcj","input","_properties","_unpackSize","pos","prevMask","output","bufferFrom","length","b","offset","addr","highByte","newAddr","properties","unpackSize","createBufferingDecoder"],"mappings":"AAAA,oEAAoE;AACpE,2EAA2E;AAC3E,EAAE;AACF,mFAAmF;AACnF,iFAAiF;AACjF,EAAE;AACF,wEAAwE;;;;;;;;;;;;QAkFxDA;eAAAA;;QAnEAC;eAAAA;;;mCAbW;+EAEQ;;;;;;AAW5B,SAASA,UAAUC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACjF,mBAAmB;IACnB,IAAIC,MAAM;IACV,IAAIC,WAAW;IACf,IAAMC,SAASC,IAAAA,+BAAU,EAACN,QAAQ,gCAAgC;IAElE,MAAOG,MAAME,OAAOE,MAAM,GAAG,EAAG;QAC9B,IAAMC,IAAIH,MAAM,CAACF,IAAI;QAErB,6CAA6C;QAC7C,IAAIK,MAAM,QAAQA,MAAM,MAAM;YAC5BL;YACAC,WAAW;YACX;QACF;QAEA,8CAA8C;QAC9C,IAAMK,SAASN,MAAM;QACrB,IAAIM,SAASJ,OAAOE,MAAM,EAAE;YAC1B;QACF;QAEA,oEAAoE;QACpE,IAAI,AAACH,CAAAA,WAAW,CAAA,MAAO,GAAG;YACxBA,WAAW,AAACA,YAAY,IAAK;YAC7BD;YACA;QACF;QAEA,0CAA0C;QAC1C,IAAMO,OAAOL,MAAM,CAACF,MAAM,EAAE,GAAIE,MAAM,CAACF,MAAM,EAAE,IAAI,IAAME,MAAM,CAACF,MAAM,EAAE,IAAI,KAAO,AAACE,MAAM,CAACF,MAAM,EAAE,IAAI,OAAQ;QAE/G,+CAA+C;QAC/C,oDAAoD;QACpD,IAAMQ,WAAWN,MAAM,CAACF,MAAM,EAAE;QAEhC,IAAIQ,aAAa,QAAQA,aAAa,MAAM;YAC1C,+BAA+B;YAC/B,IAAIC,UAAAA,KAAAA;YACJ,IAAID,aAAa,MAAM;gBACrB,sCAAsC;gBACtCC,UAAUF,OAAOP;YACnB,OAAO;gBACL,mCAAmC;gBACnCS,UAAUF,OAAOP;YACnB;YAEA,8BAA8B;YAC9BE,MAAM,CAACF,MAAM,EAAE,GAAGS,UAAU;YAC5BP,MAAM,CAACF,MAAM,EAAE,GAAG,AAACS,YAAY,IAAK;YACpCP,MAAM,CAACF,MAAM,EAAE,GAAG,AAACS,YAAY,KAAM;YACrCP,MAAM,CAACF,MAAM,EAAE,GAAG,AAACS,YAAY,KAAM;YAErCT,OAAO;YACPC,WAAW;QACb,OAAO;YACLD;YACAC,WAAW;QACb;IACF;IAEA,OAAOC;AACT;AAKO,SAASP,iBAAiBe,UAAmB,EAAEC,UAAmB;IACvE,OAAOC,IAAAA,iCAAsB,EAAChB,WAAWc,YAAYC;AACvD"}
@@ -211,4 +211,4 @@ function decodeBcj2(_input, _properties, _unpackSize) {
211
211
  function createBcj2Decoder(_properties, _unpackSize) {
212
212
  return (0, _createBufferingDecoderts.default)(decodeBcj2, _properties, _unpackSize);
213
213
  }
214
- /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
214
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (let key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Bcj2.ts"],"sourcesContent":["// BCJ2 (x86-64) filter codec - advanced branch/call/jump converter\n// BCJ2 uses 4 input streams and arithmetic (range) coding for better compression\n// Reference: LZMA SDK Bcj2.c\n//\n// Stream layout:\n// Stream 0: Main data (contains literals and branch opcode markers)\n// Stream 1: CALL addresses (for 0xE8 instructions)\n// Stream 2: JUMP addresses (for 0xE9 instructions)\n// Stream 3: Range coder data (probability decisions)\n\nimport { allocBuffer } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n// Range coder constants\nvar kTopValue = 1 << 24;\nvar kNumBitModelTotalBits = 11;\nvar kBitModelTotal = 1 << kNumBitModelTotalBits;\nvar kNumMoveBits = 5;\n\n// Number of probability models:\n// Index 0: conditional jumps (0x0F 0x80-0x8F)\n// Index 1: JMP (0xE9)\n// Indices 2-257: CALL (0xE8), indexed by previous byte\nvar kNumProbs = 258;\n\n/**\n * Range decoder state\n */\ninterface RangeDecoder {\n range: number;\n code: number;\n stream: Buffer;\n pos: number;\n}\n\n/**\n * Initialize range decoder\n */\nfunction initRangeDecoder(stream: Buffer): RangeDecoder {\n var rd: RangeDecoder = {\n range: 0xffffffff,\n code: 0,\n stream: stream,\n pos: 0,\n };\n\n // Initialize code from first 5 bytes\n for (var i = 0; i < 5; i++) {\n rd.code = (rd.code << 8) | (rd.pos < stream.length ? stream[rd.pos++] : 0);\n }\n\n return rd;\n}\n\n/**\n * Decode a single bit using probability model\n */\nfunction decodeBit(rd: RangeDecoder, prob: number[], probIndex: number): number {\n var ttt = prob[probIndex];\n var bound = (rd.range >>> kNumBitModelTotalBits) * ttt;\n\n var symbol: number;\n if (rd.code >>> 0 < bound >>> 0) {\n rd.range = bound;\n prob[probIndex] = (ttt + ((kBitModelTotal - ttt) >>> kNumMoveBits)) | 0;\n symbol = 0;\n } else {\n rd.range = (rd.range - bound) >>> 0;\n rd.code = (rd.code - bound) >>> 0;\n prob[probIndex] = (ttt - (ttt >>> kNumMoveBits)) | 0;\n symbol = 1;\n }\n\n // Normalize\n if (rd.range < kTopValue) {\n rd.range = (rd.range << 8) >>> 0;\n rd.code = ((rd.code << 8) | (rd.pos < rd.stream.length ? rd.stream[rd.pos++] : 0)) >>> 0;\n }\n\n return symbol;\n}\n\n/**\n * BCJ2 multi-stream decoder\n * Takes 4 pre-decompressed streams and combines them\n */\nexport function decodeBcj2Multi(streams: Buffer[], _properties?: Buffer, unpackSize?: number): Buffer {\n if (streams.length !== 4) {\n throw new Error(`BCJ2 requires 4 input streams, got ${streams.length}`);\n }\n\n // Stream assignment (based on 7z bind pair convention):\n // streams[0] = main data (after LZMA2)\n // streams[1] = call stream (after LZMA)\n // streams[2] = jump stream (after LZMA)\n // streams[3] = range coder stream (uncompressed)\n var mainStream = streams[0];\n var callStream = streams[1];\n var jumpStream = streams[2];\n var rcStream = streams[3];\n\n // Output buffer\n var outSize = unpackSize || mainStream.length + callStream.length + jumpStream.length;\n var output = allocBuffer(outSize);\n var outPos = 0;\n\n // Stream positions\n var mainPos = 0;\n var callPos = 0;\n var jumpPos = 0;\n\n // Initialize range decoder\n var rd = initRangeDecoder(rcStream);\n\n // Initialize probability models\n var probs: number[] = [];\n for (var i = 0; i < kNumProbs; i++) {\n probs.push(kBitModelTotal >>> 1);\n }\n\n // Track previous byte for probability context\n var prevByte = 0;\n\n // Instruction pointer for address conversion\n var ip = 0;\n\n while (outPos < outSize && mainPos < mainStream.length) {\n var b = mainStream[mainPos++];\n\n // Check for branch opcodes\n if (b === 0xe8 || b === 0xe9) {\n // CALL (0xE8) or JMP (0xE9)\n // Use range decoder to check if this should be processed\n // Probability index: E8 uses 2 + prevByte, E9 uses 1\n var probIndex = b === 0xe8 ? 2 + prevByte : 1;\n var isMatch = decodeBit(rd, probs, probIndex);\n\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n\n if (isMatch) {\n // Read 4-byte address from appropriate stream\n var addrStream = b === 0xe8 ? callStream : jumpStream;\n var addrPos = b === 0xe8 ? callPos : jumpPos;\n\n if (addrPos + 4 > addrStream.length) {\n // Not enough data, copy remaining\n break;\n }\n\n // Check if we have room for 4 address bytes\n if (outPos + 4 > outSize) break;\n\n // Read as big-endian (BCJ2 stores addresses big-endian)\n var addr = (addrStream[addrPos] << 24) | (addrStream[addrPos + 1] << 16) | (addrStream[addrPos + 2] << 8) | addrStream[addrPos + 3];\n\n if (b === 0xe8) {\n callPos += 4;\n } else {\n jumpPos += 4;\n }\n\n // Convert absolute to relative address\n addr = (addr - (ip + 4)) | 0;\n\n // Write as little-endian\n output[outPos++] = addr & 0xff;\n output[outPos++] = (addr >>> 8) & 0xff;\n output[outPos++] = (addr >>> 16) & 0xff;\n output[outPos++] = (addr >>> 24) & 0xff;\n ip += 4;\n\n prevByte = (addr >>> 24) & 0xff;\n } else {\n prevByte = b;\n }\n } else if (b === 0x0f && mainPos < mainStream.length) {\n // Potential conditional jump (0x0F 0x8x)\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n\n var b2 = mainStream[mainPos];\n if ((b2 & 0xf0) === 0x80) {\n // Conditional jump\n mainPos++;\n // Probability index 0 for conditional jumps (since b2 != 0xE8 and b2 != 0xE9)\n var probIndex2 = 0;\n var isMatch2 = decodeBit(rd, probs, probIndex2);\n\n if (outPos >= outSize) break;\n output[outPos++] = b2;\n ip++;\n\n if (isMatch2) {\n // Read 4-byte address from jump stream\n if (jumpPos + 4 > jumpStream.length) {\n break;\n }\n\n // Check if we have room for 4 address bytes\n if (outPos + 4 > outSize) break;\n\n var addr2 = (jumpStream[jumpPos] << 24) | (jumpStream[jumpPos + 1] << 16) | (jumpStream[jumpPos + 2] << 8) | jumpStream[jumpPos + 3];\n jumpPos += 4;\n\n // Convert absolute to relative\n addr2 = (addr2 - (ip + 4)) | 0;\n\n // Write as little-endian\n output[outPos++] = addr2 & 0xff;\n output[outPos++] = (addr2 >>> 8) & 0xff;\n output[outPos++] = (addr2 >>> 16) & 0xff;\n output[outPos++] = (addr2 >>> 24) & 0xff;\n ip += 4;\n\n prevByte = (addr2 >>> 24) & 0xff;\n } else {\n prevByte = b2;\n }\n } else {\n prevByte = b;\n }\n } else {\n // Regular byte\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n prevByte = b;\n }\n }\n\n // Return only the used portion\n return outPos < output.length ? output.slice(0, outPos) : output;\n}\n\n/**\n * Single-buffer decode (for API compatibility)\n * Note: BCJ2 requires multi-stream, this throws\n */\nexport function decodeBcj2(_input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n throw new Error('BCJ2 requires multi-stream decoding - use decodeBcj2Multi');\n}\n\n/**\n * Create a BCJ2 decoder Transform stream\n * Note: BCJ2 requires multi-stream, this is for API compatibility\n */\nexport function createBcj2Decoder(_properties?: Buffer, _unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcj2, _properties, _unpackSize);\n}\n"],"names":["createBcj2Decoder","decodeBcj2","decodeBcj2Multi","kTopValue","kNumBitModelTotalBits","kBitModelTotal","kNumMoveBits","kNumProbs","initRangeDecoder","stream","rd","range","code","pos","i","length","decodeBit","prob","probIndex","ttt","bound","symbol","streams","_properties","unpackSize","Error","mainStream","callStream","jumpStream","rcStream","outSize","output","allocBuffer","outPos","mainPos","callPos","jumpPos","probs","push","prevByte","ip","b","isMatch","addrStream","addrPos","addr","b2","probIndex2","isMatch2","addr2","slice","_input","_unpackSize","createBufferingDecoder"],"mappings":"AAAA,mEAAmE;AACnE,iFAAiF;AACjF,6BAA6B;AAC7B,EAAE;AACF,iBAAiB;AACjB,sEAAsE;AACtE,qDAAqD;AACrD,qDAAqD;AACrD,uDAAuD;;;;;;;;;;;;QAkPvCA;eAAAA;;QARAC;eAAAA;;QA3JAC;eAAAA;;;mCA7EY;+EAEO;;;;;;AAEnC,wBAAwB;AACxB,IAAIC,YAAY,KAAK;AACrB,IAAIC,wBAAwB;AAC5B,IAAIC,iBAAiB,KAAKD;AAC1B,IAAIE,eAAe;AAEnB,gCAAgC;AAChC,8CAA8C;AAC9C,sBAAsB;AACtB,uDAAuD;AACvD,IAAIC,YAAY;AAYhB;;CAEC,GACD,SAASC,iBAAiBC,MAAc;IACtC,IAAIC,KAAmB;QACrBC,OAAO;QACPC,MAAM;QACNH,QAAQA;QACRI,KAAK;IACP;IAEA,qCAAqC;IACrC,IAAK,IAAIC,IAAI,GAAGA,IAAI,GAAGA,IAAK;QAC1BJ,GAAGE,IAAI,GAAG,AAACF,GAAGE,IAAI,IAAI,IAAMF,CAAAA,GAAGG,GAAG,GAAGJ,OAAOM,MAAM,GAAGN,MAAM,CAACC,GAAGG,GAAG,GAAG,GAAG,CAAA;IAC1E;IAEA,OAAOH;AACT;AAEA;;CAEC,GACD,SAASM,UAAUN,EAAgB,EAAEO,IAAc,EAAEC,SAAiB;IACpE,IAAIC,MAAMF,IAAI,CAACC,UAAU;IACzB,IAAIE,QAAQ,AAACV,CAAAA,GAAGC,KAAK,KAAKP,qBAAoB,IAAKe;IAEnD,IAAIE;IACJ,IAAIX,GAAGE,IAAI,KAAK,IAAIQ,UAAU,GAAG;QAC/BV,GAAGC,KAAK,GAAGS;QACXH,IAAI,CAACC,UAAU,GAAG,AAACC,MAAO,CAAA,AAACd,iBAAiBc,QAASb,YAAW,IAAM;QACtEe,SAAS;IACX,OAAO;QACLX,GAAGC,KAAK,GAAG,AAACD,GAAGC,KAAK,GAAGS,UAAW;QAClCV,GAAGE,IAAI,GAAG,AAACF,GAAGE,IAAI,GAAGQ,UAAW;QAChCH,IAAI,CAACC,UAAU,GAAG,AAACC,MAAOA,CAAAA,QAAQb,YAAW,IAAM;QACnDe,SAAS;IACX;IAEA,YAAY;IACZ,IAAIX,GAAGC,KAAK,GAAGR,WAAW;QACxBO,GAAGC,KAAK,GAAG,AAACD,GAAGC,KAAK,IAAI,MAAO;QAC/BD,GAAGE,IAAI,GAAG,AAAC,CAAA,AAACF,GAAGE,IAAI,IAAI,IAAMF,CAAAA,GAAGG,GAAG,GAAGH,GAAGD,MAAM,CAACM,MAAM,GAAGL,GAAGD,MAAM,CAACC,GAAGG,GAAG,GAAG,GAAG,CAAA,CAAC,MAAO;IACzF;IAEA,OAAOQ;AACT;AAMO,SAASnB,gBAAgBoB,OAAiB,EAAEC,WAAoB,EAAEC,UAAmB;IAC1F,IAAIF,QAAQP,MAAM,KAAK,GAAG;QACxB,MAAM,IAAIU,MAAM,AAAC,sCAAoD,OAAfH,QAAQP,MAAM;IACtE;IAEA,wDAAwD;IACxD,uCAAuC;IACvC,wCAAwC;IACxC,wCAAwC;IACxC,iDAAiD;IACjD,IAAIW,aAAaJ,OAAO,CAAC,EAAE;IAC3B,IAAIK,aAAaL,OAAO,CAAC,EAAE;IAC3B,IAAIM,aAAaN,OAAO,CAAC,EAAE;IAC3B,IAAIO,WAAWP,OAAO,CAAC,EAAE;IAEzB,gBAAgB;IAChB,IAAIQ,UAAUN,cAAcE,WAAWX,MAAM,GAAGY,WAAWZ,MAAM,GAAGa,WAAWb,MAAM;IACrF,IAAIgB,SAASC,IAAAA,gCAAW,EAACF;IACzB,IAAIG,SAAS;IAEb,mBAAmB;IACnB,IAAIC,UAAU;IACd,IAAIC,UAAU;IACd,IAAIC,UAAU;IAEd,2BAA2B;IAC3B,IAAI1B,KAAKF,iBAAiBqB;IAE1B,gCAAgC;IAChC,IAAIQ,QAAkB,EAAE;IACxB,IAAK,IAAIvB,IAAI,GAAGA,IAAIP,WAAWO,IAAK;QAClCuB,MAAMC,IAAI,CAACjC,mBAAmB;IAChC;IAEA,8CAA8C;IAC9C,IAAIkC,WAAW;IAEf,6CAA6C;IAC7C,IAAIC,KAAK;IAET,MAAOP,SAASH,WAAWI,UAAUR,WAAWX,MAAM,CAAE;QACtD,IAAI0B,IAAIf,UAAU,CAACQ,UAAU;QAE7B,2BAA2B;QAC3B,IAAIO,MAAM,QAAQA,MAAM,MAAM;YAC5B,4BAA4B;YAC5B,yDAAyD;YACzD,qDAAqD;YACrD,IAAIvB,YAAYuB,MAAM,OAAO,IAAIF,WAAW;YAC5C,IAAIG,UAAU1B,UAAUN,IAAI2B,OAAOnB;YAEnC,IAAIe,UAAUH,SAAS;YACvBC,MAAM,CAACE,SAAS,GAAGQ;YACnBD;YAEA,IAAIE,SAAS;gBACX,8CAA8C;gBAC9C,IAAIC,aAAaF,MAAM,OAAOd,aAAaC;gBAC3C,IAAIgB,UAAUH,MAAM,OAAON,UAAUC;gBAErC,IAAIQ,UAAU,IAAID,WAAW5B,MAAM,EAAE;oBAEnC;gBACF;gBAEA,4CAA4C;gBAC5C,IAAIkB,SAAS,IAAIH,SAAS;gBAE1B,wDAAwD;gBACxD,IAAIe,OAAO,AAACF,UAAU,CAACC,QAAQ,IAAI,KAAOD,UAAU,CAACC,UAAU,EAAE,IAAI,KAAOD,UAAU,CAACC,UAAU,EAAE,IAAI,IAAKD,UAAU,CAACC,UAAU,EAAE;gBAEnI,IAAIH,MAAM,MAAM;oBACdN,WAAW;gBACb,OAAO;oBACLC,WAAW;gBACb;gBAEA,uCAAuC;gBACvCS,OAAO,AAACA,OAAQL,CAAAA,KAAK,CAAA,IAAM;gBAE3B,yBAAyB;gBACzBT,MAAM,CAACE,SAAS,GAAGY,OAAO;gBAC1Bd,MAAM,CAACE,SAAS,GAAG,AAACY,SAAS,IAAK;gBAClCd,MAAM,CAACE,SAAS,GAAG,AAACY,SAAS,KAAM;gBACnCd,MAAM,CAACE,SAAS,GAAG,AAACY,SAAS,KAAM;gBACnCL,MAAM;gBAEND,WAAW,AAACM,SAAS,KAAM;YAC7B,OAAO;gBACLN,WAAWE;YACb;QACF,OAAO,IAAIA,MAAM,QAAQP,UAAUR,WAAWX,MAAM,EAAE;YACpD,yCAAyC;YACzC,IAAIkB,UAAUH,SAAS;YACvBC,MAAM,CAACE,SAAS,GAAGQ;YACnBD;YAEA,IAAIM,KAAKpB,UAAU,CAACQ,QAAQ;YAC5B,IAAI,AAACY,CAAAA,KAAK,IAAG,MAAO,MAAM;gBACxB,mBAAmB;gBACnBZ;gBACA,8EAA8E;gBAC9E,IAAIa,aAAa;gBACjB,IAAIC,WAAWhC,UAAUN,IAAI2B,OAAOU;gBAEpC,IAAId,UAAUH,SAAS;gBACvBC,MAAM,CAACE,SAAS,GAAGa;gBACnBN;gBAEA,IAAIQ,UAAU;oBACZ,uCAAuC;oBACvC,IAAIZ,UAAU,IAAIR,WAAWb,MAAM,EAAE;wBACnC;oBACF;oBAEA,4CAA4C;oBAC5C,IAAIkB,SAAS,IAAIH,SAAS;oBAE1B,IAAImB,QAAQ,AAACrB,UAAU,CAACQ,QAAQ,IAAI,KAAOR,UAAU,CAACQ,UAAU,EAAE,IAAI,KAAOR,UAAU,CAACQ,UAAU,EAAE,IAAI,IAAKR,UAAU,CAACQ,UAAU,EAAE;oBACpIA,WAAW;oBAEX,+BAA+B;oBAC/Ba,QAAQ,AAACA,QAAST,CAAAA,KAAK,CAAA,IAAM;oBAE7B,yBAAyB;oBACzBT,MAAM,CAACE,SAAS,GAAGgB,QAAQ;oBAC3BlB,MAAM,CAACE,SAAS,GAAG,AAACgB,UAAU,IAAK;oBACnClB,MAAM,CAACE,SAAS,GAAG,AAACgB,UAAU,KAAM;oBACpClB,MAAM,CAACE,SAAS,GAAG,AAACgB,UAAU,KAAM;oBACpCT,MAAM;oBAEND,WAAW,AAACU,UAAU,KAAM;gBAC9B,OAAO;oBACLV,WAAWO;gBACb;YACF,OAAO;gBACLP,WAAWE;YACb;QACF,OAAO;YACL,eAAe;YACf,IAAIR,UAAUH,SAAS;YACvBC,MAAM,CAACE,SAAS,GAAGQ;YACnBD;YACAD,WAAWE;QACb;IACF;IAEA,+BAA+B;IAC/B,OAAOR,SAASF,OAAOhB,MAAM,GAAGgB,OAAOmB,KAAK,CAAC,GAAGjB,UAAUF;AAC5D;AAMO,SAAS9B,WAAWkD,MAAc,EAAE5B,WAAoB,EAAE6B,WAAoB;IACnF,MAAM,IAAI3B,MAAM;AAClB;AAMO,SAASzB,kBAAkBuB,WAAoB,EAAE6B,WAAoB;IAC1E,OAAOC,IAAAA,iCAAsB,EAACpD,YAAYsB,aAAa6B;AACzD"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Bcj2.ts"],"sourcesContent":["// BCJ2 (x86-64) filter codec - advanced branch/call/jump converter\n// BCJ2 uses 4 input streams and arithmetic (range) coding for better compression\n// Reference: LZMA SDK Bcj2.c\n//\n// Stream layout:\n// Stream 0: Main data (contains literals and branch opcode markers)\n// Stream 1: CALL addresses (for 0xE8 instructions)\n// Stream 2: JUMP addresses (for 0xE9 instructions)\n// Stream 3: Range coder data (probability decisions)\n\nimport { allocBuffer } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n// Range coder constants\nconst kTopValue = 1 << 24;\nconst kNumBitModelTotalBits = 11;\nconst kBitModelTotal = 1 << kNumBitModelTotalBits;\nconst kNumMoveBits = 5;\n\n// Number of probability models:\n// Index 0: conditional jumps (0x0F 0x80-0x8F)\n// Index 1: JMP (0xE9)\n// Indices 2-257: CALL (0xE8), indexed by previous byte\nconst kNumProbs = 258;\n\n/**\n * Range decoder state\n */\ninterface RangeDecoder {\n range: number;\n code: number;\n stream: Buffer;\n pos: number;\n}\n\n/**\n * Initialize range decoder\n */\nfunction initRangeDecoder(stream: Buffer): RangeDecoder {\n const rd: RangeDecoder = {\n range: 0xffffffff,\n code: 0,\n stream: stream,\n pos: 0,\n };\n\n // Initialize code from first 5 bytes\n for (let i = 0; i < 5; i++) {\n rd.code = (rd.code << 8) | (rd.pos < stream.length ? stream[rd.pos++] : 0);\n }\n\n return rd;\n}\n\n/**\n * Decode a single bit using probability model\n */\nfunction decodeBit(rd: RangeDecoder, prob: number[], probIndex: number): number {\n const ttt = prob[probIndex];\n const bound = (rd.range >>> kNumBitModelTotalBits) * ttt;\n\n let symbol: number;\n if (rd.code >>> 0 < bound >>> 0) {\n rd.range = bound;\n prob[probIndex] = (ttt + ((kBitModelTotal - ttt) >>> kNumMoveBits)) | 0;\n symbol = 0;\n } else {\n rd.range = (rd.range - bound) >>> 0;\n rd.code = (rd.code - bound) >>> 0;\n prob[probIndex] = (ttt - (ttt >>> kNumMoveBits)) | 0;\n symbol = 1;\n }\n\n // Normalize\n if (rd.range < kTopValue) {\n rd.range = (rd.range << 8) >>> 0;\n rd.code = ((rd.code << 8) | (rd.pos < rd.stream.length ? rd.stream[rd.pos++] : 0)) >>> 0;\n }\n\n return symbol;\n}\n\n/**\n * BCJ2 multi-stream decoder\n * Takes 4 pre-decompressed streams and combines them\n */\nexport function decodeBcj2Multi(streams: Buffer[], _properties?: Buffer, unpackSize?: number): Buffer {\n if (streams.length !== 4) {\n throw new Error(`BCJ2 requires 4 input streams, got ${streams.length}`);\n }\n\n // Stream assignment (based on 7z bind pair convention):\n // streams[0] = main data (after LZMA2)\n // streams[1] = call stream (after LZMA)\n // streams[2] = jump stream (after LZMA)\n // streams[3] = range coder stream (uncompressed)\n const mainStream = streams[0];\n const callStream = streams[1];\n const jumpStream = streams[2];\n const rcStream = streams[3];\n\n // Output buffer\n const outSize = unpackSize || mainStream.length + callStream.length + jumpStream.length;\n const output = allocBuffer(outSize);\n let outPos = 0;\n\n // Stream positions\n let mainPos = 0;\n let callPos = 0;\n let jumpPos = 0;\n\n // Initialize range decoder\n const rd = initRangeDecoder(rcStream);\n\n // Initialize probability models\n const probs: number[] = [];\n for (let i = 0; i < kNumProbs; i++) {\n probs.push(kBitModelTotal >>> 1);\n }\n\n // Track previous byte for probability context\n let prevByte = 0;\n\n // Instruction pointer for address conversion\n let ip = 0;\n\n while (outPos < outSize && mainPos < mainStream.length) {\n const b = mainStream[mainPos++];\n\n // Check for branch opcodes\n if (b === 0xe8 || b === 0xe9) {\n // CALL (0xE8) or JMP (0xE9)\n // Use range decoder to check if this should be processed\n // Probability index: E8 uses 2 + prevByte, E9 uses 1\n const probIndex = b === 0xe8 ? 2 + prevByte : 1;\n const isMatch = decodeBit(rd, probs, probIndex);\n\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n\n if (isMatch) {\n // Read 4-byte address from appropriate stream\n const addrStream = b === 0xe8 ? callStream : jumpStream;\n const addrPos = b === 0xe8 ? callPos : jumpPos;\n\n if (addrPos + 4 > addrStream.length) {\n // Not enough data, copy remaining\n break;\n }\n\n // Check if we have room for 4 address bytes\n if (outPos + 4 > outSize) break;\n\n // Read as big-endian (BCJ2 stores addresses big-endian)\n let addr = (addrStream[addrPos] << 24) | (addrStream[addrPos + 1] << 16) | (addrStream[addrPos + 2] << 8) | addrStream[addrPos + 3];\n\n if (b === 0xe8) {\n callPos += 4;\n } else {\n jumpPos += 4;\n }\n\n // Convert absolute to relative address\n addr = (addr - (ip + 4)) | 0;\n\n // Write as little-endian\n output[outPos++] = addr & 0xff;\n output[outPos++] = (addr >>> 8) & 0xff;\n output[outPos++] = (addr >>> 16) & 0xff;\n output[outPos++] = (addr >>> 24) & 0xff;\n ip += 4;\n\n prevByte = (addr >>> 24) & 0xff;\n } else {\n prevByte = b;\n }\n } else if (b === 0x0f && mainPos < mainStream.length) {\n // Potential conditional jump (0x0F 0x8x)\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n\n const b2 = mainStream[mainPos];\n if ((b2 & 0xf0) === 0x80) {\n // Conditional jump\n mainPos++;\n // Probability index 0 for conditional jumps (since b2 != 0xE8 and b2 != 0xE9)\n const probIndex2 = 0;\n const isMatch2 = decodeBit(rd, probs, probIndex2);\n\n if (outPos >= outSize) break;\n output[outPos++] = b2;\n ip++;\n\n if (isMatch2) {\n // Read 4-byte address from jump stream\n if (jumpPos + 4 > jumpStream.length) {\n break;\n }\n\n // Check if we have room for 4 address bytes\n if (outPos + 4 > outSize) break;\n\n let addr2 = (jumpStream[jumpPos] << 24) | (jumpStream[jumpPos + 1] << 16) | (jumpStream[jumpPos + 2] << 8) | jumpStream[jumpPos + 3];\n jumpPos += 4;\n\n // Convert absolute to relative\n addr2 = (addr2 - (ip + 4)) | 0;\n\n // Write as little-endian\n output[outPos++] = addr2 & 0xff;\n output[outPos++] = (addr2 >>> 8) & 0xff;\n output[outPos++] = (addr2 >>> 16) & 0xff;\n output[outPos++] = (addr2 >>> 24) & 0xff;\n ip += 4;\n\n prevByte = (addr2 >>> 24) & 0xff;\n } else {\n prevByte = b2;\n }\n } else {\n prevByte = b;\n }\n } else {\n // Regular byte\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n prevByte = b;\n }\n }\n\n // Return only the used portion\n return outPos < output.length ? output.slice(0, outPos) : output;\n}\n\n/**\n * Single-buffer decode (for API compatibility)\n * Note: BCJ2 requires multi-stream, this throws\n */\nexport function decodeBcj2(_input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n throw new Error('BCJ2 requires multi-stream decoding - use decodeBcj2Multi');\n}\n\n/**\n * Create a BCJ2 decoder Transform stream\n * Note: BCJ2 requires multi-stream, this is for API compatibility\n */\nexport function createBcj2Decoder(_properties?: Buffer, _unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcj2, _properties, _unpackSize);\n}\n"],"names":["createBcj2Decoder","decodeBcj2","decodeBcj2Multi","kTopValue","kNumBitModelTotalBits","kBitModelTotal","kNumMoveBits","kNumProbs","initRangeDecoder","stream","rd","range","code","pos","i","length","decodeBit","prob","probIndex","ttt","bound","symbol","streams","_properties","unpackSize","Error","mainStream","callStream","jumpStream","rcStream","outSize","output","allocBuffer","outPos","mainPos","callPos","jumpPos","probs","push","prevByte","ip","b","isMatch","addrStream","addrPos","addr","b2","probIndex2","isMatch2","addr2","slice","_input","_unpackSize","createBufferingDecoder"],"mappings":"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"}
@@ -59,4 +59,4 @@ function decodeBcjArm(input, _properties, _unpackSize) {
59
59
  function createBcjArmDecoder(properties, unpackSize) {
60
60
  return (0, _createBufferingDecoderts.default)(decodeBcjArm, properties, unpackSize);
61
61
  }
62
- /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
62
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (let key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/BcjArm.ts"],"sourcesContent":["// BCJ (ARM 32-bit) filter codec - converts ARM branch instruction addresses\n// This filter makes ARM executables more compressible by LZMA\n//\n// ARM branch instructions (BL) use relative addressing. The filter converts\n// these to absolute addresses during compression, and back during decompression.\n//\n// Reference: https://github.com/kornelski/7z/blob/main/C/Bra.c\n\nimport { bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n/**\n * Decode ARM BCJ filtered data\n * Reverses the BCJ transformation by converting absolute addresses back to relative\n *\n * ARM BL instruction format:\n * - 4 bytes aligned\n * - Byte pattern: XX XX XX EB (where EB = 0xEB opcode for BL)\n * - Lower 24 bits are signed offset (in words, not bytes)\n *\n * @param input - ARM BCJ filtered data\n * @param _properties - Unused for ARM BCJ\n * @param _unpackSize - Unused for ARM BCJ\n * @returns Unfiltered data\n */\nexport function decodeBcjArm(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n var output = bufferFrom(input); // Copy since we modify in place\n var pos = 0;\n\n // Process 4-byte aligned positions\n while (pos + 4 <= output.length) {\n // Check for BL instruction: byte 3 is 0xEB\n if (output[pos + 3] === 0xeb) {\n // Read 24-bit address (little-endian in bytes 0-2)\n var addr = output[pos] | (output[pos + 1] << 8) | (output[pos + 2] << 16);\n\n // Sign-extend 24-bit to 32-bit\n if (addr & 0x800000) {\n addr |= 0xff000000;\n }\n\n // Convert absolute to relative:\n // Subtract current position (in words, so divide by 4)\n // ARM PC is 2 words (8 bytes) ahead during execution\n var relAddr = addr - (pos >>> 2);\n\n // Write back lower 24 bits\n output[pos] = relAddr & 0xff;\n output[pos + 1] = (relAddr >>> 8) & 0xff;\n output[pos + 2] = (relAddr >>> 16) & 0xff;\n }\n pos += 4;\n }\n\n return output;\n}\n\n/**\n * Create an ARM BCJ decoder Transform stream\n */\nexport function createBcjArmDecoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcjArm, properties, unpackSize);\n}\n"],"names":["createBcjArmDecoder","decodeBcjArm","input","_properties","_unpackSize","output","bufferFrom","pos","length","addr","relAddr","properties","unpackSize","createBufferingDecoder"],"mappings":"AAAA,4EAA4E;AAC5E,8DAA8D;AAC9D,EAAE;AACF,4EAA4E;AAC5E,iFAAiF;AACjF,EAAE;AACF,+DAA+D;;;;;;;;;;;;QAuD/CA;eAAAA;;QAnCAC;eAAAA;;;mCAlBW;+EAEQ;;;;;;AAgB5B,SAASA,aAAaC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACpF,IAAIC,SAASC,IAAAA,+BAAU,EAACJ,QAAQ,gCAAgC;IAChE,IAAIK,MAAM;IAEV,mCAAmC;IACnC,MAAOA,MAAM,KAAKF,OAAOG,MAAM,CAAE;QAC/B,2CAA2C;QAC3C,IAAIH,MAAM,CAACE,MAAM,EAAE,KAAK,MAAM;YAC5B,mDAAmD;YACnD,IAAIE,OAAOJ,MAAM,CAACE,IAAI,GAAIF,MAAM,CAACE,MAAM,EAAE,IAAI,IAAMF,MAAM,CAACE,MAAM,EAAE,IAAI;YAEtE,+BAA+B;YAC/B,IAAIE,OAAO,UAAU;gBACnBA,QAAQ;YACV;YAEA,gCAAgC;YAChC,uDAAuD;YACvD,qDAAqD;YACrD,IAAIC,UAAUD,OAAQF,CAAAA,QAAQ,CAAA;YAE9B,2BAA2B;YAC3BF,MAAM,CAACE,IAAI,GAAGG,UAAU;YACxBL,MAAM,CAACE,MAAM,EAAE,GAAG,AAACG,YAAY,IAAK;YACpCL,MAAM,CAACE,MAAM,EAAE,GAAG,AAACG,YAAY,KAAM;QACvC;QACAH,OAAO;IACT;IAEA,OAAOF;AACT;AAKO,SAASL,oBAAoBW,UAAmB,EAAEC,UAAmB;IAC1E,OAAOC,IAAAA,iCAAsB,EAACZ,cAAcU,YAAYC;AAC1D"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/BcjArm.ts"],"sourcesContent":["// BCJ (ARM 32-bit) filter codec - converts ARM branch instruction addresses\n// This filter makes ARM executables more compressible by LZMA\n//\n// ARM branch instructions (BL) use relative addressing. The filter converts\n// these to absolute addresses during compression, and back during decompression.\n//\n// Reference: https://github.com/kornelski/7z/blob/main/C/Bra.c\n\nimport { bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n/**\n * Decode ARM BCJ filtered data\n * Reverses the BCJ transformation by converting absolute addresses back to relative\n *\n * ARM BL instruction format:\n * - 4 bytes aligned\n * - Byte pattern: XX XX XX EB (where EB = 0xEB opcode for BL)\n * - Lower 24 bits are signed offset (in words, not bytes)\n *\n * @param input - ARM BCJ filtered data\n * @param _properties - Unused for ARM BCJ\n * @param _unpackSize - Unused for ARM BCJ\n * @returns Unfiltered data\n */\nexport function decodeBcjArm(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n const output = bufferFrom(input); // Copy since we modify in place\n let pos = 0;\n\n // Process 4-byte aligned positions\n while (pos + 4 <= output.length) {\n // Check for BL instruction: byte 3 is 0xEB\n if (output[pos + 3] === 0xeb) {\n // Read 24-bit address (little-endian in bytes 0-2)\n let addr = output[pos] | (output[pos + 1] << 8) | (output[pos + 2] << 16);\n\n // Sign-extend 24-bit to 32-bit\n if (addr & 0x800000) {\n addr |= 0xff000000;\n }\n\n // Convert absolute to relative:\n // Subtract current position (in words, so divide by 4)\n // ARM PC is 2 words (8 bytes) ahead during execution\n const relAddr = addr - (pos >>> 2);\n\n // Write back lower 24 bits\n output[pos] = relAddr & 0xff;\n output[pos + 1] = (relAddr >>> 8) & 0xff;\n output[pos + 2] = (relAddr >>> 16) & 0xff;\n }\n pos += 4;\n }\n\n return output;\n}\n\n/**\n * Create an ARM BCJ decoder Transform stream\n */\nexport function createBcjArmDecoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcjArm, properties, unpackSize);\n}\n"],"names":["createBcjArmDecoder","decodeBcjArm","input","_properties","_unpackSize","output","bufferFrom","pos","length","addr","relAddr","properties","unpackSize","createBufferingDecoder"],"mappings":"AAAA,4EAA4E;AAC5E,8DAA8D;AAC9D,EAAE;AACF,4EAA4E;AAC5E,iFAAiF;AACjF,EAAE;AACF,+DAA+D;;;;;;;;;;;;QAuD/CA;eAAAA;;QAnCAC;eAAAA;;;mCAlBW;+EAEQ;;;;;;AAgB5B,SAASA,aAAaC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACpF,IAAMC,SAASC,IAAAA,+BAAU,EAACJ,QAAQ,gCAAgC;IAClE,IAAIK,MAAM;IAEV,mCAAmC;IACnC,MAAOA,MAAM,KAAKF,OAAOG,MAAM,CAAE;QAC/B,2CAA2C;QAC3C,IAAIH,MAAM,CAACE,MAAM,EAAE,KAAK,MAAM;YAC5B,mDAAmD;YACnD,IAAIE,OAAOJ,MAAM,CAACE,IAAI,GAAIF,MAAM,CAACE,MAAM,EAAE,IAAI,IAAMF,MAAM,CAACE,MAAM,EAAE,IAAI;YAEtE,+BAA+B;YAC/B,IAAIE,OAAO,UAAU;gBACnBA,QAAQ;YACV;YAEA,gCAAgC;YAChC,uDAAuD;YACvD,qDAAqD;YACrD,IAAMC,UAAUD,OAAQF,CAAAA,QAAQ,CAAA;YAEhC,2BAA2B;YAC3BF,MAAM,CAACE,IAAI,GAAGG,UAAU;YACxBL,MAAM,CAACE,MAAM,EAAE,GAAG,AAACG,YAAY,IAAK;YACpCL,MAAM,CAACE,MAAM,EAAE,GAAG,AAACG,YAAY,KAAM;QACvC;QACAH,OAAO;IACT;IAEA,OAAOF;AACT;AAKO,SAASL,oBAAoBW,UAAmB,EAAEC,UAAmB;IAC1E,OAAOC,IAAAA,iCAAsB,EAACZ,cAAcU,YAAYC;AAC1D"}
@@ -62,4 +62,4 @@ function decodeBcjArm64(input, _properties, _unpackSize) {
62
62
  function createBcjArm64Decoder(properties, unpackSize) {
63
63
  return (0, _createBufferingDecoderts.default)(decodeBcjArm64, properties, unpackSize);
64
64
  }
65
- /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
65
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (let key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/BcjArm64.ts"],"sourcesContent":["// BCJ (ARM64/AArch64) filter codec - converts ARM64 branch instruction addresses\n// This filter makes ARM64 executables more compressible by LZMA\n//\n// ARM64 uses 32-bit fixed-width instructions. Branch instructions use 26-bit signed offsets.\n//\n// Reference: https://github.com/kornelski/7z/blob/main/C/Bra.c\n\nimport { bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n/**\n * Decode ARM64 BCJ filtered data\n * Reverses the BCJ transformation by converting absolute addresses back to relative\n *\n * ARM64 B/BL instruction format (little-endian):\n * - 4 bytes aligned\n * - B: opcode 0x14 (000101xx)\n * - BL: opcode 0x94 (100101xx)\n * - Bits 0-25 are 26-bit signed offset (in words)\n *\n * @param input - ARM64 BCJ filtered data\n * @param _properties - Unused for ARM64 BCJ\n * @param _unpackSize - Unused for ARM64 BCJ\n * @returns Unfiltered data\n */\nexport function decodeBcjArm64(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n var output = bufferFrom(input); // Copy since we modify in place\n var pos = 0;\n\n // Process 4-byte aligned positions\n while (pos + 4 <= output.length) {\n // Read 32-bit value (little-endian)\n var instr = output[pos] | (output[pos + 1] << 8) | (output[pos + 2] << 16) | ((output[pos + 3] << 24) >>> 0);\n\n // Check for B/BL instruction: (instr & 0x7C000000) === 0x14000000\n // This matches both B (0x14000000) and BL (0x94000000)\n if ((instr & 0x7c000000) === 0x14000000) {\n // Extract 26-bit offset\n var addr = instr & 0x03ffffff;\n\n // Sign-extend 26-bit to 32-bit\n if (addr & 0x02000000) {\n addr |= 0xfc000000;\n }\n\n // Convert absolute to relative: subtract current position (in words)\n var relAddr = addr - (pos >>> 2);\n\n // Clear old offset and write new one, preserve opcode\n instr = (instr & 0xfc000000) | (relAddr & 0x03ffffff);\n\n // Write back (little-endian)\n output[pos] = instr & 0xff;\n output[pos + 1] = (instr >>> 8) & 0xff;\n output[pos + 2] = (instr >>> 16) & 0xff;\n output[pos + 3] = (instr >>> 24) & 0xff;\n }\n\n pos += 4;\n }\n\n return output;\n}\n\n/**\n * Create an ARM64 BCJ decoder Transform stream\n */\nexport function createBcjArm64Decoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcjArm64, properties, unpackSize);\n}\n"],"names":["createBcjArm64Decoder","decodeBcjArm64","input","_properties","_unpackSize","output","bufferFrom","pos","length","instr","addr","relAddr","properties","unpackSize","createBufferingDecoder"],"mappings":"AAAA,iFAAiF;AACjF,gEAAgE;AAChE,EAAE;AACF,6FAA6F;AAC7F,EAAE;AACF,+DAA+D;;;;;;;;;;;;QA+D/CA;eAAAA;;QA1CAC;eAAAA;;;mCAnBW;+EAEQ;;;;;;AAiB5B,SAASA,eAAeC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACtF,IAAIC,SAASC,IAAAA,+BAAU,EAACJ,QAAQ,gCAAgC;IAChE,IAAIK,MAAM;IAEV,mCAAmC;IACnC,MAAOA,MAAM,KAAKF,OAAOG,MAAM,CAAE;QAC/B,oCAAoC;QACpC,IAAIC,QAAQJ,MAAM,CAACE,IAAI,GAAIF,MAAM,CAACE,MAAM,EAAE,IAAI,IAAMF,MAAM,CAACE,MAAM,EAAE,IAAI,KAAO,AAACF,MAAM,CAACE,MAAM,EAAE,IAAI,OAAQ;QAE1G,kEAAkE;QAClE,uDAAuD;QACvD,IAAI,AAACE,CAAAA,QAAQ,UAAS,MAAO,YAAY;YACvC,wBAAwB;YACxB,IAAIC,OAAOD,QAAQ;YAEnB,+BAA+B;YAC/B,IAAIC,OAAO,YAAY;gBACrBA,QAAQ;YACV;YAEA,qEAAqE;YACrE,IAAIC,UAAUD,OAAQH,CAAAA,QAAQ,CAAA;YAE9B,sDAAsD;YACtDE,QAAQ,AAACA,QAAQ,aAAeE,UAAU;YAE1C,6BAA6B;YAC7BN,MAAM,CAACE,IAAI,GAAGE,QAAQ;YACtBJ,MAAM,CAACE,MAAM,EAAE,GAAG,AAACE,UAAU,IAAK;YAClCJ,MAAM,CAACE,MAAM,EAAE,GAAG,AAACE,UAAU,KAAM;YACnCJ,MAAM,CAACE,MAAM,EAAE,GAAG,AAACE,UAAU,KAAM;QACrC;QAEAF,OAAO;IACT;IAEA,OAAOF;AACT;AAKO,SAASL,sBAAsBY,UAAmB,EAAEC,UAAmB;IAC5E,OAAOC,IAAAA,iCAAsB,EAACb,gBAAgBW,YAAYC;AAC5D"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/BcjArm64.ts"],"sourcesContent":["// BCJ (ARM64/AArch64) filter codec - converts ARM64 branch instruction addresses\n// This filter makes ARM64 executables more compressible by LZMA\n//\n// ARM64 uses 32-bit fixed-width instructions. Branch instructions use 26-bit signed offsets.\n//\n// Reference: https://github.com/kornelski/7z/blob/main/C/Bra.c\n\nimport { bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n/**\n * Decode ARM64 BCJ filtered data\n * Reverses the BCJ transformation by converting absolute addresses back to relative\n *\n * ARM64 B/BL instruction format (little-endian):\n * - 4 bytes aligned\n * - B: opcode 0x14 (000101xx)\n * - BL: opcode 0x94 (100101xx)\n * - Bits 0-25 are 26-bit signed offset (in words)\n *\n * @param input - ARM64 BCJ filtered data\n * @param _properties - Unused for ARM64 BCJ\n * @param _unpackSize - Unused for ARM64 BCJ\n * @returns Unfiltered data\n */\nexport function decodeBcjArm64(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n const output = bufferFrom(input); // Copy since we modify in place\n let pos = 0;\n\n // Process 4-byte aligned positions\n while (pos + 4 <= output.length) {\n // Read 32-bit value (little-endian)\n let instr = output[pos] | (output[pos + 1] << 8) | (output[pos + 2] << 16) | ((output[pos + 3] << 24) >>> 0);\n\n // Check for B/BL instruction: (instr & 0x7C000000) === 0x14000000\n // This matches both B (0x14000000) and BL (0x94000000)\n if ((instr & 0x7c000000) === 0x14000000) {\n // Extract 26-bit offset\n let addr = instr & 0x03ffffff;\n\n // Sign-extend 26-bit to 32-bit\n if (addr & 0x02000000) {\n addr |= 0xfc000000;\n }\n\n // Convert absolute to relative: subtract current position (in words)\n const relAddr = addr - (pos >>> 2);\n\n // Clear old offset and write new one, preserve opcode\n instr = (instr & 0xfc000000) | (relAddr & 0x03ffffff);\n\n // Write back (little-endian)\n output[pos] = instr & 0xff;\n output[pos + 1] = (instr >>> 8) & 0xff;\n output[pos + 2] = (instr >>> 16) & 0xff;\n output[pos + 3] = (instr >>> 24) & 0xff;\n }\n\n pos += 4;\n }\n\n return output;\n}\n\n/**\n * Create an ARM64 BCJ decoder Transform stream\n */\nexport function createBcjArm64Decoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcjArm64, properties, unpackSize);\n}\n"],"names":["createBcjArm64Decoder","decodeBcjArm64","input","_properties","_unpackSize","output","bufferFrom","pos","length","instr","addr","relAddr","properties","unpackSize","createBufferingDecoder"],"mappings":"AAAA,iFAAiF;AACjF,gEAAgE;AAChE,EAAE;AACF,6FAA6F;AAC7F,EAAE;AACF,+DAA+D;;;;;;;;;;;;QA+D/CA;eAAAA;;QA1CAC;eAAAA;;;mCAnBW;+EAEQ;;;;;;AAiB5B,SAASA,eAAeC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACtF,IAAMC,SAASC,IAAAA,+BAAU,EAACJ,QAAQ,gCAAgC;IAClE,IAAIK,MAAM;IAEV,mCAAmC;IACnC,MAAOA,MAAM,KAAKF,OAAOG,MAAM,CAAE;QAC/B,oCAAoC;QACpC,IAAIC,QAAQJ,MAAM,CAACE,IAAI,GAAIF,MAAM,CAACE,MAAM,EAAE,IAAI,IAAMF,MAAM,CAACE,MAAM,EAAE,IAAI,KAAO,AAACF,MAAM,CAACE,MAAM,EAAE,IAAI,OAAQ;QAE1G,kEAAkE;QAClE,uDAAuD;QACvD,IAAI,AAACE,CAAAA,QAAQ,UAAS,MAAO,YAAY;YACvC,wBAAwB;YACxB,IAAIC,OAAOD,QAAQ;YAEnB,+BAA+B;YAC/B,IAAIC,OAAO,YAAY;gBACrBA,QAAQ;YACV;YAEA,qEAAqE;YACrE,IAAMC,UAAUD,OAAQH,CAAAA,QAAQ,CAAA;YAEhC,sDAAsD;YACtDE,QAAQ,AAACA,QAAQ,aAAeE,UAAU;YAE1C,6BAA6B;YAC7BN,MAAM,CAACE,IAAI,GAAGE,QAAQ;YACtBJ,MAAM,CAACE,MAAM,EAAE,GAAG,AAACE,UAAU,IAAK;YAClCJ,MAAM,CAACE,MAAM,EAAE,GAAG,AAACE,UAAU,KAAM;YACnCJ,MAAM,CAACE,MAAM,EAAE,GAAG,AAACE,UAAU,KAAM;QACrC;QAEAF,OAAO;IACT;IAEA,OAAOF;AACT;AAKO,SAASL,sBAAsBY,UAAmB,EAAEC,UAAmB;IAC5E,OAAOC,IAAAA,iCAAsB,EAACb,gBAAgBW,YAAYC;AAC5D"}
@@ -73,4 +73,4 @@ function decodeBcjArmt(input, _properties, _unpackSize) {
73
73
  function createBcjArmtDecoder(properties, unpackSize) {
74
74
  return (0, _createBufferingDecoderts.default)(decodeBcjArmt, properties, unpackSize);
75
75
  }
76
- /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
76
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (let key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }