7z-iterator 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/cjs/SevenZipIterator.js +2 -0
  2. package/dist/cjs/SevenZipIterator.js.map +1 -1
  3. package/dist/cjs/lib/Lock.d.cts +1 -0
  4. package/dist/cjs/lib/Lock.d.ts +1 -0
  5. package/dist/cjs/lib/Lock.js +8 -0
  6. package/dist/cjs/lib/Lock.js.map +1 -1
  7. package/dist/cjs/nextEntry.js +2 -2
  8. package/dist/cjs/nextEntry.js.map +1 -1
  9. package/dist/cjs/sevenz/NumberCodec.d.cts +9 -0
  10. package/dist/cjs/sevenz/NumberCodec.d.ts +9 -0
  11. package/dist/cjs/sevenz/NumberCodec.js +39 -14
  12. package/dist/cjs/sevenz/NumberCodec.js.map +1 -1
  13. package/dist/cjs/sevenz/SevenZipParser.d.cts +13 -0
  14. package/dist/cjs/sevenz/SevenZipParser.d.ts +13 -0
  15. package/dist/cjs/sevenz/SevenZipParser.js +250 -11
  16. package/dist/cjs/sevenz/SevenZipParser.js.map +1 -1
  17. package/dist/cjs/sevenz/codecs/Bcj2.d.cts +16 -0
  18. package/dist/cjs/sevenz/codecs/Bcj2.d.ts +16 -0
  19. package/dist/cjs/sevenz/codecs/Bcj2.js +201 -0
  20. package/dist/cjs/sevenz/codecs/Bcj2.js.map +1 -0
  21. package/dist/cjs/sevenz/codecs/Lzma2.js +54 -10
  22. package/dist/cjs/sevenz/codecs/Lzma2.js.map +1 -1
  23. package/dist/cjs/sevenz/codecs/index.d.cts +6 -0
  24. package/dist/cjs/sevenz/codecs/index.d.ts +6 -0
  25. package/dist/cjs/sevenz/codecs/index.js +17 -0
  26. package/dist/cjs/sevenz/codecs/index.js.map +1 -1
  27. package/dist/cjs/sevenz/constants.d.cts +1 -0
  28. package/dist/cjs/sevenz/constants.d.ts +1 -0
  29. package/dist/cjs/sevenz/constants.js +6 -0
  30. package/dist/cjs/sevenz/constants.js.map +1 -1
  31. package/dist/cjs/types.d.cts +1 -0
  32. package/dist/cjs/types.d.ts +1 -0
  33. package/dist/cjs/types.js.map +1 -1
  34. package/dist/esm/SevenZipIterator.js +2 -0
  35. package/dist/esm/SevenZipIterator.js.map +1 -1
  36. package/dist/esm/lib/Lock.d.ts +1 -0
  37. package/dist/esm/lib/Lock.js +8 -0
  38. package/dist/esm/lib/Lock.js.map +1 -1
  39. package/dist/esm/nextEntry.js +2 -2
  40. package/dist/esm/nextEntry.js.map +1 -1
  41. package/dist/esm/sevenz/NumberCodec.d.ts +9 -0
  42. package/dist/esm/sevenz/NumberCodec.js +48 -14
  43. package/dist/esm/sevenz/NumberCodec.js.map +1 -1
  44. package/dist/esm/sevenz/SevenZipParser.d.ts +13 -0
  45. package/dist/esm/sevenz/SevenZipParser.js +251 -12
  46. package/dist/esm/sevenz/SevenZipParser.js.map +1 -1
  47. package/dist/esm/sevenz/codecs/Bcj2.d.ts +16 -0
  48. package/dist/esm/sevenz/codecs/Bcj2.js +183 -0
  49. package/dist/esm/sevenz/codecs/Bcj2.js.map +1 -0
  50. package/dist/esm/sevenz/codecs/Lzma2.js +54 -10
  51. package/dist/esm/sevenz/codecs/Lzma2.js.map +1 -1
  52. package/dist/esm/sevenz/codecs/index.d.ts +6 -0
  53. package/dist/esm/sevenz/codecs/index.js +15 -0
  54. package/dist/esm/sevenz/codecs/index.js.map +1 -1
  55. package/dist/esm/sevenz/constants.d.ts +1 -0
  56. package/dist/esm/sevenz/constants.js +6 -0
  57. package/dist/esm/sevenz/constants.js.map +1 -1
  58. package/dist/esm/types.d.ts +1 -0
  59. package/dist/esm/types.js.map +1 -1
  60. package/package.json +9 -3
