7z-iterator 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -147,6 +147,8 @@ var SevenZipIterator = /*#__PURE__*/ function(BaseIterator) {
147
147
  });
148
148
  } else {
149
149
  // Stream input - use hybrid memory/temp-file approach
150
+ // Store source stream in lock for cleanup if destroyed during download
151
+ _this.lock.sourceStream = source;
150
152
  var tempPath = _path.default.join(tmpdir(), '7z-iterator', (0, _shorthash.default)(process.cwd()), (0, _tempsuffix.default)('tmp.7z'));
151
153
  queue.defer(function(cb) {
152
154
  (0, _streamToSourcets.default)(source, {
@@ -195,9 +197,8 @@ var SevenZipIterator = /*#__PURE__*/ function(BaseIterator) {
195
197
  this.lock = null; // Clear before release to prevent re-entrancy
196
198
  lock.err = err;
197
199
  lock.release();
198
- } else {
199
- _extractbaseiterator.default.prototype.end.call(this, err); // call in lock release so end is properly handled
200
200
  }
201
+ // Don't call base end here - Lock.__destroy() handles it
201
202
  this.iterator = null;
202
203
  };
203
204
  return SevenZipIterator;
@@ -1 +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 const lock = this.lock;\n this.lock = null; // Clear before release to prevent re-entrancy\n lock.err = err;\n lock.release();\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":["SevenZipIterator","tmpdir","os","osShim","EntryIterator","parser","index","entries","getEntries","next","length","getParser","source","options","lock","Lock","iterator","queue","Queue","cancelled","archiveSource","setup","undefined","processing","push","setPassword","password","defer","cb","fs","stat","statErr","stats","done","open","err","fd","FileSource","size","tempPath","path","join","shortHash","process","cwd","tempSuffix","streamToSource","memoryThreshold","result","Error","SevenZipParser","parse","parseErr","await","remove","end","nextEntry","release","BaseIterator","prototype","call"],"mappings":"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"}
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 // Store source stream in lock for cleanup if destroyed during download\n this.lock.sourceStream = source as NodeJS.ReadableStream;\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 const lock = this.lock;\n this.lock = null; // Clear before release to prevent re-entrancy\n lock.err = err;\n lock.release();\n }\n // Don't call base end here - Lock.__destroy() handles it\n this.iterator = null;\n }\n}\n"],"names":["SevenZipIterator","tmpdir","os","osShim","EntryIterator","parser","index","entries","getEntries","next","length","getParser","source","options","lock","Lock","iterator","queue","Queue","cancelled","archiveSource","setup","undefined","processing","push","setPassword","password","defer","cb","fs","stat","statErr","stats","done","open","err","fd","FileSource","size","sourceStream","tempPath","path","join","shortHash","process","cwd","tempSuffix","streamToSource","memoryThreshold","result","Error","SevenZipParser","parse","parseErr","await","remove","end","nextEntry","release","BaseIterator"],"mappings":"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"}
@@ -5,6 +5,7 @@ export default class Lock {
5
5
  fd: number;
6
6
  iterator: BaseIterator;
7
7
  err: Error;
8
+ sourceStream: NodeJS.ReadableStream;
8
9
  retain(): void;
9
10
  release(): void;
10
11
  private __destroy;
@@ -5,6 +5,7 @@ export default class Lock {
5
5
  fd: number;
6
6
  iterator: BaseIterator;
7
7
  err: Error;
8
+ sourceStream: NodeJS.ReadableStream;
8
9
  retain(): void;
9
10
  release(): void;
10
11
  private __destroy;
@@ -31,6 +31,8 @@ var Lock = /*#__PURE__*/ function() {
31
31
  this.fd = null;
32
32
  this.iterator = null;
33
33
  this.err = null;
34
+ // cleanup resources
35
+ this.sourceStream = null;
34
36
  }
35
37
  var _proto = Lock.prototype;
36
38
  _proto.retain = function retain() {
@@ -42,6 +44,12 @@ var Lock = /*#__PURE__*/ function() {
42
44
  if (this.count === 0) this.__destroy();
43
45
  };
44
46
  _proto.__destroy = function __destroy() {
47
+ // Destroy source stream FIRST to stop data flow (e.g., during download)
48
+ if (this.sourceStream) {
49
+ var stream = this.sourceStream;
50
+ if (typeof stream.destroy === 'function') stream.destroy();
51
+ this.sourceStream = null;
52
+ }
45
53
  if (this.tempPath) {
46
54
  try {
47
55
  _rimraf2.default.sync(this.tempPath, {
@@ -1 +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":["Lock","count","tempPath","fd","iterator","err","retain","release","Error","__destroy","rimraf2","sync","disableGlob","_err","fs","closeSync","BaseIterator","prototype","end","call"],"mappings":";;;;;;;eAIqBA;;;0EAJI;yDACV;8DACK;;;;;;;;;;;AAEL,IAAA,AAAMA,qBAAN;;aAAMA;gCAAAA;aACXC,QAAQ;QAEhB,UAAU;aACVC,WAAmB;aACnBC,KAAa;aACbC,WAAyB;aACzBC,MAAa;;iBAPML;IASnBM,OAAAA,MAEC,GAFDA,SAAAA;QACE,IAAI,CAACL,KAAK;IACZ;IAEAM,OAAAA,OAIC,GAJDA,SAAAA;QACE,IAAI,IAAI,CAACN,KAAK,IAAI,GAAG,MAAM,IAAIO,MAAM;QACrC,IAAI,CAACP,KAAK;QACV,IAAI,IAAI,CAACA,KAAK,KAAK,GAAG,IAAI,CAACQ,SAAS;IACtC;IAEA,OAAQA,SAmBP,GAnBD,SAAQA;QACN,IAAI,IAAI,CAACP,QAAQ,EAAE;YACjB,IAAI;gBACFQ,gBAAO,CAACC,IAAI,CAAC,IAAI,CAACT,QAAQ,EAAE;oBAAEU,aAAa;gBAAK;YAClD,EAAE,OAAOC,MAAM;YACb,SAAS,GACX;YACA,IAAI,CAACX,QAAQ,GAAG;QAClB;QAEA,IAAI,IAAI,CAACC,EAAE,EAAE;YACXW,WAAE,CAACC,SAAS,CAAC,IAAI,CAACZ,EAAE;YACpB,IAAI,CAACA,EAAE,GAAG;QACZ;QAEA,IAAI,IAAI,CAACC,QAAQ,EAAE;YACjBY,4BAAY,CAACC,SAAS,CAACC,GAAG,CAACC,IAAI,CAAC,IAAI,CAACf,QAAQ,EAAE,IAAI,CAACC,GAAG,IAAI;YAC3D,IAAI,CAACD,QAAQ,GAAG;QAClB;IACF;WAtCmBJ"}
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 // cleanup resources\n sourceStream: NodeJS.ReadableStream = 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 // Destroy source stream FIRST to stop data flow (e.g., during download)\n if (this.sourceStream) {\n const stream = this.sourceStream as NodeJS.ReadableStream & { destroy?: () => void };\n if (typeof stream.destroy === 'function') stream.destroy();\n this.sourceStream = null;\n }\n\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":["Lock","count","tempPath","fd","iterator","err","sourceStream","retain","release","Error","__destroy","stream","destroy","rimraf2","sync","disableGlob","_err","fs","closeSync","BaseIterator","prototype","end","call"],"mappings":";;;;;;;eAIqBA;;;0EAJI;yDACV;8DACK;;;;;;;;;;;AAEL,IAAA,AAAMA,qBAAN;;aAAMA;gCAAAA;aACXC,QAAQ;QAEhB,UAAU;aACVC,WAAmB;aACnBC,KAAa;aACbC,WAAyB;aACzBC,MAAa;QAEb,oBAAoB;aACpBC,eAAsC;;iBAVnBN;IAYnBO,OAAAA,MAEC,GAFDA,SAAAA;QACE,IAAI,CAACN,KAAK;IACZ;IAEAO,OAAAA,OAIC,GAJDA,SAAAA;QACE,IAAI,IAAI,CAACP,KAAK,IAAI,GAAG,MAAM,IAAIQ,MAAM;QACrC,IAAI,CAACR,KAAK;QACV,IAAI,IAAI,CAACA,KAAK,KAAK,GAAG,IAAI,CAACS,SAAS;IACtC;IAEA,OAAQA,SA0BP,GA1BD,SAAQA;QACN,wEAAwE;QACxE,IAAI,IAAI,CAACJ,YAAY,EAAE;YACrB,IAAMK,SAAS,IAAI,CAACL,YAAY;YAChC,IAAI,OAAOK,OAAOC,OAAO,KAAK,YAAYD,OAAOC,OAAO;YACxD,IAAI,CAACN,YAAY,GAAG;QACtB;QAEA,IAAI,IAAI,CAACJ,QAAQ,EAAE;YACjB,IAAI;gBACFW,gBAAO,CAACC,IAAI,CAAC,IAAI,CAACZ,QAAQ,EAAE;oBAAEa,aAAa;gBAAK;YAClD,EAAE,OAAOC,MAAM;YACb,SAAS,GACX;YACA,IAAI,CAACd,QAAQ,GAAG;QAClB;QAEA,IAAI,IAAI,CAACC,EAAE,EAAE;YACXc,WAAE,CAACC,SAAS,CAAC,IAAI,CAACf,EAAE;YACpB,IAAI,CAACA,EAAE,GAAG;QACZ;QAEA,IAAI,IAAI,CAACC,QAAQ,EAAE;YACjBe,4BAAY,CAACC,SAAS,CAACC,GAAG,CAACC,IAAI,CAAC,IAAI,CAAClB,QAAQ,EAAE,IAAI,CAACC,GAAG,IAAI;YAC3D,IAAI,CAACD,QAAQ,GAAG;QAClB;IACF;WAhDmBJ"}
@@ -36,8 +36,8 @@ function nextEntry(iterator, callback) {
36
36
  value: null
37
37
  });
38
38
  });
39
- // done: signal iteration is complete
40
- if (iterator.isDone() || !entry) return callback(null, {
39
+ // done: signal iteration is complete (guard against stale lock)
40
+ if (!iterator.lock || iterator.isDone() || !entry) return callback(null, {
41
41
  done: true,
42
42
  value: null
43
43
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/nextEntry.ts"],"sourcesContent":["import once from 'call-once-fn';\nimport { type DirectoryAttributes, DirectoryEntry, type FileAttributes, type LinkAttributes, SymbolicLinkEntry } from 'extract-base-iterator';\nimport compact from 'lodash.compact';\nimport path from 'path';\nimport FileEntry from './FileEntry.ts';\nimport type SevenZipIterator from './SevenZipIterator.ts';\nimport type { SevenZipEntry } from './sevenz/SevenZipParser.ts';\nimport type { Entry, EntryCallback } from './types.ts';\n\nexport type NextCallback = (error?: Error, entry?: Entry) => undefined;\n\n// Entry attributes object that gets mutated in switch - union of possible shapes\n// mtime is number for FileAttributes compatibility (timestamp in ms)\ntype EntryAttributesBuilder = {\n path: string;\n basename: string;\n mtime: number;\n mode: number;\n type?: 'file' | 'directory';\n size?: number;\n};\n\nexport default function nextEntry<_T>(iterator: SevenZipIterator, callback: EntryCallback): undefined {\n if (!iterator.iterator) {\n callback(new Error('iterator missing'));\n return;\n }\n\n var entry: SevenZipEntry | null = null;\n entry = iterator.iterator.next();\n\n var nextCallback = once((err?: Error, entry?: Entry) => {\n // keep processing\n if (entry) iterator.push(nextEntry);\n err ? callback(err) : callback(null, entry ? { done: false, value: entry } : { done: true, value: null });\n }) as NextCallback;\n\n // done: signal iteration is complete\n if (iterator.isDone() || !entry) return callback(null, { done: true, value: null });\n\n // Skip anti-files (these mark files to delete in delta archives)\n if (entry.isAntiFile) {\n iterator.push(nextEntry);\n return callback(null, null);\n }\n\n // Determine type from entry\n var type = entry.type;\n\n // Default modes (decimal values for Node 0.8 compatibility)\n // 0o755 = 493, 0o644 = 420\n var defaultMode = type === 'directory' ? 493 : 420;\n\n // Build attributes from 7z entry\n // mtime must be timestamp (number) for FileAttributes compatibility\n var mtimeDate = entry.mtime || new Date();\n var attributes: EntryAttributesBuilder = {\n path: compact(entry.path.split(path.sep)).join(path.sep),\n basename: entry.name,\n mtime: mtimeDate.getTime(),\n mode: entry.mode !== undefined ? entry.mode : defaultMode,\n };\n\n switch (type) {\n case 'directory':\n attributes.type = 'directory';\n return nextCallback(null, new DirectoryEntry(attributes as DirectoryAttributes));\n\n case 'link': {\n // For symlinks, the file content IS the symlink target path\n // Read the content to get the linkpath for SymbolicLinkEntry\n var parser = iterator.iterator.getParser();\n var stream = parser.getEntryStream(entry);\n var chunks: Buffer[] = [];\n\n stream.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n stream.on('end', () => {\n var linkpath = Buffer.concat(chunks).toString('utf8');\n\n var linkAttributes: LinkAttributes = {\n path: attributes.path,\n mtime: attributes.mtime,\n mode: attributes.mode,\n linkpath: linkpath,\n };\n\n nextCallback(null, new SymbolicLinkEntry(linkAttributes));\n });\n stream.on('error', (err: Error) => {\n nextCallback(err);\n });\n return;\n }\n\n case 'file': {\n attributes.type = 'file';\n attributes.size = entry.size;\n var parser2 = iterator.iterator.getParser();\n return nextCallback(null, new FileEntry(attributes as FileAttributes, entry, parser2, iterator.lock));\n }\n }\n\n return callback(new Error(`Unrecognized entry type: ${type}`));\n}\n"],"names":["nextEntry","iterator","callback","Error","entry","next","nextCallback","once","err","push","done","value","isDone","isAntiFile","type","defaultMode","mtimeDate","mtime","Date","attributes","path","compact","split","sep","join","basename","name","getTime","mode","undefined","DirectoryEntry","parser","getParser","stream","getEntryStream","chunks","on","chunk","linkpath","Buffer","concat","toString","linkAttributes","SymbolicLinkEntry","size","parser2","FileEntry","lock"],"mappings":";;;;+BAsBA;;;eAAwBA;;;iEAtBP;mCACqG;oEAClG;2DACH;kEACK;;;;;;AAkBP,SAASA,UAAcC,QAA0B,EAAEC,QAAuB;IACvF,IAAI,CAACD,SAASA,QAAQ,EAAE;QACtBC,SAAS,IAAIC,MAAM;QACnB;IACF;IAEA,IAAIC,QAA8B;IAClCA,QAAQH,SAASA,QAAQ,CAACI,IAAI;IAE9B,IAAIC,eAAeC,IAAAA,mBAAI,EAAC,SAACC,KAAaJ;QACpC,kBAAkB;QAClB,IAAIA,OAAOH,SAASQ,IAAI,CAACT;QACzBQ,MAAMN,SAASM,OAAON,SAAS,MAAME,QAAQ;YAAEM,MAAM;YAAOC,OAAOP;QAAM,IAAI;YAAEM,MAAM;YAAMC,OAAO;QAAK;IACzG;IAEA,qCAAqC;IACrC,IAAIV,SAASW,MAAM,MAAM,CAACR,OAAO,OAAOF,SAAS,MAAM;QAAEQ,MAAM;QAAMC,OAAO;IAAK;IAEjF,iEAAiE;IACjE,IAAIP,MAAMS,UAAU,EAAE;QACpBZ,SAASQ,IAAI,CAACT;QACd,OAAOE,SAAS,MAAM;IACxB;IAEA,4BAA4B;IAC5B,IAAIY,OAAOV,MAAMU,IAAI;IAErB,4DAA4D;IAC5D,2BAA2B;IAC3B,IAAIC,cAAcD,SAAS,cAAc,MAAM;IAE/C,iCAAiC;IACjC,oEAAoE;IACpE,IAAIE,YAAYZ,MAAMa,KAAK,IAAI,IAAIC;IACnC,IAAIC,aAAqC;QACvCC,MAAMC,IAAAA,sBAAO,EAACjB,MAAMgB,IAAI,CAACE,KAAK,CAACF,aAAI,CAACG,GAAG,GAAGC,IAAI,CAACJ,aAAI,CAACG,GAAG;QACvDE,UAAUrB,MAAMsB,IAAI;QACpBT,OAAOD,UAAUW,OAAO;QACxBC,MAAMxB,MAAMwB,IAAI,KAAKC,YAAYzB,MAAMwB,IAAI,GAAGb;IAChD;IAEA,OAAQD;QACN,KAAK;YACHK,WAAWL,IAAI,GAAG;YAClB,OAAOR,aAAa,MAAM,IAAIwB,mCAAc,CAACX;QAE/C,KAAK;YAAQ;gBACX,4DAA4D;gBAC5D,6DAA6D;gBAC7D,IAAIY,SAAS9B,SAASA,QAAQ,CAAC+B,SAAS;gBACxC,IAAIC,SAASF,OAAOG,cAAc,CAAC9B;gBACnC,IAAI+B,SAAmB,EAAE;gBAEzBF,OAAOG,EAAE,CAAC,QAAQ,SAACC;oBACjBF,OAAO1B,IAAI,CAAC4B;gBACd;gBACAJ,OAAOG,EAAE,CAAC,OAAO;oBACf,IAAIE,WAAWC,OAAOC,MAAM,CAACL,QAAQM,QAAQ,CAAC;oBAE9C,IAAIC,iBAAiC;wBACnCtB,MAAMD,WAAWC,IAAI;wBACrBH,OAAOE,WAAWF,KAAK;wBACvBW,MAAMT,WAAWS,IAAI;wBACrBU,UAAUA;oBACZ;oBAEAhC,aAAa,MAAM,IAAIqC,sCAAiB,CAACD;gBAC3C;gBACAT,OAAOG,EAAE,CAAC,SAAS,SAAC5B;oBAClBF,aAAaE;gBACf;gBACA;YACF;QAEA,KAAK;YAAQ;gBACXW,WAAWL,IAAI,GAAG;gBAClBK,WAAWyB,IAAI,GAAGxC,MAAMwC,IAAI;gBAC5B,IAAIC,UAAU5C,SAASA,QAAQ,CAAC+B,SAAS;gBACzC,OAAO1B,aAAa,MAAM,IAAIwC,oBAAS,CAAC3B,YAA8Bf,OAAOyC,SAAS5C,SAAS8C,IAAI;YACrG;IACF;IAEA,OAAO7C,SAAS,IAAIC,MAAM,AAAC,4BAAgC,OAALW;AACxD"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/nextEntry.ts"],"sourcesContent":["import once from 'call-once-fn';\nimport { type DirectoryAttributes, DirectoryEntry, type FileAttributes, type LinkAttributes, SymbolicLinkEntry } from 'extract-base-iterator';\nimport compact from 'lodash.compact';\nimport path from 'path';\nimport FileEntry from './FileEntry.ts';\nimport type SevenZipIterator from './SevenZipIterator.ts';\nimport type { SevenZipEntry } from './sevenz/SevenZipParser.ts';\nimport type { Entry, EntryCallback } from './types.ts';\n\nexport type NextCallback = (error?: Error, entry?: Entry) => undefined;\n\n// Entry attributes object that gets mutated in switch - union of possible shapes\n// mtime is number for FileAttributes compatibility (timestamp in ms)\ntype EntryAttributesBuilder = {\n path: string;\n basename: string;\n mtime: number;\n mode: number;\n type?: 'file' | 'directory';\n size?: number;\n};\n\nexport default function nextEntry<_T>(iterator: SevenZipIterator, callback: EntryCallback): undefined {\n if (!iterator.iterator) {\n callback(new Error('iterator missing'));\n return;\n }\n\n var entry: SevenZipEntry | null = null;\n entry = iterator.iterator.next();\n\n var nextCallback = once((err?: Error, entry?: Entry) => {\n // keep processing\n if (entry) iterator.push(nextEntry);\n err ? callback(err) : callback(null, entry ? { done: false, value: entry } : { done: true, value: null });\n }) as NextCallback;\n\n // done: signal iteration is complete (guard against stale lock)\n if (!iterator.lock || iterator.isDone() || !entry) return callback(null, { done: true, value: null });\n\n // Skip anti-files (these mark files to delete in delta archives)\n if (entry.isAntiFile) {\n iterator.push(nextEntry);\n return callback(null, null);\n }\n\n // Determine type from entry\n var type = entry.type;\n\n // Default modes (decimal values for Node 0.8 compatibility)\n // 0o755 = 493, 0o644 = 420\n var defaultMode = type === 'directory' ? 493 : 420;\n\n // Build attributes from 7z entry\n // mtime must be timestamp (number) for FileAttributes compatibility\n var mtimeDate = entry.mtime || new Date();\n var attributes: EntryAttributesBuilder = {\n path: compact(entry.path.split(path.sep)).join(path.sep),\n basename: entry.name,\n mtime: mtimeDate.getTime(),\n mode: entry.mode !== undefined ? entry.mode : defaultMode,\n };\n\n switch (type) {\n case 'directory':\n attributes.type = 'directory';\n return nextCallback(null, new DirectoryEntry(attributes as DirectoryAttributes));\n\n case 'link': {\n // For symlinks, the file content IS the symlink target path\n // Read the content to get the linkpath for SymbolicLinkEntry\n var parser = iterator.iterator.getParser();\n var stream = parser.getEntryStream(entry);\n var chunks: Buffer[] = [];\n\n stream.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n stream.on('end', () => {\n var linkpath = Buffer.concat(chunks).toString('utf8');\n\n var linkAttributes: LinkAttributes = {\n path: attributes.path,\n mtime: attributes.mtime,\n mode: attributes.mode,\n linkpath: linkpath,\n };\n\n nextCallback(null, new SymbolicLinkEntry(linkAttributes));\n });\n stream.on('error', (err: Error) => {\n nextCallback(err);\n });\n return;\n }\n\n case 'file': {\n attributes.type = 'file';\n attributes.size = entry.size;\n var parser2 = iterator.iterator.getParser();\n return nextCallback(null, new FileEntry(attributes as FileAttributes, entry, parser2, iterator.lock));\n }\n }\n\n return callback(new Error(`Unrecognized entry type: ${type}`));\n}\n"],"names":["nextEntry","iterator","callback","Error","entry","next","nextCallback","once","err","push","done","value","lock","isDone","isAntiFile","type","defaultMode","mtimeDate","mtime","Date","attributes","path","compact","split","sep","join","basename","name","getTime","mode","undefined","DirectoryEntry","parser","getParser","stream","getEntryStream","chunks","on","chunk","linkpath","Buffer","concat","toString","linkAttributes","SymbolicLinkEntry","size","parser2","FileEntry"],"mappings":";;;;+BAsBA;;;eAAwBA;;;iEAtBP;mCACqG;oEAClG;2DACH;kEACK;;;;;;AAkBP,SAASA,UAAcC,QAA0B,EAAEC,QAAuB;IACvF,IAAI,CAACD,SAASA,QAAQ,EAAE;QACtBC,SAAS,IAAIC,MAAM;QACnB;IACF;IAEA,IAAIC,QAA8B;IAClCA,QAAQH,SAASA,QAAQ,CAACI,IAAI;IAE9B,IAAIC,eAAeC,IAAAA,mBAAI,EAAC,SAACC,KAAaJ;QACpC,kBAAkB;QAClB,IAAIA,OAAOH,SAASQ,IAAI,CAACT;QACzBQ,MAAMN,SAASM,OAAON,SAAS,MAAME,QAAQ;YAAEM,MAAM;YAAOC,OAAOP;QAAM,IAAI;YAAEM,MAAM;YAAMC,OAAO;QAAK;IACzG;IAEA,gEAAgE;IAChE,IAAI,CAACV,SAASW,IAAI,IAAIX,SAASY,MAAM,MAAM,CAACT,OAAO,OAAOF,SAAS,MAAM;QAAEQ,MAAM;QAAMC,OAAO;IAAK;IAEnG,iEAAiE;IACjE,IAAIP,MAAMU,UAAU,EAAE;QACpBb,SAASQ,IAAI,CAACT;QACd,OAAOE,SAAS,MAAM;IACxB;IAEA,4BAA4B;IAC5B,IAAIa,OAAOX,MAAMW,IAAI;IAErB,4DAA4D;IAC5D,2BAA2B;IAC3B,IAAIC,cAAcD,SAAS,cAAc,MAAM;IAE/C,iCAAiC;IACjC,oEAAoE;IACpE,IAAIE,YAAYb,MAAMc,KAAK,IAAI,IAAIC;IACnC,IAAIC,aAAqC;QACvCC,MAAMC,IAAAA,sBAAO,EAAClB,MAAMiB,IAAI,CAACE,KAAK,CAACF,aAAI,CAACG,GAAG,GAAGC,IAAI,CAACJ,aAAI,CAACG,GAAG;QACvDE,UAAUtB,MAAMuB,IAAI;QACpBT,OAAOD,UAAUW,OAAO;QACxBC,MAAMzB,MAAMyB,IAAI,KAAKC,YAAY1B,MAAMyB,IAAI,GAAGb;IAChD;IAEA,OAAQD;QACN,KAAK;YACHK,WAAWL,IAAI,GAAG;YAClB,OAAOT,aAAa,MAAM,IAAIyB,mCAAc,CAACX;QAE/C,KAAK;YAAQ;gBACX,4DAA4D;gBAC5D,6DAA6D;gBAC7D,IAAIY,SAAS/B,SAASA,QAAQ,CAACgC,SAAS;gBACxC,IAAIC,SAASF,OAAOG,cAAc,CAAC/B;gBACnC,IAAIgC,SAAmB,EAAE;gBAEzBF,OAAOG,EAAE,CAAC,QAAQ,SAACC;oBACjBF,OAAO3B,IAAI,CAAC6B;gBACd;gBACAJ,OAAOG,EAAE,CAAC,OAAO;oBACf,IAAIE,WAAWC,OAAOC,MAAM,CAACL,QAAQM,QAAQ,CAAC;oBAE9C,IAAIC,iBAAiC;wBACnCtB,MAAMD,WAAWC,IAAI;wBACrBH,OAAOE,WAAWF,KAAK;wBACvBW,MAAMT,WAAWS,IAAI;wBACrBU,UAAUA;oBACZ;oBAEAjC,aAAa,MAAM,IAAIsC,sCAAiB,CAACD;gBAC3C;gBACAT,OAAOG,EAAE,CAAC,SAAS,SAAC7B;oBAClBF,aAAaE;gBACf;gBACA;YACF;QAEA,KAAK;YAAQ;gBACXY,WAAWL,IAAI,GAAG;gBAClBK,WAAWyB,IAAI,GAAGzC,MAAMyC,IAAI;gBAC5B,IAAIC,UAAU7C,SAASA,QAAQ,CAACgC,SAAS;gBACzC,OAAO3B,aAAa,MAAM,IAAIyC,oBAAS,CAAC3B,YAA8BhB,OAAO0C,SAAS7C,SAASW,IAAI;YACrG;IACF;IAEA,OAAOV,SAAS,IAAIC,MAAM,AAAC,4BAAgC,OAALY;AACxD"}
@@ -4,6 +4,15 @@ export interface NumberReadResult {
4
4
  }
5
5
  /**
6
6
  * Read a variable-length encoded number from a buffer
7
+ * Uses 7z's variable-length uint64 encoding where the first byte indicates
8
+ * how many additional bytes follow based on its value:
9
+ * - 0x00-0x7F: 0 extra bytes (7 bits of data)
10
+ * - 0x80-0xBF: 1 extra byte (14 bits of data)
11
+ * - 0xC0-0xDF: 2 extra bytes (21 bits of data)
12
+ * - 0xE0-0xEF: 3 extra bytes (28 bits of data)
13
+ * - etc.
14
+ * - 0xFF: 8 extra bytes (full 64-bit value)
15
+ *
7
16
  * @param buf - Buffer containing encoded number
8
17
  * @param offset - Offset to start reading from
9
18
  * @returns Object with value and number of bytes consumed
@@ -4,6 +4,15 @@ export interface NumberReadResult {
4
4
  }
5
5
  /**
6
6
  * Read a variable-length encoded number from a buffer
7
+ * Uses 7z's variable-length uint64 encoding where the first byte indicates
8
+ * how many additional bytes follow based on its value:
9
+ * - 0x00-0x7F: 0 extra bytes (7 bits of data)
10
+ * - 0x80-0xBF: 1 extra byte (14 bits of data)
11
+ * - 0xC0-0xDF: 2 extra bytes (21 bits of data)
12
+ * - 0xE0-0xEF: 3 extra bytes (28 bits of data)
13
+ * - etc.
14
+ * - 0xFF: 8 extra bytes (full 64-bit value)
15
+ *
7
16
  * @param buf - Buffer containing encoded number
8
17
  * @param offset - Offset to start reading from
9
18
  * @returns Object with value and number of bytes consumed
@@ -47,27 +47,52 @@ _export(exports, {
47
47
  var _extractbaseiterator = require("extract-base-iterator");
48
48
  function readNumber(buf, offset) {
49
49
  var firstByte = buf[offset];
50
- // Count leading 1 bits to determine extra bytes
51
- var mask = 0x80;
52
- var extraBytes = 0;
53
- while((firstByte & mask) !== 0 && extraBytes < 8){
54
- extraBytes++;
55
- mask = mask >>> 1;
56
- }
57
- // Special case: all 8 bits set means 8 extra bytes
58
- if (extraBytes === 8) {
59
- // Full 64-bit value follows
50
+ // Special case: 0xFF means 8 extra bytes (full 64-bit value)
51
+ if (firstByte === 0xff) {
60
52
  return {
61
53
  value: (0, _extractbaseiterator.readUInt64LE)(buf, offset + 1),
62
54
  bytesRead: 9
63
55
  };
64
56
  }
65
- // Mask off the length bits from first byte
66
- var value = firstByte & (mask - 1 | mask);
67
- // Add remaining bytes (big-endian order)
57
+ // Determine number of extra bytes based on first byte value thresholds
58
+ // This matches the 7z format specification
59
+ var extraBytes = 0;
60
+ var mask = 0x80;
61
+ if (firstByte <= 0x7f) {
62
+ extraBytes = 0;
63
+ mask = 0x80;
64
+ } else if (firstByte <= 0xbf) {
65
+ extraBytes = 1;
66
+ mask = 0x40;
67
+ } else if (firstByte <= 0xdf) {
68
+ extraBytes = 2;
69
+ mask = 0x20;
70
+ } else if (firstByte <= 0xef) {
71
+ extraBytes = 3;
72
+ mask = 0x10;
73
+ } else if (firstByte <= 0xf7) {
74
+ extraBytes = 4;
75
+ mask = 0x08;
76
+ } else if (firstByte <= 0xfb) {
77
+ extraBytes = 5;
78
+ mask = 0x04;
79
+ } else if (firstByte <= 0xfd) {
80
+ extraBytes = 6;
81
+ mask = 0x02;
82
+ } else {
83
+ // 0xFE
84
+ extraBytes = 7;
85
+ mask = 0x01;
86
+ }
87
+ // Get high part from first byte (bits below the length indicator)
88
+ var highPart = firstByte & mask - 1;
89
+ // Read extra bytes as LITTLE-ENDIAN
90
+ var value = 0;
68
91
  for(var i = 0; i < extraBytes; i++){
69
- value = value * 256 + buf[offset + 1 + i];
92
+ value += buf[offset + 1 + i] * Math.pow(256, i);
70
93
  }
94
+ // Combine: value + (highPart << (extraBytes * 8))
95
+ value += highPart * Math.pow(256, extraBytes);
71
96
  return {
72
97
  value: value,
73
98
  bytesRead: 1 + extraBytes
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/NumberCodec.ts"],"sourcesContent":["// Variable-length integer encoding for 7z format\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n//\n// 7z uses a space-efficient encoding where the first byte determines length:\n// 0xxxxxxx -> 1 byte (0-127)\n// 10xxxxxx xxxxxxxx -> 2 bytes (0-16383)\n// 110xxxxx + 2 bytes -> 3 bytes\n// 1110xxxx + 3 bytes -> 4 bytes\n// 11110xxx + 4 bytes -> 5 bytes\n// 111110xx + 5 bytes -> 6 bytes\n// 1111110x + 6 bytes -> 7 bytes\n// 11111110 + 7 bytes -> 8 bytes\n// 11111111 + 8 bytes -> 9 bytes (full 64-bit)\n//\n// NOTE: Returns JavaScript number which is accurate up to 2^53 - 1 (~9 PB).\n// This covers all practical file sizes.\n\nimport { readUInt64LE } from 'extract-base-iterator';\n\nexport interface NumberReadResult {\n value: number;\n bytesRead: number;\n}\n\n/**\n * Read a variable-length encoded number from a buffer\n * @param buf - Buffer containing encoded number\n * @param offset - Offset to start reading from\n * @returns Object with value and number of bytes consumed\n */\nexport function readNumber(buf: Buffer, offset: number): NumberReadResult {\n var firstByte = buf[offset];\n\n // Count leading 1 bits to determine extra bytes\n var mask = 0x80;\n var extraBytes = 0;\n\n while ((firstByte & mask) !== 0 && extraBytes < 8) {\n extraBytes++;\n mask = mask >>> 1;\n }\n\n // Special case: all 8 bits set means 8 extra bytes\n if (extraBytes === 8) {\n // Full 64-bit value follows\n return {\n value: readUInt64LE(buf, offset + 1),\n bytesRead: 9,\n };\n }\n\n // Mask off the length bits from first byte\n var value = firstByte & ((mask - 1) | mask);\n\n // Add remaining bytes (big-endian order)\n for (var i = 0; i < extraBytes; i++) {\n value = value * 256 + buf[offset + 1 + i];\n }\n\n return {\n value: value,\n bytesRead: 1 + extraBytes,\n };\n}\n\n/**\n * Read a raw 64-bit little-endian number (used in some fixed-size fields)\n * @param buf - Buffer containing the number\n * @param offset - Offset to start reading from\n * @returns The number value\n */\nexport function readRawNumber(buf: Buffer, offset: number): number {\n return readUInt64LE(buf, offset);\n}\n\n/**\n * Calculate the encoded size of a number\n * @param value - The number to encode\n * @returns Number of bytes needed to encode the value\n */\nexport function encodedSize(value: number): number {\n if (value < 0x80) return 1; // 7 bits\n if (value < 0x4000) return 2; // 14 bits\n if (value < 0x200000) return 3; // 21 bits\n if (value < 0x10000000) return 4; // 28 bits\n if (value < 0x800000000) return 5; // 35 bits\n if (value < 0x40000000000) return 6; // 42 bits\n if (value < 0x2000000000000) return 7; // 49 bits\n // 2^56 = 72057594037927936 (use calculated value to avoid precision loss)\n if (value < 72057594037927936) return 8; // 56 bits\n return 9; // 64 bits\n}\n\n/**\n * Read a boolean encoded as a single byte\n * @param buf - Buffer to read from\n * @param offset - Offset to read from\n * @returns true if byte is non-zero\n */\nexport function readBoolean(buf: Buffer, offset: number): boolean {\n return buf[offset] !== 0;\n}\n\n/**\n * Read a \"defined\" bitmask for an array of items.\n * Used when some items in a list have optional values.\n *\n * Format: If \"allDefined\" byte is 0, a bitmask follows indicating which items have values.\n * If \"allDefined\" byte is non-zero, all items are defined.\n *\n * @param buf - Buffer to read from\n * @param offset - Offset to start reading\n * @param count - Number of items\n * @returns Object with defined array and bytes consumed\n */\nexport function readDefinedVector(buf: Buffer, offset: number, count: number): { defined: boolean[]; bytesRead: number } {\n var allDefined = buf[offset] !== 0;\n var bytesRead = 1;\n var defined: boolean[] = [];\n\n if (allDefined) {\n // All items are defined\n for (var i = 0; i < count; i++) {\n defined.push(true);\n }\n } else {\n // Read bitmask\n var bitsNeeded = count;\n var bytesNeeded = Math.ceil(bitsNeeded / 8);\n\n for (var byteIdx = 0; byteIdx < bytesNeeded; byteIdx++) {\n var byte = buf[offset + 1 + byteIdx];\n for (var bit = 7; bit >= 0 && defined.length < count; bit--) {\n defined.push((byte & (1 << bit)) !== 0);\n }\n }\n bytesRead += bytesNeeded;\n }\n\n return { defined: defined, bytesRead: bytesRead };\n}\n\n/**\n * Read an array of variable-length numbers\n * @param buf - Buffer to read from\n * @param offset - Offset to start reading\n * @param count - Number of items to read\n * @returns Object with values array and bytes consumed\n */\nexport function readNumberArray(buf: Buffer, offset: number, count: number): { values: number[]; bytesRead: number } {\n var values: number[] = [];\n var totalBytesRead = 0;\n\n for (var i = 0; i < count; i++) {\n var result = readNumber(buf, offset + totalBytesRead);\n values.push(result.value);\n totalBytesRead += result.bytesRead;\n }\n\n return { values: values, bytesRead: totalBytesRead };\n}\n"],"names":["encodedSize","readBoolean","readDefinedVector","readNumber","readNumberArray","readRawNumber","buf","offset","firstByte","mask","extraBytes","value","readUInt64LE","bytesRead","i","count","allDefined","defined","push","bitsNeeded","bytesNeeded","Math","ceil","byteIdx","byte","bit","length","values","totalBytesRead","result"],"mappings":"AAAA,iDAAiD;AACjD,wEAAwE;AACxE,EAAE;AACF,6EAA6E;AAC7E,iDAAiD;AACjD,mDAAmD;AACnD,yCAAyC;AACzC,yCAAyC;AACzC,yCAAyC;AACzC,yCAAyC;AACzC,yCAAyC;AACzC,yCAAyC;AACzC,uDAAuD;AACvD,EAAE;AACF,4EAA4E;AAC5E,wCAAwC;;;;;;;;;;;;QAiExBA;eAAAA;;QAmBAC;eAAAA;;QAgBAC;eAAAA;;QArFAC;eAAAA;;QAuHAC;eAAAA;;QA9EAC;eAAAA;;;mCAtDa;AAatB,SAASF,WAAWG,GAAW,EAAEC,MAAc;IACpD,IAAIC,YAAYF,GAAG,CAACC,OAAO;IAE3B,gDAAgD;IAChD,IAAIE,OAAO;IACX,IAAIC,aAAa;IAEjB,MAAO,AAACF,CAAAA,YAAYC,IAAG,MAAO,KAAKC,aAAa,EAAG;QACjDA;QACAD,OAAOA,SAAS;IAClB;IAEA,mDAAmD;IACnD,IAAIC,eAAe,GAAG;QACpB,4BAA4B;QAC5B,OAAO;YACLC,OAAOC,IAAAA,iCAAY,EAACN,KAAKC,SAAS;YAClCM,WAAW;QACb;IACF;IAEA,2CAA2C;IAC3C,IAAIF,QAAQH,YAAa,CAAA,AAACC,OAAO,IAAKA,IAAG;IAEzC,yCAAyC;IACzC,IAAK,IAAIK,IAAI,GAAGA,IAAIJ,YAAYI,IAAK;QACnCH,QAAQA,QAAQ,MAAML,GAAG,CAACC,SAAS,IAAIO,EAAE;IAC3C;IAEA,OAAO;QACLH,OAAOA;QACPE,WAAW,IAAIH;IACjB;AACF;AAQO,SAASL,cAAcC,GAAW,EAAEC,MAAc;IACvD,OAAOK,IAAAA,iCAAY,EAACN,KAAKC;AAC3B;AAOO,SAASP,YAAYW,KAAa;IACvC,IAAIA,QAAQ,MAAM,OAAO,GAAG,SAAS;IACrC,IAAIA,QAAQ,QAAQ,OAAO,GAAG,UAAU;IACxC,IAAIA,QAAQ,UAAU,OAAO,GAAG,UAAU;IAC1C,IAAIA,QAAQ,YAAY,OAAO,GAAG,UAAU;IAC5C,IAAIA,QAAQ,aAAa,OAAO,GAAG,UAAU;IAC7C,IAAIA,QAAQ,eAAe,OAAO,GAAG,UAAU;IAC/C,IAAIA,QAAQ,iBAAiB,OAAO,GAAG,UAAU;IACjD,0EAA0E;IAC1E,IAAIA,QAAQ,mBAAmB,OAAO,GAAG,UAAU;IACnD,OAAO,GAAG,UAAU;AACtB;AAQO,SAASV,YAAYK,GAAW,EAAEC,MAAc;IACrD,OAAOD,GAAG,CAACC,OAAO,KAAK;AACzB;AAcO,SAASL,kBAAkBI,GAAW,EAAEC,MAAc,EAAEQ,KAAa;IAC1E,IAAIC,aAAaV,GAAG,CAACC,OAAO,KAAK;IACjC,IAAIM,YAAY;IAChB,IAAII,UAAqB,EAAE;IAE3B,IAAID,YAAY;QACd,wBAAwB;QACxB,IAAK,IAAIF,IAAI,GAAGA,IAAIC,OAAOD,IAAK;YAC9BG,QAAQC,IAAI,CAAC;QACf;IACF,OAAO;QACL,eAAe;QACf,IAAIC,aAAaJ;QACjB,IAAIK,cAAcC,KAAKC,IAAI,CAACH,aAAa;QAEzC,IAAK,IAAII,UAAU,GAAGA,UAAUH,aAAaG,UAAW;YACtD,IAAIC,OAAOlB,GAAG,CAACC,SAAS,IAAIgB,QAAQ;YACpC,IAAK,IAAIE,MAAM,GAAGA,OAAO,KAAKR,QAAQS,MAAM,GAAGX,OAAOU,MAAO;gBAC3DR,QAAQC,IAAI,CAAC,AAACM,CAAAA,OAAQ,KAAKC,GAAG,MAAO;YACvC;QACF;QACAZ,aAAaO;IACf;IAEA,OAAO;QAAEH,SAASA;QAASJ,WAAWA;IAAU;AAClD;AASO,SAAST,gBAAgBE,GAAW,EAAEC,MAAc,EAAEQ,KAAa;IACxE,IAAIY,SAAmB,EAAE;IACzB,IAAIC,iBAAiB;IAErB,IAAK,IAAId,IAAI,GAAGA,IAAIC,OAAOD,IAAK;QAC9B,IAAIe,SAAS1B,WAAWG,KAAKC,SAASqB;QACtCD,OAAOT,IAAI,CAACW,OAAOlB,KAAK;QACxBiB,kBAAkBC,OAAOhB,SAAS;IACpC;IAEA,OAAO;QAAEc,QAAQA;QAAQd,WAAWe;IAAe;AACrD"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/NumberCodec.ts"],"sourcesContent":["// Variable-length integer encoding for 7z format\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n//\n// 7z uses a space-efficient encoding where the first byte determines length:\n// 0xxxxxxx -> 1 byte (0-127)\n// 10xxxxxx xxxxxxxx -> 2 bytes (0-16383)\n// 110xxxxx + 2 bytes -> 3 bytes\n// 1110xxxx + 3 bytes -> 4 bytes\n// 11110xxx + 4 bytes -> 5 bytes\n// 111110xx + 5 bytes -> 6 bytes\n// 1111110x + 6 bytes -> 7 bytes\n// 11111110 + 7 bytes -> 8 bytes\n// 11111111 + 8 bytes -> 9 bytes (full 64-bit)\n//\n// NOTE: Returns JavaScript number which is accurate up to 2^53 - 1 (~9 PB).\n// This covers all practical file sizes.\n\nimport { readUInt64LE } from 'extract-base-iterator';\n\nexport interface NumberReadResult {\n value: number;\n bytesRead: number;\n}\n\n/**\n * Read a variable-length encoded number from a buffer\n * Uses 7z's variable-length uint64 encoding where the first byte indicates\n * how many additional bytes follow based on its value:\n * - 0x00-0x7F: 0 extra bytes (7 bits of data)\n * - 0x80-0xBF: 1 extra byte (14 bits of data)\n * - 0xC0-0xDF: 2 extra bytes (21 bits of data)\n * - 0xE0-0xEF: 3 extra bytes (28 bits of data)\n * - etc.\n * - 0xFF: 8 extra bytes (full 64-bit value)\n *\n * @param buf - Buffer containing encoded number\n * @param offset - Offset to start reading from\n * @returns Object with value and number of bytes consumed\n */\nexport function readNumber(buf: Buffer, offset: number): NumberReadResult {\n var firstByte = buf[offset];\n\n // Special case: 0xFF means 8 extra bytes (full 64-bit value)\n if (firstByte === 0xff) {\n return {\n value: readUInt64LE(buf, offset + 1),\n bytesRead: 9,\n };\n }\n\n // Determine number of extra bytes based on first byte value thresholds\n // This matches the 7z format specification\n var extraBytes = 0;\n var mask = 0x80;\n\n if (firstByte <= 0x7f) {\n extraBytes = 0;\n mask = 0x80;\n } else if (firstByte <= 0xbf) {\n extraBytes = 1;\n mask = 0x40;\n } else if (firstByte <= 0xdf) {\n extraBytes = 2;\n mask = 0x20;\n } else if (firstByte <= 0xef) {\n extraBytes = 3;\n mask = 0x10;\n } else if (firstByte <= 0xf7) {\n extraBytes = 4;\n mask = 0x08;\n } else if (firstByte <= 0xfb) {\n extraBytes = 5;\n mask = 0x04;\n } else if (firstByte <= 0xfd) {\n extraBytes = 6;\n mask = 0x02;\n } else {\n // 0xFE\n extraBytes = 7;\n mask = 0x01;\n }\n\n // Get high part from first byte (bits below the length indicator)\n var highPart = firstByte & (mask - 1);\n\n // Read extra bytes as LITTLE-ENDIAN\n var value = 0;\n for (var i = 0; i < extraBytes; i++) {\n value += buf[offset + 1 + i] * 256 ** i;\n }\n\n // Combine: value + (highPart << (extraBytes * 8))\n value += highPart * 256 ** extraBytes;\n\n return {\n value: value,\n bytesRead: 1 + extraBytes,\n };\n}\n\n/**\n * Read a raw 64-bit little-endian number (used in some fixed-size fields)\n * @param buf - Buffer containing the number\n * @param offset - Offset to start reading from\n * @returns The number value\n */\nexport function readRawNumber(buf: Buffer, offset: number): number {\n return readUInt64LE(buf, offset);\n}\n\n/**\n * Calculate the encoded size of a number\n * @param value - The number to encode\n * @returns Number of bytes needed to encode the value\n */\nexport function encodedSize(value: number): number {\n if (value < 0x80) return 1; // 7 bits\n if (value < 0x4000) return 2; // 14 bits\n if (value < 0x200000) return 3; // 21 bits\n if (value < 0x10000000) return 4; // 28 bits\n if (value < 0x800000000) return 5; // 35 bits\n if (value < 0x40000000000) return 6; // 42 bits\n if (value < 0x2000000000000) return 7; // 49 bits\n // 2^56 = 72057594037927936 (use calculated value to avoid precision loss)\n if (value < 72057594037927936) return 8; // 56 bits\n return 9; // 64 bits\n}\n\n/**\n * Read a boolean encoded as a single byte\n * @param buf - Buffer to read from\n * @param offset - Offset to read from\n * @returns true if byte is non-zero\n */\nexport function readBoolean(buf: Buffer, offset: number): boolean {\n return buf[offset] !== 0;\n}\n\n/**\n * Read a \"defined\" bitmask for an array of items.\n * Used when some items in a list have optional values.\n *\n * Format: If \"allDefined\" byte is 0, a bitmask follows indicating which items have values.\n * If \"allDefined\" byte is non-zero, all items are defined.\n *\n * @param buf - Buffer to read from\n * @param offset - Offset to start reading\n * @param count - Number of items\n * @returns Object with defined array and bytes consumed\n */\nexport function readDefinedVector(buf: Buffer, offset: number, count: number): { defined: boolean[]; bytesRead: number } {\n var allDefined = buf[offset] !== 0;\n var bytesRead = 1;\n var defined: boolean[] = [];\n\n if (allDefined) {\n // All items are defined\n for (var i = 0; i < count; i++) {\n defined.push(true);\n }\n } else {\n // Read bitmask\n var bitsNeeded = count;\n var bytesNeeded = Math.ceil(bitsNeeded / 8);\n\n for (var byteIdx = 0; byteIdx < bytesNeeded; byteIdx++) {\n var byte = buf[offset + 1 + byteIdx];\n for (var bit = 7; bit >= 0 && defined.length < count; bit--) {\n defined.push((byte & (1 << bit)) !== 0);\n }\n }\n bytesRead += bytesNeeded;\n }\n\n return { defined: defined, bytesRead: bytesRead };\n}\n\n/**\n * Read an array of variable-length numbers\n * @param buf - Buffer to read from\n * @param offset - Offset to start reading\n * @param count - Number of items to read\n * @returns Object with values array and bytes consumed\n */\nexport function readNumberArray(buf: Buffer, offset: number, count: number): { values: number[]; bytesRead: number } {\n var values: number[] = [];\n var totalBytesRead = 0;\n\n for (var i = 0; i < count; i++) {\n var result = readNumber(buf, offset + totalBytesRead);\n values.push(result.value);\n totalBytesRead += result.bytesRead;\n }\n\n return { values: values, bytesRead: totalBytesRead };\n}\n"],"names":["encodedSize","readBoolean","readDefinedVector","readNumber","readNumberArray","readRawNumber","buf","offset","firstByte","value","readUInt64LE","bytesRead","extraBytes","mask","highPart","i","count","allDefined","defined","push","bitsNeeded","bytesNeeded","Math","ceil","byteIdx","byte","bit","length","values","totalBytesRead","result"],"mappings":"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"}
@@ -147,18 +147,65 @@ 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
+ }
161
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
+ }
205
+ }
206
+ }
207
+ if (decompressedHeader === null) {
208
+ throw (0, _constantsts.createCodedError)('Failed to decompress header - could not find valid LZMA data', _constantsts.ErrorCode.CORRUPT_HEADER);
162
209
  }
163
210
  // Now parse the decompressed header
164
211
  // It should start with kHeader
@@ -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 { 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 // 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 * 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","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","packStreamIndex","packedStreams","k","packSizes","packedData","l","coderInfo","lastSlash","lastIndexOf","lastBackslash","lastSep"],"mappings":"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"}
@@ -23,6 +23,7 @@ export interface LockT {
23
23
  err?: Error;
24
24
  fd?: number;
25
25
  tempPath: string;
26
+ sourceStream?: NodeJS.ReadableStream;
26
27
  retain: () => void;
27
28
  release: () => void;
28
29
  }
@@ -23,6 +23,7 @@ export interface LockT {
23
23
  err?: Error;
24
24
  fd?: number;
25
25
  tempPath: string;
26
+ sourceStream?: NodeJS.ReadableStream;
26
27
  retain: () => void;
27
28
  release: () => void;
28
29
  }
@@ -1 +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"}
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 sourceStream?: NodeJS.ReadableStream;\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"}