7z-iterator 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +42 -0
- package/README.md +142 -0
- package/dist/cjs/FileEntry.d.cts +12 -0
- package/dist/cjs/FileEntry.d.ts +12 -0
- package/dist/cjs/FileEntry.js +147 -0
- package/dist/cjs/FileEntry.js.map +1 -0
- package/dist/cjs/SevenZipIterator.d.cts +8 -0
- package/dist/cjs/SevenZipIterator.d.ts +8 -0
- package/dist/cjs/SevenZipIterator.js +204 -0
- package/dist/cjs/SevenZipIterator.js.map +1 -0
- package/dist/cjs/index.d.cts +4 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +40 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lib/Lock.d.cts +11 -0
- package/dist/cjs/lib/Lock.d.ts +11 -0
- package/dist/cjs/lib/Lock.js +65 -0
- package/dist/cjs/lib/Lock.js.map +1 -0
- package/dist/cjs/lib/streamToSource.d.cts +20 -0
- package/dist/cjs/lib/streamToSource.d.ts +20 -0
- package/dist/cjs/lib/streamToSource.js +116 -0
- package/dist/cjs/lib/streamToSource.js.map +1 -0
- package/dist/cjs/nextEntry.d.cts +4 -0
- package/dist/cjs/nextEntry.d.ts +4 -0
- package/dist/cjs/nextEntry.js +102 -0
- package/dist/cjs/nextEntry.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/sevenz/NumberCodec.d.cts +58 -0
- package/dist/cjs/sevenz/NumberCodec.d.ts +58 -0
- package/dist/cjs/sevenz/NumberCodec.js +133 -0
- package/dist/cjs/sevenz/NumberCodec.js.map +1 -0
- package/dist/cjs/sevenz/SevenZipParser.d.cts +96 -0
- package/dist/cjs/sevenz/SevenZipParser.d.ts +96 -0
- package/dist/cjs/sevenz/SevenZipParser.js +457 -0
- package/dist/cjs/sevenz/SevenZipParser.js.map +1 -0
- package/dist/cjs/sevenz/codecs/Aes.d.cts +22 -0
- package/dist/cjs/sevenz/codecs/Aes.d.ts +22 -0
- package/dist/cjs/sevenz/codecs/Aes.js +179 -0
- package/dist/cjs/sevenz/codecs/Aes.js.map +1 -0
- package/dist/cjs/sevenz/codecs/BZip2.d.cts +14 -0
- package/dist/cjs/sevenz/codecs/BZip2.d.ts +14 -0
- package/dist/cjs/sevenz/codecs/BZip2.js +37 -0
- package/dist/cjs/sevenz/codecs/BZip2.js.map +1 -0
- package/dist/cjs/sevenz/codecs/Bcj.d.cts +15 -0
- package/dist/cjs/sevenz/codecs/Bcj.d.ts +15 -0
- package/dist/cjs/sevenz/codecs/Bcj.js +89 -0
- package/dist/cjs/sevenz/codecs/Bcj.js.map +1 -0
- package/dist/cjs/sevenz/codecs/Copy.d.cts +14 -0
- package/dist/cjs/sevenz/codecs/Copy.d.ts +14 -0
- package/dist/cjs/sevenz/codecs/Copy.js +28 -0
- package/dist/cjs/sevenz/codecs/Copy.js.map +1 -0
- package/dist/cjs/sevenz/codecs/Deflate.d.cts +14 -0
- package/dist/cjs/sevenz/codecs/Deflate.d.ts +14 -0
- package/dist/cjs/sevenz/codecs/Deflate.js +39 -0
- package/dist/cjs/sevenz/codecs/Deflate.js.map +1 -0
- package/dist/cjs/sevenz/codecs/Delta.d.cts +15 -0
- package/dist/cjs/sevenz/codecs/Delta.d.ts +15 -0
- package/dist/cjs/sevenz/codecs/Delta.js +55 -0
- package/dist/cjs/sevenz/codecs/Delta.js.map +1 -0
- package/dist/cjs/sevenz/codecs/Lzma.d.cts +14 -0
- package/dist/cjs/sevenz/codecs/Lzma.d.ts +14 -0
- package/dist/cjs/sevenz/codecs/Lzma.js +53 -0
- package/dist/cjs/sevenz/codecs/Lzma.js.map +1 -0
- package/dist/cjs/sevenz/codecs/Lzma2.d.cts +14 -0
- package/dist/cjs/sevenz/codecs/Lzma2.d.ts +14 -0
- package/dist/cjs/sevenz/codecs/Lzma2.js +160 -0
- package/dist/cjs/sevenz/codecs/Lzma2.js.map +1 -0
- package/dist/cjs/sevenz/codecs/createBufferingDecoder.d.cts +7 -0
- package/dist/cjs/sevenz/codecs/createBufferingDecoder.d.ts +7 -0
- package/dist/cjs/sevenz/codecs/createBufferingDecoder.js +36 -0
- package/dist/cjs/sevenz/codecs/createBufferingDecoder.js.map +1 -0
- package/dist/cjs/sevenz/codecs/index.d.cts +24 -0
- package/dist/cjs/sevenz/codecs/index.d.ts +24 -0
- package/dist/cjs/sevenz/codecs/index.js +128 -0
- package/dist/cjs/sevenz/codecs/index.js.map +1 -0
- package/dist/cjs/sevenz/codecs/streams.d.cts +18 -0
- package/dist/cjs/sevenz/codecs/streams.d.ts +18 -0
- package/dist/cjs/sevenz/codecs/streams.js +79 -0
- package/dist/cjs/sevenz/codecs/streams.js.map +1 -0
- package/dist/cjs/sevenz/constants.d.cts +86 -0
- package/dist/cjs/sevenz/constants.d.ts +86 -0
- package/dist/cjs/sevenz/constants.js +162 -0
- package/dist/cjs/sevenz/constants.js.map +1 -0
- package/dist/cjs/sevenz/headers.d.cts +70 -0
- package/dist/cjs/sevenz/headers.d.ts +70 -0
- package/dist/cjs/sevenz/headers.js +661 -0
- package/dist/cjs/sevenz/headers.js.map +1 -0
- package/dist/cjs/sevenz/index.d.cts +4 -0
- package/dist/cjs/sevenz/index.d.ts +4 -0
- package/dist/cjs/sevenz/index.js +33 -0
- package/dist/cjs/sevenz/index.js.map +1 -0
- package/dist/cjs/types.d.cts +37 -0
- package/dist/cjs/types.d.ts +37 -0
- package/dist/cjs/types.js +32 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/FileEntry.d.ts +12 -0
- package/dist/esm/FileEntry.js +63 -0
- package/dist/esm/FileEntry.js.map +1 -0
- package/dist/esm/SevenZipIterator.d.ts +8 -0
- package/dist/esm/SevenZipIterator.js +116 -0
- package/dist/esm/SevenZipIterator.js.map +1 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/Lock.d.ts +11 -0
- package/dist/esm/lib/Lock.js +41 -0
- package/dist/esm/lib/Lock.js.map +1 -0
- package/dist/esm/lib/streamToSource.d.ts +20 -0
- package/dist/esm/lib/streamToSource.js +100 -0
- package/dist/esm/lib/streamToSource.js.map +1 -0
- package/dist/esm/nextEntry.d.ts +4 -0
- package/dist/esm/nextEntry.js +86 -0
- package/dist/esm/nextEntry.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/sevenz/NumberCodec.d.ts +58 -0
- package/dist/esm/sevenz/NumberCodec.js +138 -0
- package/dist/esm/sevenz/NumberCodec.js.map +1 -0
- package/dist/esm/sevenz/SevenZipParser.d.ts +96 -0
- package/dist/esm/sevenz/SevenZipParser.js +419 -0
- package/dist/esm/sevenz/SevenZipParser.js.map +1 -0
- package/dist/esm/sevenz/codecs/Aes.d.ts +22 -0
- package/dist/esm/sevenz/codecs/Aes.js +162 -0
- package/dist/esm/sevenz/codecs/Aes.js.map +1 -0
- package/dist/esm/sevenz/codecs/BZip2.d.ts +14 -0
- package/dist/esm/sevenz/codecs/BZip2.js +22 -0
- package/dist/esm/sevenz/codecs/BZip2.js.map +1 -0
- package/dist/esm/sevenz/codecs/Bcj.d.ts +15 -0
- package/dist/esm/sevenz/codecs/Bcj.js +75 -0
- package/dist/esm/sevenz/codecs/Bcj.js.map +1 -0
- package/dist/esm/sevenz/codecs/Copy.d.ts +14 -0
- package/dist/esm/sevenz/codecs/Copy.js +18 -0
- package/dist/esm/sevenz/codecs/Copy.js.map +1 -0
- package/dist/esm/sevenz/codecs/Deflate.d.ts +14 -0
- package/dist/esm/sevenz/codecs/Deflate.js +24 -0
- package/dist/esm/sevenz/codecs/Deflate.js.map +1 -0
- package/dist/esm/sevenz/codecs/Delta.d.ts +15 -0
- package/dist/esm/sevenz/codecs/Delta.js +41 -0
- package/dist/esm/sevenz/codecs/Delta.js.map +1 -0
- package/dist/esm/sevenz/codecs/Lzma.d.ts +14 -0
- package/dist/esm/sevenz/codecs/Lzma.js +38 -0
- package/dist/esm/sevenz/codecs/Lzma.js.map +1 -0
- package/dist/esm/sevenz/codecs/Lzma2.d.ts +14 -0
- package/dist/esm/sevenz/codecs/Lzma2.js +145 -0
- package/dist/esm/sevenz/codecs/Lzma2.js.map +1 -0
- package/dist/esm/sevenz/codecs/createBufferingDecoder.d.ts +7 -0
- package/dist/esm/sevenz/codecs/createBufferingDecoder.js +25 -0
- package/dist/esm/sevenz/codecs/createBufferingDecoder.js.map +1 -0
- package/dist/esm/sevenz/codecs/index.d.ts +24 -0
- package/dist/esm/sevenz/codecs/index.js +108 -0
- package/dist/esm/sevenz/codecs/index.js.map +1 -0
- package/dist/esm/sevenz/codecs/streams.d.ts +18 -0
- package/dist/esm/sevenz/codecs/streams.js +66 -0
- package/dist/esm/sevenz/codecs/streams.js.map +1 -0
- package/dist/esm/sevenz/constants.d.ts +86 -0
- package/dist/esm/sevenz/constants.js +131 -0
- package/dist/esm/sevenz/constants.js.map +1 -0
- package/dist/esm/sevenz/headers.d.ts +70 -0
- package/dist/esm/sevenz/headers.js +646 -0
- package/dist/esm/sevenz/headers.js.map +1 -0
- package/dist/esm/sevenz/index.d.ts +4 -0
- package/dist/esm/sevenz/index.js +5 -0
- package/dist/esm/sevenz/index.js.map +1 -0
- package/dist/esm/types.d.ts +37 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/SevenZipParser.ts"],"sourcesContent":["// SevenZipParser - Main 7z archive parser\n// Handles reading archive structure and providing file streams\n\nimport { allocBuffer, crc32 } from 'extract-base-iterator';\nimport fs from 'fs';\nimport { PassThrough, type Readable } from 'readable-stream';\nimport { getCodec, getCodecName, isCodecSupported } from './codecs/index.ts';\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// 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}\n\n/**\n * Archive source abstraction - allows reading from file descriptor or buffer\n */\nexport interface ArchiveSource {\n read(position: number, length: number): Buffer;\n getSize(): number;\n close(): void;\n}\n\n/**\n * Buffer-based archive source\n */\nexport class BufferSource implements ArchiveSource {\n private buffer: Buffer;\n\n constructor(buffer: Buffer) {\n this.buffer = buffer;\n }\n\n read(position: number, length: number): Buffer {\n return this.buffer.slice(position, position + length);\n }\n\n getSize(): number {\n return this.buffer.length;\n }\n\n close(): void {\n // Nothing to close for buffer\n }\n}\n\n/**\n * File descriptor based archive source\n */\nexport class FileSource implements ArchiveSource {\n private fd: number;\n private size: number;\n\n constructor(fd: number, size: number) {\n this.fd = fd;\n this.size = size;\n }\n\n read(position: number, length: number): Buffer {\n var buf = allocBuffer(length);\n var bytesRead = fs.readSync(this.fd, buf, 0, length, position);\n if (bytesRead < length) {\n return buf.slice(0, bytesRead);\n }\n return buf;\n }\n\n getSize(): number {\n return this.size;\n }\n\n close(): void {\n try {\n fs.closeSync(this.fd);\n } catch (_e) {\n // Ignore close errors\n }\n }\n}\n\n/**\n * SevenZipParser - parses 7z archives and provides entry iteration\n */\nexport class SevenZipParser {\n private source: ArchiveSource;\n private signature: SignatureHeader | null = null;\n private streamsInfo: StreamsInfo | null = null;\n private filesInfo: FileInfo[] = [];\n private entries: SevenZipEntry[] = [];\n private parsed = false;\n // Cache for decompressed solid blocks (folderIndex -> decompressed data)\n private decompressedCache: { [key: number]: Buffer } = {};\n\n constructor(source: ArchiveSource) {\n this.source = source;\n }\n\n /**\n * Parse the archive structure\n * Must be called before iterating entries\n */\n parse(): void {\n if (this.parsed) return;\n\n // Read signature header\n var sigBuf = this.source.read(0, SIGNATURE_HEADER_SIZE);\n if (sigBuf.length < SIGNATURE_HEADER_SIZE) {\n throw createCodedError('Archive too small', ErrorCode.TRUNCATED_ARCHIVE);\n }\n\n this.signature = parseSignatureHeader(sigBuf);\n\n // Read encoded header\n var headerOffset = SIGNATURE_HEADER_SIZE + this.signature.nextHeaderOffset;\n var headerBuf = this.source.read(headerOffset, this.signature.nextHeaderSize);\n\n if (headerBuf.length < this.signature.nextHeaderSize) {\n throw createCodedError('Truncated header', ErrorCode.TRUNCATED_ARCHIVE);\n }\n\n // Parse encoded header (may need decompression)\n try {\n var headerResult = parseEncodedHeader(headerBuf, this.signature.nextHeaderCRC);\n this.streamsInfo = headerResult.streamsInfo || null;\n this.filesInfo = headerResult.filesInfo;\n } catch (err: unknown) {\n var codedErr = err as CodedError;\n if (codedErr && codedErr.code === ErrorCode.COMPRESSED_HEADER) {\n // Header is compressed - need to decompress first\n this.handleCompressedHeader(headerBuf);\n } else {\n throw err;\n }\n }\n\n // Build entries list\n this.buildEntries();\n this.parsed = true;\n }\n\n /**\n * Handle compressed header (kEncodedHeader)\n */\n private handleCompressedHeader(headerBuf: Buffer): void {\n // Parse the encoded header info to get decompression parameters\n var offset = 1; // Skip kEncodedHeader byte\n\n // Should have StreamsInfo for the header itself\n var propertyId = headerBuf[offset++];\n if (propertyId !== PropertyId.kMainStreamsInfo && propertyId !== PropertyId.kPackInfo) {\n throw createCodedError('Expected StreamsInfo in encoded header', ErrorCode.CORRUPT_HEADER);\n }\n\n // For now, we parse the streams info from the encoded header block\n // This tells us how to decompress the actual header\n\n // Read pack info from the encoded header structure\n var packInfoResult = this.parseEncodedHeaderStreams(headerBuf, 1);\n\n // Read the compressed header data\n var compressedStart = SIGNATURE_HEADER_SIZE + packInfoResult.packPos;\n var compressedData = this.source.read(compressedStart, packInfoResult.packSize);\n\n // Decompress using the specified codec\n var codec = getCodec(packInfoResult.codecId);\n var decompressedHeader = codec.decode(compressedData, packInfoResult.properties, packInfoResult.unpackSize);\n\n // Verify CRC if present\n if (packInfoResult.unpackCRC !== undefined) {\n var actualCRC = crc32(decompressedHeader);\n if (actualCRC !== packInfoResult.unpackCRC) {\n throw createCodedError('Decompressed header CRC mismatch', ErrorCode.CRC_MISMATCH);\n }\n }\n\n // Now parse the decompressed header\n // It should start with kHeader\n var decompOffset = 0;\n var headerId = decompressedHeader[decompOffset++];\n if (headerId !== PropertyId.kHeader) {\n throw createCodedError('Expected kHeader in decompressed header', ErrorCode.CORRUPT_HEADER);\n }\n\n // Parse the decompressed header using shared function from headers.ts\n var result = parseHeaderContent(decompressedHeader, decompOffset);\n this.streamsInfo = result.streamsInfo || null;\n this.filesInfo = result.filesInfo;\n }\n\n /**\n * Parse streams info from encoded header block\n * This is a simplified parser for the header's own compression info\n */\n private parseEncodedHeaderStreams(\n buf: Buffer,\n offset: number\n ): {\n packPos: number;\n packSize: number;\n unpackSize: number;\n codecId: number[];\n properties?: Buffer;\n unpackCRC?: number;\n } {\n // This is a simplified parser for the encoded header's own streams info\n var packPos = 0;\n var packSize = 0;\n var unpackSize = 0;\n var codecId: number[] = [];\n var properties: Buffer | undefined;\n var unpackCRC: number | undefined;\n\n while (offset < buf.length) {\n var propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n switch (propertyId) {\n case PropertyId.kPackInfo: {\n var packPosResult = readNumber(buf, offset);\n packPos = packPosResult.value;\n offset += packPosResult.bytesRead;\n\n var numPackResult = readNumber(buf, offset);\n offset += numPackResult.bytesRead;\n\n // Read until kEnd\n while (buf[offset] !== PropertyId.kEnd) {\n if (buf[offset] === PropertyId.kSize) {\n offset++;\n var sizeResult = readNumber(buf, offset);\n packSize = sizeResult.value;\n offset += sizeResult.bytesRead;\n } else {\n offset++;\n }\n }\n offset++; // Skip kEnd\n break;\n }\n\n case PropertyId.kUnpackInfo:\n // Find folder/coder info\n while (offset < buf.length && buf[offset] !== PropertyId.kEnd) {\n if (buf[offset] === PropertyId.kFolder) {\n offset++;\n var numFoldersResult = readNumber(buf, offset);\n offset += numFoldersResult.bytesRead;\n offset++; // external flag\n\n // Parse coder\n var numCodersResult = readNumber(buf, offset);\n offset += numCodersResult.bytesRead;\n\n var flags = buf[offset++];\n var idSize = flags & 0x0f;\n var hasAttributes = (flags & 0x20) !== 0;\n\n codecId = [];\n for (var i = 0; i < idSize; i++) {\n codecId.push(buf[offset++]);\n }\n\n if (hasAttributes) {\n var propsLenResult = readNumber(buf, offset);\n offset += propsLenResult.bytesRead;\n properties = buf.slice(offset, offset + propsLenResult.value);\n offset += propsLenResult.value;\n }\n } else if (buf[offset] === PropertyId.kCodersUnpackSize) {\n offset++;\n // Read unpack size - needed for LZMA decoder\n var unpackSizeResult = readNumber(buf, offset);\n unpackSize = unpackSizeResult.value;\n offset += unpackSizeResult.bytesRead;\n } else if (buf[offset] === PropertyId.kCRC) {\n offset++;\n var allDefined = buf[offset++];\n if (allDefined) {\n unpackCRC = buf.readUInt32LE(offset);\n offset += 4;\n }\n } else {\n offset++;\n }\n }\n if (buf[offset] === PropertyId.kEnd) offset++;\n break;\n }\n }\n\n return { packPos: packPos, packSize: packSize, unpackSize: unpackSize, codecId: codecId, properties: properties, unpackCRC: unpackCRC };\n }\n\n /**\n * Build the entries list from parsed file info\n */\n private buildEntries(): void {\n this.entries = [];\n\n if (!this.streamsInfo) {\n // No streams info - just create entries from file info\n for (var i = 0; i < this.filesInfo.length; i++) {\n var file = this.filesInfo[i];\n this.entries.push(this.createEntry(file, 0, 0, 0));\n }\n return;\n }\n\n // Use the properly parsed numUnpackStreamsPerFolder from the archive header\n var streamsPerFolder = this.streamsInfo.numUnpackStreamsPerFolder;\n\n // Now build entries with proper folder/stream tracking\n var streamIndex = 0;\n var folderIndex = 0;\n var streamInFolder = 0;\n var folderStreamCount = streamsPerFolder[0] || 0;\n\n for (var j = 0; j < this.filesInfo.length; j++) {\n var fileInfo = this.filesInfo[j];\n\n // Get size from unpackSizes for files with streams\n var size = 0;\n if (fileInfo.hasStream && streamIndex < this.streamsInfo.unpackSizes.length) {\n size = this.streamsInfo.unpackSizes[streamIndex];\n }\n\n var entry = this.createEntry(fileInfo, size, folderIndex, streamInFolder);\n entry._streamIndex = streamIndex;\n this.entries.push(entry);\n\n // Advance stream tracking for files with streams\n if (fileInfo.hasStream) {\n streamIndex++;\n streamInFolder++;\n\n // Check if we've exhausted streams in this folder\n if (streamInFolder >= folderStreamCount) {\n folderIndex++;\n streamInFolder = 0;\n folderStreamCount = streamsPerFolder[folderIndex] || 0;\n }\n }\n }\n }\n\n /**\n * Create an entry from file info\n */\n private createEntry(file: FileInfo, size: number, folderIndex: number, streamInFolder: number): SevenZipEntry {\n // Determine entry type\n // Note: 7z format doesn't natively support symlinks. p7zip with -snl stores\n // symlinks as regular files with the target path as content.\n var type: 'file' | 'directory' | 'link' = 'file';\n if (file.isDirectory) {\n type = 'directory';\n }\n\n // Calculate mode from Windows attributes\n var mode: number | undefined;\n if (file.attributes !== undefined) {\n // Check for Unix extension bit\n if ((file.attributes & FileAttribute.UNIX_EXTENSION) !== 0) {\n mode = (file.attributes >>> 16) & 0xffff;\n // Check for symlink (S_IFLNK = 0xA000)\n // Note: Most 7z implementations don't preserve symlink mode bits\n if ((mode & 0xf000) === 0xa000) {\n type = 'link';\n }\n } else if (file.isDirectory) {\n mode = 493; // 0o755\n } else {\n mode = 420; // 0o644\n }\n }\n\n return {\n name: getBaseName(file.name),\n path: file.name,\n type: type,\n size: size,\n mtime: file.mtime,\n atime: file.atime,\n ctime: file.ctime,\n mode: mode,\n isAntiFile: file.isAntiFile,\n _folderIndex: folderIndex,\n _streamIndex: 0, // Set by caller\n _streamIndexInFolder: streamInFolder,\n _hasStream: file.hasStream,\n };\n }\n\n /**\n * Get the list of entries\n */\n getEntries(): SevenZipEntry[] {\n if (!this.parsed) {\n this.parse();\n }\n return this.entries;\n }\n\n /**\n * Get a readable stream for an entry's content\n */\n getEntryStream(entry: SevenZipEntry): Readable {\n if (!entry._hasStream || entry.type === 'directory') {\n // Return empty stream for directories and empty files\n var emptyStream = new PassThrough();\n emptyStream.end();\n return emptyStream;\n }\n\n if (!this.streamsInfo) {\n throw createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER);\n }\n\n // Get folder info\n var folder = this.streamsInfo.folders[entry._folderIndex];\n if (!folder) {\n throw createCodedError('Invalid folder index', ErrorCode.CORRUPT_HEADER);\n }\n\n // Check codec support\n for (var i = 0; i < folder.coders.length; i++) {\n var coder = folder.coders[i];\n if (!isCodecSupported(coder.id)) {\n var codecName = getCodecName(coder.id);\n throw createCodedError(`Unsupported codec: ${codecName}`, ErrorCode.UNSUPPORTED_CODEC);\n }\n }\n\n // Get decompressed data for this folder (with caching for solid archives)\n var data = this.getDecompressedFolder(entry._folderIndex);\n\n // Calculate file offset within the decompressed block\n // For solid archives, multiple files are concatenated in the block\n var fileStart = 0;\n for (var m = 0; m < entry._streamIndexInFolder; m++) {\n // Sum sizes of all streams before this one in the folder\n var prevStreamGlobalIndex = entry._streamIndex - entry._streamIndexInFolder + m;\n fileStart += this.streamsInfo.unpackSizes[prevStreamGlobalIndex];\n }\n\n var fileSize = entry.size;\n\n // Create a PassThrough stream with the file data\n var outputStream = new PassThrough();\n var fileData = data.slice(fileStart, fileStart + fileSize);\n outputStream.end(fileData);\n\n return outputStream;\n }\n\n /**\n * Get decompressed data for a folder, with caching for solid archives\n */\n private getDecompressedFolder(folderIndex: number): Buffer {\n // Check cache first\n if (this.decompressedCache[folderIndex]) {\n return this.decompressedCache[folderIndex];\n }\n\n if (!this.streamsInfo) {\n throw createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER);\n }\n\n var folder = this.streamsInfo.folders[folderIndex];\n\n // Calculate packed data position\n var packPos = SIGNATURE_HEADER_SIZE + this.streamsInfo.packPos;\n\n // Find which pack stream this folder uses\n var packStreamIndex = 0;\n for (var j = 0; j < folderIndex; j++) {\n packStreamIndex += this.streamsInfo.folders[j].packedStreams.length;\n }\n\n // Calculate position of this pack stream\n for (var k = 0; k < packStreamIndex; k++) {\n packPos += this.streamsInfo.packSizes[k];\n }\n\n var packSize = this.streamsInfo.packSizes[packStreamIndex];\n\n // Read packed data\n var packedData = this.source.read(packPos, packSize);\n\n // Decompress through codec chain\n var data = packedData;\n for (var l = 0; l < folder.coders.length; l++) {\n var coderInfo = folder.coders[l];\n var codec = getCodec(coderInfo.id);\n // Get unpack size for this coder (needed by LZMA)\n var unpackSize = folder.unpackSizes[l];\n data = codec.decode(data, coderInfo.properties, unpackSize);\n }\n\n // Cache for solid archives (when multiple files share a folder)\n this.decompressedCache[folderIndex] = data;\n\n return data;\n }\n\n /**\n * Close the parser and release resources\n */\n close(): void {\n if (this.source) {\n this.source.close();\n }\n }\n}\n\n/**\n * Get base name from a path\n */\nfunction getBaseName(path: string): string {\n var lastSlash = path.lastIndexOf('/');\n var lastBackslash = path.lastIndexOf('\\\\');\n var lastSep = Math.max(lastSlash, lastBackslash);\n return lastSep >= 0 ? path.slice(lastSep + 1) : path;\n}\n"],"names":["BufferSource","FileSource","SevenZipParser","buffer","read","position","length","slice","getSize","close","fd","size","buf","allocBuffer","bytesRead","fs","readSync","closeSync","_e","source","signature","streamsInfo","filesInfo","entries","parsed","decompressedCache","parse","sigBuf","SIGNATURE_HEADER_SIZE","createCodedError","ErrorCode","TRUNCATED_ARCHIVE","parseSignatureHeader","headerOffset","nextHeaderOffset","headerBuf","nextHeaderSize","headerResult","parseEncodedHeader","nextHeaderCRC","err","codedErr","code","COMPRESSED_HEADER","handleCompressedHeader","buildEntries","offset","propertyId","PropertyId","kMainStreamsInfo","kPackInfo","CORRUPT_HEADER","packInfoResult","parseEncodedHeaderStreams","compressedStart","packPos","compressedData","packSize","codec","getCodec","codecId","decompressedHeader","decode","properties","unpackSize","unpackCRC","undefined","actualCRC","crc32","CRC_MISMATCH","decompOffset","headerId","kHeader","result","parseHeaderContent","kEnd","packPosResult","readNumber","value","numPackResult","kSize","sizeResult","kUnpackInfo","kFolder","numFoldersResult","numCodersResult","flags","idSize","hasAttributes","i","push","propsLenResult","kCodersUnpackSize","unpackSizeResult","kCRC","allDefined","readUInt32LE","file","createEntry","streamsPerFolder","numUnpackStreamsPerFolder","streamIndex","folderIndex","streamInFolder","folderStreamCount","j","fileInfo","hasStream","unpackSizes","entry","_streamIndex","type","isDirectory","mode","attributes","FileAttribute","UNIX_EXTENSION","name","getBaseName","path","mtime","atime","ctime","isAntiFile","_folderIndex","_streamIndexInFolder","_hasStream","getEntries","getEntryStream","emptyStream","PassThrough","end","folder","folders","coders","coder","isCodecSupported","id","codecName","getCodecName","UNSUPPORTED_CODEC","data","getDecompressedFolder","fileStart","m","prevStreamGlobalIndex","fileSize","outputStream","fileData","packStreamIndex","packedStreams","k","packSizes","packedData","l","coderInfo","lastSlash","lastIndexOf","lastBackslash","lastSep","Math","max"],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Transform } from 'readable-stream';
|
|
2
|
+
/**
|
|
3
|
+
* Set the password for AES decryption
|
|
4
|
+
*/
|
|
5
|
+
export declare function setPassword(password: string | null): void;
|
|
6
|
+
/**
|
|
7
|
+
* Get the current password
|
|
8
|
+
*/
|
|
9
|
+
export declare function getPassword(): string | null;
|
|
10
|
+
/**
|
|
11
|
+
* Decode AES-256-CBC encrypted data
|
|
12
|
+
*
|
|
13
|
+
* @param input - Encrypted data
|
|
14
|
+
* @param properties - AES properties (numCyclesPower, salt, IV)
|
|
15
|
+
* @param _unpackSize - Unused
|
|
16
|
+
* @returns Decrypted data
|
|
17
|
+
*/
|
|
18
|
+
export declare function decodeAes(input: Buffer, properties?: Buffer, _unpackSize?: number): Buffer;
|
|
19
|
+
/**
|
|
20
|
+
* Create an AES decoder Transform stream
|
|
21
|
+
*/
|
|
22
|
+
export declare function createAesDecoder(properties?: Buffer, unpackSize?: number): Transform;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Transform } from 'readable-stream';
|
|
2
|
+
/**
|
|
3
|
+
* Set the password for AES decryption
|
|
4
|
+
*/
|
|
5
|
+
export declare function setPassword(password: string | null): void;
|
|
6
|
+
/**
|
|
7
|
+
* Get the current password
|
|
8
|
+
*/
|
|
9
|
+
export declare function getPassword(): string | null;
|
|
10
|
+
/**
|
|
11
|
+
* Decode AES-256-CBC encrypted data
|
|
12
|
+
*
|
|
13
|
+
* @param input - Encrypted data
|
|
14
|
+
* @param properties - AES properties (numCyclesPower, salt, IV)
|
|
15
|
+
* @param _unpackSize - Unused
|
|
16
|
+
* @returns Decrypted data
|
|
17
|
+
*/
|
|
18
|
+
export declare function decodeAes(input: Buffer, properties?: Buffer, _unpackSize?: number): Buffer;
|
|
19
|
+
/**
|
|
20
|
+
* Create an AES decoder Transform stream
|
|
21
|
+
*/
|
|
22
|
+
export declare function createAesDecoder(properties?: Buffer, unpackSize?: number): Transform;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// 7z AES-256-CBC codec with SHA-256 key derivation
|
|
2
|
+
// Implements password-based decryption for encrypted 7z archives
|
|
3
|
+
//
|
|
4
|
+
// Properties format:
|
|
5
|
+
// Byte 0: bits 0-5 = NumCyclesPower (iterations = 2^NumCyclesPower)
|
|
6
|
+
// bit 6 = IV present flag
|
|
7
|
+
// bit 7 = Salt present flag
|
|
8
|
+
// Byte 1: upper nibble = salt size extension
|
|
9
|
+
// lower nibble = IV size extension
|
|
10
|
+
// Following bytes: salt data, then IV data
|
|
11
|
+
//
|
|
12
|
+
// Key derivation:
|
|
13
|
+
// For each round (2^NumCyclesPower times):
|
|
14
|
+
// hash = SHA256(salt + password_utf16le + round_counter_8bytes)
|
|
15
|
+
// Final key = first 32 bytes of accumulated hash
|
|
16
|
+
"use strict";
|
|
17
|
+
Object.defineProperty(exports, "__esModule", {
|
|
18
|
+
value: true
|
|
19
|
+
});
|
|
20
|
+
function _export(target, all) {
|
|
21
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
_export(exports, {
|
|
27
|
+
get createAesDecoder () {
|
|
28
|
+
return createAesDecoder;
|
|
29
|
+
},
|
|
30
|
+
get decodeAes () {
|
|
31
|
+
return decodeAes;
|
|
32
|
+
},
|
|
33
|
+
get getPassword () {
|
|
34
|
+
return getPassword;
|
|
35
|
+
},
|
|
36
|
+
get setPassword () {
|
|
37
|
+
return setPassword;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
var _crypto = /*#__PURE__*/ _interop_require_default(require("crypto"));
|
|
41
|
+
var _extractbaseiterator = require("extract-base-iterator");
|
|
42
|
+
var _createBufferingDecoderts = /*#__PURE__*/ _interop_require_default(require("./createBufferingDecoder.js"));
|
|
43
|
+
function _interop_require_default(obj) {
|
|
44
|
+
return obj && obj.__esModule ? obj : {
|
|
45
|
+
default: obj
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Global password storage - set before decryption
|
|
49
|
+
var _password = null;
|
|
50
|
+
function setPassword(password) {
|
|
51
|
+
_password = password;
|
|
52
|
+
}
|
|
53
|
+
function getPassword() {
|
|
54
|
+
return _password;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Parse AES properties to extract key derivation parameters
|
|
58
|
+
*/ function parseProperties(properties) {
|
|
59
|
+
if (!properties || properties.length < 1) {
|
|
60
|
+
throw new Error('AES: missing properties');
|
|
61
|
+
}
|
|
62
|
+
var b0 = properties[0];
|
|
63
|
+
var numCyclesPower = b0 & 0x3f;
|
|
64
|
+
// Check for special case: no salt/IV flags
|
|
65
|
+
if ((b0 & 0xc0) === 0) {
|
|
66
|
+
// No salt, no IV - use zeros
|
|
67
|
+
return {
|
|
68
|
+
numCyclesPower: numCyclesPower,
|
|
69
|
+
salt: (0, _extractbaseiterator.allocBuffer)(0),
|
|
70
|
+
iv: (0, _extractbaseiterator.allocBuffer)(16)
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
if (properties.length < 2) {
|
|
74
|
+
throw new Error('AES: properties too short');
|
|
75
|
+
}
|
|
76
|
+
var b1 = properties[1];
|
|
77
|
+
// Calculate sizes
|
|
78
|
+
// saltSize = ((b0 >> 7) & 1) + (b1 >> 4)
|
|
79
|
+
// ivSize = ((b0 >> 6) & 1) + (b1 & 0x0F)
|
|
80
|
+
var saltSize = (b0 >>> 7 & 1) + (b1 >>> 4);
|
|
81
|
+
var ivSize = (b0 >>> 6 & 1) + (b1 & 0x0f);
|
|
82
|
+
var expectedSize = 2 + saltSize + ivSize;
|
|
83
|
+
if (properties.length < expectedSize) {
|
|
84
|
+
throw new Error('AES: properties too short for salt/IV');
|
|
85
|
+
}
|
|
86
|
+
var salt = properties.slice(2, 2 + saltSize);
|
|
87
|
+
var iv = (0, _extractbaseiterator.allocBuffer)(16);
|
|
88
|
+
// Copy IV data (may be less than 16 bytes, rest is zeros)
|
|
89
|
+
var ivData = properties.slice(2 + saltSize, 2 + saltSize + ivSize);
|
|
90
|
+
for(var i = 0; i < ivData.length && i < 16; i++){
|
|
91
|
+
iv[i] = ivData[i];
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
numCyclesPower: numCyclesPower,
|
|
95
|
+
salt: salt,
|
|
96
|
+
iv: iv
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Convert password string to UTF-16LE buffer
|
|
101
|
+
*/ function passwordToUtf16LE(password) {
|
|
102
|
+
var buf = (0, _extractbaseiterator.allocBuffer)(password.length * 2);
|
|
103
|
+
for(var i = 0; i < password.length; i++){
|
|
104
|
+
var code = password.charCodeAt(i);
|
|
105
|
+
buf[i * 2] = code & 0xff;
|
|
106
|
+
buf[i * 2 + 1] = code >>> 8 & 0xff;
|
|
107
|
+
}
|
|
108
|
+
return buf;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Derive AES-256 key from password using 7z's SHA-256 iteration scheme
|
|
112
|
+
*
|
|
113
|
+
* Algorithm:
|
|
114
|
+
* For round = 0 to 2^numCyclesPower - 1:
|
|
115
|
+
* hash.update(salt)
|
|
116
|
+
* hash.update(password_utf16le)
|
|
117
|
+
* hash.update(round as 8-byte little-endian)
|
|
118
|
+
* key = hash.digest()
|
|
119
|
+
*/ function deriveKey(password, salt, numCyclesPower) {
|
|
120
|
+
var passwordBuf = passwordToUtf16LE(password);
|
|
121
|
+
var numRounds = Math.pow(2, numCyclesPower);
|
|
122
|
+
// For special case 0x3F, don't iterate
|
|
123
|
+
if (numCyclesPower === 0x3f) {
|
|
124
|
+
// Direct concatenation mode
|
|
125
|
+
var key = (0, _extractbaseiterator.allocBuffer)(32);
|
|
126
|
+
var offset = 0;
|
|
127
|
+
for(var j = 0; j < salt.length && offset < 32; j++){
|
|
128
|
+
key[offset++] = salt[j];
|
|
129
|
+
}
|
|
130
|
+
for(var k = 0; k < passwordBuf.length && offset < 32; k++){
|
|
131
|
+
key[offset++] = passwordBuf[k];
|
|
132
|
+
}
|
|
133
|
+
return key;
|
|
134
|
+
}
|
|
135
|
+
// Counter buffer (8 bytes, little-endian)
|
|
136
|
+
var counter = (0, _extractbaseiterator.allocBuffer)(8);
|
|
137
|
+
// Create hash and iterate
|
|
138
|
+
var hash = _crypto.default.createHash('sha256');
|
|
139
|
+
for(var round = 0; round < numRounds; round++){
|
|
140
|
+
// Write round counter as little-endian 64-bit
|
|
141
|
+
counter[0] = round & 0xff;
|
|
142
|
+
counter[1] = round >>> 8 & 0xff;
|
|
143
|
+
counter[2] = round >>> 16 & 0xff;
|
|
144
|
+
counter[3] = round >>> 24 & 0xff;
|
|
145
|
+
// Upper 32 bits - for large round counts
|
|
146
|
+
var high = Math.floor(round / 0x100000000);
|
|
147
|
+
counter[4] = high & 0xff;
|
|
148
|
+
counter[5] = high >>> 8 & 0xff;
|
|
149
|
+
counter[6] = high >>> 16 & 0xff;
|
|
150
|
+
counter[7] = high >>> 24 & 0xff;
|
|
151
|
+
hash.update(salt);
|
|
152
|
+
hash.update(passwordBuf);
|
|
153
|
+
hash.update(counter);
|
|
154
|
+
}
|
|
155
|
+
return hash.digest();
|
|
156
|
+
}
|
|
157
|
+
function decodeAes(input, properties, _unpackSize) {
|
|
158
|
+
if (!_password) {
|
|
159
|
+
throw new Error('AES: password required but not set');
|
|
160
|
+
}
|
|
161
|
+
if (!properties) {
|
|
162
|
+
throw new Error('AES: properties required');
|
|
163
|
+
}
|
|
164
|
+
var params = parseProperties(properties);
|
|
165
|
+
var key = deriveKey(_password, params.salt, params.numCyclesPower);
|
|
166
|
+
// Create AES-256-CBC decipher
|
|
167
|
+
var decipher = _crypto.default.createDecipheriv('aes-256-cbc', key, params.iv);
|
|
168
|
+
decipher.setAutoPadding(false); // 7z doesn't use PKCS7 padding
|
|
169
|
+
// Node 0.8 returns binary strings, newer Node returns Buffers
|
|
170
|
+
// Use 'binary' encoding for compatibility
|
|
171
|
+
// @ts-expect-error - 'binary' encoding is deprecated but required for Node 0.8 compatibility
|
|
172
|
+
var decStr = decipher.update(input, 'binary', 'binary') + decipher.final('binary');
|
|
173
|
+
var decrypted = (0, _extractbaseiterator.bufferFrom)(decStr, 'binary');
|
|
174
|
+
return decrypted;
|
|
175
|
+
}
|
|
176
|
+
function createAesDecoder(properties, unpackSize) {
|
|
177
|
+
return (0, _createBufferingDecoderts.default)(decodeAes, properties, unpackSize);
|
|
178
|
+
}
|
|
179
|
+
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Aes.ts"],"sourcesContent":["// 7z AES-256-CBC codec with SHA-256 key derivation\n// Implements password-based decryption for encrypted 7z archives\n//\n// Properties format:\n// Byte 0: bits 0-5 = NumCyclesPower (iterations = 2^NumCyclesPower)\n// bit 6 = IV present flag\n// bit 7 = Salt present flag\n// Byte 1: upper nibble = salt size extension\n// lower nibble = IV size extension\n// Following bytes: salt data, then IV data\n//\n// Key derivation:\n// For each round (2^NumCyclesPower times):\n// hash = SHA256(salt + password_utf16le + round_counter_8bytes)\n// Final key = first 32 bytes of accumulated hash\n\nimport crypto from 'crypto';\nimport { allocBuffer, bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n// Global password storage - set before decryption\nvar _password: string | null = null;\n\n/**\n * Set the password for AES decryption\n */\nexport function setPassword(password: string | null): void {\n _password = password;\n}\n\n/**\n * Get the current password\n */\nexport function getPassword(): string | null {\n return _password;\n}\n\n/**\n * Parse AES properties to extract key derivation parameters\n */\nfunction parseProperties(properties: Buffer): { numCyclesPower: number; salt: Buffer; iv: Buffer } {\n if (!properties || properties.length < 1) {\n throw new Error('AES: missing properties');\n }\n\n var b0 = properties[0];\n var numCyclesPower = b0 & 0x3f;\n\n // Check for special case: no salt/IV flags\n if ((b0 & 0xc0) === 0) {\n // No salt, no IV - use zeros\n return {\n numCyclesPower: numCyclesPower,\n salt: allocBuffer(0),\n iv: allocBuffer(16),\n };\n }\n\n if (properties.length < 2) {\n throw new Error('AES: properties too short');\n }\n\n var b1 = properties[1];\n\n // Calculate sizes\n // saltSize = ((b0 >> 7) & 1) + (b1 >> 4)\n // ivSize = ((b0 >> 6) & 1) + (b1 & 0x0F)\n var saltSize = ((b0 >>> 7) & 1) + (b1 >>> 4);\n var ivSize = ((b0 >>> 6) & 1) + (b1 & 0x0f);\n\n var expectedSize = 2 + saltSize + ivSize;\n if (properties.length < expectedSize) {\n throw new Error('AES: properties too short for salt/IV');\n }\n\n var salt = properties.slice(2, 2 + saltSize);\n var iv = allocBuffer(16);\n\n // Copy IV data (may be less than 16 bytes, rest is zeros)\n var ivData = properties.slice(2 + saltSize, 2 + saltSize + ivSize);\n for (var i = 0; i < ivData.length && i < 16; i++) {\n iv[i] = ivData[i];\n }\n\n return {\n numCyclesPower: numCyclesPower,\n salt: salt,\n iv: iv,\n };\n}\n\n/**\n * Convert password string to UTF-16LE buffer\n */\nfunction passwordToUtf16LE(password: string): Buffer {\n var buf = allocBuffer(password.length * 2);\n for (var i = 0; i < password.length; i++) {\n var code = password.charCodeAt(i);\n buf[i * 2] = code & 0xff;\n buf[i * 2 + 1] = (code >>> 8) & 0xff;\n }\n return buf;\n}\n\n/**\n * Derive AES-256 key from password using 7z's SHA-256 iteration scheme\n *\n * Algorithm:\n * For round = 0 to 2^numCyclesPower - 1:\n * hash.update(salt)\n * hash.update(password_utf16le)\n * hash.update(round as 8-byte little-endian)\n * key = hash.digest()\n */\nfunction deriveKey(password: string, salt: Buffer, numCyclesPower: number): Buffer {\n var passwordBuf = passwordToUtf16LE(password);\n var numRounds = 2 ** numCyclesPower;\n\n // For special case 0x3F, don't iterate\n if (numCyclesPower === 0x3f) {\n // Direct concatenation mode\n var key = allocBuffer(32);\n var offset = 0;\n for (var j = 0; j < salt.length && offset < 32; j++) {\n key[offset++] = salt[j];\n }\n for (var k = 0; k < passwordBuf.length && offset < 32; k++) {\n key[offset++] = passwordBuf[k];\n }\n return key;\n }\n\n // Counter buffer (8 bytes, little-endian)\n var counter = allocBuffer(8);\n\n // Create hash and iterate\n var hash = crypto.createHash('sha256');\n\n for (var round = 0; round < numRounds; round++) {\n // Write round counter as little-endian 64-bit\n counter[0] = round & 0xff;\n counter[1] = (round >>> 8) & 0xff;\n counter[2] = (round >>> 16) & 0xff;\n counter[3] = (round >>> 24) & 0xff;\n // Upper 32 bits - for large round counts\n var high = Math.floor(round / 0x100000000);\n counter[4] = high & 0xff;\n counter[5] = (high >>> 8) & 0xff;\n counter[6] = (high >>> 16) & 0xff;\n counter[7] = (high >>> 24) & 0xff;\n\n hash.update(salt);\n hash.update(passwordBuf);\n hash.update(counter);\n }\n\n return hash.digest() as Buffer;\n}\n\n/**\n * Decode AES-256-CBC encrypted data\n *\n * @param input - Encrypted data\n * @param properties - AES properties (numCyclesPower, salt, IV)\n * @param _unpackSize - Unused\n * @returns Decrypted data\n */\nexport function decodeAes(input: Buffer, properties?: Buffer, _unpackSize?: number): Buffer {\n if (!_password) {\n throw new Error('AES: password required but not set');\n }\n\n if (!properties) {\n throw new Error('AES: properties required');\n }\n\n var params = parseProperties(properties);\n var key = deriveKey(_password, params.salt, params.numCyclesPower);\n\n // Create AES-256-CBC decipher\n var decipher = crypto.createDecipheriv('aes-256-cbc', key, params.iv);\n decipher.setAutoPadding(false); // 7z doesn't use PKCS7 padding\n\n // Node 0.8 returns binary strings, newer Node returns Buffers\n // Use 'binary' encoding for compatibility\n // @ts-expect-error - 'binary' encoding is deprecated but required for Node 0.8 compatibility\n var decStr = decipher.update(input, 'binary', 'binary') + decipher.final('binary');\n var decrypted = bufferFrom(decStr, 'binary' as BufferEncoding);\n\n return decrypted;\n}\n\n/**\n * Create an AES decoder Transform stream\n */\nexport function createAesDecoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeAes, properties, unpackSize);\n}\n"],"names":["createAesDecoder","decodeAes","getPassword","setPassword","_password","password","parseProperties","properties","length","Error","b0","numCyclesPower","salt","allocBuffer","iv","b1","saltSize","ivSize","expectedSize","slice","ivData","i","passwordToUtf16LE","buf","code","charCodeAt","deriveKey","passwordBuf","numRounds","key","offset","j","k","counter","hash","crypto","createHash","round","high","Math","floor","update","digest","input","_unpackSize","params","decipher","createDecipheriv","setAutoPadding","decStr","final","decrypted","bufferFrom","unpackSize","createBufferingDecoder"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Transform } from 'readable-stream';
|
|
2
|
+
/**
|
|
3
|
+
* Decode BZip2 compressed data
|
|
4
|
+
*
|
|
5
|
+
* @param input - BZip2 compressed data (with BZh header)
|
|
6
|
+
* @param _properties - Unused for BZip2
|
|
7
|
+
* @param _unpackSize - Unused for seek-bzip
|
|
8
|
+
* @returns Decompressed data
|
|
9
|
+
*/
|
|
10
|
+
export declare function decodeBzip2(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
11
|
+
/**
|
|
12
|
+
* Create a BZip2 decoder Transform stream
|
|
13
|
+
*/
|
|
14
|
+
export declare function createBzip2Decoder(properties?: Buffer, unpackSize?: number): Transform;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Transform } from 'readable-stream';
|
|
2
|
+
/**
|
|
3
|
+
* Decode BZip2 compressed data
|
|
4
|
+
*
|
|
5
|
+
* @param input - BZip2 compressed data (with BZh header)
|
|
6
|
+
* @param _properties - Unused for BZip2
|
|
7
|
+
* @param _unpackSize - Unused for seek-bzip
|
|
8
|
+
* @returns Decompressed data
|
|
9
|
+
*/
|
|
10
|
+
export declare function decodeBzip2(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
11
|
+
/**
|
|
12
|
+
* Create a BZip2 decoder Transform stream
|
|
13
|
+
*/
|
|
14
|
+
export declare function createBzip2Decoder(properties?: Buffer, unpackSize?: number): Transform;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// BZip2 codec - bzip2 compression
|
|
2
|
+
// 7z stores bzip2 data with the standard BZh header
|
|
3
|
+
//
|
|
4
|
+
// Uses seek-bzip for decompression (pure JavaScript)
|
|
5
|
+
"use strict";
|
|
6
|
+
Object.defineProperty(exports, "__esModule", {
|
|
7
|
+
value: true
|
|
8
|
+
});
|
|
9
|
+
function _export(target, all) {
|
|
10
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
_export(exports, {
|
|
16
|
+
get createBzip2Decoder () {
|
|
17
|
+
return createBzip2Decoder;
|
|
18
|
+
},
|
|
19
|
+
get decodeBzip2 () {
|
|
20
|
+
return decodeBzip2;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
var _seekbzip = /*#__PURE__*/ _interop_require_default(require("seek-bzip"));
|
|
24
|
+
var _createBufferingDecoderts = /*#__PURE__*/ _interop_require_default(require("./createBufferingDecoder.js"));
|
|
25
|
+
function _interop_require_default(obj) {
|
|
26
|
+
return obj && obj.__esModule ? obj : {
|
|
27
|
+
default: obj
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function decodeBzip2(input, _properties, _unpackSize) {
|
|
31
|
+
// seek-bzip.decode(input, output) - returns output buffer
|
|
32
|
+
return _seekbzip.default.decode(input);
|
|
33
|
+
}
|
|
34
|
+
function createBzip2Decoder(properties, unpackSize) {
|
|
35
|
+
return (0, _createBufferingDecoderts.default)(decodeBzip2, properties, unpackSize);
|
|
36
|
+
}
|
|
37
|
+
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/BZip2.ts"],"sourcesContent":["// BZip2 codec - bzip2 compression\n// 7z stores bzip2 data with the standard BZh header\n//\n// Uses seek-bzip for decompression (pure JavaScript)\n\nimport type { Transform } from 'readable-stream';\nimport Bunzip from 'seek-bzip';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n/**\n * Decode BZip2 compressed data\n *\n * @param input - BZip2 compressed data (with BZh header)\n * @param _properties - Unused for BZip2\n * @param _unpackSize - Unused for seek-bzip\n * @returns Decompressed data\n */\nexport function decodeBzip2(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n // seek-bzip.decode(input, output) - returns output buffer\n return Bunzip.decode(input);\n}\n\n/**\n * Create a BZip2 decoder Transform stream\n */\nexport function createBzip2Decoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBzip2, properties, unpackSize);\n}\n"],"names":["createBzip2Decoder","decodeBzip2","input","_properties","_unpackSize","Bunzip","decode","properties","unpackSize","createBufferingDecoder"],"mappings":"AAAA,kCAAkC;AAClC,oDAAoD;AACpD,EAAE;AACF,qDAAqD;;;;;;;;;;;;QAsBrCA;eAAAA;;QARAC;eAAAA;;;+DAXG;+EACgB;;;;;;AAU5B,SAASA,YAAYC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACnF,0DAA0D;IAC1D,OAAOC,iBAAM,CAACC,MAAM,CAACJ;AACvB;AAKO,SAASF,mBAAmBO,UAAmB,EAAEC,UAAmB;IACzE,OAAOC,IAAAA,iCAAsB,EAACR,aAAaM,YAAYC;AACzD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Transform } from 'readable-stream';
|
|
2
|
+
/**
|
|
3
|
+
* Decode BCJ (x86) filtered data
|
|
4
|
+
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
+
*
|
|
6
|
+
* @param input - BCJ filtered data
|
|
7
|
+
* @param _properties - Unused for BCJ
|
|
8
|
+
* @param _unpackSize - Unused for BCJ
|
|
9
|
+
* @returns Unfiltered data
|
|
10
|
+
*/
|
|
11
|
+
export declare function decodeBcj(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
12
|
+
/**
|
|
13
|
+
* Create a BCJ decoder Transform stream
|
|
14
|
+
*/
|
|
15
|
+
export declare function createBcjDecoder(properties?: Buffer, unpackSize?: number): Transform;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Transform } from 'readable-stream';
|
|
2
|
+
/**
|
|
3
|
+
* Decode BCJ (x86) filtered data
|
|
4
|
+
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
+
*
|
|
6
|
+
* @param input - BCJ filtered data
|
|
7
|
+
* @param _properties - Unused for BCJ
|
|
8
|
+
* @param _unpackSize - Unused for BCJ
|
|
9
|
+
* @returns Unfiltered data
|
|
10
|
+
*/
|
|
11
|
+
export declare function decodeBcj(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
12
|
+
/**
|
|
13
|
+
* Create a BCJ decoder Transform stream
|
|
14
|
+
*/
|
|
15
|
+
export declare function createBcjDecoder(properties?: Buffer, unpackSize?: number): Transform;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// BCJ (x86) filter codec - converts x86 CALL/JMP relative addresses
|
|
2
|
+
// This is a simple filter that makes executables more compressible by LZMA
|
|
3
|
+
//
|
|
4
|
+
// BCJ transforms relative addresses in x86 CALL (0xE8) and JMP (0xE9) instructions
|
|
5
|
+
// to absolute addresses, which creates more repetitive patterns for compression.
|
|
6
|
+
//
|
|
7
|
+
// Reference: https://github.com/jljusten/LZMA-SDK/blob/master/C/Bra86.c
|
|
8
|
+
"use strict";
|
|
9
|
+
Object.defineProperty(exports, "__esModule", {
|
|
10
|
+
value: true
|
|
11
|
+
});
|
|
12
|
+
function _export(target, all) {
|
|
13
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
_export(exports, {
|
|
19
|
+
get createBcjDecoder () {
|
|
20
|
+
return createBcjDecoder;
|
|
21
|
+
},
|
|
22
|
+
get decodeBcj () {
|
|
23
|
+
return decodeBcj;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
var _extractbaseiterator = require("extract-base-iterator");
|
|
27
|
+
var _createBufferingDecoderts = /*#__PURE__*/ _interop_require_default(require("./createBufferingDecoder.js"));
|
|
28
|
+
function _interop_require_default(obj) {
|
|
29
|
+
return obj && obj.__esModule ? obj : {
|
|
30
|
+
default: obj
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function decodeBcj(input, _properties, _unpackSize) {
|
|
34
|
+
// BCJ filter state
|
|
35
|
+
var pos = 0;
|
|
36
|
+
var prevMask = 0;
|
|
37
|
+
var output = (0, _extractbaseiterator.bufferFrom)(input); // Copy since we modify in place
|
|
38
|
+
while(pos < output.length - 4){
|
|
39
|
+
var b = output[pos];
|
|
40
|
+
// Check for CALL (0xE8) or JMP (0xE9) opcode
|
|
41
|
+
if (b !== 0xe8 && b !== 0xe9) {
|
|
42
|
+
pos++;
|
|
43
|
+
prevMask = 0;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
// Check mask to avoid false positives in data
|
|
47
|
+
var offset = pos + 5;
|
|
48
|
+
if (offset > output.length) {
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
// Skip if in masked region (previous conversion affected this area)
|
|
52
|
+
if ((prevMask & 1) !== 0) {
|
|
53
|
+
prevMask = prevMask >> 1 | 4;
|
|
54
|
+
pos++;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// Read the 32-bit address (little-endian)
|
|
58
|
+
var addr = output[pos + 1] | output[pos + 2] << 8 | output[pos + 3] << 16 | output[pos + 4] << 24 >>> 0;
|
|
59
|
+
// Check if this looks like a converted address
|
|
60
|
+
// High byte should be 0x00 or 0xFF for typical code
|
|
61
|
+
var highByte = output[pos + 4];
|
|
62
|
+
if (highByte === 0x00 || highByte === 0xff) {
|
|
63
|
+
// Convert absolute to relative
|
|
64
|
+
var newAddr;
|
|
65
|
+
if (highByte === 0x00) {
|
|
66
|
+
// Positive offset - subtract position
|
|
67
|
+
newAddr = addr - pos;
|
|
68
|
+
} else {
|
|
69
|
+
// Negative offset (0xFF high byte)
|
|
70
|
+
newAddr = addr + pos;
|
|
71
|
+
}
|
|
72
|
+
// Write back as little-endian
|
|
73
|
+
output[pos + 1] = newAddr & 0xff;
|
|
74
|
+
output[pos + 2] = newAddr >>> 8 & 0xff;
|
|
75
|
+
output[pos + 3] = newAddr >>> 16 & 0xff;
|
|
76
|
+
output[pos + 4] = newAddr >>> 24 & 0xff;
|
|
77
|
+
pos += 5;
|
|
78
|
+
prevMask = 0;
|
|
79
|
+
} else {
|
|
80
|
+
pos++;
|
|
81
|
+
prevMask = 0;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return output;
|
|
85
|
+
}
|
|
86
|
+
function createBcjDecoder(properties, unpackSize) {
|
|
87
|
+
return (0, _createBufferingDecoderts.default)(decodeBcj, properties, unpackSize);
|
|
88
|
+
}
|
|
89
|
+
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Bcj.ts"],"sourcesContent":["// BCJ (x86) filter codec - converts x86 CALL/JMP relative addresses\n// This is a simple filter that makes executables more compressible by LZMA\n//\n// BCJ transforms relative addresses in x86 CALL (0xE8) and JMP (0xE9) instructions\n// to absolute addresses, which creates more repetitive patterns for compression.\n//\n// Reference: https://github.com/jljusten/LZMA-SDK/blob/master/C/Bra86.c\n\nimport { bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n/**\n * Decode BCJ (x86) filtered data\n * Reverses the BCJ transformation by converting absolute addresses back to relative\n *\n * @param input - BCJ filtered data\n * @param _properties - Unused for BCJ\n * @param _unpackSize - Unused for BCJ\n * @returns Unfiltered data\n */\nexport function decodeBcj(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n // BCJ filter state\n var pos = 0;\n var prevMask = 0;\n var output = bufferFrom(input); // Copy since we modify in place\n\n while (pos < output.length - 4) {\n var b = output[pos];\n\n // Check for CALL (0xE8) or JMP (0xE9) opcode\n if (b !== 0xe8 && b !== 0xe9) {\n pos++;\n prevMask = 0;\n continue;\n }\n\n // Check mask to avoid false positives in data\n var offset = pos + 5;\n if (offset > output.length) {\n break;\n }\n\n // Skip if in masked region (previous conversion affected this area)\n if ((prevMask & 1) !== 0) {\n prevMask = (prevMask >> 1) | 4;\n pos++;\n continue;\n }\n\n // Read the 32-bit address (little-endian)\n var addr = output[pos + 1] | (output[pos + 2] << 8) | (output[pos + 3] << 16) | ((output[pos + 4] << 24) >>> 0);\n\n // Check if this looks like a converted address\n // High byte should be 0x00 or 0xFF for typical code\n var highByte = output[pos + 4];\n\n if (highByte === 0x00 || highByte === 0xff) {\n // Convert absolute to relative\n var newAddr: number;\n if (highByte === 0x00) {\n // Positive offset - subtract position\n newAddr = addr - pos;\n } else {\n // Negative offset (0xFF high byte)\n newAddr = addr + pos;\n }\n\n // Write back as little-endian\n output[pos + 1] = newAddr & 0xff;\n output[pos + 2] = (newAddr >>> 8) & 0xff;\n output[pos + 3] = (newAddr >>> 16) & 0xff;\n output[pos + 4] = (newAddr >>> 24) & 0xff;\n\n pos += 5;\n prevMask = 0;\n } else {\n pos++;\n prevMask = 0;\n }\n }\n\n return output;\n}\n\n/**\n * Create a BCJ decoder Transform stream\n */\nexport function createBcjDecoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcj, properties, unpackSize);\n}\n"],"names":["createBcjDecoder","decodeBcj","input","_properties","_unpackSize","pos","prevMask","output","bufferFrom","length","b","offset","addr","highByte","newAddr","properties","unpackSize","createBufferingDecoder"],"mappings":"AAAA,oEAAoE;AACpE,2EAA2E;AAC3E,EAAE;AACF,mFAAmF;AACnF,iFAAiF;AACjF,EAAE;AACF,wEAAwE;;;;;;;;;;;;QAkFxDA;eAAAA;;QAnEAC;eAAAA;;;mCAbW;+EAEQ;;;;;;AAW5B,SAASA,UAAUC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACjF,mBAAmB;IACnB,IAAIC,MAAM;IACV,IAAIC,WAAW;IACf,IAAIC,SAASC,IAAAA,+BAAU,EAACN,QAAQ,gCAAgC;IAEhE,MAAOG,MAAME,OAAOE,MAAM,GAAG,EAAG;QAC9B,IAAIC,IAAIH,MAAM,CAACF,IAAI;QAEnB,6CAA6C;QAC7C,IAAIK,MAAM,QAAQA,MAAM,MAAM;YAC5BL;YACAC,WAAW;YACX;QACF;QAEA,8CAA8C;QAC9C,IAAIK,SAASN,MAAM;QACnB,IAAIM,SAASJ,OAAOE,MAAM,EAAE;YAC1B;QACF;QAEA,oEAAoE;QACpE,IAAI,AAACH,CAAAA,WAAW,CAAA,MAAO,GAAG;YACxBA,WAAW,AAACA,YAAY,IAAK;YAC7BD;YACA;QACF;QAEA,0CAA0C;QAC1C,IAAIO,OAAOL,MAAM,CAACF,MAAM,EAAE,GAAIE,MAAM,CAACF,MAAM,EAAE,IAAI,IAAME,MAAM,CAACF,MAAM,EAAE,IAAI,KAAO,AAACE,MAAM,CAACF,MAAM,EAAE,IAAI,OAAQ;QAE7G,+CAA+C;QAC/C,oDAAoD;QACpD,IAAIQ,WAAWN,MAAM,CAACF,MAAM,EAAE;QAE9B,IAAIQ,aAAa,QAAQA,aAAa,MAAM;YAC1C,+BAA+B;YAC/B,IAAIC;YACJ,IAAID,aAAa,MAAM;gBACrB,sCAAsC;gBACtCC,UAAUF,OAAOP;YACnB,OAAO;gBACL,mCAAmC;gBACnCS,UAAUF,OAAOP;YACnB;YAEA,8BAA8B;YAC9BE,MAAM,CAACF,MAAM,EAAE,GAAGS,UAAU;YAC5BP,MAAM,CAACF,MAAM,EAAE,GAAG,AAACS,YAAY,IAAK;YACpCP,MAAM,CAACF,MAAM,EAAE,GAAG,AAACS,YAAY,KAAM;YACrCP,MAAM,CAACF,MAAM,EAAE,GAAG,AAACS,YAAY,KAAM;YAErCT,OAAO;YACPC,WAAW;QACb,OAAO;YACLD;YACAC,WAAW;QACb;IACF;IAEA,OAAOC;AACT;AAKO,SAASP,iBAAiBe,UAAmB,EAAEC,UAAmB;IACvE,OAAOC,IAAAA,iCAAsB,EAAChB,WAAWc,YAAYC;AACvD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type Transform } from 'readable-stream';
|
|
2
|
+
/**
|
|
3
|
+
* Create a Copy decoder stream
|
|
4
|
+
* Simply passes through data unchanged
|
|
5
|
+
*/
|
|
6
|
+
export declare function createCopyDecoder(): Transform;
|
|
7
|
+
/**
|
|
8
|
+
* Decode a buffer using Copy codec (no-op)
|
|
9
|
+
* @param input - Input buffer
|
|
10
|
+
* @param _properties - Unused
|
|
11
|
+
* @param _unpackSize - Unused
|
|
12
|
+
* @returns Same buffer (no transformation)
|
|
13
|
+
*/
|
|
14
|
+
export declare function decodeCopy(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type Transform } from 'readable-stream';
|
|
2
|
+
/**
|
|
3
|
+
* Create a Copy decoder stream
|
|
4
|
+
* Simply passes through data unchanged
|
|
5
|
+
*/
|
|
6
|
+
export declare function createCopyDecoder(): Transform;
|
|
7
|
+
/**
|
|
8
|
+
* Decode a buffer using Copy codec (no-op)
|
|
9
|
+
* @param input - Input buffer
|
|
10
|
+
* @param _properties - Unused
|
|
11
|
+
* @param _unpackSize - Unused
|
|
12
|
+
* @returns Same buffer (no transformation)
|
|
13
|
+
*/
|
|
14
|
+
export declare function decodeCopy(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Copy codec - passthrough (no compression)
|
|
2
|
+
// This is the simplest codec, just passes data through unchanged
|
|
3
|
+
"use strict";
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
function _export(target, all) {
|
|
8
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
_export(exports, {
|
|
14
|
+
get createCopyDecoder () {
|
|
15
|
+
return createCopyDecoder;
|
|
16
|
+
},
|
|
17
|
+
get decodeCopy () {
|
|
18
|
+
return decodeCopy;
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
var _readablestream = require("readable-stream");
|
|
22
|
+
function createCopyDecoder() {
|
|
23
|
+
return new _readablestream.PassThrough();
|
|
24
|
+
}
|
|
25
|
+
function decodeCopy(input, _properties, _unpackSize) {
|
|
26
|
+
return input;
|
|
27
|
+
}
|
|
28
|
+
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Copy.ts"],"sourcesContent":["// Copy codec - passthrough (no compression)\n// This is the simplest codec, just passes data through unchanged\n\nimport { PassThrough, type Transform } from 'readable-stream';\n\n/**\n * Create a Copy decoder stream\n * Simply passes through data unchanged\n */\nexport function createCopyDecoder(): Transform {\n return new PassThrough();\n}\n\n/**\n * Decode a buffer using Copy codec (no-op)\n * @param input - Input buffer\n * @param _properties - Unused\n * @param _unpackSize - Unused\n * @returns Same buffer (no transformation)\n */\nexport function decodeCopy(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n return input;\n}\n"],"names":["createCopyDecoder","decodeCopy","PassThrough","input","_properties","_unpackSize"],"mappings":"AAAA,4CAA4C;AAC5C,iEAAiE;;;;;;;;;;;;QAQjDA;eAAAA;;QAWAC;eAAAA;;;8BAjB4B;AAMrC,SAASD;IACd,OAAO,IAAIE,2BAAW;AACxB;AASO,SAASD,WAAWE,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IAClF,OAAOF;AACT"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Transform } from 'readable-stream';
|
|
2
|
+
/**
|
|
3
|
+
* Decode Deflate compressed data
|
|
4
|
+
*
|
|
5
|
+
* @param input - Deflate compressed data
|
|
6
|
+
* @param _properties - Unused for Deflate
|
|
7
|
+
* @param _unpackSize - Unused for Deflate
|
|
8
|
+
* @returns Decompressed data
|
|
9
|
+
*/
|
|
10
|
+
export declare function decodeDeflate(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
11
|
+
/**
|
|
12
|
+
* Create a Deflate decoder Transform stream
|
|
13
|
+
*/
|
|
14
|
+
export declare function createDeflateDecoder(properties?: Buffer, unpackSize?: number): Transform;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Transform } from 'readable-stream';
|
|
2
|
+
/**
|
|
3
|
+
* Decode Deflate compressed data
|
|
4
|
+
*
|
|
5
|
+
* @param input - Deflate compressed data
|
|
6
|
+
* @param _properties - Unused for Deflate
|
|
7
|
+
* @param _unpackSize - Unused for Deflate
|
|
8
|
+
* @returns Decompressed data
|
|
9
|
+
*/
|
|
10
|
+
export declare function decodeDeflate(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
11
|
+
/**
|
|
12
|
+
* Create a Deflate decoder Transform stream
|
|
13
|
+
*/
|
|
14
|
+
export declare function createDeflateDecoder(properties?: Buffer, unpackSize?: number): Transform;
|