@@ -147,19 +147,66 @@ var SevenZipParser = /*#__PURE__*/ function() {
147
147
  // This tells us how to decompress the actual header
148
148
  // Read pack info from the encoded header structure
149
149
  var packInfoResult = this.parseEncodedHeaderStreams(headerBuf, 1);
150
- // Read the compressed header data
150
+ // Calculate compressed header position
151
+ // For simple archives: header is at SIGNATURE_HEADER_SIZE + packPos
152
+ // For BCJ2/complex archives: header may be at the END of pack data area
153
+ // The pack data area ends at nextHeaderOffset (where encoded header starts)
151
154
  var compressedStart = _constantsts.SIGNATURE_HEADER_SIZE + packInfoResult.packPos;
152
155
  var compressedData = this.source.read(compressedStart, packInfoResult.packSize);
153
156
  // Decompress using the specified codec
154
157
  var codec = (0, _indexts.getCodec)(packInfoResult.codecId);
155
- var decompressedHeader = codec.decode(compressedData, packInfoResult.properties, packInfoResult.unpackSize);
156
- // Verify CRC if present
157
- if (packInfoResult.unpackCRC !== undefined) {
158
- var actualCRC = (0, _extractbaseiterator.crc32)(decompressedHeader);
159
- if (actualCRC !== packInfoResult.unpackCRC) {
160
- throw (0, _constantsts.createCodedError)('Decompressed header CRC mismatch', _constantsts.ErrorCode.CRC_MISMATCH);
158
+ var decompressedHeader = null;
159
+ // Try decompressing from the calculated position first
160
+ try {
161
+ decompressedHeader = codec.decode(compressedData, packInfoResult.properties, packInfoResult.unpackSize);
162
+ // Verify CRC if present
163
+ if (packInfoResult.unpackCRC !== undefined) {
164
+ var actualCRC = (0, _extractbaseiterator.crc32)(decompressedHeader);
165
+ if (actualCRC !== packInfoResult.unpackCRC) {
166
+ decompressedHeader = null; // CRC mismatch, need to search
167
+ }
168
+ }
169
+ } catch (e) {
170
+ decompressedHeader = null; // Decompression failed, need to search
171
+ }
172
+ // If initial decompression failed, search for the correct position as a fallback
173
+ // This handles edge cases where packPos doesn't point directly to header pack data
174
+ if (decompressedHeader === null && this.signature) {
175
+ var packAreaEnd = _constantsts.SIGNATURE_HEADER_SIZE + this.signature.nextHeaderOffset;
176
+ var searchStart = packAreaEnd - packInfoResult.packSize;
177
+ var searchEnd = Math.max(_constantsts.SIGNATURE_HEADER_SIZE, compressedStart - 100000);
178
+ // Scan for LZMA data starting with 0x00 (range coder init)
179
+ // Try each candidate and validate with CRC
180
+ var scanChunkSize = 4096;
181
+ searchLoop: for(var chunkStart = searchStart; chunkStart >= searchEnd; chunkStart -= scanChunkSize){
182
+ var chunk = this.source.read(chunkStart, scanChunkSize + packInfoResult.packSize);
183
+ for(var i = 0; i < Math.min(chunk.length, scanChunkSize); i++){
184
+ if (chunk[i] === 0x00) {
185
+ var candidateData = chunk.subarray(i, i + packInfoResult.packSize);
186
+ if (candidateData.length === packInfoResult.packSize) {
187
+ try {
188
+ var candidateDecompressed = codec.decode(candidateData, packInfoResult.properties, packInfoResult.unpackSize);
189
+ if (packInfoResult.unpackCRC !== undefined) {
190
+ var candCRC = (0, _extractbaseiterator.crc32)(candidateDecompressed);
191
+ if (candCRC === packInfoResult.unpackCRC) {
192
+ decompressedHeader = candidateDecompressed;
193
+ break searchLoop;
194
+ }
195
+ } else {
196
+ decompressedHeader = candidateDecompressed;
197
+ break searchLoop;
198
+ }
199
+ } catch (e) {
200
+ // Decompression failed, continue searching
201
+ }
202
+ }
203
+ }
204
+ }
161
205
  }
162
206
  }
207
+ if (decompressedHeader === null) {
208
+ throw (0, _constantsts.createCodedError)('Failed to decompress header - could not find valid LZMA data', _constantsts.ErrorCode.CORRUPT_HEADER);
209
+ }
163
210
  // Now parse the decompressed header
164
211
  // It should start with kHeader
165
212
  var decompOffset = 0;
@@ -400,6 +447,16 @@ var SevenZipParser = /*#__PURE__*/ function() {
400
447
  return outputStream;
401
448
  };
402
449
  /**
450
+ * Check if a folder uses BCJ2 codec
451
+ */ _proto.folderHasBcj2 = function folderHasBcj2(folder) {
452
+ for(var i = 0; i < folder.coders.length; i++){
453
+ if ((0, _indexts.isBcj2Codec)(folder.coders[i].id)) {
454
+ return true;
455
+ }
456
+ }
457
+ return false;
458
+ };
459
+ /**
403
460
  * Get decompressed data for a folder, with caching for solid archives
404
461
  */ _proto.getDecompressedFolder = function getDecompressedFolder(folderIndex) {
405
462
  // Check cache first
@@ -410,6 +467,12 @@ var SevenZipParser = /*#__PURE__*/ function() {
410
467
  throw (0, _constantsts.createCodedError)('No streams info available', _constantsts.ErrorCode.CORRUPT_HEADER);
411
468
  }
412
469
  var folder = this.streamsInfo.folders[folderIndex];
470
+ // Check if this folder uses BCJ2 (requires special multi-stream handling)
471
+ if (this.folderHasBcj2(folder)) {
472
+ var data = this.decompressBcj2Folder(folderIndex);
473
+ this.decompressedCache[folderIndex] = data;
474
+ return data;
475
+ }
413
476
  // Calculate packed data position
414
477
  var packPos = _constantsts.SIGNATURE_HEADER_SIZE + this.streamsInfo.packPos;
415
478
  // Find which pack stream this folder uses
@@ -425,17 +488,193 @@ var SevenZipParser = /*#__PURE__*/ function() {
425
488
  // Read packed data
426
489
  var packedData = this.source.read(packPos, packSize);
427
490
  // Decompress through codec chain
428
- var data = packedData;
491
+ var data2 = packedData;
429
492
  for(var l = 0; l < folder.coders.length; l++){
430
493
  var coderInfo = folder.coders[l];
431
494
  var codec = (0, _indexts.getCodec)(coderInfo.id);
432
495
  // Get unpack size for this coder (needed by LZMA)
433
496
  var unpackSize = folder.unpackSizes[l];
434
- data = codec.decode(data, coderInfo.properties, unpackSize);
497
+ data2 = codec.decode(data2, coderInfo.properties, unpackSize);
435
498
  }
436
499
  // Cache for solid archives (when multiple files share a folder)
437
- this.decompressedCache[folderIndex] = data;
438
- return data;
500
+ this.decompressedCache[folderIndex] = data2;
501
+ return data2;
502
+ };
503
+ /**
504
+ * Decompress a BCJ2 folder with multi-stream handling
505
+ * BCJ2 uses 4 input streams: main, call, jump, range coder
506
+ */ _proto.decompressBcj2Folder = function decompressBcj2Folder(folderIndex) {
507
+ if (!this.streamsInfo) {
508
+ throw (0, _constantsts.createCodedError)('No streams info available', _constantsts.ErrorCode.CORRUPT_HEADER);
509
+ }
510
+ var folder = this.streamsInfo.folders[folderIndex];
511
+ // Calculate starting pack position
512
+ var packPos = _constantsts.SIGNATURE_HEADER_SIZE + this.streamsInfo.packPos;
513
+ // Find which pack stream index this folder starts at
514
+ var packStreamIndex = 0;
515
+ for(var j = 0; j < folderIndex; j++){
516
+ packStreamIndex += this.streamsInfo.folders[j].packedStreams.length;
517
+ }
518
+ // Calculate position
519
+ for(var k = 0; k < packStreamIndex; k++){
520
+ packPos += this.streamsInfo.packSizes[k];
521
+ }
522
+ // Read all pack streams for this folder
523
+ var numPackStreams = folder.packedStreams.length;
524
+ var packStreams = [];
525
+ var currentPos = packPos;
526
+ for(var p = 0; p < numPackStreams; p++){
527
+ var size = this.streamsInfo.packSizes[packStreamIndex + p];
528
+ packStreams.push(this.source.read(currentPos, size));
529
+ currentPos += size;
530
+ }
531
+ // Build a map of coder outputs
532
+ // For BCJ2, typical structure is:
533
+ // Coder 0: LZMA2 (main stream) - 1 in, 1 out
534
+ // Coder 1: LZMA (call stream) - 1 in, 1 out
535
+ // Coder 2: LZMA (jump stream) - 1 in, 1 out
536
+ // Coder 3: BCJ2 - 4 in, 1 out
537
+ // Pack streams map to: coder inputs not bound to other coder outputs
538
+ // First, decompress each non-BCJ2 coder
539
+ var coderOutputs = {};
540
+ // Find the BCJ2 coder
541
+ var bcj2CoderIndex = -1;
542
+ for(var c = 0; c < folder.coders.length; c++){
543
+ if ((0, _indexts.isBcj2Codec)(folder.coders[c].id)) {
544
+ bcj2CoderIndex = c;
545
+ break;
546
+ }
547
+ }
548
+ if (bcj2CoderIndex === -1) {
549
+ throw (0, _constantsts.createCodedError)('BCJ2 coder not found in folder', _constantsts.ErrorCode.CORRUPT_HEADER);
550
+ }
551
+ // Build input stream index -> pack stream mapping
552
+ // folder.packedStreams tells us which input indices are unbound and their order
553
+ var inputToPackStream = {};
554
+ for(var pi = 0; pi < folder.packedStreams.length; pi++){
555
+ inputToPackStream[folder.packedStreams[pi]] = pi;
556
+ }
557
+ // Build output stream index -> coder mapping
558
+ var outputToCoder = {};
559
+ var totalOutputs = 0;
560
+ for(var co = 0; co < folder.coders.length; co++){
561
+ var numOut = folder.coders[co].numOutStreams;
562
+ for(var outp = 0; outp < numOut; outp++){
563
+ outputToCoder[totalOutputs + outp] = co;
564
+ }
565
+ totalOutputs += numOut;
566
+ }
567
+ // Decompress non-BCJ2 coders (LZMA, LZMA2)
568
+ // We need to process in dependency order
569
+ var processed = {};
570
+ var processOrder = this.getCoderProcessOrder(folder, bcj2CoderIndex);
571
+ for(var po = 0; po < processOrder.length; po++){
572
+ var coderIdx = processOrder[po];
573
+ if (coderIdx === bcj2CoderIndex) continue;
574
+ var coder = folder.coders[coderIdx];
575
+ var codec = (0, _indexts.getCodec)(coder.id);
576
+ // Find input for this coder
577
+ var coderInputStart = 0;
578
+ for(var ci2 = 0; ci2 < coderIdx; ci2++){
579
+ coderInputStart += folder.coders[ci2].numInStreams;
580
+ }
581
+ // Get input data (from pack stream)
582
+ var inputIdx = coderInputStart;
583
+ var packStreamIdx = inputToPackStream[inputIdx];
584
+ var inputData = packStreams[packStreamIdx];
585
+ // Decompress
586
+ var unpackSize = folder.unpackSizes[coderIdx];
587
+ var outputData = codec.decode(inputData, coder.properties, unpackSize);
588
+ // Store in coder outputs
589
+ var coderOutputStart = 0;
590
+ for(var co2 = 0; co2 < coderIdx; co2++){
591
+ coderOutputStart += folder.coders[co2].numOutStreams;
592
+ }
593
+ coderOutputs[coderOutputStart] = outputData;
594
+ processed[coderIdx] = true;
595
+ }
596
+ // Now process BCJ2
597
+ // BCJ2 has 4 inputs, need to map them correctly
598
+ // Standard order: main(LZMA2 output), call(LZMA output), jump(LZMA output), range(raw pack)
599
+ var bcj2InputStart = 0;
600
+ for(var ci3 = 0; ci3 < bcj2CoderIndex; ci3++){
601
+ bcj2InputStart += folder.coders[ci3].numInStreams;
602
+ }
603
+ var bcj2Inputs = [];
604
+ for(var bi = 0; bi < 4; bi++){
605
+ var globalIdx = bcj2InputStart + bi;
606
+ // Check if this input is bound to a coder output
607
+ var boundOutput = -1;
608
+ for(var bp2 = 0; bp2 < folder.bindPairs.length; bp2++){
609
+ if (folder.bindPairs[bp2].inIndex === globalIdx) {
610
+ boundOutput = folder.bindPairs[bp2].outIndex;
611
+ break;
612
+ }
613
+ }
614
+ if (boundOutput >= 0) {
615
+ // Get from coder outputs
616
+ bcj2Inputs.push(coderOutputs[boundOutput]);
617
+ } else {
618
+ // Get from pack streams
619
+ var psIdx = inputToPackStream[globalIdx];
620
+ bcj2Inputs.push(packStreams[psIdx]);
621
+ }
622
+ }
623
+ // Get BCJ2 unpack size
624
+ var bcj2OutputStart = 0;
625
+ for(var co3 = 0; co3 < bcj2CoderIndex; co3++){
626
+ bcj2OutputStart += folder.coders[co3].numOutStreams;
627
+ }
628
+ var bcj2UnpackSize = folder.unpackSizes[bcj2OutputStart];
629
+ // Decode BCJ2
630
+ return (0, _indexts.decodeBcj2Multi)(bcj2Inputs, undefined, bcj2UnpackSize);
631
+ };
632
+ /**
633
+ * Get processing order for coders (dependency order)
634
+ */ _proto.getCoderProcessOrder = function getCoderProcessOrder(folder, excludeIdx) {
635
+ var order = [];
636
+ var processed = {};
637
+ // Simple approach: process coders that don't depend on unprocessed outputs
638
+ var changed = true;
639
+ while(changed){
640
+ changed = false;
641
+ for(var c = 0; c < folder.coders.length; c++){
642
+ if (processed[c] || c === excludeIdx) continue;
643
+ // Check if all inputs are satisfied
644
+ var inputStart = 0;
645
+ for(var i = 0; i < c; i++){
646
+ inputStart += folder.coders[i].numInStreams;
647
+ }
648
+ var canProcess = true;
649
+ for(var inp = 0; inp < folder.coders[c].numInStreams; inp++){
650
+ var globalIdx = inputStart + inp;
651
+ // Check if bound to an unprocessed coder
652
+ for(var bp = 0; bp < folder.bindPairs.length; bp++){
653
+ if (folder.bindPairs[bp].inIndex === globalIdx) {
654
+ // Find which coder produces this output
655
+ var outIdx = folder.bindPairs[bp].outIndex;
656
+ var outStart = 0;
657
+ for(var oc = 0; oc < folder.coders.length; oc++){
658
+ var numOut = folder.coders[oc].numOutStreams;
659
+ if (outIdx < outStart + numOut) {
660
+ if (!processed[oc] && oc !== excludeIdx) {
661
+ canProcess = false;
662
+ }
663
+ break;
664
+ }
665
+ outStart += numOut;
666
+ }
667
+ }
668
+ }
669
+ }
670
+ if (canProcess) {
671
+ order.push(c);
672
+ processed[c] = true;
673
+ changed = true;
674
+ }
675
+ }
676
+ }
677
+ return order;
439
678
  };
440
679
  /**
441
680
  * Close the parser and release resources
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/SevenZipParser.ts"],"sourcesContent":["// SevenZipParser - Main 7z archive parser\n// Handles reading archive structure and providing file streams\n\nimport { allocBuffer, crc32 } from 'extract-base-iterator';\nimport fs from 'fs';\nimport { 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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"}
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 { decodeBcj2Multi, getCodec, getCodecName, isBcj2Codec, 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 // Calculate compressed header position\n // For simple archives: header is at SIGNATURE_HEADER_SIZE + packPos\n // For BCJ2/complex archives: header may be at the END of pack data area\n // The pack data area ends at nextHeaderOffset (where encoded header starts)\n var compressedStart = SIGNATURE_HEADER_SIZE + packInfoResult.packPos;\n var compressedData = this.source.read(compressedStart, packInfoResult.packSize);\n\n // Decompress using the specified codec\n var codec = getCodec(packInfoResult.codecId);\n var decompressedHeader: Buffer | null = null;\n\n // Try decompressing from the calculated position first\n try {\n decompressedHeader = codec.decode(compressedData, packInfoResult.properties, packInfoResult.unpackSize);\n // Verify CRC if present\n if (packInfoResult.unpackCRC !== undefined) {\n var actualCRC = crc32(decompressedHeader);\n if (actualCRC !== packInfoResult.unpackCRC) {\n decompressedHeader = null; // CRC mismatch, need to search\n }\n }\n } catch {\n decompressedHeader = null; // Decompression failed, need to search\n }\n\n // If initial decompression failed, search for the correct position as a fallback\n // This handles edge cases where packPos doesn't point directly to header pack data\n if (decompressedHeader === null && this.signature) {\n var packAreaEnd = SIGNATURE_HEADER_SIZE + this.signature.nextHeaderOffset;\n var searchStart = packAreaEnd - packInfoResult.packSize;\n var searchEnd = Math.max(SIGNATURE_HEADER_SIZE, compressedStart - 100000);\n\n // Scan for LZMA data starting with 0x00 (range coder init)\n // Try each candidate and validate with CRC\n var scanChunkSize = 4096;\n searchLoop: for (var chunkStart = searchStart; chunkStart >= searchEnd; chunkStart -= scanChunkSize) {\n var chunk = this.source.read(chunkStart, scanChunkSize + packInfoResult.packSize);\n for (var i = 0; i < Math.min(chunk.length, scanChunkSize); i++) {\n if (chunk[i] === 0x00) {\n var candidateData = chunk.subarray(i, i + packInfoResult.packSize);\n if (candidateData.length === packInfoResult.packSize) {\n try {\n var candidateDecompressed = codec.decode(candidateData, packInfoResult.properties, packInfoResult.unpackSize);\n if (packInfoResult.unpackCRC !== undefined) {\n var candCRC = crc32(candidateDecompressed);\n if (candCRC === packInfoResult.unpackCRC) {\n decompressedHeader = candidateDecompressed;\n break searchLoop;\n }\n } else {\n decompressedHeader = candidateDecompressed;\n break searchLoop;\n }\n } catch {\n // Decompression failed, continue searching\n }\n }\n }\n }\n }\n }\n\n if (decompressedHeader === null) {\n throw createCodedError('Failed to decompress header - could not find valid LZMA data', ErrorCode.CORRUPT_HEADER);\n }\n\n // Now parse the decompressed header\n // It should start with kHeader\n var decompOffset = 0;\n var headerId = decompressedHeader[decompOffset++];\n if (headerId !== PropertyId.kHeader) {\n throw createCodedError('Expected kHeader in decompressed header', ErrorCode.CORRUPT_HEADER);\n }\n\n // Parse the decompressed header using shared function from headers.ts\n var result = parseHeaderContent(decompressedHeader, decompOffset);\n this.streamsInfo = result.streamsInfo || null;\n this.filesInfo = result.filesInfo;\n }\n\n /**\n * Parse streams info from encoded header block\n * This is a simplified parser for the header's own compression info\n */\n private parseEncodedHeaderStreams(\n buf: Buffer,\n offset: number\n ): {\n packPos: number;\n packSize: number;\n unpackSize: number;\n codecId: number[];\n properties?: Buffer;\n unpackCRC?: number;\n } {\n // This is a simplified parser for the encoded header's own streams info\n var packPos = 0;\n var packSize = 0;\n var unpackSize = 0;\n var codecId: number[] = [];\n var properties: Buffer | undefined;\n var unpackCRC: number | undefined;\n\n while (offset < buf.length) {\n var propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n switch (propertyId) {\n case PropertyId.kPackInfo: {\n var packPosResult = readNumber(buf, offset);\n packPos = packPosResult.value;\n offset += packPosResult.bytesRead;\n\n var numPackResult = readNumber(buf, offset);\n offset += numPackResult.bytesRead;\n\n // Read until kEnd\n while (buf[offset] !== PropertyId.kEnd) {\n if (buf[offset] === PropertyId.kSize) {\n offset++;\n var sizeResult = readNumber(buf, offset);\n packSize = sizeResult.value;\n offset += sizeResult.bytesRead;\n } else {\n offset++;\n }\n }\n offset++; // Skip kEnd\n break;\n }\n\n case PropertyId.kUnpackInfo:\n // Find folder/coder info\n while (offset < buf.length && buf[offset] !== PropertyId.kEnd) {\n if (buf[offset] === PropertyId.kFolder) {\n offset++;\n var numFoldersResult = readNumber(buf, offset);\n offset += numFoldersResult.bytesRead;\n offset++; // external flag\n\n // Parse coder\n var numCodersResult = readNumber(buf, offset);\n offset += numCodersResult.bytesRead;\n\n var flags = buf[offset++];\n var idSize = flags & 0x0f;\n var hasAttributes = (flags & 0x20) !== 0;\n\n codecId = [];\n for (var i = 0; i < idSize; i++) {\n codecId.push(buf[offset++]);\n }\n\n if (hasAttributes) {\n var propsLenResult = readNumber(buf, offset);\n offset += propsLenResult.bytesRead;\n properties = buf.slice(offset, offset + propsLenResult.value);\n offset += propsLenResult.value;\n }\n } else if (buf[offset] === PropertyId.kCodersUnpackSize) {\n offset++;\n // Read unpack size - needed for LZMA decoder\n var unpackSizeResult = readNumber(buf, offset);\n unpackSize = unpackSizeResult.value;\n offset += unpackSizeResult.bytesRead;\n } else if (buf[offset] === PropertyId.kCRC) {\n offset++;\n var allDefined = buf[offset++];\n if (allDefined) {\n unpackCRC = buf.readUInt32LE(offset);\n offset += 4;\n }\n } else {\n offset++;\n }\n }\n if (buf[offset] === PropertyId.kEnd) offset++;\n break;\n }\n }\n\n return { packPos: packPos, packSize: packSize, unpackSize: unpackSize, codecId: codecId, properties: properties, unpackCRC: unpackCRC };\n }\n\n /**\n * Build the entries list from parsed file info\n */\n private buildEntries(): void {\n this.entries = [];\n\n if (!this.streamsInfo) {\n // No streams info - just create entries from file info\n for (var i = 0; i < this.filesInfo.length; i++) {\n var file = this.filesInfo[i];\n this.entries.push(this.createEntry(file, 0, 0, 0));\n }\n return;\n }\n\n // Use the properly parsed numUnpackStreamsPerFolder from the archive header\n var streamsPerFolder = this.streamsInfo.numUnpackStreamsPerFolder;\n\n // 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 * Check if a folder uses BCJ2 codec\n */\n private folderHasBcj2(folder: { coders: { id: number[] }[] }): boolean {\n for (var i = 0; i < folder.coders.length; i++) {\n if (isBcj2Codec(folder.coders[i].id)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Get decompressed data for a folder, with 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 // Check if this folder uses BCJ2 (requires special multi-stream handling)\n if (this.folderHasBcj2(folder)) {\n var data = this.decompressBcj2Folder(folderIndex);\n this.decompressedCache[folderIndex] = data;\n return data;\n }\n\n // Calculate packed data position\n var packPos = SIGNATURE_HEADER_SIZE + this.streamsInfo.packPos;\n\n // Find which pack stream this folder uses\n var packStreamIndex = 0;\n for (var j = 0; j < folderIndex; j++) {\n packStreamIndex += this.streamsInfo.folders[j].packedStreams.length;\n }\n\n // Calculate position of this pack stream\n for (var k = 0; k < packStreamIndex; k++) {\n packPos += this.streamsInfo.packSizes[k];\n }\n\n var packSize = this.streamsInfo.packSizes[packStreamIndex];\n\n // Read packed data\n var packedData = this.source.read(packPos, packSize);\n\n // Decompress through codec chain\n var data2 = packedData;\n for (var l = 0; l < folder.coders.length; l++) {\n var coderInfo = folder.coders[l];\n var codec = getCodec(coderInfo.id);\n // Get unpack size for this coder (needed by LZMA)\n var unpackSize = folder.unpackSizes[l];\n data2 = codec.decode(data2, coderInfo.properties, unpackSize);\n }\n\n // Cache for solid archives (when multiple files share a folder)\n this.decompressedCache[folderIndex] = data2;\n\n return data2;\n }\n\n /**\n * Decompress a BCJ2 folder with multi-stream handling\n * BCJ2 uses 4 input streams: main, call, jump, range coder\n */\n private decompressBcj2Folder(folderIndex: number): Buffer {\n if (!this.streamsInfo) {\n throw createCodedError('No streams info available', ErrorCode.CORRUPT_HEADER);\n }\n\n var folder = this.streamsInfo.folders[folderIndex];\n\n // Calculate starting pack position\n var packPos = SIGNATURE_HEADER_SIZE + this.streamsInfo.packPos;\n\n // Find which pack stream index this folder starts at\n var packStreamIndex = 0;\n for (var j = 0; j < folderIndex; j++) {\n packStreamIndex += this.streamsInfo.folders[j].packedStreams.length;\n }\n\n // Calculate position\n for (var k = 0; k < packStreamIndex; k++) {\n packPos += this.streamsInfo.packSizes[k];\n }\n\n // Read all pack streams for this folder\n var numPackStreams = folder.packedStreams.length;\n var packStreams: Buffer[] = [];\n var currentPos = packPos;\n\n for (var p = 0; p < numPackStreams; p++) {\n var size = this.streamsInfo.packSizes[packStreamIndex + p];\n packStreams.push(this.source.read(currentPos, size));\n currentPos += size;\n }\n\n // Build a map of coder outputs\n // For BCJ2, typical structure is:\n // Coder 0: LZMA2 (main stream) - 1 in, 1 out\n // Coder 1: LZMA (call stream) - 1 in, 1 out\n // Coder 2: LZMA (jump stream) - 1 in, 1 out\n // Coder 3: BCJ2 - 4 in, 1 out\n // Pack streams map to: coder inputs not bound to other coder outputs\n\n // First, decompress each non-BCJ2 coder\n var coderOutputs: { [key: number]: Buffer } = {};\n\n // Find the BCJ2 coder\n var bcj2CoderIndex = -1;\n for (var c = 0; c < folder.coders.length; c++) {\n if (isBcj2Codec(folder.coders[c].id)) {\n bcj2CoderIndex = c;\n break;\n }\n }\n\n if (bcj2CoderIndex === -1) {\n throw createCodedError('BCJ2 coder not found in folder', ErrorCode.CORRUPT_HEADER);\n }\n\n // Build input stream index -> pack stream mapping\n // folder.packedStreams tells us which input indices are unbound and their order\n var inputToPackStream: { [key: number]: number } = {};\n for (var pi = 0; pi < folder.packedStreams.length; pi++) {\n inputToPackStream[folder.packedStreams[pi]] = pi;\n }\n\n // Build output stream index -> coder mapping\n var outputToCoder: { [key: number]: number } = {};\n var totalOutputs = 0;\n for (var co = 0; co < folder.coders.length; co++) {\n var numOut = folder.coders[co].numOutStreams;\n for (var outp = 0; outp < numOut; outp++) {\n outputToCoder[totalOutputs + outp] = co;\n }\n totalOutputs += numOut;\n }\n\n // Decompress non-BCJ2 coders (LZMA, LZMA2)\n // We need to process in dependency order\n var processed: { [key: number]: boolean } = {};\n\n var processOrder = this.getCoderProcessOrder(folder, bcj2CoderIndex);\n\n for (var po = 0; po < processOrder.length; po++) {\n var coderIdx = processOrder[po];\n if (coderIdx === bcj2CoderIndex) continue;\n\n var coder = folder.coders[coderIdx];\n var codec = getCodec(coder.id);\n\n // Find input for this coder\n var coderInputStart = 0;\n for (var ci2 = 0; ci2 < coderIdx; ci2++) {\n coderInputStart += folder.coders[ci2].numInStreams;\n }\n\n // Get input data (from pack stream)\n var inputIdx = coderInputStart;\n var packStreamIdx = inputToPackStream[inputIdx];\n var inputData = packStreams[packStreamIdx];\n\n // Decompress\n var unpackSize = folder.unpackSizes[coderIdx];\n var outputData = codec.decode(inputData, coder.properties, unpackSize);\n\n // Store in coder outputs\n var coderOutputStart = 0;\n for (var co2 = 0; co2 < coderIdx; co2++) {\n coderOutputStart += folder.coders[co2].numOutStreams;\n }\n coderOutputs[coderOutputStart] = outputData;\n processed[coderIdx] = true;\n }\n\n // Now process BCJ2\n // BCJ2 has 4 inputs, need to map them correctly\n // Standard order: main(LZMA2 output), call(LZMA output), jump(LZMA output), range(raw pack)\n var bcj2InputStart = 0;\n for (var ci3 = 0; ci3 < bcj2CoderIndex; ci3++) {\n bcj2InputStart += folder.coders[ci3].numInStreams;\n }\n\n var bcj2Inputs: Buffer[] = [];\n for (var bi = 0; bi < 4; bi++) {\n var globalIdx = bcj2InputStart + bi;\n\n // Check if this input is bound to a coder output\n var boundOutput = -1;\n for (var bp2 = 0; bp2 < folder.bindPairs.length; bp2++) {\n if (folder.bindPairs[bp2].inIndex === globalIdx) {\n boundOutput = folder.bindPairs[bp2].outIndex;\n break;\n }\n }\n\n if (boundOutput >= 0) {\n // Get from coder outputs\n bcj2Inputs.push(coderOutputs[boundOutput]);\n } else {\n // Get from pack streams\n var psIdx = inputToPackStream[globalIdx];\n bcj2Inputs.push(packStreams[psIdx]);\n }\n }\n\n // Get BCJ2 unpack size\n var bcj2OutputStart = 0;\n for (var co3 = 0; co3 < bcj2CoderIndex; co3++) {\n bcj2OutputStart += folder.coders[co3].numOutStreams;\n }\n var bcj2UnpackSize = folder.unpackSizes[bcj2OutputStart];\n\n // Decode BCJ2\n return decodeBcj2Multi(bcj2Inputs, undefined, bcj2UnpackSize);\n }\n\n /**\n * Get processing order for coders (dependency order)\n */\n private getCoderProcessOrder(folder: { coders: { numInStreams: number; numOutStreams: number }[]; bindPairs: { inIndex: number; outIndex: number }[] }, excludeIdx: number): number[] {\n var order: number[] = [];\n var processed: { [key: number]: boolean } = {};\n\n // Simple approach: process coders that don't depend on unprocessed outputs\n var changed = true;\n while (changed) {\n changed = false;\n for (var c = 0; c < folder.coders.length; c++) {\n if (processed[c] || c === excludeIdx) continue;\n\n // Check if all inputs are satisfied\n var inputStart = 0;\n for (var i = 0; i < c; i++) {\n inputStart += folder.coders[i].numInStreams;\n }\n\n var canProcess = true;\n for (var inp = 0; inp < folder.coders[c].numInStreams; inp++) {\n var globalIdx = inputStart + inp;\n // Check if bound to an unprocessed coder\n for (var bp = 0; bp < folder.bindPairs.length; bp++) {\n if (folder.bindPairs[bp].inIndex === globalIdx) {\n // Find which coder produces this output\n var outIdx = folder.bindPairs[bp].outIndex;\n var outStart = 0;\n for (var oc = 0; oc < folder.coders.length; oc++) {\n var numOut = folder.coders[oc].numOutStreams;\n if (outIdx < outStart + numOut) {\n if (!processed[oc] && oc !== excludeIdx) {\n canProcess = false;\n }\n break;\n }\n outStart += numOut;\n }\n }\n }\n }\n\n if (canProcess) {\n order.push(c);\n processed[c] = true;\n changed = true;\n }\n }\n }\n\n return order;\n }\n\n /**\n * Close the parser and release resources\n */\n close(): void {\n if (this.source) {\n this.source.close();\n }\n }\n}\n\n/**\n * Get base name from a path\n */\nfunction getBaseName(path: string): string {\n var lastSlash = path.lastIndexOf('/');\n var lastBackslash = path.lastIndexOf('\\\\');\n var lastSep = Math.max(lastSlash, lastBackslash);\n return lastSep >= 0 ? path.slice(lastSep + 1) : path;\n}\n"],"names":["BufferSource","FileSource","SevenZipParser","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","packAreaEnd","searchStart","searchEnd","Math","max","scanChunkSize","searchLoop","chunkStart","chunk","i","min","candidateData","subarray","candidateDecompressed","candCRC","decompOffset","headerId","kHeader","result","parseHeaderContent","kEnd","packPosResult","readNumber","value","numPackResult","kSize","sizeResult","kUnpackInfo","kFolder","numFoldersResult","numCodersResult","flags","idSize","hasAttributes","push","propsLenResult","kCodersUnpackSize","unpackSizeResult","kCRC","allDefined","readUInt32LE","file","createEntry","streamsPerFolder","numUnpackStreamsPerFolder","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","folderHasBcj2","isBcj2Codec","decompressBcj2Folder","packStreamIndex","packedStreams","k","packSizes","packedData","data2","l","coderInfo","numPackStreams","packStreams","currentPos","p","coderOutputs","bcj2CoderIndex","c","inputToPackStream","pi","outputToCoder","totalOutputs","co","numOut","numOutStreams","outp","processed","processOrder","getCoderProcessOrder","po","coderIdx","coderInputStart","ci2","numInStreams","inputIdx","packStreamIdx","inputData","outputData","coderOutputStart","co2","bcj2InputStart","ci3","bcj2Inputs","bi","globalIdx","boundOutput","bp2","bindPairs","inIndex","outIndex","psIdx","bcj2OutputStart","co3","bcj2UnpackSize","decodeBcj2Multi","excludeIdx","order","changed","inputStart","canProcess","inp","bp","outIdx","outStart","oc","lastSlash","lastIndexOf","lastBackslash","lastSep"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Transform } from 'readable-stream';
2
+ /**
3
+ * BCJ2 multi-stream decoder
4
+ * Takes 4 pre-decompressed streams and combines them
5
+ */
6
+ export declare function decodeBcj2Multi(streams: Buffer[], _properties?: Buffer, unpackSize?: number): Buffer;
7
+ /**
8
+ * Single-buffer decode (for API compatibility)
9
+ * Note: BCJ2 requires multi-stream, this throws
10
+ */
11
+ export declare function decodeBcj2(_input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
12
+ /**
13
+ * Create a BCJ2 decoder Transform stream
14
+ * Note: BCJ2 requires multi-stream, this is for API compatibility
15
+ */
16
+ export declare function createBcj2Decoder(_properties?: Buffer, _unpackSize?: number): Transform;
@@ -0,0 +1,16 @@
1
+ import type { Transform } from 'readable-stream';
2
+ /**
3
+ * BCJ2 multi-stream decoder
4
+ * Takes 4 pre-decompressed streams and combines them
5
+ */
6
+ export declare function decodeBcj2Multi(streams: Buffer[], _properties?: Buffer, unpackSize?: number): Buffer;
7
+ /**
8
+ * Single-buffer decode (for API compatibility)
9
+ * Note: BCJ2 requires multi-stream, this throws
10
+ */
11
+ export declare function decodeBcj2(_input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
12
+ /**
13
+ * Create a BCJ2 decoder Transform stream
14
+ * Note: BCJ2 requires multi-stream, this is for API compatibility
15
+ */
16
+ export declare function createBcj2Decoder(_properties?: Buffer, _unpackSize?: number): Transform;