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/headers.ts"],"sourcesContent":["// 7z header parsing\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n\nimport { bufferEquals, readUInt64LE, verifyCrc32Region } from 'extract-base-iterator';\nimport { createCodedError, ErrorCode, PropertyId, SEVENZ_MAGIC } from './constants.ts';\nimport { readDefinedVector, readNumber } from './NumberCodec.ts';\n\n// Type definitions\nexport interface SignatureHeader {\n majorVersion: number;\n minorVersion: number;\n startHeaderCRC: number;\n nextHeaderOffset: number;\n nextHeaderSize: number;\n nextHeaderCRC: number;\n}\n\nexport interface Coder {\n id: number[]; // Codec ID bytes\n numInStreams: number; // Number of input streams\n numOutStreams: number; // Number of output streams\n properties?: Buffer; // Optional codec properties\n}\n\nexport interface Folder {\n coders: Coder[];\n bindPairs: { inIndex: number; outIndex: number }[];\n packedStreams: number[]; // Indices of packed streams\n unpackSizes: number[]; // Unpack size for each coder output\n unpackCRC?: number; // CRC of final unpacked data\n hasCRC: boolean;\n}\n\nexport interface StreamsInfo {\n packPos: number; // Position of packed data (relative to end of signature header)\n packSizes: number[]; // Sizes of packed streams\n packCRCs?: number[]; // Optional CRCs for packed streams\n folders: Folder[]; // Decompression info\n numUnpackStreamsPerFolder: number[]; // Number of files in each folder (for solid archives)\n unpackSizes: number[]; // Size of each unpacked file\n unpackCRCs?: number[]; // Optional CRCs for unpacked files\n}\n\nexport interface FileInfo {\n name: string;\n size: number;\n isDirectory: boolean;\n isAntiFile: boolean; // \"Anti\" items mark files to delete in delta archives\n hasStream: boolean; // False for empty files/directories\n crc?: number;\n ctime?: Date;\n atime?: Date;\n mtime?: Date;\n attributes?: number;\n}\n\nexport interface ArchiveHeader {\n signature: SignatureHeader;\n streamsInfo?: StreamsInfo;\n filesInfo: FileInfo[];\n}\n\n/**\n * Parse the signature header (first 32 bytes)\n */\nexport function parseSignatureHeader(buf: Buffer): SignatureHeader {\n // Verify magic bytes\n if (!bufferEquals(buf, 0, SEVENZ_MAGIC)) {\n throw createCodedError('Not a valid 7z archive', ErrorCode.INVALID_SIGNATURE);\n }\n\n // Read version\n var majorVersion = buf[6];\n var minorVersion = buf[7];\n\n // Version check - we support 0.x (current is 0.4)\n if (majorVersion > 0) {\n throw createCodedError(`Unsupported 7z version: ${majorVersion}.${minorVersion}`, ErrorCode.UNSUPPORTED_VERSION);\n }\n\n // Read start header CRC (CRC of the next 20 bytes)\n var startHeaderCRC = buf.readUInt32LE(8);\n\n // Verify start header CRC\n if (!verifyCrc32Region(buf, 12, 20, startHeaderCRC)) {\n throw createCodedError('Start header CRC mismatch', ErrorCode.CRC_MISMATCH);\n }\n\n // Read next header location\n var nextHeaderOffset = readUInt64LE(buf, 12);\n var nextHeaderSize = readUInt64LE(buf, 20);\n var nextHeaderCRC = buf.readUInt32LE(28);\n\n return {\n majorVersion: majorVersion,\n minorVersion: minorVersion,\n startHeaderCRC: startHeaderCRC,\n nextHeaderOffset: nextHeaderOffset,\n nextHeaderSize: nextHeaderSize,\n nextHeaderCRC: nextHeaderCRC,\n };\n}\n\n/**\n * Parse the encoded header (metadata block at end of archive)\n */\nexport function parseEncodedHeader(buf: Buffer, expectedCRC: number): { streamsInfo?: StreamsInfo; filesInfo: FileInfo[] } {\n // Verify CRC\n if (!verifyCrc32Region(buf, 0, buf.length, expectedCRC)) {\n throw createCodedError('Encoded header CRC mismatch', ErrorCode.CRC_MISMATCH);\n }\n\n var offset = 0;\n\n // Read property ID\n var propertyId = buf[offset++];\n\n // Handle kEncodedHeader - means the header itself is compressed\n if (propertyId === PropertyId.kEncodedHeader) {\n // Return indicator that we need to decompress\n throw createCodedError('Compressed header - needs decompression first', ErrorCode.COMPRESSED_HEADER);\n }\n\n // Should be kHeader\n if (propertyId !== PropertyId.kHeader) {\n throw createCodedError(`Expected kHeader, got ${propertyId}`, ErrorCode.CORRUPT_HEADER);\n }\n\n // Parse header contents (after kHeader byte)\n return parseHeaderContent(buf, offset);\n}\n\n/**\n * Parse header content (after kHeader byte has been read)\n * Used by parseEncodedHeader and for decompressed headers\n */\nexport function parseHeaderContent(buf: Buffer, offset: number): { streamsInfo?: StreamsInfo; filesInfo: FileInfo[] } {\n var result: { streamsInfo?: StreamsInfo; filesInfo: FileInfo[] } = {\n filesInfo: [],\n };\n\n // Parse header contents\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.kArchiveProperties:\n offset = skipArchiveProperties(buf, offset);\n break;\n case PropertyId.kAdditionalStreamsInfo:\n // Additional streams - skip for now\n offset = skipStreamsInfo(buf, offset);\n break;\n case PropertyId.kMainStreamsInfo: {\n var streamsResult = parseStreamsInfo(buf, offset);\n result.streamsInfo = streamsResult.info;\n offset = streamsResult.offset;\n break;\n }\n case PropertyId.kFilesInfo: {\n var filesResult = parseFilesInfo(buf, offset);\n result.filesInfo = filesResult.files;\n offset = filesResult.offset;\n break;\n }\n default:\n throw createCodedError(`Unknown property ID in header: ${propertyId}`, ErrorCode.CORRUPT_HEADER);\n }\n }\n\n return result;\n}\n\n/**\n * Parse StreamsInfo block\n */\nfunction parseStreamsInfo(buf: Buffer, offset: number): { info: StreamsInfo; offset: number } {\n var info: StreamsInfo = {\n packPos: 0,\n packSizes: [],\n folders: [],\n numUnpackStreamsPerFolder: [],\n unpackSizes: [],\n };\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 packResult = parsePackInfo(buf, offset);\n info.packPos = packResult.packPos;\n info.packSizes = packResult.packSizes;\n info.packCRCs = packResult.packCRCs;\n offset = packResult.offset;\n break;\n }\n case PropertyId.kUnpackInfo: {\n var unpackResult = parseUnpackInfo(buf, offset);\n info.folders = unpackResult.folders;\n offset = unpackResult.offset;\n break;\n }\n case PropertyId.kSubStreamsInfo: {\n var subResult = parseSubStreamsInfo(buf, offset, info.folders);\n info.numUnpackStreamsPerFolder = subResult.numUnpackStreamsPerFolder;\n info.unpackSizes = subResult.unpackSizes;\n info.unpackCRCs = subResult.unpackCRCs;\n offset = subResult.offset;\n break;\n }\n default:\n throw createCodedError(`Unknown property ID in StreamsInfo: ${propertyId}`, ErrorCode.CORRUPT_HEADER);\n }\n }\n\n // If no SubStreamsInfo, each folder produces one file\n if (info.unpackSizes.length === 0 && info.folders.length > 0) {\n for (var i = 0; i < info.folders.length; i++) {\n var folder = info.folders[i];\n // Get the final unpack size (last coder's output)\n var finalSize = folder.unpackSizes[folder.unpackSizes.length - 1];\n info.unpackSizes.push(finalSize);\n info.numUnpackStreamsPerFolder.push(1);\n }\n }\n\n return { info: info, offset: offset };\n}\n\n/**\n * Parse PackInfo block\n */\nfunction parsePackInfo(buf: Buffer, offset: number): { packPos: number; packSizes: number[]; packCRCs?: number[]; offset: number } {\n // Pack position\n var packPosResult = readNumber(buf, offset);\n var packPos = packPosResult.value;\n offset += packPosResult.bytesRead;\n\n // Number of pack streams\n var numPackResult = readNumber(buf, offset);\n var numPackStreams = numPackResult.value;\n offset += numPackResult.bytesRead;\n\n var packSizes: number[] = [];\n var packCRCs: number[] | undefined;\n\n while (offset < buf.length) {\n var propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n if (propertyId === PropertyId.kSize) {\n for (var i = 0; i < numPackStreams; i++) {\n var sizeResult = readNumber(buf, offset);\n packSizes.push(sizeResult.value);\n offset += sizeResult.bytesRead;\n }\n } else if (propertyId === PropertyId.kCRC) {\n packCRCs = [];\n var definedResult = readDefinedVector(buf, offset, numPackStreams);\n offset += definedResult.bytesRead;\n for (var j = 0; j < numPackStreams; j++) {\n if (definedResult.defined[j]) {\n packCRCs.push(buf.readUInt32LE(offset));\n offset += 4;\n } else {\n packCRCs.push(0);\n }\n }\n }\n }\n\n return { packPos: packPos, packSizes: packSizes, packCRCs: packCRCs, offset: offset };\n}\n\n/**\n * Parse UnpackInfo block\n */\nfunction parseUnpackInfo(buf: Buffer, offset: number): { folders: Folder[]; offset: number } {\n var folders: Folder[] = [];\n\n while (offset < buf.length) {\n var propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n if (propertyId === PropertyId.kFolder) {\n // Number of folders\n var numFoldersResult = readNumber(buf, offset);\n var numFolders = numFoldersResult.value;\n offset += numFoldersResult.bytesRead;\n\n // External flag\n var external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External folders not supported', ErrorCode.CORRUPT_HEADER);\n }\n\n // Parse each folder\n for (var i = 0; i < numFolders; i++) {\n var folderResult = parseFolder(buf, offset);\n folders.push(folderResult.folder);\n offset = folderResult.offset;\n }\n } else if (propertyId === PropertyId.kCodersUnpackSize) {\n // Unpack sizes for each coder output\n for (var j = 0; j < folders.length; j++) {\n var folder = folders[j];\n folder.unpackSizes = [];\n // One unpack size per coder output stream\n var numOutputs = 0;\n for (var k = 0; k < folder.coders.length; k++) {\n numOutputs += folder.coders[k].numOutStreams;\n }\n for (var l = 0; l < numOutputs; l++) {\n var sizeResult = readNumber(buf, offset);\n folder.unpackSizes.push(sizeResult.value);\n offset += sizeResult.bytesRead;\n }\n }\n } else if (propertyId === PropertyId.kCRC) {\n // CRCs for folders\n var definedResult = readDefinedVector(buf, offset, folders.length);\n offset += definedResult.bytesRead;\n for (var m = 0; m < folders.length; m++) {\n folders[m].hasCRC = definedResult.defined[m];\n if (definedResult.defined[m]) {\n folders[m].unpackCRC = buf.readUInt32LE(offset);\n offset += 4;\n }\n }\n }\n }\n\n return { folders: folders, offset: offset };\n}\n\n/**\n * Parse a single Folder structure\n */\nfunction parseFolder(buf: Buffer, offset: number): { folder: Folder; offset: number } {\n // Number of coders\n var numCodersResult = readNumber(buf, offset);\n var numCoders = numCodersResult.value;\n offset += numCodersResult.bytesRead;\n\n var coders: Coder[] = [];\n var numInStreamsTotal = 0;\n var numOutStreamsTotal = 0;\n\n for (var i = 0; i < numCoders; i++) {\n var flags = buf[offset++];\n var idSize = flags & 0x0f;\n var isComplex = (flags & 0x10) !== 0;\n var hasAttributes = (flags & 0x20) !== 0;\n\n // Read codec ID\n var id: number[] = [];\n for (var j = 0; j < idSize; j++) {\n id.push(buf[offset++]);\n }\n\n var numInStreams = 1;\n var numOutStreams = 1;\n\n if (isComplex) {\n var inResult = readNumber(buf, offset);\n numInStreams = inResult.value;\n offset += inResult.bytesRead;\n\n var outResult = readNumber(buf, offset);\n numOutStreams = outResult.value;\n offset += outResult.bytesRead;\n }\n\n var properties: Buffer | undefined;\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\n coders.push({\n id: id,\n numInStreams: numInStreams,\n numOutStreams: numOutStreams,\n properties: properties,\n });\n\n numInStreamsTotal += numInStreams;\n numOutStreamsTotal += numOutStreams;\n }\n\n // Bind pairs\n var numBindPairs = numOutStreamsTotal - 1;\n var bindPairs: { inIndex: number; outIndex: number }[] = [];\n\n for (var k = 0; k < numBindPairs; k++) {\n var inIndexResult = readNumber(buf, offset);\n offset += inIndexResult.bytesRead;\n\n var outIndexResult = readNumber(buf, offset);\n offset += outIndexResult.bytesRead;\n\n bindPairs.push({\n inIndex: inIndexResult.value,\n outIndex: outIndexResult.value,\n });\n }\n\n // Packed stream indices\n var numPackedStreams = numInStreamsTotal - numBindPairs;\n var packedStreams: number[] = [];\n\n if (numPackedStreams === 1) {\n // Find the unbound input stream\n for (var m = 0; m < numInStreamsTotal; m++) {\n var isBound = false;\n for (var n = 0; n < bindPairs.length; n++) {\n if (bindPairs[n].inIndex === m) {\n isBound = true;\n break;\n }\n }\n if (!isBound) {\n packedStreams.push(m);\n break;\n }\n }\n } else {\n for (var p = 0; p < numPackedStreams; p++) {\n var indexResult = readNumber(buf, offset);\n packedStreams.push(indexResult.value);\n offset += indexResult.bytesRead;\n }\n }\n\n return {\n folder: {\n coders: coders,\n bindPairs: bindPairs,\n packedStreams: packedStreams,\n unpackSizes: [],\n hasCRC: false,\n },\n offset: offset,\n };\n}\n\n/**\n * Parse SubStreamsInfo block\n */\nfunction parseSubStreamsInfo(buf: Buffer, offset: number, folders: Folder[]): { numUnpackStreamsPerFolder: number[]; unpackSizes: number[]; unpackCRCs?: number[]; offset: number } {\n var numUnpackStreamsPerFolder: number[] = [];\n var unpackSizes: number[] = [];\n var unpackCRCs: number[] | undefined;\n\n // Default: 1 file per folder\n for (var i = 0; i < folders.length; i++) {\n numUnpackStreamsPerFolder.push(1);\n }\n\n while (offset < buf.length) {\n var propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n if (propertyId === PropertyId.kNumUnpackStream) {\n for (var j = 0; j < folders.length; j++) {\n var numResult = readNumber(buf, offset);\n numUnpackStreamsPerFolder[j] = numResult.value;\n offset += numResult.bytesRead;\n }\n } else if (propertyId === PropertyId.kSize) {\n for (var k = 0; k < folders.length; k++) {\n var numStreams = numUnpackStreamsPerFolder[k];\n if (numStreams === 0) continue;\n\n // Read sizes for all but last stream in folder (last is calculated)\n var remaining = folders[k].unpackSizes[folders[k].unpackSizes.length - 1];\n for (var l = 0; l < numStreams - 1; l++) {\n var sizeResult = readNumber(buf, offset);\n unpackSizes.push(sizeResult.value);\n remaining -= sizeResult.value;\n offset += sizeResult.bytesRead;\n }\n // Last stream size is remainder\n unpackSizes.push(remaining);\n }\n } else if (propertyId === PropertyId.kCRC) {\n // Count files that need CRC\n var numFiles = 0;\n for (var m = 0; m < folders.length; m++) {\n var numStreamsInFolder = numUnpackStreamsPerFolder[m];\n // Only count if folder doesn't have CRC or has multiple streams\n if (!folders[m].hasCRC || numStreamsInFolder > 1) {\n numFiles += numStreamsInFolder;\n }\n }\n\n unpackCRCs = [];\n var definedResult = readDefinedVector(buf, offset, numFiles);\n offset += definedResult.bytesRead;\n for (var n = 0; n < numFiles; n++) {\n if (definedResult.defined[n]) {\n unpackCRCs.push(buf.readUInt32LE(offset));\n offset += 4;\n } else {\n unpackCRCs.push(0);\n }\n }\n }\n }\n\n // If no sizes specified, use folder unpack sizes\n if (unpackSizes.length === 0) {\n for (var p = 0; p < folders.length; p++) {\n var folder = folders[p];\n unpackSizes.push(folder.unpackSizes[folder.unpackSizes.length - 1]);\n }\n }\n\n return { numUnpackStreamsPerFolder: numUnpackStreamsPerFolder, unpackSizes: unpackSizes, unpackCRCs: unpackCRCs, offset: offset };\n}\n\n/**\n * Parse FilesInfo block\n */\nfunction parseFilesInfo(buf: Buffer, offset: number): { files: FileInfo[]; offset: number } {\n // Number of files\n var numFilesResult = readNumber(buf, offset);\n var numFiles = numFilesResult.value;\n offset += numFilesResult.bytesRead;\n\n // Initialize files array\n var files: FileInfo[] = [];\n for (var i = 0; i < numFiles; i++) {\n files.push({\n name: '',\n size: 0,\n isDirectory: false,\n isAntiFile: false,\n hasStream: true,\n });\n }\n\n var emptyStreamFlags: boolean[] = [];\n var emptyFileFlags: boolean[] = [];\n\n while (offset < buf.length) {\n var propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n // Read property size\n var propSizeResult = readNumber(buf, offset);\n var propSize = propSizeResult.value;\n offset += propSizeResult.bytesRead;\n\n var propEnd = offset + propSize;\n\n switch (propertyId) {\n case PropertyId.kEmptyStream:\n emptyStreamFlags = readBoolVector(buf, offset, numFiles);\n // Mark files that don't have streams\n for (var j = 0; j < numFiles; j++) {\n files[j].hasStream = !emptyStreamFlags[j];\n }\n break;\n\n case PropertyId.kEmptyFile: {\n var numEmptyStreams = 0;\n for (var k = 0; k < emptyStreamFlags.length; k++) {\n if (emptyStreamFlags[k]) numEmptyStreams++;\n }\n emptyFileFlags = readBoolVector(buf, offset, numEmptyStreams);\n break;\n }\n\n case PropertyId.kAnti: {\n var numAnti = 0;\n for (var l = 0; l < emptyStreamFlags.length; l++) {\n if (emptyStreamFlags[l]) numAnti++;\n }\n var antiFlags = readBoolVector(buf, offset, numAnti);\n var antiIdx = 0;\n for (var m = 0; m < numFiles; m++) {\n if (emptyStreamFlags[m]) {\n files[m].isAntiFile = antiFlags[antiIdx++];\n }\n }\n break;\n }\n\n case PropertyId.kName:\n offset = parseFileNames(buf, offset, files);\n break;\n\n case PropertyId.kCTime:\n offset = parseFileTimes(buf, offset, files, 'ctime');\n break;\n\n case PropertyId.kATime:\n offset = parseFileTimes(buf, offset, files, 'atime');\n break;\n\n case PropertyId.kMTime:\n offset = parseFileTimes(buf, offset, files, 'mtime');\n break;\n\n case PropertyId.kWinAttributes:\n offset = parseAttributes(buf, offset, files);\n break;\n\n case PropertyId.kDummy:\n // Skip dummy bytes\n break;\n\n default:\n // Skip unknown properties\n break;\n }\n\n offset = propEnd;\n }\n\n // Determine directories from empty stream + not empty file\n var emptyIdx = 0;\n for (var n = 0; n < numFiles; n++) {\n if (emptyStreamFlags[n]) {\n // Empty stream - could be directory or empty file\n if (emptyIdx < emptyFileFlags.length && emptyFileFlags[emptyIdx]) {\n files[n].isDirectory = false; // Empty file\n } else {\n files[n].isDirectory = true; // Directory\n }\n emptyIdx++;\n }\n }\n\n return { files: files, offset: offset };\n}\n\n/**\n * Read a boolean vector (bit-packed)\n */\nfunction readBoolVector(buf: Buffer, offset: number, count: number): boolean[] {\n var result: boolean[] = [];\n var byteIdx = 0;\n var bitMask = 0x80;\n\n for (var i = 0; i < count; i++) {\n result.push((buf[offset + byteIdx] & bitMask) !== 0);\n bitMask = bitMask >>> 1;\n if (bitMask === 0) {\n bitMask = 0x80;\n byteIdx++;\n }\n }\n\n return result;\n}\n\n/**\n * Parse file names (UTF-16LE encoded)\n */\nfunction parseFileNames(buf: Buffer, offset: number, files: FileInfo[]): number {\n // External flag\n var external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External file names not supported', ErrorCode.CORRUPT_HEADER);\n }\n\n // Names are UTF-16LE, null-terminated\n for (var i = 0; i < files.length; i++) {\n var nameChars: number[] = [];\n while (offset < buf.length) {\n var charCode = buf.readUInt16LE(offset);\n offset += 2;\n if (charCode === 0) break;\n nameChars.push(charCode);\n }\n files[i].name = String.fromCharCode.apply(null, nameChars);\n }\n\n return offset;\n}\n\n/**\n * Parse file times (Windows FILETIME format)\n */\nfunction parseFileTimes(buf: Buffer, offset: number, files: FileInfo[], timeType: 'ctime' | 'atime' | 'mtime'): number {\n // Read defined vector (allDefined byte + optional bitmask)\n var definedResult = readDefinedVector(buf, offset, files.length);\n offset += definedResult.bytesRead;\n\n // External flag - 0x00 means data follows inline, non-zero means external stream\n var external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External file times not supported', ErrorCode.UNSUPPORTED_FEATURE);\n }\n\n // Read times\n for (var i = 0; i < files.length; i++) {\n if (definedResult.defined[i]) {\n var filetime = readUInt64LE(buf, offset);\n offset += 8;\n // Convert FILETIME (100ns since 1601) to JavaScript Date\n // FILETIME epoch: 1601-01-01\n // JS Date epoch: 1970-01-01\n // Difference: 11644473600 seconds\n var ms = filetime / 10000 - 11644473600000;\n files[i][timeType] = new Date(ms);\n }\n }\n\n return offset;\n}\n\n/**\n * Parse Windows file attributes\n */\nfunction parseAttributes(buf: Buffer, offset: number, files: FileInfo[]): number {\n // Read defined vector (allDefined byte + optional bitmask)\n var definedResult = readDefinedVector(buf, offset, files.length);\n offset += definedResult.bytesRead;\n\n // External flag - 0x00 means data follows inline, non-zero means external stream\n var external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External file attributes not supported', ErrorCode.UNSUPPORTED_FEATURE);\n }\n\n // Read attributes\n for (var i = 0; i < files.length; i++) {\n if (definedResult.defined[i]) {\n files[i].attributes = buf.readUInt32LE(offset);\n offset += 4;\n }\n }\n\n return offset;\n}\n\n/**\n * Skip archive properties block\n */\nfunction skipArchiveProperties(buf: Buffer, offset: number): number {\n while (offset < buf.length) {\n var propertyId = buf[offset++];\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n var sizeResult = readNumber(buf, offset);\n offset += sizeResult.bytesRead + sizeResult.value;\n }\n return offset;\n}\n\n/**\n * Skip streams info block (for additional streams)\n */\nfunction skipStreamsInfo(buf: Buffer, offset: number): number {\n while (offset < buf.length) {\n var propertyId = buf[offset++];\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n // For nested structures, recurse\n if (propertyId === PropertyId.kPackInfo || propertyId === PropertyId.kUnpackInfo || propertyId === PropertyId.kSubStreamsInfo) {\n offset = skipStreamsInfo(buf, offset);\n }\n }\n return offset;\n}\n"],"names":["parseEncodedHeader","parseHeaderContent","parseSignatureHeader","buf","bufferEquals","SEVENZ_MAGIC","createCodedError","ErrorCode","INVALID_SIGNATURE","majorVersion","minorVersion","UNSUPPORTED_VERSION","startHeaderCRC","readUInt32LE","verifyCrc32Region","CRC_MISMATCH","nextHeaderOffset","readUInt64LE","nextHeaderSize","nextHeaderCRC","expectedCRC","length","offset","propertyId","PropertyId","kEncodedHeader","COMPRESSED_HEADER","kHeader","CORRUPT_HEADER","result","filesInfo","kEnd","kArchiveProperties","skipArchiveProperties","kAdditionalStreamsInfo","skipStreamsInfo","kMainStreamsInfo","streamsResult","parseStreamsInfo","streamsInfo","info","kFilesInfo","filesResult","parseFilesInfo","files","packPos","packSizes","folders","numUnpackStreamsPerFolder","unpackSizes","kPackInfo","packResult","parsePackInfo","packCRCs","kUnpackInfo","unpackResult","parseUnpackInfo","kSubStreamsInfo","subResult","parseSubStreamsInfo","unpackCRCs","i","folder","finalSize","push","packPosResult","readNumber","value","bytesRead","numPackResult","numPackStreams","kSize","sizeResult","kCRC","definedResult","readDefinedVector","j","defined","kFolder","numFoldersResult","numFolders","external","folderResult","parseFolder","kCodersUnpackSize","numOutputs","k","coders","numOutStreams","l","m","hasCRC","unpackCRC","numCodersResult","numCoders","numInStreamsTotal","numOutStreamsTotal","flags","idSize","isComplex","hasAttributes","id","numInStreams","inResult","outResult","properties","propsLenResult","slice","numBindPairs","bindPairs","inIndexResult","outIndexResult","inIndex","outIndex","numPackedStreams","packedStreams","isBound","n","p","indexResult","kNumUnpackStream","numResult","numStreams","remaining","numFiles","numStreamsInFolder","numFilesResult","name","size","isDirectory","isAntiFile","hasStream","emptyStreamFlags","emptyFileFlags","propSizeResult","propSize","propEnd","kEmptyStream","readBoolVector","kEmptyFile","numEmptyStreams","kAnti","numAnti","antiFlags","antiIdx","kName","parseFileNames","kCTime","parseFileTimes","kATime","kMTime","kWinAttributes","parseAttributes","kDummy","emptyIdx","count","byteIdx","bitMask","nameChars","charCode","readUInt16LE","String","fromCharCode","apply","timeType","UNSUPPORTED_FEATURE","filetime","ms","Date","attributes"],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// 7z format parser exports
|
|
2
|
+
// Only exports needed for public API - internal functions remain internal
|
|
3
|
+
// Error types for handling specific error conditions
|
|
4
|
+
"use strict";
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
function _export(target, all) {
|
|
9
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
_export(exports, {
|
|
15
|
+
get BufferSource () {
|
|
16
|
+
return _SevenZipParserts.BufferSource;
|
|
17
|
+
},
|
|
18
|
+
get ErrorCode () {
|
|
19
|
+
return _constantsts.ErrorCode;
|
|
20
|
+
},
|
|
21
|
+
get FileSource () {
|
|
22
|
+
return _SevenZipParserts.FileSource;
|
|
23
|
+
},
|
|
24
|
+
get SevenZipParser () {
|
|
25
|
+
return _SevenZipParserts.SevenZipParser;
|
|
26
|
+
},
|
|
27
|
+
get createCodedError () {
|
|
28
|
+
return _constantsts.createCodedError;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
var _constantsts = require("./constants.js");
|
|
32
|
+
var _SevenZipParserts = require("./SevenZipParser.js");
|
|
33
|
+
/* 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/index.ts"],"sourcesContent":["// 7z format parser exports\n// Only exports needed for public API - internal functions remain internal\n\n// Error types for handling specific error conditions\nexport type { CodedError } from './constants.ts';\nexport { createCodedError, ErrorCode } from './constants.ts';\n// Parser and sources for advanced users\nexport type { ArchiveSource, SevenZipEntry } from './SevenZipParser.ts';\nexport { BufferSource, FileSource, SevenZipParser } from './SevenZipParser.ts';\n"],"names":["BufferSource","ErrorCode","FileSource","SevenZipParser","createCodedError"],"mappings":"AAAA,2BAA2B;AAC3B,0EAA0E;AAE1E,qDAAqD;;;;;;;;;;;;QAK5CA;eAAAA,8BAAY;;QAHMC;eAAAA,sBAAS;;QAGbC;eAAAA,4BAAU;;QAAEC;eAAAA,gCAAc;;QAHxCC;eAAAA,6BAAgB;;;2BAAmB;gCAGa"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export { DirectoryEntry, type Entry, LinkEntry, SymbolicLinkEntry } from 'extract-base-iterator';
|
|
2
|
+
import type { ExtractOptions as BaseExtractOptions } from 'extract-base-iterator';
|
|
3
|
+
/**
|
|
4
|
+
* Options for SevenZipIterator
|
|
5
|
+
*/
|
|
6
|
+
export interface ExtractOptions extends BaseExtractOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Password for encrypted archives
|
|
9
|
+
*/
|
|
10
|
+
password?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Memory threshold in bytes for stream input.
|
|
13
|
+
* Archives smaller than this are buffered in memory for faster processing.
|
|
14
|
+
* Archives larger than this are written to a temp file.
|
|
15
|
+
* Default: 100 MB (100 * 1024 * 1024)
|
|
16
|
+
*/
|
|
17
|
+
memoryThreshold?: number;
|
|
18
|
+
}
|
|
19
|
+
export { default as FileEntry } from './FileEntry.js';
|
|
20
|
+
import type { SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.js';
|
|
21
|
+
export interface LockT {
|
|
22
|
+
iterator?: unknown;
|
|
23
|
+
err?: Error;
|
|
24
|
+
fd?: number;
|
|
25
|
+
tempPath: string;
|
|
26
|
+
retain: () => void;
|
|
27
|
+
release: () => void;
|
|
28
|
+
}
|
|
29
|
+
export interface SevenZipFile {
|
|
30
|
+
getStream: () => NodeJS.ReadableStream;
|
|
31
|
+
}
|
|
32
|
+
export interface SevenZipFileIterator {
|
|
33
|
+
next: () => SevenZipEntry | null;
|
|
34
|
+
getParser: () => SevenZipParser;
|
|
35
|
+
}
|
|
36
|
+
import type { Entry } from 'extract-base-iterator';
|
|
37
|
+
export type EntryCallback = (error?: Error, result?: IteratorResult<Entry>) => undefined;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export { DirectoryEntry, type Entry, LinkEntry, SymbolicLinkEntry } from 'extract-base-iterator';
|
|
2
|
+
import type { ExtractOptions as BaseExtractOptions } from 'extract-base-iterator';
|
|
3
|
+
/**
|
|
4
|
+
* Options for SevenZipIterator
|
|
5
|
+
*/
|
|
6
|
+
export interface ExtractOptions extends BaseExtractOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Password for encrypted archives
|
|
9
|
+
*/
|
|
10
|
+
password?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Memory threshold in bytes for stream input.
|
|
13
|
+
* Archives smaller than this are buffered in memory for faster processing.
|
|
14
|
+
* Archives larger than this are written to a temp file.
|
|
15
|
+
* Default: 100 MB (100 * 1024 * 1024)
|
|
16
|
+
*/
|
|
17
|
+
memoryThreshold?: number;
|
|
18
|
+
}
|
|
19
|
+
export { default as FileEntry } from './FileEntry.js';
|
|
20
|
+
import type { SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.js';
|
|
21
|
+
export interface LockT {
|
|
22
|
+
iterator?: unknown;
|
|
23
|
+
err?: Error;
|
|
24
|
+
fd?: number;
|
|
25
|
+
tempPath: string;
|
|
26
|
+
retain: () => void;
|
|
27
|
+
release: () => void;
|
|
28
|
+
}
|
|
29
|
+
export interface SevenZipFile {
|
|
30
|
+
getStream: () => NodeJS.ReadableStream;
|
|
31
|
+
}
|
|
32
|
+
export interface SevenZipFileIterator {
|
|
33
|
+
next: () => SevenZipEntry | null;
|
|
34
|
+
getParser: () => SevenZipParser;
|
|
35
|
+
}
|
|
36
|
+
import type { Entry } from 'extract-base-iterator';
|
|
37
|
+
export type EntryCallback = (error?: Error, result?: IteratorResult<Entry>) => undefined;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get DirectoryEntry () {
|
|
13
|
+
return _extractbaseiterator.DirectoryEntry;
|
|
14
|
+
},
|
|
15
|
+
get FileEntry () {
|
|
16
|
+
return _FileEntryts.default;
|
|
17
|
+
},
|
|
18
|
+
get LinkEntry () {
|
|
19
|
+
return _extractbaseiterator.LinkEntry;
|
|
20
|
+
},
|
|
21
|
+
get SymbolicLinkEntry () {
|
|
22
|
+
return _extractbaseiterator.SymbolicLinkEntry;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
var _extractbaseiterator = require("extract-base-iterator");
|
|
26
|
+
var _FileEntryts = /*#__PURE__*/ _interop_require_default(require("./FileEntry.js"));
|
|
27
|
+
function _interop_require_default(obj) {
|
|
28
|
+
return obj && obj.__esModule ? obj : {
|
|
29
|
+
default: obj
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/* 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/types.ts"],"sourcesContent":["export { DirectoryEntry, type Entry, LinkEntry, SymbolicLinkEntry } from 'extract-base-iterator';\n\nimport type { ExtractOptions as BaseExtractOptions } from 'extract-base-iterator';\n\n/**\n * Options for SevenZipIterator\n */\nexport interface ExtractOptions extends BaseExtractOptions {\n /**\n * Password for encrypted archives\n */\n password?: string;\n\n /**\n * Memory threshold in bytes for stream input.\n * Archives smaller than this are buffered in memory for faster processing.\n * Archives larger than this are written to a temp file.\n * Default: 100 MB (100 * 1024 * 1024)\n */\n memoryThreshold?: number;\n}\nexport { default as FileEntry } from './FileEntry.ts';\n\nimport type { SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.ts';\n\nexport interface LockT {\n iterator?: unknown;\n err?: Error;\n fd?: number;\n tempPath: string;\n retain: () => void;\n release: () => void;\n}\n\nexport interface SevenZipFile {\n getStream: () => NodeJS.ReadableStream;\n}\n\nexport interface SevenZipFileIterator {\n next: () => SevenZipEntry | null;\n getParser: () => SevenZipParser;\n}\n\nimport type { Entry } from 'extract-base-iterator';\n\nexport type EntryCallback = (error?: Error, result?: IteratorResult<Entry>) => undefined;\n"],"names":["DirectoryEntry","FileEntry","LinkEntry","SymbolicLinkEntry"],"mappings":";;;;;;;;;;;QAASA;eAAAA,mCAAc;;QAqBHC;eAAAA,oBAAS;;QArBQC;eAAAA,8BAAS;;QAAEC;eAAAA,sCAAiB;;;mCAAQ;kEAqBpC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type FileAttributes, FileEntry, type NoParamCallback } from 'extract-base-iterator';
|
|
2
|
+
import type { SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.js';
|
|
3
|
+
import type { ExtractOptions, LockT } from './types.js';
|
|
4
|
+
export default class SevenZipFileEntry extends FileEntry {
|
|
5
|
+
private lock;
|
|
6
|
+
private entry;
|
|
7
|
+
private parser;
|
|
8
|
+
constructor(attributes: FileAttributes, entry: SevenZipEntry, parser: SevenZipParser, lock: LockT);
|
|
9
|
+
create(dest: string, options: ExtractOptions | NoParamCallback, callback: NoParamCallback): undefined | Promise<boolean>;
|
|
10
|
+
_writeFile(fullPath: string, _options: ExtractOptions, callback: NoParamCallback): undefined;
|
|
11
|
+
destroy(): void;
|
|
12
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { FileEntry, waitForAccess } from 'extract-base-iterator';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import oo from 'on-one';
|
|
4
|
+
let SevenZipFileEntry = class SevenZipFileEntry extends FileEntry {
|
|
5
|
+
create(dest, options, callback) {
|
|
6
|
+
if (typeof options === 'function') {
|
|
7
|
+
callback = options;
|
|
8
|
+
options = null;
|
|
9
|
+
}
|
|
10
|
+
if (typeof callback === 'function') {
|
|
11
|
+
options = options || {};
|
|
12
|
+
return FileEntry.prototype.create.call(this, dest, options, (err)=>{
|
|
13
|
+
callback(err);
|
|
14
|
+
if (this.lock) {
|
|
15
|
+
this.lock.release();
|
|
16
|
+
this.lock = null;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return new Promise((resolve, reject)=>{
|
|
21
|
+
this.create(dest, options, (err, done)=>{
|
|
22
|
+
err ? reject(err) : resolve(done);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
_writeFile(fullPath, _options, callback) {
|
|
27
|
+
if (!this.entry || !this.parser) {
|
|
28
|
+
callback(new Error('7z FileEntry missing entry. Check for calling create multiple times'));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
var stream = this.parser.getEntryStream(this.entry);
|
|
33
|
+
var res = stream.pipe(fs.createWriteStream(fullPath));
|
|
34
|
+
oo(res, [
|
|
35
|
+
'error',
|
|
36
|
+
'end',
|
|
37
|
+
'close',
|
|
38
|
+
'finish'
|
|
39
|
+
], (err)=>{
|
|
40
|
+
err ? callback(err) : waitForAccess(fullPath, callback);
|
|
41
|
+
});
|
|
42
|
+
} catch (err) {
|
|
43
|
+
callback(err);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
destroy() {
|
|
47
|
+
FileEntry.prototype.destroy.call(this);
|
|
48
|
+
this.entry = null;
|
|
49
|
+
this.parser = null;
|
|
50
|
+
if (this.lock) {
|
|
51
|
+
this.lock.release();
|
|
52
|
+
this.lock = null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
constructor(attributes, entry, parser, lock){
|
|
56
|
+
super(attributes);
|
|
57
|
+
this.entry = entry;
|
|
58
|
+
this.parser = parser;
|
|
59
|
+
this.lock = lock;
|
|
60
|
+
this.lock.retain();
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
export { SevenZipFileEntry as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/FileEntry.ts"],"sourcesContent":["import { type FileAttributes, FileEntry, type NoParamCallback, waitForAccess } from 'extract-base-iterator';\nimport fs from 'fs';\nimport oo from 'on-one';\nimport type { SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.ts';\nimport type { ExtractOptions, LockT } from './types.ts';\n\nexport default class SevenZipFileEntry extends FileEntry {\n private lock: LockT;\n private entry: SevenZipEntry;\n private parser: SevenZipParser;\n\n constructor(attributes: FileAttributes, entry: SevenZipEntry, parser: SevenZipParser, lock: LockT) {\n super(attributes);\n this.entry = entry;\n this.parser = parser;\n this.lock = lock;\n this.lock.retain();\n }\n\n create(dest: string, options: ExtractOptions | NoParamCallback, callback: NoParamCallback): undefined | Promise<boolean> {\n if (typeof options === 'function') {\n callback = options;\n options = null;\n }\n\n if (typeof callback === 'function') {\n options = options || {};\n return FileEntry.prototype.create.call(this, dest, options, (err?: Error) => {\n callback(err);\n if (this.lock) {\n this.lock.release();\n this.lock = null;\n }\n });\n }\n return new Promise((resolve, reject) => {\n this.create(dest, options, (err?: Error, done?: boolean) => {\n err ? reject(err) : resolve(done);\n });\n });\n }\n\n _writeFile(fullPath: string, _options: ExtractOptions, callback: NoParamCallback): undefined {\n if (!this.entry || !this.parser) {\n callback(new Error('7z FileEntry missing entry. Check for calling create multiple times'));\n return;\n }\n\n try {\n var stream = this.parser.getEntryStream(this.entry);\n var res = stream.pipe(fs.createWriteStream(fullPath));\n oo(res, ['error', 'end', 'close', 'finish'], (err?: Error) => {\n err ? callback(err) : waitForAccess(fullPath, callback);\n });\n } catch (err) {\n callback(err);\n }\n }\n\n destroy() {\n FileEntry.prototype.destroy.call(this);\n this.entry = null;\n this.parser = null;\n if (this.lock) {\n this.lock.release();\n this.lock = null;\n }\n }\n}\n"],"names":["FileEntry","waitForAccess","fs","oo","SevenZipFileEntry","create","dest","options","callback","prototype","call","err","lock","release","Promise","resolve","reject","done","_writeFile","fullPath","_options","entry","parser","Error","stream","getEntryStream","res","pipe","createWriteStream","destroy","attributes","retain"],"mappings":"AAAA,SAA8BA,SAAS,EAAwBC,aAAa,QAAQ,wBAAwB;AAC5G,OAAOC,QAAQ,KAAK;AACpB,OAAOC,QAAQ,SAAS;AAIT,IAAA,AAAMC,oBAAN,MAAMA,0BAA0BJ;IAa7CK,OAAOC,IAAY,EAAEC,OAAyC,EAAEC,QAAyB,EAAgC;QACvH,IAAI,OAAOD,YAAY,YAAY;YACjCC,WAAWD;YACXA,UAAU;QACZ;QAEA,IAAI,OAAOC,aAAa,YAAY;YAClCD,UAAUA,WAAW,CAAC;YACtB,OAAOP,UAAUS,SAAS,CAACJ,MAAM,CAACK,IAAI,CAAC,IAAI,EAAEJ,MAAMC,SAAS,CAACI;gBAC3DH,SAASG;gBACT,IAAI,IAAI,CAACC,IAAI,EAAE;oBACb,IAAI,CAACA,IAAI,CAACC,OAAO;oBACjB,IAAI,CAACD,IAAI,GAAG;gBACd;YACF;QACF;QACA,OAAO,IAAIE,QAAQ,CAACC,SAASC;YAC3B,IAAI,CAACX,MAAM,CAACC,MAAMC,SAAS,CAACI,KAAaM;gBACvCN,MAAMK,OAAOL,OAAOI,QAAQE;YAC9B;QACF;IACF;IAEAC,WAAWC,QAAgB,EAAEC,QAAwB,EAAEZ,QAAyB,EAAa;QAC3F,IAAI,CAAC,IAAI,CAACa,KAAK,IAAI,CAAC,IAAI,CAACC,MAAM,EAAE;YAC/Bd,SAAS,IAAIe,MAAM;YACnB;QACF;QAEA,IAAI;YACF,IAAIC,SAAS,IAAI,CAACF,MAAM,CAACG,cAAc,CAAC,IAAI,CAACJ,KAAK;YAClD,IAAIK,MAAMF,OAAOG,IAAI,CAACzB,GAAG0B,iBAAiB,CAACT;YAC3ChB,GAAGuB,KAAK;gBAAC;gBAAS;gBAAO;gBAAS;aAAS,EAAE,CAACf;gBAC5CA,MAAMH,SAASG,OAAOV,cAAckB,UAAUX;YAChD;QACF,EAAE,OAAOG,KAAK;YACZH,SAASG;QACX;IACF;IAEAkB,UAAU;QACR7B,UAAUS,SAAS,CAACoB,OAAO,CAACnB,IAAI,CAAC,IAAI;QACrC,IAAI,CAACW,KAAK,GAAG;QACb,IAAI,CAACC,MAAM,GAAG;QACd,IAAI,IAAI,CAACV,IAAI,EAAE;YACb,IAAI,CAACA,IAAI,CAACC,OAAO;YACjB,IAAI,CAACD,IAAI,GAAG;QACd;IACF;IAxDA,YAAYkB,UAA0B,EAAET,KAAoB,EAAEC,MAAsB,EAAEV,IAAW,CAAE;QACjG,KAAK,CAACkB;QACN,IAAI,CAACT,KAAK,GAAGA;QACb,IAAI,CAACC,MAAM,GAAGA;QACd,IAAI,CAACV,IAAI,GAAGA;QACZ,IAAI,CAACA,IAAI,CAACmB,MAAM;IAClB;AAmDF;AA9DA,SAAqB3B,+BA8DpB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import BaseIterator from 'extract-base-iterator';
|
|
2
|
+
import type { ExtractOptions, LockT, SevenZipFileIterator } from './types.js';
|
|
3
|
+
export default class SevenZipIterator extends BaseIterator {
|
|
4
|
+
lock: LockT;
|
|
5
|
+
iterator: SevenZipFileIterator;
|
|
6
|
+
constructor(source: string | NodeJS.ReadableStream, options?: ExtractOptions);
|
|
7
|
+
end(err?: Error): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import BaseIterator from 'extract-base-iterator';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import osShim from 'os-shim';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import Queue from 'queue-cb';
|
|
7
|
+
import shortHash from 'short-hash';
|
|
8
|
+
import tempSuffix from 'temp-suffix';
|
|
9
|
+
import Lock from './lib/Lock.js';
|
|
10
|
+
import streamToSource from './lib/streamToSource.js';
|
|
11
|
+
import nextEntry from './nextEntry.js';
|
|
12
|
+
import { setPassword } from './sevenz/codecs/index.js';
|
|
13
|
+
import { FileSource, SevenZipParser } from './sevenz/SevenZipParser.js';
|
|
14
|
+
var tmpdir = os.tmpdir || osShim.tmpdir;
|
|
15
|
+
/**
|
|
16
|
+
* Iterator wrapper around SevenZipParser entries
|
|
17
|
+
*/ let EntryIterator = class EntryIterator {
|
|
18
|
+
next() {
|
|
19
|
+
if (this.index >= this.entries.length) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
return this.entries[this.index++];
|
|
23
|
+
}
|
|
24
|
+
getParser() {
|
|
25
|
+
return this.parser;
|
|
26
|
+
}
|
|
27
|
+
constructor(parser){
|
|
28
|
+
this.index = 0;
|
|
29
|
+
this.parser = parser;
|
|
30
|
+
this.entries = parser.getEntries();
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
let SevenZipIterator = class SevenZipIterator extends BaseIterator {
|
|
34
|
+
end(err) {
|
|
35
|
+
if (this.lock) {
|
|
36
|
+
this.lock.err = err;
|
|
37
|
+
this.lock.release();
|
|
38
|
+
this.lock = null;
|
|
39
|
+
} else {
|
|
40
|
+
BaseIterator.prototype.end.call(this, err); // call in lock release so end is properly handled
|
|
41
|
+
}
|
|
42
|
+
this.iterator = null;
|
|
43
|
+
}
|
|
44
|
+
constructor(source, options = {}){
|
|
45
|
+
super(options);
|
|
46
|
+
this.lock = new Lock();
|
|
47
|
+
this.lock.iterator = this;
|
|
48
|
+
var queue = new Queue(1);
|
|
49
|
+
var cancelled = false;
|
|
50
|
+
var archiveSource = null;
|
|
51
|
+
var setup = ()=>{
|
|
52
|
+
cancelled = true;
|
|
53
|
+
return undefined;
|
|
54
|
+
};
|
|
55
|
+
this.processing.push(setup);
|
|
56
|
+
// Set password (or clear if not provided)
|
|
57
|
+
setPassword(options.password || null);
|
|
58
|
+
if (typeof source === 'string') {
|
|
59
|
+
// File path input - use FileSource directly
|
|
60
|
+
queue.defer((cb)=>{
|
|
61
|
+
fs.stat(source, (statErr, stats)=>{
|
|
62
|
+
if (this.done || cancelled) return;
|
|
63
|
+
if (statErr) return cb(statErr);
|
|
64
|
+
fs.open(source, 'r', (err, fd)=>{
|
|
65
|
+
if (this.done || cancelled) return;
|
|
66
|
+
if (err) return cb(err);
|
|
67
|
+
archiveSource = new FileSource(fd, stats.size);
|
|
68
|
+
this.lock.fd = fd;
|
|
69
|
+
cb();
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
} else {
|
|
74
|
+
// Stream input - use hybrid memory/temp-file approach
|
|
75
|
+
var tempPath = path.join(tmpdir(), '7z-iterator', shortHash(process.cwd()), tempSuffix('tmp.7z'));
|
|
76
|
+
queue.defer((cb)=>{
|
|
77
|
+
streamToSource(source, {
|
|
78
|
+
memoryThreshold: options.memoryThreshold,
|
|
79
|
+
tempPath: tempPath
|
|
80
|
+
}, (err, result)=>{
|
|
81
|
+
if (this.done || cancelled) return;
|
|
82
|
+
if (err) return cb(err);
|
|
83
|
+
if (!result) return cb(new Error('No result from streamToSource'));
|
|
84
|
+
archiveSource = result.source;
|
|
85
|
+
if (result.fd !== undefined) {
|
|
86
|
+
this.lock.fd = result.fd;
|
|
87
|
+
}
|
|
88
|
+
if (result.tempPath) {
|
|
89
|
+
this.lock.tempPath = result.tempPath;
|
|
90
|
+
}
|
|
91
|
+
cb();
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// Parse and build iterator
|
|
96
|
+
queue.defer((cb)=>{
|
|
97
|
+
if (this.done || cancelled) return;
|
|
98
|
+
if (!archiveSource) return cb(new Error('No archive source'));
|
|
99
|
+
try {
|
|
100
|
+
var parser = new SevenZipParser(archiveSource);
|
|
101
|
+
parser.parse();
|
|
102
|
+
this.iterator = new EntryIterator(parser);
|
|
103
|
+
cb();
|
|
104
|
+
} catch (parseErr) {
|
|
105
|
+
cb(parseErr);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
// start processing
|
|
109
|
+
queue.await((err)=>{
|
|
110
|
+
this.processing.remove(setup);
|
|
111
|
+
if (this.done || cancelled) return;
|
|
112
|
+
err ? this.end(err) : this.push(nextEntry);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
export { SevenZipIterator as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/SevenZipIterator.ts"],"sourcesContent":["import BaseIterator from 'extract-base-iterator';\nimport fs from 'fs';\nimport os from 'os';\nimport osShim from 'os-shim';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport shortHash from 'short-hash';\nimport tempSuffix from 'temp-suffix';\nimport Lock from './lib/Lock.ts';\nimport streamToSource, { type SourceResult } from './lib/streamToSource.ts';\nimport nextEntry from './nextEntry.ts';\nimport { setPassword } from './sevenz/codecs/index.ts';\nimport { type ArchiveSource, FileSource, type SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.ts';\n\nvar tmpdir = os.tmpdir || osShim.tmpdir;\n\nimport type { ExtractOptions, LockT, SevenZipFileIterator } from './types.ts';\n\n/**\n * Iterator wrapper around SevenZipParser entries\n */\nclass EntryIterator implements SevenZipFileIterator {\n private parser: SevenZipParser;\n private entries: SevenZipEntry[];\n private index = 0;\n\n constructor(parser: SevenZipParser) {\n this.parser = parser;\n this.entries = parser.getEntries();\n }\n\n next(): SevenZipEntry | null {\n if (this.index >= this.entries.length) {\n return null;\n }\n return this.entries[this.index++];\n }\n\n getParser(): SevenZipParser {\n return this.parser;\n }\n}\n\nexport default class SevenZipIterator extends BaseIterator {\n lock: LockT;\n iterator: SevenZipFileIterator;\n\n constructor(source: string | NodeJS.ReadableStream, options: ExtractOptions = {}) {\n super(options);\n this.lock = new Lock();\n this.lock.iterator = this;\n var queue = new Queue(1);\n var cancelled = false;\n var archiveSource: ArchiveSource | null = null;\n var setup = (): undefined => {\n cancelled = true;\n return undefined;\n };\n this.processing.push(setup);\n\n // Set password (or clear if not provided)\n setPassword(options.password || null);\n\n if (typeof source === 'string') {\n // File path input - use FileSource directly\n queue.defer((cb: (err?: Error) => void) => {\n fs.stat(source, (statErr, stats) => {\n if (this.done || cancelled) return;\n if (statErr) return cb(statErr);\n\n fs.open(source, 'r', (err, fd) => {\n if (this.done || cancelled) return;\n if (err) return cb(err);\n\n archiveSource = new FileSource(fd, stats.size);\n this.lock.fd = fd;\n cb();\n });\n });\n });\n } else {\n // Stream input - use hybrid memory/temp-file approach\n var tempPath = path.join(tmpdir(), '7z-iterator', shortHash(process.cwd()), tempSuffix('tmp.7z'));\n queue.defer((cb: (err?: Error) => void) => {\n streamToSource(\n source,\n {\n memoryThreshold: options.memoryThreshold,\n tempPath: tempPath,\n },\n (err?: Error, result?: SourceResult) => {\n if (this.done || cancelled) return;\n if (err) return cb(err);\n if (!result) return cb(new Error('No result from streamToSource'));\n\n archiveSource = result.source;\n if (result.fd !== undefined) {\n this.lock.fd = result.fd;\n }\n if (result.tempPath) {\n this.lock.tempPath = result.tempPath;\n }\n cb();\n }\n );\n });\n }\n\n // Parse and build iterator\n queue.defer((cb: (err?: Error) => void) => {\n if (this.done || cancelled) return;\n if (!archiveSource) return cb(new Error('No archive source'));\n\n try {\n var parser = new SevenZipParser(archiveSource);\n parser.parse();\n this.iterator = new EntryIterator(parser);\n cb();\n } catch (parseErr) {\n cb(parseErr as Error);\n }\n });\n\n // start processing\n queue.await((err?: Error) => {\n this.processing.remove(setup);\n if (this.done || cancelled) return;\n err ? this.end(err) : this.push(nextEntry);\n });\n }\n\n end(err?: Error) {\n if (this.lock) {\n this.lock.err = err;\n this.lock.release();\n this.lock = null;\n } else {\n BaseIterator.prototype.end.call(this, err); // call in lock release so end is properly handled\n }\n this.iterator = null;\n }\n}\n"],"names":["BaseIterator","fs","os","osShim","path","Queue","shortHash","tempSuffix","Lock","streamToSource","nextEntry","setPassword","FileSource","SevenZipParser","tmpdir","EntryIterator","next","index","entries","length","getParser","parser","getEntries","SevenZipIterator","end","err","lock","release","prototype","call","iterator","source","options","queue","cancelled","archiveSource","setup","undefined","processing","push","password","defer","cb","stat","statErr","stats","done","open","fd","size","tempPath","join","process","cwd","memoryThreshold","result","Error","parse","parseErr","await","remove"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/index.ts"],"sourcesContent":["export { default } from './SevenZipIterator.ts';\nexport type { ArchiveSource, SevenZipEntry } from './sevenz/index.ts';\nexport { SevenZipParser } from './sevenz/index.ts';\nexport * from './types.ts';\n"],"names":["default","SevenZipParser"],"mappings":"AAAA,SAASA,OAAO,QAAQ,wBAAwB;AAEhD,SAASC,cAAc,QAAQ,oBAAoB;AACnD,cAAc,aAAa"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import BaseIterator from 'extract-base-iterator';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import rimraf2 from 'rimraf2';
|
|
4
|
+
let Lock = class Lock {
|
|
5
|
+
retain() {
|
|
6
|
+
this.count++;
|
|
7
|
+
}
|
|
8
|
+
release() {
|
|
9
|
+
if (this.count <= 0) throw new Error('Lock count is corrupted');
|
|
10
|
+
this.count--;
|
|
11
|
+
if (this.count === 0) this.__destroy();
|
|
12
|
+
}
|
|
13
|
+
__destroy() {
|
|
14
|
+
if (this.tempPath) {
|
|
15
|
+
try {
|
|
16
|
+
rimraf2.sync(this.tempPath, {
|
|
17
|
+
disableGlob: true
|
|
18
|
+
});
|
|
19
|
+
} catch (_err) {
|
|
20
|
+
/* empty */ }
|
|
21
|
+
this.tempPath = null;
|
|
22
|
+
}
|
|
23
|
+
if (this.fd) {
|
|
24
|
+
fs.closeSync(this.fd);
|
|
25
|
+
this.fd = null;
|
|
26
|
+
}
|
|
27
|
+
if (this.iterator) {
|
|
28
|
+
BaseIterator.prototype.end.call(this.iterator, this.err || null);
|
|
29
|
+
this.iterator = null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
constructor(){
|
|
33
|
+
this.count = 1;
|
|
34
|
+
// members
|
|
35
|
+
this.tempPath = null;
|
|
36
|
+
this.fd = null;
|
|
37
|
+
this.iterator = null;
|
|
38
|
+
this.err = null;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
export { Lock as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/lib/Lock.ts"],"sourcesContent":["import BaseIterator from 'extract-base-iterator';\nimport fs from 'fs';\nimport rimraf2 from 'rimraf2';\n\nexport default class Lock {\n private count = 1;\n\n // members\n tempPath: string = null;\n fd: number = null;\n iterator: BaseIterator = null;\n err: Error = null;\n\n retain() {\n this.count++;\n }\n\n release() {\n if (this.count <= 0) throw new Error('Lock count is corrupted');\n this.count--;\n if (this.count === 0) this.__destroy();\n }\n\n private __destroy() {\n if (this.tempPath) {\n try {\n rimraf2.sync(this.tempPath, { disableGlob: true });\n } catch (_err) {\n /* empty */\n }\n this.tempPath = null;\n }\n\n if (this.fd) {\n fs.closeSync(this.fd);\n this.fd = null;\n }\n\n if (this.iterator) {\n BaseIterator.prototype.end.call(this.iterator, this.err || null);\n this.iterator = null;\n }\n }\n}\n"],"names":["BaseIterator","fs","rimraf2","Lock","retain","count","release","Error","__destroy","tempPath","sync","disableGlob","_err","fd","closeSync","iterator","prototype","end","call","err"],"mappings":"AAAA,OAAOA,kBAAkB,wBAAwB;AACjD,OAAOC,QAAQ,KAAK;AACpB,OAAOC,aAAa,UAAU;AAEf,IAAA,AAAMC,OAAN,MAAMA;IASnBC,SAAS;QACP,IAAI,CAACC,KAAK;IACZ;IAEAC,UAAU;QACR,IAAI,IAAI,CAACD,KAAK,IAAI,GAAG,MAAM,IAAIE,MAAM;QACrC,IAAI,CAACF,KAAK;QACV,IAAI,IAAI,CAACA,KAAK,KAAK,GAAG,IAAI,CAACG,SAAS;IACtC;IAEQA,YAAY;QAClB,IAAI,IAAI,CAACC,QAAQ,EAAE;YACjB,IAAI;gBACFP,QAAQQ,IAAI,CAAC,IAAI,CAACD,QAAQ,EAAE;oBAAEE,aAAa;gBAAK;YAClD,EAAE,OAAOC,MAAM;YACb,SAAS,GACX;YACA,IAAI,CAACH,QAAQ,GAAG;QAClB;QAEA,IAAI,IAAI,CAACI,EAAE,EAAE;YACXZ,GAAGa,SAAS,CAAC,IAAI,CAACD,EAAE;YACpB,IAAI,CAACA,EAAE,GAAG;QACZ;QAEA,IAAI,IAAI,CAACE,QAAQ,EAAE;YACjBf,aAAagB,SAAS,CAACC,GAAG,CAACC,IAAI,CAAC,IAAI,CAACH,QAAQ,EAAE,IAAI,CAACI,GAAG,IAAI;YAC3D,IAAI,CAACJ,QAAQ,GAAG;QAClB;IACF;;aArCQV,QAAQ;QAEhB,UAAU;aACVI,WAAmB;aACnBI,KAAa;aACbE,WAAyB;aACzBI,MAAa;;AAgCf;AAvCA,SAAqBhB,kBAuCpB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BufferSource, FileSource } from '../sevenz/SevenZipParser.js';
|
|
2
|
+
export interface StreamToSourceOptions {
|
|
3
|
+
memoryThreshold?: number;
|
|
4
|
+
tempPath?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface SourceResult {
|
|
7
|
+
source: BufferSource | FileSource;
|
|
8
|
+
fd?: number;
|
|
9
|
+
tempPath?: string;
|
|
10
|
+
}
|
|
11
|
+
export type Callback = (error?: Error, result?: SourceResult) => void;
|
|
12
|
+
/**
|
|
13
|
+
* Convert a stream to an ArchiveSource (BufferSource for small files, FileSource for large)
|
|
14
|
+
*
|
|
15
|
+
* Algorithm:
|
|
16
|
+
* 1. Buffer stream data in memory up to memoryThreshold
|
|
17
|
+
* 2. If threshold exceeded, write all buffered data to temp file and continue streaming
|
|
18
|
+
* 3. When done, return BufferSource for memory buffer or FileSource for temp file
|
|
19
|
+
*/
|
|
20
|
+
export default function streamToSource(stream: NodeJS.ReadableStream, options: StreamToSourceOptions, callback: Callback): void;
|