7z-iterator 2.0.0 → 2.0.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/SevenZipParser.ts"],"sourcesContent":["/**\n * SevenZipParser - Main 7z archive parser\n *\n * Handles reading archive structure and providing file streams.\n *\n * Parser Flow:\n * 1. Read signature header (32 bytes) to get header location\n * 2. Read encoded header from nextHeaderOffset\n * 3. If header is compressed, decompress it first\n * 4. Parse streams info (folder structure, pack positions)\n * 5. Parse files info (names, sizes, attributes)\n * 6. Build entry list for iteration\n *\n * Decompression:\n * - 7z uses \"folders\" as decompression units\n * - Solid archives: multiple files share one folder (decompress once)\n * - Non-solid: one file per folder\n * - Supports LZMA, LZMA2, COPY, BCJ2, and other codecs\n */\n\nimport { crc32, PassThrough } from 'extract-base-iterator';\nimport type Stream from 'stream';\nimport type { ArchiveSource } from './ArchiveSource.ts';\nimport { decodeBcj2Multi, getCodec, getCodecName, isBcj2Codec, isCodecSupported } from './codecs/index.ts';\nimport { FolderStreamSplitter } from './FolderStreamSplitter.ts';\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// Re-export for backwards compatibility\nexport { type ArchiveSource, BufferSource, FileSource } from './ArchiveSource.ts';\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 _canStream: boolean; // Whether this entry's folder supports streaming decompression\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 // Splitter cache for multi-file folder streaming (Phase 2)\n private folderSplitters: { [key: number]: FolderStreamSplitter } = {};\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 // Set _canStream for all entries now that we have complete folder info\n // This must be done after all entries are built because canStreamFolder\n // relies on the folder structure being fully parsed\n for (let i = 0; i < this.entries.length; i++) {\n const entry = this.entries[i];\n if (entry._hasStream && entry._folderIndex >= 0) {\n entry._canStream = this.canStreamFolder(entry._folderIndex);\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 _canStream: false, // Set after parsing completes when canStreamFolder is available\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 * Returns immediately - decompression happens when data is read (proper streaming).\n * Uses true streaming for codecs that support it, buffered for others.\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 // Use true streaming for single-file folders that support it.\n // Multi-file folders use buffered approach because streaming requires\n // accessing files in order, which doesn't work with concurrent extraction.\n const filesInFolder = this.filesPerFolder[entry._folderIndex] || 1;\n if (entry._canStream && filesInFolder === 1) {\n return this._getEntryStreamStreaming(entry);\n }\n return this._getEntryStreamBuffered(entry);\n }\n\n /**\n * True streaming: data flows through without buffering entire folder.\n * Only used for single-file folders with streamable codecs (BZip2, Deflate, LZMA2).\n */\n private _getEntryStreamStreaming(entry: SevenZipEntry): Readable {\n let started = false;\n let destroyed = false;\n let folderStream: ReturnType<typeof this.streamFolder> | null = null;\n\n const stream = new PassThrough();\n\n const originalRead = stream._read.bind(stream);\n stream._read = (size: number) => {\n if (!started && !destroyed) {\n started = true;\n setTimeout(() => {\n if (destroyed) return;\n\n try {\n let crcValue = 0;\n const verifyCrc = entry._crc !== undefined;\n folderStream = this.streamFolder(entry._folderIndex);\n\n folderStream.output.on('data', (chunk: Buffer) => {\n if (destroyed) return;\n if (verifyCrc) {\n crcValue = crc32(chunk, crcValue);\n }\n if (!stream.write(chunk)) {\n folderStream?.pause();\n stream.once('drain', () => folderStream?.resume());\n }\n });\n\n folderStream.output.on('end', () => {\n if (destroyed) return;\n if (verifyCrc && crcValue !== entry._crc) {\n stream.destroy(createCodedError(`CRC mismatch for ${entry.path}: expected ${entry._crc?.toString(16)}, got ${crcValue.toString(16)}`, ErrorCode.CRC_MISMATCH));\n return;\n }\n stream.end();\n this.extractedPerFolder[entry._folderIndex] = (this.extractedPerFolder[entry._folderIndex] || 0) + 1;\n });\n\n folderStream.output.on('error', (err: Error) => {\n if (!destroyed) stream.destroy(err);\n });\n } catch (err) {\n if (!destroyed) {\n stream.destroy(err as Error);\n }\n }\n }, 0);\n }\n return originalRead(size);\n };\n\n // Override destroy to clean up folder stream\n // IMPORTANT: Emit error synchronously BEFORE calling original destroy.\n // On older Node, destroy() emits 'finish' and 'end' before 'error',\n // which causes piped streams to complete successfully before the error fires.\n const streamWithDestroy = stream as NodeJS.ReadableStream & { destroy?: (err?: Error) => NodeJS.ReadableStream };\n const originalDestroy = typeof streamWithDestroy.destroy === 'function' ? streamWithDestroy.destroy.bind(stream) : null;\n streamWithDestroy.destroy = (err?: Error) => {\n destroyed = true;\n if (err) stream.emit('error', err);\n if (folderStream) folderStream.destroy();\n if (originalDestroy) return originalDestroy();\n return stream;\n };\n\n return stream;\n }\n\n /**\n * Buffered extraction: decompress entire folder, slice out file.\n * Used for codecs that don't support incremental streaming (LZMA1, BCJ2).\n */\n private _getEntryStreamBuffered(entry: SevenZipEntry): Readable {\n if (!this.streamsInfo) {\n throw createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER);\n }\n const streamsInfo = this.streamsInfo;\n const folderIdx = entry._folderIndex;\n let started = false;\n let destroyed = false;\n\n const stream = new PassThrough();\n\n const originalRead = stream._read.bind(stream);\n stream._read = (size: number) => {\n if (!started && !destroyed) {\n started = true;\n setTimeout(() => {\n if (destroyed) return;\n\n try {\n const data = this.getDecompressedFolder(folderIdx);\n\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 if (fileStart + fileSize > data.length) {\n stream.destroy(createCodedError(`File data out of bounds: offset ${fileStart} + size ${fileSize} > decompressed length ${data.length}`, ErrorCode.DECOMPRESSION_FAILED));\n return;\n }\n\n const fileData = data.slice(fileStart, fileStart + fileSize);\n\n if (entry._crc !== undefined) {\n const actualCRC = crc32(fileData);\n if (actualCRC !== entry._crc) {\n stream.destroy(createCodedError(`CRC mismatch for ${entry.path}: expected ${entry._crc.toString(16)}, got ${actualCRC.toString(16)}`, ErrorCode.CRC_MISMATCH));\n return;\n }\n }\n\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 if (!destroyed) {\n stream.push(fileData);\n stream.push(null);\n }\n } catch (err) {\n if (!destroyed) {\n stream.destroy(err as Error);\n }\n }\n }, 0);\n }\n return originalRead(size);\n };\n\n // Override destroy to set destroyed flag\n // IMPORTANT: Emit error synchronously BEFORE calling original destroy.\n // On older Node, destroy() emits 'finish' and 'end' before 'error',\n // which causes piped streams to complete successfully before the error fires.\n const streamWithDestroy = stream as NodeJS.ReadableStream & { destroy?: (err?: Error) => NodeJS.ReadableStream };\n const originalDestroy = typeof streamWithDestroy.destroy === 'function' ? streamWithDestroy.destroy.bind(stream) : null;\n streamWithDestroy.destroy = (err?: Error) => {\n destroyed = true;\n if (err) stream.emit('error', err);\n if (originalDestroy) return originalDestroy();\n return stream;\n };\n\n return stream;\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 * 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 // STREAMING METHODS (Phase 1+)\n // ============================================================\n\n /**\n * Check if a codec supports true streaming decompression.\n *\n * Only codecs that process data incrementally (not buffering entire input) qualify.\n * @param codecId - The codec ID as an array of bytes\n * @returns true if the codec can stream\n */\n private codecSupportsStreaming(codecId: number[]): boolean {\n // Convert to string key for comparison\n const key = codecId.map((b) => b.toString(16).toUpperCase()).join('-');\n\n // BZip2 - unbzip2-stream processes blocks incrementally\n if (key === '4-2-2') return true;\n\n // Copy/Store - PassThrough, obviously streams\n if (key === '0') return true;\n\n // Deflate - now uses zlib.createInflateRaw() which streams\n if (key === '4-1-8') return true;\n\n // Delta - now uses streaming Transform (Phase 2.5)\n if (key === '3') return true;\n\n // BCJ x86 - now uses streaming Transform (Phase 3.5)\n if (key === '3-3-1-3') return true;\n\n // BCJ ARM - now uses streaming Transform (Phase 3.5)\n if (key === '3-3-1-5') return true;\n\n // LZMA2 - now uses streaming Transform (Phase 5)\n if (key === '21') return true;\n\n // LZMA - still buffer-based (TODO: Phase 5 continuation)\n // Other BCJ variants (ARM64, ARMT, IA64, PPC, SPARC) - still buffer-based\n // BCJ2 - multi-stream architecture, never streamable\n return false;\n }\n\n /**\n * Check if a folder can be streamed (vs buffered).\n *\n * Streaming is possible when ALL codecs in the chain support streaming.\n * BCJ2 folders are never streamable due to their 4-stream architecture.\n *\n * @param folderIndex - Index of the folder to check\n * @returns true if the folder can be streamed\n */\n canStreamFolder(folderIndex: number): boolean {\n if (!this.streamsInfo) return false;\n\n const folder = this.streamsInfo.folders[folderIndex];\n if (!folder) return false;\n\n // BCJ2 requires special multi-stream handling - not streamable\n if (this.folderHasBcj2(folder)) {\n return false;\n }\n\n // Check if ALL codecs in chain support streaming\n for (let i = 0; i < folder.coders.length; i++) {\n if (!this.codecSupportsStreaming(folder.coders[i].id)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Stream a folder's decompression.\n *\n * Creates a pipeline: packed data → codec decoders → output stream\n *\n * @param folderIndex - Index of folder to decompress\n * @returns Object with output stream and control methods\n */\n streamFolder(folderIndex: number): {\n output: Readable;\n pause: () => void;\n resume: () => void;\n destroy: (err?: Error) => void;\n } {\n if (!this.streamsInfo) {\n throw createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER);\n }\n\n if (!this.canStreamFolder(folderIndex)) {\n throw createCodedError('Folder does not support streaming', ErrorCode.UNSUPPORTED_CODEC);\n }\n\n const folder = this.streamsInfo.folders[folderIndex];\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 // Create readable stream from packed data\n const packedStream = this.source.createReadStream(packPos, packSize);\n\n // Build codec pipeline\n let stream: Readable = packedStream;\n const decoders: Stream.Transform[] = [];\n\n for (let i = 0; i < folder.coders.length; i++) {\n const coderInfo = folder.coders[i];\n const codec = getCodec(coderInfo.id);\n const unpackSize = folder.unpackSizes[i];\n const decoder = codec.createDecoder(coderInfo.properties, unpackSize);\n decoders.push(decoder);\n stream = stream.pipe(decoder);\n }\n\n return {\n output: stream,\n pause: () => packedStream.pause(),\n resume: () => packedStream.resume(),\n destroy: (err?: Error) => {\n // Check for destroy method existence (not available in Node 4 and earlier)\n const ps = packedStream as NodeJS.ReadableStream & { destroy?: (err?: Error) => void };\n if (typeof ps.destroy === 'function') ps.destroy(err);\n for (let i = 0; i < decoders.length; i++) {\n const d = decoders[i] as NodeJS.ReadableStream & { destroy?: (err?: Error) => void };\n if (typeof d.destroy === 'function') d.destroy(err);\n }\n },\n };\n }\n\n /**\n * Get a streaming entry stream (Promise-based API).\n *\n * For streamable folders: Returns a true streaming decompression\n * For non-streamable folders: Falls back to buffered extraction\n *\n * @param entry - The entry to get stream for\n * @returns Promise resolving to readable stream\n */\n async getEntryStreamStreaming(entry: SevenZipEntry): Promise<Readable> {\n if (!entry._hasStream || entry.type === 'directory') {\n const emptyStream = new PassThrough();\n emptyStream.end();\n return emptyStream;\n }\n\n const folderIndex = entry._folderIndex;\n\n // Fall back to buffered if not streamable\n if (!this.canStreamFolder(folderIndex)) {\n return this.getEntryStream(entry);\n }\n\n const filesInFolder = this.filesPerFolder[folderIndex] || 1;\n\n if (filesInFolder === 1) {\n // Single file - direct streaming\n return this.getEntryStreamDirect(entry);\n }\n // Multi-file folders use FolderStreamSplitter (Phase 2)\n return this.getEntryStreamFromSplitter(entry);\n }\n\n /**\n * Direct streaming for single-file folders.\n * Pipes folder decompression directly to output with CRC verification.\n */\n private getEntryStreamDirect(entry: SevenZipEntry): Promise<Readable> {\n return new Promise((resolve, reject) => {\n const outputStream = new PassThrough();\n let crcValue = 0;\n const verifyCrc = entry._crc !== undefined;\n\n try {\n const folderStream = this.streamFolder(entry._folderIndex);\n\n folderStream.output.on('data', (chunk: Buffer) => {\n if (verifyCrc) {\n crcValue = crc32(chunk, crcValue);\n }\n\n // Handle backpressure\n if (!outputStream.write(chunk)) {\n folderStream.pause();\n outputStream.once('drain', () => folderStream.resume());\n }\n });\n\n folderStream.output.on('end', () => {\n // Verify CRC\n if (verifyCrc && crcValue !== entry._crc) {\n const err = createCodedError(`CRC mismatch for ${entry.path}: expected ${entry._crc?.toString(16)}, got ${crcValue.toString(16)}`, ErrorCode.CRC_MISMATCH);\n outputStream.destroy(err);\n return;\n }\n\n outputStream.end();\n\n // Track extraction\n this.extractedPerFolder[entry._folderIndex] = (this.extractedPerFolder[entry._folderIndex] || 0) + 1;\n });\n\n folderStream.output.on('error', (err: Error) => {\n outputStream.destroy(err);\n });\n\n resolve(outputStream);\n } catch (err) {\n reject(err);\n }\n });\n }\n\n /**\n * Get stream from folder splitter (for multi-file folders).\n * Creates splitter on first access, reuses for subsequent files in same folder.\n */\n private getEntryStreamFromSplitter(entry: SevenZipEntry): Promise<Readable> {\n return new Promise((resolve, reject) => {\n const folderIndex = entry._folderIndex;\n\n // Get or create splitter for this folder\n let splitter = this.folderSplitters[folderIndex];\n\n if (!splitter) {\n // Create new splitter with file sizes and CRCs\n const folderInfo = this.getFolderFileInfo(folderIndex);\n\n splitter = new FolderStreamSplitter({\n fileSizes: folderInfo.fileSizes,\n verifyCrc: true,\n expectedCrcs: folderInfo.expectedCrcs,\n });\n\n this.folderSplitters[folderIndex] = splitter;\n\n // Start streaming the folder\n let folderStream: ReturnType<typeof this.streamFolder>;\n try {\n folderStream = this.streamFolder(folderIndex);\n } catch (err) {\n delete this.folderSplitters[folderIndex];\n reject(err);\n return;\n }\n\n folderStream.output.on('data', (chunk: Buffer) => {\n // Handle backpressure from splitter\n if (!splitter?.write(chunk)) {\n folderStream.pause();\n splitter?.onDrain(() => {\n folderStream.resume();\n });\n }\n });\n\n folderStream.output.on('end', () => {\n splitter?.end();\n delete this.folderSplitters[folderIndex];\n });\n\n folderStream.output.on('error', (_err: Error) => {\n splitter?.end();\n delete this.folderSplitters[folderIndex];\n });\n }\n\n // Get this entry's stream from splitter\n try {\n const fileStream = splitter.getFileStream(entry._streamIndexInFolder);\n\n // Track extraction when stream ends\n fileStream.on('end', () => {\n this.extractedPerFolder[folderIndex] = (this.extractedPerFolder[folderIndex] || 0) + 1;\n });\n\n resolve(fileStream);\n } catch (err) {\n reject(err);\n }\n });\n }\n\n /**\n * Get file sizes and CRCs for all files in a folder (in stream order).\n * Used by FolderStreamSplitter to know file boundaries.\n */\n private getFolderFileInfo(folderIndex: number): {\n fileSizes: number[];\n expectedCrcs: (number | undefined)[];\n } {\n const fileSizes: number[] = [];\n const expectedCrcs: (number | undefined)[] = [];\n\n // Collect entries in this folder, sorted by stream index\n const folderEntries: SevenZipEntry[] = [];\n for (let i = 0; i < this.entries.length; i++) {\n const e = this.entries[i];\n if (e._folderIndex === folderIndex && e._hasStream) {\n folderEntries.push(e);\n }\n }\n\n // Sort by stream index within folder\n folderEntries.sort((a, b) => a._streamIndexInFolder - b._streamIndexInFolder);\n\n for (let i = 0; i < folderEntries.length; i++) {\n const entry = folderEntries[i];\n fileSizes.push(entry.size);\n expectedCrcs.push(entry._crc);\n }\n\n return { fileSizes: fileSizes, expectedCrcs: expectedCrcs };\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":["crc32","PassThrough","decodeBcj2Multi","getCodec","getCodecName","isBcj2Codec","isCodecSupported","FolderStreamSplitter","createCodedError","ErrorCode","FileAttribute","PropertyId","SIGNATURE_HEADER_SIZE","parseEncodedHeader","parseHeaderContent","parseSignatureHeader","readNumber","BufferSource","FileSource","SevenZipParser","parse","parsed","sigBuf","source","read","length","TRUNCATED_ARCHIVE","signature","headerOffset","nextHeaderOffset","headerBuf","nextHeaderSize","headerResult","nextHeaderCRC","streamsInfo","filesInfo","err","codedErr","code","COMPRESSED_HEADER","handleCompressedHeader","buildEntries","offset","propertyId","kMainStreamsInfo","kPackInfo","CORRUPT_HEADER","packInfoResult","parseEncodedHeaderStreams","compressedStart","packPos","compressedData","packSize","codec","codecId","decompressedHeader","decode","properties","unpackSize","unpackCRC","undefined","actualCRC","packAreaEnd","searchStart","searchEnd","Math","max","scanChunkSize","searchLoop","chunkStart","chunk","i","min","candidateData","subarray","candidateDecompressed","candCRC","decompOffset","headerId","kHeader","result","buf","kEnd","packPosResult","value","bytesRead","numPackResult","kSize","sizeResult","kUnpackInfo","kFolder","numFoldersResult","numCodersResult","flags","idSize","hasAttributes","push","propsLenResult","slice","kCodersUnpackSize","unpackSizeResult","kCRC","allDefined","readUInt32LE","entries","file","createEntry","streamsPerFolder","numUnpackStreamsPerFolder","f","filesPerFolder","extractedPerFolder","streamIndex","folderIndex","streamInFolder","folderStreamCount","j","fileInfo","size","hasStream","unpackSizes","entry","_streamIndex","unpackCRCs","_crc","_hasStream","_folderIndex","_canStream","canStreamFolder","type","isDirectory","mode","attributes","UNIX_EXTENSION","name","getBaseName","path","mtime","atime","ctime","isAntiFile","_streamIndexInFolder","getEntries","getEntryStream","emptyStream","end","folder","folders","coders","coder","id","codecName","UNSUPPORTED_CODEC","filesInFolder","_getEntryStreamStreaming","_getEntryStreamBuffered","started","destroyed","folderStream","stream","originalRead","_read","bind","setTimeout","crcValue","verifyCrc","streamFolder","output","on","write","pause","once","resume","destroy","toString","CRC_MISMATCH","streamWithDestroy","originalDestroy","emit","folderIdx","data","getDecompressedFolder","fileStart","m","prevStreamGlobalIndex","fileSize","DECOMPRESSION_FAILED","fileData","decompressedCache","folderHasBcj2","extractedFromFolder","remainingFiles","shouldCache","decompressBcj2Folder","packStreamIndex","packedStreams","k","packSizes","packedData","data2","l","coderInfo","numPackStreams","packStreams","currentPos","p","coderOutputs","bcj2CoderIndex","c","inputToPackStream","pi","outputToCoder","totalOutputs","co","numOut","numOutStreams","outp","processed","processOrder","getCoderProcessOrder","po","coderIdx","coderInputStart","ci2","numInStreams","inputIdx","packStreamIdx","inputData","outputData","coderOutputStart","co2","bcj2InputStart","ci3","bcj2Inputs","bi","globalIdx","boundOutput","bp2","bindPairs","inIndex","outIndex","psIdx","bcj2OutputStart","co3","bcj2UnpackSize","key","excludeIdx","order","changed","inputStart","canProcess","inp","bp","outIdx","outStart","oc","close","codecSupportsStreaming","map","b","toUpperCase","join","packedStream","createReadStream","decoders","decoder","createDecoder","pipe","ps","d","getEntryStreamStreaming","getEntryStreamDirect","getEntryStreamFromSplitter","Promise","resolve","reject","outputStream","splitter","folderSplitters","folderInfo","getFolderFileInfo","fileSizes","expectedCrcs","onDrain","_err","fileStream","getFileStream","folderEntries","e","sort","a","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":["/**\n * SevenZipParser - Main 7z archive parser\n *\n * Handles reading archive structure and providing file streams.\n *\n * Parser Flow:\n * 1. Read signature header (32 bytes) to get header location\n * 2. Read encoded header from nextHeaderOffset\n * 3. If header is compressed, decompress it first\n * 4. Parse streams info (folder structure, pack positions)\n * 5. Parse files info (names, sizes, attributes)\n * 6. Build entry list for iteration\n *\n * Decompression:\n * - 7z uses \"folders\" as decompression units\n * - Solid archives: multiple files share one folder (decompress once)\n * - Non-solid: one file per folder\n * - Supports LZMA, LZMA2, COPY, BCJ2, and other codecs\n */\n\nimport { crc32, PassThrough } from 'extract-base-iterator';\nimport type Stream from 'stream';\nimport { defer } from '../lib/defer.ts';\nimport type { ArchiveSource } from './ArchiveSource.ts';\nimport { decodeBcj2Multi, getCodec, getCodecName, isBcj2Codec, isCodecSupported } from './codecs/index.ts';\nimport { FolderStreamSplitter } from './FolderStreamSplitter.ts';\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// Re-export for backwards compatibility\nexport { type ArchiveSource, BufferSource, FileSource } from './ArchiveSource.ts';\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 _canStream: boolean; // Whether this entry's folder supports streaming decompression\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 // Splitter cache for multi-file folder streaming (Phase 2)\n private folderSplitters: { [key: number]: FolderStreamSplitter } = {};\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 // Set _canStream for all entries now that we have complete folder info\n // This must be done after all entries are built because canStreamFolder\n // relies on the folder structure being fully parsed\n for (let i = 0; i < this.entries.length; i++) {\n const entry = this.entries[i];\n if (entry._hasStream && entry._folderIndex >= 0) {\n entry._canStream = this.canStreamFolder(entry._folderIndex);\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 _canStream: false, // Set after parsing completes when canStreamFolder is available\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 * Returns immediately - decompression happens when data is read (proper streaming).\n * Uses true streaming for codecs that support it, buffered for others.\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 // Use true streaming for single-file folders that support it.\n // Multi-file folders use buffered approach because streaming requires\n // accessing files in order, which doesn't work with concurrent extraction.\n const filesInFolder = this.filesPerFolder[entry._folderIndex] || 1;\n if (entry._canStream && filesInFolder === 1) {\n return this._getEntryStreamStreaming(entry);\n }\n return this._getEntryStreamBuffered(entry);\n }\n\n /**\n * True streaming: data flows through without buffering entire folder.\n * Only used for single-file folders with streamable codecs (BZip2, Deflate, LZMA2).\n */\n private _getEntryStreamStreaming(entry: SevenZipEntry): Readable {\n let started = false;\n let destroyed = false;\n let folderStream: ReturnType<typeof this.streamFolder> | null = null;\n\n const stream = new PassThrough();\n\n const originalRead = stream._read.bind(stream);\n stream._read = (size: number) => {\n if (!started && !destroyed) {\n started = true;\n defer(() => {\n if (destroyed) return;\n\n try {\n let crcValue = 0;\n const verifyCrc = entry._crc !== undefined;\n folderStream = this.streamFolder(entry._folderIndex);\n\n folderStream.output.on('data', (chunk: Buffer) => {\n if (destroyed) return;\n if (verifyCrc) {\n crcValue = crc32(chunk, crcValue);\n }\n if (!stream.write(chunk)) {\n folderStream?.pause();\n stream.once('drain', () => folderStream?.resume());\n }\n });\n\n folderStream.output.on('end', () => {\n if (destroyed) return;\n if (verifyCrc && crcValue !== entry._crc) {\n stream.destroy(createCodedError(`CRC mismatch for ${entry.path}: expected ${entry._crc?.toString(16)}, got ${crcValue.toString(16)}`, ErrorCode.CRC_MISMATCH));\n return;\n }\n stream.end();\n this.extractedPerFolder[entry._folderIndex] = (this.extractedPerFolder[entry._folderIndex] || 0) + 1;\n });\n\n folderStream.output.on('error', (err: Error) => {\n if (!destroyed) stream.destroy(err);\n });\n } catch (err) {\n if (!destroyed) {\n stream.destroy(err as Error);\n }\n }\n });\n }\n return originalRead(size);\n };\n\n // Override destroy to clean up folder stream\n // IMPORTANT: Emit error synchronously BEFORE calling original destroy.\n // On older Node, destroy() emits 'finish' and 'end' before 'error',\n // which causes piped streams to complete successfully before the error fires.\n const streamWithDestroy = stream as NodeJS.ReadableStream & { destroy?: (err?: Error) => NodeJS.ReadableStream };\n const originalDestroy = typeof streamWithDestroy.destroy === 'function' ? streamWithDestroy.destroy.bind(stream) : null;\n streamWithDestroy.destroy = (err?: Error) => {\n destroyed = true;\n if (err) stream.emit('error', err);\n if (folderStream) folderStream.destroy();\n if (originalDestroy) return originalDestroy();\n return stream;\n };\n\n return stream;\n }\n\n /**\n * Buffered extraction: decompress entire folder, slice out file.\n * Used for codecs that don't support incremental streaming (LZMA1, BCJ2).\n */\n private _getEntryStreamBuffered(entry: SevenZipEntry): Readable {\n if (!this.streamsInfo) {\n throw createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER);\n }\n const streamsInfo = this.streamsInfo;\n const folderIdx = entry._folderIndex;\n let started = false;\n let destroyed = false;\n\n const stream = new PassThrough();\n\n const originalRead = stream._read.bind(stream);\n stream._read = (size: number) => {\n if (!started && !destroyed) {\n started = true;\n defer(() => {\n if (destroyed) return;\n\n try {\n const data = this.getDecompressedFolder(folderIdx);\n\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 if (fileStart + fileSize > data.length) {\n stream.destroy(createCodedError(`File data out of bounds: offset ${fileStart} + size ${fileSize} > decompressed length ${data.length}`, ErrorCode.DECOMPRESSION_FAILED));\n return;\n }\n\n const fileData = data.slice(fileStart, fileStart + fileSize);\n\n if (entry._crc !== undefined) {\n const actualCRC = crc32(fileData);\n if (actualCRC !== entry._crc) {\n stream.destroy(createCodedError(`CRC mismatch for ${entry.path}: expected ${entry._crc.toString(16)}, got ${actualCRC.toString(16)}`, ErrorCode.CRC_MISMATCH));\n return;\n }\n }\n\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 if (!destroyed) {\n stream.push(fileData);\n stream.push(null);\n }\n } catch (err) {\n if (!destroyed) {\n stream.destroy(err as Error);\n }\n }\n });\n }\n return originalRead(size);\n };\n\n // Override destroy to set destroyed flag\n // IMPORTANT: Emit error synchronously BEFORE calling original destroy.\n // On older Node, destroy() emits 'finish' and 'end' before 'error',\n // which causes piped streams to complete successfully before the error fires.\n const streamWithDestroy = stream as NodeJS.ReadableStream & { destroy?: (err?: Error) => NodeJS.ReadableStream };\n const originalDestroy = typeof streamWithDestroy.destroy === 'function' ? streamWithDestroy.destroy.bind(stream) : null;\n streamWithDestroy.destroy = (err?: Error) => {\n destroyed = true;\n if (err) stream.emit('error', err);\n if (originalDestroy) return originalDestroy();\n return stream;\n };\n\n return stream;\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 // Use Math.max to prevent 32-bit signed overflow\n const signedHeaderSize = SIGNATURE_HEADER_SIZE;\n const signedPackPos = this.streamsInfo.packPos;\n let packPos = Math.max(signedHeaderSize, 0) + Math.max(signedPackPos, 0);\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 - PREVENT OVERFLOW\n for (let k = 0; k < packStreamIndex; k++) {\n const size = this.streamsInfo.packSizes[k];\n if (packPos + size < packPos) {\n throw createCodedError(`Pack position overflow at index ${k}`, ErrorCode.CORRUPT_ARCHIVE);\n }\n packPos += size;\n }\n\n const packSize = this.streamsInfo.packSizes[packStreamIndex];\n\n // Validate pack size to prevent overflow\n // Upper bound is Number.MAX_SAFE_INTEGER (2^53-1 = 9PB) - safe for all realistic archives\n if (packSize < 0 || packSize > Number.MAX_SAFE_INTEGER) {\n throw createCodedError(`Invalid pack size: ${packSize}`, ErrorCode.CORRUPT_ARCHIVE);\n }\n\n if (packPos < 0 || packPos > Number.MAX_SAFE_INTEGER) {\n throw createCodedError(`Invalid pack position: ${packPos}`, ErrorCode.CORRUPT_ARCHIVE);\n }\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 // Validate unpack size to prevent overflow\n if (unpackSize < 0 || unpackSize > Number.MAX_SAFE_INTEGER) {\n throw createCodedError(`Invalid unpack size: ${unpackSize}`, ErrorCode.CORRUPT_ARCHIVE);\n }\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 * 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 // STREAMING METHODS (Phase 1+)\n // ============================================================\n\n /**\n * Check if a codec supports true streaming decompression.\n *\n * Only codecs that process data incrementally (not buffering entire input) qualify.\n * @param codecId - The codec ID as an array of bytes\n * @returns true if the codec can stream\n */\n private codecSupportsStreaming(codecId: number[]): boolean {\n // Convert to string key for comparison\n const key = codecId.map((b) => b.toString(16).toUpperCase()).join('-');\n\n // BZip2 - unbzip2-stream processes blocks incrementally\n if (key === '4-2-2') return true;\n\n // Copy/Store - PassThrough, obviously streams\n if (key === '0') return true;\n\n // Deflate - now uses zlib.createInflateRaw() which streams\n if (key === '4-1-8') return true;\n\n // Delta - now uses streaming Transform (Phase 2.5)\n if (key === '3') return true;\n\n // BCJ x86 - now uses streaming Transform (Phase 3.5)\n if (key === '3-3-1-3') return true;\n\n // BCJ ARM - now uses streaming Transform (Phase 3.5)\n if (key === '3-3-1-5') return true;\n\n // LZMA2 - now uses streaming Transform (Phase 5)\n if (key === '21') return true;\n\n // LZMA - still buffer-based (TODO: Phase 5 continuation)\n // Other BCJ variants (ARM64, ARMT, IA64, PPC, SPARC) - still buffer-based\n // BCJ2 - multi-stream architecture, never streamable\n return false;\n }\n\n /**\n * Check if a folder can be streamed (vs buffered).\n *\n * Streaming is possible when ALL codecs in the chain support streaming.\n * BCJ2 folders are never streamable due to their 4-stream architecture.\n *\n * @param folderIndex - Index of the folder to check\n * @returns true if the folder can be streamed\n */\n canStreamFolder(folderIndex: number): boolean {\n if (!this.streamsInfo) return false;\n\n const folder = this.streamsInfo.folders[folderIndex];\n if (!folder) return false;\n\n // BCJ2 requires special multi-stream handling - not streamable\n if (this.folderHasBcj2(folder)) {\n return false;\n }\n\n // Check if ALL codecs in chain support streaming\n for (let i = 0; i < folder.coders.length; i++) {\n if (!this.codecSupportsStreaming(folder.coders[i].id)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Stream a folder's decompression.\n *\n * Creates a pipeline: packed data → codec decoders → output stream\n *\n * @param folderIndex - Index of folder to decompress\n * @returns Object with output stream and control methods\n */\n streamFolder(folderIndex: number): {\n output: Readable;\n pause: () => void;\n resume: () => void;\n destroy: (err?: Error) => void;\n } {\n if (!this.streamsInfo) {\n throw createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER);\n }\n\n if (!this.canStreamFolder(folderIndex)) {\n throw createCodedError('Folder does not support streaming', ErrorCode.UNSUPPORTED_CODEC);\n }\n\n const folder = this.streamsInfo.folders[folderIndex];\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 // Create readable stream from packed data\n const packedStream = this.source.createReadStream(packPos, packSize);\n\n // Build codec pipeline\n let stream: Readable = packedStream;\n const decoders: Stream.Transform[] = [];\n\n for (let i = 0; i < folder.coders.length; i++) {\n const coderInfo = folder.coders[i];\n const codec = getCodec(coderInfo.id);\n const unpackSize = folder.unpackSizes[i];\n const decoder = codec.createDecoder(coderInfo.properties, unpackSize);\n decoders.push(decoder);\n stream = stream.pipe(decoder);\n }\n\n return {\n output: stream,\n pause: () => packedStream.pause(),\n resume: () => packedStream.resume(),\n destroy: (err?: Error) => {\n // Check for destroy method existence (not available in Node 4 and earlier)\n const ps = packedStream as NodeJS.ReadableStream & { destroy?: (err?: Error) => void };\n if (typeof ps.destroy === 'function') ps.destroy(err);\n for (let i = 0; i < decoders.length; i++) {\n const d = decoders[i] as NodeJS.ReadableStream & { destroy?: (err?: Error) => void };\n if (typeof d.destroy === 'function') d.destroy(err);\n }\n },\n };\n }\n\n /**\n * Get a streaming entry stream (Promise-based API).\n *\n * For streamable folders: Returns a true streaming decompression\n * For non-streamable folders: Falls back to buffered extraction\n *\n * @param entry - The entry to get stream for\n * @returns Promise resolving to readable stream\n */\n async getEntryStreamStreaming(entry: SevenZipEntry): Promise<Readable> {\n if (!entry._hasStream || entry.type === 'directory') {\n const emptyStream = new PassThrough();\n emptyStream.end();\n return emptyStream;\n }\n\n const folderIndex = entry._folderIndex;\n\n // Fall back to buffered if not streamable\n if (!this.canStreamFolder(folderIndex)) {\n return this.getEntryStream(entry);\n }\n\n const filesInFolder = this.filesPerFolder[folderIndex] || 1;\n\n if (filesInFolder === 1) {\n // Single file - direct streaming\n return this.getEntryStreamDirect(entry);\n }\n // Multi-file folders use FolderStreamSplitter (Phase 2)\n return this.getEntryStreamFromSplitter(entry);\n }\n\n /**\n * Direct streaming for single-file folders.\n * Pipes folder decompression directly to output with CRC verification.\n */\n private getEntryStreamDirect(entry: SevenZipEntry): Promise<Readable> {\n return new Promise((resolve, reject) => {\n const outputStream = new PassThrough();\n let crcValue = 0;\n const verifyCrc = entry._crc !== undefined;\n\n try {\n const folderStream = this.streamFolder(entry._folderIndex);\n\n folderStream.output.on('data', (chunk: Buffer) => {\n if (verifyCrc) {\n crcValue = crc32(chunk, crcValue);\n }\n\n // Handle backpressure\n if (!outputStream.write(chunk)) {\n folderStream.pause();\n outputStream.once('drain', () => folderStream.resume());\n }\n });\n\n folderStream.output.on('end', () => {\n // Verify CRC\n if (verifyCrc && crcValue !== entry._crc) {\n const err = createCodedError(`CRC mismatch for ${entry.path}: expected ${entry._crc?.toString(16)}, got ${crcValue.toString(16)}`, ErrorCode.CRC_MISMATCH);\n outputStream.destroy(err);\n return;\n }\n\n outputStream.end();\n\n // Track extraction\n this.extractedPerFolder[entry._folderIndex] = (this.extractedPerFolder[entry._folderIndex] || 0) + 1;\n });\n\n folderStream.output.on('error', (err: Error) => {\n outputStream.destroy(err);\n });\n\n resolve(outputStream);\n } catch (err) {\n reject(err);\n }\n });\n }\n\n /**\n * Get stream from folder splitter (for multi-file folders).\n * Creates splitter on first access, reuses for subsequent files in same folder.\n */\n private getEntryStreamFromSplitter(entry: SevenZipEntry): Promise<Readable> {\n return new Promise((resolve, reject) => {\n const folderIndex = entry._folderIndex;\n\n // Get or create splitter for this folder\n let splitter = this.folderSplitters[folderIndex];\n\n if (!splitter) {\n // Create new splitter with file sizes and CRCs\n const folderInfo = this.getFolderFileInfo(folderIndex);\n\n splitter = new FolderStreamSplitter({\n fileSizes: folderInfo.fileSizes,\n verifyCrc: true,\n expectedCrcs: folderInfo.expectedCrcs,\n });\n\n this.folderSplitters[folderIndex] = splitter;\n\n // Start streaming the folder\n let folderStream: ReturnType<typeof this.streamFolder>;\n try {\n folderStream = this.streamFolder(folderIndex);\n } catch (err) {\n delete this.folderSplitters[folderIndex];\n reject(err);\n return;\n }\n\n folderStream.output.on('data', (chunk: Buffer) => {\n // Handle backpressure from splitter\n if (!splitter?.write(chunk)) {\n folderStream.pause();\n splitter?.onDrain(() => {\n folderStream.resume();\n });\n }\n });\n\n folderStream.output.on('end', () => {\n splitter?.end();\n delete this.folderSplitters[folderIndex];\n });\n\n folderStream.output.on('error', (_err: Error) => {\n splitter?.end();\n delete this.folderSplitters[folderIndex];\n });\n }\n\n // Get this entry's stream from splitter\n try {\n const fileStream = splitter.getFileStream(entry._streamIndexInFolder);\n\n // Track extraction when stream ends\n fileStream.on('end', () => {\n this.extractedPerFolder[folderIndex] = (this.extractedPerFolder[folderIndex] || 0) + 1;\n });\n\n resolve(fileStream);\n } catch (err) {\n reject(err);\n }\n });\n }\n\n /**\n * Get file sizes and CRCs for all files in a folder (in stream order).\n * Used by FolderStreamSplitter to know file boundaries.\n */\n private getFolderFileInfo(folderIndex: number): {\n fileSizes: number[];\n expectedCrcs: (number | undefined)[];\n } {\n const fileSizes: number[] = [];\n const expectedCrcs: (number | undefined)[] = [];\n\n // Collect entries in this folder, sorted by stream index\n const folderEntries: SevenZipEntry[] = [];\n for (let i = 0; i < this.entries.length; i++) {\n const e = this.entries[i];\n if (e._folderIndex === folderIndex && e._hasStream) {\n folderEntries.push(e);\n }\n }\n\n // Sort by stream index within folder\n folderEntries.sort((a, b) => a._streamIndexInFolder - b._streamIndexInFolder);\n\n for (let i = 0; i < folderEntries.length; i++) {\n const entry = folderEntries[i];\n fileSizes.push(entry.size);\n expectedCrcs.push(entry._crc);\n }\n\n return { fileSizes: fileSizes, expectedCrcs: expectedCrcs };\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":["crc32","PassThrough","defer","decodeBcj2Multi","getCodec","getCodecName","isBcj2Codec","isCodecSupported","FolderStreamSplitter","createCodedError","ErrorCode","FileAttribute","PropertyId","SIGNATURE_HEADER_SIZE","parseEncodedHeader","parseHeaderContent","parseSignatureHeader","readNumber","BufferSource","FileSource","SevenZipParser","parse","parsed","sigBuf","source","read","length","TRUNCATED_ARCHIVE","signature","headerOffset","nextHeaderOffset","headerBuf","nextHeaderSize","headerResult","nextHeaderCRC","streamsInfo","filesInfo","err","codedErr","code","COMPRESSED_HEADER","handleCompressedHeader","buildEntries","offset","propertyId","kMainStreamsInfo","kPackInfo","CORRUPT_HEADER","packInfoResult","parseEncodedHeaderStreams","compressedStart","packPos","compressedData","packSize","codec","codecId","decompressedHeader","decode","properties","unpackSize","unpackCRC","undefined","actualCRC","packAreaEnd","searchStart","searchEnd","Math","max","scanChunkSize","searchLoop","chunkStart","chunk","i","min","candidateData","subarray","candidateDecompressed","candCRC","decompOffset","headerId","kHeader","result","buf","kEnd","packPosResult","value","bytesRead","numPackResult","kSize","sizeResult","kUnpackInfo","kFolder","numFoldersResult","numCodersResult","flags","idSize","hasAttributes","push","propsLenResult","slice","kCodersUnpackSize","unpackSizeResult","kCRC","allDefined","readUInt32LE","entries","file","createEntry","streamsPerFolder","numUnpackStreamsPerFolder","f","filesPerFolder","extractedPerFolder","streamIndex","folderIndex","streamInFolder","folderStreamCount","j","fileInfo","size","hasStream","unpackSizes","entry","_streamIndex","unpackCRCs","_crc","_hasStream","_folderIndex","_canStream","canStreamFolder","type","isDirectory","mode","attributes","UNIX_EXTENSION","name","getBaseName","path","mtime","atime","ctime","isAntiFile","_streamIndexInFolder","getEntries","getEntryStream","emptyStream","end","folder","folders","coders","coder","id","codecName","UNSUPPORTED_CODEC","filesInFolder","_getEntryStreamStreaming","_getEntryStreamBuffered","started","destroyed","folderStream","stream","originalRead","_read","bind","crcValue","verifyCrc","streamFolder","output","on","write","pause","once","resume","destroy","toString","CRC_MISMATCH","streamWithDestroy","originalDestroy","emit","folderIdx","data","getDecompressedFolder","fileStart","m","prevStreamGlobalIndex","fileSize","DECOMPRESSION_FAILED","fileData","decompressedCache","folderHasBcj2","extractedFromFolder","remainingFiles","shouldCache","decompressBcj2Folder","signedHeaderSize","signedPackPos","packStreamIndex","packedStreams","k","packSizes","CORRUPT_ARCHIVE","Number","MAX_SAFE_INTEGER","packedData","data2","l","coderInfo","numPackStreams","packStreams","currentPos","p","coderOutputs","bcj2CoderIndex","c","inputToPackStream","pi","outputToCoder","totalOutputs","co","numOut","numOutStreams","outp","processed","processOrder","getCoderProcessOrder","po","coderIdx","coderInputStart","ci2","numInStreams","inputIdx","packStreamIdx","inputData","outputData","coderOutputStart","co2","bcj2InputStart","ci3","bcj2Inputs","bi","globalIdx","boundOutput","bp2","bindPairs","inIndex","outIndex","psIdx","bcj2OutputStart","co3","bcj2UnpackSize","key","excludeIdx","order","changed","inputStart","canProcess","inp","bp","outIdx","outStart","oc","close","codecSupportsStreaming","map","b","toUpperCase","join","packedStream","createReadStream","decoders","decoder","createDecoder","pipe","ps","d","getEntryStreamStreaming","getEntryStreamDirect","getEntryStreamFromSplitter","Promise","resolve","reject","outputStream","splitter","folderSplitters","folderInfo","getFolderFileInfo","fileSizes","expectedCrcs","onDrain","_err","fileStream","getFileStream","folderEntries","e","sort","a","lastSlash","lastIndexOf","lastBackslash","lastSep"],"mappings":"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"}
@@ -81,6 +81,7 @@ export declare const ErrorCode: {
81
81
  UNSUPPORTED_VERSION: string;
82
82
  UNSUPPORTED_FEATURE: string;
83
83
  TRUNCATED_ARCHIVE: string;
84
+ CORRUPT_ARCHIVE: string;
84
85
  CORRUPT_HEADER: string;
85
86
  ENCRYPTED_ARCHIVE: string;
86
87
  COMPRESSED_HEADER: string;
@@ -166,6 +166,7 @@ export const ErrorCode = {
166
166
  UNSUPPORTED_VERSION: 'UNSUPPORTED_VERSION',
167
167
  UNSUPPORTED_FEATURE: 'UNSUPPORTED_FEATURE',
168
168
  TRUNCATED_ARCHIVE: 'TRUNCATED_ARCHIVE',
169
+ CORRUPT_ARCHIVE: 'CORRUPT_ARCHIVE',
169
170
  CORRUPT_HEADER: 'CORRUPT_HEADER',
170
171
  ENCRYPTED_ARCHIVE: 'ENCRYPTED_ARCHIVE',
171
172
  COMPRESSED_HEADER: 'COMPRESSED_HEADER',
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/constants.ts"],"sourcesContent":["// 7z format constants\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n\n// 7z signature: '7z' + magic bytes\nexport const SEVENZ_MAGIC = [0x37, 0x7a, 0xbc, 0xaf, 0x27, 0x1c];\n\n// Header sizes\nexport const SIGNATURE_HEADER_SIZE = 32;\nexport const START_HEADER_SIZE = 20; // Part of signature header after magic + version\n\n// Property IDs for encoded header\nexport const PropertyId = {\n kEnd: 0x00,\n kHeader: 0x01,\n kArchiveProperties: 0x02,\n kAdditionalStreamsInfo: 0x03,\n kMainStreamsInfo: 0x04,\n kFilesInfo: 0x05,\n kPackInfo: 0x06,\n kUnpackInfo: 0x07,\n kSubStreamsInfo: 0x08,\n kSize: 0x09,\n kCRC: 0x0a,\n kFolder: 0x0b,\n kCodersUnpackSize: 0x0c,\n kNumUnpackStream: 0x0d,\n kEmptyStream: 0x0e,\n kEmptyFile: 0x0f,\n kAnti: 0x10,\n kName: 0x11,\n kCTime: 0x12,\n kATime: 0x13,\n kMTime: 0x14,\n kWinAttributes: 0x15,\n kComment: 0x16,\n kEncodedHeader: 0x17,\n kStartPos: 0x18,\n kDummy: 0x19,\n};\n\n// Codec IDs\n// 7z uses variable-length codec IDs\n// Reference: 7za i output shows hex codec IDs (e.g., 3030501 = ARM)\nexport const CodecId = {\n COPY: [0x00],\n DELTA: [0x03],\n LZMA: [0x03, 0x01, 0x01],\n LZMA2: [0x21],\n BCJ_X86: [0x03, 0x03, 0x01, 0x03],\n BCJ_PPC: [0x03, 0x03, 0x02, 0x05],\n BCJ_IA64: [0x03, 0x03, 0x04, 0x01],\n BCJ_ARM: [0x03, 0x03, 0x05, 0x01],\n BCJ_ARMT: [0x03, 0x03, 0x07, 0x01],\n BCJ_SPARC: [0x03, 0x03, 0x08, 0x05],\n BCJ_ARM64: [0x03, 0x03, 0x0a, 0x01],\n BCJ2: [0x03, 0x03, 0x01, 0x1b],\n PPMD: [0x03, 0x04, 0x01],\n DEFLATE: [0x04, 0x01, 0x08],\n BZIP2: [0x04, 0x02, 0x02],\n AES: [0x06, 0xf1, 0x07, 0x01],\n};\n\n// File attribute flags (Windows style, stored in FilesInfo)\nexport const FileAttribute = {\n READONLY: 0x01,\n HIDDEN: 0x02,\n SYSTEM: 0x04,\n DIRECTORY: 0x10,\n ARCHIVE: 0x20,\n DEVICE: 0x40,\n NORMAL: 0x80,\n TEMPORARY: 0x100,\n SPARSE_FILE: 0x200,\n REPARSE_POINT: 0x400,\n COMPRESSED: 0x800,\n OFFLINE: 0x1000,\n NOT_CONTENT_INDEXED: 0x2000,\n ENCRYPTED: 0x4000,\n UNIX_EXTENSION: 0x8000,\n};\n\n// Unix permission modes (decimal values for Node 0.8 compatibility)\nexport const UnixMode = {\n DIR: 16384, // 0o40000 - directory\n FILE: 32768, // 0o100000 - regular file\n SYMLINK: 40960, // 0o120000 - symbolic link\n RWXRWXRWX: 511, // 0o777\n RWXRXRX: 493, // 0o755\n RWRR: 420, // 0o644\n DEFAULT_DIR: 493, // 0o755 - rwxr-xr-x\n DEFAULT_FILE: 420, // 0o644 - rw-r--r--\n};\n\n// Error codes\nexport const ErrorCode = {\n INVALID_SIGNATURE: 'INVALID_SIGNATURE',\n CRC_MISMATCH: 'CRC_MISMATCH',\n UNSUPPORTED_CODEC: 'UNSUPPORTED_CODEC',\n UNSUPPORTED_VERSION: 'UNSUPPORTED_VERSION',\n UNSUPPORTED_FEATURE: 'UNSUPPORTED_FEATURE',\n TRUNCATED_ARCHIVE: 'TRUNCATED_ARCHIVE',\n CORRUPT_HEADER: 'CORRUPT_HEADER',\n ENCRYPTED_ARCHIVE: 'ENCRYPTED_ARCHIVE',\n COMPRESSED_HEADER: 'COMPRESSED_HEADER',\n DECOMPRESSION_FAILED: 'DECOMPRESSION_FAILED',\n};\n\n// Error with code property\nexport interface CodedError extends Error {\n code: string;\n}\n\n/**\n * Create an error with a code property\n */\nexport function createCodedError(message: string, code: string): CodedError {\n const err = new Error(message) as CodedError;\n err.code = code;\n return err;\n}\n"],"names":["SEVENZ_MAGIC","SIGNATURE_HEADER_SIZE","START_HEADER_SIZE","PropertyId","kEnd","kHeader","kArchiveProperties","kAdditionalStreamsInfo","kMainStreamsInfo","kFilesInfo","kPackInfo","kUnpackInfo","kSubStreamsInfo","kSize","kCRC","kFolder","kCodersUnpackSize","kNumUnpackStream","kEmptyStream","kEmptyFile","kAnti","kName","kCTime","kATime","kMTime","kWinAttributes","kComment","kEncodedHeader","kStartPos","kDummy","CodecId","COPY","DELTA","LZMA","LZMA2","BCJ_X86","BCJ_PPC","BCJ_IA64","BCJ_ARM","BCJ_ARMT","BCJ_SPARC","BCJ_ARM64","BCJ2","PPMD","DEFLATE","BZIP2","AES","FileAttribute","READONLY","HIDDEN","SYSTEM","DIRECTORY","ARCHIVE","DEVICE","NORMAL","TEMPORARY","SPARSE_FILE","REPARSE_POINT","COMPRESSED","OFFLINE","NOT_CONTENT_INDEXED","ENCRYPTED","UNIX_EXTENSION","UnixMode","DIR","FILE","SYMLINK","RWXRWXRWX","RWXRXRX","RWRR","DEFAULT_DIR","DEFAULT_FILE","ErrorCode","INVALID_SIGNATURE","CRC_MISMATCH","UNSUPPORTED_CODEC","UNSUPPORTED_VERSION","UNSUPPORTED_FEATURE","TRUNCATED_ARCHIVE","CORRUPT_HEADER","ENCRYPTED_ARCHIVE","COMPRESSED_HEADER","DECOMPRESSION_FAILED","createCodedError","message","code","err","Error"],"mappings":"AAAA,sBAAsB;AACtB,wEAAwE;AAExE,mCAAmC;AACnC,OAAO,MAAMA,eAAe;IAAC;IAAM;IAAM;IAAM;IAAM;IAAM;CAAK,CAAC;AAEjE,eAAe;AACf,OAAO,MAAMC,wBAAwB,GAAG;AACxC,OAAO,MAAMC,oBAAoB,GAAG,CAAC,iDAAiD;AAEtF,kCAAkC;AAClC,OAAO,MAAMC,aAAa;IACxBC,MAAM;IACNC,SAAS;IACTC,oBAAoB;IACpBC,wBAAwB;IACxBC,kBAAkB;IAClBC,YAAY;IACZC,WAAW;IACXC,aAAa;IACbC,iBAAiB;IACjBC,OAAO;IACPC,MAAM;IACNC,SAAS;IACTC,mBAAmB;IACnBC,kBAAkB;IAClBC,cAAc;IACdC,YAAY;IACZC,OAAO;IACPC,OAAO;IACPC,QAAQ;IACRC,QAAQ;IACRC,QAAQ;IACRC,gBAAgB;IAChBC,UAAU;IACVC,gBAAgB;IAChBC,WAAW;IACXC,QAAQ;AACV,EAAE;AAEF,YAAY;AACZ,oCAAoC;AACpC,oEAAoE;AACpE,OAAO,MAAMC,UAAU;IACrBC,MAAM;QAAC;KAAK;IACZC,OAAO;QAAC;KAAK;IACbC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,OAAO;QAAC;KAAK;IACbC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,UAAU;QAAC;QAAM;QAAM;QAAM;KAAK;IAClCC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,UAAU;QAAC;QAAM;QAAM;QAAM;KAAK;IAClCC,WAAW;QAAC;QAAM;QAAM;QAAM;KAAK;IACnCC,WAAW;QAAC;QAAM;QAAM;QAAM;KAAK;IACnCC,MAAM;QAAC;QAAM;QAAM;QAAM;KAAK;IAC9BC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,SAAS;QAAC;QAAM;QAAM;KAAK;IAC3BC,OAAO;QAAC;QAAM;QAAM;KAAK;IACzBC,KAAK;QAAC;QAAM;QAAM;QAAM;KAAK;AAC/B,EAAE;AAEF,4DAA4D;AAC5D,OAAO,MAAMC,gBAAgB;IAC3BC,UAAU;IACVC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,SAAS;IACTC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,aAAa;IACbC,eAAe;IACfC,YAAY;IACZC,SAAS;IACTC,qBAAqB;IACrBC,WAAW;IACXC,gBAAgB;AAClB,EAAE;AAEF,oEAAoE;AACpE,OAAO,MAAMC,WAAW;IACtBC,KAAK;IACLC,MAAM;IACNC,SAAS;IACTC,WAAW;IACXC,SAAS;IACTC,MAAM;IACNC,aAAa;IACbC,cAAc;AAChB,EAAE;AAEF,cAAc;AACd,OAAO,MAAMC,YAAY;IACvBC,mBAAmB;IACnBC,cAAc;IACdC,mBAAmB;IACnBC,qBAAqB;IACrBC,qBAAqB;IACrBC,mBAAmB;IACnBC,gBAAgB;IAChBC,mBAAmB;IACnBC,mBAAmB;IACnBC,sBAAsB;AACxB,EAAE;AAOF;;CAEC,GACD,OAAO,SAASC,iBAAiBC,OAAe,EAAEC,IAAY;IAC5D,MAAMC,MAAM,IAAIC,MAAMH;IACtBE,IAAID,IAAI,GAAGA;IACX,OAAOC;AACT"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/constants.ts"],"sourcesContent":["// 7z format constants\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n\n// 7z signature: '7z' + magic bytes\nexport const SEVENZ_MAGIC = [0x37, 0x7a, 0xbc, 0xaf, 0x27, 0x1c];\n\n// Header sizes\nexport const SIGNATURE_HEADER_SIZE = 32;\nexport const START_HEADER_SIZE = 20; // Part of signature header after magic + version\n\n// Property IDs for encoded header\nexport const PropertyId = {\n kEnd: 0x00,\n kHeader: 0x01,\n kArchiveProperties: 0x02,\n kAdditionalStreamsInfo: 0x03,\n kMainStreamsInfo: 0x04,\n kFilesInfo: 0x05,\n kPackInfo: 0x06,\n kUnpackInfo: 0x07,\n kSubStreamsInfo: 0x08,\n kSize: 0x09,\n kCRC: 0x0a,\n kFolder: 0x0b,\n kCodersUnpackSize: 0x0c,\n kNumUnpackStream: 0x0d,\n kEmptyStream: 0x0e,\n kEmptyFile: 0x0f,\n kAnti: 0x10,\n kName: 0x11,\n kCTime: 0x12,\n kATime: 0x13,\n kMTime: 0x14,\n kWinAttributes: 0x15,\n kComment: 0x16,\n kEncodedHeader: 0x17,\n kStartPos: 0x18,\n kDummy: 0x19,\n};\n\n// Codec IDs\n// 7z uses variable-length codec IDs\n// Reference: 7za i output shows hex codec IDs (e.g., 3030501 = ARM)\nexport const CodecId = {\n COPY: [0x00],\n DELTA: [0x03],\n LZMA: [0x03, 0x01, 0x01],\n LZMA2: [0x21],\n BCJ_X86: [0x03, 0x03, 0x01, 0x03],\n BCJ_PPC: [0x03, 0x03, 0x02, 0x05],\n BCJ_IA64: [0x03, 0x03, 0x04, 0x01],\n BCJ_ARM: [0x03, 0x03, 0x05, 0x01],\n BCJ_ARMT: [0x03, 0x03, 0x07, 0x01],\n BCJ_SPARC: [0x03, 0x03, 0x08, 0x05],\n BCJ_ARM64: [0x03, 0x03, 0x0a, 0x01],\n BCJ2: [0x03, 0x03, 0x01, 0x1b],\n PPMD: [0x03, 0x04, 0x01],\n DEFLATE: [0x04, 0x01, 0x08],\n BZIP2: [0x04, 0x02, 0x02],\n AES: [0x06, 0xf1, 0x07, 0x01],\n};\n\n// File attribute flags (Windows style, stored in FilesInfo)\nexport const FileAttribute = {\n READONLY: 0x01,\n HIDDEN: 0x02,\n SYSTEM: 0x04,\n DIRECTORY: 0x10,\n ARCHIVE: 0x20,\n DEVICE: 0x40,\n NORMAL: 0x80,\n TEMPORARY: 0x100,\n SPARSE_FILE: 0x200,\n REPARSE_POINT: 0x400,\n COMPRESSED: 0x800,\n OFFLINE: 0x1000,\n NOT_CONTENT_INDEXED: 0x2000,\n ENCRYPTED: 0x4000,\n UNIX_EXTENSION: 0x8000,\n};\n\n// Unix permission modes (decimal values for Node 0.8 compatibility)\nexport const UnixMode = {\n DIR: 16384, // 0o40000 - directory\n FILE: 32768, // 0o100000 - regular file\n SYMLINK: 40960, // 0o120000 - symbolic link\n RWXRWXRWX: 511, // 0o777\n RWXRXRX: 493, // 0o755\n RWRR: 420, // 0o644\n DEFAULT_DIR: 493, // 0o755 - rwxr-xr-x\n DEFAULT_FILE: 420, // 0o644 - rw-r--r--\n};\n\n// Error codes\nexport const ErrorCode = {\n INVALID_SIGNATURE: 'INVALID_SIGNATURE',\n CRC_MISMATCH: 'CRC_MISMATCH',\n UNSUPPORTED_CODEC: 'UNSUPPORTED_CODEC',\n UNSUPPORTED_VERSION: 'UNSUPPORTED_VERSION',\n UNSUPPORTED_FEATURE: 'UNSUPPORTED_FEATURE',\n TRUNCATED_ARCHIVE: 'TRUNCATED_ARCHIVE',\n CORRUPT_ARCHIVE: 'CORRUPT_ARCHIVE',\n CORRUPT_HEADER: 'CORRUPT_HEADER',\n ENCRYPTED_ARCHIVE: 'ENCRYPTED_ARCHIVE',\n COMPRESSED_HEADER: 'COMPRESSED_HEADER',\n DECOMPRESSION_FAILED: 'DECOMPRESSION_FAILED',\n};\n\n// Error with code property\nexport interface CodedError extends Error {\n code: string;\n}\n\n/**\n * Create an error with a code property\n */\nexport function createCodedError(message: string, code: string): CodedError {\n const err = new Error(message) as CodedError;\n err.code = code;\n return err;\n}\n"],"names":["SEVENZ_MAGIC","SIGNATURE_HEADER_SIZE","START_HEADER_SIZE","PropertyId","kEnd","kHeader","kArchiveProperties","kAdditionalStreamsInfo","kMainStreamsInfo","kFilesInfo","kPackInfo","kUnpackInfo","kSubStreamsInfo","kSize","kCRC","kFolder","kCodersUnpackSize","kNumUnpackStream","kEmptyStream","kEmptyFile","kAnti","kName","kCTime","kATime","kMTime","kWinAttributes","kComment","kEncodedHeader","kStartPos","kDummy","CodecId","COPY","DELTA","LZMA","LZMA2","BCJ_X86","BCJ_PPC","BCJ_IA64","BCJ_ARM","BCJ_ARMT","BCJ_SPARC","BCJ_ARM64","BCJ2","PPMD","DEFLATE","BZIP2","AES","FileAttribute","READONLY","HIDDEN","SYSTEM","DIRECTORY","ARCHIVE","DEVICE","NORMAL","TEMPORARY","SPARSE_FILE","REPARSE_POINT","COMPRESSED","OFFLINE","NOT_CONTENT_INDEXED","ENCRYPTED","UNIX_EXTENSION","UnixMode","DIR","FILE","SYMLINK","RWXRWXRWX","RWXRXRX","RWRR","DEFAULT_DIR","DEFAULT_FILE","ErrorCode","INVALID_SIGNATURE","CRC_MISMATCH","UNSUPPORTED_CODEC","UNSUPPORTED_VERSION","UNSUPPORTED_FEATURE","TRUNCATED_ARCHIVE","CORRUPT_ARCHIVE","CORRUPT_HEADER","ENCRYPTED_ARCHIVE","COMPRESSED_HEADER","DECOMPRESSION_FAILED","createCodedError","message","code","err","Error"],"mappings":"AAAA,sBAAsB;AACtB,wEAAwE;AAExE,mCAAmC;AACnC,OAAO,MAAMA,eAAe;IAAC;IAAM;IAAM;IAAM;IAAM;IAAM;CAAK,CAAC;AAEjE,eAAe;AACf,OAAO,MAAMC,wBAAwB,GAAG;AACxC,OAAO,MAAMC,oBAAoB,GAAG,CAAC,iDAAiD;AAEtF,kCAAkC;AAClC,OAAO,MAAMC,aAAa;IACxBC,MAAM;IACNC,SAAS;IACTC,oBAAoB;IACpBC,wBAAwB;IACxBC,kBAAkB;IAClBC,YAAY;IACZC,WAAW;IACXC,aAAa;IACbC,iBAAiB;IACjBC,OAAO;IACPC,MAAM;IACNC,SAAS;IACTC,mBAAmB;IACnBC,kBAAkB;IAClBC,cAAc;IACdC,YAAY;IACZC,OAAO;IACPC,OAAO;IACPC,QAAQ;IACRC,QAAQ;IACRC,QAAQ;IACRC,gBAAgB;IAChBC,UAAU;IACVC,gBAAgB;IAChBC,WAAW;IACXC,QAAQ;AACV,EAAE;AAEF,YAAY;AACZ,oCAAoC;AACpC,oEAAoE;AACpE,OAAO,MAAMC,UAAU;IACrBC,MAAM;QAAC;KAAK;IACZC,OAAO;QAAC;KAAK;IACbC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,OAAO;QAAC;KAAK;IACbC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,UAAU;QAAC;QAAM;QAAM;QAAM;KAAK;IAClCC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,UAAU;QAAC;QAAM;QAAM;QAAM;KAAK;IAClCC,WAAW;QAAC;QAAM;QAAM;QAAM;KAAK;IACnCC,WAAW;QAAC;QAAM;QAAM;QAAM;KAAK;IACnCC,MAAM;QAAC;QAAM;QAAM;QAAM;KAAK;IAC9BC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,SAAS;QAAC;QAAM;QAAM;KAAK;IAC3BC,OAAO;QAAC;QAAM;QAAM;KAAK;IACzBC,KAAK;QAAC;QAAM;QAAM;QAAM;KAAK;AAC/B,EAAE;AAEF,4DAA4D;AAC5D,OAAO,MAAMC,gBAAgB;IAC3BC,UAAU;IACVC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,SAAS;IACTC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,aAAa;IACbC,eAAe;IACfC,YAAY;IACZC,SAAS;IACTC,qBAAqB;IACrBC,WAAW;IACXC,gBAAgB;AAClB,EAAE;AAEF,oEAAoE;AACpE,OAAO,MAAMC,WAAW;IACtBC,KAAK;IACLC,MAAM;IACNC,SAAS;IACTC,WAAW;IACXC,SAAS;IACTC,MAAM;IACNC,aAAa;IACbC,cAAc;AAChB,EAAE;AAEF,cAAc;AACd,OAAO,MAAMC,YAAY;IACvBC,mBAAmB;IACnBC,cAAc;IACdC,mBAAmB;IACnBC,qBAAqB;IACrBC,qBAAqB;IACrBC,mBAAmB;IACnBC,iBAAiB;IACjBC,gBAAgB;IAChBC,mBAAmB;IACnBC,mBAAmB;IACnBC,sBAAsB;AACxB,EAAE;AAOF;;CAEC,GACD,OAAO,SAASC,iBAAiBC,OAAe,EAAEC,IAAY;IAC5D,MAAMC,MAAM,IAAIC,MAAMH;IACtBE,IAAID,IAAI,GAAGA;IACX,OAAOC;AACT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "7z-iterator",
3
- "version": "2.0.0",
3
+ "version": "2.0.3",
4
4
  "description": "Extract contents from 7z archives using an iterator API. Pure JavaScript, works on Node.js 0.8+",
5
5
  "keywords": [
6
6
  "extract",