Latest Threat Research:SANDWORM_MODE: Shai-Hulud-Style npm Worm Hijacks CI Workflows and Poisons AI Toolchains.Details
Socket
Book a DemoInstallSign in
Socket

7z-iterator

Package Overview
Dependencies
Maintainers
1
Versions
48
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

7z-iterator - npm Package Compare versions

Comparing version
2.2.0
to
2.2.1
+1
-1
dist/cjs/compat.js.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/compat.ts"],"sourcesContent":["/**\n * Compatibility Layer for Node.js 0.8+\n * Local to this package - contains only needed functions.\n */\nimport os from 'os';\n\nexport function tmpdir(): string {\n return typeof os.tmpdir === 'function' ? os.tmpdir() : require('os-shim').tmpdir();\n}\n"],"names":["tmpdir","os","require"],"mappings":"AAAA;;;CAGC;;;;+BAGeA;;;eAAAA;;;yDAFD;;;;;;AAER,SAASA;IACd,OAAO,OAAOC,WAAE,CAACD,MAAM,KAAK,aAAaC,WAAE,CAACD,MAAM,KAAKE,QAAQ,WAAWF,MAAM;AAClF"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/compat.ts"],"sourcesContent":["/**\n * Compatibility Layer for Node.js 0.8+\n * Local to this package - contains only needed functions.\n */\nimport os from 'os';\n\nexport function tmpdir(): string {\n return typeof os.tmpdir === 'function' ? os.tmpdir() : require('os-shim').tmpdir();\n}\n"],"names":["tmpdir","os","require"],"mappings":"AAAA;;;CAGC;;;;+BAGeA;;;eAAAA;;;yDAFD;;;;;;AAER,SAASA;IACd,OAAO,OAAOC,WAAE,CAACD,MAAM,KAAK,aAAaC,WAAE,CAACD,MAAM,KAAKE,QAAQ,WAAWF,MAAM;AAClF"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/FileEntry.ts"],"sourcesContent":["/**\n * FileEntry for 7z archives\n *\n * Wraps a lazy stream - decompression happens when the stream is read.\n * API consistent with zip-iterator and tar-iterator.\n */\n\nimport once from 'call-once-fn';\nimport { type FileAttributes, FileEntry, type Lock, type NoParamCallback, waitForAccess } from 'extract-base-iterator';\nimport fs from 'graceful-fs';\nimport oo from 'on-one';\nimport type { ExtractOptions } from './types.ts';\n\nexport default class SevenZipFileEntry extends FileEntry {\n private lock: Lock;\n private stream: NodeJS.ReadableStream;\n\n /**\n * Whether this entry's folder supports streaming decompression.\n */\n readonly _canStream: boolean;\n\n constructor(attributes: FileAttributes, stream: NodeJS.ReadableStream, lock: Lock, canStream: boolean) {\n super(attributes);\n this.stream = stream;\n this.lock = lock;\n this.lock.retain();\n this._canStream = canStream;\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n return FileEntry.prototype.create.call(this, dest, options, (err?: Error) => {\n callback(err);\n if (this.lock) {\n this.lock.release();\n this.lock = null;\n }\n });\n }\n return new Promise((resolve, reject) =>\n this.create(dest, options, (err?: Error, done?: boolean) => {\n err ? reject(err) : resolve(done);\n })\n );\n }\n\n _writeFile(fullPath: string, _options: ExtractOptions, callback: NoParamCallback): void {\n if (!this.stream) {\n callback(new Error('7z FileEntry missing stream. Check for calling create multiple times'));\n return;\n }\n\n const stream = this.stream;\n this.stream = null; // Prevent reuse\n\n // Use once since errors can come from either stream\n const cb = once((err?: Error) => {\n err ? callback(err) : waitForAccess(fullPath, callback);\n });\n\n try {\n const writeStream = fs.createWriteStream(fullPath);\n\n // Listen for errors on source stream (errors don't propagate through pipe)\n stream.on('error', (streamErr: Error) => {\n // Destroy the write stream on source error.\n // On Node 0.8, destroy() emits 'close' before 'error'. Since on-one is listening\n // for ['error', 'close', 'finish'], it catches 'close' first, calls our callback,\n // and removes ALL listeners - including the 'error' listener. The subsequent EBADF\n // error then fires with no handler, causing an uncaught exception.\n // Adding a no-op error handler ensures there's always a listener for any error.\n const ws = writeStream as fs.WriteStream & { destroy?: () => void };\n writeStream.on('error', () => {});\n if (typeof ws.destroy === 'function') ws.destroy();\n cb(streamErr);\n });\n\n // Pipe and listen for write stream completion/errors\n stream.pipe(writeStream);\n oo(writeStream, ['error', 'close', 'finish'], cb);\n } catch (pipeErr) {\n cb(pipeErr);\n }\n }\n\n destroy() {\n FileEntry.prototype.destroy.call(this);\n if (this.stream) {\n // Use destroy() to prevent decompression (our stream has custom destroy that sets destroyed flag)\n // Fallback to resume() for older Node versions without destroy()\n const s = this.stream as NodeJS.ReadableStream & { destroy?: () => void };\n if (typeof s.destroy === 'function') {\n s.destroy();\n }\n this.stream = null;\n }\n if (this.lock) {\n this.lock.release();\n this.lock = null;\n }\n }\n}\n"],"names":["SevenZipFileEntry","attributes","stream","lock","canStream","retain","_canStream","create","dest","options","callback","FileEntry","prototype","call","err","release","Promise","resolve","reject","done","_writeFile","fullPath","_options","Error","cb","once","waitForAccess","writeStream","fs","createWriteStream","on","streamErr","ws","destroy","pipe","oo","pipeErr","s"],"mappings":"AAAA;;;;;CAKC;;;;;;;eAQoBA;;;iEANJ;mCAC8E;iEAChF;4DACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,IAAA,AAAMA,kCAAN;;cAAMA;aAAAA,kBASPC,UAA0B,EAAEC,MAA6B,EAAEC,IAAU,EAAEC,SAAkB;gCATlFJ;;gBAUjB,kBAViBA;YAUXC;;QACN,MAAKC,MAAM,GAAGA;QACd,MAAKC,IAAI,GAAGA;QACZ,MAAKA,IAAI,CAACE,MAAM;QAChB,MAAKC,UAAU,GAAGF;;;iBAdDJ;IAoBnBO,OAAAA,MAkBC,GAlBDA,SAAAA,OAAOC,IAAY,EAAEC,OAA0C,EAAEC,QAA0B;;QACzFA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;QACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,IAAI,OAAOC,aAAa,YAAY;YAClC,OAAOC,8BAAS,CAACC,SAAS,CAACL,MAAM,CAACM,IAAI,CAAC,IAAI,EAAEL,MAAMC,SAAS,SAACK;gBAC3DJ,SAASI;gBACT,IAAI,MAAKX,IAAI,EAAE;oBACb,MAAKA,IAAI,CAACY,OAAO;oBACjB,MAAKZ,IAAI,GAAG;gBACd;YACF;QACF;QACA,OAAO,IAAIa,QAAQ,SAACC,SAASC;mBAC3B,MAAKX,MAAM,CAACC,MAAMC,SAAS,SAACK,KAAaK;gBACvCL,MAAMI,OAAOJ,OAAOG,QAAQE;YAC9B;;IAEJ;IAEAC,OAAAA,UAqCC,GArCDA,SAAAA,WAAWC,QAAgB,EAAEC,QAAwB,EAAEZ,QAAyB;QAC9E,IAAI,CAAC,IAAI,CAACR,MAAM,EAAE;YAChBQ,SAAS,IAAIa,MAAM;YACnB;QACF;QAEA,IAAMrB,SAAS,IAAI,CAACA,MAAM;QAC1B,IAAI,CAACA,MAAM,GAAG,MAAM,gBAAgB;QAEpC,oDAAoD;QACpD,IAAMsB,KAAKC,IAAAA,mBAAI,EAAC,SAACX;YACfA,MAAMJ,SAASI,OAAOY,IAAAA,kCAAa,EAACL,UAAUX;QAChD;QAEA,IAAI;YACF,IAAMiB,cAAcC,mBAAE,CAACC,iBAAiB,CAACR;YAEzC,2EAA2E;YAC3EnB,OAAO4B,EAAE,CAAC,SAAS,SAACC;gBAClB,4CAA4C;gBAC5C,iFAAiF;gBACjF,kFAAkF;gBAClF,mFAAmF;gBACnF,mEAAmE;gBACnE,gFAAgF;gBAChF,IAAMC,KAAKL;gBACXA,YAAYG,EAAE,CAAC,SAAS,YAAO;gBAC/B,IAAI,OAAOE,GAAGC,OAAO,KAAK,YAAYD,GAAGC,OAAO;gBAChDT,GAAGO;YACL;YAEA,qDAAqD;YACrD7B,OAAOgC,IAAI,CAACP;YACZQ,IAAAA,cAAE,EAACR,aAAa;gBAAC;gBAAS;gBAAS;aAAS,EAAEH;QAChD,EAAE,OAAOY,SAAS;YAChBZ,GAAGY;QACL;IACF;IAEAH,OAAAA,OAeC,GAfDA,SAAAA;QACEtB,8BAAS,CAACC,SAAS,CAACqB,OAAO,CAACpB,IAAI,CAAC,IAAI;QACrC,IAAI,IAAI,CAACX,MAAM,EAAE;YACf,kGAAkG;YAClG,iEAAiE;YACjE,IAAMmC,IAAI,IAAI,CAACnC,MAAM;YACrB,IAAI,OAAOmC,EAAEJ,OAAO,KAAK,YAAY;gBACnCI,EAAEJ,OAAO;YACX;YACA,IAAI,CAAC/B,MAAM,GAAG;QAChB;QACA,IAAI,IAAI,CAACC,IAAI,EAAE;YACb,IAAI,CAACA,IAAI,CAACY,OAAO;YACjB,IAAI,CAACZ,IAAI,GAAG;QACd;IACF;WA9FmBH;EAA0BW,8BAAS"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/FileEntry.ts"],"sourcesContent":["/**\n * FileEntry for 7z archives\n *\n * Wraps a lazy stream - decompression happens when the stream is read.\n * API consistent with zip-iterator and tar-iterator.\n */\n\nimport once from 'call-once-fn';\nimport { type FileAttributes, FileEntry, type Lock, type NoParamCallback, waitForAccess } from 'extract-base-iterator';\nimport fs from 'graceful-fs';\nimport oo from 'on-one';\nimport type { ExtractOptions } from './types.ts';\n\nexport default class SevenZipFileEntry extends FileEntry {\n private lock: Lock;\n private stream: NodeJS.ReadableStream;\n\n /**\n * Whether this entry's folder supports streaming decompression.\n */\n readonly _canStream: boolean;\n\n constructor(attributes: FileAttributes, stream: NodeJS.ReadableStream, lock: Lock, canStream: boolean) {\n super(attributes);\n this.stream = stream;\n this.lock = lock;\n this.lock.retain();\n this._canStream = canStream;\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n return FileEntry.prototype.create.call(this, dest, options, (err?: Error) => {\n callback(err);\n if (this.lock) {\n this.lock.release();\n this.lock = null;\n }\n });\n }\n return new Promise((resolve, reject) =>\n this.create(dest, options, (err?: Error, done?: boolean) => {\n err ? reject(err) : resolve(done);\n })\n );\n }\n\n _writeFile(fullPath: string, _options: ExtractOptions, callback: NoParamCallback): void {\n if (!this.stream) {\n callback(new Error('7z FileEntry missing stream. Check for calling create multiple times'));\n return;\n }\n\n const stream = this.stream;\n this.stream = null; // Prevent reuse\n\n // Use once since errors can come from either stream\n const cb = once((err?: Error) => {\n err ? callback(err) : waitForAccess(fullPath, callback);\n });\n\n try {\n const writeStream = fs.createWriteStream(fullPath);\n\n // Listen for errors on source stream (errors don't propagate through pipe)\n stream.on('error', (streamErr: Error) => {\n // Destroy the write stream on source error.\n // On Node 0.8, destroy() emits 'close' before 'error'. Since on-one is listening\n // for ['error', 'close', 'finish'], it catches 'close' first, calls our callback,\n // and removes ALL listeners - including the 'error' listener. The subsequent EBADF\n // error then fires with no handler, causing an uncaught exception.\n // Adding a no-op error handler ensures there's always a listener for any error.\n const ws = writeStream as fs.WriteStream & { destroy?: () => void };\n writeStream.on('error', () => {});\n if (typeof ws.destroy === 'function') ws.destroy();\n cb(streamErr);\n });\n\n // Pipe and listen for write stream completion/errors\n stream.pipe(writeStream);\n oo(writeStream, ['error', 'close', 'finish'], cb);\n } catch (pipeErr) {\n cb(pipeErr);\n }\n }\n\n destroy() {\n FileEntry.prototype.destroy.call(this);\n if (this.stream) {\n // Use destroy() to prevent decompression (our stream has custom destroy that sets destroyed flag)\n // Fallback to resume() for older Node versions without destroy()\n const s = this.stream as NodeJS.ReadableStream & { destroy?: () => void };\n if (typeof s.destroy === 'function') {\n s.destroy();\n }\n this.stream = null;\n }\n if (this.lock) {\n this.lock.release();\n this.lock = null;\n }\n }\n}\n"],"names":["SevenZipFileEntry","attributes","stream","lock","canStream","retain","_canStream","create","dest","options","callback","FileEntry","prototype","call","err","release","Promise","resolve","reject","done","_writeFile","fullPath","_options","Error","cb","once","waitForAccess","writeStream","fs","createWriteStream","on","streamErr","ws","destroy","pipe","oo","pipeErr","s"],"mappings":"AAAA;;;;;CAKC;;;;;;;eAQoBA;;;iEANJ;mCAC8E;iEAChF;4DACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,IAAA,AAAMA,kCAAN;;cAAMA;aAAAA,kBASPC,UAA0B,EAAEC,MAA6B,EAAEC,IAAU,EAAEC,SAAkB;gCATlFJ;;gBAUjB,kBAViBA;YAUXC;;QACN,MAAKC,MAAM,GAAGA;QACd,MAAKC,IAAI,GAAGA;QACZ,MAAKA,IAAI,CAACE,MAAM;QAChB,MAAKC,UAAU,GAAGF;;;iBAdDJ;IAoBnBO,OAAAA,MAkBC,GAlBDA,SAAAA,OAAOC,IAAY,EAAEC,OAA0C,EAAEC,QAA0B;;QACzFA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;QACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,IAAI,OAAOC,aAAa,YAAY;YAClC,OAAOC,8BAAS,CAACC,SAAS,CAACL,MAAM,CAACM,IAAI,CAAC,IAAI,EAAEL,MAAMC,SAAS,SAACK;gBAC3DJ,SAASI;gBACT,IAAI,MAAKX,IAAI,EAAE;oBACb,MAAKA,IAAI,CAACY,OAAO;oBACjB,MAAKZ,IAAI,GAAG;gBACd;YACF;QACF;QACA,OAAO,IAAIa,QAAQ,SAACC,SAASC;mBAC3B,MAAKX,MAAM,CAACC,MAAMC,SAAS,SAACK,KAAaK;gBACvCL,MAAMI,OAAOJ,OAAOG,QAAQE;YAC9B;;IAEJ;IAEAC,OAAAA,UAqCC,GArCDA,SAAAA,WAAWC,QAAgB,EAAEC,QAAwB,EAAEZ,QAAyB;QAC9E,IAAI,CAAC,IAAI,CAACR,MAAM,EAAE;YAChBQ,SAAS,IAAIa,MAAM;YACnB;QACF;QAEA,IAAMrB,SAAS,IAAI,CAACA,MAAM;QAC1B,IAAI,CAACA,MAAM,GAAG,MAAM,gBAAgB;QAEpC,oDAAoD;QACpD,IAAMsB,KAAKC,IAAAA,mBAAI,EAAC,SAACX;YACfA,MAAMJ,SAASI,OAAOY,IAAAA,kCAAa,EAACL,UAAUX;QAChD;QAEA,IAAI;YACF,IAAMiB,cAAcC,mBAAE,CAACC,iBAAiB,CAACR;YAEzC,2EAA2E;YAC3EnB,OAAO4B,EAAE,CAAC,SAAS,SAACC;gBAClB,4CAA4C;gBAC5C,iFAAiF;gBACjF,kFAAkF;gBAClF,mFAAmF;gBACnF,mEAAmE;gBACnE,gFAAgF;gBAChF,IAAMC,KAAKL;gBACXA,YAAYG,EAAE,CAAC,SAAS,YAAO;gBAC/B,IAAI,OAAOE,GAAGC,OAAO,KAAK,YAAYD,GAAGC,OAAO;gBAChDT,GAAGO;YACL;YAEA,qDAAqD;YACrD7B,OAAOgC,IAAI,CAACP;YACZQ,IAAAA,cAAE,EAACR,aAAa;gBAAC;gBAAS;gBAAS;aAAS,EAAEH;QAChD,EAAE,OAAOY,SAAS;YAChBZ,GAAGY;QACL;IACF;IAEAH,OAAAA,OAeC,GAfDA,SAAAA;QACEtB,8BAAS,CAACC,SAAS,CAACqB,OAAO,CAACpB,IAAI,CAAC,IAAI;QACrC,IAAI,IAAI,CAACX,MAAM,EAAE;YACf,kGAAkG;YAClG,iEAAiE;YACjE,IAAMmC,IAAI,IAAI,CAACnC,MAAM;YACrB,IAAI,OAAOmC,EAAEJ,OAAO,KAAK,YAAY;gBACnCI,EAAEJ,OAAO;YACX;YACA,IAAI,CAAC/B,MAAM,GAAG;QAChB;QACA,IAAI,IAAI,CAACC,IAAI,EAAE;YACb,IAAI,CAACA,IAAI,CAACY,OAAO;YACjB,IAAI,CAACZ,IAAI,GAAG;QACd;IACF;WA9FmBH;EAA0BW,8BAAS"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/index.ts"],"sourcesContent":["// 7z-iterator - high-level 7z archive iterator\n\nexport * from './FileEntry.ts';\nexport * from './nextEntry.ts';\nexport { default } from './SevenZipIterator.ts';\nexport * from './sevenz/index.ts';\nexport * from './types.ts';\n"],"names":["default"],"mappings":"AAAA,+CAA+C;;;;;+BAItCA;;;eAAAA,2BAAO;;;qBAFF;qBACA;yEACU;qBACV;qBACA"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/index.ts"],"sourcesContent":["// 7z-iterator - high-level 7z archive iterator\n\nexport * from './FileEntry.ts';\nexport * from './nextEntry.ts';\nexport { default } from './SevenZipIterator.ts';\nexport * from './sevenz/index.ts';\nexport * from './types.ts';\n"],"names":["default"],"mappings":"AAAA,+CAA+C;;;;;+BAItCA;;;eAAAA,2BAAO;;;qBAFF;qBACA;yEACU;qBACV;qBACA"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/lib/defer.ts"],"sourcesContent":["// Yield to I/O: runs after pending I/O callbacks complete\n// setImmediate (Node 0.10+) or setTimeout fallback (Node 0.8)\n// Use this when other code may have scheduled I/O that must run first\n// For \"avoid Zalgo\" (just need async), use process.nextTick instead\nexport const defer: (fn: () => void) => void = typeof setImmediate !== 'undefined' ? setImmediate : (fn) => setTimeout(fn, 0);\n"],"names":["defer","setImmediate","fn","setTimeout"],"mappings":"AAAA,0DAA0D;AAC1D,8DAA8D;AAC9D,sEAAsE;AACtE,oEAAoE;;;;;+BACvDA;;;eAAAA;;;AAAN,IAAMA,QAAkC,OAAOC,iBAAiB,cAAcA,eAAe,SAACC;WAAOC,WAAWD,IAAI"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/lib/defer.ts"],"sourcesContent":["// Yield to I/O: runs after pending I/O callbacks complete\n// setImmediate (Node 0.10+) or setTimeout fallback (Node 0.8)\n// Use this when other code may have scheduled I/O that must run first\n// For \"avoid Zalgo\" (just need async), use process.nextTick instead\nexport const defer: (fn: () => void) => void = typeof setImmediate !== 'undefined' ? setImmediate : (fn) => setTimeout(fn, 0);\n"],"names":["defer","setImmediate","fn","setTimeout"],"mappings":"AAAA,0DAA0D;AAC1D,8DAA8D;AAC9D,sEAAsE;AACtE,oEAAoE;;;;;+BACvDA;;;eAAAA;;;AAAN,IAAMA,QAAkC,OAAOC,iBAAiB,cAAcA,eAAe,SAACC;WAAOC,WAAWD,IAAI"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/lib/streamToSource.ts"],"sourcesContent":["// Stream to source conversion: writes stream to temp file for random access\nimport once from 'call-once-fn';\nimport { bufferFrom } from 'extract-base-iterator';\nimport fs from 'graceful-fs';\nimport mkdirp from 'mkdirp-classic';\nimport oo from 'on-one';\nimport path from 'path';\nimport { FileSource } from '../sevenz/SevenZipParser.ts';\n\nexport interface StreamToSourceOptions {\n tempPath: string;\n}\n\nexport interface SourceResult {\n source: FileSource;\n fd: number; // Caller must close\n tempPath: string; // Caller must clean up\n}\n\nexport type Callback = (error?: Error, result?: SourceResult) => void;\n\n/**\n * Convert a stream to a FileSource by writing to temp file\n *\n * 7z format requires random access for header parsing, so temp file is necessary for streams.\n * Writes directly to temp file for predictable O(1) memory usage during stream consumption.\n */\nexport default function streamToSource(stream: NodeJS.ReadableStream, options: StreamToSourceOptions, callback: Callback): void {\n const tempPath = options.tempPath;\n\n const end = once(callback);\n\n mkdirp.sync(path.dirname(tempPath));\n const writeStream = fs.createWriteStream(tempPath);\n\n function onData(chunk: Buffer | string): void {\n const buf = typeof chunk === 'string' ? bufferFrom(chunk) : chunk;\n writeStream.write(buf);\n }\n\n function onEnd(): void {\n writeStream.end(() => {\n fs.open(tempPath, 'r', (err, fd) => {\n if (err) return end(err);\n fs.stat(tempPath, (statErr, stats) => {\n if (statErr) {\n fs.closeSync(fd);\n return end(statErr);\n }\n end(null, {\n source: new FileSource(fd, stats.size),\n fd: fd,\n tempPath: tempPath,\n });\n });\n });\n });\n }\n\n function onError(err: Error): void {\n writeStream.end();\n end(err);\n }\n\n stream.on('data', onData);\n oo(stream, ['error'], onError);\n oo(stream, ['end', 'close', 'finish'], onEnd);\n}\n"],"names":["streamToSource","stream","options","callback","tempPath","end","once","mkdirp","sync","path","dirname","writeStream","fs","createWriteStream","onData","chunk","buf","bufferFrom","write","onEnd","open","err","fd","stat","statErr","stats","closeSync","source","FileSource","size","onError","on","oo"],"mappings":"AAAA,4EAA4E;;;;;+BAqB5E;;;;;CAKC,GACD;;;eAAwBA;;;iEA1BP;mCACU;iEACZ;oEACI;4DACJ;2DACE;gCACU;;;;;;AAoBZ,SAASA,eAAeC,MAA6B,EAAEC,OAA8B,EAAEC,QAAkB;IACtH,IAAMC,WAAWF,QAAQE,QAAQ;IAEjC,IAAMC,MAAMC,IAAAA,mBAAI,EAACH;IAEjBI,sBAAM,CAACC,IAAI,CAACC,aAAI,CAACC,OAAO,CAACN;IACzB,IAAMO,cAAcC,mBAAE,CAACC,iBAAiB,CAACT;IAEzC,SAASU,OAAOC,KAAsB;QACpC,IAAMC,MAAM,OAAOD,UAAU,WAAWE,IAAAA,+BAAU,EAACF,SAASA;QAC5DJ,YAAYO,KAAK,CAACF;IACpB;IAEA,SAASG;QACPR,YAAYN,GAAG,CAAC;YACdO,mBAAE,CAACQ,IAAI,CAAChB,UAAU,KAAK,SAACiB,KAAKC;gBAC3B,IAAID,KAAK,OAAOhB,IAAIgB;gBACpBT,mBAAE,CAACW,IAAI,CAACnB,UAAU,SAACoB,SAASC;oBAC1B,IAAID,SAAS;wBACXZ,mBAAE,CAACc,SAAS,CAACJ;wBACb,OAAOjB,IAAImB;oBACb;oBACAnB,IAAI,MAAM;wBACRsB,QAAQ,IAAIC,4BAAU,CAACN,IAAIG,MAAMI,IAAI;wBACrCP,IAAIA;wBACJlB,UAAUA;oBACZ;gBACF;YACF;QACF;IACF;IAEA,SAAS0B,QAAQT,GAAU;QACzBV,YAAYN,GAAG;QACfA,IAAIgB;IACN;IAEApB,OAAO8B,EAAE,CAAC,QAAQjB;IAClBkB,IAAAA,cAAE,EAAC/B,QAAQ;QAAC;KAAQ,EAAE6B;IACtBE,IAAAA,cAAE,EAAC/B,QAAQ;QAAC;QAAO;QAAS;KAAS,EAAEkB;AACzC"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/lib/streamToSource.ts"],"sourcesContent":["// Stream to source conversion: writes stream to temp file for random access\nimport once from 'call-once-fn';\nimport { bufferFrom } from 'extract-base-iterator';\nimport fs from 'graceful-fs';\nimport mkdirp from 'mkdirp-classic';\nimport oo from 'on-one';\nimport path from 'path';\nimport { FileSource } from '../sevenz/SevenZipParser.ts';\n\nexport interface StreamToSourceOptions {\n tempPath: string;\n}\n\nexport interface SourceResult {\n source: FileSource;\n fd: number; // Caller must close\n tempPath: string; // Caller must clean up\n}\n\nexport type Callback = (error?: Error, result?: SourceResult) => void;\n\n/**\n * Convert a stream to a FileSource by writing to temp file\n *\n * 7z format requires random access for header parsing, so temp file is necessary for streams.\n * Writes directly to temp file for predictable O(1) memory usage during stream consumption.\n */\nexport default function streamToSource(stream: NodeJS.ReadableStream, options: StreamToSourceOptions, callback: Callback): void {\n const tempPath = options.tempPath;\n\n const end = once(callback);\n\n mkdirp.sync(path.dirname(tempPath));\n const writeStream = fs.createWriteStream(tempPath);\n\n function onData(chunk: Buffer | string): void {\n const buf = typeof chunk === 'string' ? bufferFrom(chunk) : chunk;\n writeStream.write(buf);\n }\n\n function onEnd(): void {\n writeStream.end(() => {\n fs.open(tempPath, 'r', (err, fd) => {\n if (err) return end(err);\n fs.stat(tempPath, (statErr, stats) => {\n if (statErr) {\n fs.closeSync(fd);\n return end(statErr);\n }\n end(null, {\n source: new FileSource(fd, stats.size),\n fd: fd,\n tempPath: tempPath,\n });\n });\n });\n });\n }\n\n function onError(err: Error): void {\n writeStream.end();\n end(err);\n }\n\n stream.on('data', onData);\n oo(stream, ['error'], onError);\n oo(stream, ['end', 'close', 'finish'], onEnd);\n}\n"],"names":["streamToSource","stream","options","callback","tempPath","end","once","mkdirp","sync","path","dirname","writeStream","fs","createWriteStream","onData","chunk","buf","bufferFrom","write","onEnd","open","err","fd","stat","statErr","stats","closeSync","source","FileSource","size","onError","on","oo"],"mappings":"AAAA,4EAA4E;;;;;+BAqB5E;;;;;CAKC,GACD;;;eAAwBA;;;iEA1BP;mCACU;iEACZ;oEACI;4DACJ;2DACE;gCACU;;;;;;AAoBZ,SAASA,eAAeC,MAA6B,EAAEC,OAA8B,EAAEC,QAAkB;IACtH,IAAMC,WAAWF,QAAQE,QAAQ;IAEjC,IAAMC,MAAMC,IAAAA,mBAAI,EAACH;IAEjBI,sBAAM,CAACC,IAAI,CAACC,aAAI,CAACC,OAAO,CAACN;IACzB,IAAMO,cAAcC,mBAAE,CAACC,iBAAiB,CAACT;IAEzC,SAASU,OAAOC,KAAsB;QACpC,IAAMC,MAAM,OAAOD,UAAU,WAAWE,IAAAA,+BAAU,EAACF,SAASA;QAC5DJ,YAAYO,KAAK,CAACF;IACpB;IAEA,SAASG;QACPR,YAAYN,GAAG,CAAC;YACdO,mBAAE,CAACQ,IAAI,CAAChB,UAAU,KAAK,SAACiB,KAAKC;gBAC3B,IAAID,KAAK,OAAOhB,IAAIgB;gBACpBT,mBAAE,CAACW,IAAI,CAACnB,UAAU,SAACoB,SAASC;oBAC1B,IAAID,SAAS;wBACXZ,mBAAE,CAACc,SAAS,CAACJ;wBACb,OAAOjB,IAAImB;oBACb;oBACAnB,IAAI,MAAM;wBACRsB,QAAQ,IAAIC,4BAAU,CAACN,IAAIG,MAAMI,IAAI;wBACrCP,IAAIA;wBACJlB,UAAUA;oBACZ;gBACF;YACF;QACF;IACF;IAEA,SAAS0B,QAAQT,GAAU;QACzBV,YAAYN,GAAG;QACfA,IAAIgB;IACN;IAEApB,OAAO8B,EAAE,CAAC,QAAQjB;IAClBkB,IAAAA,cAAE,EAAC/B,QAAQ;QAAC;KAAQ,EAAE6B;IACtBE,IAAAA,cAAE,EAAC/B,QAAQ;QAAC;QAAO;QAAS;KAAS,EAAEkB;AACzC"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/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 path from 'path';\nimport FileEntry from './FileEntry.ts';\nimport type SevenZipIterator from './SevenZipIterator.ts';\nimport type { SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.ts';\nimport type { Entry, EntryCallback } from './types.ts';\n\nexport type NextCallback = (error?: Error, entry?: Entry) => void;\n\n/** @internal */\ninterface InternalIterator {\n next(): SevenZipEntry | null;\n getParser(): SevenZipParser;\n}\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): void {\n const internalIter = iterator._iterator as InternalIterator | null;\n if (!internalIter) {\n callback(new Error('iterator missing'));\n return;\n }\n\n let entry: SevenZipEntry | null = null;\n entry = internalIter.next();\n\n const 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 const type = entry.type;\n\n // Default modes (decimal values for Node 0.8 compatibility)\n // 0o755 = 493, 0o644 = 420\n const defaultMode = type === 'directory' ? 493 : 420;\n\n // Build attributes from 7z entry\n // mtime must be timestamp (number) for FileAttributes compatibility\n const mtimeDate = entry.mtime || new Date();\n const attributes: EntryAttributesBuilder = {\n path: entry.path.split(path.sep).filter(Boolean).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 const parser = internalIter.getParser();\n const stream = parser.getEntryStream(entry);\n\n const chunks: Buffer[] = [];\n\n stream.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n stream.on('end', () => {\n const linkpath = Buffer.concat(chunks).toString('utf8');\n\n const 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', (streamErr: Error) => {\n nextCallback(streamErr);\n });\n return;\n }\n\n case 'file': {\n attributes.type = 'file';\n attributes.size = entry.size;\n const parser = internalIter.getParser();\n\n const stream = parser.getEntryStream(entry);\n return nextCallback(null, new FileEntry(attributes as FileAttributes, stream, iterator.lock, entry._canStream));\n }\n }\n\n return callback(new Error(`Unrecognized entry type: ${type}`));\n}\n"],"names":["nextEntry","iterator","callback","internalIter","_iterator","Error","entry","next","nextCallback","once","err","push","done","value","lock","isDone","isAntiFile","type","defaultMode","mtimeDate","mtime","Date","attributes","path","split","sep","filter","Boolean","join","basename","name","getTime","mode","undefined","DirectoryEntry","parser","getParser","stream","getEntryStream","chunks","on","chunk","linkpath","Buffer","concat","toString","linkAttributes","SymbolicLinkEntry","streamErr","size","FileEntry","_canStream"],"mappings":";;;;+BA2BA;;;eAAwBA;;;iEA3BP;mCACqG;2DACrG;kEACK;;;;;;AAwBP,SAASA,UAAcC,QAA0B,EAAEC,QAAuB;IACvF,IAAMC,eAAeF,SAASG,SAAS;IACvC,IAAI,CAACD,cAAc;QACjBD,SAAS,IAAIG,MAAM;QACnB;IACF;IAEA,IAAIC,QAA8B;IAClCA,QAAQH,aAAaI,IAAI;IAEzB,IAAMC,eAAeC,IAAAA,mBAAI,EAAC,SAACC,KAAaJ;QACtC,kBAAkB;QAClB,IAAIA,OAAOL,SAASU,IAAI,CAACX;QACzBU,MAAMR,SAASQ,OAAOR,SAAS,MAAMI,QAAQ;YAAEM,MAAM;YAAOC,OAAOP;QAAM,IAAI;YAAEM,MAAM;YAAMC,OAAO;QAAK;IACzG;IAEA,gEAAgE;IAChE,IAAI,CAACZ,SAASa,IAAI,IAAIb,SAASc,MAAM,MAAM,CAACT,OAAO,OAAOJ,SAAS,MAAM;QAAEU,MAAM;QAAMC,OAAO;IAAK;IAEnG,iEAAiE;IACjE,IAAIP,MAAMU,UAAU,EAAE;QACpBf,SAASU,IAAI,CAACX;QACd,OAAOE,SAAS,MAAM;IACxB;IAEA,4BAA4B;IAC5B,IAAMe,OAAOX,MAAMW,IAAI;IAEvB,4DAA4D;IAC5D,2BAA2B;IAC3B,IAAMC,cAAcD,SAAS,cAAc,MAAM;IAEjD,iCAAiC;IACjC,oEAAoE;IACpE,IAAME,YAAYb,MAAMc,KAAK,IAAI,IAAIC;IACrC,IAAMC,aAAqC;QACzCC,MAAMjB,MAAMiB,IAAI,CAACC,KAAK,CAACD,aAAI,CAACE,GAAG,EAAEC,MAAM,CAACC,SAASC,IAAI,CAACL,aAAI,CAACE,GAAG;QAC9DI,UAAUvB,MAAMwB,IAAI;QACpBV,OAAOD,UAAUY,OAAO;QACxBC,MAAM1B,MAAM0B,IAAI,KAAKC,YAAY3B,MAAM0B,IAAI,GAAGd;IAChD;IAEA,OAAQD;QACN,KAAK;YACHK,WAAWL,IAAI,GAAG;YAClB,OAAOT,aAAa,MAAM,IAAI0B,mCAAc,CAACZ;QAE/C,KAAK;YAAQ;gBACX,4DAA4D;gBAC5D,6DAA6D;gBAC7D,IAAMa,SAAShC,aAAaiC,SAAS;gBACrC,IAAMC,SAASF,OAAOG,cAAc,CAAChC;gBAErC,IAAMiC,SAAmB,EAAE;gBAE3BF,OAAOG,EAAE,CAAC,QAAQ,SAACC;oBACjBF,OAAO5B,IAAI,CAAC8B;gBACd;gBACAJ,OAAOG,EAAE,CAAC,OAAO;oBACf,IAAME,WAAWC,OAAOC,MAAM,CAACL,QAAQM,QAAQ,CAAC;oBAEhD,IAAMC,iBAAiC;wBACrCvB,MAAMD,WAAWC,IAAI;wBACrBH,OAAOE,WAAWF,KAAK;wBACvBY,MAAMV,WAAWU,IAAI;wBACrBU,UAAUA;oBACZ;oBAEAlC,aAAa,MAAM,IAAIuC,sCAAiB,CAACD;gBAC3C;gBACAT,OAAOG,EAAE,CAAC,SAAS,SAACQ;oBAClBxC,aAAawC;gBACf;gBACA;YACF;QAEA,KAAK;YAAQ;gBACX1B,WAAWL,IAAI,GAAG;gBAClBK,WAAW2B,IAAI,GAAG3C,MAAM2C,IAAI;gBAC5B,IAAMd,UAAShC,aAAaiC,SAAS;gBAErC,IAAMC,UAASF,QAAOG,cAAc,CAAChC;gBACrC,OAAOE,aAAa,MAAM,IAAI0C,oBAAS,CAAC5B,YAA8Be,SAAQpC,SAASa,IAAI,EAAER,MAAM6C,UAAU;YAC/G;IACF;IAEA,OAAOjD,SAAS,IAAIG,MAAM,AAAC,4BAAgC,OAALY;AACxD"}
{"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 path from 'path';\nimport FileEntry from './FileEntry.ts';\nimport type SevenZipIterator from './SevenZipIterator.ts';\nimport type { SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.ts';\nimport type { Entry, EntryCallback } from './types.ts';\n\nexport type NextCallback = (error?: Error, entry?: Entry) => void;\n\n/** @internal */\ninterface InternalIterator {\n next(): SevenZipEntry | null;\n getParser(): SevenZipParser;\n}\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): void {\n const internalIter = iterator._iterator as InternalIterator | null;\n if (!internalIter) {\n callback(new Error('iterator missing'));\n return;\n }\n\n let entry: SevenZipEntry | null = null;\n entry = internalIter.next();\n\n const 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 const type = entry.type;\n\n // Default modes (decimal values for Node 0.8 compatibility)\n // 0o755 = 493, 0o644 = 420\n const defaultMode = type === 'directory' ? 493 : 420;\n\n // Build attributes from 7z entry\n // mtime must be timestamp (number) for FileAttributes compatibility\n const mtimeDate = entry.mtime || new Date();\n const attributes: EntryAttributesBuilder = {\n path: entry.path.split(path.sep).filter(Boolean).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 const parser = internalIter.getParser();\n const stream = parser.getEntryStream(entry);\n\n const chunks: Buffer[] = [];\n\n stream.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n stream.on('end', () => {\n const linkpath = Buffer.concat(chunks).toString('utf8');\n\n const 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', (streamErr: Error) => {\n nextCallback(streamErr);\n });\n return;\n }\n\n case 'file': {\n attributes.type = 'file';\n attributes.size = entry.size;\n const parser = internalIter.getParser();\n\n const stream = parser.getEntryStream(entry);\n return nextCallback(null, new FileEntry(attributes as FileAttributes, stream, iterator.lock, entry._canStream));\n }\n }\n\n return callback(new Error(`Unrecognized entry type: ${type}`));\n}\n"],"names":["nextEntry","iterator","callback","internalIter","_iterator","Error","entry","next","nextCallback","once","err","push","done","value","lock","isDone","isAntiFile","type","defaultMode","mtimeDate","mtime","Date","attributes","path","split","sep","filter","Boolean","join","basename","name","getTime","mode","undefined","DirectoryEntry","parser","getParser","stream","getEntryStream","chunks","on","chunk","linkpath","Buffer","concat","toString","linkAttributes","SymbolicLinkEntry","streamErr","size","FileEntry","_canStream"],"mappings":";;;;+BA2BA;;;eAAwBA;;;iEA3BP;mCACqG;2DACrG;kEACK;;;;;;AAwBP,SAASA,UAAcC,QAA0B,EAAEC,QAAuB;IACvF,IAAMC,eAAeF,SAASG,SAAS;IACvC,IAAI,CAACD,cAAc;QACjBD,SAAS,IAAIG,MAAM;QACnB;IACF;IAEA,IAAIC,QAA8B;IAClCA,QAAQH,aAAaI,IAAI;IAEzB,IAAMC,eAAeC,IAAAA,mBAAI,EAAC,SAACC,KAAaJ;QACtC,kBAAkB;QAClB,IAAIA,OAAOL,SAASU,IAAI,CAACX;QACzBU,MAAMR,SAASQ,OAAOR,SAAS,MAAMI,QAAQ;YAAEM,MAAM;YAAOC,OAAOP;QAAM,IAAI;YAAEM,MAAM;YAAMC,OAAO;QAAK;IACzG;IAEA,gEAAgE;IAChE,IAAI,CAACZ,SAASa,IAAI,IAAIb,SAASc,MAAM,MAAM,CAACT,OAAO,OAAOJ,SAAS,MAAM;QAAEU,MAAM;QAAMC,OAAO;IAAK;IAEnG,iEAAiE;IACjE,IAAIP,MAAMU,UAAU,EAAE;QACpBf,SAASU,IAAI,CAACX;QACd,OAAOE,SAAS,MAAM;IACxB;IAEA,4BAA4B;IAC5B,IAAMe,OAAOX,MAAMW,IAAI;IAEvB,4DAA4D;IAC5D,2BAA2B;IAC3B,IAAMC,cAAcD,SAAS,cAAc,MAAM;IAEjD,iCAAiC;IACjC,oEAAoE;IACpE,IAAME,YAAYb,MAAMc,KAAK,IAAI,IAAIC;IACrC,IAAMC,aAAqC;QACzCC,MAAMjB,MAAMiB,IAAI,CAACC,KAAK,CAACD,aAAI,CAACE,GAAG,EAAEC,MAAM,CAACC,SAASC,IAAI,CAACL,aAAI,CAACE,GAAG;QAC9DI,UAAUvB,MAAMwB,IAAI;QACpBV,OAAOD,UAAUY,OAAO;QACxBC,MAAM1B,MAAM0B,IAAI,KAAKC,YAAY3B,MAAM0B,IAAI,GAAGd;IAChD;IAEA,OAAQD;QACN,KAAK;YACHK,WAAWL,IAAI,GAAG;YAClB,OAAOT,aAAa,MAAM,IAAI0B,mCAAc,CAACZ;QAE/C,KAAK;YAAQ;gBACX,4DAA4D;gBAC5D,6DAA6D;gBAC7D,IAAMa,SAAShC,aAAaiC,SAAS;gBACrC,IAAMC,SAASF,OAAOG,cAAc,CAAChC;gBAErC,IAAMiC,SAAmB,EAAE;gBAE3BF,OAAOG,EAAE,CAAC,QAAQ,SAACC;oBACjBF,OAAO5B,IAAI,CAAC8B;gBACd;gBACAJ,OAAOG,EAAE,CAAC,OAAO;oBACf,IAAME,WAAWC,OAAOC,MAAM,CAACL,QAAQM,QAAQ,CAAC;oBAEhD,IAAMC,iBAAiC;wBACrCvB,MAAMD,WAAWC,IAAI;wBACrBH,OAAOE,WAAWF,KAAK;wBACvBY,MAAMV,WAAWU,IAAI;wBACrBU,UAAUA;oBACZ;oBAEAlC,aAAa,MAAM,IAAIuC,sCAAiB,CAACD;gBAC3C;gBACAT,OAAOG,EAAE,CAAC,SAAS,SAACQ;oBAClBxC,aAAawC;gBACf;gBACA;YACF;QAEA,KAAK;YAAQ;gBACX1B,WAAWL,IAAI,GAAG;gBAClBK,WAAW2B,IAAI,GAAG3C,MAAM2C,IAAI;gBAC5B,IAAMd,UAAShC,aAAaiC,SAAS;gBAErC,IAAMC,UAASF,QAAOG,cAAc,CAAChC;gBACrC,OAAOE,aAAa,MAAM,IAAI0C,oBAAS,CAAC5B,YAA8Be,SAAQpC,SAASa,IAAI,EAAER,MAAM6C,UAAU;YAC/G;IACF;IAEA,OAAOjD,SAAS,IAAIG,MAAM,AAAC,4BAAgC,OAALY;AACxD"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/ArchiveSource.ts"],"sourcesContent":["/**\n * ArchiveSource - Abstraction for reading 7z archive data\n *\n * Provides a common interface for reading archive data from either\n * a file descriptor or an in-memory buffer.\n */\n\nimport { allocBuffer, Readable } from 'extract-base-iterator';\nimport fs from 'fs';\nimport type Stream from 'stream';\n\n// Helper to create a Readable stream compatible with Node 0.8\nfunction createReadableStream(readFn: (stream: Stream.Readable) => void): Stream.Readable {\n const stream = new Readable();\n stream._read = function () {\n readFn(this);\n };\n return stream;\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 * Create a readable stream for a portion of the archive.\n * Used for streaming decompression.\n */\n createReadStream(offset: number, length: number): Stream.Readable;\n}\n\n/**\n * Buffer-based archive source\n *\n * Used when the entire archive is already in memory.\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 * Create a readable stream for a portion of the buffer.\n * Streams the data in chunks to avoid blocking.\n */\n createReadStream(offset: number, length: number): Stream.Readable {\n const buffer = this.buffer;\n const end = Math.min(offset + length, buffer.length);\n let currentPos = offset;\n const chunkSize = 65536; // 64KB chunks\n\n return createReadableStream((stream) => {\n if (currentPos >= end) {\n stream.push(null);\n return;\n }\n\n const toRead = Math.min(chunkSize, end - currentPos);\n const chunk = buffer.slice(currentPos, currentPos + toRead);\n currentPos += toRead;\n stream.push(chunk);\n });\n }\n}\n\n/**\n * File descriptor based archive source\n *\n * Used for reading directly from a file on disk.\n * More memory efficient for large archives.\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 // Handle large reads by chunking to fit 32-bit signed int limit\n const MAX_INT32 = 0x7fffffff; // 2,147,483,647 bytes (~2GB)\n\n if (length <= MAX_INT32) {\n return this.readChunk(position, length);\n }\n\n // For large reads, split into multiple chunks\n const chunks: Buffer[] = [];\n let totalBytesRead = 0;\n let currentPos = position;\n\n while (totalBytesRead < length) {\n const remaining = length - totalBytesRead;\n const chunkSize = Math.min(remaining, MAX_INT32);\n const chunk = this.readChunk(currentPos, chunkSize);\n\n chunks.push(chunk);\n totalBytesRead += chunk.length;\n currentPos += chunk.length;\n\n if (chunk.length < chunkSize) {\n // EOF reached\n break;\n }\n }\n\n return Buffer.concat(chunks);\n }\n\n private readChunk(position: number, length: number): Buffer {\n const buf = allocBuffer(length);\n const 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 * Create a readable stream for a portion of the file.\n * Uses async fs.read() to avoid blocking the event loop.\n */\n createReadStream(offset: number, length: number): Stream.Readable {\n const fd = this.fd;\n let bytesRead = 0;\n let reading = false;\n let finished = false;\n const chunkSize = 65536; // 64KB chunks\n let _streamRef: Stream.Readable | null = null;\n\n const stream = createReadableStream((s) => {\n _streamRef = s;\n if (reading || finished) return; // Prevent re-entrant reads\n\n const toRead = Math.min(chunkSize, length - bytesRead);\n if (toRead <= 0) {\n finished = true;\n s.push(null);\n return;\n }\n\n reading = true;\n const buffer = allocBuffer(toRead);\n const currentOffset = offset + bytesRead;\n\n fs.read(fd, buffer, 0, toRead, currentOffset, (err, n) => {\n reading = false;\n\n if (err) {\n // Emit error for Node 0.8 compatibility (no destroy method)\n s.emit('error', err);\n finished = true;\n s.push(null);\n return;\n }\n\n if (n === 0) {\n finished = true;\n s.push(null);\n } else {\n bytesRead += n;\n s.push(buffer.slice(0, n));\n }\n });\n });\n\n return stream;\n }\n}\n"],"names":["BufferSource","FileSource","createReadableStream","readFn","stream","Readable","_read","buffer","read","position","length","slice","getSize","close","createReadStream","offset","end","Math","min","currentPos","chunkSize","push","toRead","chunk","fd","size","MAX_INT32","readChunk","chunks","totalBytesRead","remaining","Buffer","concat","buf","allocBuffer","bytesRead","fs","readSync","closeSync","_e","reading","finished","_streamRef","s","currentOffset","err","n","emit"],"mappings":"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"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/ArchiveSource.ts"],"sourcesContent":["/**\n * ArchiveSource - Abstraction for reading 7z archive data\n *\n * Provides a common interface for reading archive data from either\n * a file descriptor or an in-memory buffer.\n */\n\nimport { allocBuffer, Readable } from 'extract-base-iterator';\nimport fs from 'fs';\nimport type Stream from 'stream';\n\n// Helper to create a Readable stream compatible with Node 0.8\nfunction createReadableStream(readFn: (stream: Stream.Readable) => void): Stream.Readable {\n const stream = new Readable();\n stream._read = function () {\n readFn(this);\n };\n return stream;\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 * Create a readable stream for a portion of the archive.\n * Used for streaming decompression.\n */\n createReadStream(offset: number, length: number): Stream.Readable;\n}\n\n/**\n * Buffer-based archive source\n *\n * Used when the entire archive is already in memory.\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 * Create a readable stream for a portion of the buffer.\n * Streams the data in chunks to avoid blocking.\n */\n createReadStream(offset: number, length: number): Stream.Readable {\n const buffer = this.buffer;\n const end = Math.min(offset + length, buffer.length);\n let currentPos = offset;\n const chunkSize = 65536; // 64KB chunks\n\n return createReadableStream((stream) => {\n if (currentPos >= end) {\n stream.push(null);\n return;\n }\n\n const toRead = Math.min(chunkSize, end - currentPos);\n const chunk = buffer.slice(currentPos, currentPos + toRead);\n currentPos += toRead;\n stream.push(chunk);\n });\n }\n}\n\n/**\n * File descriptor based archive source\n *\n * Used for reading directly from a file on disk.\n * More memory efficient for large archives.\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 // Handle large reads by chunking to fit 32-bit signed int limit\n const MAX_INT32 = 0x7fffffff; // 2,147,483,647 bytes (~2GB)\n\n if (length <= MAX_INT32) {\n return this.readChunk(position, length);\n }\n\n // For large reads, split into multiple chunks\n const chunks: Buffer[] = [];\n let totalBytesRead = 0;\n let currentPos = position;\n\n while (totalBytesRead < length) {\n const remaining = length - totalBytesRead;\n const chunkSize = Math.min(remaining, MAX_INT32);\n const chunk = this.readChunk(currentPos, chunkSize);\n\n chunks.push(chunk);\n totalBytesRead += chunk.length;\n currentPos += chunk.length;\n\n if (chunk.length < chunkSize) {\n // EOF reached\n break;\n }\n }\n\n return Buffer.concat(chunks);\n }\n\n private readChunk(position: number, length: number): Buffer {\n const buf = allocBuffer(length);\n const 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 * Create a readable stream for a portion of the file.\n * Uses async fs.read() to avoid blocking the event loop.\n */\n createReadStream(offset: number, length: number): Stream.Readable {\n const fd = this.fd;\n let bytesRead = 0;\n let reading = false;\n let finished = false;\n const chunkSize = 65536; // 64KB chunks\n let _streamRef: Stream.Readable | null = null;\n\n const stream = createReadableStream((s) => {\n _streamRef = s;\n if (reading || finished) return; // Prevent re-entrant reads\n\n const toRead = Math.min(chunkSize, length - bytesRead);\n if (toRead <= 0) {\n finished = true;\n s.push(null);\n return;\n }\n\n reading = true;\n const buffer = allocBuffer(toRead);\n const currentOffset = offset + bytesRead;\n\n fs.read(fd, buffer, 0, toRead, currentOffset, (err, n) => {\n reading = false;\n\n if (err) {\n // Emit error for Node 0.8 compatibility (no destroy method)\n s.emit('error', err);\n finished = true;\n s.push(null);\n return;\n }\n\n if (n === 0) {\n finished = true;\n s.push(null);\n } else {\n bytesRead += n;\n s.push(buffer.slice(0, n));\n }\n });\n });\n\n return stream;\n }\n}\n"],"names":["BufferSource","FileSource","createReadableStream","readFn","stream","Readable","_read","buffer","read","position","length","slice","getSize","close","createReadStream","offset","end","Math","min","currentPos","chunkSize","push","toRead","chunk","fd","size","MAX_INT32","readChunk","chunks","totalBytesRead","remaining","Buffer","concat","buf","allocBuffer","bytesRead","fs","readSync","closeSync","_e","reading","finished","_streamRef","s","currentOffset","err","n","emit"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/Aes.ts"],"sourcesContent":["// 7z AES-256-CBC codec with SHA-256 key derivation\n// Implements password-based decryption for encrypted 7z archives\n//\n// Properties format:\n// Byte 0: bits 0-5 = NumCyclesPower (iterations = 2^NumCyclesPower)\n// bit 6 = IV present flag\n// bit 7 = Salt present flag\n// Byte 1: upper nibble = salt size extension\n// lower nibble = IV size extension\n// Following bytes: salt data, then IV data\n//\n// Key derivation:\n// For each round (2^NumCyclesPower times):\n// hash = SHA256(salt + password_utf16le + round_counter_8bytes)\n// Final key = first 32 bytes of accumulated hash\n\nimport crypto from 'crypto';\nimport { allocBuffer, bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n// Global password storage - set before decryption\nlet _password: string | null = null;\n\n/**\n * Set the password for AES decryption\n */\nexport function setPassword(password: string | null): void {\n _password = password;\n}\n\n/**\n * Get the current password\n */\nexport function getPassword(): string | null {\n return _password;\n}\n\n/**\n * Parse AES properties to extract key derivation parameters\n */\nfunction parseProperties(properties: Buffer): { numCyclesPower: number; salt: Buffer; iv: Buffer } {\n if (!properties || properties.length < 1) {\n throw new Error('AES: missing properties');\n }\n\n const b0 = properties[0];\n const numCyclesPower = b0 & 0x3f;\n\n // Check for special case: no salt/IV flags\n if ((b0 & 0xc0) === 0) {\n // No salt, no IV - use zeros\n return {\n numCyclesPower: numCyclesPower,\n salt: allocBuffer(0),\n iv: allocBuffer(16),\n };\n }\n\n if (properties.length < 2) {\n throw new Error('AES: properties too short');\n }\n\n const b1 = properties[1];\n\n // Calculate sizes\n // saltSize = ((b0 >> 7) & 1) + (b1 >> 4)\n // ivSize = ((b0 >> 6) & 1) + (b1 & 0x0F)\n const saltSize = ((b0 >>> 7) & 1) + (b1 >>> 4);\n const ivSize = ((b0 >>> 6) & 1) + (b1 & 0x0f);\n\n const expectedSize = 2 + saltSize + ivSize;\n if (properties.length < expectedSize) {\n throw new Error('AES: properties too short for salt/IV');\n }\n\n const salt = properties.slice(2, 2 + saltSize);\n const iv = allocBuffer(16);\n\n // Copy IV data (may be less than 16 bytes, rest is zeros)\n const ivData = properties.slice(2 + saltSize, 2 + saltSize + ivSize);\n for (let i = 0; i < ivData.length && i < 16; i++) {\n iv[i] = ivData[i];\n }\n\n return {\n numCyclesPower: numCyclesPower,\n salt: salt,\n iv: iv,\n };\n}\n\n/**\n * Convert password string to UTF-16LE buffer\n */\nfunction passwordToUtf16LE(password: string): Buffer {\n const buf = allocBuffer(password.length * 2);\n for (let i = 0; i < password.length; i++) {\n const code = password.charCodeAt(i);\n buf[i * 2] = code & 0xff;\n buf[i * 2 + 1] = (code >>> 8) & 0xff;\n }\n return buf;\n}\n\n/**\n * Derive AES-256 key from password using 7z's SHA-256 iteration scheme\n *\n * Algorithm:\n * For round = 0 to 2^numCyclesPower - 1:\n * hash.update(salt)\n * hash.update(password_utf16le)\n * hash.update(round as 8-byte little-endian)\n * key = hash.digest()\n */\nfunction deriveKey(password: string, salt: Buffer, numCyclesPower: number): Buffer {\n const passwordBuf = passwordToUtf16LE(password);\n const numRounds = 2 ** numCyclesPower;\n\n // For special case 0x3F, don't iterate\n if (numCyclesPower === 0x3f) {\n // Direct concatenation mode\n const key = allocBuffer(32);\n let offset = 0;\n for (let j = 0; j < salt.length && offset < 32; j++) {\n key[offset++] = salt[j];\n }\n for (let k = 0; k < passwordBuf.length && offset < 32; k++) {\n key[offset++] = passwordBuf[k];\n }\n return key;\n }\n\n // Counter buffer (8 bytes, little-endian)\n const counter = allocBuffer(8);\n\n // Create hash and iterate\n const hash = crypto.createHash('sha256');\n\n for (let round = 0; round < numRounds; round++) {\n // Write round counter as little-endian 64-bit\n counter[0] = round & 0xff;\n counter[1] = (round >>> 8) & 0xff;\n counter[2] = (round >>> 16) & 0xff;\n counter[3] = (round >>> 24) & 0xff;\n // Upper 32 bits - for large round counts\n const high = Math.floor(round / 0x100000000);\n counter[4] = high & 0xff;\n counter[5] = (high >>> 8) & 0xff;\n counter[6] = (high >>> 16) & 0xff;\n counter[7] = (high >>> 24) & 0xff;\n\n hash.update(salt);\n hash.update(passwordBuf);\n hash.update(counter);\n }\n\n return hash.digest() as Buffer;\n}\n\n/**\n * Decode AES-256-CBC encrypted data\n *\n * @param input - Encrypted data\n * @param properties - AES properties (numCyclesPower, salt, IV)\n * @param _unpackSize - Unused\n * @returns Decrypted data\n */\nexport function decodeAes(input: Buffer, properties?: Buffer, _unpackSize?: number): Buffer {\n if (!_password) {\n throw new Error('AES: password required but not set');\n }\n\n if (!properties) {\n throw new Error('AES: properties required');\n }\n\n const params = parseProperties(properties);\n const key = deriveKey(_password, params.salt, params.numCyclesPower);\n\n // Create AES-256-CBC decipher\n const decipher = crypto.createDecipheriv('aes-256-cbc', key, params.iv);\n decipher.setAutoPadding(false); // 7z doesn't use PKCS7 padding\n\n // Node 0.8 returns binary strings, newer Node returns Buffers\n // Use 'binary' encoding for compatibility\n // @ts-expect-error - 'binary' encoding is deprecated but required for Node 0.8 compatibility\n const decStr = decipher.update(input, 'binary', 'binary') + decipher.final('binary');\n const decrypted = bufferFrom(decStr, 'binary' as BufferEncoding);\n\n return decrypted;\n}\n\n/**\n * Create an AES decoder Transform stream\n */\nexport function createAesDecoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeAes, properties, unpackSize);\n}\n"],"names":["createAesDecoder","decodeAes","getPassword","setPassword","_password","password","parseProperties","properties","length","Error","b0","numCyclesPower","salt","allocBuffer","iv","b1","saltSize","ivSize","expectedSize","slice","ivData","i","passwordToUtf16LE","buf","code","charCodeAt","deriveKey","passwordBuf","numRounds","key","offset","j","k","counter","hash","crypto","createHash","round","high","Math","floor","update","digest","input","_unpackSize","params","decipher","createDecipheriv","setAutoPadding","decStr","final","decrypted","bufferFrom","unpackSize","createBufferingDecoder"],"mappings":"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"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Aes.ts"],"sourcesContent":["// 7z AES-256-CBC codec with SHA-256 key derivation\n// Implements password-based decryption for encrypted 7z archives\n//\n// Properties format:\n// Byte 0: bits 0-5 = NumCyclesPower (iterations = 2^NumCyclesPower)\n// bit 6 = IV present flag\n// bit 7 = Salt present flag\n// Byte 1: upper nibble = salt size extension\n// lower nibble = IV size extension\n// Following bytes: salt data, then IV data\n//\n// Key derivation:\n// For each round (2^NumCyclesPower times):\n// hash = SHA256(salt + password_utf16le + round_counter_8bytes)\n// Final key = first 32 bytes of accumulated hash\n\nimport crypto from 'crypto';\nimport { allocBuffer, bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n// Global password storage - set before decryption\nlet _password: string | null = null;\n\n/**\n * Set the password for AES decryption\n */\nexport function setPassword(password: string | null): void {\n _password = password;\n}\n\n/**\n * Get the current password\n */\nexport function getPassword(): string | null {\n return _password;\n}\n\n/**\n * Parse AES properties to extract key derivation parameters\n */\nfunction parseProperties(properties: Buffer): { numCyclesPower: number; salt: Buffer; iv: Buffer } {\n if (!properties || properties.length < 1) {\n throw new Error('AES: missing properties');\n }\n\n const b0 = properties[0];\n const numCyclesPower = b0 & 0x3f;\n\n // Check for special case: no salt/IV flags\n if ((b0 & 0xc0) === 0) {\n // No salt, no IV - use zeros\n return {\n numCyclesPower: numCyclesPower,\n salt: allocBuffer(0),\n iv: allocBuffer(16),\n };\n }\n\n if (properties.length < 2) {\n throw new Error('AES: properties too short');\n }\n\n const b1 = properties[1];\n\n // Calculate sizes\n // saltSize = ((b0 >> 7) & 1) + (b1 >> 4)\n // ivSize = ((b0 >> 6) & 1) + (b1 & 0x0F)\n const saltSize = ((b0 >>> 7) & 1) + (b1 >>> 4);\n const ivSize = ((b0 >>> 6) & 1) + (b1 & 0x0f);\n\n const expectedSize = 2 + saltSize + ivSize;\n if (properties.length < expectedSize) {\n throw new Error('AES: properties too short for salt/IV');\n }\n\n const salt = properties.slice(2, 2 + saltSize);\n const iv = allocBuffer(16);\n\n // Copy IV data (may be less than 16 bytes, rest is zeros)\n const ivData = properties.slice(2 + saltSize, 2 + saltSize + ivSize);\n for (let i = 0; i < ivData.length && i < 16; i++) {\n iv[i] = ivData[i];\n }\n\n return {\n numCyclesPower: numCyclesPower,\n salt: salt,\n iv: iv,\n };\n}\n\n/**\n * Convert password string to UTF-16LE buffer\n */\nfunction passwordToUtf16LE(password: string): Buffer {\n const buf = allocBuffer(password.length * 2);\n for (let i = 0; i < password.length; i++) {\n const code = password.charCodeAt(i);\n buf[i * 2] = code & 0xff;\n buf[i * 2 + 1] = (code >>> 8) & 0xff;\n }\n return buf;\n}\n\n/**\n * Derive AES-256 key from password using 7z's SHA-256 iteration scheme\n *\n * Algorithm:\n * For round = 0 to 2^numCyclesPower - 1:\n * hash.update(salt)\n * hash.update(password_utf16le)\n * hash.update(round as 8-byte little-endian)\n * key = hash.digest()\n */\nfunction deriveKey(password: string, salt: Buffer, numCyclesPower: number): Buffer {\n const passwordBuf = passwordToUtf16LE(password);\n const numRounds = 2 ** numCyclesPower;\n\n // For special case 0x3F, don't iterate\n if (numCyclesPower === 0x3f) {\n // Direct concatenation mode\n const key = allocBuffer(32);\n let offset = 0;\n for (let j = 0; j < salt.length && offset < 32; j++) {\n key[offset++] = salt[j];\n }\n for (let k = 0; k < passwordBuf.length && offset < 32; k++) {\n key[offset++] = passwordBuf[k];\n }\n return key;\n }\n\n // Counter buffer (8 bytes, little-endian)\n const counter = allocBuffer(8);\n\n // Create hash and iterate\n const hash = crypto.createHash('sha256');\n\n for (let round = 0; round < numRounds; round++) {\n // Write round counter as little-endian 64-bit\n counter[0] = round & 0xff;\n counter[1] = (round >>> 8) & 0xff;\n counter[2] = (round >>> 16) & 0xff;\n counter[3] = (round >>> 24) & 0xff;\n // Upper 32 bits - for large round counts\n const high = Math.floor(round / 0x100000000);\n counter[4] = high & 0xff;\n counter[5] = (high >>> 8) & 0xff;\n counter[6] = (high >>> 16) & 0xff;\n counter[7] = (high >>> 24) & 0xff;\n\n hash.update(salt);\n hash.update(passwordBuf);\n hash.update(counter);\n }\n\n return hash.digest() as Buffer;\n}\n\n/**\n * Decode AES-256-CBC encrypted data\n *\n * @param input - Encrypted data\n * @param properties - AES properties (numCyclesPower, salt, IV)\n * @param _unpackSize - Unused\n * @returns Decrypted data\n */\nexport function decodeAes(input: Buffer, properties?: Buffer, _unpackSize?: number): Buffer {\n if (!_password) {\n throw new Error('AES: password required but not set');\n }\n\n if (!properties) {\n throw new Error('AES: properties required');\n }\n\n const params = parseProperties(properties);\n const key = deriveKey(_password, params.salt, params.numCyclesPower);\n\n // Create AES-256-CBC decipher\n const decipher = crypto.createDecipheriv('aes-256-cbc', key, params.iv);\n decipher.setAutoPadding(false); // 7z doesn't use PKCS7 padding\n\n // Node 0.8 returns binary strings, newer Node returns Buffers\n // Use 'binary' encoding for compatibility\n // @ts-expect-error - 'binary' encoding is deprecated but required for Node 0.8 compatibility\n const decStr = decipher.update(input, 'binary', 'binary') + decipher.final('binary');\n const decrypted = bufferFrom(decStr, 'binary' as BufferEncoding);\n\n return decrypted;\n}\n\n/**\n * Create an AES decoder Transform stream\n */\nexport function createAesDecoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeAes, properties, unpackSize);\n}\n"],"names":["createAesDecoder","decodeAes","getPassword","setPassword","_password","password","parseProperties","properties","length","Error","b0","numCyclesPower","salt","allocBuffer","iv","b1","saltSize","ivSize","expectedSize","slice","ivData","i","passwordToUtf16LE","buf","code","charCodeAt","deriveKey","passwordBuf","numRounds","key","offset","j","k","counter","hash","crypto","createHash","round","high","Math","floor","update","digest","input","_unpackSize","params","decipher","createDecipheriv","setAutoPadding","decStr","final","decrypted","bufferFrom","unpackSize","createBufferingDecoder"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/Bcj2.ts"],"sourcesContent":["// BCJ2 (x86-64) filter codec - advanced branch/call/jump converter\n// BCJ2 uses 4 input streams and arithmetic (range) coding for better compression\n// Reference: LZMA SDK Bcj2.c\n//\n// Stream layout:\n// Stream 0: Main data (contains literals and branch opcode markers)\n// Stream 1: CALL addresses (for 0xE8 instructions)\n// Stream 2: JUMP addresses (for 0xE9 instructions)\n// Stream 3: Range coder data (probability decisions)\n\nimport { allocBuffer } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n// Range coder constants\nconst kTopValue = 1 << 24;\nconst kNumBitModelTotalBits = 11;\nconst kBitModelTotal = 1 << kNumBitModelTotalBits;\nconst kNumMoveBits = 5;\n\n// Number of probability models:\n// Index 0: conditional jumps (0x0F 0x80-0x8F)\n// Index 1: JMP (0xE9)\n// Indices 2-257: CALL (0xE8), indexed by previous byte\nconst kNumProbs = 258;\n\n/**\n * Range decoder state\n */\ninterface RangeDecoder {\n range: number;\n code: number;\n stream: Buffer;\n pos: number;\n}\n\n/**\n * Initialize range decoder\n */\nfunction initRangeDecoder(stream: Buffer): RangeDecoder {\n const rd: RangeDecoder = {\n range: 0xffffffff,\n code: 0,\n stream: stream,\n pos: 0,\n };\n\n // Initialize code from first 5 bytes\n for (let i = 0; i < 5; i++) {\n rd.code = (rd.code << 8) | (rd.pos < stream.length ? stream[rd.pos++] : 0);\n }\n\n return rd;\n}\n\n/**\n * Decode a single bit using probability model\n */\nfunction decodeBit(rd: RangeDecoder, prob: number[], probIndex: number): number {\n const ttt = prob[probIndex];\n const bound = (rd.range >>> kNumBitModelTotalBits) * ttt;\n\n let symbol: number;\n if (rd.code >>> 0 < bound >>> 0) {\n rd.range = bound;\n prob[probIndex] = (ttt + ((kBitModelTotal - ttt) >>> kNumMoveBits)) | 0;\n symbol = 0;\n } else {\n rd.range = (rd.range - bound) >>> 0;\n rd.code = (rd.code - bound) >>> 0;\n prob[probIndex] = (ttt - (ttt >>> kNumMoveBits)) | 0;\n symbol = 1;\n }\n\n // Normalize\n if (rd.range < kTopValue) {\n rd.range = (rd.range << 8) >>> 0;\n rd.code = ((rd.code << 8) | (rd.pos < rd.stream.length ? rd.stream[rd.pos++] : 0)) >>> 0;\n }\n\n return symbol;\n}\n\n/**\n * BCJ2 multi-stream decoder\n * Takes 4 pre-decompressed streams and combines them\n */\nexport function decodeBcj2Multi(streams: Buffer[], _properties?: Buffer, unpackSize?: number): Buffer {\n if (streams.length !== 4) {\n throw new Error(`BCJ2 requires 4 input streams, got ${streams.length}`);\n }\n\n // Stream assignment (based on 7z bind pair convention):\n // streams[0] = main data (after LZMA2)\n // streams[1] = call stream (after LZMA)\n // streams[2] = jump stream (after LZMA)\n // streams[3] = range coder stream (uncompressed)\n const mainStream = streams[0];\n const callStream = streams[1];\n const jumpStream = streams[2];\n const rcStream = streams[3];\n\n // Output buffer\n const outSize = unpackSize || mainStream.length + callStream.length + jumpStream.length;\n const output = allocBuffer(outSize);\n let outPos = 0;\n\n // Stream positions\n let mainPos = 0;\n let callPos = 0;\n let jumpPos = 0;\n\n // Initialize range decoder\n const rd = initRangeDecoder(rcStream);\n\n // Initialize probability models\n const probs: number[] = [];\n for (let i = 0; i < kNumProbs; i++) {\n probs.push(kBitModelTotal >>> 1);\n }\n\n // Track previous byte for probability context\n let prevByte = 0;\n\n // Instruction pointer for address conversion\n let ip = 0;\n\n while (outPos < outSize && mainPos < mainStream.length) {\n const b = mainStream[mainPos++];\n\n // Check for branch opcodes\n if (b === 0xe8 || b === 0xe9) {\n // CALL (0xE8) or JMP (0xE9)\n // Use range decoder to check if this should be processed\n // Probability index: E8 uses 2 + prevByte, E9 uses 1\n const probIndex = b === 0xe8 ? 2 + prevByte : 1;\n const isMatch = decodeBit(rd, probs, probIndex);\n\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n\n if (isMatch) {\n // Read 4-byte address from appropriate stream\n const addrStream = b === 0xe8 ? callStream : jumpStream;\n const addrPos = b === 0xe8 ? callPos : jumpPos;\n\n if (addrPos + 4 > addrStream.length) {\n // Not enough data, copy remaining\n break;\n }\n\n // Check if we have room for 4 address bytes\n if (outPos + 4 > outSize) break;\n\n // Read as big-endian (BCJ2 stores addresses big-endian)\n let addr = (addrStream[addrPos] << 24) | (addrStream[addrPos + 1] << 16) | (addrStream[addrPos + 2] << 8) | addrStream[addrPos + 3];\n\n if (b === 0xe8) {\n callPos += 4;\n } else {\n jumpPos += 4;\n }\n\n // Convert absolute to relative address\n addr = (addr - (ip + 4)) | 0;\n\n // Write as little-endian\n output[outPos++] = addr & 0xff;\n output[outPos++] = (addr >>> 8) & 0xff;\n output[outPos++] = (addr >>> 16) & 0xff;\n output[outPos++] = (addr >>> 24) & 0xff;\n ip += 4;\n\n prevByte = (addr >>> 24) & 0xff;\n } else {\n prevByte = b;\n }\n } else if (b === 0x0f && mainPos < mainStream.length) {\n // Potential conditional jump (0x0F 0x8x)\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n\n const b2 = mainStream[mainPos];\n if ((b2 & 0xf0) === 0x80) {\n // Conditional jump\n mainPos++;\n // Probability index 0 for conditional jumps (since b2 != 0xE8 and b2 != 0xE9)\n const probIndex2 = 0;\n const isMatch2 = decodeBit(rd, probs, probIndex2);\n\n if (outPos >= outSize) break;\n output[outPos++] = b2;\n ip++;\n\n if (isMatch2) {\n // Read 4-byte address from jump stream\n if (jumpPos + 4 > jumpStream.length) {\n break;\n }\n\n // Check if we have room for 4 address bytes\n if (outPos + 4 > outSize) break;\n\n let addr2 = (jumpStream[jumpPos] << 24) | (jumpStream[jumpPos + 1] << 16) | (jumpStream[jumpPos + 2] << 8) | jumpStream[jumpPos + 3];\n jumpPos += 4;\n\n // Convert absolute to relative\n addr2 = (addr2 - (ip + 4)) | 0;\n\n // Write as little-endian\n output[outPos++] = addr2 & 0xff;\n output[outPos++] = (addr2 >>> 8) & 0xff;\n output[outPos++] = (addr2 >>> 16) & 0xff;\n output[outPos++] = (addr2 >>> 24) & 0xff;\n ip += 4;\n\n prevByte = (addr2 >>> 24) & 0xff;\n } else {\n prevByte = b2;\n }\n } else {\n prevByte = b;\n }\n } else {\n // Regular byte\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n prevByte = b;\n }\n }\n\n // Return only the used portion\n return outPos < output.length ? output.slice(0, outPos) : output;\n}\n\n/**\n * Single-buffer decode (for API compatibility)\n * Note: BCJ2 requires multi-stream, this throws\n */\nexport function decodeBcj2(_input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n throw new Error('BCJ2 requires multi-stream decoding - use decodeBcj2Multi');\n}\n\n/**\n * Create a BCJ2 decoder Transform stream\n * Note: BCJ2 requires multi-stream, this is for API compatibility\n */\nexport function createBcj2Decoder(_properties?: Buffer, _unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcj2, _properties, _unpackSize);\n}\n"],"names":["createBcj2Decoder","decodeBcj2","decodeBcj2Multi","kTopValue","kNumBitModelTotalBits","kBitModelTotal","kNumMoveBits","kNumProbs","initRangeDecoder","stream","rd","range","code","pos","i","length","decodeBit","prob","probIndex","ttt","bound","symbol","streams","_properties","unpackSize","Error","mainStream","callStream","jumpStream","rcStream","outSize","output","allocBuffer","outPos","mainPos","callPos","jumpPos","probs","push","prevByte","ip","b","isMatch","addrStream","addrPos","addr","b2","probIndex2","isMatch2","addr2","slice","_input","_unpackSize","createBufferingDecoder"],"mappings":"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"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Bcj2.ts"],"sourcesContent":["// BCJ2 (x86-64) filter codec - advanced branch/call/jump converter\n// BCJ2 uses 4 input streams and arithmetic (range) coding for better compression\n// Reference: LZMA SDK Bcj2.c\n//\n// Stream layout:\n// Stream 0: Main data (contains literals and branch opcode markers)\n// Stream 1: CALL addresses (for 0xE8 instructions)\n// Stream 2: JUMP addresses (for 0xE9 instructions)\n// Stream 3: Range coder data (probability decisions)\n\nimport { allocBuffer } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n// Range coder constants\nconst kTopValue = 1 << 24;\nconst kNumBitModelTotalBits = 11;\nconst kBitModelTotal = 1 << kNumBitModelTotalBits;\nconst kNumMoveBits = 5;\n\n// Number of probability models:\n// Index 0: conditional jumps (0x0F 0x80-0x8F)\n// Index 1: JMP (0xE9)\n// Indices 2-257: CALL (0xE8), indexed by previous byte\nconst kNumProbs = 258;\n\n/**\n * Range decoder state\n */\ninterface RangeDecoder {\n range: number;\n code: number;\n stream: Buffer;\n pos: number;\n}\n\n/**\n * Initialize range decoder\n */\nfunction initRangeDecoder(stream: Buffer): RangeDecoder {\n const rd: RangeDecoder = {\n range: 0xffffffff,\n code: 0,\n stream: stream,\n pos: 0,\n };\n\n // Initialize code from first 5 bytes\n for (let i = 0; i < 5; i++) {\n rd.code = (rd.code << 8) | (rd.pos < stream.length ? stream[rd.pos++] : 0);\n }\n\n return rd;\n}\n\n/**\n * Decode a single bit using probability model\n */\nfunction decodeBit(rd: RangeDecoder, prob: number[], probIndex: number): number {\n const ttt = prob[probIndex];\n const bound = (rd.range >>> kNumBitModelTotalBits) * ttt;\n\n let symbol: number;\n if (rd.code >>> 0 < bound >>> 0) {\n rd.range = bound;\n prob[probIndex] = (ttt + ((kBitModelTotal - ttt) >>> kNumMoveBits)) | 0;\n symbol = 0;\n } else {\n rd.range = (rd.range - bound) >>> 0;\n rd.code = (rd.code - bound) >>> 0;\n prob[probIndex] = (ttt - (ttt >>> kNumMoveBits)) | 0;\n symbol = 1;\n }\n\n // Normalize\n if (rd.range < kTopValue) {\n rd.range = (rd.range << 8) >>> 0;\n rd.code = ((rd.code << 8) | (rd.pos < rd.stream.length ? rd.stream[rd.pos++] : 0)) >>> 0;\n }\n\n return symbol;\n}\n\n/**\n * BCJ2 multi-stream decoder\n * Takes 4 pre-decompressed streams and combines them\n */\nexport function decodeBcj2Multi(streams: Buffer[], _properties?: Buffer, unpackSize?: number): Buffer {\n if (streams.length !== 4) {\n throw new Error(`BCJ2 requires 4 input streams, got ${streams.length}`);\n }\n\n // Stream assignment (based on 7z bind pair convention):\n // streams[0] = main data (after LZMA2)\n // streams[1] = call stream (after LZMA)\n // streams[2] = jump stream (after LZMA)\n // streams[3] = range coder stream (uncompressed)\n const mainStream = streams[0];\n const callStream = streams[1];\n const jumpStream = streams[2];\n const rcStream = streams[3];\n\n // Output buffer\n const outSize = unpackSize || mainStream.length + callStream.length + jumpStream.length;\n const output = allocBuffer(outSize);\n let outPos = 0;\n\n // Stream positions\n let mainPos = 0;\n let callPos = 0;\n let jumpPos = 0;\n\n // Initialize range decoder\n const rd = initRangeDecoder(rcStream);\n\n // Initialize probability models\n const probs: number[] = [];\n for (let i = 0; i < kNumProbs; i++) {\n probs.push(kBitModelTotal >>> 1);\n }\n\n // Track previous byte for probability context\n let prevByte = 0;\n\n // Instruction pointer for address conversion\n let ip = 0;\n\n while (outPos < outSize && mainPos < mainStream.length) {\n const b = mainStream[mainPos++];\n\n // Check for branch opcodes\n if (b === 0xe8 || b === 0xe9) {\n // CALL (0xE8) or JMP (0xE9)\n // Use range decoder to check if this should be processed\n // Probability index: E8 uses 2 + prevByte, E9 uses 1\n const probIndex = b === 0xe8 ? 2 + prevByte : 1;\n const isMatch = decodeBit(rd, probs, probIndex);\n\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n\n if (isMatch) {\n // Read 4-byte address from appropriate stream\n const addrStream = b === 0xe8 ? callStream : jumpStream;\n const addrPos = b === 0xe8 ? callPos : jumpPos;\n\n if (addrPos + 4 > addrStream.length) {\n // Not enough data, copy remaining\n break;\n }\n\n // Check if we have room for 4 address bytes\n if (outPos + 4 > outSize) break;\n\n // Read as big-endian (BCJ2 stores addresses big-endian)\n let addr = (addrStream[addrPos] << 24) | (addrStream[addrPos + 1] << 16) | (addrStream[addrPos + 2] << 8) | addrStream[addrPos + 3];\n\n if (b === 0xe8) {\n callPos += 4;\n } else {\n jumpPos += 4;\n }\n\n // Convert absolute to relative address\n addr = (addr - (ip + 4)) | 0;\n\n // Write as little-endian\n output[outPos++] = addr & 0xff;\n output[outPos++] = (addr >>> 8) & 0xff;\n output[outPos++] = (addr >>> 16) & 0xff;\n output[outPos++] = (addr >>> 24) & 0xff;\n ip += 4;\n\n prevByte = (addr >>> 24) & 0xff;\n } else {\n prevByte = b;\n }\n } else if (b === 0x0f && mainPos < mainStream.length) {\n // Potential conditional jump (0x0F 0x8x)\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n\n const b2 = mainStream[mainPos];\n if ((b2 & 0xf0) === 0x80) {\n // Conditional jump\n mainPos++;\n // Probability index 0 for conditional jumps (since b2 != 0xE8 and b2 != 0xE9)\n const probIndex2 = 0;\n const isMatch2 = decodeBit(rd, probs, probIndex2);\n\n if (outPos >= outSize) break;\n output[outPos++] = b2;\n ip++;\n\n if (isMatch2) {\n // Read 4-byte address from jump stream\n if (jumpPos + 4 > jumpStream.length) {\n break;\n }\n\n // Check if we have room for 4 address bytes\n if (outPos + 4 > outSize) break;\n\n let addr2 = (jumpStream[jumpPos] << 24) | (jumpStream[jumpPos + 1] << 16) | (jumpStream[jumpPos + 2] << 8) | jumpStream[jumpPos + 3];\n jumpPos += 4;\n\n // Convert absolute to relative\n addr2 = (addr2 - (ip + 4)) | 0;\n\n // Write as little-endian\n output[outPos++] = addr2 & 0xff;\n output[outPos++] = (addr2 >>> 8) & 0xff;\n output[outPos++] = (addr2 >>> 16) & 0xff;\n output[outPos++] = (addr2 >>> 24) & 0xff;\n ip += 4;\n\n prevByte = (addr2 >>> 24) & 0xff;\n } else {\n prevByte = b2;\n }\n } else {\n prevByte = b;\n }\n } else {\n // Regular byte\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n prevByte = b;\n }\n }\n\n // Return only the used portion\n return outPos < output.length ? output.slice(0, outPos) : output;\n}\n\n/**\n * Single-buffer decode (for API compatibility)\n * Note: BCJ2 requires multi-stream, this throws\n */\nexport function decodeBcj2(_input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n throw new Error('BCJ2 requires multi-stream decoding - use decodeBcj2Multi');\n}\n\n/**\n * Create a BCJ2 decoder Transform stream\n * Note: BCJ2 requires multi-stream, this is for API compatibility\n */\nexport function createBcj2Decoder(_properties?: Buffer, _unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcj2, _properties, _unpackSize);\n}\n"],"names":["createBcj2Decoder","decodeBcj2","decodeBcj2Multi","kTopValue","kNumBitModelTotalBits","kBitModelTotal","kNumMoveBits","kNumProbs","initRangeDecoder","stream","rd","range","code","pos","i","length","decodeBit","prob","probIndex","ttt","bound","symbol","streams","_properties","unpackSize","Error","mainStream","callStream","jumpStream","rcStream","outSize","output","allocBuffer","outPos","mainPos","callPos","jumpPos","probs","push","prevByte","ip","b","isMatch","addrStream","addrPos","addr","b2","probIndex2","isMatch2","addr2","slice","_input","_unpackSize","createBufferingDecoder"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/BZip2.ts"],"sourcesContent":["// BZip2 codec - bzip2 compression\n// 7z stores bzip2 data with the standard BZh header\n//\n// Uses unbzip2-stream's internal bzip2 library for both sync and streaming decompression\n\nimport { bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport unbzip2Stream from 'unbzip2-stream';\n\n// Access the internal bzip2 decoder from unbzip2-stream\nimport bzip2 from 'unbzip2-stream/lib/bzip2.js';\n\n/**\n * Decode BZip2 compressed data synchronously\n *\n * @param input - BZip2 compressed data (with BZh header)\n * @param _properties - Unused for BZip2\n * @param _unpackSize - Unused\n * @returns Decompressed data\n */\nexport function decodeBzip2(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n const chunks: number[] = [];\n // Pass buffer directly - simple() calls array() internally\n bzip2.simple(input, (byte: number) => {\n chunks.push(byte);\n });\n return bufferFrom(chunks);\n}\n\n/**\n * Create a BZip2 decoder Transform stream\n * Uses unbzip2-stream for true streaming decompression (block by block)\n */\nexport function createBzip2Decoder(_properties?: Buffer, _unpackSize?: number): Transform {\n return unbzip2Stream() as Transform;\n}\n"],"names":["createBzip2Decoder","decodeBzip2","input","_properties","_unpackSize","chunks","bzip2","simple","byte","push","bufferFrom","unbzip2Stream"],"mappings":"AAAA,kCAAkC;AAClC,oDAAoD;AACpD,EAAE;AACF,yFAAyF;;;;;;;;;;;;QA8BzEA;eAAAA;;QAbAC;eAAAA;;;mCAfW;oEAED;4DAGR;;;;;;AAUX,SAASA,YAAYC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACnF,IAAMC,SAAmB,EAAE;IAC3B,2DAA2D;IAC3DC,cAAK,CAACC,MAAM,CAACL,OAAO,SAACM;QACnBH,OAAOI,IAAI,CAACD;IACd;IACA,OAAOE,IAAAA,+BAAU,EAACL;AACpB;AAMO,SAASL,mBAAmBG,WAAoB,EAAEC,WAAoB;IAC3E,OAAOO,IAAAA,sBAAa;AACtB"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/BZip2.ts"],"sourcesContent":["// BZip2 codec - bzip2 compression\n// 7z stores bzip2 data with the standard BZh header\n//\n// Uses unbzip2-stream's internal bzip2 library for both sync and streaming decompression\n\nimport { bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport unbzip2Stream from 'unbzip2-stream';\n\n// Access the internal bzip2 decoder from unbzip2-stream\nimport bzip2 from 'unbzip2-stream/lib/bzip2.js';\n\n/**\n * Decode BZip2 compressed data synchronously\n *\n * @param input - BZip2 compressed data (with BZh header)\n * @param _properties - Unused for BZip2\n * @param _unpackSize - Unused\n * @returns Decompressed data\n */\nexport function decodeBzip2(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n const chunks: number[] = [];\n // Pass buffer directly - simple() calls array() internally\n bzip2.simple(input, (byte: number) => {\n chunks.push(byte);\n });\n return bufferFrom(chunks);\n}\n\n/**\n * Create a BZip2 decoder Transform stream\n * Uses unbzip2-stream for true streaming decompression (block by block)\n */\nexport function createBzip2Decoder(_properties?: Buffer, _unpackSize?: number): Transform {\n return unbzip2Stream() as Transform;\n}\n"],"names":["createBzip2Decoder","decodeBzip2","input","_properties","_unpackSize","chunks","bzip2","simple","byte","push","bufferFrom","unbzip2Stream"],"mappings":"AAAA,kCAAkC;AAClC,oDAAoD;AACpD,EAAE;AACF,yFAAyF;;;;;;;;;;;;QA8BzEA;eAAAA;;QAbAC;eAAAA;;;mCAfW;oEAED;4DAGR;;;;;;AAUX,SAASA,YAAYC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACnF,IAAMC,SAAmB,EAAE;IAC3B,2DAA2D;IAC3DC,cAAK,CAACC,MAAM,CAACL,OAAO,SAACM;QACnBH,OAAOI,IAAI,CAACD;IACd;IACA,OAAOE,IAAAA,+BAAU,EAACL;AACpB;AAMO,SAASL,mBAAmBG,WAAoB,EAAEC,WAAoB;IAC3E,OAAOO,IAAAA,sBAAa;AACtB"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/Copy.ts"],"sourcesContent":["// Copy codec - passthrough (no compression)\n// This is the simplest codec, just passes data through unchanged\n\nimport { PassThrough, type Transform } from 'extract-base-iterator';\n\n/**\n * Create a Copy decoder stream\n * Simply passes through data unchanged\n */\nexport function createCopyDecoder(): InstanceType<typeof Transform> {\n return new PassThrough();\n}\n\n/**\n * Decode a buffer using Copy codec (no-op)\n * @param input - Input buffer\n * @param _properties - Unused\n * @param _unpackSize - Unused\n * @returns Same buffer (no transformation)\n */\nexport function decodeCopy(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n return input;\n}\n"],"names":["createCopyDecoder","decodeCopy","PassThrough","input","_properties","_unpackSize"],"mappings":"AAAA,4CAA4C;AAC5C,iEAAiE;;;;;;;;;;;;QAQjDA;eAAAA;;QAWAC;eAAAA;;;mCAjB4B;AAMrC,SAASD;IACd,OAAO,IAAIE,gCAAW;AACxB;AASO,SAASD,WAAWE,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IAClF,OAAOF;AACT"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Copy.ts"],"sourcesContent":["// Copy codec - passthrough (no compression)\n// This is the simplest codec, just passes data through unchanged\n\nimport { PassThrough, type Transform } from 'extract-base-iterator';\n\n/**\n * Create a Copy decoder stream\n * Simply passes through data unchanged\n */\nexport function createCopyDecoder(): InstanceType<typeof Transform> {\n return new PassThrough();\n}\n\n/**\n * Decode a buffer using Copy codec (no-op)\n * @param input - Input buffer\n * @param _properties - Unused\n * @param _unpackSize - Unused\n * @returns Same buffer (no transformation)\n */\nexport function decodeCopy(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n return input;\n}\n"],"names":["createCopyDecoder","decodeCopy","PassThrough","input","_properties","_unpackSize"],"mappings":"AAAA,4CAA4C;AAC5C,iEAAiE;;;;;;;;;;;;QAQjDA;eAAAA;;QAWAC;eAAAA;;;mCAjB4B;AAMrC,SAASD;IACd,OAAO,IAAIE,gCAAW;AACxB;AASO,SAASD,WAAWE,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IAClF,OAAOF;AACT"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/createBufferingDecoder.ts"],"sourcesContent":["// Helper to create a Transform stream that buffers all input before decoding\n// Used by codecs that need the full input before decompression (LZMA, LZMA2, BZip2, etc.)\n\nimport { Transform } from 'extract-base-iterator';\nimport type { DecodeCallback } from 'xz-compat';\n\ntype TransformCallback = (error?: Error | null, data?: Buffer) => void;\n\nexport type DecodeFn = (input: Buffer, properties?: Buffer, unpackSize?: number, callback?: DecodeCallback<Buffer>) => Buffer | Promise<Buffer> | void;\n\n/**\n * Create a Transform stream that buffers all input, then decodes in flush\n * This is the common pattern for codecs that can't stream (need full input)\n */\nexport default function createBufferingDecoder(decodeFn: DecodeFn, properties?: Buffer, unpackSize?: number): InstanceType<typeof Transform> {\n const chunks: Buffer[] = [];\n\n return new Transform({\n transform: (chunk: Buffer, _encoding: string, callback: TransformCallback) => {\n chunks.push(chunk);\n callback();\n },\n flush: function (callback: TransformCallback) {\n const input = Buffer.concat(chunks);\n const finish = (err?: Error | null, output?: Buffer) => {\n if (err) {\n callback(err);\n return;\n }\n if (output) {\n this.push(output);\n }\n callback();\n };\n\n try {\n const maybeResult = decodeFn(input, properties, unpackSize, finish);\n if (maybeResult && typeof (maybeResult as Promise<Buffer>).then === 'function') {\n (maybeResult as Promise<Buffer>).then(\n (value) => finish(null, value),\n (err) => finish(err as Error)\n );\n return;\n }\n if (Buffer.isBuffer(maybeResult)) {\n finish(null, maybeResult);\n }\n } catch (err) {\n callback(err as Error);\n }\n },\n });\n}\n"],"names":["createBufferingDecoder","decodeFn","properties","unpackSize","chunks","Transform","transform","chunk","_encoding","callback","push","flush","input","Buffer","concat","finish","err","output","maybeResult","then","value","isBuffer"],"mappings":"AAAA,6EAA6E;AAC7E,0FAA0F;;;;;+BAS1F;;;CAGC,GACD;;;eAAwBA;;;mCAXE;AAWX,SAASA,uBAAuBC,QAAkB,EAAEC,UAAmB,EAAEC,UAAmB;IACzG,IAAMC,SAAmB,EAAE;IAE3B,OAAO,IAAIC,8BAAS,CAAC;QACnBC,WAAW,SAACC,OAAeC,WAAmBC;YAC5CL,OAAOM,IAAI,CAACH;YACZE;QACF;QACAE,OAAO,SAAPA,MAAiBF,QAA2B;;YAC1C,IAAMG,QAAQC,OAAOC,MAAM,CAACV;YAC5B,IAAMW,SAAS,SAACC,KAAoBC;gBAClC,IAAID,KAAK;oBACPP,SAASO;oBACT;gBACF;gBACA,IAAIC,QAAQ;oBACV,MAAKP,IAAI,CAACO;gBACZ;gBACAR;YACF;YAEA,IAAI;gBACF,IAAMS,cAAcjB,SAASW,OAAOV,YAAYC,YAAYY;gBAC5D,IAAIG,eAAe,OAAO,AAACA,YAAgCC,IAAI,KAAK,YAAY;oBAC7ED,YAAgCC,IAAI,CACnC,SAACC;+BAAUL,OAAO,MAAMK;uBACxB,SAACJ;+BAAQD,OAAOC;;oBAElB;gBACF;gBACA,IAAIH,OAAOQ,QAAQ,CAACH,cAAc;oBAChCH,OAAO,MAAMG;gBACf;YACF,EAAE,OAAOF,KAAK;gBACZP,SAASO;YACX;QACF;IACF;AACF"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/createBufferingDecoder.ts"],"sourcesContent":["// Helper to create a Transform stream that buffers all input before decoding\n// Used by codecs that need the full input before decompression (LZMA, LZMA2, BZip2, etc.)\n\nimport { Transform } from 'extract-base-iterator';\nimport type { DecodeCallback } from 'xz-compat';\n\ntype TransformCallback = (error?: Error | null, data?: Buffer) => void;\n\nexport type DecodeFn = (input: Buffer, properties?: Buffer, unpackSize?: number, callback?: DecodeCallback<Buffer>) => Buffer | Promise<Buffer> | void;\n\n/**\n * Create a Transform stream that buffers all input, then decodes in flush\n * This is the common pattern for codecs that can't stream (need full input)\n */\nexport default function createBufferingDecoder(decodeFn: DecodeFn, properties?: Buffer, unpackSize?: number): InstanceType<typeof Transform> {\n const chunks: Buffer[] = [];\n\n return new Transform({\n transform: (chunk: Buffer, _encoding: string, callback: TransformCallback) => {\n chunks.push(chunk);\n callback();\n },\n flush: function (callback: TransformCallback) {\n const input = Buffer.concat(chunks);\n const finish = (err?: Error | null, output?: Buffer) => {\n if (err) {\n callback(err);\n return;\n }\n if (output) {\n this.push(output);\n }\n callback();\n };\n\n try {\n const maybeResult = decodeFn(input, properties, unpackSize, finish);\n if (maybeResult && typeof (maybeResult as Promise<Buffer>).then === 'function') {\n (maybeResult as Promise<Buffer>).then(\n (value) => finish(null, value),\n (err) => finish(err as Error)\n );\n return;\n }\n if (Buffer.isBuffer(maybeResult)) {\n finish(null, maybeResult);\n }\n } catch (err) {\n callback(err as Error);\n }\n },\n });\n}\n"],"names":["createBufferingDecoder","decodeFn","properties","unpackSize","chunks","Transform","transform","chunk","_encoding","callback","push","flush","input","Buffer","concat","finish","err","output","maybeResult","then","value","isBuffer"],"mappings":"AAAA,6EAA6E;AAC7E,0FAA0F;;;;;+BAS1F;;;CAGC,GACD;;;eAAwBA;;;mCAXE;AAWX,SAASA,uBAAuBC,QAAkB,EAAEC,UAAmB,EAAEC,UAAmB;IACzG,IAAMC,SAAmB,EAAE;IAE3B,OAAO,IAAIC,8BAAS,CAAC;QACnBC,WAAW,SAACC,OAAeC,WAAmBC;YAC5CL,OAAOM,IAAI,CAACH;YACZE;QACF;QACAE,OAAO,SAAPA,MAAiBF,QAA2B;;YAC1C,IAAMG,QAAQC,OAAOC,MAAM,CAACV;YAC5B,IAAMW,SAAS,SAACC,KAAoBC;gBAClC,IAAID,KAAK;oBACPP,SAASO;oBACT;gBACF;gBACA,IAAIC,QAAQ;oBACV,MAAKP,IAAI,CAACO;gBACZ;gBACAR;YACF;YAEA,IAAI;gBACF,IAAMS,cAAcjB,SAASW,OAAOV,YAAYC,YAAYY;gBAC5D,IAAIG,eAAe,OAAO,AAACA,YAAgCC,IAAI,KAAK,YAAY;oBAC7ED,YAAgCC,IAAI,CACnC,SAACC;+BAAUL,OAAO,MAAMK;uBACxB,SAACJ;+BAAQD,OAAOC;;oBAElB;gBACF;gBACA,IAAIH,OAAOQ,QAAQ,CAACH,cAAc;oBAChCH,OAAO,MAAMG;gBACf;YACF,EAAE,OAAOF,KAAK;gBACZP,SAASO;YACX;QACF;IACF;AACF"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/Deflate.ts"],"sourcesContent":["// Deflate codec - standard zlib/zip compression\n// 7z uses raw deflate without zlib or gzip headers\n//\n// Uses native zlib.createInflateRaw() for true streaming decompression\n// Falls back to pako for older Node versions via extract-base-iterator\n\nimport { createInflateRawStream, inflateRaw } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\n\n/**\n * Decode Deflate compressed data synchronously\n *\n * @param input - Deflate compressed data\n * @param _properties - Unused for Deflate\n * @param _unpackSize - Unused for Deflate\n * @returns Decompressed data\n */\nexport function decodeDeflate(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n return inflateRaw(input);\n}\n\n/**\n * Create a Deflate decoder Transform stream.\n * Uses zlib's streaming createInflateRaw() for true streaming decompression.\n * Data is decompressed incrementally as it flows through, not buffered.\n */\nexport function createDeflateDecoder(_properties?: Buffer, _unpackSize?: number): Transform {\n return createInflateRawStream() as Transform;\n}\n"],"names":["createDeflateDecoder","decodeDeflate","input","_properties","_unpackSize","inflateRaw","createInflateRawStream"],"mappings":"AAAA,gDAAgD;AAChD,mDAAmD;AACnD,EAAE;AACF,uEAAuE;AACvE,uEAAuE;;;;;;;;;;;;QAsBvDA;eAAAA;;QATAC;eAAAA;;;mCAXmC;AAW5C,SAASA,cAAcC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACrF,OAAOC,IAAAA,+BAAU,EAACH;AACpB;AAOO,SAASF,qBAAqBG,WAAoB,EAAEC,WAAoB;IAC7E,OAAOE,IAAAA,2CAAsB;AAC/B"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Deflate.ts"],"sourcesContent":["// Deflate codec - standard zlib/zip compression\n// 7z uses raw deflate without zlib or gzip headers\n//\n// Uses native zlib.createInflateRaw() for true streaming decompression\n// Falls back to pako for older Node versions via extract-base-iterator\n\nimport { createInflateRawStream, inflateRaw } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\n\n/**\n * Decode Deflate compressed data synchronously\n *\n * @param input - Deflate compressed data\n * @param _properties - Unused for Deflate\n * @param _unpackSize - Unused for Deflate\n * @returns Decompressed data\n */\nexport function decodeDeflate(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n return inflateRaw(input);\n}\n\n/**\n * Create a Deflate decoder Transform stream.\n * Uses zlib's streaming createInflateRaw() for true streaming decompression.\n * Data is decompressed incrementally as it flows through, not buffered.\n */\nexport function createDeflateDecoder(_properties?: Buffer, _unpackSize?: number): Transform {\n return createInflateRawStream() as Transform;\n}\n"],"names":["createDeflateDecoder","decodeDeflate","input","_properties","_unpackSize","inflateRaw","createInflateRawStream"],"mappings":"AAAA,gDAAgD;AAChD,mDAAmD;AACnD,EAAE;AACF,uEAAuE;AACvE,uEAAuE;;;;;;;;;;;;QAsBvDA;eAAAA;;QATAC;eAAAA;;;mCAXmC;AAW5C,SAASA,cAAcC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACrF,OAAOC,IAAAA,+BAAU,EAACH;AACpB;AAOO,SAASF,qBAAqBG,WAAoB,EAAEC,WAAoB;IAC7E,OAAOE,IAAAA,2CAAsB;AAC/B"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/index.ts"],"sourcesContent":["// Codec registry for 7z decompression\n// Each codec provides a decode function and optionally a streaming decoder\n\nimport type { BufferLike } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport {\n createLzma2Decoder as _createLzma2Decoder,\n createLzmaDecoder as _createLzmaDecoder,\n type DecodeCallback as CodecDecodeCallback,\n createBcjArm64Decoder,\n createBcjArmDecoder,\n createBcjArmtDecoder,\n createBcjDecoder,\n createBcjIa64Decoder,\n createBcjPpcDecoder,\n createBcjSparcDecoder,\n createDeltaDecoder,\n decode7zLzma,\n decode7zLzma2,\n decodeBcj,\n decodeBcjArm,\n decodeBcjArm64,\n decodeBcjArmt,\n decodeBcjIa64,\n decodeBcjPpc,\n decodeBcjSparc,\n decodeDelta,\n} from 'xz-compat';\nimport { CodecId, createCodedError, ErrorCode } from '../constants.ts';\nimport { createAesDecoder, decodeAes, getPassword, setPassword } from './Aes.ts';\nimport { createBcj2Decoder, decodeBcj2, decodeBcj2Multi } from './Bcj2.ts';\nimport { createBzip2Decoder, decodeBzip2 } from './BZip2.ts';\nimport { createCopyDecoder, decodeCopy } from './Copy.ts';\nimport { createDeflateDecoder, decodeDeflate } from './Deflate.ts';\n\n// Re-export password functions for API access\nexport { getPassword, setPassword };\n\nconst schedule = typeof setImmediate === 'function' ? setImmediate : (fn: () => void) => process.nextTick(fn);\n\nfunction wrapSyncDecode(fn: (input: Buffer, properties?: Buffer, unpackSize?: number) => Buffer): Codec['decode'] {\n return (input, properties, unpackSize, callback) => {\n schedule(() => {\n try {\n // Convert BufferList to Buffer if needed\n const buf = Buffer.isBuffer(input) ? input : input.toBuffer();\n callback(null, fn(buf, properties, unpackSize));\n } catch (err) {\n callback(err as Error);\n }\n });\n };\n}\n\nexport interface Codec {\n decode: (input: BufferLike, properties: Buffer | undefined, unpackSize: number | undefined, callback: CodecDecodeCallback<Buffer>) => void;\n createDecoder: (properties?: Buffer, unpackSize?: number) => Transform;\n}\n\n// Simple wrappers with validation that use xz-compat's optimized decode7zLzma/decode7zLzma2\nfunction decodeLzma(input: BufferLike, properties: Buffer, unpackSize: number, callback: CodecDecodeCallback<Buffer>): void {\n if (properties.length < 5) {\n throw new Error('LZMA requires 5-byte properties');\n }\n // Convert BufferList to Buffer if needed\n const buf = Buffer.isBuffer(input) ? input : input.toBuffer();\n decode7zLzma(buf, properties, unpackSize, callback);\n}\n\nfunction createLzmaDecoder(properties?: Buffer, unpackSize?: number): Transform {\n if (!properties || properties.length < 5) {\n throw new Error('LZMA requires 5-byte properties');\n }\n if (typeof unpackSize !== 'number' || unpackSize < 0) {\n throw new Error('LZMA requires known unpack size');\n }\n return _createLzmaDecoder(properties, unpackSize) as Transform;\n}\n\nfunction decodeLzma2(input: BufferLike, properties: Buffer, unpackSize: number | undefined, callback: CodecDecodeCallback<Buffer>): void {\n if (properties.length < 1) {\n throw new Error('LZMA2 requires properties byte');\n }\n // Convert BufferList to Buffer if needed\n const buf = Buffer.isBuffer(input) ? input : input.toBuffer();\n decode7zLzma2(buf, properties, unpackSize, callback);\n}\n\nfunction createLzma2Decoder(properties?: Buffer, _unpackSize?: number): Transform {\n if (!properties || properties.length < 1) {\n throw new Error('LZMA2 requires properties byte');\n }\n return _createLzma2Decoder(properties) as Transform;\n}\n\n// Registry of supported codecs\nconst codecs: { [key: string]: Codec } = {};\n\n/**\n * Convert codec ID bytes to a string key\n */\nfunction codecIdToKey(id: number[]): string {\n const parts: string[] = [];\n for (let i = 0; i < id.length; i++) {\n parts.push(id[i].toString(16).toUpperCase());\n }\n return parts.join('-');\n}\n\n/**\n * Check if two codec IDs match\n */\nfunction codecIdEquals(a: number[], b: number[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\n/**\n * Register a codec\n */\nexport function registerCodec(id: number[], codec: Codec): void {\n codecs[codecIdToKey(id)] = codec;\n}\n\n/**\n * Get a codec by ID\n * @throws Error if codec is not supported\n */\nexport function getCodec(id: number[]): Codec {\n const key = codecIdToKey(id);\n const codec = codecs[key];\n if (!codec) {\n throw createCodedError(`Unsupported codec: ${key}`, ErrorCode.UNSUPPORTED_CODEC);\n }\n return codec;\n}\n\n/**\n * Check if a codec is supported\n */\nexport function isCodecSupported(id: number[]): boolean {\n return codecs[codecIdToKey(id)] !== undefined;\n}\n\n/**\n * Get human-readable codec name\n */\nexport function getCodecName(id: number[]): string {\n if (codecIdEquals(id, CodecId.COPY)) return 'Copy';\n if (codecIdEquals(id, CodecId.LZMA)) return 'LZMA';\n if (codecIdEquals(id, CodecId.LZMA2)) return 'LZMA2';\n if (codecIdEquals(id, CodecId.BCJ_X86)) return 'BCJ (x86)';\n if (codecIdEquals(id, CodecId.BCJ_ARM)) return 'BCJ (ARM)';\n if (codecIdEquals(id, CodecId.BCJ_ARMT)) return 'BCJ (ARM Thumb)';\n if (codecIdEquals(id, CodecId.BCJ_ARM64)) return 'BCJ (ARM64)';\n if (codecIdEquals(id, CodecId.BCJ_PPC)) return 'BCJ (PowerPC)';\n if (codecIdEquals(id, CodecId.BCJ_IA64)) return 'BCJ (IA64)';\n if (codecIdEquals(id, CodecId.BCJ_SPARC)) return 'BCJ (SPARC)';\n if (codecIdEquals(id, CodecId.BCJ2)) return 'BCJ2';\n if (codecIdEquals(id, CodecId.PPMD)) return 'PPMd';\n if (codecIdEquals(id, CodecId.DELTA)) return 'Delta';\n if (codecIdEquals(id, CodecId.DEFLATE)) return 'Deflate';\n if (codecIdEquals(id, CodecId.BZIP2)) return 'BZip2';\n if (codecIdEquals(id, CodecId.AES)) return 'AES-256';\n return `Unknown (${codecIdToKey(id)})`;\n}\n\n/**\n * Check if a codec ID matches BCJ2\n */\nexport function isBcj2Codec(id: number[]): boolean {\n return codecIdEquals(id, CodecId.BCJ2);\n}\n\n// Re-export BCJ2 multi-stream decoder for special handling\nexport { decodeBcj2Multi };\n\n// Register built-in codecs\n\n// Copy codec (no compression)\nregisterCodec(CodecId.COPY, {\n decode: wrapSyncDecode(decodeCopy),\n createDecoder: createCopyDecoder,\n});\n\n// LZMA codec\nregisterCodec(CodecId.LZMA, {\n decode: decodeLzma,\n createDecoder: createLzmaDecoder,\n});\n\n// LZMA2 codec\nregisterCodec(CodecId.LZMA2, {\n decode: decodeLzma2,\n createDecoder: createLzma2Decoder,\n});\n\n// BCJ (x86) filter\nregisterCodec(CodecId.BCJ_X86, {\n decode: wrapSyncDecode(decodeBcj),\n createDecoder: createBcjDecoder,\n});\n\n// BCJ (ARM) filter\nregisterCodec(CodecId.BCJ_ARM, {\n decode: wrapSyncDecode(decodeBcjArm),\n createDecoder: createBcjArmDecoder,\n});\n\n// BCJ (ARM Thumb) filter\nregisterCodec(CodecId.BCJ_ARMT, {\n decode: wrapSyncDecode(decodeBcjArmt),\n createDecoder: createBcjArmtDecoder,\n});\n\n// BCJ (ARM64) filter\nregisterCodec(CodecId.BCJ_ARM64, {\n decode: wrapSyncDecode(decodeBcjArm64),\n createDecoder: createBcjArm64Decoder,\n});\n\n// BCJ (PowerPC) filter\nregisterCodec(CodecId.BCJ_PPC, {\n decode: wrapSyncDecode(decodeBcjPpc),\n createDecoder: createBcjPpcDecoder,\n});\n\n// BCJ (IA64) filter\nregisterCodec(CodecId.BCJ_IA64, {\n decode: wrapSyncDecode(decodeBcjIa64),\n createDecoder: createBcjIa64Decoder,\n});\n\n// BCJ (SPARC) filter\nregisterCodec(CodecId.BCJ_SPARC, {\n decode: wrapSyncDecode(decodeBcjSparc),\n createDecoder: createBcjSparcDecoder,\n});\n\n// Delta filter\nregisterCodec(CodecId.DELTA, {\n decode: wrapSyncDecode(decodeDelta),\n createDecoder: createDeltaDecoder,\n});\n\n// Deflate codec\nregisterCodec(CodecId.DEFLATE, {\n decode: wrapSyncDecode(decodeDeflate),\n createDecoder: createDeflateDecoder,\n});\n\n// BZip2 codec\nregisterCodec(CodecId.BZIP2, {\n decode: wrapSyncDecode(decodeBzip2),\n createDecoder: createBzip2Decoder,\n});\n\n// AES-256-CBC codec (encryption)\nregisterCodec(CodecId.AES, {\n decode: wrapSyncDecode(decodeAes),\n createDecoder: createAesDecoder,\n});\n\n// BCJ2 (x86-64) filter - multi-stream\n// Note: BCJ2 requires special handling in SevenZipParser due to 4-stream architecture\nregisterCodec(CodecId.BCJ2, {\n decode: decodeBcj2,\n createDecoder: createBcj2Decoder,\n});\n\n// Note: PPMd codec is not implemented. See FUTURE_ENHANCEMENTS.md\n"],"names":["decodeBcj2Multi","getCodec","getCodecName","getPassword","isBcj2Codec","isCodecSupported","registerCodec","setPassword","schedule","setImmediate","fn","process","nextTick","wrapSyncDecode","input","properties","unpackSize","callback","buf","Buffer","isBuffer","toBuffer","err","decodeLzma","length","Error","decode7zLzma","createLzmaDecoder","_createLzmaDecoder","decodeLzma2","decode7zLzma2","createLzma2Decoder","_unpackSize","_createLzma2Decoder","codecs","codecIdToKey","id","parts","i","push","toString","toUpperCase","join","codecIdEquals","a","b","codec","key","createCodedError","ErrorCode","UNSUPPORTED_CODEC","undefined","CodecId","COPY","LZMA","LZMA2","BCJ_X86","BCJ_ARM","BCJ_ARMT","BCJ_ARM64","BCJ_PPC","BCJ_IA64","BCJ_SPARC","BCJ2","PPMD","DELTA","DEFLATE","BZIP2","AES","decode","decodeCopy","createDecoder","createCopyDecoder","decodeBcj","createBcjDecoder","decodeBcjArm","createBcjArmDecoder","decodeBcjArmt","createBcjArmtDecoder","decodeBcjArm64","createBcjArm64Decoder","decodeBcjPpc","createBcjPpcDecoder","decodeBcjIa64","createBcjIa64Decoder","decodeBcjSparc","createBcjSparcDecoder","decodeDelta","createDeltaDecoder","decodeDeflate","createDeflateDecoder","decodeBzip2","createBzip2Decoder","decodeAes","createAesDecoder","decodeBcj2","createBcj2Decoder"],"mappings":"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"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/index.ts"],"sourcesContent":["// Codec registry for 7z decompression\n// Each codec provides a decode function and optionally a streaming decoder\n\nimport type { BufferLike } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport {\n createLzma2Decoder as _createLzma2Decoder,\n createLzmaDecoder as _createLzmaDecoder,\n type DecodeCallback as CodecDecodeCallback,\n createBcjArm64Decoder,\n createBcjArmDecoder,\n createBcjArmtDecoder,\n createBcjDecoder,\n createBcjIa64Decoder,\n createBcjPpcDecoder,\n createBcjSparcDecoder,\n createDeltaDecoder,\n decode7zLzma,\n decode7zLzma2,\n decodeBcj,\n decodeBcjArm,\n decodeBcjArm64,\n decodeBcjArmt,\n decodeBcjIa64,\n decodeBcjPpc,\n decodeBcjSparc,\n decodeDelta,\n} from 'xz-compat';\nimport { CodecId, createCodedError, ErrorCode } from '../constants.ts';\nimport { createAesDecoder, decodeAes, getPassword, setPassword } from './Aes.ts';\nimport { createBcj2Decoder, decodeBcj2, decodeBcj2Multi } from './Bcj2.ts';\nimport { createBzip2Decoder, decodeBzip2 } from './BZip2.ts';\nimport { createCopyDecoder, decodeCopy } from './Copy.ts';\nimport { createDeflateDecoder, decodeDeflate } from './Deflate.ts';\n\n// Re-export password functions for API access\nexport { getPassword, setPassword };\n\nconst schedule = typeof setImmediate === 'function' ? setImmediate : (fn: () => void) => process.nextTick(fn);\n\nfunction wrapSyncDecode(fn: (input: Buffer, properties?: Buffer, unpackSize?: number) => Buffer): Codec['decode'] {\n return (input, properties, unpackSize, callback) => {\n schedule(() => {\n try {\n // Convert BufferList to Buffer if needed\n const buf = Buffer.isBuffer(input) ? input : input.toBuffer();\n callback(null, fn(buf, properties, unpackSize));\n } catch (err) {\n callback(err as Error);\n }\n });\n };\n}\n\nexport interface Codec {\n decode: (input: BufferLike, properties: Buffer | undefined, unpackSize: number | undefined, callback: CodecDecodeCallback<Buffer>) => void;\n createDecoder: (properties?: Buffer, unpackSize?: number) => Transform;\n}\n\n// Simple wrappers with validation that use xz-compat's optimized decode7zLzma/decode7zLzma2\nfunction decodeLzma(input: BufferLike, properties: Buffer, unpackSize: number, callback: CodecDecodeCallback<Buffer>): void {\n if (properties.length < 5) {\n throw new Error('LZMA requires 5-byte properties');\n }\n // Convert BufferList to Buffer if needed\n const buf = Buffer.isBuffer(input) ? input : input.toBuffer();\n decode7zLzma(buf, properties, unpackSize, callback);\n}\n\nfunction createLzmaDecoder(properties?: Buffer, unpackSize?: number): Transform {\n if (!properties || properties.length < 5) {\n throw new Error('LZMA requires 5-byte properties');\n }\n if (typeof unpackSize !== 'number' || unpackSize < 0) {\n throw new Error('LZMA requires known unpack size');\n }\n return _createLzmaDecoder(properties, unpackSize) as Transform;\n}\n\nfunction decodeLzma2(input: BufferLike, properties: Buffer, unpackSize: number | undefined, callback: CodecDecodeCallback<Buffer>): void {\n if (properties.length < 1) {\n throw new Error('LZMA2 requires properties byte');\n }\n // Convert BufferList to Buffer if needed\n const buf = Buffer.isBuffer(input) ? input : input.toBuffer();\n decode7zLzma2(buf, properties, unpackSize, callback);\n}\n\nfunction createLzma2Decoder(properties?: Buffer, _unpackSize?: number): Transform {\n if (!properties || properties.length < 1) {\n throw new Error('LZMA2 requires properties byte');\n }\n return _createLzma2Decoder(properties) as Transform;\n}\n\n// Registry of supported codecs\nconst codecs: { [key: string]: Codec } = {};\n\n/**\n * Convert codec ID bytes to a string key\n */\nfunction codecIdToKey(id: number[]): string {\n const parts: string[] = [];\n for (let i = 0; i < id.length; i++) {\n parts.push(id[i].toString(16).toUpperCase());\n }\n return parts.join('-');\n}\n\n/**\n * Check if two codec IDs match\n */\nfunction codecIdEquals(a: number[], b: number[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\n/**\n * Register a codec\n */\nexport function registerCodec(id: number[], codec: Codec): void {\n codecs[codecIdToKey(id)] = codec;\n}\n\n/**\n * Get a codec by ID\n * @throws Error if codec is not supported\n */\nexport function getCodec(id: number[]): Codec {\n const key = codecIdToKey(id);\n const codec = codecs[key];\n if (!codec) {\n throw createCodedError(`Unsupported codec: ${key}`, ErrorCode.UNSUPPORTED_CODEC);\n }\n return codec;\n}\n\n/**\n * Check if a codec is supported\n */\nexport function isCodecSupported(id: number[]): boolean {\n return codecs[codecIdToKey(id)] !== undefined;\n}\n\n/**\n * Get human-readable codec name\n */\nexport function getCodecName(id: number[]): string {\n if (codecIdEquals(id, CodecId.COPY)) return 'Copy';\n if (codecIdEquals(id, CodecId.LZMA)) return 'LZMA';\n if (codecIdEquals(id, CodecId.LZMA2)) return 'LZMA2';\n if (codecIdEquals(id, CodecId.BCJ_X86)) return 'BCJ (x86)';\n if (codecIdEquals(id, CodecId.BCJ_ARM)) return 'BCJ (ARM)';\n if (codecIdEquals(id, CodecId.BCJ_ARMT)) return 'BCJ (ARM Thumb)';\n if (codecIdEquals(id, CodecId.BCJ_ARM64)) return 'BCJ (ARM64)';\n if (codecIdEquals(id, CodecId.BCJ_PPC)) return 'BCJ (PowerPC)';\n if (codecIdEquals(id, CodecId.BCJ_IA64)) return 'BCJ (IA64)';\n if (codecIdEquals(id, CodecId.BCJ_SPARC)) return 'BCJ (SPARC)';\n if (codecIdEquals(id, CodecId.BCJ2)) return 'BCJ2';\n if (codecIdEquals(id, CodecId.PPMD)) return 'PPMd';\n if (codecIdEquals(id, CodecId.DELTA)) return 'Delta';\n if (codecIdEquals(id, CodecId.DEFLATE)) return 'Deflate';\n if (codecIdEquals(id, CodecId.BZIP2)) return 'BZip2';\n if (codecIdEquals(id, CodecId.AES)) return 'AES-256';\n return `Unknown (${codecIdToKey(id)})`;\n}\n\n/**\n * Check if a codec ID matches BCJ2\n */\nexport function isBcj2Codec(id: number[]): boolean {\n return codecIdEquals(id, CodecId.BCJ2);\n}\n\n// Re-export BCJ2 multi-stream decoder for special handling\nexport { decodeBcj2Multi };\n\n// Register built-in codecs\n\n// Copy codec (no compression)\nregisterCodec(CodecId.COPY, {\n decode: wrapSyncDecode(decodeCopy),\n createDecoder: createCopyDecoder,\n});\n\n// LZMA codec\nregisterCodec(CodecId.LZMA, {\n decode: decodeLzma,\n createDecoder: createLzmaDecoder,\n});\n\n// LZMA2 codec\nregisterCodec(CodecId.LZMA2, {\n decode: decodeLzma2,\n createDecoder: createLzma2Decoder,\n});\n\n// BCJ (x86) filter\nregisterCodec(CodecId.BCJ_X86, {\n decode: wrapSyncDecode(decodeBcj),\n createDecoder: createBcjDecoder,\n});\n\n// BCJ (ARM) filter\nregisterCodec(CodecId.BCJ_ARM, {\n decode: wrapSyncDecode(decodeBcjArm),\n createDecoder: createBcjArmDecoder,\n});\n\n// BCJ (ARM Thumb) filter\nregisterCodec(CodecId.BCJ_ARMT, {\n decode: wrapSyncDecode(decodeBcjArmt),\n createDecoder: createBcjArmtDecoder,\n});\n\n// BCJ (ARM64) filter\nregisterCodec(CodecId.BCJ_ARM64, {\n decode: wrapSyncDecode(decodeBcjArm64),\n createDecoder: createBcjArm64Decoder,\n});\n\n// BCJ (PowerPC) filter\nregisterCodec(CodecId.BCJ_PPC, {\n decode: wrapSyncDecode(decodeBcjPpc),\n createDecoder: createBcjPpcDecoder,\n});\n\n// BCJ (IA64) filter\nregisterCodec(CodecId.BCJ_IA64, {\n decode: wrapSyncDecode(decodeBcjIa64),\n createDecoder: createBcjIa64Decoder,\n});\n\n// BCJ (SPARC) filter\nregisterCodec(CodecId.BCJ_SPARC, {\n decode: wrapSyncDecode(decodeBcjSparc),\n createDecoder: createBcjSparcDecoder,\n});\n\n// Delta filter\nregisterCodec(CodecId.DELTA, {\n decode: wrapSyncDecode(decodeDelta),\n createDecoder: createDeltaDecoder,\n});\n\n// Deflate codec\nregisterCodec(CodecId.DEFLATE, {\n decode: wrapSyncDecode(decodeDeflate),\n createDecoder: createDeflateDecoder,\n});\n\n// BZip2 codec\nregisterCodec(CodecId.BZIP2, {\n decode: wrapSyncDecode(decodeBzip2),\n createDecoder: createBzip2Decoder,\n});\n\n// AES-256-CBC codec (encryption)\nregisterCodec(CodecId.AES, {\n decode: wrapSyncDecode(decodeAes),\n createDecoder: createAesDecoder,\n});\n\n// BCJ2 (x86-64) filter - multi-stream\n// Note: BCJ2 requires special handling in SevenZipParser due to 4-stream architecture\nregisterCodec(CodecId.BCJ2, {\n decode: decodeBcj2,\n createDecoder: createBcj2Decoder,\n});\n\n// Note: PPMd codec is not implemented. See FUTURE_ENHANCEMENTS.md\n"],"names":["decodeBcj2Multi","getCodec","getCodecName","getPassword","isBcj2Codec","isCodecSupported","registerCodec","setPassword","schedule","setImmediate","fn","process","nextTick","wrapSyncDecode","input","properties","unpackSize","callback","buf","Buffer","isBuffer","toBuffer","err","decodeLzma","length","Error","decode7zLzma","createLzmaDecoder","_createLzmaDecoder","decodeLzma2","decode7zLzma2","createLzma2Decoder","_unpackSize","_createLzma2Decoder","codecs","codecIdToKey","id","parts","i","push","toString","toUpperCase","join","codecIdEquals","a","b","codec","key","createCodedError","ErrorCode","UNSUPPORTED_CODEC","undefined","CodecId","COPY","LZMA","LZMA2","BCJ_X86","BCJ_ARM","BCJ_ARMT","BCJ_ARM64","BCJ_PPC","BCJ_IA64","BCJ_SPARC","BCJ2","PPMD","DELTA","DEFLATE","BZIP2","AES","decode","decodeCopy","createDecoder","createCopyDecoder","decodeBcj","createBcjDecoder","decodeBcjArm","createBcjArmDecoder","decodeBcjArmt","createBcjArmtDecoder","decodeBcjArm64","createBcjArm64Decoder","decodeBcjPpc","createBcjPpcDecoder","decodeBcjIa64","createBcjIa64Decoder","decodeBcjSparc","createBcjSparcDecoder","decodeDelta","createDeltaDecoder","decodeDeflate","createDeflateDecoder","decodeBzip2","createBzip2Decoder","decodeAes","createAesDecoder","decodeBcj2","createBcj2Decoder"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/streams.ts"],"sourcesContent":["// Shared stream wrappers for lzma-purejs codec interface\n// These adapters convert between Buffer/lzma-purejs stream interfaces\n\nimport { allocBufferUnsafe } from 'extract-base-iterator';\n\n/**\n * Input stream wrapper for lzma-purejs\n * Wraps a Buffer region as a readable stream interface\n */\nexport function createInputStream(buffer: Buffer, offset: number, length: number) {\n let pos = 0;\n const end = Math.min(offset + length, buffer.length);\n const start = offset;\n\n return {\n readByte: (): number => {\n if (start + pos >= end) return -1;\n return buffer[start + pos++];\n },\n read: (buf: number[], bufOffset: number, len: number): number => {\n let bytesRead = 0;\n while (bytesRead < len && start + pos < end) {\n buf[bufOffset + bytesRead] = buffer[start + pos];\n pos++;\n bytesRead++;\n }\n return bytesRead === 0 ? -1 : bytesRead;\n },\n };\n}\n\n/**\n * Output stream wrapper for lzma-purejs\n * Collects output bytes into Buffer chunks\n * Uses typed arrays for memory efficiency (1 byte per element instead of 8)\n *\n * Memory optimization: If expectedSize is provided, pre-allocates a single buffer\n * to avoid double-memory during Buffer.concat.\n *\n * @param expectedSize - Optional expected output size for pre-allocation\n */\nexport function createOutputStream(expectedSize?: number) {\n // Pre-allocation mode: single buffer, no concat needed\n // Includes bounds checking for safety on older Node.js versions\n if (expectedSize && expectedSize > 0) {\n const buffer = allocBufferUnsafe(expectedSize);\n let bufPos = 0;\n const bufLen = buffer.length;\n\n return {\n writeByte: (b: number): void => {\n if (bufPos < bufLen) {\n buffer[bufPos++] = b;\n }\n // Silently ignore overflow (should not happen with correct size)\n },\n write: (buf: number[], bufOffset: number, len: number): number => {\n for (let i = 0; i < len && bufPos < bufLen; i++) {\n buffer[bufPos++] = buf[bufOffset + i];\n }\n return len;\n },\n flush: (): void => {\n // No-op for pre-allocated buffer\n },\n toBuffer: (): Buffer => {\n // Return only the used portion\n return bufPos < buffer.length ? buffer.slice(0, bufPos) : buffer;\n },\n };\n }\n\n // Chunked mode: accumulate in 64KB chunks (fallback for unknown size)\n const chunks: Buffer[] = [];\n const CHUNK_SIZE = 65536; // 64KB chunks for better memory efficiency\n let currentChunk: Buffer = allocBufferUnsafe(CHUNK_SIZE);\n let pos = 0;\n\n return {\n writeByte: (b: number): void => {\n currentChunk[pos++] = b;\n if (pos >= CHUNK_SIZE) {\n chunks.push(currentChunk);\n currentChunk = allocBufferUnsafe(CHUNK_SIZE);\n pos = 0;\n }\n },\n write: function (buf: number[], bufOffset: number, len: number): number {\n for (let i = 0; i < len; i++) {\n this.writeByte(buf[bufOffset + i]);\n }\n return len;\n },\n flush: (): void => {\n if (pos > 0) {\n // Only keep the used portion of the current chunk\n chunks.push(currentChunk.slice(0, pos));\n currentChunk = allocBufferUnsafe(CHUNK_SIZE);\n pos = 0;\n }\n },\n toBuffer: function (): Buffer {\n this.flush();\n // Optimization: if single chunk, return it directly\n if (chunks.length === 1) {\n return chunks[0];\n }\n return Buffer.concat(chunks);\n },\n };\n}\n"],"names":["createInputStream","createOutputStream","buffer","offset","length","pos","end","Math","min","start","readByte","read","buf","bufOffset","len","bytesRead","expectedSize","allocBufferUnsafe","bufPos","bufLen","writeByte","b","write","i","flush","toBuffer","slice","chunks","CHUNK_SIZE","currentChunk","push","Buffer","concat"],"mappings":"AAAA,yDAAyD;AACzD,sEAAsE;;;;;;;;;;;;QAQtDA;eAAAA;;QAgCAC;eAAAA;;;mCAtCkB;AAM3B,SAASD,kBAAkBE,MAAc,EAAEC,MAAc,EAAEC,MAAc;IAC9E,IAAIC,MAAM;IACV,IAAMC,MAAMC,KAAKC,GAAG,CAACL,SAASC,QAAQF,OAAOE,MAAM;IACnD,IAAMK,QAAQN;IAEd,OAAO;QACLO,UAAU;YACR,IAAID,QAAQJ,OAAOC,KAAK,OAAO,CAAC;YAChC,OAAOJ,MAAM,CAACO,QAAQJ,MAAM;QAC9B;QACAM,MAAM,SAACC,KAAeC,WAAmBC;YACvC,IAAIC,YAAY;YAChB,MAAOA,YAAYD,OAAOL,QAAQJ,MAAMC,IAAK;gBAC3CM,GAAG,CAACC,YAAYE,UAAU,GAAGb,MAAM,CAACO,QAAQJ,IAAI;gBAChDA;gBACAU;YACF;YACA,OAAOA,cAAc,IAAI,CAAC,IAAIA;QAChC;IACF;AACF;AAYO,SAASd,mBAAmBe,YAAqB;IACtD,uDAAuD;IACvD,gEAAgE;IAChE,IAAIA,gBAAgBA,eAAe,GAAG;QACpC,IAAMd,SAASe,IAAAA,sCAAiB,EAACD;QACjC,IAAIE,SAAS;QACb,IAAMC,SAASjB,OAAOE,MAAM;QAE5B,OAAO;YACLgB,WAAW,SAACC;gBACV,IAAIH,SAASC,QAAQ;oBACnBjB,MAAM,CAACgB,SAAS,GAAGG;gBACrB;YACA,iEAAiE;YACnE;YACAC,OAAO,SAACV,KAAeC,WAAmBC;gBACxC,IAAK,IAAIS,IAAI,GAAGA,IAAIT,OAAOI,SAASC,QAAQI,IAAK;oBAC/CrB,MAAM,CAACgB,SAAS,GAAGN,GAAG,CAACC,YAAYU,EAAE;gBACvC;gBACA,OAAOT;YACT;YACAU,OAAO;YACL,iCAAiC;YACnC;YACAC,UAAU;gBACR,+BAA+B;gBAC/B,OAAOP,SAAShB,OAAOE,MAAM,GAAGF,OAAOwB,KAAK,CAAC,GAAGR,UAAUhB;YAC5D;QACF;IACF;IAEA,sEAAsE;IACtE,IAAMyB,SAAmB,EAAE;IAC3B,IAAMC,aAAa,OAAO,2CAA2C;IACrE,IAAIC,eAAuBZ,IAAAA,sCAAiB,EAACW;IAC7C,IAAIvB,MAAM;IAEV,OAAO;QACLe,WAAW,SAACC;YACVQ,YAAY,CAACxB,MAAM,GAAGgB;YACtB,IAAIhB,OAAOuB,YAAY;gBACrBD,OAAOG,IAAI,CAACD;gBACZA,eAAeZ,IAAAA,sCAAiB,EAACW;gBACjCvB,MAAM;YACR;QACF;QACAiB,OAAO,SAAPA,MAAiBV,GAAa,EAAEC,SAAiB,EAAEC,GAAW;YAC5D,IAAK,IAAIS,IAAI,GAAGA,IAAIT,KAAKS,IAAK;gBAC5B,IAAI,CAACH,SAAS,CAACR,GAAG,CAACC,YAAYU,EAAE;YACnC;YACA,OAAOT;QACT;QACAU,OAAO;YACL,IAAInB,MAAM,GAAG;gBACX,kDAAkD;gBAClDsB,OAAOG,IAAI,CAACD,aAAaH,KAAK,CAAC,GAAGrB;gBAClCwB,eAAeZ,IAAAA,sCAAiB,EAACW;gBACjCvB,MAAM;YACR;QACF;QACAoB,UAAU,SAAVA;YACE,IAAI,CAACD,KAAK;YACV,oDAAoD;YACpD,IAAIG,OAAOvB,MAAM,KAAK,GAAG;gBACvB,OAAOuB,MAAM,CAAC,EAAE;YAClB;YACA,OAAOI,OAAOC,MAAM,CAACL;QACvB;IACF;AACF"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/streams.ts"],"sourcesContent":["// Shared stream wrappers for lzma-purejs codec interface\n// These adapters convert between Buffer/lzma-purejs stream interfaces\n\nimport { allocBufferUnsafe } from 'extract-base-iterator';\n\n/**\n * Input stream wrapper for lzma-purejs\n * Wraps a Buffer region as a readable stream interface\n */\nexport function createInputStream(buffer: Buffer, offset: number, length: number) {\n let pos = 0;\n const end = Math.min(offset + length, buffer.length);\n const start = offset;\n\n return {\n readByte: (): number => {\n if (start + pos >= end) return -1;\n return buffer[start + pos++];\n },\n read: (buf: number[], bufOffset: number, len: number): number => {\n let bytesRead = 0;\n while (bytesRead < len && start + pos < end) {\n buf[bufOffset + bytesRead] = buffer[start + pos];\n pos++;\n bytesRead++;\n }\n return bytesRead === 0 ? -1 : bytesRead;\n },\n };\n}\n\n/**\n * Output stream wrapper for lzma-purejs\n * Collects output bytes into Buffer chunks\n * Uses typed arrays for memory efficiency (1 byte per element instead of 8)\n *\n * Memory optimization: If expectedSize is provided, pre-allocates a single buffer\n * to avoid double-memory during Buffer.concat.\n *\n * @param expectedSize - Optional expected output size for pre-allocation\n */\nexport function createOutputStream(expectedSize?: number) {\n // Pre-allocation mode: single buffer, no concat needed\n // Includes bounds checking for safety on older Node.js versions\n if (expectedSize && expectedSize > 0) {\n const buffer = allocBufferUnsafe(expectedSize);\n let bufPos = 0;\n const bufLen = buffer.length;\n\n return {\n writeByte: (b: number): void => {\n if (bufPos < bufLen) {\n buffer[bufPos++] = b;\n }\n // Silently ignore overflow (should not happen with correct size)\n },\n write: (buf: number[], bufOffset: number, len: number): number => {\n for (let i = 0; i < len && bufPos < bufLen; i++) {\n buffer[bufPos++] = buf[bufOffset + i];\n }\n return len;\n },\n flush: (): void => {\n // No-op for pre-allocated buffer\n },\n toBuffer: (): Buffer => {\n // Return only the used portion\n return bufPos < buffer.length ? buffer.slice(0, bufPos) : buffer;\n },\n };\n }\n\n // Chunked mode: accumulate in 64KB chunks (fallback for unknown size)\n const chunks: Buffer[] = [];\n const CHUNK_SIZE = 65536; // 64KB chunks for better memory efficiency\n let currentChunk: Buffer = allocBufferUnsafe(CHUNK_SIZE);\n let pos = 0;\n\n return {\n writeByte: (b: number): void => {\n currentChunk[pos++] = b;\n if (pos >= CHUNK_SIZE) {\n chunks.push(currentChunk);\n currentChunk = allocBufferUnsafe(CHUNK_SIZE);\n pos = 0;\n }\n },\n write: function (buf: number[], bufOffset: number, len: number): number {\n for (let i = 0; i < len; i++) {\n this.writeByte(buf[bufOffset + i]);\n }\n return len;\n },\n flush: (): void => {\n if (pos > 0) {\n // Only keep the used portion of the current chunk\n chunks.push(currentChunk.slice(0, pos));\n currentChunk = allocBufferUnsafe(CHUNK_SIZE);\n pos = 0;\n }\n },\n toBuffer: function (): Buffer {\n this.flush();\n // Optimization: if single chunk, return it directly\n if (chunks.length === 1) {\n return chunks[0];\n }\n return Buffer.concat(chunks);\n },\n };\n}\n"],"names":["createInputStream","createOutputStream","buffer","offset","length","pos","end","Math","min","start","readByte","read","buf","bufOffset","len","bytesRead","expectedSize","allocBufferUnsafe","bufPos","bufLen","writeByte","b","write","i","flush","toBuffer","slice","chunks","CHUNK_SIZE","currentChunk","push","Buffer","concat"],"mappings":"AAAA,yDAAyD;AACzD,sEAAsE;;;;;;;;;;;;QAQtDA;eAAAA;;QAgCAC;eAAAA;;;mCAtCkB;AAM3B,SAASD,kBAAkBE,MAAc,EAAEC,MAAc,EAAEC,MAAc;IAC9E,IAAIC,MAAM;IACV,IAAMC,MAAMC,KAAKC,GAAG,CAACL,SAASC,QAAQF,OAAOE,MAAM;IACnD,IAAMK,QAAQN;IAEd,OAAO;QACLO,UAAU;YACR,IAAID,QAAQJ,OAAOC,KAAK,OAAO,CAAC;YAChC,OAAOJ,MAAM,CAACO,QAAQJ,MAAM;QAC9B;QACAM,MAAM,SAACC,KAAeC,WAAmBC;YACvC,IAAIC,YAAY;YAChB,MAAOA,YAAYD,OAAOL,QAAQJ,MAAMC,IAAK;gBAC3CM,GAAG,CAACC,YAAYE,UAAU,GAAGb,MAAM,CAACO,QAAQJ,IAAI;gBAChDA;gBACAU;YACF;YACA,OAAOA,cAAc,IAAI,CAAC,IAAIA;QAChC;IACF;AACF;AAYO,SAASd,mBAAmBe,YAAqB;IACtD,uDAAuD;IACvD,gEAAgE;IAChE,IAAIA,gBAAgBA,eAAe,GAAG;QACpC,IAAMd,SAASe,IAAAA,sCAAiB,EAACD;QACjC,IAAIE,SAAS;QACb,IAAMC,SAASjB,OAAOE,MAAM;QAE5B,OAAO;YACLgB,WAAW,SAACC;gBACV,IAAIH,SAASC,QAAQ;oBACnBjB,MAAM,CAACgB,SAAS,GAAGG;gBACrB;YACA,iEAAiE;YACnE;YACAC,OAAO,SAACV,KAAeC,WAAmBC;gBACxC,IAAK,IAAIS,IAAI,GAAGA,IAAIT,OAAOI,SAASC,QAAQI,IAAK;oBAC/CrB,MAAM,CAACgB,SAAS,GAAGN,GAAG,CAACC,YAAYU,EAAE;gBACvC;gBACA,OAAOT;YACT;YACAU,OAAO;YACL,iCAAiC;YACnC;YACAC,UAAU;gBACR,+BAA+B;gBAC/B,OAAOP,SAAShB,OAAOE,MAAM,GAAGF,OAAOwB,KAAK,CAAC,GAAGR,UAAUhB;YAC5D;QACF;IACF;IAEA,sEAAsE;IACtE,IAAMyB,SAAmB,EAAE;IAC3B,IAAMC,aAAa,OAAO,2CAA2C;IACrE,IAAIC,eAAuBZ,IAAAA,sCAAiB,EAACW;IAC7C,IAAIvB,MAAM;IAEV,OAAO;QACLe,WAAW,SAACC;YACVQ,YAAY,CAACxB,MAAM,GAAGgB;YACtB,IAAIhB,OAAOuB,YAAY;gBACrBD,OAAOG,IAAI,CAACD;gBACZA,eAAeZ,IAAAA,sCAAiB,EAACW;gBACjCvB,MAAM;YACR;QACF;QACAiB,OAAO,SAAPA,MAAiBV,GAAa,EAAEC,SAAiB,EAAEC,GAAW;YAC5D,IAAK,IAAIS,IAAI,GAAGA,IAAIT,KAAKS,IAAK;gBAC5B,IAAI,CAACH,SAAS,CAACR,GAAG,CAACC,YAAYU,EAAE;YACnC;YACA,OAAOT;QACT;QACAU,OAAO;YACL,IAAInB,MAAM,GAAG;gBACX,kDAAkD;gBAClDsB,OAAOG,IAAI,CAACD,aAAaH,KAAK,CAAC,GAAGrB;gBAClCwB,eAAeZ,IAAAA,sCAAiB,EAACW;gBACjCvB,MAAM;YACR;QACF;QACAoB,UAAU,SAAVA;YACE,IAAI,CAACD,KAAK;YACV,oDAAoD;YACpD,IAAIG,OAAOvB,MAAM,KAAK,GAAG;gBACvB,OAAOuB,MAAM,CAAC,EAAE;YAClB;YACA,OAAOI,OAAOC,MAAM,CAACL;QACvB;IACF;AACF"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/constants.ts"],"sourcesContent":["// 7z format constants\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n\n// 7z signature: '7z' + magic bytes\nexport const SEVENZ_MAGIC = [0x37, 0x7a, 0xbc, 0xaf, 0x27, 0x1c];\n\n// Header sizes\nexport const SIGNATURE_HEADER_SIZE = 32;\nexport const START_HEADER_SIZE = 20; // Part of signature header after magic + version\n\n// Property IDs for encoded header\nexport const PropertyId = {\n kEnd: 0x00,\n kHeader: 0x01,\n kArchiveProperties: 0x02,\n kAdditionalStreamsInfo: 0x03,\n kMainStreamsInfo: 0x04,\n kFilesInfo: 0x05,\n kPackInfo: 0x06,\n kUnpackInfo: 0x07,\n kSubStreamsInfo: 0x08,\n kSize: 0x09,\n kCRC: 0x0a,\n kFolder: 0x0b,\n kCodersUnpackSize: 0x0c,\n kNumUnpackStream: 0x0d,\n kEmptyStream: 0x0e,\n kEmptyFile: 0x0f,\n kAnti: 0x10,\n kName: 0x11,\n kCTime: 0x12,\n kATime: 0x13,\n kMTime: 0x14,\n kWinAttributes: 0x15,\n kComment: 0x16,\n kEncodedHeader: 0x17,\n kStartPos: 0x18,\n kDummy: 0x19,\n};\n\n// Codec IDs\n// 7z uses variable-length codec IDs\n// Reference: 7za i output shows hex codec IDs (e.g., 3030501 = ARM)\nexport const CodecId = {\n COPY: [0x00],\n DELTA: [0x03],\n LZMA: [0x03, 0x01, 0x01],\n LZMA2: [0x21],\n BCJ_X86: [0x03, 0x03, 0x01, 0x03],\n BCJ_PPC: [0x03, 0x03, 0x02, 0x05],\n BCJ_IA64: [0x03, 0x03, 0x04, 0x01],\n BCJ_ARM: [0x03, 0x03, 0x05, 0x01],\n BCJ_ARMT: [0x03, 0x03, 0x07, 0x01],\n BCJ_SPARC: [0x03, 0x03, 0x08, 0x05],\n BCJ_ARM64: [0x03, 0x03, 0x0a, 0x01],\n BCJ2: [0x03, 0x03, 0x01, 0x1b],\n PPMD: [0x03, 0x04, 0x01],\n DEFLATE: [0x04, 0x01, 0x08],\n BZIP2: [0x04, 0x02, 0x02],\n AES: [0x06, 0xf1, 0x07, 0x01],\n};\n\n// File attribute flags (Windows style, stored in FilesInfo)\nexport const FileAttribute = {\n READONLY: 0x01,\n HIDDEN: 0x02,\n SYSTEM: 0x04,\n DIRECTORY: 0x10,\n ARCHIVE: 0x20,\n DEVICE: 0x40,\n NORMAL: 0x80,\n TEMPORARY: 0x100,\n SPARSE_FILE: 0x200,\n REPARSE_POINT: 0x400,\n COMPRESSED: 0x800,\n OFFLINE: 0x1000,\n NOT_CONTENT_INDEXED: 0x2000,\n ENCRYPTED: 0x4000,\n UNIX_EXTENSION: 0x8000,\n};\n\n// Unix permission modes (decimal values for Node 0.8 compatibility)\nexport const UnixMode = {\n DIR: 16384, // 0o40000 - directory\n FILE: 32768, // 0o100000 - regular file\n SYMLINK: 40960, // 0o120000 - symbolic link\n RWXRWXRWX: 511, // 0o777\n RWXRXRX: 493, // 0o755\n RWRR: 420, // 0o644\n DEFAULT_DIR: 493, // 0o755 - rwxr-xr-x\n DEFAULT_FILE: 420, // 0o644 - rw-r--r--\n};\n\n// Error codes\nexport const ErrorCode = {\n INVALID_SIGNATURE: 'INVALID_SIGNATURE',\n CRC_MISMATCH: 'CRC_MISMATCH',\n UNSUPPORTED_CODEC: 'UNSUPPORTED_CODEC',\n UNSUPPORTED_VERSION: 'UNSUPPORTED_VERSION',\n UNSUPPORTED_FEATURE: 'UNSUPPORTED_FEATURE',\n TRUNCATED_ARCHIVE: 'TRUNCATED_ARCHIVE',\n CORRUPT_ARCHIVE: 'CORRUPT_ARCHIVE',\n CORRUPT_HEADER: 'CORRUPT_HEADER',\n ENCRYPTED_ARCHIVE: 'ENCRYPTED_ARCHIVE',\n COMPRESSED_HEADER: 'COMPRESSED_HEADER',\n DECOMPRESSION_FAILED: 'DECOMPRESSION_FAILED',\n};\n\n// Error with code property\nexport interface CodedError extends Error {\n code: string;\n}\n\n/**\n * Create an error with a code property\n */\nexport function createCodedError(message: string, code: string): CodedError {\n const err = new Error(message) as CodedError;\n err.code = code;\n return err;\n}\n"],"names":["CodecId","ErrorCode","FileAttribute","PropertyId","SEVENZ_MAGIC","SIGNATURE_HEADER_SIZE","START_HEADER_SIZE","UnixMode","createCodedError","kEnd","kHeader","kArchiveProperties","kAdditionalStreamsInfo","kMainStreamsInfo","kFilesInfo","kPackInfo","kUnpackInfo","kSubStreamsInfo","kSize","kCRC","kFolder","kCodersUnpackSize","kNumUnpackStream","kEmptyStream","kEmptyFile","kAnti","kName","kCTime","kATime","kMTime","kWinAttributes","kComment","kEncodedHeader","kStartPos","kDummy","COPY","DELTA","LZMA","LZMA2","BCJ_X86","BCJ_PPC","BCJ_IA64","BCJ_ARM","BCJ_ARMT","BCJ_SPARC","BCJ_ARM64","BCJ2","PPMD","DEFLATE","BZIP2","AES","READONLY","HIDDEN","SYSTEM","DIRECTORY","ARCHIVE","DEVICE","NORMAL","TEMPORARY","SPARSE_FILE","REPARSE_POINT","COMPRESSED","OFFLINE","NOT_CONTENT_INDEXED","ENCRYPTED","UNIX_EXTENSION","DIR","FILE","SYMLINK","RWXRWXRWX","RWXRXRX","RWRR","DEFAULT_DIR","DEFAULT_FILE","INVALID_SIGNATURE","CRC_MISMATCH","UNSUPPORTED_CODEC","UNSUPPORTED_VERSION","UNSUPPORTED_FEATURE","TRUNCATED_ARCHIVE","CORRUPT_ARCHIVE","CORRUPT_HEADER","ENCRYPTED_ARCHIVE","COMPRESSED_HEADER","DECOMPRESSION_FAILED","message","code","err","Error"],"mappings":"AAAA,sBAAsB;AACtB,wEAAwE;AAExE,mCAAmC;;;;;;;;;;;;QAwCtBA;eAAAA;;QAmDAC;eAAAA;;QA/BAC;eAAAA;;QApDAC;eAAAA;;QAPAC;eAAAA;;QAGAC;eAAAA;;QACAC;eAAAA;;QA0EAC;eAAAA;;QAkCGC;eAAAA;;;AAhHT,IAAMJ,eAAe;IAAC;IAAM;IAAM;IAAM;IAAM;IAAM;CAAK;AAGzD,IAAMC,wBAAwB;AAC9B,IAAMC,oBAAoB,IAAI,iDAAiD;AAG/E,IAAMH,aAAa;IACxBM,MAAM;IACNC,SAAS;IACTC,oBAAoB;IACpBC,wBAAwB;IACxBC,kBAAkB;IAClBC,YAAY;IACZC,WAAW;IACXC,aAAa;IACbC,iBAAiB;IACjBC,OAAO;IACPC,MAAM;IACNC,SAAS;IACTC,mBAAmB;IACnBC,kBAAkB;IAClBC,cAAc;IACdC,YAAY;IACZC,OAAO;IACPC,OAAO;IACPC,QAAQ;IACRC,QAAQ;IACRC,QAAQ;IACRC,gBAAgB;IAChBC,UAAU;IACVC,gBAAgB;IAChBC,WAAW;IACXC,QAAQ;AACV;AAKO,IAAMlC,UAAU;IACrBmC,MAAM;QAAC;KAAK;IACZC,OAAO;QAAC;KAAK;IACbC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,OAAO;QAAC;KAAK;IACbC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,UAAU;QAAC;QAAM;QAAM;QAAM;KAAK;IAClCC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,UAAU;QAAC;QAAM;QAAM;QAAM;KAAK;IAClCC,WAAW;QAAC;QAAM;QAAM;QAAM;KAAK;IACnCC,WAAW;QAAC;QAAM;QAAM;QAAM;KAAK;IACnCC,MAAM;QAAC;QAAM;QAAM;QAAM;KAAK;IAC9BC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,SAAS;QAAC;QAAM;QAAM;KAAK;IAC3BC,OAAO;QAAC;QAAM;QAAM;KAAK;IACzBC,KAAK;QAAC;QAAM;QAAM;QAAM;KAAK;AAC/B;AAGO,IAAMhD,gBAAgB;IAC3BiD,UAAU;IACVC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,SAAS;IACTC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,aAAa;IACbC,eAAe;IACfC,YAAY;IACZC,SAAS;IACTC,qBAAqB;IACrBC,WAAW;IACXC,gBAAgB;AAClB;AAGO,IAAM1D,WAAW;IACtB2D,KAAK;IACLC,MAAM;IACNC,SAAS;IACTC,WAAW;IACXC,SAAS;IACTC,MAAM;IACNC,aAAa;IACbC,cAAc;AAChB;AAGO,IAAMxE,YAAY;IACvByE,mBAAmB;IACnBC,cAAc;IACdC,mBAAmB;IACnBC,qBAAqB;IACrBC,qBAAqB;IACrBC,mBAAmB;IACnBC,iBAAiB;IACjBC,gBAAgB;IAChBC,mBAAmB;IACnBC,mBAAmB;IACnBC,sBAAsB;AACxB;AAUO,SAAS5E,iBAAiB6E,OAAe,EAAEC,IAAY;IAC5D,IAAMC,MAAM,IAAIC,MAAMH;IACtBE,IAAID,IAAI,GAAGA;IACX,OAAOC;AACT"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/constants.ts"],"sourcesContent":["// 7z format constants\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n\n// 7z signature: '7z' + magic bytes\nexport const SEVENZ_MAGIC = [0x37, 0x7a, 0xbc, 0xaf, 0x27, 0x1c];\n\n// Header sizes\nexport const SIGNATURE_HEADER_SIZE = 32;\nexport const START_HEADER_SIZE = 20; // Part of signature header after magic + version\n\n// Property IDs for encoded header\nexport const PropertyId = {\n kEnd: 0x00,\n kHeader: 0x01,\n kArchiveProperties: 0x02,\n kAdditionalStreamsInfo: 0x03,\n kMainStreamsInfo: 0x04,\n kFilesInfo: 0x05,\n kPackInfo: 0x06,\n kUnpackInfo: 0x07,\n kSubStreamsInfo: 0x08,\n kSize: 0x09,\n kCRC: 0x0a,\n kFolder: 0x0b,\n kCodersUnpackSize: 0x0c,\n kNumUnpackStream: 0x0d,\n kEmptyStream: 0x0e,\n kEmptyFile: 0x0f,\n kAnti: 0x10,\n kName: 0x11,\n kCTime: 0x12,\n kATime: 0x13,\n kMTime: 0x14,\n kWinAttributes: 0x15,\n kComment: 0x16,\n kEncodedHeader: 0x17,\n kStartPos: 0x18,\n kDummy: 0x19,\n};\n\n// Codec IDs\n// 7z uses variable-length codec IDs\n// Reference: 7za i output shows hex codec IDs (e.g., 3030501 = ARM)\nexport const CodecId = {\n COPY: [0x00],\n DELTA: [0x03],\n LZMA: [0x03, 0x01, 0x01],\n LZMA2: [0x21],\n BCJ_X86: [0x03, 0x03, 0x01, 0x03],\n BCJ_PPC: [0x03, 0x03, 0x02, 0x05],\n BCJ_IA64: [0x03, 0x03, 0x04, 0x01],\n BCJ_ARM: [0x03, 0x03, 0x05, 0x01],\n BCJ_ARMT: [0x03, 0x03, 0x07, 0x01],\n BCJ_SPARC: [0x03, 0x03, 0x08, 0x05],\n BCJ_ARM64: [0x03, 0x03, 0x0a, 0x01],\n BCJ2: [0x03, 0x03, 0x01, 0x1b],\n PPMD: [0x03, 0x04, 0x01],\n DEFLATE: [0x04, 0x01, 0x08],\n BZIP2: [0x04, 0x02, 0x02],\n AES: [0x06, 0xf1, 0x07, 0x01],\n};\n\n// File attribute flags (Windows style, stored in FilesInfo)\nexport const FileAttribute = {\n READONLY: 0x01,\n HIDDEN: 0x02,\n SYSTEM: 0x04,\n DIRECTORY: 0x10,\n ARCHIVE: 0x20,\n DEVICE: 0x40,\n NORMAL: 0x80,\n TEMPORARY: 0x100,\n SPARSE_FILE: 0x200,\n REPARSE_POINT: 0x400,\n COMPRESSED: 0x800,\n OFFLINE: 0x1000,\n NOT_CONTENT_INDEXED: 0x2000,\n ENCRYPTED: 0x4000,\n UNIX_EXTENSION: 0x8000,\n};\n\n// Unix permission modes (decimal values for Node 0.8 compatibility)\nexport const UnixMode = {\n DIR: 16384, // 0o40000 - directory\n FILE: 32768, // 0o100000 - regular file\n SYMLINK: 40960, // 0o120000 - symbolic link\n RWXRWXRWX: 511, // 0o777\n RWXRXRX: 493, // 0o755\n RWRR: 420, // 0o644\n DEFAULT_DIR: 493, // 0o755 - rwxr-xr-x\n DEFAULT_FILE: 420, // 0o644 - rw-r--r--\n};\n\n// Error codes\nexport const ErrorCode = {\n INVALID_SIGNATURE: 'INVALID_SIGNATURE',\n CRC_MISMATCH: 'CRC_MISMATCH',\n UNSUPPORTED_CODEC: 'UNSUPPORTED_CODEC',\n UNSUPPORTED_VERSION: 'UNSUPPORTED_VERSION',\n UNSUPPORTED_FEATURE: 'UNSUPPORTED_FEATURE',\n TRUNCATED_ARCHIVE: 'TRUNCATED_ARCHIVE',\n CORRUPT_ARCHIVE: 'CORRUPT_ARCHIVE',\n CORRUPT_HEADER: 'CORRUPT_HEADER',\n ENCRYPTED_ARCHIVE: 'ENCRYPTED_ARCHIVE',\n COMPRESSED_HEADER: 'COMPRESSED_HEADER',\n DECOMPRESSION_FAILED: 'DECOMPRESSION_FAILED',\n};\n\n// Error with code property\nexport interface CodedError extends Error {\n code: string;\n}\n\n/**\n * Create an error with a code property\n */\nexport function createCodedError(message: string, code: string): CodedError {\n const err = new Error(message) as CodedError;\n err.code = code;\n return err;\n}\n"],"names":["CodecId","ErrorCode","FileAttribute","PropertyId","SEVENZ_MAGIC","SIGNATURE_HEADER_SIZE","START_HEADER_SIZE","UnixMode","createCodedError","kEnd","kHeader","kArchiveProperties","kAdditionalStreamsInfo","kMainStreamsInfo","kFilesInfo","kPackInfo","kUnpackInfo","kSubStreamsInfo","kSize","kCRC","kFolder","kCodersUnpackSize","kNumUnpackStream","kEmptyStream","kEmptyFile","kAnti","kName","kCTime","kATime","kMTime","kWinAttributes","kComment","kEncodedHeader","kStartPos","kDummy","COPY","DELTA","LZMA","LZMA2","BCJ_X86","BCJ_PPC","BCJ_IA64","BCJ_ARM","BCJ_ARMT","BCJ_SPARC","BCJ_ARM64","BCJ2","PPMD","DEFLATE","BZIP2","AES","READONLY","HIDDEN","SYSTEM","DIRECTORY","ARCHIVE","DEVICE","NORMAL","TEMPORARY","SPARSE_FILE","REPARSE_POINT","COMPRESSED","OFFLINE","NOT_CONTENT_INDEXED","ENCRYPTED","UNIX_EXTENSION","DIR","FILE","SYMLINK","RWXRWXRWX","RWXRXRX","RWRR","DEFAULT_DIR","DEFAULT_FILE","INVALID_SIGNATURE","CRC_MISMATCH","UNSUPPORTED_CODEC","UNSUPPORTED_VERSION","UNSUPPORTED_FEATURE","TRUNCATED_ARCHIVE","CORRUPT_ARCHIVE","CORRUPT_HEADER","ENCRYPTED_ARCHIVE","COMPRESSED_HEADER","DECOMPRESSION_FAILED","message","code","err","Error"],"mappings":"AAAA,sBAAsB;AACtB,wEAAwE;AAExE,mCAAmC;;;;;;;;;;;;QAwCtBA;eAAAA;;QAmDAC;eAAAA;;QA/BAC;eAAAA;;QApDAC;eAAAA;;QAPAC;eAAAA;;QAGAC;eAAAA;;QACAC;eAAAA;;QA0EAC;eAAAA;;QAkCGC;eAAAA;;;AAhHT,IAAMJ,eAAe;IAAC;IAAM;IAAM;IAAM;IAAM;IAAM;CAAK;AAGzD,IAAMC,wBAAwB;AAC9B,IAAMC,oBAAoB,IAAI,iDAAiD;AAG/E,IAAMH,aAAa;IACxBM,MAAM;IACNC,SAAS;IACTC,oBAAoB;IACpBC,wBAAwB;IACxBC,kBAAkB;IAClBC,YAAY;IACZC,WAAW;IACXC,aAAa;IACbC,iBAAiB;IACjBC,OAAO;IACPC,MAAM;IACNC,SAAS;IACTC,mBAAmB;IACnBC,kBAAkB;IAClBC,cAAc;IACdC,YAAY;IACZC,OAAO;IACPC,OAAO;IACPC,QAAQ;IACRC,QAAQ;IACRC,QAAQ;IACRC,gBAAgB;IAChBC,UAAU;IACVC,gBAAgB;IAChBC,WAAW;IACXC,QAAQ;AACV;AAKO,IAAMlC,UAAU;IACrBmC,MAAM;QAAC;KAAK;IACZC,OAAO;QAAC;KAAK;IACbC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,OAAO;QAAC;KAAK;IACbC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,UAAU;QAAC;QAAM;QAAM;QAAM;KAAK;IAClCC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,UAAU;QAAC;QAAM;QAAM;QAAM;KAAK;IAClCC,WAAW;QAAC;QAAM;QAAM;QAAM;KAAK;IACnCC,WAAW;QAAC;QAAM;QAAM;QAAM;KAAK;IACnCC,MAAM;QAAC;QAAM;QAAM;QAAM;KAAK;IAC9BC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,SAAS;QAAC;QAAM;QAAM;KAAK;IAC3BC,OAAO;QAAC;QAAM;QAAM;KAAK;IACzBC,KAAK;QAAC;QAAM;QAAM;QAAM;KAAK;AAC/B;AAGO,IAAMhD,gBAAgB;IAC3BiD,UAAU;IACVC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,SAAS;IACTC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,aAAa;IACbC,eAAe;IACfC,YAAY;IACZC,SAAS;IACTC,qBAAqB;IACrBC,WAAW;IACXC,gBAAgB;AAClB;AAGO,IAAM1D,WAAW;IACtB2D,KAAK;IACLC,MAAM;IACNC,SAAS;IACTC,WAAW;IACXC,SAAS;IACTC,MAAM;IACNC,aAAa;IACbC,cAAc;AAChB;AAGO,IAAMxE,YAAY;IACvByE,mBAAmB;IACnBC,cAAc;IACdC,mBAAmB;IACnBC,qBAAqB;IACrBC,qBAAqB;IACrBC,mBAAmB;IACnBC,iBAAiB;IACjBC,gBAAgB;IAChBC,mBAAmB;IACnBC,mBAAmB;IACnBC,sBAAsB;AACxB;AAUO,SAAS5E,iBAAiB6E,OAAe,EAAEC,IAAY;IAC5D,IAAMC,MAAM,IAAIC,MAAMH;IACtBE,IAAID,IAAI,GAAGA;IACX,OAAOC;AACT"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/FolderStreamSplitter.ts"],"sourcesContent":["/**\n * FolderStreamSplitter - Splits a decompressed folder stream into individual file streams\n *\n * For multi-file solid archives, the folder is decompressed as a single stream.\n * This class splits that stream into individual file streams based on known file boundaries.\n *\n * Features:\n * - Lazy stream creation (streams created on first access)\n * - Backpressure propagation (returns false when downstream is full)\n * - Running CRC verification per file\n * - Automatic cleanup of completed streams\n */\n\nimport { crc32, PassThrough } from 'extract-base-iterator';\nimport type Stream from 'stream';\n\nexport interface FolderStreamSplitterOptions {\n /** Sizes of each file in the folder (in order) */\n fileSizes: number[];\n /** Whether to verify CRC for each file */\n verifyCrc?: boolean;\n /** Expected CRCs for each file (parallel to fileSizes) */\n expectedCrcs?: (number | undefined)[];\n}\n\n/**\n * Splits a decompressed folder stream into individual file streams.\n *\n * Usage:\n * ```\n * const splitter = new FolderStreamSplitter({ fileSizes: [1000, 2000, 500] });\n *\n * decompressStream.on('data', (chunk) => {\n * if (!splitter.write(chunk)) {\n * decompressStream.pause();\n * splitter.onDrain(() => decompressStream.resume());\n * }\n * });\n * decompressStream.on('end', () => splitter.end());\n *\n * // Get stream for file at index 1 (created lazily)\n * const fileStream = splitter.getFileStream(1);\n * ```\n */\nexport class FolderStreamSplitter {\n private fileBoundaries: number[]; // Cumulative offsets [0, size1, size1+size2, ...]\n private fileStreams: (Stream.PassThrough | null)[]; // Lazy-created, null after completion\n private fileCrcs: number[]; // Running CRC per file\n private currentFileIndex: number;\n private bytesWritten: number;\n private currentFileEnd: number;\n private verifyCrc: boolean;\n private expectedCrcs: (number | undefined)[];\n private finished: boolean;\n private error: Error | null;\n private drainCallbacks: (() => void)[];\n private _needsDrain: boolean;\n\n constructor(options: FolderStreamSplitterOptions) {\n const fileSizes = options.fileSizes;\n const verifyCrc = options.verifyCrc !== undefined ? options.verifyCrc : true;\n const expectedCrcs = options.expectedCrcs || [];\n\n this.verifyCrc = verifyCrc;\n this.expectedCrcs = expectedCrcs;\n this.currentFileIndex = 0;\n this.bytesWritten = 0;\n this.finished = false;\n this.error = null;\n this.drainCallbacks = [];\n this._needsDrain = false;\n\n // Calculate cumulative boundaries\n this.fileBoundaries = [0];\n for (let i = 0; i < fileSizes.length; i++) {\n this.fileBoundaries.push(this.fileBoundaries[this.fileBoundaries.length - 1] + fileSizes[i]);\n }\n\n // Initialize streams array (lazy creation - all null initially)\n this.fileStreams = [];\n this.fileCrcs = [];\n for (let i = 0; i < fileSizes.length; i++) {\n this.fileStreams.push(null);\n this.fileCrcs.push(0);\n }\n\n // Set first file boundary\n this.currentFileEnd = this.fileBoundaries[1] || 0;\n }\n\n /**\n * Write decompressed data chunk. Data is routed to appropriate file stream(s).\n * Returns false if backpressure should be applied (downstream is full).\n */\n write(chunk: Buffer): boolean {\n if (this.finished || this.error) return true;\n\n let offset = 0;\n let canContinue = true;\n\n while (offset < chunk.length && this.currentFileIndex < this.fileStreams.length) {\n const remaining = chunk.length - offset;\n const neededForFile = this.currentFileEnd - this.bytesWritten;\n const toWrite = Math.min(remaining, neededForFile);\n\n if (toWrite > 0) {\n const fileChunk = chunk.slice(offset, offset + toWrite);\n\n // Ensure stream exists (lazy creation)\n const fileStream = this.ensureFileStream(this.currentFileIndex);\n\n // Update CRC\n if (this.verifyCrc) {\n this.fileCrcs[this.currentFileIndex] = crc32(fileChunk, this.fileCrcs[this.currentFileIndex]);\n }\n\n // Write to file stream, track backpressure\n if (!fileStream.write(fileChunk)) {\n canContinue = false;\n this._needsDrain = true;\n fileStream.once('drain', () => {\n this._needsDrain = false;\n this.notifyDrain();\n });\n }\n }\n\n this.bytesWritten += toWrite;\n offset += toWrite;\n\n // Check if current file is complete\n if (this.bytesWritten >= this.currentFileEnd) {\n this.finishCurrentFile();\n }\n }\n\n return canContinue;\n }\n\n /**\n * Ensure stream exists for file index (lazy creation)\n */\n private ensureFileStream(fileIndex: number): Stream.PassThrough {\n let stream = this.fileStreams[fileIndex];\n if (!stream) {\n stream = new PassThrough();\n this.fileStreams[fileIndex] = stream;\n }\n return stream;\n }\n\n /**\n * Complete current file and move to next\n */\n private finishCurrentFile(): void {\n const fileStream = this.fileStreams[this.currentFileIndex];\n\n // Verify CRC if enabled\n if (this.verifyCrc) {\n const expectedCrc = this.expectedCrcs[this.currentFileIndex];\n if (expectedCrc !== undefined && this.fileCrcs[this.currentFileIndex] !== expectedCrc) {\n const err = new Error(`CRC mismatch for file ${this.currentFileIndex}: expected ${expectedCrc.toString(16)}, got ${this.fileCrcs[this.currentFileIndex].toString(16)}`);\n this.emitError(err);\n return;\n }\n }\n\n // End this file's stream\n if (fileStream) {\n fileStream.end();\n }\n\n // Release reference for GC\n this.fileStreams[this.currentFileIndex] = null;\n\n // Move to next file\n this.currentFileIndex++;\n if (this.currentFileIndex < this.fileBoundaries.length - 1) {\n this.currentFileEnd = this.fileBoundaries[this.currentFileIndex + 1];\n }\n }\n\n /**\n * Signal end of decompressed data\n */\n end(): void {\n if (this.finished) return;\n this.finished = true;\n\n // End any remaining streams\n for (let i = this.currentFileIndex; i < this.fileStreams.length; i++) {\n const stream = this.fileStreams[i];\n if (stream) {\n stream.end();\n }\n this.fileStreams[i] = null;\n }\n }\n\n /**\n * Emit error to all pending file streams\n */\n private emitError(err: Error): void {\n this.error = err;\n for (let i = this.currentFileIndex; i < this.fileStreams.length; i++) {\n const stream = this.fileStreams[i];\n if (stream) {\n stream.emit('error', err);\n stream.end();\n }\n this.fileStreams[i] = null;\n }\n }\n\n /**\n * Get the stream for a specific file by index.\n * Stream is created lazily on first access.\n */\n getFileStream(fileIndex: number): Stream.PassThrough {\n if (fileIndex < 0 || fileIndex >= this.fileBoundaries.length - 1) {\n throw new Error(`Invalid file index: ${fileIndex}`);\n }\n\n // Check if file already completed\n if (fileIndex < this.currentFileIndex) {\n throw new Error(`File ${fileIndex} already completed - streams must be accessed in order`);\n }\n\n return this.ensureFileStream(fileIndex);\n }\n\n /**\n * Register callback for when backpressure clears\n */\n onDrain(callback: () => void): void {\n if (!this._needsDrain) {\n callback();\n } else {\n this.drainCallbacks.push(callback);\n }\n }\n\n /**\n * Notify all drain callbacks\n */\n private notifyDrain(): void {\n const callbacks = this.drainCallbacks;\n this.drainCallbacks = [];\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i]();\n }\n }\n\n /**\n * Check if a specific file's stream has been fully written\n */\n isFileComplete(fileIndex: number): boolean {\n return fileIndex < this.currentFileIndex;\n }\n\n /**\n * Get total number of files in this folder\n */\n get fileCount(): number {\n return this.fileBoundaries.length - 1;\n }\n\n /**\n * Check if splitter has encountered an error\n */\n getError(): Error | null {\n return this.error;\n }\n}\n"],"names":["FolderStreamSplitter","options","fileSizes","verifyCrc","undefined","expectedCrcs","currentFileIndex","bytesWritten","finished","error","drainCallbacks","_needsDrain","fileBoundaries","i","length","push","fileStreams","fileCrcs","currentFileEnd","write","chunk","offset","canContinue","remaining","neededForFile","toWrite","Math","min","fileChunk","slice","fileStream","ensureFileStream","crc32","once","notifyDrain","finishCurrentFile","fileIndex","stream","PassThrough","expectedCrc","err","Error","toString","emitError","end","emit","getFileStream","onDrain","callback","callbacks","isFileComplete","getError","fileCount"],"mappings":"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"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/FolderStreamSplitter.ts"],"sourcesContent":["/**\n * FolderStreamSplitter - Splits a decompressed folder stream into individual file streams\n *\n * For multi-file solid archives, the folder is decompressed as a single stream.\n * This class splits that stream into individual file streams based on known file boundaries.\n *\n * Features:\n * - Lazy stream creation (streams created on first access)\n * - Backpressure propagation (returns false when downstream is full)\n * - Running CRC verification per file\n * - Automatic cleanup of completed streams\n */\n\nimport { crc32, PassThrough } from 'extract-base-iterator';\nimport type Stream from 'stream';\n\nexport interface FolderStreamSplitterOptions {\n /** Sizes of each file in the folder (in order) */\n fileSizes: number[];\n /** Whether to verify CRC for each file */\n verifyCrc?: boolean;\n /** Expected CRCs for each file (parallel to fileSizes) */\n expectedCrcs?: (number | undefined)[];\n}\n\n/**\n * Splits a decompressed folder stream into individual file streams.\n *\n * Usage:\n * ```\n * const splitter = new FolderStreamSplitter({ fileSizes: [1000, 2000, 500] });\n *\n * decompressStream.on('data', (chunk) => {\n * if (!splitter.write(chunk)) {\n * decompressStream.pause();\n * splitter.onDrain(() => decompressStream.resume());\n * }\n * });\n * decompressStream.on('end', () => splitter.end());\n *\n * // Get stream for file at index 1 (created lazily)\n * const fileStream = splitter.getFileStream(1);\n * ```\n */\nexport class FolderStreamSplitter {\n private fileBoundaries: number[]; // Cumulative offsets [0, size1, size1+size2, ...]\n private fileStreams: (Stream.PassThrough | null)[]; // Lazy-created, null after completion\n private fileCrcs: number[]; // Running CRC per file\n private currentFileIndex: number;\n private bytesWritten: number;\n private currentFileEnd: number;\n private verifyCrc: boolean;\n private expectedCrcs: (number | undefined)[];\n private finished: boolean;\n private error: Error | null;\n private drainCallbacks: (() => void)[];\n private _needsDrain: boolean;\n\n constructor(options: FolderStreamSplitterOptions) {\n const fileSizes = options.fileSizes;\n const verifyCrc = options.verifyCrc !== undefined ? options.verifyCrc : true;\n const expectedCrcs = options.expectedCrcs || [];\n\n this.verifyCrc = verifyCrc;\n this.expectedCrcs = expectedCrcs;\n this.currentFileIndex = 0;\n this.bytesWritten = 0;\n this.finished = false;\n this.error = null;\n this.drainCallbacks = [];\n this._needsDrain = false;\n\n // Calculate cumulative boundaries\n this.fileBoundaries = [0];\n for (let i = 0; i < fileSizes.length; i++) {\n this.fileBoundaries.push(this.fileBoundaries[this.fileBoundaries.length - 1] + fileSizes[i]);\n }\n\n // Initialize streams array (lazy creation - all null initially)\n this.fileStreams = [];\n this.fileCrcs = [];\n for (let i = 0; i < fileSizes.length; i++) {\n this.fileStreams.push(null);\n this.fileCrcs.push(0);\n }\n\n // Set first file boundary\n this.currentFileEnd = this.fileBoundaries[1] || 0;\n }\n\n /**\n * Write decompressed data chunk. Data is routed to appropriate file stream(s).\n * Returns false if backpressure should be applied (downstream is full).\n */\n write(chunk: Buffer): boolean {\n if (this.finished || this.error) return true;\n\n let offset = 0;\n let canContinue = true;\n\n while (offset < chunk.length && this.currentFileIndex < this.fileStreams.length) {\n const remaining = chunk.length - offset;\n const neededForFile = this.currentFileEnd - this.bytesWritten;\n const toWrite = Math.min(remaining, neededForFile);\n\n if (toWrite > 0) {\n const fileChunk = chunk.slice(offset, offset + toWrite);\n\n // Ensure stream exists (lazy creation)\n const fileStream = this.ensureFileStream(this.currentFileIndex);\n\n // Update CRC\n if (this.verifyCrc) {\n this.fileCrcs[this.currentFileIndex] = crc32(fileChunk, this.fileCrcs[this.currentFileIndex]);\n }\n\n // Write to file stream, track backpressure\n if (!fileStream.write(fileChunk)) {\n canContinue = false;\n this._needsDrain = true;\n fileStream.once('drain', () => {\n this._needsDrain = false;\n this.notifyDrain();\n });\n }\n }\n\n this.bytesWritten += toWrite;\n offset += toWrite;\n\n // Check if current file is complete\n if (this.bytesWritten >= this.currentFileEnd) {\n this.finishCurrentFile();\n }\n }\n\n return canContinue;\n }\n\n /**\n * Ensure stream exists for file index (lazy creation)\n */\n private ensureFileStream(fileIndex: number): Stream.PassThrough {\n let stream = this.fileStreams[fileIndex];\n if (!stream) {\n stream = new PassThrough();\n this.fileStreams[fileIndex] = stream;\n }\n return stream;\n }\n\n /**\n * Complete current file and move to next\n */\n private finishCurrentFile(): void {\n const fileStream = this.fileStreams[this.currentFileIndex];\n\n // Verify CRC if enabled\n if (this.verifyCrc) {\n const expectedCrc = this.expectedCrcs[this.currentFileIndex];\n if (expectedCrc !== undefined && this.fileCrcs[this.currentFileIndex] !== expectedCrc) {\n const err = new Error(`CRC mismatch for file ${this.currentFileIndex}: expected ${expectedCrc.toString(16)}, got ${this.fileCrcs[this.currentFileIndex].toString(16)}`);\n this.emitError(err);\n return;\n }\n }\n\n // End this file's stream\n if (fileStream) {\n fileStream.end();\n }\n\n // Release reference for GC\n this.fileStreams[this.currentFileIndex] = null;\n\n // Move to next file\n this.currentFileIndex++;\n if (this.currentFileIndex < this.fileBoundaries.length - 1) {\n this.currentFileEnd = this.fileBoundaries[this.currentFileIndex + 1];\n }\n }\n\n /**\n * Signal end of decompressed data\n */\n end(): void {\n if (this.finished) return;\n this.finished = true;\n\n // End any remaining streams\n for (let i = this.currentFileIndex; i < this.fileStreams.length; i++) {\n const stream = this.fileStreams[i];\n if (stream) {\n stream.end();\n }\n this.fileStreams[i] = null;\n }\n }\n\n /**\n * Emit error to all pending file streams\n */\n private emitError(err: Error): void {\n this.error = err;\n for (let i = this.currentFileIndex; i < this.fileStreams.length; i++) {\n const stream = this.fileStreams[i];\n if (stream) {\n stream.emit('error', err);\n stream.end();\n }\n this.fileStreams[i] = null;\n }\n }\n\n /**\n * Get the stream for a specific file by index.\n * Stream is created lazily on first access.\n */\n getFileStream(fileIndex: number): Stream.PassThrough {\n if (fileIndex < 0 || fileIndex >= this.fileBoundaries.length - 1) {\n throw new Error(`Invalid file index: ${fileIndex}`);\n }\n\n // Check if file already completed\n if (fileIndex < this.currentFileIndex) {\n throw new Error(`File ${fileIndex} already completed - streams must be accessed in order`);\n }\n\n return this.ensureFileStream(fileIndex);\n }\n\n /**\n * Register callback for when backpressure clears\n */\n onDrain(callback: () => void): void {\n if (!this._needsDrain) {\n callback();\n } else {\n this.drainCallbacks.push(callback);\n }\n }\n\n /**\n * Notify all drain callbacks\n */\n private notifyDrain(): void {\n const callbacks = this.drainCallbacks;\n this.drainCallbacks = [];\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i]();\n }\n }\n\n /**\n * Check if a specific file's stream has been fully written\n */\n isFileComplete(fileIndex: number): boolean {\n return fileIndex < this.currentFileIndex;\n }\n\n /**\n * Get total number of files in this folder\n */\n get fileCount(): number {\n return this.fileBoundaries.length - 1;\n }\n\n /**\n * Check if splitter has encountered an error\n */\n getError(): Error | null {\n return this.error;\n }\n}\n"],"names":["FolderStreamSplitter","options","fileSizes","verifyCrc","undefined","expectedCrcs","currentFileIndex","bytesWritten","finished","error","drainCallbacks","_needsDrain","fileBoundaries","i","length","push","fileStreams","fileCrcs","currentFileEnd","write","chunk","offset","canContinue","remaining","neededForFile","toWrite","Math","min","fileChunk","slice","fileStream","ensureFileStream","crc32","once","notifyDrain","finishCurrentFile","fileIndex","stream","PassThrough","expectedCrc","err","Error","toString","emitError","end","emit","getFileStream","onDrain","callback","callbacks","isFileComplete","getError","fileCount"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/headers.ts"],"sourcesContent":["// 7z header parsing\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n\nimport { bufferEquals, readUInt64LE, verifyCrc32Region } from 'extract-base-iterator';\nimport { createCodedError, ErrorCode, PropertyId, SEVENZ_MAGIC } from './constants.ts';\nimport { readDefinedVector, readNumber } from './NumberCodec.ts';\n\n// Type definitions\nexport interface SignatureHeader {\n majorVersion: number;\n minorVersion: number;\n startHeaderCRC: number;\n nextHeaderOffset: number;\n nextHeaderSize: number;\n nextHeaderCRC: number;\n}\n\nexport interface Coder {\n id: number[]; // Codec ID bytes\n numInStreams: number; // Number of input streams\n numOutStreams: number; // Number of output streams\n properties?: Buffer; // Optional codec properties\n}\n\nexport interface Folder {\n coders: Coder[];\n bindPairs: { inIndex: number; outIndex: number }[];\n packedStreams: number[]; // Indices of packed streams\n unpackSizes: number[]; // Unpack size for each coder output\n unpackCRC?: number; // CRC of final unpacked data\n hasCRC: boolean;\n}\n\nexport interface StreamsInfo {\n packPos: number; // Position of packed data (relative to end of signature header)\n packSizes: number[]; // Sizes of packed streams\n packCRCs?: number[]; // Optional CRCs for packed streams\n folders: Folder[]; // Decompression info\n numUnpackStreamsPerFolder: number[]; // Number of files in each folder (for solid archives)\n unpackSizes: number[]; // Size of each unpacked file\n unpackCRCs?: number[]; // Optional CRCs for unpacked files\n}\n\nexport interface FileInfo {\n name: string;\n size: number;\n isDirectory: boolean;\n isAntiFile: boolean; // \"Anti\" items mark files to delete in delta archives\n hasStream: boolean; // False for empty files/directories\n crc?: number;\n ctime?: Date;\n atime?: Date;\n mtime?: Date;\n attributes?: number;\n}\n\nexport interface ArchiveHeader {\n signature: SignatureHeader;\n streamsInfo?: StreamsInfo;\n filesInfo: FileInfo[];\n}\n\n/**\n * Parse the signature header (first 32 bytes)\n */\nexport function parseSignatureHeader(buf: Buffer): SignatureHeader {\n // Verify magic bytes\n if (!bufferEquals(buf, 0, SEVENZ_MAGIC)) {\n throw createCodedError('Not a valid 7z archive', ErrorCode.INVALID_SIGNATURE);\n }\n\n // Read version\n const majorVersion = buf[6];\n const minorVersion = buf[7];\n\n // Version check - we support 0.x (current is 0.4)\n if (majorVersion > 0) {\n throw createCodedError(`Unsupported 7z version: ${majorVersion}.${minorVersion}`, ErrorCode.UNSUPPORTED_VERSION);\n }\n\n // Read start header CRC (CRC of the next 20 bytes)\n const startHeaderCRC = buf.readUInt32LE(8);\n\n // Verify start header CRC\n if (!verifyCrc32Region(buf, 12, 20, startHeaderCRC)) {\n throw createCodedError('Start header CRC mismatch', ErrorCode.CRC_MISMATCH);\n }\n\n // Read next header location\n const nextHeaderOffset = readUInt64LE(buf, 12);\n const nextHeaderSize = readUInt64LE(buf, 20);\n const nextHeaderCRC = buf.readUInt32LE(28);\n\n return {\n majorVersion: majorVersion,\n minorVersion: minorVersion,\n startHeaderCRC: startHeaderCRC,\n nextHeaderOffset: nextHeaderOffset,\n nextHeaderSize: nextHeaderSize,\n nextHeaderCRC: nextHeaderCRC,\n };\n}\n\n/**\n * Parse the encoded header (metadata block at end of archive)\n */\nexport function parseEncodedHeader(buf: Buffer, expectedCRC: number): { streamsInfo?: StreamsInfo; filesInfo: FileInfo[] } {\n // Verify CRC\n if (!verifyCrc32Region(buf, 0, buf.length, expectedCRC)) {\n throw createCodedError('Encoded header CRC mismatch', ErrorCode.CRC_MISMATCH);\n }\n\n let offset = 0;\n\n // Read property ID\n const propertyId = buf[offset++];\n\n // Handle kEncodedHeader - means the header itself is compressed\n if (propertyId === PropertyId.kEncodedHeader) {\n // Return indicator that we need to decompress\n throw createCodedError('Compressed header - needs decompression first', ErrorCode.COMPRESSED_HEADER);\n }\n\n // Should be kHeader\n if (propertyId !== PropertyId.kHeader) {\n throw createCodedError(`Expected kHeader, got ${propertyId}`, ErrorCode.CORRUPT_HEADER);\n }\n\n // Parse header contents (after kHeader byte)\n return parseHeaderContent(buf, offset);\n}\n\n/**\n * Parse header content (after kHeader byte has been read)\n * Used by parseEncodedHeader and for decompressed headers\n */\nexport function parseHeaderContent(buf: Buffer, offset: number): { streamsInfo?: StreamsInfo; filesInfo: FileInfo[] } {\n const result: { streamsInfo?: StreamsInfo; filesInfo: FileInfo[] } = {\n filesInfo: [],\n };\n\n // Parse header contents\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n switch (propertyId) {\n case PropertyId.kArchiveProperties:\n offset = skipArchiveProperties(buf, offset);\n break;\n case PropertyId.kAdditionalStreamsInfo:\n // Additional streams - skip for now\n offset = skipStreamsInfo(buf, offset);\n break;\n case PropertyId.kMainStreamsInfo: {\n const streamsResult = parseStreamsInfo(buf, offset);\n result.streamsInfo = streamsResult.info;\n offset = streamsResult.offset;\n break;\n }\n case PropertyId.kFilesInfo: {\n const filesResult = parseFilesInfo(buf, offset);\n result.filesInfo = filesResult.files;\n offset = filesResult.offset;\n break;\n }\n default:\n throw createCodedError(`Unknown property ID in header: ${propertyId}`, ErrorCode.CORRUPT_HEADER);\n }\n }\n\n return result;\n}\n\n/**\n * Parse StreamsInfo block\n */\nfunction parseStreamsInfo(buf: Buffer, offset: number): { info: StreamsInfo; offset: number } {\n const info: StreamsInfo = {\n packPos: 0,\n packSizes: [],\n folders: [],\n numUnpackStreamsPerFolder: [],\n unpackSizes: [],\n };\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n switch (propertyId) {\n case PropertyId.kPackInfo: {\n const packResult = parsePackInfo(buf, offset);\n info.packPos = packResult.packPos;\n info.packSizes = packResult.packSizes;\n info.packCRCs = packResult.packCRCs;\n offset = packResult.offset;\n break;\n }\n case PropertyId.kUnpackInfo: {\n const unpackResult = parseUnpackInfo(buf, offset);\n info.folders = unpackResult.folders;\n offset = unpackResult.offset;\n break;\n }\n case PropertyId.kSubStreamsInfo: {\n const subResult = parseSubStreamsInfo(buf, offset, info.folders);\n info.numUnpackStreamsPerFolder = subResult.numUnpackStreamsPerFolder;\n info.unpackSizes = subResult.unpackSizes;\n info.unpackCRCs = subResult.unpackCRCs;\n offset = subResult.offset;\n break;\n }\n default:\n throw createCodedError(`Unknown property ID in StreamsInfo: ${propertyId}`, ErrorCode.CORRUPT_HEADER);\n }\n }\n\n // If no SubStreamsInfo, each folder produces one file\n if (info.unpackSizes.length === 0 && info.folders.length > 0) {\n for (let i = 0; i < info.folders.length; i++) {\n const folder = info.folders[i];\n // Get the final unpack size (last coder's output)\n const finalSize = folder.unpackSizes[folder.unpackSizes.length - 1];\n info.unpackSizes.push(finalSize);\n info.numUnpackStreamsPerFolder.push(1);\n }\n }\n\n return { info: info, offset: offset };\n}\n\n/**\n * Parse PackInfo block\n */\nfunction parsePackInfo(buf: Buffer, offset: number): { packPos: number; packSizes: number[]; packCRCs?: number[]; offset: number } {\n // Pack position\n const packPosResult = readNumber(buf, offset);\n const packPos = packPosResult.value;\n offset += packPosResult.bytesRead;\n\n // Number of pack streams\n const numPackResult = readNumber(buf, offset);\n const numPackStreams = numPackResult.value;\n offset += numPackResult.bytesRead;\n\n const packSizes: number[] = [];\n let packCRCs: number[] | undefined;\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n if (propertyId === PropertyId.kSize) {\n for (let i = 0; i < numPackStreams; i++) {\n const sizeResult = readNumber(buf, offset);\n packSizes.push(sizeResult.value);\n offset += sizeResult.bytesRead;\n }\n } else if (propertyId === PropertyId.kCRC) {\n packCRCs = [];\n const definedResult = readDefinedVector(buf, offset, numPackStreams);\n offset += definedResult.bytesRead;\n for (let j = 0; j < numPackStreams; j++) {\n if (definedResult.defined[j]) {\n packCRCs.push(buf.readUInt32LE(offset));\n offset += 4;\n } else {\n packCRCs.push(0);\n }\n }\n }\n }\n\n return { packPos: packPos, packSizes: packSizes, packCRCs: packCRCs, offset: offset };\n}\n\n/**\n * Parse UnpackInfo block\n */\nfunction parseUnpackInfo(buf: Buffer, offset: number): { folders: Folder[]; offset: number } {\n const folders: Folder[] = [];\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n if (propertyId === PropertyId.kFolder) {\n // Number of folders\n const numFoldersResult = readNumber(buf, offset);\n const numFolders = numFoldersResult.value;\n offset += numFoldersResult.bytesRead;\n\n // External flag\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External folders not supported', ErrorCode.CORRUPT_HEADER);\n }\n\n // Parse each folder\n for (let i = 0; i < numFolders; i++) {\n const folderResult = parseFolder(buf, offset);\n folders.push(folderResult.folder);\n offset = folderResult.offset;\n }\n } else if (propertyId === PropertyId.kCodersUnpackSize) {\n // Unpack sizes for each coder output\n for (let j = 0; j < folders.length; j++) {\n const folder = folders[j];\n folder.unpackSizes = [];\n // One unpack size per coder output stream\n let numOutputs = 0;\n for (let k = 0; k < folder.coders.length; k++) {\n numOutputs += folder.coders[k].numOutStreams;\n }\n for (let l = 0; l < numOutputs; l++) {\n const sizeResult = readNumber(buf, offset);\n folder.unpackSizes.push(sizeResult.value);\n offset += sizeResult.bytesRead;\n }\n }\n } else if (propertyId === PropertyId.kCRC) {\n // CRCs for folders\n const definedResult = readDefinedVector(buf, offset, folders.length);\n offset += definedResult.bytesRead;\n for (let m = 0; m < folders.length; m++) {\n folders[m].hasCRC = definedResult.defined[m];\n if (definedResult.defined[m]) {\n folders[m].unpackCRC = buf.readUInt32LE(offset);\n offset += 4;\n }\n }\n }\n }\n\n return { folders: folders, offset: offset };\n}\n\n/**\n * Parse a single Folder structure\n */\nfunction parseFolder(buf: Buffer, offset: number): { folder: Folder; offset: number } {\n // Number of coders\n const numCodersResult = readNumber(buf, offset);\n const numCoders = numCodersResult.value;\n offset += numCodersResult.bytesRead;\n\n const coders: Coder[] = [];\n let numInStreamsTotal = 0;\n let numOutStreamsTotal = 0;\n\n for (let i = 0; i < numCoders; i++) {\n const flags = buf[offset++];\n const idSize = flags & 0x0f;\n const isComplex = (flags & 0x10) !== 0;\n const hasAttributes = (flags & 0x20) !== 0;\n\n // Read codec ID\n const id: number[] = [];\n for (let j = 0; j < idSize; j++) {\n id.push(buf[offset++]);\n }\n\n let numInStreams = 1;\n let numOutStreams = 1;\n\n if (isComplex) {\n const inResult = readNumber(buf, offset);\n numInStreams = inResult.value;\n offset += inResult.bytesRead;\n\n const outResult = readNumber(buf, offset);\n numOutStreams = outResult.value;\n offset += outResult.bytesRead;\n }\n\n let properties: Buffer | undefined;\n if (hasAttributes) {\n const propsLenResult = readNumber(buf, offset);\n offset += propsLenResult.bytesRead;\n properties = buf.slice(offset, offset + propsLenResult.value);\n offset += propsLenResult.value;\n }\n\n coders.push({\n id: id,\n numInStreams: numInStreams,\n numOutStreams: numOutStreams,\n properties: properties,\n });\n\n numInStreamsTotal += numInStreams;\n numOutStreamsTotal += numOutStreams;\n }\n\n // Bind pairs\n const numBindPairs = numOutStreamsTotal - 1;\n const bindPairs: { inIndex: number; outIndex: number }[] = [];\n\n for (let k = 0; k < numBindPairs; k++) {\n const inIndexResult = readNumber(buf, offset);\n offset += inIndexResult.bytesRead;\n\n const outIndexResult = readNumber(buf, offset);\n offset += outIndexResult.bytesRead;\n\n bindPairs.push({\n inIndex: inIndexResult.value,\n outIndex: outIndexResult.value,\n });\n }\n\n // Packed stream indices\n const numPackedStreams = numInStreamsTotal - numBindPairs;\n const packedStreams: number[] = [];\n\n if (numPackedStreams === 1) {\n // Find the unbound input stream\n for (let m = 0; m < numInStreamsTotal; m++) {\n let isBound = false;\n for (let n = 0; n < bindPairs.length; n++) {\n if (bindPairs[n].inIndex === m) {\n isBound = true;\n break;\n }\n }\n if (!isBound) {\n packedStreams.push(m);\n break;\n }\n }\n } else {\n for (let p = 0; p < numPackedStreams; p++) {\n const indexResult = readNumber(buf, offset);\n packedStreams.push(indexResult.value);\n offset += indexResult.bytesRead;\n }\n }\n\n return {\n folder: {\n coders: coders,\n bindPairs: bindPairs,\n packedStreams: packedStreams,\n unpackSizes: [],\n hasCRC: false,\n },\n offset: offset,\n };\n}\n\n/**\n * Parse SubStreamsInfo block\n */\nfunction parseSubStreamsInfo(buf: Buffer, offset: number, folders: Folder[]): { numUnpackStreamsPerFolder: number[]; unpackSizes: number[]; unpackCRCs?: number[]; offset: number } {\n const numUnpackStreamsPerFolder: number[] = [];\n const unpackSizes: number[] = [];\n let unpackCRCs: number[] | undefined;\n\n // Default: 1 file per folder\n for (let i = 0; i < folders.length; i++) {\n numUnpackStreamsPerFolder.push(1);\n }\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n if (propertyId === PropertyId.kNumUnpackStream) {\n for (let j = 0; j < folders.length; j++) {\n const numResult = readNumber(buf, offset);\n numUnpackStreamsPerFolder[j] = numResult.value;\n offset += numResult.bytesRead;\n }\n } else if (propertyId === PropertyId.kSize) {\n for (let k = 0; k < folders.length; k++) {\n const numStreams = numUnpackStreamsPerFolder[k];\n if (numStreams === 0) continue;\n\n // Read sizes for all but last stream in folder (last is calculated)\n let remaining = folders[k].unpackSizes[folders[k].unpackSizes.length - 1];\n for (let l = 0; l < numStreams - 1; l++) {\n const sizeResult = readNumber(buf, offset);\n unpackSizes.push(sizeResult.value);\n remaining -= sizeResult.value;\n offset += sizeResult.bytesRead;\n }\n // Last stream size is remainder\n unpackSizes.push(remaining);\n }\n } else if (propertyId === PropertyId.kCRC) {\n // Count files that need CRC\n let numFiles = 0;\n for (let m = 0; m < folders.length; m++) {\n const numStreamsInFolder = numUnpackStreamsPerFolder[m];\n // Only count if folder doesn't have CRC or has multiple streams\n if (!folders[m].hasCRC || numStreamsInFolder > 1) {\n numFiles += numStreamsInFolder;\n }\n }\n\n unpackCRCs = [];\n const definedResult = readDefinedVector(buf, offset, numFiles);\n offset += definedResult.bytesRead;\n for (let n = 0; n < numFiles; n++) {\n if (definedResult.defined[n]) {\n unpackCRCs.push(buf.readUInt32LE(offset));\n offset += 4;\n } else {\n unpackCRCs.push(0);\n }\n }\n }\n }\n\n // If no sizes specified, use folder unpack sizes\n if (unpackSizes.length === 0) {\n for (let p = 0; p < folders.length; p++) {\n const folder = folders[p];\n unpackSizes.push(folder.unpackSizes[folder.unpackSizes.length - 1]);\n }\n }\n\n return { numUnpackStreamsPerFolder: numUnpackStreamsPerFolder, unpackSizes: unpackSizes, unpackCRCs: unpackCRCs, offset: offset };\n}\n\n/**\n * Parse FilesInfo block\n */\nfunction parseFilesInfo(buf: Buffer, offset: number): { files: FileInfo[]; offset: number } {\n // Number of files\n const numFilesResult = readNumber(buf, offset);\n const numFiles = numFilesResult.value;\n offset += numFilesResult.bytesRead;\n\n // Initialize files array\n const files: FileInfo[] = [];\n for (let i = 0; i < numFiles; i++) {\n files.push({\n name: '',\n size: 0,\n isDirectory: false,\n isAntiFile: false,\n hasStream: true,\n });\n }\n\n let emptyStreamFlags: boolean[] = [];\n let emptyFileFlags: boolean[] = [];\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n // Read property size\n const propSizeResult = readNumber(buf, offset);\n const propSize = propSizeResult.value;\n offset += propSizeResult.bytesRead;\n\n const propEnd = offset + propSize;\n\n switch (propertyId) {\n case PropertyId.kEmptyStream:\n emptyStreamFlags = readBoolVector(buf, offset, numFiles);\n // Mark files that don't have streams\n for (let j = 0; j < numFiles; j++) {\n files[j].hasStream = !emptyStreamFlags[j];\n }\n break;\n\n case PropertyId.kEmptyFile: {\n let numEmptyStreams = 0;\n for (let k = 0; k < emptyStreamFlags.length; k++) {\n if (emptyStreamFlags[k]) numEmptyStreams++;\n }\n emptyFileFlags = readBoolVector(buf, offset, numEmptyStreams);\n break;\n }\n\n case PropertyId.kAnti: {\n let numAnti = 0;\n for (let l = 0; l < emptyStreamFlags.length; l++) {\n if (emptyStreamFlags[l]) numAnti++;\n }\n const antiFlags = readBoolVector(buf, offset, numAnti);\n let antiIdx = 0;\n for (let m = 0; m < numFiles; m++) {\n if (emptyStreamFlags[m]) {\n files[m].isAntiFile = antiFlags[antiIdx++];\n }\n }\n break;\n }\n\n case PropertyId.kName:\n offset = parseFileNames(buf, offset, files);\n break;\n\n case PropertyId.kCTime:\n offset = parseFileTimes(buf, offset, files, 'ctime');\n break;\n\n case PropertyId.kATime:\n offset = parseFileTimes(buf, offset, files, 'atime');\n break;\n\n case PropertyId.kMTime:\n offset = parseFileTimes(buf, offset, files, 'mtime');\n break;\n\n case PropertyId.kWinAttributes:\n offset = parseAttributes(buf, offset, files);\n break;\n\n case PropertyId.kDummy:\n // Skip dummy bytes\n break;\n\n default:\n // Skip unknown properties\n break;\n }\n\n offset = propEnd;\n }\n\n // Determine directories from empty stream + not empty file\n let emptyIdx = 0;\n for (let n = 0; n < numFiles; n++) {\n if (emptyStreamFlags[n]) {\n // Empty stream - could be directory or empty file\n if (emptyIdx < emptyFileFlags.length && emptyFileFlags[emptyIdx]) {\n files[n].isDirectory = false; // Empty file\n } else {\n files[n].isDirectory = true; // Directory\n }\n emptyIdx++;\n }\n }\n\n return { files: files, offset: offset };\n}\n\n/**\n * Read a boolean vector (bit-packed)\n */\nfunction readBoolVector(buf: Buffer, offset: number, count: number): boolean[] {\n const result: boolean[] = [];\n let byteIdx = 0;\n let bitMask = 0x80;\n\n for (let i = 0; i < count; i++) {\n result.push((buf[offset + byteIdx] & bitMask) !== 0);\n bitMask = bitMask >>> 1;\n if (bitMask === 0) {\n bitMask = 0x80;\n byteIdx++;\n }\n }\n\n return result;\n}\n\n/**\n * Parse file names (UTF-16LE encoded)\n */\nfunction parseFileNames(buf: Buffer, offset: number, files: FileInfo[]): number {\n // External flag\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External file names not supported', ErrorCode.CORRUPT_HEADER);\n }\n\n // Names are UTF-16LE, null-terminated\n for (let i = 0; i < files.length; i++) {\n const nameChars: number[] = [];\n while (offset < buf.length) {\n const charCode = buf.readUInt16LE(offset);\n offset += 2;\n if (charCode === 0) break;\n nameChars.push(charCode);\n }\n files[i].name = String.fromCharCode.apply(null, nameChars);\n }\n\n return offset;\n}\n\n/**\n * Parse file times (Windows FILETIME format)\n */\nfunction parseFileTimes(buf: Buffer, offset: number, files: FileInfo[], timeType: 'ctime' | 'atime' | 'mtime'): number {\n // Read defined vector (allDefined byte + optional bitmask)\n const definedResult = readDefinedVector(buf, offset, files.length);\n offset += definedResult.bytesRead;\n\n // External flag - 0x00 means data follows inline, non-zero means external stream\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External file times not supported', ErrorCode.UNSUPPORTED_FEATURE);\n }\n\n // Read times\n for (let i = 0; i < files.length; i++) {\n if (definedResult.defined[i]) {\n const filetime = readUInt64LE(buf, offset);\n offset += 8;\n // Convert FILETIME (100ns since 1601) to JavaScript Date\n // FILETIME epoch: 1601-01-01\n // JS Date epoch: 1970-01-01\n // Difference: 11644473600 seconds\n const ms = filetime / 10000 - 11644473600000;\n files[i][timeType] = new Date(ms);\n }\n }\n\n return offset;\n}\n\n/**\n * Parse Windows file attributes\n */\nfunction parseAttributes(buf: Buffer, offset: number, files: FileInfo[]): number {\n // Read defined vector (allDefined byte + optional bitmask)\n const definedResult = readDefinedVector(buf, offset, files.length);\n offset += definedResult.bytesRead;\n\n // External flag - 0x00 means data follows inline, non-zero means external stream\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External file attributes not supported', ErrorCode.UNSUPPORTED_FEATURE);\n }\n\n // Read attributes\n for (let i = 0; i < files.length; i++) {\n if (definedResult.defined[i]) {\n files[i].attributes = buf.readUInt32LE(offset);\n offset += 4;\n }\n }\n\n return offset;\n}\n\n/**\n * Skip archive properties block\n */\nfunction skipArchiveProperties(buf: Buffer, offset: number): number {\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n const sizeResult = readNumber(buf, offset);\n offset += sizeResult.bytesRead + sizeResult.value;\n }\n return offset;\n}\n\n/**\n * Skip streams info block (for additional streams)\n */\nfunction skipStreamsInfo(buf: Buffer, offset: number): number {\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n // For nested structures, recurse\n if (propertyId === PropertyId.kPackInfo || propertyId === PropertyId.kUnpackInfo || propertyId === PropertyId.kSubStreamsInfo) {\n offset = skipStreamsInfo(buf, offset);\n }\n }\n return offset;\n}\n"],"names":["parseEncodedHeader","parseHeaderContent","parseSignatureHeader","buf","bufferEquals","SEVENZ_MAGIC","createCodedError","ErrorCode","INVALID_SIGNATURE","majorVersion","minorVersion","UNSUPPORTED_VERSION","startHeaderCRC","readUInt32LE","verifyCrc32Region","CRC_MISMATCH","nextHeaderOffset","readUInt64LE","nextHeaderSize","nextHeaderCRC","expectedCRC","length","offset","propertyId","PropertyId","kEncodedHeader","COMPRESSED_HEADER","kHeader","CORRUPT_HEADER","result","filesInfo","kEnd","kArchiveProperties","skipArchiveProperties","kAdditionalStreamsInfo","skipStreamsInfo","kMainStreamsInfo","streamsResult","parseStreamsInfo","streamsInfo","info","kFilesInfo","filesResult","parseFilesInfo","files","packPos","packSizes","folders","numUnpackStreamsPerFolder","unpackSizes","kPackInfo","packResult","parsePackInfo","packCRCs","kUnpackInfo","unpackResult","parseUnpackInfo","kSubStreamsInfo","subResult","parseSubStreamsInfo","unpackCRCs","i","folder","finalSize","push","packPosResult","readNumber","value","bytesRead","numPackResult","numPackStreams","kSize","sizeResult","kCRC","definedResult","readDefinedVector","j","defined","kFolder","numFoldersResult","numFolders","external","folderResult","parseFolder","kCodersUnpackSize","numOutputs","k","coders","numOutStreams","l","m","hasCRC","unpackCRC","numCodersResult","numCoders","numInStreamsTotal","numOutStreamsTotal","flags","idSize","isComplex","hasAttributes","id","numInStreams","inResult","outResult","properties","propsLenResult","slice","numBindPairs","bindPairs","inIndexResult","outIndexResult","inIndex","outIndex","numPackedStreams","packedStreams","isBound","n","p","indexResult","kNumUnpackStream","numResult","numStreams","remaining","numFiles","numStreamsInFolder","numFilesResult","name","size","isDirectory","isAntiFile","hasStream","emptyStreamFlags","emptyFileFlags","propSizeResult","propSize","propEnd","kEmptyStream","readBoolVector","kEmptyFile","numEmptyStreams","kAnti","numAnti","antiFlags","antiIdx","kName","parseFileNames","kCTime","parseFileTimes","kATime","kMTime","kWinAttributes","parseAttributes","kDummy","emptyIdx","count","byteIdx","bitMask","nameChars","charCode","readUInt16LE","String","fromCharCode","apply","timeType","UNSUPPORTED_FEATURE","filetime","ms","Date","attributes"],"mappings":"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"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/headers.ts"],"sourcesContent":["// 7z header parsing\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n\nimport { bufferEquals, readUInt64LE, verifyCrc32Region } from 'extract-base-iterator';\nimport { createCodedError, ErrorCode, PropertyId, SEVENZ_MAGIC } from './constants.ts';\nimport { readDefinedVector, readNumber } from './NumberCodec.ts';\n\n// Type definitions\nexport interface SignatureHeader {\n majorVersion: number;\n minorVersion: number;\n startHeaderCRC: number;\n nextHeaderOffset: number;\n nextHeaderSize: number;\n nextHeaderCRC: number;\n}\n\nexport interface Coder {\n id: number[]; // Codec ID bytes\n numInStreams: number; // Number of input streams\n numOutStreams: number; // Number of output streams\n properties?: Buffer; // Optional codec properties\n}\n\nexport interface Folder {\n coders: Coder[];\n bindPairs: { inIndex: number; outIndex: number }[];\n packedStreams: number[]; // Indices of packed streams\n unpackSizes: number[]; // Unpack size for each coder output\n unpackCRC?: number; // CRC of final unpacked data\n hasCRC: boolean;\n}\n\nexport interface StreamsInfo {\n packPos: number; // Position of packed data (relative to end of signature header)\n packSizes: number[]; // Sizes of packed streams\n packCRCs?: number[]; // Optional CRCs for packed streams\n folders: Folder[]; // Decompression info\n numUnpackStreamsPerFolder: number[]; // Number of files in each folder (for solid archives)\n unpackSizes: number[]; // Size of each unpacked file\n unpackCRCs?: number[]; // Optional CRCs for unpacked files\n}\n\nexport interface FileInfo {\n name: string;\n size: number;\n isDirectory: boolean;\n isAntiFile: boolean; // \"Anti\" items mark files to delete in delta archives\n hasStream: boolean; // False for empty files/directories\n crc?: number;\n ctime?: Date;\n atime?: Date;\n mtime?: Date;\n attributes?: number;\n}\n\nexport interface ArchiveHeader {\n signature: SignatureHeader;\n streamsInfo?: StreamsInfo;\n filesInfo: FileInfo[];\n}\n\n/**\n * Parse the signature header (first 32 bytes)\n */\nexport function parseSignatureHeader(buf: Buffer): SignatureHeader {\n // Verify magic bytes\n if (!bufferEquals(buf, 0, SEVENZ_MAGIC)) {\n throw createCodedError('Not a valid 7z archive', ErrorCode.INVALID_SIGNATURE);\n }\n\n // Read version\n const majorVersion = buf[6];\n const minorVersion = buf[7];\n\n // Version check - we support 0.x (current is 0.4)\n if (majorVersion > 0) {\n throw createCodedError(`Unsupported 7z version: ${majorVersion}.${minorVersion}`, ErrorCode.UNSUPPORTED_VERSION);\n }\n\n // Read start header CRC (CRC of the next 20 bytes)\n const startHeaderCRC = buf.readUInt32LE(8);\n\n // Verify start header CRC\n if (!verifyCrc32Region(buf, 12, 20, startHeaderCRC)) {\n throw createCodedError('Start header CRC mismatch', ErrorCode.CRC_MISMATCH);\n }\n\n // Read next header location\n const nextHeaderOffset = readUInt64LE(buf, 12);\n const nextHeaderSize = readUInt64LE(buf, 20);\n const nextHeaderCRC = buf.readUInt32LE(28);\n\n return {\n majorVersion: majorVersion,\n minorVersion: minorVersion,\n startHeaderCRC: startHeaderCRC,\n nextHeaderOffset: nextHeaderOffset,\n nextHeaderSize: nextHeaderSize,\n nextHeaderCRC: nextHeaderCRC,\n };\n}\n\n/**\n * Parse the encoded header (metadata block at end of archive)\n */\nexport function parseEncodedHeader(buf: Buffer, expectedCRC: number): { streamsInfo?: StreamsInfo; filesInfo: FileInfo[] } {\n // Verify CRC\n if (!verifyCrc32Region(buf, 0, buf.length, expectedCRC)) {\n throw createCodedError('Encoded header CRC mismatch', ErrorCode.CRC_MISMATCH);\n }\n\n let offset = 0;\n\n // Read property ID\n const propertyId = buf[offset++];\n\n // Handle kEncodedHeader - means the header itself is compressed\n if (propertyId === PropertyId.kEncodedHeader) {\n // Return indicator that we need to decompress\n throw createCodedError('Compressed header - needs decompression first', ErrorCode.COMPRESSED_HEADER);\n }\n\n // Should be kHeader\n if (propertyId !== PropertyId.kHeader) {\n throw createCodedError(`Expected kHeader, got ${propertyId}`, ErrorCode.CORRUPT_HEADER);\n }\n\n // Parse header contents (after kHeader byte)\n return parseHeaderContent(buf, offset);\n}\n\n/**\n * Parse header content (after kHeader byte has been read)\n * Used by parseEncodedHeader and for decompressed headers\n */\nexport function parseHeaderContent(buf: Buffer, offset: number): { streamsInfo?: StreamsInfo; filesInfo: FileInfo[] } {\n const result: { streamsInfo?: StreamsInfo; filesInfo: FileInfo[] } = {\n filesInfo: [],\n };\n\n // Parse header contents\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n switch (propertyId) {\n case PropertyId.kArchiveProperties:\n offset = skipArchiveProperties(buf, offset);\n break;\n case PropertyId.kAdditionalStreamsInfo:\n // Additional streams - skip for now\n offset = skipStreamsInfo(buf, offset);\n break;\n case PropertyId.kMainStreamsInfo: {\n const streamsResult = parseStreamsInfo(buf, offset);\n result.streamsInfo = streamsResult.info;\n offset = streamsResult.offset;\n break;\n }\n case PropertyId.kFilesInfo: {\n const filesResult = parseFilesInfo(buf, offset);\n result.filesInfo = filesResult.files;\n offset = filesResult.offset;\n break;\n }\n default:\n throw createCodedError(`Unknown property ID in header: ${propertyId}`, ErrorCode.CORRUPT_HEADER);\n }\n }\n\n return result;\n}\n\n/**\n * Parse StreamsInfo block\n */\nfunction parseStreamsInfo(buf: Buffer, offset: number): { info: StreamsInfo; offset: number } {\n const info: StreamsInfo = {\n packPos: 0,\n packSizes: [],\n folders: [],\n numUnpackStreamsPerFolder: [],\n unpackSizes: [],\n };\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n switch (propertyId) {\n case PropertyId.kPackInfo: {\n const packResult = parsePackInfo(buf, offset);\n info.packPos = packResult.packPos;\n info.packSizes = packResult.packSizes;\n info.packCRCs = packResult.packCRCs;\n offset = packResult.offset;\n break;\n }\n case PropertyId.kUnpackInfo: {\n const unpackResult = parseUnpackInfo(buf, offset);\n info.folders = unpackResult.folders;\n offset = unpackResult.offset;\n break;\n }\n case PropertyId.kSubStreamsInfo: {\n const subResult = parseSubStreamsInfo(buf, offset, info.folders);\n info.numUnpackStreamsPerFolder = subResult.numUnpackStreamsPerFolder;\n info.unpackSizes = subResult.unpackSizes;\n info.unpackCRCs = subResult.unpackCRCs;\n offset = subResult.offset;\n break;\n }\n default:\n throw createCodedError(`Unknown property ID in StreamsInfo: ${propertyId}`, ErrorCode.CORRUPT_HEADER);\n }\n }\n\n // If no SubStreamsInfo, each folder produces one file\n if (info.unpackSizes.length === 0 && info.folders.length > 0) {\n for (let i = 0; i < info.folders.length; i++) {\n const folder = info.folders[i];\n // Get the final unpack size (last coder's output)\n const finalSize = folder.unpackSizes[folder.unpackSizes.length - 1];\n info.unpackSizes.push(finalSize);\n info.numUnpackStreamsPerFolder.push(1);\n }\n }\n\n return { info: info, offset: offset };\n}\n\n/**\n * Parse PackInfo block\n */\nfunction parsePackInfo(buf: Buffer, offset: number): { packPos: number; packSizes: number[]; packCRCs?: number[]; offset: number } {\n // Pack position\n const packPosResult = readNumber(buf, offset);\n const packPos = packPosResult.value;\n offset += packPosResult.bytesRead;\n\n // Number of pack streams\n const numPackResult = readNumber(buf, offset);\n const numPackStreams = numPackResult.value;\n offset += numPackResult.bytesRead;\n\n const packSizes: number[] = [];\n let packCRCs: number[] | undefined;\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n if (propertyId === PropertyId.kSize) {\n for (let i = 0; i < numPackStreams; i++) {\n const sizeResult = readNumber(buf, offset);\n packSizes.push(sizeResult.value);\n offset += sizeResult.bytesRead;\n }\n } else if (propertyId === PropertyId.kCRC) {\n packCRCs = [];\n const definedResult = readDefinedVector(buf, offset, numPackStreams);\n offset += definedResult.bytesRead;\n for (let j = 0; j < numPackStreams; j++) {\n if (definedResult.defined[j]) {\n packCRCs.push(buf.readUInt32LE(offset));\n offset += 4;\n } else {\n packCRCs.push(0);\n }\n }\n }\n }\n\n return { packPos: packPos, packSizes: packSizes, packCRCs: packCRCs, offset: offset };\n}\n\n/**\n * Parse UnpackInfo block\n */\nfunction parseUnpackInfo(buf: Buffer, offset: number): { folders: Folder[]; offset: number } {\n const folders: Folder[] = [];\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n if (propertyId === PropertyId.kFolder) {\n // Number of folders\n const numFoldersResult = readNumber(buf, offset);\n const numFolders = numFoldersResult.value;\n offset += numFoldersResult.bytesRead;\n\n // External flag\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External folders not supported', ErrorCode.CORRUPT_HEADER);\n }\n\n // Parse each folder\n for (let i = 0; i < numFolders; i++) {\n const folderResult = parseFolder(buf, offset);\n folders.push(folderResult.folder);\n offset = folderResult.offset;\n }\n } else if (propertyId === PropertyId.kCodersUnpackSize) {\n // Unpack sizes for each coder output\n for (let j = 0; j < folders.length; j++) {\n const folder = folders[j];\n folder.unpackSizes = [];\n // One unpack size per coder output stream\n let numOutputs = 0;\n for (let k = 0; k < folder.coders.length; k++) {\n numOutputs += folder.coders[k].numOutStreams;\n }\n for (let l = 0; l < numOutputs; l++) {\n const sizeResult = readNumber(buf, offset);\n folder.unpackSizes.push(sizeResult.value);\n offset += sizeResult.bytesRead;\n }\n }\n } else if (propertyId === PropertyId.kCRC) {\n // CRCs for folders\n const definedResult = readDefinedVector(buf, offset, folders.length);\n offset += definedResult.bytesRead;\n for (let m = 0; m < folders.length; m++) {\n folders[m].hasCRC = definedResult.defined[m];\n if (definedResult.defined[m]) {\n folders[m].unpackCRC = buf.readUInt32LE(offset);\n offset += 4;\n }\n }\n }\n }\n\n return { folders: folders, offset: offset };\n}\n\n/**\n * Parse a single Folder structure\n */\nfunction parseFolder(buf: Buffer, offset: number): { folder: Folder; offset: number } {\n // Number of coders\n const numCodersResult = readNumber(buf, offset);\n const numCoders = numCodersResult.value;\n offset += numCodersResult.bytesRead;\n\n const coders: Coder[] = [];\n let numInStreamsTotal = 0;\n let numOutStreamsTotal = 0;\n\n for (let i = 0; i < numCoders; i++) {\n const flags = buf[offset++];\n const idSize = flags & 0x0f;\n const isComplex = (flags & 0x10) !== 0;\n const hasAttributes = (flags & 0x20) !== 0;\n\n // Read codec ID\n const id: number[] = [];\n for (let j = 0; j < idSize; j++) {\n id.push(buf[offset++]);\n }\n\n let numInStreams = 1;\n let numOutStreams = 1;\n\n if (isComplex) {\n const inResult = readNumber(buf, offset);\n numInStreams = inResult.value;\n offset += inResult.bytesRead;\n\n const outResult = readNumber(buf, offset);\n numOutStreams = outResult.value;\n offset += outResult.bytesRead;\n }\n\n let properties: Buffer | undefined;\n if (hasAttributes) {\n const propsLenResult = readNumber(buf, offset);\n offset += propsLenResult.bytesRead;\n properties = buf.slice(offset, offset + propsLenResult.value);\n offset += propsLenResult.value;\n }\n\n coders.push({\n id: id,\n numInStreams: numInStreams,\n numOutStreams: numOutStreams,\n properties: properties,\n });\n\n numInStreamsTotal += numInStreams;\n numOutStreamsTotal += numOutStreams;\n }\n\n // Bind pairs\n const numBindPairs = numOutStreamsTotal - 1;\n const bindPairs: { inIndex: number; outIndex: number }[] = [];\n\n for (let k = 0; k < numBindPairs; k++) {\n const inIndexResult = readNumber(buf, offset);\n offset += inIndexResult.bytesRead;\n\n const outIndexResult = readNumber(buf, offset);\n offset += outIndexResult.bytesRead;\n\n bindPairs.push({\n inIndex: inIndexResult.value,\n outIndex: outIndexResult.value,\n });\n }\n\n // Packed stream indices\n const numPackedStreams = numInStreamsTotal - numBindPairs;\n const packedStreams: number[] = [];\n\n if (numPackedStreams === 1) {\n // Find the unbound input stream\n for (let m = 0; m < numInStreamsTotal; m++) {\n let isBound = false;\n for (let n = 0; n < bindPairs.length; n++) {\n if (bindPairs[n].inIndex === m) {\n isBound = true;\n break;\n }\n }\n if (!isBound) {\n packedStreams.push(m);\n break;\n }\n }\n } else {\n for (let p = 0; p < numPackedStreams; p++) {\n const indexResult = readNumber(buf, offset);\n packedStreams.push(indexResult.value);\n offset += indexResult.bytesRead;\n }\n }\n\n return {\n folder: {\n coders: coders,\n bindPairs: bindPairs,\n packedStreams: packedStreams,\n unpackSizes: [],\n hasCRC: false,\n },\n offset: offset,\n };\n}\n\n/**\n * Parse SubStreamsInfo block\n */\nfunction parseSubStreamsInfo(buf: Buffer, offset: number, folders: Folder[]): { numUnpackStreamsPerFolder: number[]; unpackSizes: number[]; unpackCRCs?: number[]; offset: number } {\n const numUnpackStreamsPerFolder: number[] = [];\n const unpackSizes: number[] = [];\n let unpackCRCs: number[] | undefined;\n\n // Default: 1 file per folder\n for (let i = 0; i < folders.length; i++) {\n numUnpackStreamsPerFolder.push(1);\n }\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n if (propertyId === PropertyId.kNumUnpackStream) {\n for (let j = 0; j < folders.length; j++) {\n const numResult = readNumber(buf, offset);\n numUnpackStreamsPerFolder[j] = numResult.value;\n offset += numResult.bytesRead;\n }\n } else if (propertyId === PropertyId.kSize) {\n for (let k = 0; k < folders.length; k++) {\n const numStreams = numUnpackStreamsPerFolder[k];\n if (numStreams === 0) continue;\n\n // Read sizes for all but last stream in folder (last is calculated)\n let remaining = folders[k].unpackSizes[folders[k].unpackSizes.length - 1];\n for (let l = 0; l < numStreams - 1; l++) {\n const sizeResult = readNumber(buf, offset);\n unpackSizes.push(sizeResult.value);\n remaining -= sizeResult.value;\n offset += sizeResult.bytesRead;\n }\n // Last stream size is remainder\n unpackSizes.push(remaining);\n }\n } else if (propertyId === PropertyId.kCRC) {\n // Count files that need CRC\n let numFiles = 0;\n for (let m = 0; m < folders.length; m++) {\n const numStreamsInFolder = numUnpackStreamsPerFolder[m];\n // Only count if folder doesn't have CRC or has multiple streams\n if (!folders[m].hasCRC || numStreamsInFolder > 1) {\n numFiles += numStreamsInFolder;\n }\n }\n\n unpackCRCs = [];\n const definedResult = readDefinedVector(buf, offset, numFiles);\n offset += definedResult.bytesRead;\n for (let n = 0; n < numFiles; n++) {\n if (definedResult.defined[n]) {\n unpackCRCs.push(buf.readUInt32LE(offset));\n offset += 4;\n } else {\n unpackCRCs.push(0);\n }\n }\n }\n }\n\n // If no sizes specified, use folder unpack sizes\n if (unpackSizes.length === 0) {\n for (let p = 0; p < folders.length; p++) {\n const folder = folders[p];\n unpackSizes.push(folder.unpackSizes[folder.unpackSizes.length - 1]);\n }\n }\n\n return { numUnpackStreamsPerFolder: numUnpackStreamsPerFolder, unpackSizes: unpackSizes, unpackCRCs: unpackCRCs, offset: offset };\n}\n\n/**\n * Parse FilesInfo block\n */\nfunction parseFilesInfo(buf: Buffer, offset: number): { files: FileInfo[]; offset: number } {\n // Number of files\n const numFilesResult = readNumber(buf, offset);\n const numFiles = numFilesResult.value;\n offset += numFilesResult.bytesRead;\n\n // Initialize files array\n const files: FileInfo[] = [];\n for (let i = 0; i < numFiles; i++) {\n files.push({\n name: '',\n size: 0,\n isDirectory: false,\n isAntiFile: false,\n hasStream: true,\n });\n }\n\n let emptyStreamFlags: boolean[] = [];\n let emptyFileFlags: boolean[] = [];\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n // Read property size\n const propSizeResult = readNumber(buf, offset);\n const propSize = propSizeResult.value;\n offset += propSizeResult.bytesRead;\n\n const propEnd = offset + propSize;\n\n switch (propertyId) {\n case PropertyId.kEmptyStream:\n emptyStreamFlags = readBoolVector(buf, offset, numFiles);\n // Mark files that don't have streams\n for (let j = 0; j < numFiles; j++) {\n files[j].hasStream = !emptyStreamFlags[j];\n }\n break;\n\n case PropertyId.kEmptyFile: {\n let numEmptyStreams = 0;\n for (let k = 0; k < emptyStreamFlags.length; k++) {\n if (emptyStreamFlags[k]) numEmptyStreams++;\n }\n emptyFileFlags = readBoolVector(buf, offset, numEmptyStreams);\n break;\n }\n\n case PropertyId.kAnti: {\n let numAnti = 0;\n for (let l = 0; l < emptyStreamFlags.length; l++) {\n if (emptyStreamFlags[l]) numAnti++;\n }\n const antiFlags = readBoolVector(buf, offset, numAnti);\n let antiIdx = 0;\n for (let m = 0; m < numFiles; m++) {\n if (emptyStreamFlags[m]) {\n files[m].isAntiFile = antiFlags[antiIdx++];\n }\n }\n break;\n }\n\n case PropertyId.kName:\n offset = parseFileNames(buf, offset, files);\n break;\n\n case PropertyId.kCTime:\n offset = parseFileTimes(buf, offset, files, 'ctime');\n break;\n\n case PropertyId.kATime:\n offset = parseFileTimes(buf, offset, files, 'atime');\n break;\n\n case PropertyId.kMTime:\n offset = parseFileTimes(buf, offset, files, 'mtime');\n break;\n\n case PropertyId.kWinAttributes:\n offset = parseAttributes(buf, offset, files);\n break;\n\n case PropertyId.kDummy:\n // Skip dummy bytes\n break;\n\n default:\n // Skip unknown properties\n break;\n }\n\n offset = propEnd;\n }\n\n // Determine directories from empty stream + not empty file\n let emptyIdx = 0;\n for (let n = 0; n < numFiles; n++) {\n if (emptyStreamFlags[n]) {\n // Empty stream - could be directory or empty file\n if (emptyIdx < emptyFileFlags.length && emptyFileFlags[emptyIdx]) {\n files[n].isDirectory = false; // Empty file\n } else {\n files[n].isDirectory = true; // Directory\n }\n emptyIdx++;\n }\n }\n\n return { files: files, offset: offset };\n}\n\n/**\n * Read a boolean vector (bit-packed)\n */\nfunction readBoolVector(buf: Buffer, offset: number, count: number): boolean[] {\n const result: boolean[] = [];\n let byteIdx = 0;\n let bitMask = 0x80;\n\n for (let i = 0; i < count; i++) {\n result.push((buf[offset + byteIdx] & bitMask) !== 0);\n bitMask = bitMask >>> 1;\n if (bitMask === 0) {\n bitMask = 0x80;\n byteIdx++;\n }\n }\n\n return result;\n}\n\n/**\n * Parse file names (UTF-16LE encoded)\n */\nfunction parseFileNames(buf: Buffer, offset: number, files: FileInfo[]): number {\n // External flag\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External file names not supported', ErrorCode.CORRUPT_HEADER);\n }\n\n // Names are UTF-16LE, null-terminated\n for (let i = 0; i < files.length; i++) {\n const nameChars: number[] = [];\n while (offset < buf.length) {\n const charCode = buf.readUInt16LE(offset);\n offset += 2;\n if (charCode === 0) break;\n nameChars.push(charCode);\n }\n files[i].name = String.fromCharCode.apply(null, nameChars);\n }\n\n return offset;\n}\n\n/**\n * Parse file times (Windows FILETIME format)\n */\nfunction parseFileTimes(buf: Buffer, offset: number, files: FileInfo[], timeType: 'ctime' | 'atime' | 'mtime'): number {\n // Read defined vector (allDefined byte + optional bitmask)\n const definedResult = readDefinedVector(buf, offset, files.length);\n offset += definedResult.bytesRead;\n\n // External flag - 0x00 means data follows inline, non-zero means external stream\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External file times not supported', ErrorCode.UNSUPPORTED_FEATURE);\n }\n\n // Read times\n for (let i = 0; i < files.length; i++) {\n if (definedResult.defined[i]) {\n const filetime = readUInt64LE(buf, offset);\n offset += 8;\n // Convert FILETIME (100ns since 1601) to JavaScript Date\n // FILETIME epoch: 1601-01-01\n // JS Date epoch: 1970-01-01\n // Difference: 11644473600 seconds\n const ms = filetime / 10000 - 11644473600000;\n files[i][timeType] = new Date(ms);\n }\n }\n\n return offset;\n}\n\n/**\n * Parse Windows file attributes\n */\nfunction parseAttributes(buf: Buffer, offset: number, files: FileInfo[]): number {\n // Read defined vector (allDefined byte + optional bitmask)\n const definedResult = readDefinedVector(buf, offset, files.length);\n offset += definedResult.bytesRead;\n\n // External flag - 0x00 means data follows inline, non-zero means external stream\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External file attributes not supported', ErrorCode.UNSUPPORTED_FEATURE);\n }\n\n // Read attributes\n for (let i = 0; i < files.length; i++) {\n if (definedResult.defined[i]) {\n files[i].attributes = buf.readUInt32LE(offset);\n offset += 4;\n }\n }\n\n return offset;\n}\n\n/**\n * Skip archive properties block\n */\nfunction skipArchiveProperties(buf: Buffer, offset: number): number {\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n const sizeResult = readNumber(buf, offset);\n offset += sizeResult.bytesRead + sizeResult.value;\n }\n return offset;\n}\n\n/**\n * Skip streams info block (for additional streams)\n */\nfunction skipStreamsInfo(buf: Buffer, offset: number): number {\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n // For nested structures, recurse\n if (propertyId === PropertyId.kPackInfo || propertyId === PropertyId.kUnpackInfo || propertyId === PropertyId.kSubStreamsInfo) {\n offset = skipStreamsInfo(buf, offset);\n }\n }\n return offset;\n}\n"],"names":["parseEncodedHeader","parseHeaderContent","parseSignatureHeader","buf","bufferEquals","SEVENZ_MAGIC","createCodedError","ErrorCode","INVALID_SIGNATURE","majorVersion","minorVersion","UNSUPPORTED_VERSION","startHeaderCRC","readUInt32LE","verifyCrc32Region","CRC_MISMATCH","nextHeaderOffset","readUInt64LE","nextHeaderSize","nextHeaderCRC","expectedCRC","length","offset","propertyId","PropertyId","kEncodedHeader","COMPRESSED_HEADER","kHeader","CORRUPT_HEADER","result","filesInfo","kEnd","kArchiveProperties","skipArchiveProperties","kAdditionalStreamsInfo","skipStreamsInfo","kMainStreamsInfo","streamsResult","parseStreamsInfo","streamsInfo","info","kFilesInfo","filesResult","parseFilesInfo","files","packPos","packSizes","folders","numUnpackStreamsPerFolder","unpackSizes","kPackInfo","packResult","parsePackInfo","packCRCs","kUnpackInfo","unpackResult","parseUnpackInfo","kSubStreamsInfo","subResult","parseSubStreamsInfo","unpackCRCs","i","folder","finalSize","push","packPosResult","readNumber","value","bytesRead","numPackResult","numPackStreams","kSize","sizeResult","kCRC","definedResult","readDefinedVector","j","defined","kFolder","numFoldersResult","numFolders","external","folderResult","parseFolder","kCodersUnpackSize","numOutputs","k","coders","numOutStreams","l","m","hasCRC","unpackCRC","numCodersResult","numCoders","numInStreamsTotal","numOutStreamsTotal","flags","idSize","isComplex","hasAttributes","id","numInStreams","inResult","outResult","properties","propsLenResult","slice","numBindPairs","bindPairs","inIndexResult","outIndexResult","inIndex","outIndex","numPackedStreams","packedStreams","isBound","n","p","indexResult","kNumUnpackStream","numResult","numStreams","remaining","numFiles","numStreamsInFolder","numFilesResult","name","size","isDirectory","isAntiFile","hasStream","emptyStreamFlags","emptyFileFlags","propSizeResult","propSize","propEnd","kEmptyStream","readBoolVector","kEmptyFile","numEmptyStreams","kAnti","numAnti","antiFlags","antiIdx","kName","parseFileNames","kCTime","parseFileTimes","kATime","kMTime","kWinAttributes","parseAttributes","kDummy","emptyIdx","count","byteIdx","bitMask","nameChars","charCode","readUInt16LE","String","fromCharCode","apply","timeType","UNSUPPORTED_FEATURE","filetime","ms","Date","attributes"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/index.ts"],"sourcesContent":["// 7z format parser exports\n// Only exports needed for public API - internal functions remain internal\n\n// Error types for handling specific error conditions\nexport type { CodedError } from './constants.ts';\nexport { createCodedError, ErrorCode } from './constants.ts';\n// Parser and sources for advanced users\nexport type { ArchiveSource, SevenZipEntry, VoidCallback } from './SevenZipParser.ts';\nexport { BufferSource, FileSource, SevenZipParser } from './SevenZipParser.ts';\n"],"names":["BufferSource","ErrorCode","FileSource","SevenZipParser","createCodedError"],"mappings":"AAAA,2BAA2B;AAC3B,0EAA0E;AAE1E,qDAAqD;;;;;;;;;;;;QAK5CA;eAAAA,8BAAY;;QAHMC;eAAAA,sBAAS;;QAGbC;eAAAA,4BAAU;;QAAEC;eAAAA,gCAAc;;QAHxCC;eAAAA,6BAAgB;;;2BAAmB;gCAGa"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/index.ts"],"sourcesContent":["// 7z format parser exports\n// Only exports needed for public API - internal functions remain internal\n\n// Error types for handling specific error conditions\nexport type { CodedError } from './constants.ts';\nexport { createCodedError, ErrorCode } from './constants.ts';\n// Parser and sources for advanced users\nexport type { ArchiveSource, SevenZipEntry, VoidCallback } from './SevenZipParser.ts';\nexport { BufferSource, FileSource, SevenZipParser } from './SevenZipParser.ts';\n"],"names":["BufferSource","ErrorCode","FileSource","SevenZipParser","createCodedError"],"mappings":"AAAA,2BAA2B;AAC3B,0EAA0E;AAE1E,qDAAqD;;;;;;;;;;;;QAK5CA;eAAAA,8BAAY;;QAHMC;eAAAA,sBAAS;;QAGbC;eAAAA,4BAAU;;QAAEC;eAAAA,gCAAc;;QAHxCC;eAAAA,6BAAgB;;;2BAAmB;gCAGa"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/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 const 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 let extraBytes = 0;\n let 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 const highPart = firstByte & (mask - 1);\n\n // Read extra bytes as LITTLE-ENDIAN\n let value = 0;\n for (let 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 const allDefined = buf[offset] !== 0;\n let bytesRead = 1;\n const defined: boolean[] = [];\n\n if (allDefined) {\n // All items are defined\n for (let i = 0; i < count; i++) {\n defined.push(true);\n }\n } else {\n // Read bitmask\n const bitsNeeded = count;\n const bytesNeeded = Math.ceil(bitsNeeded / 8);\n\n for (let byteIdx = 0; byteIdx < bytesNeeded; byteIdx++) {\n const byte = buf[offset + 1 + byteIdx];\n for (let 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 const values: number[] = [];\n let totalBytesRead = 0;\n\n for (let i = 0; i < count; i++) {\n const 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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"}
{"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 const 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 let extraBytes = 0;\n let 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 const highPart = firstByte & (mask - 1);\n\n // Read extra bytes as LITTLE-ENDIAN\n let value = 0;\n for (let 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 const allDefined = buf[offset] !== 0;\n let bytesRead = 1;\n const defined: boolean[] = [];\n\n if (allDefined) {\n // All items are defined\n for (let i = 0; i < count; i++) {\n defined.push(true);\n }\n } else {\n // Read bitmask\n const bitsNeeded = count;\n const bytesNeeded = Math.ceil(bitsNeeded / 8);\n\n for (let byteIdx = 0; byteIdx < bytesNeeded; byteIdx++) {\n const byte = buf[offset + 1 + byteIdx];\n for (let 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 const values: number[] = [];\n let totalBytesRead = 0;\n\n for (let i = 0; i < count; i++) {\n const 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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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/SevenZipIterator.ts"],"sourcesContent":["import BaseIterator, { Lock } from 'extract-base-iterator';\nimport { rmSync } from 'fs-remove-compat';\nimport fs from 'graceful-fs';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport shortHash from 'short-hash';\nimport tempSuffix from 'temp-suffix';\nimport { tmpdir } from './compat.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\nimport type { Entry, ExtractOptions } from './types.ts';\n\n/**\n * Internal iterator interface for SevenZipParser entries\n * @internal\n */\ninterface SevenZipFileIterator {\n next(): SevenZipEntry | null;\n getParser(): SevenZipParser;\n}\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<Entry> {\n lock: Lock | null;\n /** @internal - Do not use directly */\n _iterator: unknown;\n\n constructor(source: string | NodeJS.ReadableStream, options: ExtractOptions = {}) {\n super(options);\n this.lock = new Lock();\n this.lock.onDestroy = (err) => BaseIterator.prototype.end.call(this, err);\n const queue = new Queue(1);\n let cancelled = false;\n let archiveSource: ArchiveSource | null = null;\n const setup = (): void => {\n cancelled = true;\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 // Register cleanup for file descriptor\n this.lock.registerCleanup(() => {\n fs.closeSync(fd);\n });\n cb();\n });\n });\n });\n } else {\n // Stream input - write to temp file for random access\n // Register cleanup for source stream\n const stream = source as NodeJS.ReadableStream;\n this.lock.registerCleanup(() => {\n const s = stream as NodeJS.ReadableStream & { destroy?: () => void };\n if (typeof s.destroy === 'function') s.destroy();\n });\n\n const tempPath = path.join(tmpdir(), '7z-iterator', shortHash(process.cwd()), tempSuffix('tmp.7z'));\n queue.defer((cb: (err?: Error) => void) => {\n streamToSource(source, { tempPath }, (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\n // Register cleanup for file descriptor\n this.lock.registerCleanup(() => {\n fs.closeSync(result.fd);\n });\n\n // Register cleanup for temp file\n this.lock.registerCleanup(() => {\n try {\n rmSync(result.tempPath);\n } catch (_e) {\n /* ignore */\n }\n });\n\n cb();\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 const parser = new SevenZipParser(archiveSource);\n parser.parse((parseErr) => {\n if (parseErr) {\n cb(parseErr);\n return;\n }\n try {\n this._iterator = new EntryIterator(parser);\n cb();\n } catch (err) {\n cb(err as Error);\n }\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 /**\n * Check if streaming extraction is available for any folder in this archive.\n * Streaming is possible when folders use codecs like BZip2, Deflate, or Copy\n * that can decompress incrementally without buffering the entire input.\n *\n * @returns true if at least one folder supports streaming\n */\n canStream(): boolean {\n if (!this._iterator) return false;\n const parser = (this._iterator as SevenZipFileIterator).getParser();\n if (!parser) return false;\n\n const entries = parser.getEntries();\n const checkedFolders: { [key: number]: boolean } = {};\n\n for (let i = 0; i < entries.length; i++) {\n const folderIndex = entries[i]._folderIndex;\n if (folderIndex >= 0 && checkedFolders[folderIndex] === undefined) {\n checkedFolders[folderIndex] = parser.canStreamFolder(folderIndex);\n if (checkedFolders[folderIndex]) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Get entries sorted for optimal streaming extraction.\n *\n * Entries are sorted by:\n * 1. Folder index (process one folder at a time)\n * 2. Stream index within folder (for solid block streaming)\n *\n * This ordering allows multi-file solid folders to stream with\n * O(largest file) memory instead of O(folder size).\n *\n * @returns Array of entries in streaming order\n */\n getStreamingOrder(): SevenZipEntry[] {\n if (!this._iterator) return [];\n const parser = (this._iterator as SevenZipFileIterator).getParser();\n if (!parser) return [];\n\n const entries = parser.getEntries();\n\n // Create a copy and sort for streaming order\n const sorted: SevenZipEntry[] = [];\n for (let i = 0; i < entries.length; i++) {\n sorted.push(entries[i]);\n }\n\n sorted.sort((a, b) => {\n // First by folder index\n if (a._folderIndex !== b._folderIndex) {\n return a._folderIndex - b._folderIndex;\n }\n // Then by stream index within folder\n return a._streamIndexInFolder - b._streamIndexInFolder;\n });\n\n return sorted;\n }\n}\n"],"names":["SevenZipIterator","EntryIterator","parser","index","entries","getEntries","next","length","getParser","source","options","lock","Lock","onDestroy","err","BaseIterator","prototype","end","call","queue","Queue","cancelled","archiveSource","setup","processing","push","setPassword","password","defer","cb","fs","stat","statErr","stats","done","open","fd","FileSource","size","registerCleanup","closeSync","stream","s","destroy","tempPath","path","join","tmpdir","shortHash","process","cwd","tempSuffix","streamToSource","result","Error","rmSync","_e","SevenZipParser","parse","parseErr","_iterator","await","remove","nextEntry","release","canStream","checkedFolders","i","folderIndex","_folderIndex","undefined","canStreamFolder","getStreamingOrder","sorted","sort","a","b","_streamIndexInFolder"],"mappings":"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"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/SevenZipIterator.ts"],"sourcesContent":["import BaseIterator, { Lock } from 'extract-base-iterator';\nimport { rmSync } from 'fs-remove-compat';\nimport fs from 'graceful-fs';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport shortHash from 'short-hash';\nimport tempSuffix from 'temp-suffix';\nimport { tmpdir } from './compat.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\nimport type { Entry, ExtractOptions } from './types.ts';\n\n/**\n * Internal iterator interface for SevenZipParser entries\n * @internal\n */\ninterface SevenZipFileIterator {\n next(): SevenZipEntry | null;\n getParser(): SevenZipParser;\n}\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<Entry> {\n lock: Lock | null;\n /** @internal - Do not use directly */\n _iterator: unknown;\n\n constructor(source: string | NodeJS.ReadableStream, options: ExtractOptions = {}) {\n super(options);\n this.lock = new Lock();\n this.lock.onDestroy = (err) => BaseIterator.prototype.end.call(this, err);\n const queue = new Queue(1);\n let cancelled = false;\n let archiveSource: ArchiveSource | null = null;\n const setup = (): void => {\n cancelled = true;\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 // Register cleanup for file descriptor\n this.lock.registerCleanup(() => {\n fs.closeSync(fd);\n });\n cb();\n });\n });\n });\n } else {\n // Stream input - write to temp file for random access\n // Register cleanup for source stream\n const stream = source as NodeJS.ReadableStream;\n this.lock.registerCleanup(() => {\n const s = stream as NodeJS.ReadableStream & { destroy?: () => void };\n if (typeof s.destroy === 'function') s.destroy();\n });\n\n const tempPath = path.join(tmpdir(), '7z-iterator', shortHash(process.cwd()), tempSuffix('tmp.7z'));\n queue.defer((cb: (err?: Error) => void) => {\n streamToSource(source, { tempPath }, (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\n // Register cleanup for file descriptor\n this.lock.registerCleanup(() => {\n fs.closeSync(result.fd);\n });\n\n // Register cleanup for temp file\n this.lock.registerCleanup(() => {\n try {\n rmSync(result.tempPath);\n } catch (_e) {\n /* ignore */\n }\n });\n\n cb();\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 const parser = new SevenZipParser(archiveSource);\n parser.parse((parseErr) => {\n if (parseErr) {\n cb(parseErr);\n return;\n }\n try {\n this._iterator = new EntryIterator(parser);\n cb();\n } catch (err) {\n cb(err as Error);\n }\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 /**\n * Check if streaming extraction is available for any folder in this archive.\n * Streaming is possible when folders use codecs like BZip2, Deflate, or Copy\n * that can decompress incrementally without buffering the entire input.\n *\n * @returns true if at least one folder supports streaming\n */\n canStream(): boolean {\n if (!this._iterator) return false;\n const parser = (this._iterator as SevenZipFileIterator).getParser();\n if (!parser) return false;\n\n const entries = parser.getEntries();\n const checkedFolders: { [key: number]: boolean } = {};\n\n for (let i = 0; i < entries.length; i++) {\n const folderIndex = entries[i]._folderIndex;\n if (folderIndex >= 0 && checkedFolders[folderIndex] === undefined) {\n checkedFolders[folderIndex] = parser.canStreamFolder(folderIndex);\n if (checkedFolders[folderIndex]) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Get entries sorted for optimal streaming extraction.\n *\n * Entries are sorted by:\n * 1. Folder index (process one folder at a time)\n * 2. Stream index within folder (for solid block streaming)\n *\n * This ordering allows multi-file solid folders to stream with\n * O(largest file) memory instead of O(folder size).\n *\n * @returns Array of entries in streaming order\n */\n getStreamingOrder(): SevenZipEntry[] {\n if (!this._iterator) return [];\n const parser = (this._iterator as SevenZipFileIterator).getParser();\n if (!parser) return [];\n\n const entries = parser.getEntries();\n\n // Create a copy and sort for streaming order\n const sorted: SevenZipEntry[] = [];\n for (let i = 0; i < entries.length; i++) {\n sorted.push(entries[i]);\n }\n\n sorted.sort((a, b) => {\n // First by folder index\n if (a._folderIndex !== b._folderIndex) {\n return a._folderIndex - b._folderIndex;\n }\n // Then by stream index within folder\n return a._streamIndexInFolder - b._streamIndexInFolder;\n });\n\n return sorted;\n }\n}\n"],"names":["SevenZipIterator","EntryIterator","parser","index","entries","getEntries","next","length","getParser","source","options","lock","Lock","onDestroy","err","BaseIterator","prototype","end","call","queue","Queue","cancelled","archiveSource","setup","processing","push","setPassword","password","defer","cb","fs","stat","statErr","stats","done","open","fd","FileSource","size","registerCleanup","closeSync","stream","s","destroy","tempPath","path","join","tmpdir","shortHash","process","cwd","tempSuffix","streamToSource","result","Error","rmSync","_e","SevenZipParser","parse","parseErr","_iterator","await","remove","nextEntry","release","canStream","checkedFolders","i","folderIndex","_folderIndex","undefined","canStreamFolder","getStreamingOrder","sorted","sort","a","b","_streamIndexInFolder"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/types.ts"],"sourcesContent":["export { DirectoryEntry, LinkEntry, Lock, SymbolicLinkEntry } from 'extract-base-iterator';\nexport { default as FileEntry } from './FileEntry.ts';\nexport type { SevenZipEntry } from './sevenz/SevenZipParser.ts';\n\nimport type { ExtractOptions as BaseExtractOptions, DirectoryEntry, LinkEntry, SymbolicLinkEntry } from 'extract-base-iterator';\nimport type FileEntry from './FileEntry.ts';\n\n// 7z-specific Entry union type with 7z-specific FileEntry\nexport type Entry = DirectoryEntry | FileEntry | LinkEntry | SymbolicLinkEntry;\n\n/**\n * Options for SevenZipIterator\n */\nexport interface ExtractOptions extends BaseExtractOptions {\n /**\n * Password for encrypted archives\n */\n password?: string;\n}\n\nexport type EntryCallback = (error?: Error, result?: IteratorResult<Entry>) => void;\n"],"names":["DirectoryEntry","FileEntry","LinkEntry","Lock","SymbolicLinkEntry"],"mappings":";;;;;;;;;;;QAASA;eAAAA,mCAAc;;QACHC;eAAAA,oBAAS;;QADJC;eAAAA,8BAAS;;QAAEC;eAAAA,yBAAI;;QAAEC;eAAAA,sCAAiB;;;mCAAQ;kEAC9B"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/types.ts"],"sourcesContent":["export { DirectoryEntry, LinkEntry, Lock, SymbolicLinkEntry } from 'extract-base-iterator';\nexport { default as FileEntry } from './FileEntry.ts';\nexport type { SevenZipEntry } from './sevenz/SevenZipParser.ts';\n\nimport type { ExtractOptions as BaseExtractOptions, DirectoryEntry, LinkEntry, SymbolicLinkEntry } from 'extract-base-iterator';\nimport type FileEntry from './FileEntry.ts';\n\n// 7z-specific Entry union type with 7z-specific FileEntry\nexport type Entry = DirectoryEntry | FileEntry | LinkEntry | SymbolicLinkEntry;\n\n/**\n * Options for SevenZipIterator\n */\nexport interface ExtractOptions extends BaseExtractOptions {\n /**\n * Password for encrypted archives\n */\n password?: string;\n}\n\nexport type EntryCallback = (error?: Error, result?: IteratorResult<Entry>) => void;\n"],"names":["DirectoryEntry","FileEntry","LinkEntry","Lock","SymbolicLinkEntry"],"mappings":";;;;;;;;;;;QAASA;eAAAA,mCAAc;;QACHC;eAAAA,oBAAS;;QADJC;eAAAA,8BAAS;;QAAEC;eAAAA,yBAAI;;QAAEC;eAAAA,sCAAiB;;;mCAAQ;kEAC9B"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/compat.ts"],"sourcesContent":["/**\n * Compatibility Layer for Node.js 0.8+\n * Local to this package - contains only needed functions.\n */\nimport os from 'os';\n\nexport function tmpdir(): string {\n return typeof os.tmpdir === 'function' ? os.tmpdir() : require('os-shim').tmpdir();\n}\n"],"names":["os","tmpdir","require"],"mappings":"AAAA;;;CAGC,GACD,OAAOA,QAAQ,KAAK;AAEpB,OAAO,SAASC;IACd,OAAO,OAAOD,GAAGC,MAAM,KAAK,aAAaD,GAAGC,MAAM,KAAKC,QAAQ,WAAWD,MAAM;AAClF"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/compat.ts"],"sourcesContent":["/**\n * Compatibility Layer for Node.js 0.8+\n * Local to this package - contains only needed functions.\n */\nimport os from 'os';\n\nexport function tmpdir(): string {\n return typeof os.tmpdir === 'function' ? os.tmpdir() : require('os-shim').tmpdir();\n}\n"],"names":["os","tmpdir","require"],"mappings":"AAAA;;;CAGC,GACD,OAAOA,QAAQ,KAAK;AAEpB,OAAO,SAASC;IACd,OAAO,OAAOD,GAAGC,MAAM,KAAK,aAAaD,GAAGC,MAAM,KAAKC,QAAQ,WAAWD,MAAM;AAClF"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/FileEntry.ts"],"sourcesContent":["/**\n * FileEntry for 7z archives\n *\n * Wraps a lazy stream - decompression happens when the stream is read.\n * API consistent with zip-iterator and tar-iterator.\n */\n\nimport once from 'call-once-fn';\nimport { type FileAttributes, FileEntry, type Lock, type NoParamCallback, waitForAccess } from 'extract-base-iterator';\nimport fs from 'graceful-fs';\nimport oo from 'on-one';\nimport type { ExtractOptions } from './types.ts';\n\nexport default class SevenZipFileEntry extends FileEntry {\n private lock: Lock;\n private stream: NodeJS.ReadableStream;\n\n /**\n * Whether this entry's folder supports streaming decompression.\n */\n readonly _canStream: boolean;\n\n constructor(attributes: FileAttributes, stream: NodeJS.ReadableStream, lock: Lock, canStream: boolean) {\n super(attributes);\n this.stream = stream;\n this.lock = lock;\n this.lock.retain();\n this._canStream = canStream;\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n return FileEntry.prototype.create.call(this, dest, options, (err?: Error) => {\n callback(err);\n if (this.lock) {\n this.lock.release();\n this.lock = null;\n }\n });\n }\n return new Promise((resolve, reject) =>\n this.create(dest, options, (err?: Error, done?: boolean) => {\n err ? reject(err) : resolve(done);\n })\n );\n }\n\n _writeFile(fullPath: string, _options: ExtractOptions, callback: NoParamCallback): void {\n if (!this.stream) {\n callback(new Error('7z FileEntry missing stream. Check for calling create multiple times'));\n return;\n }\n\n const stream = this.stream;\n this.stream = null; // Prevent reuse\n\n // Use once since errors can come from either stream\n const cb = once((err?: Error) => {\n err ? callback(err) : waitForAccess(fullPath, callback);\n });\n\n try {\n const writeStream = fs.createWriteStream(fullPath);\n\n // Listen for errors on source stream (errors don't propagate through pipe)\n stream.on('error', (streamErr: Error) => {\n // Destroy the write stream on source error.\n // On Node 0.8, destroy() emits 'close' before 'error'. Since on-one is listening\n // for ['error', 'close', 'finish'], it catches 'close' first, calls our callback,\n // and removes ALL listeners - including the 'error' listener. The subsequent EBADF\n // error then fires with no handler, causing an uncaught exception.\n // Adding a no-op error handler ensures there's always a listener for any error.\n const ws = writeStream as fs.WriteStream & { destroy?: () => void };\n writeStream.on('error', () => {});\n if (typeof ws.destroy === 'function') ws.destroy();\n cb(streamErr);\n });\n\n // Pipe and listen for write stream completion/errors\n stream.pipe(writeStream);\n oo(writeStream, ['error', 'close', 'finish'], cb);\n } catch (pipeErr) {\n cb(pipeErr);\n }\n }\n\n destroy() {\n FileEntry.prototype.destroy.call(this);\n if (this.stream) {\n // Use destroy() to prevent decompression (our stream has custom destroy that sets destroyed flag)\n // Fallback to resume() for older Node versions without destroy()\n const s = this.stream as NodeJS.ReadableStream & { destroy?: () => void };\n if (typeof s.destroy === 'function') {\n s.destroy();\n }\n this.stream = null;\n }\n if (this.lock) {\n this.lock.release();\n this.lock = null;\n }\n }\n}\n"],"names":["once","FileEntry","waitForAccess","fs","oo","SevenZipFileEntry","create","dest","options","callback","prototype","call","err","lock","release","Promise","resolve","reject","done","_writeFile","fullPath","_options","stream","Error","cb","writeStream","createWriteStream","on","streamErr","ws","destroy","pipe","pipeErr","s","attributes","canStream","retain","_canStream"],"mappings":"AAAA;;;;;CAKC,GAED,OAAOA,UAAU,eAAe;AAChC,SAA8BC,SAAS,EAAmCC,aAAa,QAAQ,wBAAwB;AACvH,OAAOC,QAAQ,cAAc;AAC7B,OAAOC,QAAQ,SAAS;AAGT,IAAA,AAAMC,oBAAN,MAAMA,0BAA0BJ;IAoB7CK,OAAOC,IAAY,EAAEC,OAA0C,EAAEC,QAA0B,EAA2B;QACpHA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;QACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,IAAI,OAAOC,aAAa,YAAY;YAClC,OAAOR,UAAUS,SAAS,CAACJ,MAAM,CAACK,IAAI,CAAC,IAAI,EAAEJ,MAAMC,SAAS,CAACI;gBAC3DH,SAASG;gBACT,IAAI,IAAI,CAACC,IAAI,EAAE;oBACb,IAAI,CAACA,IAAI,CAACC,OAAO;oBACjB,IAAI,CAACD,IAAI,GAAG;gBACd;YACF;QACF;QACA,OAAO,IAAIE,QAAQ,CAACC,SAASC,SAC3B,IAAI,CAACX,MAAM,CAACC,MAAMC,SAAS,CAACI,KAAaM;gBACvCN,MAAMK,OAAOL,OAAOI,QAAQE;YAC9B;IAEJ;IAEAC,WAAWC,QAAgB,EAAEC,QAAwB,EAAEZ,QAAyB,EAAQ;QACtF,IAAI,CAAC,IAAI,CAACa,MAAM,EAAE;YAChBb,SAAS,IAAIc,MAAM;YACnB;QACF;QAEA,MAAMD,SAAS,IAAI,CAACA,MAAM;QAC1B,IAAI,CAACA,MAAM,GAAG,MAAM,gBAAgB;QAEpC,oDAAoD;QACpD,MAAME,KAAKxB,KAAK,CAACY;YACfA,MAAMH,SAASG,OAAOV,cAAckB,UAAUX;QAChD;QAEA,IAAI;YACF,MAAMgB,cAActB,GAAGuB,iBAAiB,CAACN;YAEzC,2EAA2E;YAC3EE,OAAOK,EAAE,CAAC,SAAS,CAACC;gBAClB,4CAA4C;gBAC5C,iFAAiF;gBACjF,kFAAkF;gBAClF,mFAAmF;gBACnF,mEAAmE;gBACnE,gFAAgF;gBAChF,MAAMC,KAAKJ;gBACXA,YAAYE,EAAE,CAAC,SAAS,KAAO;gBAC/B,IAAI,OAAOE,GAAGC,OAAO,KAAK,YAAYD,GAAGC,OAAO;gBAChDN,GAAGI;YACL;YAEA,qDAAqD;YACrDN,OAAOS,IAAI,CAACN;YACZrB,GAAGqB,aAAa;gBAAC;gBAAS;gBAAS;aAAS,EAAED;QAChD,EAAE,OAAOQ,SAAS;YAChBR,GAAGQ;QACL;IACF;IAEAF,UAAU;QACR7B,UAAUS,SAAS,CAACoB,OAAO,CAACnB,IAAI,CAAC,IAAI;QACrC,IAAI,IAAI,CAACW,MAAM,EAAE;YACf,kGAAkG;YAClG,iEAAiE;YACjE,MAAMW,IAAI,IAAI,CAACX,MAAM;YACrB,IAAI,OAAOW,EAAEH,OAAO,KAAK,YAAY;gBACnCG,EAAEH,OAAO;YACX;YACA,IAAI,CAACR,MAAM,GAAG;QAChB;QACA,IAAI,IAAI,CAACT,IAAI,EAAE;YACb,IAAI,CAACA,IAAI,CAACC,OAAO;YACjB,IAAI,CAACD,IAAI,GAAG;QACd;IACF;IArFA,YAAYqB,UAA0B,EAAEZ,MAA6B,EAAET,IAAU,EAAEsB,SAAkB,CAAE;QACrG,KAAK,CAACD;QACN,IAAI,CAACZ,MAAM,GAAGA;QACd,IAAI,CAACT,IAAI,GAAGA;QACZ,IAAI,CAACA,IAAI,CAACuB,MAAM;QAChB,IAAI,CAACC,UAAU,GAAGF;IACpB;AAgFF;AA/FA,SAAqB9B,+BA+FpB"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/FileEntry.ts"],"sourcesContent":["/**\n * FileEntry for 7z archives\n *\n * Wraps a lazy stream - decompression happens when the stream is read.\n * API consistent with zip-iterator and tar-iterator.\n */\n\nimport once from 'call-once-fn';\nimport { type FileAttributes, FileEntry, type Lock, type NoParamCallback, waitForAccess } from 'extract-base-iterator';\nimport fs from 'graceful-fs';\nimport oo from 'on-one';\nimport type { ExtractOptions } from './types.ts';\n\nexport default class SevenZipFileEntry extends FileEntry {\n private lock: Lock;\n private stream: NodeJS.ReadableStream;\n\n /**\n * Whether this entry's folder supports streaming decompression.\n */\n readonly _canStream: boolean;\n\n constructor(attributes: FileAttributes, stream: NodeJS.ReadableStream, lock: Lock, canStream: boolean) {\n super(attributes);\n this.stream = stream;\n this.lock = lock;\n this.lock.retain();\n this._canStream = canStream;\n }\n\n create(dest: string, callback: NoParamCallback): void;\n create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;\n create(dest: string, options?: ExtractOptions): Promise<boolean>;\n create(dest: string, options?: ExtractOptions | NoParamCallback, callback?: NoParamCallback): void | Promise<boolean> {\n callback = typeof options === 'function' ? options : callback;\n options = typeof options === 'function' ? {} : ((options || {}) as ExtractOptions);\n\n if (typeof callback === 'function') {\n return FileEntry.prototype.create.call(this, dest, options, (err?: Error) => {\n callback(err);\n if (this.lock) {\n this.lock.release();\n this.lock = null;\n }\n });\n }\n return new Promise((resolve, reject) =>\n this.create(dest, options, (err?: Error, done?: boolean) => {\n err ? reject(err) : resolve(done);\n })\n );\n }\n\n _writeFile(fullPath: string, _options: ExtractOptions, callback: NoParamCallback): void {\n if (!this.stream) {\n callback(new Error('7z FileEntry missing stream. Check for calling create multiple times'));\n return;\n }\n\n const stream = this.stream;\n this.stream = null; // Prevent reuse\n\n // Use once since errors can come from either stream\n const cb = once((err?: Error) => {\n err ? callback(err) : waitForAccess(fullPath, callback);\n });\n\n try {\n const writeStream = fs.createWriteStream(fullPath);\n\n // Listen for errors on source stream (errors don't propagate through pipe)\n stream.on('error', (streamErr: Error) => {\n // Destroy the write stream on source error.\n // On Node 0.8, destroy() emits 'close' before 'error'. Since on-one is listening\n // for ['error', 'close', 'finish'], it catches 'close' first, calls our callback,\n // and removes ALL listeners - including the 'error' listener. The subsequent EBADF\n // error then fires with no handler, causing an uncaught exception.\n // Adding a no-op error handler ensures there's always a listener for any error.\n const ws = writeStream as fs.WriteStream & { destroy?: () => void };\n writeStream.on('error', () => {});\n if (typeof ws.destroy === 'function') ws.destroy();\n cb(streamErr);\n });\n\n // Pipe and listen for write stream completion/errors\n stream.pipe(writeStream);\n oo(writeStream, ['error', 'close', 'finish'], cb);\n } catch (pipeErr) {\n cb(pipeErr);\n }\n }\n\n destroy() {\n FileEntry.prototype.destroy.call(this);\n if (this.stream) {\n // Use destroy() to prevent decompression (our stream has custom destroy that sets destroyed flag)\n // Fallback to resume() for older Node versions without destroy()\n const s = this.stream as NodeJS.ReadableStream & { destroy?: () => void };\n if (typeof s.destroy === 'function') {\n s.destroy();\n }\n this.stream = null;\n }\n if (this.lock) {\n this.lock.release();\n this.lock = null;\n }\n }\n}\n"],"names":["once","FileEntry","waitForAccess","fs","oo","SevenZipFileEntry","create","dest","options","callback","prototype","call","err","lock","release","Promise","resolve","reject","done","_writeFile","fullPath","_options","stream","Error","cb","writeStream","createWriteStream","on","streamErr","ws","destroy","pipe","pipeErr","s","attributes","canStream","retain","_canStream"],"mappings":"AAAA;;;;;CAKC,GAED,OAAOA,UAAU,eAAe;AAChC,SAA8BC,SAAS,EAAmCC,aAAa,QAAQ,wBAAwB;AACvH,OAAOC,QAAQ,cAAc;AAC7B,OAAOC,QAAQ,SAAS;AAGT,IAAA,AAAMC,oBAAN,MAAMA,0BAA0BJ;IAoB7CK,OAAOC,IAAY,EAAEC,OAA0C,EAAEC,QAA0B,EAA2B;QACpHA,WAAW,OAAOD,YAAY,aAAaA,UAAUC;QACrDD,UAAU,OAAOA,YAAY,aAAa,CAAC,IAAMA,WAAW,CAAC;QAE7D,IAAI,OAAOC,aAAa,YAAY;YAClC,OAAOR,UAAUS,SAAS,CAACJ,MAAM,CAACK,IAAI,CAAC,IAAI,EAAEJ,MAAMC,SAAS,CAACI;gBAC3DH,SAASG;gBACT,IAAI,IAAI,CAACC,IAAI,EAAE;oBACb,IAAI,CAACA,IAAI,CAACC,OAAO;oBACjB,IAAI,CAACD,IAAI,GAAG;gBACd;YACF;QACF;QACA,OAAO,IAAIE,QAAQ,CAACC,SAASC,SAC3B,IAAI,CAACX,MAAM,CAACC,MAAMC,SAAS,CAACI,KAAaM;gBACvCN,MAAMK,OAAOL,OAAOI,QAAQE;YAC9B;IAEJ;IAEAC,WAAWC,QAAgB,EAAEC,QAAwB,EAAEZ,QAAyB,EAAQ;QACtF,IAAI,CAAC,IAAI,CAACa,MAAM,EAAE;YAChBb,SAAS,IAAIc,MAAM;YACnB;QACF;QAEA,MAAMD,SAAS,IAAI,CAACA,MAAM;QAC1B,IAAI,CAACA,MAAM,GAAG,MAAM,gBAAgB;QAEpC,oDAAoD;QACpD,MAAME,KAAKxB,KAAK,CAACY;YACfA,MAAMH,SAASG,OAAOV,cAAckB,UAAUX;QAChD;QAEA,IAAI;YACF,MAAMgB,cAActB,GAAGuB,iBAAiB,CAACN;YAEzC,2EAA2E;YAC3EE,OAAOK,EAAE,CAAC,SAAS,CAACC;gBAClB,4CAA4C;gBAC5C,iFAAiF;gBACjF,kFAAkF;gBAClF,mFAAmF;gBACnF,mEAAmE;gBACnE,gFAAgF;gBAChF,MAAMC,KAAKJ;gBACXA,YAAYE,EAAE,CAAC,SAAS,KAAO;gBAC/B,IAAI,OAAOE,GAAGC,OAAO,KAAK,YAAYD,GAAGC,OAAO;gBAChDN,GAAGI;YACL;YAEA,qDAAqD;YACrDN,OAAOS,IAAI,CAACN;YACZrB,GAAGqB,aAAa;gBAAC;gBAAS;gBAAS;aAAS,EAAED;QAChD,EAAE,OAAOQ,SAAS;YAChBR,GAAGQ;QACL;IACF;IAEAF,UAAU;QACR7B,UAAUS,SAAS,CAACoB,OAAO,CAACnB,IAAI,CAAC,IAAI;QACrC,IAAI,IAAI,CAACW,MAAM,EAAE;YACf,kGAAkG;YAClG,iEAAiE;YACjE,MAAMW,IAAI,IAAI,CAACX,MAAM;YACrB,IAAI,OAAOW,EAAEH,OAAO,KAAK,YAAY;gBACnCG,EAAEH,OAAO;YACX;YACA,IAAI,CAACR,MAAM,GAAG;QAChB;QACA,IAAI,IAAI,CAACT,IAAI,EAAE;YACb,IAAI,CAACA,IAAI,CAACC,OAAO;YACjB,IAAI,CAACD,IAAI,GAAG;QACd;IACF;IArFA,YAAYqB,UAA0B,EAAEZ,MAA6B,EAAET,IAAU,EAAEsB,SAAkB,CAAE;QACrG,KAAK,CAACD;QACN,IAAI,CAACZ,MAAM,GAAGA;QACd,IAAI,CAACT,IAAI,GAAGA;QACZ,IAAI,CAACA,IAAI,CAACuB,MAAM;QAChB,IAAI,CAACC,UAAU,GAAGF;IACpB;AAgFF;AA/FA,SAAqB9B,+BA+FpB"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/index.ts"],"sourcesContent":["// 7z-iterator - high-level 7z archive iterator\n\nexport * from './FileEntry.ts';\nexport * from './nextEntry.ts';\nexport { default } from './SevenZipIterator.ts';\nexport * from './sevenz/index.ts';\nexport * from './types.ts';\n"],"names":["default"],"mappings":"AAAA,+CAA+C;AAE/C,cAAc,iBAAiB;AAC/B,cAAc,iBAAiB;AAC/B,SAASA,OAAO,QAAQ,wBAAwB;AAChD,cAAc,oBAAoB;AAClC,cAAc,aAAa"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/index.ts"],"sourcesContent":["// 7z-iterator - high-level 7z archive iterator\n\nexport * from './FileEntry.ts';\nexport * from './nextEntry.ts';\nexport { default } from './SevenZipIterator.ts';\nexport * from './sevenz/index.ts';\nexport * from './types.ts';\n"],"names":["default"],"mappings":"AAAA,+CAA+C;AAE/C,cAAc,iBAAiB;AAC/B,cAAc,iBAAiB;AAC/B,SAASA,OAAO,QAAQ,wBAAwB;AAChD,cAAc,oBAAoB;AAClC,cAAc,aAAa"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/lib/defer.ts"],"sourcesContent":["// Yield to I/O: runs after pending I/O callbacks complete\n// setImmediate (Node 0.10+) or setTimeout fallback (Node 0.8)\n// Use this when other code may have scheduled I/O that must run first\n// For \"avoid Zalgo\" (just need async), use process.nextTick instead\nexport const defer: (fn: () => void) => void = typeof setImmediate !== 'undefined' ? setImmediate : (fn) => setTimeout(fn, 0);\n"],"names":["defer","setImmediate","fn","setTimeout"],"mappings":"AAAA,0DAA0D;AAC1D,8DAA8D;AAC9D,sEAAsE;AACtE,oEAAoE;AACpE,OAAO,MAAMA,QAAkC,OAAOC,iBAAiB,cAAcA,eAAe,CAACC,KAAOC,WAAWD,IAAI,GAAG"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/lib/defer.ts"],"sourcesContent":["// Yield to I/O: runs after pending I/O callbacks complete\n// setImmediate (Node 0.10+) or setTimeout fallback (Node 0.8)\n// Use this when other code may have scheduled I/O that must run first\n// For \"avoid Zalgo\" (just need async), use process.nextTick instead\nexport const defer: (fn: () => void) => void = typeof setImmediate !== 'undefined' ? setImmediate : (fn) => setTimeout(fn, 0);\n"],"names":["defer","setImmediate","fn","setTimeout"],"mappings":"AAAA,0DAA0D;AAC1D,8DAA8D;AAC9D,sEAAsE;AACtE,oEAAoE;AACpE,OAAO,MAAMA,QAAkC,OAAOC,iBAAiB,cAAcA,eAAe,CAACC,KAAOC,WAAWD,IAAI,GAAG"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/lib/streamToSource.ts"],"sourcesContent":["// Stream to source conversion: writes stream to temp file for random access\nimport once from 'call-once-fn';\nimport { bufferFrom } from 'extract-base-iterator';\nimport fs from 'graceful-fs';\nimport mkdirp from 'mkdirp-classic';\nimport oo from 'on-one';\nimport path from 'path';\nimport { FileSource } from '../sevenz/SevenZipParser.ts';\n\nexport interface StreamToSourceOptions {\n tempPath: string;\n}\n\nexport interface SourceResult {\n source: FileSource;\n fd: number; // Caller must close\n tempPath: string; // Caller must clean up\n}\n\nexport type Callback = (error?: Error, result?: SourceResult) => void;\n\n/**\n * Convert a stream to a FileSource by writing to temp file\n *\n * 7z format requires random access for header parsing, so temp file is necessary for streams.\n * Writes directly to temp file for predictable O(1) memory usage during stream consumption.\n */\nexport default function streamToSource(stream: NodeJS.ReadableStream, options: StreamToSourceOptions, callback: Callback): void {\n const tempPath = options.tempPath;\n\n const end = once(callback);\n\n mkdirp.sync(path.dirname(tempPath));\n const writeStream = fs.createWriteStream(tempPath);\n\n function onData(chunk: Buffer | string): void {\n const buf = typeof chunk === 'string' ? bufferFrom(chunk) : chunk;\n writeStream.write(buf);\n }\n\n function onEnd(): void {\n writeStream.end(() => {\n fs.open(tempPath, 'r', (err, fd) => {\n if (err) return end(err);\n fs.stat(tempPath, (statErr, stats) => {\n if (statErr) {\n fs.closeSync(fd);\n return end(statErr);\n }\n end(null, {\n source: new FileSource(fd, stats.size),\n fd: fd,\n tempPath: tempPath,\n });\n });\n });\n });\n }\n\n function onError(err: Error): void {\n writeStream.end();\n end(err);\n }\n\n stream.on('data', onData);\n oo(stream, ['error'], onError);\n oo(stream, ['end', 'close', 'finish'], onEnd);\n}\n"],"names":["once","bufferFrom","fs","mkdirp","oo","path","FileSource","streamToSource","stream","options","callback","tempPath","end","sync","dirname","writeStream","createWriteStream","onData","chunk","buf","write","onEnd","open","err","fd","stat","statErr","stats","closeSync","source","size","onError","on"],"mappings":"AAAA,4EAA4E;AAC5E,OAAOA,UAAU,eAAe;AAChC,SAASC,UAAU,QAAQ,wBAAwB;AACnD,OAAOC,QAAQ,cAAc;AAC7B,OAAOC,YAAY,iBAAiB;AACpC,OAAOC,QAAQ,SAAS;AACxB,OAAOC,UAAU,OAAO;AACxB,SAASC,UAAU,QAAQ,8BAA8B;AAczD;;;;;CAKC,GACD,eAAe,SAASC,eAAeC,MAA6B,EAAEC,OAA8B,EAAEC,QAAkB;IACtH,MAAMC,WAAWF,QAAQE,QAAQ;IAEjC,MAAMC,MAAMZ,KAAKU;IAEjBP,OAAOU,IAAI,CAACR,KAAKS,OAAO,CAACH;IACzB,MAAMI,cAAcb,GAAGc,iBAAiB,CAACL;IAEzC,SAASM,OAAOC,KAAsB;QACpC,MAAMC,MAAM,OAAOD,UAAU,WAAWjB,WAAWiB,SAASA;QAC5DH,YAAYK,KAAK,CAACD;IACpB;IAEA,SAASE;QACPN,YAAYH,GAAG,CAAC;YACdV,GAAGoB,IAAI,CAACX,UAAU,KAAK,CAACY,KAAKC;gBAC3B,IAAID,KAAK,OAAOX,IAAIW;gBACpBrB,GAAGuB,IAAI,CAACd,UAAU,CAACe,SAASC;oBAC1B,IAAID,SAAS;wBACXxB,GAAG0B,SAAS,CAACJ;wBACb,OAAOZ,IAAIc;oBACb;oBACAd,IAAI,MAAM;wBACRiB,QAAQ,IAAIvB,WAAWkB,IAAIG,MAAMG,IAAI;wBACrCN,IAAIA;wBACJb,UAAUA;oBACZ;gBACF;YACF;QACF;IACF;IAEA,SAASoB,QAAQR,GAAU;QACzBR,YAAYH,GAAG;QACfA,IAAIW;IACN;IAEAf,OAAOwB,EAAE,CAAC,QAAQf;IAClBb,GAAGI,QAAQ;QAAC;KAAQ,EAAEuB;IACtB3B,GAAGI,QAAQ;QAAC;QAAO;QAAS;KAAS,EAAEa;AACzC"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/lib/streamToSource.ts"],"sourcesContent":["// Stream to source conversion: writes stream to temp file for random access\nimport once from 'call-once-fn';\nimport { bufferFrom } from 'extract-base-iterator';\nimport fs from 'graceful-fs';\nimport mkdirp from 'mkdirp-classic';\nimport oo from 'on-one';\nimport path from 'path';\nimport { FileSource } from '../sevenz/SevenZipParser.ts';\n\nexport interface StreamToSourceOptions {\n tempPath: string;\n}\n\nexport interface SourceResult {\n source: FileSource;\n fd: number; // Caller must close\n tempPath: string; // Caller must clean up\n}\n\nexport type Callback = (error?: Error, result?: SourceResult) => void;\n\n/**\n * Convert a stream to a FileSource by writing to temp file\n *\n * 7z format requires random access for header parsing, so temp file is necessary for streams.\n * Writes directly to temp file for predictable O(1) memory usage during stream consumption.\n */\nexport default function streamToSource(stream: NodeJS.ReadableStream, options: StreamToSourceOptions, callback: Callback): void {\n const tempPath = options.tempPath;\n\n const end = once(callback);\n\n mkdirp.sync(path.dirname(tempPath));\n const writeStream = fs.createWriteStream(tempPath);\n\n function onData(chunk: Buffer | string): void {\n const buf = typeof chunk === 'string' ? bufferFrom(chunk) : chunk;\n writeStream.write(buf);\n }\n\n function onEnd(): void {\n writeStream.end(() => {\n fs.open(tempPath, 'r', (err, fd) => {\n if (err) return end(err);\n fs.stat(tempPath, (statErr, stats) => {\n if (statErr) {\n fs.closeSync(fd);\n return end(statErr);\n }\n end(null, {\n source: new FileSource(fd, stats.size),\n fd: fd,\n tempPath: tempPath,\n });\n });\n });\n });\n }\n\n function onError(err: Error): void {\n writeStream.end();\n end(err);\n }\n\n stream.on('data', onData);\n oo(stream, ['error'], onError);\n oo(stream, ['end', 'close', 'finish'], onEnd);\n}\n"],"names":["once","bufferFrom","fs","mkdirp","oo","path","FileSource","streamToSource","stream","options","callback","tempPath","end","sync","dirname","writeStream","createWriteStream","onData","chunk","buf","write","onEnd","open","err","fd","stat","statErr","stats","closeSync","source","size","onError","on"],"mappings":"AAAA,4EAA4E;AAC5E,OAAOA,UAAU,eAAe;AAChC,SAASC,UAAU,QAAQ,wBAAwB;AACnD,OAAOC,QAAQ,cAAc;AAC7B,OAAOC,YAAY,iBAAiB;AACpC,OAAOC,QAAQ,SAAS;AACxB,OAAOC,UAAU,OAAO;AACxB,SAASC,UAAU,QAAQ,8BAA8B;AAczD;;;;;CAKC,GACD,eAAe,SAASC,eAAeC,MAA6B,EAAEC,OAA8B,EAAEC,QAAkB;IACtH,MAAMC,WAAWF,QAAQE,QAAQ;IAEjC,MAAMC,MAAMZ,KAAKU;IAEjBP,OAAOU,IAAI,CAACR,KAAKS,OAAO,CAACH;IACzB,MAAMI,cAAcb,GAAGc,iBAAiB,CAACL;IAEzC,SAASM,OAAOC,KAAsB;QACpC,MAAMC,MAAM,OAAOD,UAAU,WAAWjB,WAAWiB,SAASA;QAC5DH,YAAYK,KAAK,CAACD;IACpB;IAEA,SAASE;QACPN,YAAYH,GAAG,CAAC;YACdV,GAAGoB,IAAI,CAACX,UAAU,KAAK,CAACY,KAAKC;gBAC3B,IAAID,KAAK,OAAOX,IAAIW;gBACpBrB,GAAGuB,IAAI,CAACd,UAAU,CAACe,SAASC;oBAC1B,IAAID,SAAS;wBACXxB,GAAG0B,SAAS,CAACJ;wBACb,OAAOZ,IAAIc;oBACb;oBACAd,IAAI,MAAM;wBACRiB,QAAQ,IAAIvB,WAAWkB,IAAIG,MAAMG,IAAI;wBACrCN,IAAIA;wBACJb,UAAUA;oBACZ;gBACF;YACF;QACF;IACF;IAEA,SAASoB,QAAQR,GAAU;QACzBR,YAAYH,GAAG;QACfA,IAAIW;IACN;IAEAf,OAAOwB,EAAE,CAAC,QAAQf;IAClBb,GAAGI,QAAQ;QAAC;KAAQ,EAAEuB;IACtB3B,GAAGI,QAAQ;QAAC;QAAO;QAAS;KAAS,EAAEa;AACzC"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/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 path from 'path';\nimport FileEntry from './FileEntry.ts';\nimport type SevenZipIterator from './SevenZipIterator.ts';\nimport type { SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.ts';\nimport type { Entry, EntryCallback } from './types.ts';\n\nexport type NextCallback = (error?: Error, entry?: Entry) => void;\n\n/** @internal */\ninterface InternalIterator {\n next(): SevenZipEntry | null;\n getParser(): SevenZipParser;\n}\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): void {\n const internalIter = iterator._iterator as InternalIterator | null;\n if (!internalIter) {\n callback(new Error('iterator missing'));\n return;\n }\n\n let entry: SevenZipEntry | null = null;\n entry = internalIter.next();\n\n const 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 const type = entry.type;\n\n // Default modes (decimal values for Node 0.8 compatibility)\n // 0o755 = 493, 0o644 = 420\n const defaultMode = type === 'directory' ? 493 : 420;\n\n // Build attributes from 7z entry\n // mtime must be timestamp (number) for FileAttributes compatibility\n const mtimeDate = entry.mtime || new Date();\n const attributes: EntryAttributesBuilder = {\n path: entry.path.split(path.sep).filter(Boolean).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 const parser = internalIter.getParser();\n const stream = parser.getEntryStream(entry);\n\n const chunks: Buffer[] = [];\n\n stream.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n stream.on('end', () => {\n const linkpath = Buffer.concat(chunks).toString('utf8');\n\n const 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', (streamErr: Error) => {\n nextCallback(streamErr);\n });\n return;\n }\n\n case 'file': {\n attributes.type = 'file';\n attributes.size = entry.size;\n const parser = internalIter.getParser();\n\n const stream = parser.getEntryStream(entry);\n return nextCallback(null, new FileEntry(attributes as FileAttributes, stream, iterator.lock, entry._canStream));\n }\n }\n\n return callback(new Error(`Unrecognized entry type: ${type}`));\n}\n"],"names":["once","DirectoryEntry","SymbolicLinkEntry","path","FileEntry","nextEntry","iterator","callback","internalIter","_iterator","Error","entry","next","nextCallback","err","push","done","value","lock","isDone","isAntiFile","type","defaultMode","mtimeDate","mtime","Date","attributes","split","sep","filter","Boolean","join","basename","name","getTime","mode","undefined","parser","getParser","stream","getEntryStream","chunks","on","chunk","linkpath","Buffer","concat","toString","linkAttributes","streamErr","size","_canStream"],"mappings":"AAAA,OAAOA,UAAU,eAAe;AAChC,SAAmCC,cAAc,EAA4CC,iBAAiB,QAAQ,wBAAwB;AAC9I,OAAOC,UAAU,OAAO;AACxB,OAAOC,eAAe,iBAAiB;AAwBvC,eAAe,SAASC,UAAcC,QAA0B,EAAEC,QAAuB;IACvF,MAAMC,eAAeF,SAASG,SAAS;IACvC,IAAI,CAACD,cAAc;QACjBD,SAAS,IAAIG,MAAM;QACnB;IACF;IAEA,IAAIC,QAA8B;IAClCA,QAAQH,aAAaI,IAAI;IAEzB,MAAMC,eAAeb,KAAK,CAACc,KAAaH;QACtC,kBAAkB;QAClB,IAAIA,OAAOL,SAASS,IAAI,CAACV;QACzBS,MAAMP,SAASO,OAAOP,SAAS,MAAMI,QAAQ;YAAEK,MAAM;YAAOC,OAAON;QAAM,IAAI;YAAEK,MAAM;YAAMC,OAAO;QAAK;IACzG;IAEA,gEAAgE;IAChE,IAAI,CAACX,SAASY,IAAI,IAAIZ,SAASa,MAAM,MAAM,CAACR,OAAO,OAAOJ,SAAS,MAAM;QAAES,MAAM;QAAMC,OAAO;IAAK;IAEnG,iEAAiE;IACjE,IAAIN,MAAMS,UAAU,EAAE;QACpBd,SAASS,IAAI,CAACV;QACd,OAAOE,SAAS,MAAM;IACxB;IAEA,4BAA4B;IAC5B,MAAMc,OAAOV,MAAMU,IAAI;IAEvB,4DAA4D;IAC5D,2BAA2B;IAC3B,MAAMC,cAAcD,SAAS,cAAc,MAAM;IAEjD,iCAAiC;IACjC,oEAAoE;IACpE,MAAME,YAAYZ,MAAMa,KAAK,IAAI,IAAIC;IACrC,MAAMC,aAAqC;QACzCvB,MAAMQ,MAAMR,IAAI,CAACwB,KAAK,CAACxB,KAAKyB,GAAG,EAAEC,MAAM,CAACC,SAASC,IAAI,CAAC5B,KAAKyB,GAAG;QAC9DI,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,IAAIZ,eAAeyB;QAE/C,KAAK;YAAQ;gBACX,4DAA4D;gBAC5D,6DAA6D;gBAC7D,MAAMW,SAAS7B,aAAa8B,SAAS;gBACrC,MAAMC,SAASF,OAAOG,cAAc,CAAC7B;gBAErC,MAAM8B,SAAmB,EAAE;gBAE3BF,OAAOG,EAAE,CAAC,QAAQ,CAACC;oBACjBF,OAAO1B,IAAI,CAAC4B;gBACd;gBACAJ,OAAOG,EAAE,CAAC,OAAO;oBACf,MAAME,WAAWC,OAAOC,MAAM,CAACL,QAAQM,QAAQ,CAAC;oBAEhD,MAAMC,iBAAiC;wBACrC7C,MAAMuB,WAAWvB,IAAI;wBACrBqB,OAAOE,WAAWF,KAAK;wBACvBW,MAAMT,WAAWS,IAAI;wBACrBS,UAAUA;oBACZ;oBAEA/B,aAAa,MAAM,IAAIX,kBAAkB8C;gBAC3C;gBACAT,OAAOG,EAAE,CAAC,SAAS,CAACO;oBAClBpC,aAAaoC;gBACf;gBACA;YACF;QAEA,KAAK;YAAQ;gBACXvB,WAAWL,IAAI,GAAG;gBAClBK,WAAWwB,IAAI,GAAGvC,MAAMuC,IAAI;gBAC5B,MAAMb,SAAS7B,aAAa8B,SAAS;gBAErC,MAAMC,SAASF,OAAOG,cAAc,CAAC7B;gBACrC,OAAOE,aAAa,MAAM,IAAIT,UAAUsB,YAA8Ba,QAAQjC,SAASY,IAAI,EAAEP,MAAMwC,UAAU;YAC/G;IACF;IAEA,OAAO5C,SAAS,IAAIG,MAAM,CAAC,yBAAyB,EAAEW,MAAM;AAC9D"}
{"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 path from 'path';\nimport FileEntry from './FileEntry.ts';\nimport type SevenZipIterator from './SevenZipIterator.ts';\nimport type { SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.ts';\nimport type { Entry, EntryCallback } from './types.ts';\n\nexport type NextCallback = (error?: Error, entry?: Entry) => void;\n\n/** @internal */\ninterface InternalIterator {\n next(): SevenZipEntry | null;\n getParser(): SevenZipParser;\n}\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): void {\n const internalIter = iterator._iterator as InternalIterator | null;\n if (!internalIter) {\n callback(new Error('iterator missing'));\n return;\n }\n\n let entry: SevenZipEntry | null = null;\n entry = internalIter.next();\n\n const 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 const type = entry.type;\n\n // Default modes (decimal values for Node 0.8 compatibility)\n // 0o755 = 493, 0o644 = 420\n const defaultMode = type === 'directory' ? 493 : 420;\n\n // Build attributes from 7z entry\n // mtime must be timestamp (number) for FileAttributes compatibility\n const mtimeDate = entry.mtime || new Date();\n const attributes: EntryAttributesBuilder = {\n path: entry.path.split(path.sep).filter(Boolean).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 const parser = internalIter.getParser();\n const stream = parser.getEntryStream(entry);\n\n const chunks: Buffer[] = [];\n\n stream.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n stream.on('end', () => {\n const linkpath = Buffer.concat(chunks).toString('utf8');\n\n const 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', (streamErr: Error) => {\n nextCallback(streamErr);\n });\n return;\n }\n\n case 'file': {\n attributes.type = 'file';\n attributes.size = entry.size;\n const parser = internalIter.getParser();\n\n const stream = parser.getEntryStream(entry);\n return nextCallback(null, new FileEntry(attributes as FileAttributes, stream, iterator.lock, entry._canStream));\n }\n }\n\n return callback(new Error(`Unrecognized entry type: ${type}`));\n}\n"],"names":["once","DirectoryEntry","SymbolicLinkEntry","path","FileEntry","nextEntry","iterator","callback","internalIter","_iterator","Error","entry","next","nextCallback","err","push","done","value","lock","isDone","isAntiFile","type","defaultMode","mtimeDate","mtime","Date","attributes","split","sep","filter","Boolean","join","basename","name","getTime","mode","undefined","parser","getParser","stream","getEntryStream","chunks","on","chunk","linkpath","Buffer","concat","toString","linkAttributes","streamErr","size","_canStream"],"mappings":"AAAA,OAAOA,UAAU,eAAe;AAChC,SAAmCC,cAAc,EAA4CC,iBAAiB,QAAQ,wBAAwB;AAC9I,OAAOC,UAAU,OAAO;AACxB,OAAOC,eAAe,iBAAiB;AAwBvC,eAAe,SAASC,UAAcC,QAA0B,EAAEC,QAAuB;IACvF,MAAMC,eAAeF,SAASG,SAAS;IACvC,IAAI,CAACD,cAAc;QACjBD,SAAS,IAAIG,MAAM;QACnB;IACF;IAEA,IAAIC,QAA8B;IAClCA,QAAQH,aAAaI,IAAI;IAEzB,MAAMC,eAAeb,KAAK,CAACc,KAAaH;QACtC,kBAAkB;QAClB,IAAIA,OAAOL,SAASS,IAAI,CAACV;QACzBS,MAAMP,SAASO,OAAOP,SAAS,MAAMI,QAAQ;YAAEK,MAAM;YAAOC,OAAON;QAAM,IAAI;YAAEK,MAAM;YAAMC,OAAO;QAAK;IACzG;IAEA,gEAAgE;IAChE,IAAI,CAACX,SAASY,IAAI,IAAIZ,SAASa,MAAM,MAAM,CAACR,OAAO,OAAOJ,SAAS,MAAM;QAAES,MAAM;QAAMC,OAAO;IAAK;IAEnG,iEAAiE;IACjE,IAAIN,MAAMS,UAAU,EAAE;QACpBd,SAASS,IAAI,CAACV;QACd,OAAOE,SAAS,MAAM;IACxB;IAEA,4BAA4B;IAC5B,MAAMc,OAAOV,MAAMU,IAAI;IAEvB,4DAA4D;IAC5D,2BAA2B;IAC3B,MAAMC,cAAcD,SAAS,cAAc,MAAM;IAEjD,iCAAiC;IACjC,oEAAoE;IACpE,MAAME,YAAYZ,MAAMa,KAAK,IAAI,IAAIC;IACrC,MAAMC,aAAqC;QACzCvB,MAAMQ,MAAMR,IAAI,CAACwB,KAAK,CAACxB,KAAKyB,GAAG,EAAEC,MAAM,CAACC,SAASC,IAAI,CAAC5B,KAAKyB,GAAG;QAC9DI,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,IAAIZ,eAAeyB;QAE/C,KAAK;YAAQ;gBACX,4DAA4D;gBAC5D,6DAA6D;gBAC7D,MAAMW,SAAS7B,aAAa8B,SAAS;gBACrC,MAAMC,SAASF,OAAOG,cAAc,CAAC7B;gBAErC,MAAM8B,SAAmB,EAAE;gBAE3BF,OAAOG,EAAE,CAAC,QAAQ,CAACC;oBACjBF,OAAO1B,IAAI,CAAC4B;gBACd;gBACAJ,OAAOG,EAAE,CAAC,OAAO;oBACf,MAAME,WAAWC,OAAOC,MAAM,CAACL,QAAQM,QAAQ,CAAC;oBAEhD,MAAMC,iBAAiC;wBACrC7C,MAAMuB,WAAWvB,IAAI;wBACrBqB,OAAOE,WAAWF,KAAK;wBACvBW,MAAMT,WAAWS,IAAI;wBACrBS,UAAUA;oBACZ;oBAEA/B,aAAa,MAAM,IAAIX,kBAAkB8C;gBAC3C;gBACAT,OAAOG,EAAE,CAAC,SAAS,CAACO;oBAClBpC,aAAaoC;gBACf;gBACA;YACF;QAEA,KAAK;YAAQ;gBACXvB,WAAWL,IAAI,GAAG;gBAClBK,WAAWwB,IAAI,GAAGvC,MAAMuC,IAAI;gBAC5B,MAAMb,SAAS7B,aAAa8B,SAAS;gBAErC,MAAMC,SAASF,OAAOG,cAAc,CAAC7B;gBACrC,OAAOE,aAAa,MAAM,IAAIT,UAAUsB,YAA8Ba,QAAQjC,SAASY,IAAI,EAAEP,MAAMwC,UAAU;YAC/G;IACF;IAEA,OAAO5C,SAAS,IAAIG,MAAM,CAAC,yBAAyB,EAAEW,MAAM;AAC9D"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/ArchiveSource.ts"],"sourcesContent":["/**\n * ArchiveSource - Abstraction for reading 7z archive data\n *\n * Provides a common interface for reading archive data from either\n * a file descriptor or an in-memory buffer.\n */\n\nimport { allocBuffer, Readable } from 'extract-base-iterator';\nimport fs from 'fs';\nimport type Stream from 'stream';\n\n// Helper to create a Readable stream compatible with Node 0.8\nfunction createReadableStream(readFn: (stream: Stream.Readable) => void): Stream.Readable {\n const stream = new Readable();\n stream._read = function () {\n readFn(this);\n };\n return stream;\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 * Create a readable stream for a portion of the archive.\n * Used for streaming decompression.\n */\n createReadStream(offset: number, length: number): Stream.Readable;\n}\n\n/**\n * Buffer-based archive source\n *\n * Used when the entire archive is already in memory.\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 * Create a readable stream for a portion of the buffer.\n * Streams the data in chunks to avoid blocking.\n */\n createReadStream(offset: number, length: number): Stream.Readable {\n const buffer = this.buffer;\n const end = Math.min(offset + length, buffer.length);\n let currentPos = offset;\n const chunkSize = 65536; // 64KB chunks\n\n return createReadableStream((stream) => {\n if (currentPos >= end) {\n stream.push(null);\n return;\n }\n\n const toRead = Math.min(chunkSize, end - currentPos);\n const chunk = buffer.slice(currentPos, currentPos + toRead);\n currentPos += toRead;\n stream.push(chunk);\n });\n }\n}\n\n/**\n * File descriptor based archive source\n *\n * Used for reading directly from a file on disk.\n * More memory efficient for large archives.\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 // Handle large reads by chunking to fit 32-bit signed int limit\n const MAX_INT32 = 0x7fffffff; // 2,147,483,647 bytes (~2GB)\n\n if (length <= MAX_INT32) {\n return this.readChunk(position, length);\n }\n\n // For large reads, split into multiple chunks\n const chunks: Buffer[] = [];\n let totalBytesRead = 0;\n let currentPos = position;\n\n while (totalBytesRead < length) {\n const remaining = length - totalBytesRead;\n const chunkSize = Math.min(remaining, MAX_INT32);\n const chunk = this.readChunk(currentPos, chunkSize);\n\n chunks.push(chunk);\n totalBytesRead += chunk.length;\n currentPos += chunk.length;\n\n if (chunk.length < chunkSize) {\n // EOF reached\n break;\n }\n }\n\n return Buffer.concat(chunks);\n }\n\n private readChunk(position: number, length: number): Buffer {\n const buf = allocBuffer(length);\n const 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 * Create a readable stream for a portion of the file.\n * Uses async fs.read() to avoid blocking the event loop.\n */\n createReadStream(offset: number, length: number): Stream.Readable {\n const fd = this.fd;\n let bytesRead = 0;\n let reading = false;\n let finished = false;\n const chunkSize = 65536; // 64KB chunks\n let _streamRef: Stream.Readable | null = null;\n\n const stream = createReadableStream((s) => {\n _streamRef = s;\n if (reading || finished) return; // Prevent re-entrant reads\n\n const toRead = Math.min(chunkSize, length - bytesRead);\n if (toRead <= 0) {\n finished = true;\n s.push(null);\n return;\n }\n\n reading = true;\n const buffer = allocBuffer(toRead);\n const currentOffset = offset + bytesRead;\n\n fs.read(fd, buffer, 0, toRead, currentOffset, (err, n) => {\n reading = false;\n\n if (err) {\n // Emit error for Node 0.8 compatibility (no destroy method)\n s.emit('error', err);\n finished = true;\n s.push(null);\n return;\n }\n\n if (n === 0) {\n finished = true;\n s.push(null);\n } else {\n bytesRead += n;\n s.push(buffer.slice(0, n));\n }\n });\n });\n\n return stream;\n }\n}\n"],"names":["allocBuffer","Readable","fs","createReadableStream","readFn","stream","_read","BufferSource","read","position","length","buffer","slice","getSize","close","createReadStream","offset","end","Math","min","currentPos","chunkSize","push","toRead","chunk","FileSource","MAX_INT32","readChunk","chunks","totalBytesRead","remaining","Buffer","concat","buf","bytesRead","readSync","fd","size","closeSync","_e","reading","finished","_streamRef","s","currentOffset","err","n","emit"],"mappings":"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"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/ArchiveSource.ts"],"sourcesContent":["/**\n * ArchiveSource - Abstraction for reading 7z archive data\n *\n * Provides a common interface for reading archive data from either\n * a file descriptor or an in-memory buffer.\n */\n\nimport { allocBuffer, Readable } from 'extract-base-iterator';\nimport fs from 'fs';\nimport type Stream from 'stream';\n\n// Helper to create a Readable stream compatible with Node 0.8\nfunction createReadableStream(readFn: (stream: Stream.Readable) => void): Stream.Readable {\n const stream = new Readable();\n stream._read = function () {\n readFn(this);\n };\n return stream;\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 * Create a readable stream for a portion of the archive.\n * Used for streaming decompression.\n */\n createReadStream(offset: number, length: number): Stream.Readable;\n}\n\n/**\n * Buffer-based archive source\n *\n * Used when the entire archive is already in memory.\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 * Create a readable stream for a portion of the buffer.\n * Streams the data in chunks to avoid blocking.\n */\n createReadStream(offset: number, length: number): Stream.Readable {\n const buffer = this.buffer;\n const end = Math.min(offset + length, buffer.length);\n let currentPos = offset;\n const chunkSize = 65536; // 64KB chunks\n\n return createReadableStream((stream) => {\n if (currentPos >= end) {\n stream.push(null);\n return;\n }\n\n const toRead = Math.min(chunkSize, end - currentPos);\n const chunk = buffer.slice(currentPos, currentPos + toRead);\n currentPos += toRead;\n stream.push(chunk);\n });\n }\n}\n\n/**\n * File descriptor based archive source\n *\n * Used for reading directly from a file on disk.\n * More memory efficient for large archives.\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 // Handle large reads by chunking to fit 32-bit signed int limit\n const MAX_INT32 = 0x7fffffff; // 2,147,483,647 bytes (~2GB)\n\n if (length <= MAX_INT32) {\n return this.readChunk(position, length);\n }\n\n // For large reads, split into multiple chunks\n const chunks: Buffer[] = [];\n let totalBytesRead = 0;\n let currentPos = position;\n\n while (totalBytesRead < length) {\n const remaining = length - totalBytesRead;\n const chunkSize = Math.min(remaining, MAX_INT32);\n const chunk = this.readChunk(currentPos, chunkSize);\n\n chunks.push(chunk);\n totalBytesRead += chunk.length;\n currentPos += chunk.length;\n\n if (chunk.length < chunkSize) {\n // EOF reached\n break;\n }\n }\n\n return Buffer.concat(chunks);\n }\n\n private readChunk(position: number, length: number): Buffer {\n const buf = allocBuffer(length);\n const 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 * Create a readable stream for a portion of the file.\n * Uses async fs.read() to avoid blocking the event loop.\n */\n createReadStream(offset: number, length: number): Stream.Readable {\n const fd = this.fd;\n let bytesRead = 0;\n let reading = false;\n let finished = false;\n const chunkSize = 65536; // 64KB chunks\n let _streamRef: Stream.Readable | null = null;\n\n const stream = createReadableStream((s) => {\n _streamRef = s;\n if (reading || finished) return; // Prevent re-entrant reads\n\n const toRead = Math.min(chunkSize, length - bytesRead);\n if (toRead <= 0) {\n finished = true;\n s.push(null);\n return;\n }\n\n reading = true;\n const buffer = allocBuffer(toRead);\n const currentOffset = offset + bytesRead;\n\n fs.read(fd, buffer, 0, toRead, currentOffset, (err, n) => {\n reading = false;\n\n if (err) {\n // Emit error for Node 0.8 compatibility (no destroy method)\n s.emit('error', err);\n finished = true;\n s.push(null);\n return;\n }\n\n if (n === 0) {\n finished = true;\n s.push(null);\n } else {\n bytesRead += n;\n s.push(buffer.slice(0, n));\n }\n });\n });\n\n return stream;\n }\n}\n"],"names":["allocBuffer","Readable","fs","createReadableStream","readFn","stream","_read","BufferSource","read","position","length","buffer","slice","getSize","close","createReadStream","offset","end","Math","min","currentPos","chunkSize","push","toRead","chunk","FileSource","MAX_INT32","readChunk","chunks","totalBytesRead","remaining","Buffer","concat","buf","bytesRead","readSync","fd","size","closeSync","_e","reading","finished","_streamRef","s","currentOffset","err","n","emit"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/Aes.ts"],"sourcesContent":["// 7z AES-256-CBC codec with SHA-256 key derivation\n// Implements password-based decryption for encrypted 7z archives\n//\n// Properties format:\n// Byte 0: bits 0-5 = NumCyclesPower (iterations = 2^NumCyclesPower)\n// bit 6 = IV present flag\n// bit 7 = Salt present flag\n// Byte 1: upper nibble = salt size extension\n// lower nibble = IV size extension\n// Following bytes: salt data, then IV data\n//\n// Key derivation:\n// For each round (2^NumCyclesPower times):\n// hash = SHA256(salt + password_utf16le + round_counter_8bytes)\n// Final key = first 32 bytes of accumulated hash\n\nimport crypto from 'crypto';\nimport { allocBuffer, bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n// Global password storage - set before decryption\nlet _password: string | null = null;\n\n/**\n * Set the password for AES decryption\n */\nexport function setPassword(password: string | null): void {\n _password = password;\n}\n\n/**\n * Get the current password\n */\nexport function getPassword(): string | null {\n return _password;\n}\n\n/**\n * Parse AES properties to extract key derivation parameters\n */\nfunction parseProperties(properties: Buffer): { numCyclesPower: number; salt: Buffer; iv: Buffer } {\n if (!properties || properties.length < 1) {\n throw new Error('AES: missing properties');\n }\n\n const b0 = properties[0];\n const numCyclesPower = b0 & 0x3f;\n\n // Check for special case: no salt/IV flags\n if ((b0 & 0xc0) === 0) {\n // No salt, no IV - use zeros\n return {\n numCyclesPower: numCyclesPower,\n salt: allocBuffer(0),\n iv: allocBuffer(16),\n };\n }\n\n if (properties.length < 2) {\n throw new Error('AES: properties too short');\n }\n\n const b1 = properties[1];\n\n // Calculate sizes\n // saltSize = ((b0 >> 7) & 1) + (b1 >> 4)\n // ivSize = ((b0 >> 6) & 1) + (b1 & 0x0F)\n const saltSize = ((b0 >>> 7) & 1) + (b1 >>> 4);\n const ivSize = ((b0 >>> 6) & 1) + (b1 & 0x0f);\n\n const expectedSize = 2 + saltSize + ivSize;\n if (properties.length < expectedSize) {\n throw new Error('AES: properties too short for salt/IV');\n }\n\n const salt = properties.slice(2, 2 + saltSize);\n const iv = allocBuffer(16);\n\n // Copy IV data (may be less than 16 bytes, rest is zeros)\n const ivData = properties.slice(2 + saltSize, 2 + saltSize + ivSize);\n for (let i = 0; i < ivData.length && i < 16; i++) {\n iv[i] = ivData[i];\n }\n\n return {\n numCyclesPower: numCyclesPower,\n salt: salt,\n iv: iv,\n };\n}\n\n/**\n * Convert password string to UTF-16LE buffer\n */\nfunction passwordToUtf16LE(password: string): Buffer {\n const buf = allocBuffer(password.length * 2);\n for (let i = 0; i < password.length; i++) {\n const code = password.charCodeAt(i);\n buf[i * 2] = code & 0xff;\n buf[i * 2 + 1] = (code >>> 8) & 0xff;\n }\n return buf;\n}\n\n/**\n * Derive AES-256 key from password using 7z's SHA-256 iteration scheme\n *\n * Algorithm:\n * For round = 0 to 2^numCyclesPower - 1:\n * hash.update(salt)\n * hash.update(password_utf16le)\n * hash.update(round as 8-byte little-endian)\n * key = hash.digest()\n */\nfunction deriveKey(password: string, salt: Buffer, numCyclesPower: number): Buffer {\n const passwordBuf = passwordToUtf16LE(password);\n const numRounds = 2 ** numCyclesPower;\n\n // For special case 0x3F, don't iterate\n if (numCyclesPower === 0x3f) {\n // Direct concatenation mode\n const key = allocBuffer(32);\n let offset = 0;\n for (let j = 0; j < salt.length && offset < 32; j++) {\n key[offset++] = salt[j];\n }\n for (let k = 0; k < passwordBuf.length && offset < 32; k++) {\n key[offset++] = passwordBuf[k];\n }\n return key;\n }\n\n // Counter buffer (8 bytes, little-endian)\n const counter = allocBuffer(8);\n\n // Create hash and iterate\n const hash = crypto.createHash('sha256');\n\n for (let round = 0; round < numRounds; round++) {\n // Write round counter as little-endian 64-bit\n counter[0] = round & 0xff;\n counter[1] = (round >>> 8) & 0xff;\n counter[2] = (round >>> 16) & 0xff;\n counter[3] = (round >>> 24) & 0xff;\n // Upper 32 bits - for large round counts\n const high = Math.floor(round / 0x100000000);\n counter[4] = high & 0xff;\n counter[5] = (high >>> 8) & 0xff;\n counter[6] = (high >>> 16) & 0xff;\n counter[7] = (high >>> 24) & 0xff;\n\n hash.update(salt);\n hash.update(passwordBuf);\n hash.update(counter);\n }\n\n return hash.digest() as Buffer;\n}\n\n/**\n * Decode AES-256-CBC encrypted data\n *\n * @param input - Encrypted data\n * @param properties - AES properties (numCyclesPower, salt, IV)\n * @param _unpackSize - Unused\n * @returns Decrypted data\n */\nexport function decodeAes(input: Buffer, properties?: Buffer, _unpackSize?: number): Buffer {\n if (!_password) {\n throw new Error('AES: password required but not set');\n }\n\n if (!properties) {\n throw new Error('AES: properties required');\n }\n\n const params = parseProperties(properties);\n const key = deriveKey(_password, params.salt, params.numCyclesPower);\n\n // Create AES-256-CBC decipher\n const decipher = crypto.createDecipheriv('aes-256-cbc', key, params.iv);\n decipher.setAutoPadding(false); // 7z doesn't use PKCS7 padding\n\n // Node 0.8 returns binary strings, newer Node returns Buffers\n // Use 'binary' encoding for compatibility\n // @ts-expect-error - 'binary' encoding is deprecated but required for Node 0.8 compatibility\n const decStr = decipher.update(input, 'binary', 'binary') + decipher.final('binary');\n const decrypted = bufferFrom(decStr, 'binary' as BufferEncoding);\n\n return decrypted;\n}\n\n/**\n * Create an AES decoder Transform stream\n */\nexport function createAesDecoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeAes, properties, unpackSize);\n}\n"],"names":["crypto","allocBuffer","bufferFrom","createBufferingDecoder","_password","setPassword","password","getPassword","parseProperties","properties","length","Error","b0","numCyclesPower","salt","iv","b1","saltSize","ivSize","expectedSize","slice","ivData","i","passwordToUtf16LE","buf","code","charCodeAt","deriveKey","passwordBuf","numRounds","key","offset","j","k","counter","hash","createHash","round","high","Math","floor","update","digest","decodeAes","input","_unpackSize","params","decipher","createDecipheriv","setAutoPadding","decStr","final","decrypted","createAesDecoder","unpackSize"],"mappings":"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"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Aes.ts"],"sourcesContent":["// 7z AES-256-CBC codec with SHA-256 key derivation\n// Implements password-based decryption for encrypted 7z archives\n//\n// Properties format:\n// Byte 0: bits 0-5 = NumCyclesPower (iterations = 2^NumCyclesPower)\n// bit 6 = IV present flag\n// bit 7 = Salt present flag\n// Byte 1: upper nibble = salt size extension\n// lower nibble = IV size extension\n// Following bytes: salt data, then IV data\n//\n// Key derivation:\n// For each round (2^NumCyclesPower times):\n// hash = SHA256(salt + password_utf16le + round_counter_8bytes)\n// Final key = first 32 bytes of accumulated hash\n\nimport crypto from 'crypto';\nimport { allocBuffer, bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n// Global password storage - set before decryption\nlet _password: string | null = null;\n\n/**\n * Set the password for AES decryption\n */\nexport function setPassword(password: string | null): void {\n _password = password;\n}\n\n/**\n * Get the current password\n */\nexport function getPassword(): string | null {\n return _password;\n}\n\n/**\n * Parse AES properties to extract key derivation parameters\n */\nfunction parseProperties(properties: Buffer): { numCyclesPower: number; salt: Buffer; iv: Buffer } {\n if (!properties || properties.length < 1) {\n throw new Error('AES: missing properties');\n }\n\n const b0 = properties[0];\n const numCyclesPower = b0 & 0x3f;\n\n // Check for special case: no salt/IV flags\n if ((b0 & 0xc0) === 0) {\n // No salt, no IV - use zeros\n return {\n numCyclesPower: numCyclesPower,\n salt: allocBuffer(0),\n iv: allocBuffer(16),\n };\n }\n\n if (properties.length < 2) {\n throw new Error('AES: properties too short');\n }\n\n const b1 = properties[1];\n\n // Calculate sizes\n // saltSize = ((b0 >> 7) & 1) + (b1 >> 4)\n // ivSize = ((b0 >> 6) & 1) + (b1 & 0x0F)\n const saltSize = ((b0 >>> 7) & 1) + (b1 >>> 4);\n const ivSize = ((b0 >>> 6) & 1) + (b1 & 0x0f);\n\n const expectedSize = 2 + saltSize + ivSize;\n if (properties.length < expectedSize) {\n throw new Error('AES: properties too short for salt/IV');\n }\n\n const salt = properties.slice(2, 2 + saltSize);\n const iv = allocBuffer(16);\n\n // Copy IV data (may be less than 16 bytes, rest is zeros)\n const ivData = properties.slice(2 + saltSize, 2 + saltSize + ivSize);\n for (let i = 0; i < ivData.length && i < 16; i++) {\n iv[i] = ivData[i];\n }\n\n return {\n numCyclesPower: numCyclesPower,\n salt: salt,\n iv: iv,\n };\n}\n\n/**\n * Convert password string to UTF-16LE buffer\n */\nfunction passwordToUtf16LE(password: string): Buffer {\n const buf = allocBuffer(password.length * 2);\n for (let i = 0; i < password.length; i++) {\n const code = password.charCodeAt(i);\n buf[i * 2] = code & 0xff;\n buf[i * 2 + 1] = (code >>> 8) & 0xff;\n }\n return buf;\n}\n\n/**\n * Derive AES-256 key from password using 7z's SHA-256 iteration scheme\n *\n * Algorithm:\n * For round = 0 to 2^numCyclesPower - 1:\n * hash.update(salt)\n * hash.update(password_utf16le)\n * hash.update(round as 8-byte little-endian)\n * key = hash.digest()\n */\nfunction deriveKey(password: string, salt: Buffer, numCyclesPower: number): Buffer {\n const passwordBuf = passwordToUtf16LE(password);\n const numRounds = 2 ** numCyclesPower;\n\n // For special case 0x3F, don't iterate\n if (numCyclesPower === 0x3f) {\n // Direct concatenation mode\n const key = allocBuffer(32);\n let offset = 0;\n for (let j = 0; j < salt.length && offset < 32; j++) {\n key[offset++] = salt[j];\n }\n for (let k = 0; k < passwordBuf.length && offset < 32; k++) {\n key[offset++] = passwordBuf[k];\n }\n return key;\n }\n\n // Counter buffer (8 bytes, little-endian)\n const counter = allocBuffer(8);\n\n // Create hash and iterate\n const hash = crypto.createHash('sha256');\n\n for (let round = 0; round < numRounds; round++) {\n // Write round counter as little-endian 64-bit\n counter[0] = round & 0xff;\n counter[1] = (round >>> 8) & 0xff;\n counter[2] = (round >>> 16) & 0xff;\n counter[3] = (round >>> 24) & 0xff;\n // Upper 32 bits - for large round counts\n const high = Math.floor(round / 0x100000000);\n counter[4] = high & 0xff;\n counter[5] = (high >>> 8) & 0xff;\n counter[6] = (high >>> 16) & 0xff;\n counter[7] = (high >>> 24) & 0xff;\n\n hash.update(salt);\n hash.update(passwordBuf);\n hash.update(counter);\n }\n\n return hash.digest() as Buffer;\n}\n\n/**\n * Decode AES-256-CBC encrypted data\n *\n * @param input - Encrypted data\n * @param properties - AES properties (numCyclesPower, salt, IV)\n * @param _unpackSize - Unused\n * @returns Decrypted data\n */\nexport function decodeAes(input: Buffer, properties?: Buffer, _unpackSize?: number): Buffer {\n if (!_password) {\n throw new Error('AES: password required but not set');\n }\n\n if (!properties) {\n throw new Error('AES: properties required');\n }\n\n const params = parseProperties(properties);\n const key = deriveKey(_password, params.salt, params.numCyclesPower);\n\n // Create AES-256-CBC decipher\n const decipher = crypto.createDecipheriv('aes-256-cbc', key, params.iv);\n decipher.setAutoPadding(false); // 7z doesn't use PKCS7 padding\n\n // Node 0.8 returns binary strings, newer Node returns Buffers\n // Use 'binary' encoding for compatibility\n // @ts-expect-error - 'binary' encoding is deprecated but required for Node 0.8 compatibility\n const decStr = decipher.update(input, 'binary', 'binary') + decipher.final('binary');\n const decrypted = bufferFrom(decStr, 'binary' as BufferEncoding);\n\n return decrypted;\n}\n\n/**\n * Create an AES decoder Transform stream\n */\nexport function createAesDecoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeAes, properties, unpackSize);\n}\n"],"names":["crypto","allocBuffer","bufferFrom","createBufferingDecoder","_password","setPassword","password","getPassword","parseProperties","properties","length","Error","b0","numCyclesPower","salt","iv","b1","saltSize","ivSize","expectedSize","slice","ivData","i","passwordToUtf16LE","buf","code","charCodeAt","deriveKey","passwordBuf","numRounds","key","offset","j","k","counter","hash","createHash","round","high","Math","floor","update","digest","decodeAes","input","_unpackSize","params","decipher","createDecipheriv","setAutoPadding","decStr","final","decrypted","createAesDecoder","unpackSize"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/Bcj2.ts"],"sourcesContent":["// BCJ2 (x86-64) filter codec - advanced branch/call/jump converter\n// BCJ2 uses 4 input streams and arithmetic (range) coding for better compression\n// Reference: LZMA SDK Bcj2.c\n//\n// Stream layout:\n// Stream 0: Main data (contains literals and branch opcode markers)\n// Stream 1: CALL addresses (for 0xE8 instructions)\n// Stream 2: JUMP addresses (for 0xE9 instructions)\n// Stream 3: Range coder data (probability decisions)\n\nimport { allocBuffer } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n// Range coder constants\nconst kTopValue = 1 << 24;\nconst kNumBitModelTotalBits = 11;\nconst kBitModelTotal = 1 << kNumBitModelTotalBits;\nconst kNumMoveBits = 5;\n\n// Number of probability models:\n// Index 0: conditional jumps (0x0F 0x80-0x8F)\n// Index 1: JMP (0xE9)\n// Indices 2-257: CALL (0xE8), indexed by previous byte\nconst kNumProbs = 258;\n\n/**\n * Range decoder state\n */\ninterface RangeDecoder {\n range: number;\n code: number;\n stream: Buffer;\n pos: number;\n}\n\n/**\n * Initialize range decoder\n */\nfunction initRangeDecoder(stream: Buffer): RangeDecoder {\n const rd: RangeDecoder = {\n range: 0xffffffff,\n code: 0,\n stream: stream,\n pos: 0,\n };\n\n // Initialize code from first 5 bytes\n for (let i = 0; i < 5; i++) {\n rd.code = (rd.code << 8) | (rd.pos < stream.length ? stream[rd.pos++] : 0);\n }\n\n return rd;\n}\n\n/**\n * Decode a single bit using probability model\n */\nfunction decodeBit(rd: RangeDecoder, prob: number[], probIndex: number): number {\n const ttt = prob[probIndex];\n const bound = (rd.range >>> kNumBitModelTotalBits) * ttt;\n\n let symbol: number;\n if (rd.code >>> 0 < bound >>> 0) {\n rd.range = bound;\n prob[probIndex] = (ttt + ((kBitModelTotal - ttt) >>> kNumMoveBits)) | 0;\n symbol = 0;\n } else {\n rd.range = (rd.range - bound) >>> 0;\n rd.code = (rd.code - bound) >>> 0;\n prob[probIndex] = (ttt - (ttt >>> kNumMoveBits)) | 0;\n symbol = 1;\n }\n\n // Normalize\n if (rd.range < kTopValue) {\n rd.range = (rd.range << 8) >>> 0;\n rd.code = ((rd.code << 8) | (rd.pos < rd.stream.length ? rd.stream[rd.pos++] : 0)) >>> 0;\n }\n\n return symbol;\n}\n\n/**\n * BCJ2 multi-stream decoder\n * Takes 4 pre-decompressed streams and combines them\n */\nexport function decodeBcj2Multi(streams: Buffer[], _properties?: Buffer, unpackSize?: number): Buffer {\n if (streams.length !== 4) {\n throw new Error(`BCJ2 requires 4 input streams, got ${streams.length}`);\n }\n\n // Stream assignment (based on 7z bind pair convention):\n // streams[0] = main data (after LZMA2)\n // streams[1] = call stream (after LZMA)\n // streams[2] = jump stream (after LZMA)\n // streams[3] = range coder stream (uncompressed)\n const mainStream = streams[0];\n const callStream = streams[1];\n const jumpStream = streams[2];\n const rcStream = streams[3];\n\n // Output buffer\n const outSize = unpackSize || mainStream.length + callStream.length + jumpStream.length;\n const output = allocBuffer(outSize);\n let outPos = 0;\n\n // Stream positions\n let mainPos = 0;\n let callPos = 0;\n let jumpPos = 0;\n\n // Initialize range decoder\n const rd = initRangeDecoder(rcStream);\n\n // Initialize probability models\n const probs: number[] = [];\n for (let i = 0; i < kNumProbs; i++) {\n probs.push(kBitModelTotal >>> 1);\n }\n\n // Track previous byte for probability context\n let prevByte = 0;\n\n // Instruction pointer for address conversion\n let ip = 0;\n\n while (outPos < outSize && mainPos < mainStream.length) {\n const b = mainStream[mainPos++];\n\n // Check for branch opcodes\n if (b === 0xe8 || b === 0xe9) {\n // CALL (0xE8) or JMP (0xE9)\n // Use range decoder to check if this should be processed\n // Probability index: E8 uses 2 + prevByte, E9 uses 1\n const probIndex = b === 0xe8 ? 2 + prevByte : 1;\n const isMatch = decodeBit(rd, probs, probIndex);\n\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n\n if (isMatch) {\n // Read 4-byte address from appropriate stream\n const addrStream = b === 0xe8 ? callStream : jumpStream;\n const addrPos = b === 0xe8 ? callPos : jumpPos;\n\n if (addrPos + 4 > addrStream.length) {\n // Not enough data, copy remaining\n break;\n }\n\n // Check if we have room for 4 address bytes\n if (outPos + 4 > outSize) break;\n\n // Read as big-endian (BCJ2 stores addresses big-endian)\n let addr = (addrStream[addrPos] << 24) | (addrStream[addrPos + 1] << 16) | (addrStream[addrPos + 2] << 8) | addrStream[addrPos + 3];\n\n if (b === 0xe8) {\n callPos += 4;\n } else {\n jumpPos += 4;\n }\n\n // Convert absolute to relative address\n addr = (addr - (ip + 4)) | 0;\n\n // Write as little-endian\n output[outPos++] = addr & 0xff;\n output[outPos++] = (addr >>> 8) & 0xff;\n output[outPos++] = (addr >>> 16) & 0xff;\n output[outPos++] = (addr >>> 24) & 0xff;\n ip += 4;\n\n prevByte = (addr >>> 24) & 0xff;\n } else {\n prevByte = b;\n }\n } else if (b === 0x0f && mainPos < mainStream.length) {\n // Potential conditional jump (0x0F 0x8x)\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n\n const b2 = mainStream[mainPos];\n if ((b2 & 0xf0) === 0x80) {\n // Conditional jump\n mainPos++;\n // Probability index 0 for conditional jumps (since b2 != 0xE8 and b2 != 0xE9)\n const probIndex2 = 0;\n const isMatch2 = decodeBit(rd, probs, probIndex2);\n\n if (outPos >= outSize) break;\n output[outPos++] = b2;\n ip++;\n\n if (isMatch2) {\n // Read 4-byte address from jump stream\n if (jumpPos + 4 > jumpStream.length) {\n break;\n }\n\n // Check if we have room for 4 address bytes\n if (outPos + 4 > outSize) break;\n\n let addr2 = (jumpStream[jumpPos] << 24) | (jumpStream[jumpPos + 1] << 16) | (jumpStream[jumpPos + 2] << 8) | jumpStream[jumpPos + 3];\n jumpPos += 4;\n\n // Convert absolute to relative\n addr2 = (addr2 - (ip + 4)) | 0;\n\n // Write as little-endian\n output[outPos++] = addr2 & 0xff;\n output[outPos++] = (addr2 >>> 8) & 0xff;\n output[outPos++] = (addr2 >>> 16) & 0xff;\n output[outPos++] = (addr2 >>> 24) & 0xff;\n ip += 4;\n\n prevByte = (addr2 >>> 24) & 0xff;\n } else {\n prevByte = b2;\n }\n } else {\n prevByte = b;\n }\n } else {\n // Regular byte\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n prevByte = b;\n }\n }\n\n // Return only the used portion\n return outPos < output.length ? output.slice(0, outPos) : output;\n}\n\n/**\n * Single-buffer decode (for API compatibility)\n * Note: BCJ2 requires multi-stream, this throws\n */\nexport function decodeBcj2(_input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n throw new Error('BCJ2 requires multi-stream decoding - use decodeBcj2Multi');\n}\n\n/**\n * Create a BCJ2 decoder Transform stream\n * Note: BCJ2 requires multi-stream, this is for API compatibility\n */\nexport function createBcj2Decoder(_properties?: Buffer, _unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcj2, _properties, _unpackSize);\n}\n"],"names":["allocBuffer","createBufferingDecoder","kTopValue","kNumBitModelTotalBits","kBitModelTotal","kNumMoveBits","kNumProbs","initRangeDecoder","stream","rd","range","code","pos","i","length","decodeBit","prob","probIndex","ttt","bound","symbol","decodeBcj2Multi","streams","_properties","unpackSize","Error","mainStream","callStream","jumpStream","rcStream","outSize","output","outPos","mainPos","callPos","jumpPos","probs","push","prevByte","ip","b","isMatch","addrStream","addrPos","addr","b2","probIndex2","isMatch2","addr2","slice","decodeBcj2","_input","_unpackSize","createBcj2Decoder"],"mappings":"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"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Bcj2.ts"],"sourcesContent":["// BCJ2 (x86-64) filter codec - advanced branch/call/jump converter\n// BCJ2 uses 4 input streams and arithmetic (range) coding for better compression\n// Reference: LZMA SDK Bcj2.c\n//\n// Stream layout:\n// Stream 0: Main data (contains literals and branch opcode markers)\n// Stream 1: CALL addresses (for 0xE8 instructions)\n// Stream 2: JUMP addresses (for 0xE9 instructions)\n// Stream 3: Range coder data (probability decisions)\n\nimport { allocBuffer } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n// Range coder constants\nconst kTopValue = 1 << 24;\nconst kNumBitModelTotalBits = 11;\nconst kBitModelTotal = 1 << kNumBitModelTotalBits;\nconst kNumMoveBits = 5;\n\n// Number of probability models:\n// Index 0: conditional jumps (0x0F 0x80-0x8F)\n// Index 1: JMP (0xE9)\n// Indices 2-257: CALL (0xE8), indexed by previous byte\nconst kNumProbs = 258;\n\n/**\n * Range decoder state\n */\ninterface RangeDecoder {\n range: number;\n code: number;\n stream: Buffer;\n pos: number;\n}\n\n/**\n * Initialize range decoder\n */\nfunction initRangeDecoder(stream: Buffer): RangeDecoder {\n const rd: RangeDecoder = {\n range: 0xffffffff,\n code: 0,\n stream: stream,\n pos: 0,\n };\n\n // Initialize code from first 5 bytes\n for (let i = 0; i < 5; i++) {\n rd.code = (rd.code << 8) | (rd.pos < stream.length ? stream[rd.pos++] : 0);\n }\n\n return rd;\n}\n\n/**\n * Decode a single bit using probability model\n */\nfunction decodeBit(rd: RangeDecoder, prob: number[], probIndex: number): number {\n const ttt = prob[probIndex];\n const bound = (rd.range >>> kNumBitModelTotalBits) * ttt;\n\n let symbol: number;\n if (rd.code >>> 0 < bound >>> 0) {\n rd.range = bound;\n prob[probIndex] = (ttt + ((kBitModelTotal - ttt) >>> kNumMoveBits)) | 0;\n symbol = 0;\n } else {\n rd.range = (rd.range - bound) >>> 0;\n rd.code = (rd.code - bound) >>> 0;\n prob[probIndex] = (ttt - (ttt >>> kNumMoveBits)) | 0;\n symbol = 1;\n }\n\n // Normalize\n if (rd.range < kTopValue) {\n rd.range = (rd.range << 8) >>> 0;\n rd.code = ((rd.code << 8) | (rd.pos < rd.stream.length ? rd.stream[rd.pos++] : 0)) >>> 0;\n }\n\n return symbol;\n}\n\n/**\n * BCJ2 multi-stream decoder\n * Takes 4 pre-decompressed streams and combines them\n */\nexport function decodeBcj2Multi(streams: Buffer[], _properties?: Buffer, unpackSize?: number): Buffer {\n if (streams.length !== 4) {\n throw new Error(`BCJ2 requires 4 input streams, got ${streams.length}`);\n }\n\n // Stream assignment (based on 7z bind pair convention):\n // streams[0] = main data (after LZMA2)\n // streams[1] = call stream (after LZMA)\n // streams[2] = jump stream (after LZMA)\n // streams[3] = range coder stream (uncompressed)\n const mainStream = streams[0];\n const callStream = streams[1];\n const jumpStream = streams[2];\n const rcStream = streams[3];\n\n // Output buffer\n const outSize = unpackSize || mainStream.length + callStream.length + jumpStream.length;\n const output = allocBuffer(outSize);\n let outPos = 0;\n\n // Stream positions\n let mainPos = 0;\n let callPos = 0;\n let jumpPos = 0;\n\n // Initialize range decoder\n const rd = initRangeDecoder(rcStream);\n\n // Initialize probability models\n const probs: number[] = [];\n for (let i = 0; i < kNumProbs; i++) {\n probs.push(kBitModelTotal >>> 1);\n }\n\n // Track previous byte for probability context\n let prevByte = 0;\n\n // Instruction pointer for address conversion\n let ip = 0;\n\n while (outPos < outSize && mainPos < mainStream.length) {\n const b = mainStream[mainPos++];\n\n // Check for branch opcodes\n if (b === 0xe8 || b === 0xe9) {\n // CALL (0xE8) or JMP (0xE9)\n // Use range decoder to check if this should be processed\n // Probability index: E8 uses 2 + prevByte, E9 uses 1\n const probIndex = b === 0xe8 ? 2 + prevByte : 1;\n const isMatch = decodeBit(rd, probs, probIndex);\n\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n\n if (isMatch) {\n // Read 4-byte address from appropriate stream\n const addrStream = b === 0xe8 ? callStream : jumpStream;\n const addrPos = b === 0xe8 ? callPos : jumpPos;\n\n if (addrPos + 4 > addrStream.length) {\n // Not enough data, copy remaining\n break;\n }\n\n // Check if we have room for 4 address bytes\n if (outPos + 4 > outSize) break;\n\n // Read as big-endian (BCJ2 stores addresses big-endian)\n let addr = (addrStream[addrPos] << 24) | (addrStream[addrPos + 1] << 16) | (addrStream[addrPos + 2] << 8) | addrStream[addrPos + 3];\n\n if (b === 0xe8) {\n callPos += 4;\n } else {\n jumpPos += 4;\n }\n\n // Convert absolute to relative address\n addr = (addr - (ip + 4)) | 0;\n\n // Write as little-endian\n output[outPos++] = addr & 0xff;\n output[outPos++] = (addr >>> 8) & 0xff;\n output[outPos++] = (addr >>> 16) & 0xff;\n output[outPos++] = (addr >>> 24) & 0xff;\n ip += 4;\n\n prevByte = (addr >>> 24) & 0xff;\n } else {\n prevByte = b;\n }\n } else if (b === 0x0f && mainPos < mainStream.length) {\n // Potential conditional jump (0x0F 0x8x)\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n\n const b2 = mainStream[mainPos];\n if ((b2 & 0xf0) === 0x80) {\n // Conditional jump\n mainPos++;\n // Probability index 0 for conditional jumps (since b2 != 0xE8 and b2 != 0xE9)\n const probIndex2 = 0;\n const isMatch2 = decodeBit(rd, probs, probIndex2);\n\n if (outPos >= outSize) break;\n output[outPos++] = b2;\n ip++;\n\n if (isMatch2) {\n // Read 4-byte address from jump stream\n if (jumpPos + 4 > jumpStream.length) {\n break;\n }\n\n // Check if we have room for 4 address bytes\n if (outPos + 4 > outSize) break;\n\n let addr2 = (jumpStream[jumpPos] << 24) | (jumpStream[jumpPos + 1] << 16) | (jumpStream[jumpPos + 2] << 8) | jumpStream[jumpPos + 3];\n jumpPos += 4;\n\n // Convert absolute to relative\n addr2 = (addr2 - (ip + 4)) | 0;\n\n // Write as little-endian\n output[outPos++] = addr2 & 0xff;\n output[outPos++] = (addr2 >>> 8) & 0xff;\n output[outPos++] = (addr2 >>> 16) & 0xff;\n output[outPos++] = (addr2 >>> 24) & 0xff;\n ip += 4;\n\n prevByte = (addr2 >>> 24) & 0xff;\n } else {\n prevByte = b2;\n }\n } else {\n prevByte = b;\n }\n } else {\n // Regular byte\n if (outPos >= outSize) break;\n output[outPos++] = b;\n ip++;\n prevByte = b;\n }\n }\n\n // Return only the used portion\n return outPos < output.length ? output.slice(0, outPos) : output;\n}\n\n/**\n * Single-buffer decode (for API compatibility)\n * Note: BCJ2 requires multi-stream, this throws\n */\nexport function decodeBcj2(_input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n throw new Error('BCJ2 requires multi-stream decoding - use decodeBcj2Multi');\n}\n\n/**\n * Create a BCJ2 decoder Transform stream\n * Note: BCJ2 requires multi-stream, this is for API compatibility\n */\nexport function createBcj2Decoder(_properties?: Buffer, _unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcj2, _properties, _unpackSize);\n}\n"],"names":["allocBuffer","createBufferingDecoder","kTopValue","kNumBitModelTotalBits","kBitModelTotal","kNumMoveBits","kNumProbs","initRangeDecoder","stream","rd","range","code","pos","i","length","decodeBit","prob","probIndex","ttt","bound","symbol","decodeBcj2Multi","streams","_properties","unpackSize","Error","mainStream","callStream","jumpStream","rcStream","outSize","output","outPos","mainPos","callPos","jumpPos","probs","push","prevByte","ip","b","isMatch","addrStream","addrPos","addr","b2","probIndex2","isMatch2","addr2","slice","decodeBcj2","_input","_unpackSize","createBcj2Decoder"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/BZip2.ts"],"sourcesContent":["// BZip2 codec - bzip2 compression\n// 7z stores bzip2 data with the standard BZh header\n//\n// Uses unbzip2-stream's internal bzip2 library for both sync and streaming decompression\n\nimport { bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport unbzip2Stream from 'unbzip2-stream';\n\n// Access the internal bzip2 decoder from unbzip2-stream\nimport bzip2 from 'unbzip2-stream/lib/bzip2.js';\n\n/**\n * Decode BZip2 compressed data synchronously\n *\n * @param input - BZip2 compressed data (with BZh header)\n * @param _properties - Unused for BZip2\n * @param _unpackSize - Unused\n * @returns Decompressed data\n */\nexport function decodeBzip2(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n const chunks: number[] = [];\n // Pass buffer directly - simple() calls array() internally\n bzip2.simple(input, (byte: number) => {\n chunks.push(byte);\n });\n return bufferFrom(chunks);\n}\n\n/**\n * Create a BZip2 decoder Transform stream\n * Uses unbzip2-stream for true streaming decompression (block by block)\n */\nexport function createBzip2Decoder(_properties?: Buffer, _unpackSize?: number): Transform {\n return unbzip2Stream() as Transform;\n}\n"],"names":["bufferFrom","unbzip2Stream","bzip2","decodeBzip2","input","_properties","_unpackSize","chunks","simple","byte","push","createBzip2Decoder"],"mappings":"AAAA,kCAAkC;AAClC,oDAAoD;AACpD,EAAE;AACF,yFAAyF;AAEzF,SAASA,UAAU,QAAQ,wBAAwB;AAEnD,OAAOC,mBAAmB,iBAAiB;AAE3C,wDAAwD;AACxD,OAAOC,WAAW,8BAA8B;AAEhD;;;;;;;CAOC,GACD,OAAO,SAASC,YAAYC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACnF,MAAMC,SAAmB,EAAE;IAC3B,2DAA2D;IAC3DL,MAAMM,MAAM,CAACJ,OAAO,CAACK;QACnBF,OAAOG,IAAI,CAACD;IACd;IACA,OAAOT,WAAWO;AACpB;AAEA;;;CAGC,GACD,OAAO,SAASI,mBAAmBN,WAAoB,EAAEC,WAAoB;IAC3E,OAAOL;AACT"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/BZip2.ts"],"sourcesContent":["// BZip2 codec - bzip2 compression\n// 7z stores bzip2 data with the standard BZh header\n//\n// Uses unbzip2-stream's internal bzip2 library for both sync and streaming decompression\n\nimport { bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport unbzip2Stream from 'unbzip2-stream';\n\n// Access the internal bzip2 decoder from unbzip2-stream\nimport bzip2 from 'unbzip2-stream/lib/bzip2.js';\n\n/**\n * Decode BZip2 compressed data synchronously\n *\n * @param input - BZip2 compressed data (with BZh header)\n * @param _properties - Unused for BZip2\n * @param _unpackSize - Unused\n * @returns Decompressed data\n */\nexport function decodeBzip2(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n const chunks: number[] = [];\n // Pass buffer directly - simple() calls array() internally\n bzip2.simple(input, (byte: number) => {\n chunks.push(byte);\n });\n return bufferFrom(chunks);\n}\n\n/**\n * Create a BZip2 decoder Transform stream\n * Uses unbzip2-stream for true streaming decompression (block by block)\n */\nexport function createBzip2Decoder(_properties?: Buffer, _unpackSize?: number): Transform {\n return unbzip2Stream() as Transform;\n}\n"],"names":["bufferFrom","unbzip2Stream","bzip2","decodeBzip2","input","_properties","_unpackSize","chunks","simple","byte","push","createBzip2Decoder"],"mappings":"AAAA,kCAAkC;AAClC,oDAAoD;AACpD,EAAE;AACF,yFAAyF;AAEzF,SAASA,UAAU,QAAQ,wBAAwB;AAEnD,OAAOC,mBAAmB,iBAAiB;AAE3C,wDAAwD;AACxD,OAAOC,WAAW,8BAA8B;AAEhD;;;;;;;CAOC,GACD,OAAO,SAASC,YAAYC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACnF,MAAMC,SAAmB,EAAE;IAC3B,2DAA2D;IAC3DL,MAAMM,MAAM,CAACJ,OAAO,CAACK;QACnBF,OAAOG,IAAI,CAACD;IACd;IACA,OAAOT,WAAWO;AACpB;AAEA;;;CAGC,GACD,OAAO,SAASI,mBAAmBN,WAAoB,EAAEC,WAAoB;IAC3E,OAAOL;AACT"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/Copy.ts"],"sourcesContent":["// Copy codec - passthrough (no compression)\n// This is the simplest codec, just passes data through unchanged\n\nimport { PassThrough, type Transform } from 'extract-base-iterator';\n\n/**\n * Create a Copy decoder stream\n * Simply passes through data unchanged\n */\nexport function createCopyDecoder(): InstanceType<typeof Transform> {\n return new PassThrough();\n}\n\n/**\n * Decode a buffer using Copy codec (no-op)\n * @param input - Input buffer\n * @param _properties - Unused\n * @param _unpackSize - Unused\n * @returns Same buffer (no transformation)\n */\nexport function decodeCopy(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n return input;\n}\n"],"names":["PassThrough","createCopyDecoder","decodeCopy","input","_properties","_unpackSize"],"mappings":"AAAA,4CAA4C;AAC5C,iEAAiE;AAEjE,SAASA,WAAW,QAAwB,wBAAwB;AAEpE;;;CAGC,GACD,OAAO,SAASC;IACd,OAAO,IAAID;AACb;AAEA;;;;;;CAMC,GACD,OAAO,SAASE,WAAWC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IAClF,OAAOF;AACT"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Copy.ts"],"sourcesContent":["// Copy codec - passthrough (no compression)\n// This is the simplest codec, just passes data through unchanged\n\nimport { PassThrough, type Transform } from 'extract-base-iterator';\n\n/**\n * Create a Copy decoder stream\n * Simply passes through data unchanged\n */\nexport function createCopyDecoder(): InstanceType<typeof Transform> {\n return new PassThrough();\n}\n\n/**\n * Decode a buffer using Copy codec (no-op)\n * @param input - Input buffer\n * @param _properties - Unused\n * @param _unpackSize - Unused\n * @returns Same buffer (no transformation)\n */\nexport function decodeCopy(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n return input;\n}\n"],"names":["PassThrough","createCopyDecoder","decodeCopy","input","_properties","_unpackSize"],"mappings":"AAAA,4CAA4C;AAC5C,iEAAiE;AAEjE,SAASA,WAAW,QAAwB,wBAAwB;AAEpE;;;CAGC,GACD,OAAO,SAASC;IACd,OAAO,IAAID;AACb;AAEA;;;;;;CAMC,GACD,OAAO,SAASE,WAAWC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IAClF,OAAOF;AACT"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/createBufferingDecoder.ts"],"sourcesContent":["// Helper to create a Transform stream that buffers all input before decoding\n// Used by codecs that need the full input before decompression (LZMA, LZMA2, BZip2, etc.)\n\nimport { Transform } from 'extract-base-iterator';\nimport type { DecodeCallback } from 'xz-compat';\n\ntype TransformCallback = (error?: Error | null, data?: Buffer) => void;\n\nexport type DecodeFn = (input: Buffer, properties?: Buffer, unpackSize?: number, callback?: DecodeCallback<Buffer>) => Buffer | Promise<Buffer> | void;\n\n/**\n * Create a Transform stream that buffers all input, then decodes in flush\n * This is the common pattern for codecs that can't stream (need full input)\n */\nexport default function createBufferingDecoder(decodeFn: DecodeFn, properties?: Buffer, unpackSize?: number): InstanceType<typeof Transform> {\n const chunks: Buffer[] = [];\n\n return new Transform({\n transform: (chunk: Buffer, _encoding: string, callback: TransformCallback) => {\n chunks.push(chunk);\n callback();\n },\n flush: function (callback: TransformCallback) {\n const input = Buffer.concat(chunks);\n const finish = (err?: Error | null, output?: Buffer) => {\n if (err) {\n callback(err);\n return;\n }\n if (output) {\n this.push(output);\n }\n callback();\n };\n\n try {\n const maybeResult = decodeFn(input, properties, unpackSize, finish);\n if (maybeResult && typeof (maybeResult as Promise<Buffer>).then === 'function') {\n (maybeResult as Promise<Buffer>).then(\n (value) => finish(null, value),\n (err) => finish(err as Error)\n );\n return;\n }\n if (Buffer.isBuffer(maybeResult)) {\n finish(null, maybeResult);\n }\n } catch (err) {\n callback(err as Error);\n }\n },\n });\n}\n"],"names":["Transform","createBufferingDecoder","decodeFn","properties","unpackSize","chunks","transform","chunk","_encoding","callback","push","flush","input","Buffer","concat","finish","err","output","maybeResult","then","value","isBuffer"],"mappings":"AAAA,6EAA6E;AAC7E,0FAA0F;AAE1F,SAASA,SAAS,QAAQ,wBAAwB;AAOlD;;;CAGC,GACD,eAAe,SAASC,uBAAuBC,QAAkB,EAAEC,UAAmB,EAAEC,UAAmB;IACzG,MAAMC,SAAmB,EAAE;IAE3B,OAAO,IAAIL,UAAU;QACnBM,WAAW,CAACC,OAAeC,WAAmBC;YAC5CJ,OAAOK,IAAI,CAACH;YACZE;QACF;QACAE,OAAO,SAAUF,QAA2B;YAC1C,MAAMG,QAAQC,OAAOC,MAAM,CAACT;YAC5B,MAAMU,SAAS,CAACC,KAAoBC;gBAClC,IAAID,KAAK;oBACPP,SAASO;oBACT;gBACF;gBACA,IAAIC,QAAQ;oBACV,IAAI,CAACP,IAAI,CAACO;gBACZ;gBACAR;YACF;YAEA,IAAI;gBACF,MAAMS,cAAchB,SAASU,OAAOT,YAAYC,YAAYW;gBAC5D,IAAIG,eAAe,OAAO,AAACA,YAAgCC,IAAI,KAAK,YAAY;oBAC7ED,YAAgCC,IAAI,CACnC,CAACC,QAAUL,OAAO,MAAMK,QACxB,CAACJ,MAAQD,OAAOC;oBAElB;gBACF;gBACA,IAAIH,OAAOQ,QAAQ,CAACH,cAAc;oBAChCH,OAAO,MAAMG;gBACf;YACF,EAAE,OAAOF,KAAK;gBACZP,SAASO;YACX;QACF;IACF;AACF"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/createBufferingDecoder.ts"],"sourcesContent":["// Helper to create a Transform stream that buffers all input before decoding\n// Used by codecs that need the full input before decompression (LZMA, LZMA2, BZip2, etc.)\n\nimport { Transform } from 'extract-base-iterator';\nimport type { DecodeCallback } from 'xz-compat';\n\ntype TransformCallback = (error?: Error | null, data?: Buffer) => void;\n\nexport type DecodeFn = (input: Buffer, properties?: Buffer, unpackSize?: number, callback?: DecodeCallback<Buffer>) => Buffer | Promise<Buffer> | void;\n\n/**\n * Create a Transform stream that buffers all input, then decodes in flush\n * This is the common pattern for codecs that can't stream (need full input)\n */\nexport default function createBufferingDecoder(decodeFn: DecodeFn, properties?: Buffer, unpackSize?: number): InstanceType<typeof Transform> {\n const chunks: Buffer[] = [];\n\n return new Transform({\n transform: (chunk: Buffer, _encoding: string, callback: TransformCallback) => {\n chunks.push(chunk);\n callback();\n },\n flush: function (callback: TransformCallback) {\n const input = Buffer.concat(chunks);\n const finish = (err?: Error | null, output?: Buffer) => {\n if (err) {\n callback(err);\n return;\n }\n if (output) {\n this.push(output);\n }\n callback();\n };\n\n try {\n const maybeResult = decodeFn(input, properties, unpackSize, finish);\n if (maybeResult && typeof (maybeResult as Promise<Buffer>).then === 'function') {\n (maybeResult as Promise<Buffer>).then(\n (value) => finish(null, value),\n (err) => finish(err as Error)\n );\n return;\n }\n if (Buffer.isBuffer(maybeResult)) {\n finish(null, maybeResult);\n }\n } catch (err) {\n callback(err as Error);\n }\n },\n });\n}\n"],"names":["Transform","createBufferingDecoder","decodeFn","properties","unpackSize","chunks","transform","chunk","_encoding","callback","push","flush","input","Buffer","concat","finish","err","output","maybeResult","then","value","isBuffer"],"mappings":"AAAA,6EAA6E;AAC7E,0FAA0F;AAE1F,SAASA,SAAS,QAAQ,wBAAwB;AAOlD;;;CAGC,GACD,eAAe,SAASC,uBAAuBC,QAAkB,EAAEC,UAAmB,EAAEC,UAAmB;IACzG,MAAMC,SAAmB,EAAE;IAE3B,OAAO,IAAIL,UAAU;QACnBM,WAAW,CAACC,OAAeC,WAAmBC;YAC5CJ,OAAOK,IAAI,CAACH;YACZE;QACF;QACAE,OAAO,SAAUF,QAA2B;YAC1C,MAAMG,QAAQC,OAAOC,MAAM,CAACT;YAC5B,MAAMU,SAAS,CAACC,KAAoBC;gBAClC,IAAID,KAAK;oBACPP,SAASO;oBACT;gBACF;gBACA,IAAIC,QAAQ;oBACV,IAAI,CAACP,IAAI,CAACO;gBACZ;gBACAR;YACF;YAEA,IAAI;gBACF,MAAMS,cAAchB,SAASU,OAAOT,YAAYC,YAAYW;gBAC5D,IAAIG,eAAe,OAAO,AAACA,YAAgCC,IAAI,KAAK,YAAY;oBAC7ED,YAAgCC,IAAI,CACnC,CAACC,QAAUL,OAAO,MAAMK,QACxB,CAACJ,MAAQD,OAAOC;oBAElB;gBACF;gBACA,IAAIH,OAAOQ,QAAQ,CAACH,cAAc;oBAChCH,OAAO,MAAMG;gBACf;YACF,EAAE,OAAOF,KAAK;gBACZP,SAASO;YACX;QACF;IACF;AACF"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/Deflate.ts"],"sourcesContent":["// Deflate codec - standard zlib/zip compression\n// 7z uses raw deflate without zlib or gzip headers\n//\n// Uses native zlib.createInflateRaw() for true streaming decompression\n// Falls back to pako for older Node versions via extract-base-iterator\n\nimport { createInflateRawStream, inflateRaw } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\n\n/**\n * Decode Deflate compressed data synchronously\n *\n * @param input - Deflate compressed data\n * @param _properties - Unused for Deflate\n * @param _unpackSize - Unused for Deflate\n * @returns Decompressed data\n */\nexport function decodeDeflate(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n return inflateRaw(input);\n}\n\n/**\n * Create a Deflate decoder Transform stream.\n * Uses zlib's streaming createInflateRaw() for true streaming decompression.\n * Data is decompressed incrementally as it flows through, not buffered.\n */\nexport function createDeflateDecoder(_properties?: Buffer, _unpackSize?: number): Transform {\n return createInflateRawStream() as Transform;\n}\n"],"names":["createInflateRawStream","inflateRaw","decodeDeflate","input","_properties","_unpackSize","createDeflateDecoder"],"mappings":"AAAA,gDAAgD;AAChD,mDAAmD;AACnD,EAAE;AACF,uEAAuE;AACvE,uEAAuE;AAEvE,SAASA,sBAAsB,EAAEC,UAAU,QAAQ,wBAAwB;AAG3E;;;;;;;CAOC,GACD,OAAO,SAASC,cAAcC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACrF,OAAOJ,WAAWE;AACpB;AAEA;;;;CAIC,GACD,OAAO,SAASG,qBAAqBF,WAAoB,EAAEC,WAAoB;IAC7E,OAAOL;AACT"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Deflate.ts"],"sourcesContent":["// Deflate codec - standard zlib/zip compression\n// 7z uses raw deflate without zlib or gzip headers\n//\n// Uses native zlib.createInflateRaw() for true streaming decompression\n// Falls back to pako for older Node versions via extract-base-iterator\n\nimport { createInflateRawStream, inflateRaw } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\n\n/**\n * Decode Deflate compressed data synchronously\n *\n * @param input - Deflate compressed data\n * @param _properties - Unused for Deflate\n * @param _unpackSize - Unused for Deflate\n * @returns Decompressed data\n */\nexport function decodeDeflate(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n return inflateRaw(input);\n}\n\n/**\n * Create a Deflate decoder Transform stream.\n * Uses zlib's streaming createInflateRaw() for true streaming decompression.\n * Data is decompressed incrementally as it flows through, not buffered.\n */\nexport function createDeflateDecoder(_properties?: Buffer, _unpackSize?: number): Transform {\n return createInflateRawStream() as Transform;\n}\n"],"names":["createInflateRawStream","inflateRaw","decodeDeflate","input","_properties","_unpackSize","createDeflateDecoder"],"mappings":"AAAA,gDAAgD;AAChD,mDAAmD;AACnD,EAAE;AACF,uEAAuE;AACvE,uEAAuE;AAEvE,SAASA,sBAAsB,EAAEC,UAAU,QAAQ,wBAAwB;AAG3E;;;;;;;CAOC,GACD,OAAO,SAASC,cAAcC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACrF,OAAOJ,WAAWE;AACpB;AAEA;;;;CAIC,GACD,OAAO,SAASG,qBAAqBF,WAAoB,EAAEC,WAAoB;IAC7E,OAAOL;AACT"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/index.ts"],"sourcesContent":["// Codec registry for 7z decompression\n// Each codec provides a decode function and optionally a streaming decoder\n\nimport type { BufferLike } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport {\n createLzma2Decoder as _createLzma2Decoder,\n createLzmaDecoder as _createLzmaDecoder,\n type DecodeCallback as CodecDecodeCallback,\n createBcjArm64Decoder,\n createBcjArmDecoder,\n createBcjArmtDecoder,\n createBcjDecoder,\n createBcjIa64Decoder,\n createBcjPpcDecoder,\n createBcjSparcDecoder,\n createDeltaDecoder,\n decode7zLzma,\n decode7zLzma2,\n decodeBcj,\n decodeBcjArm,\n decodeBcjArm64,\n decodeBcjArmt,\n decodeBcjIa64,\n decodeBcjPpc,\n decodeBcjSparc,\n decodeDelta,\n} from 'xz-compat';\nimport { CodecId, createCodedError, ErrorCode } from '../constants.ts';\nimport { createAesDecoder, decodeAes, getPassword, setPassword } from './Aes.ts';\nimport { createBcj2Decoder, decodeBcj2, decodeBcj2Multi } from './Bcj2.ts';\nimport { createBzip2Decoder, decodeBzip2 } from './BZip2.ts';\nimport { createCopyDecoder, decodeCopy } from './Copy.ts';\nimport { createDeflateDecoder, decodeDeflate } from './Deflate.ts';\n\n// Re-export password functions for API access\nexport { getPassword, setPassword };\n\nconst schedule = typeof setImmediate === 'function' ? setImmediate : (fn: () => void) => process.nextTick(fn);\n\nfunction wrapSyncDecode(fn: (input: Buffer, properties?: Buffer, unpackSize?: number) => Buffer): Codec['decode'] {\n return (input, properties, unpackSize, callback) => {\n schedule(() => {\n try {\n // Convert BufferList to Buffer if needed\n const buf = Buffer.isBuffer(input) ? input : input.toBuffer();\n callback(null, fn(buf, properties, unpackSize));\n } catch (err) {\n callback(err as Error);\n }\n });\n };\n}\n\nexport interface Codec {\n decode: (input: BufferLike, properties: Buffer | undefined, unpackSize: number | undefined, callback: CodecDecodeCallback<Buffer>) => void;\n createDecoder: (properties?: Buffer, unpackSize?: number) => Transform;\n}\n\n// Simple wrappers with validation that use xz-compat's optimized decode7zLzma/decode7zLzma2\nfunction decodeLzma(input: BufferLike, properties: Buffer, unpackSize: number, callback: CodecDecodeCallback<Buffer>): void {\n if (properties.length < 5) {\n throw new Error('LZMA requires 5-byte properties');\n }\n // Convert BufferList to Buffer if needed\n const buf = Buffer.isBuffer(input) ? input : input.toBuffer();\n decode7zLzma(buf, properties, unpackSize, callback);\n}\n\nfunction createLzmaDecoder(properties?: Buffer, unpackSize?: number): Transform {\n if (!properties || properties.length < 5) {\n throw new Error('LZMA requires 5-byte properties');\n }\n if (typeof unpackSize !== 'number' || unpackSize < 0) {\n throw new Error('LZMA requires known unpack size');\n }\n return _createLzmaDecoder(properties, unpackSize) as Transform;\n}\n\nfunction decodeLzma2(input: BufferLike, properties: Buffer, unpackSize: number | undefined, callback: CodecDecodeCallback<Buffer>): void {\n if (properties.length < 1) {\n throw new Error('LZMA2 requires properties byte');\n }\n // Convert BufferList to Buffer if needed\n const buf = Buffer.isBuffer(input) ? input : input.toBuffer();\n decode7zLzma2(buf, properties, unpackSize, callback);\n}\n\nfunction createLzma2Decoder(properties?: Buffer, _unpackSize?: number): Transform {\n if (!properties || properties.length < 1) {\n throw new Error('LZMA2 requires properties byte');\n }\n return _createLzma2Decoder(properties) as Transform;\n}\n\n// Registry of supported codecs\nconst codecs: { [key: string]: Codec } = {};\n\n/**\n * Convert codec ID bytes to a string key\n */\nfunction codecIdToKey(id: number[]): string {\n const parts: string[] = [];\n for (let i = 0; i < id.length; i++) {\n parts.push(id[i].toString(16).toUpperCase());\n }\n return parts.join('-');\n}\n\n/**\n * Check if two codec IDs match\n */\nfunction codecIdEquals(a: number[], b: number[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\n/**\n * Register a codec\n */\nexport function registerCodec(id: number[], codec: Codec): void {\n codecs[codecIdToKey(id)] = codec;\n}\n\n/**\n * Get a codec by ID\n * @throws Error if codec is not supported\n */\nexport function getCodec(id: number[]): Codec {\n const key = codecIdToKey(id);\n const codec = codecs[key];\n if (!codec) {\n throw createCodedError(`Unsupported codec: ${key}`, ErrorCode.UNSUPPORTED_CODEC);\n }\n return codec;\n}\n\n/**\n * Check if a codec is supported\n */\nexport function isCodecSupported(id: number[]): boolean {\n return codecs[codecIdToKey(id)] !== undefined;\n}\n\n/**\n * Get human-readable codec name\n */\nexport function getCodecName(id: number[]): string {\n if (codecIdEquals(id, CodecId.COPY)) return 'Copy';\n if (codecIdEquals(id, CodecId.LZMA)) return 'LZMA';\n if (codecIdEquals(id, CodecId.LZMA2)) return 'LZMA2';\n if (codecIdEquals(id, CodecId.BCJ_X86)) return 'BCJ (x86)';\n if (codecIdEquals(id, CodecId.BCJ_ARM)) return 'BCJ (ARM)';\n if (codecIdEquals(id, CodecId.BCJ_ARMT)) return 'BCJ (ARM Thumb)';\n if (codecIdEquals(id, CodecId.BCJ_ARM64)) return 'BCJ (ARM64)';\n if (codecIdEquals(id, CodecId.BCJ_PPC)) return 'BCJ (PowerPC)';\n if (codecIdEquals(id, CodecId.BCJ_IA64)) return 'BCJ (IA64)';\n if (codecIdEquals(id, CodecId.BCJ_SPARC)) return 'BCJ (SPARC)';\n if (codecIdEquals(id, CodecId.BCJ2)) return 'BCJ2';\n if (codecIdEquals(id, CodecId.PPMD)) return 'PPMd';\n if (codecIdEquals(id, CodecId.DELTA)) return 'Delta';\n if (codecIdEquals(id, CodecId.DEFLATE)) return 'Deflate';\n if (codecIdEquals(id, CodecId.BZIP2)) return 'BZip2';\n if (codecIdEquals(id, CodecId.AES)) return 'AES-256';\n return `Unknown (${codecIdToKey(id)})`;\n}\n\n/**\n * Check if a codec ID matches BCJ2\n */\nexport function isBcj2Codec(id: number[]): boolean {\n return codecIdEquals(id, CodecId.BCJ2);\n}\n\n// Re-export BCJ2 multi-stream decoder for special handling\nexport { decodeBcj2Multi };\n\n// Register built-in codecs\n\n// Copy codec (no compression)\nregisterCodec(CodecId.COPY, {\n decode: wrapSyncDecode(decodeCopy),\n createDecoder: createCopyDecoder,\n});\n\n// LZMA codec\nregisterCodec(CodecId.LZMA, {\n decode: decodeLzma,\n createDecoder: createLzmaDecoder,\n});\n\n// LZMA2 codec\nregisterCodec(CodecId.LZMA2, {\n decode: decodeLzma2,\n createDecoder: createLzma2Decoder,\n});\n\n// BCJ (x86) filter\nregisterCodec(CodecId.BCJ_X86, {\n decode: wrapSyncDecode(decodeBcj),\n createDecoder: createBcjDecoder,\n});\n\n// BCJ (ARM) filter\nregisterCodec(CodecId.BCJ_ARM, {\n decode: wrapSyncDecode(decodeBcjArm),\n createDecoder: createBcjArmDecoder,\n});\n\n// BCJ (ARM Thumb) filter\nregisterCodec(CodecId.BCJ_ARMT, {\n decode: wrapSyncDecode(decodeBcjArmt),\n createDecoder: createBcjArmtDecoder,\n});\n\n// BCJ (ARM64) filter\nregisterCodec(CodecId.BCJ_ARM64, {\n decode: wrapSyncDecode(decodeBcjArm64),\n createDecoder: createBcjArm64Decoder,\n});\n\n// BCJ (PowerPC) filter\nregisterCodec(CodecId.BCJ_PPC, {\n decode: wrapSyncDecode(decodeBcjPpc),\n createDecoder: createBcjPpcDecoder,\n});\n\n// BCJ (IA64) filter\nregisterCodec(CodecId.BCJ_IA64, {\n decode: wrapSyncDecode(decodeBcjIa64),\n createDecoder: createBcjIa64Decoder,\n});\n\n// BCJ (SPARC) filter\nregisterCodec(CodecId.BCJ_SPARC, {\n decode: wrapSyncDecode(decodeBcjSparc),\n createDecoder: createBcjSparcDecoder,\n});\n\n// Delta filter\nregisterCodec(CodecId.DELTA, {\n decode: wrapSyncDecode(decodeDelta),\n createDecoder: createDeltaDecoder,\n});\n\n// Deflate codec\nregisterCodec(CodecId.DEFLATE, {\n decode: wrapSyncDecode(decodeDeflate),\n createDecoder: createDeflateDecoder,\n});\n\n// BZip2 codec\nregisterCodec(CodecId.BZIP2, {\n decode: wrapSyncDecode(decodeBzip2),\n createDecoder: createBzip2Decoder,\n});\n\n// AES-256-CBC codec (encryption)\nregisterCodec(CodecId.AES, {\n decode: wrapSyncDecode(decodeAes),\n createDecoder: createAesDecoder,\n});\n\n// BCJ2 (x86-64) filter - multi-stream\n// Note: BCJ2 requires special handling in SevenZipParser due to 4-stream architecture\nregisterCodec(CodecId.BCJ2, {\n decode: decodeBcj2,\n createDecoder: createBcj2Decoder,\n});\n\n// Note: PPMd codec is not implemented. See FUTURE_ENHANCEMENTS.md\n"],"names":["createLzma2Decoder","_createLzma2Decoder","createLzmaDecoder","_createLzmaDecoder","createBcjArm64Decoder","createBcjArmDecoder","createBcjArmtDecoder","createBcjDecoder","createBcjIa64Decoder","createBcjPpcDecoder","createBcjSparcDecoder","createDeltaDecoder","decode7zLzma","decode7zLzma2","decodeBcj","decodeBcjArm","decodeBcjArm64","decodeBcjArmt","decodeBcjIa64","decodeBcjPpc","decodeBcjSparc","decodeDelta","CodecId","createCodedError","ErrorCode","createAesDecoder","decodeAes","getPassword","setPassword","createBcj2Decoder","decodeBcj2","decodeBcj2Multi","createBzip2Decoder","decodeBzip2","createCopyDecoder","decodeCopy","createDeflateDecoder","decodeDeflate","schedule","setImmediate","fn","process","nextTick","wrapSyncDecode","input","properties","unpackSize","callback","buf","Buffer","isBuffer","toBuffer","err","decodeLzma","length","Error","decodeLzma2","_unpackSize","codecs","codecIdToKey","id","parts","i","push","toString","toUpperCase","join","codecIdEquals","a","b","registerCodec","codec","getCodec","key","UNSUPPORTED_CODEC","isCodecSupported","undefined","getCodecName","COPY","LZMA","LZMA2","BCJ_X86","BCJ_ARM","BCJ_ARMT","BCJ_ARM64","BCJ_PPC","BCJ_IA64","BCJ_SPARC","BCJ2","PPMD","DELTA","DEFLATE","BZIP2","AES","isBcj2Codec","decode","createDecoder"],"mappings":"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"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/index.ts"],"sourcesContent":["// Codec registry for 7z decompression\n// Each codec provides a decode function and optionally a streaming decoder\n\nimport type { BufferLike } from 'extract-base-iterator';\nimport type { Transform } from 'stream';\nimport {\n createLzma2Decoder as _createLzma2Decoder,\n createLzmaDecoder as _createLzmaDecoder,\n type DecodeCallback as CodecDecodeCallback,\n createBcjArm64Decoder,\n createBcjArmDecoder,\n createBcjArmtDecoder,\n createBcjDecoder,\n createBcjIa64Decoder,\n createBcjPpcDecoder,\n createBcjSparcDecoder,\n createDeltaDecoder,\n decode7zLzma,\n decode7zLzma2,\n decodeBcj,\n decodeBcjArm,\n decodeBcjArm64,\n decodeBcjArmt,\n decodeBcjIa64,\n decodeBcjPpc,\n decodeBcjSparc,\n decodeDelta,\n} from 'xz-compat';\nimport { CodecId, createCodedError, ErrorCode } from '../constants.ts';\nimport { createAesDecoder, decodeAes, getPassword, setPassword } from './Aes.ts';\nimport { createBcj2Decoder, decodeBcj2, decodeBcj2Multi } from './Bcj2.ts';\nimport { createBzip2Decoder, decodeBzip2 } from './BZip2.ts';\nimport { createCopyDecoder, decodeCopy } from './Copy.ts';\nimport { createDeflateDecoder, decodeDeflate } from './Deflate.ts';\n\n// Re-export password functions for API access\nexport { getPassword, setPassword };\n\nconst schedule = typeof setImmediate === 'function' ? setImmediate : (fn: () => void) => process.nextTick(fn);\n\nfunction wrapSyncDecode(fn: (input: Buffer, properties?: Buffer, unpackSize?: number) => Buffer): Codec['decode'] {\n return (input, properties, unpackSize, callback) => {\n schedule(() => {\n try {\n // Convert BufferList to Buffer if needed\n const buf = Buffer.isBuffer(input) ? input : input.toBuffer();\n callback(null, fn(buf, properties, unpackSize));\n } catch (err) {\n callback(err as Error);\n }\n });\n };\n}\n\nexport interface Codec {\n decode: (input: BufferLike, properties: Buffer | undefined, unpackSize: number | undefined, callback: CodecDecodeCallback<Buffer>) => void;\n createDecoder: (properties?: Buffer, unpackSize?: number) => Transform;\n}\n\n// Simple wrappers with validation that use xz-compat's optimized decode7zLzma/decode7zLzma2\nfunction decodeLzma(input: BufferLike, properties: Buffer, unpackSize: number, callback: CodecDecodeCallback<Buffer>): void {\n if (properties.length < 5) {\n throw new Error('LZMA requires 5-byte properties');\n }\n // Convert BufferList to Buffer if needed\n const buf = Buffer.isBuffer(input) ? input : input.toBuffer();\n decode7zLzma(buf, properties, unpackSize, callback);\n}\n\nfunction createLzmaDecoder(properties?: Buffer, unpackSize?: number): Transform {\n if (!properties || properties.length < 5) {\n throw new Error('LZMA requires 5-byte properties');\n }\n if (typeof unpackSize !== 'number' || unpackSize < 0) {\n throw new Error('LZMA requires known unpack size');\n }\n return _createLzmaDecoder(properties, unpackSize) as Transform;\n}\n\nfunction decodeLzma2(input: BufferLike, properties: Buffer, unpackSize: number | undefined, callback: CodecDecodeCallback<Buffer>): void {\n if (properties.length < 1) {\n throw new Error('LZMA2 requires properties byte');\n }\n // Convert BufferList to Buffer if needed\n const buf = Buffer.isBuffer(input) ? input : input.toBuffer();\n decode7zLzma2(buf, properties, unpackSize, callback);\n}\n\nfunction createLzma2Decoder(properties?: Buffer, _unpackSize?: number): Transform {\n if (!properties || properties.length < 1) {\n throw new Error('LZMA2 requires properties byte');\n }\n return _createLzma2Decoder(properties) as Transform;\n}\n\n// Registry of supported codecs\nconst codecs: { [key: string]: Codec } = {};\n\n/**\n * Convert codec ID bytes to a string key\n */\nfunction codecIdToKey(id: number[]): string {\n const parts: string[] = [];\n for (let i = 0; i < id.length; i++) {\n parts.push(id[i].toString(16).toUpperCase());\n }\n return parts.join('-');\n}\n\n/**\n * Check if two codec IDs match\n */\nfunction codecIdEquals(a: number[], b: number[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\n/**\n * Register a codec\n */\nexport function registerCodec(id: number[], codec: Codec): void {\n codecs[codecIdToKey(id)] = codec;\n}\n\n/**\n * Get a codec by ID\n * @throws Error if codec is not supported\n */\nexport function getCodec(id: number[]): Codec {\n const key = codecIdToKey(id);\n const codec = codecs[key];\n if (!codec) {\n throw createCodedError(`Unsupported codec: ${key}`, ErrorCode.UNSUPPORTED_CODEC);\n }\n return codec;\n}\n\n/**\n * Check if a codec is supported\n */\nexport function isCodecSupported(id: number[]): boolean {\n return codecs[codecIdToKey(id)] !== undefined;\n}\n\n/**\n * Get human-readable codec name\n */\nexport function getCodecName(id: number[]): string {\n if (codecIdEquals(id, CodecId.COPY)) return 'Copy';\n if (codecIdEquals(id, CodecId.LZMA)) return 'LZMA';\n if (codecIdEquals(id, CodecId.LZMA2)) return 'LZMA2';\n if (codecIdEquals(id, CodecId.BCJ_X86)) return 'BCJ (x86)';\n if (codecIdEquals(id, CodecId.BCJ_ARM)) return 'BCJ (ARM)';\n if (codecIdEquals(id, CodecId.BCJ_ARMT)) return 'BCJ (ARM Thumb)';\n if (codecIdEquals(id, CodecId.BCJ_ARM64)) return 'BCJ (ARM64)';\n if (codecIdEquals(id, CodecId.BCJ_PPC)) return 'BCJ (PowerPC)';\n if (codecIdEquals(id, CodecId.BCJ_IA64)) return 'BCJ (IA64)';\n if (codecIdEquals(id, CodecId.BCJ_SPARC)) return 'BCJ (SPARC)';\n if (codecIdEquals(id, CodecId.BCJ2)) return 'BCJ2';\n if (codecIdEquals(id, CodecId.PPMD)) return 'PPMd';\n if (codecIdEquals(id, CodecId.DELTA)) return 'Delta';\n if (codecIdEquals(id, CodecId.DEFLATE)) return 'Deflate';\n if (codecIdEquals(id, CodecId.BZIP2)) return 'BZip2';\n if (codecIdEquals(id, CodecId.AES)) return 'AES-256';\n return `Unknown (${codecIdToKey(id)})`;\n}\n\n/**\n * Check if a codec ID matches BCJ2\n */\nexport function isBcj2Codec(id: number[]): boolean {\n return codecIdEquals(id, CodecId.BCJ2);\n}\n\n// Re-export BCJ2 multi-stream decoder for special handling\nexport { decodeBcj2Multi };\n\n// Register built-in codecs\n\n// Copy codec (no compression)\nregisterCodec(CodecId.COPY, {\n decode: wrapSyncDecode(decodeCopy),\n createDecoder: createCopyDecoder,\n});\n\n// LZMA codec\nregisterCodec(CodecId.LZMA, {\n decode: decodeLzma,\n createDecoder: createLzmaDecoder,\n});\n\n// LZMA2 codec\nregisterCodec(CodecId.LZMA2, {\n decode: decodeLzma2,\n createDecoder: createLzma2Decoder,\n});\n\n// BCJ (x86) filter\nregisterCodec(CodecId.BCJ_X86, {\n decode: wrapSyncDecode(decodeBcj),\n createDecoder: createBcjDecoder,\n});\n\n// BCJ (ARM) filter\nregisterCodec(CodecId.BCJ_ARM, {\n decode: wrapSyncDecode(decodeBcjArm),\n createDecoder: createBcjArmDecoder,\n});\n\n// BCJ (ARM Thumb) filter\nregisterCodec(CodecId.BCJ_ARMT, {\n decode: wrapSyncDecode(decodeBcjArmt),\n createDecoder: createBcjArmtDecoder,\n});\n\n// BCJ (ARM64) filter\nregisterCodec(CodecId.BCJ_ARM64, {\n decode: wrapSyncDecode(decodeBcjArm64),\n createDecoder: createBcjArm64Decoder,\n});\n\n// BCJ (PowerPC) filter\nregisterCodec(CodecId.BCJ_PPC, {\n decode: wrapSyncDecode(decodeBcjPpc),\n createDecoder: createBcjPpcDecoder,\n});\n\n// BCJ (IA64) filter\nregisterCodec(CodecId.BCJ_IA64, {\n decode: wrapSyncDecode(decodeBcjIa64),\n createDecoder: createBcjIa64Decoder,\n});\n\n// BCJ (SPARC) filter\nregisterCodec(CodecId.BCJ_SPARC, {\n decode: wrapSyncDecode(decodeBcjSparc),\n createDecoder: createBcjSparcDecoder,\n});\n\n// Delta filter\nregisterCodec(CodecId.DELTA, {\n decode: wrapSyncDecode(decodeDelta),\n createDecoder: createDeltaDecoder,\n});\n\n// Deflate codec\nregisterCodec(CodecId.DEFLATE, {\n decode: wrapSyncDecode(decodeDeflate),\n createDecoder: createDeflateDecoder,\n});\n\n// BZip2 codec\nregisterCodec(CodecId.BZIP2, {\n decode: wrapSyncDecode(decodeBzip2),\n createDecoder: createBzip2Decoder,\n});\n\n// AES-256-CBC codec (encryption)\nregisterCodec(CodecId.AES, {\n decode: wrapSyncDecode(decodeAes),\n createDecoder: createAesDecoder,\n});\n\n// BCJ2 (x86-64) filter - multi-stream\n// Note: BCJ2 requires special handling in SevenZipParser due to 4-stream architecture\nregisterCodec(CodecId.BCJ2, {\n decode: decodeBcj2,\n createDecoder: createBcj2Decoder,\n});\n\n// Note: PPMd codec is not implemented. See FUTURE_ENHANCEMENTS.md\n"],"names":["createLzma2Decoder","_createLzma2Decoder","createLzmaDecoder","_createLzmaDecoder","createBcjArm64Decoder","createBcjArmDecoder","createBcjArmtDecoder","createBcjDecoder","createBcjIa64Decoder","createBcjPpcDecoder","createBcjSparcDecoder","createDeltaDecoder","decode7zLzma","decode7zLzma2","decodeBcj","decodeBcjArm","decodeBcjArm64","decodeBcjArmt","decodeBcjIa64","decodeBcjPpc","decodeBcjSparc","decodeDelta","CodecId","createCodedError","ErrorCode","createAesDecoder","decodeAes","getPassword","setPassword","createBcj2Decoder","decodeBcj2","decodeBcj2Multi","createBzip2Decoder","decodeBzip2","createCopyDecoder","decodeCopy","createDeflateDecoder","decodeDeflate","schedule","setImmediate","fn","process","nextTick","wrapSyncDecode","input","properties","unpackSize","callback","buf","Buffer","isBuffer","toBuffer","err","decodeLzma","length","Error","decodeLzma2","_unpackSize","codecs","codecIdToKey","id","parts","i","push","toString","toUpperCase","join","codecIdEquals","a","b","registerCodec","codec","getCodec","key","UNSUPPORTED_CODEC","isCodecSupported","undefined","getCodecName","COPY","LZMA","LZMA2","BCJ_X86","BCJ_ARM","BCJ_ARMT","BCJ_ARM64","BCJ_PPC","BCJ_IA64","BCJ_SPARC","BCJ2","PPMD","DELTA","DEFLATE","BZIP2","AES","isBcj2Codec","decode","createDecoder"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/codecs/streams.ts"],"sourcesContent":["// Shared stream wrappers for lzma-purejs codec interface\n// These adapters convert between Buffer/lzma-purejs stream interfaces\n\nimport { allocBufferUnsafe } from 'extract-base-iterator';\n\n/**\n * Input stream wrapper for lzma-purejs\n * Wraps a Buffer region as a readable stream interface\n */\nexport function createInputStream(buffer: Buffer, offset: number, length: number) {\n let pos = 0;\n const end = Math.min(offset + length, buffer.length);\n const start = offset;\n\n return {\n readByte: (): number => {\n if (start + pos >= end) return -1;\n return buffer[start + pos++];\n },\n read: (buf: number[], bufOffset: number, len: number): number => {\n let bytesRead = 0;\n while (bytesRead < len && start + pos < end) {\n buf[bufOffset + bytesRead] = buffer[start + pos];\n pos++;\n bytesRead++;\n }\n return bytesRead === 0 ? -1 : bytesRead;\n },\n };\n}\n\n/**\n * Output stream wrapper for lzma-purejs\n * Collects output bytes into Buffer chunks\n * Uses typed arrays for memory efficiency (1 byte per element instead of 8)\n *\n * Memory optimization: If expectedSize is provided, pre-allocates a single buffer\n * to avoid double-memory during Buffer.concat.\n *\n * @param expectedSize - Optional expected output size for pre-allocation\n */\nexport function createOutputStream(expectedSize?: number) {\n // Pre-allocation mode: single buffer, no concat needed\n // Includes bounds checking for safety on older Node.js versions\n if (expectedSize && expectedSize > 0) {\n const buffer = allocBufferUnsafe(expectedSize);\n let bufPos = 0;\n const bufLen = buffer.length;\n\n return {\n writeByte: (b: number): void => {\n if (bufPos < bufLen) {\n buffer[bufPos++] = b;\n }\n // Silently ignore overflow (should not happen with correct size)\n },\n write: (buf: number[], bufOffset: number, len: number): number => {\n for (let i = 0; i < len && bufPos < bufLen; i++) {\n buffer[bufPos++] = buf[bufOffset + i];\n }\n return len;\n },\n flush: (): void => {\n // No-op for pre-allocated buffer\n },\n toBuffer: (): Buffer => {\n // Return only the used portion\n return bufPos < buffer.length ? buffer.slice(0, bufPos) : buffer;\n },\n };\n }\n\n // Chunked mode: accumulate in 64KB chunks (fallback for unknown size)\n const chunks: Buffer[] = [];\n const CHUNK_SIZE = 65536; // 64KB chunks for better memory efficiency\n let currentChunk: Buffer = allocBufferUnsafe(CHUNK_SIZE);\n let pos = 0;\n\n return {\n writeByte: (b: number): void => {\n currentChunk[pos++] = b;\n if (pos >= CHUNK_SIZE) {\n chunks.push(currentChunk);\n currentChunk = allocBufferUnsafe(CHUNK_SIZE);\n pos = 0;\n }\n },\n write: function (buf: number[], bufOffset: number, len: number): number {\n for (let i = 0; i < len; i++) {\n this.writeByte(buf[bufOffset + i]);\n }\n return len;\n },\n flush: (): void => {\n if (pos > 0) {\n // Only keep the used portion of the current chunk\n chunks.push(currentChunk.slice(0, pos));\n currentChunk = allocBufferUnsafe(CHUNK_SIZE);\n pos = 0;\n }\n },\n toBuffer: function (): Buffer {\n this.flush();\n // Optimization: if single chunk, return it directly\n if (chunks.length === 1) {\n return chunks[0];\n }\n return Buffer.concat(chunks);\n },\n };\n}\n"],"names":["allocBufferUnsafe","createInputStream","buffer","offset","length","pos","end","Math","min","start","readByte","read","buf","bufOffset","len","bytesRead","createOutputStream","expectedSize","bufPos","bufLen","writeByte","b","write","i","flush","toBuffer","slice","chunks","CHUNK_SIZE","currentChunk","push","Buffer","concat"],"mappings":"AAAA,yDAAyD;AACzD,sEAAsE;AAEtE,SAASA,iBAAiB,QAAQ,wBAAwB;AAE1D;;;CAGC,GACD,OAAO,SAASC,kBAAkBC,MAAc,EAAEC,MAAc,EAAEC,MAAc;IAC9E,IAAIC,MAAM;IACV,MAAMC,MAAMC,KAAKC,GAAG,CAACL,SAASC,QAAQF,OAAOE,MAAM;IACnD,MAAMK,QAAQN;IAEd,OAAO;QACLO,UAAU;YACR,IAAID,QAAQJ,OAAOC,KAAK,OAAO,CAAC;YAChC,OAAOJ,MAAM,CAACO,QAAQJ,MAAM;QAC9B;QACAM,MAAM,CAACC,KAAeC,WAAmBC;YACvC,IAAIC,YAAY;YAChB,MAAOA,YAAYD,OAAOL,QAAQJ,MAAMC,IAAK;gBAC3CM,GAAG,CAACC,YAAYE,UAAU,GAAGb,MAAM,CAACO,QAAQJ,IAAI;gBAChDA;gBACAU;YACF;YACA,OAAOA,cAAc,IAAI,CAAC,IAAIA;QAChC;IACF;AACF;AAEA;;;;;;;;;CASC,GACD,OAAO,SAASC,mBAAmBC,YAAqB;IACtD,uDAAuD;IACvD,gEAAgE;IAChE,IAAIA,gBAAgBA,eAAe,GAAG;QACpC,MAAMf,SAASF,kBAAkBiB;QACjC,IAAIC,SAAS;QACb,MAAMC,SAASjB,OAAOE,MAAM;QAE5B,OAAO;YACLgB,WAAW,CAACC;gBACV,IAAIH,SAASC,QAAQ;oBACnBjB,MAAM,CAACgB,SAAS,GAAGG;gBACrB;YACA,iEAAiE;YACnE;YACAC,OAAO,CAACV,KAAeC,WAAmBC;gBACxC,IAAK,IAAIS,IAAI,GAAGA,IAAIT,OAAOI,SAASC,QAAQI,IAAK;oBAC/CrB,MAAM,CAACgB,SAAS,GAAGN,GAAG,CAACC,YAAYU,EAAE;gBACvC;gBACA,OAAOT;YACT;YACAU,OAAO;YACL,iCAAiC;YACnC;YACAC,UAAU;gBACR,+BAA+B;gBAC/B,OAAOP,SAAShB,OAAOE,MAAM,GAAGF,OAAOwB,KAAK,CAAC,GAAGR,UAAUhB;YAC5D;QACF;IACF;IAEA,sEAAsE;IACtE,MAAMyB,SAAmB,EAAE;IAC3B,MAAMC,aAAa,OAAO,2CAA2C;IACrE,IAAIC,eAAuB7B,kBAAkB4B;IAC7C,IAAIvB,MAAM;IAEV,OAAO;QACLe,WAAW,CAACC;YACVQ,YAAY,CAACxB,MAAM,GAAGgB;YACtB,IAAIhB,OAAOuB,YAAY;gBACrBD,OAAOG,IAAI,CAACD;gBACZA,eAAe7B,kBAAkB4B;gBACjCvB,MAAM;YACR;QACF;QACAiB,OAAO,SAAUV,GAAa,EAAEC,SAAiB,EAAEC,GAAW;YAC5D,IAAK,IAAIS,IAAI,GAAGA,IAAIT,KAAKS,IAAK;gBAC5B,IAAI,CAACH,SAAS,CAACR,GAAG,CAACC,YAAYU,EAAE;YACnC;YACA,OAAOT;QACT;QACAU,OAAO;YACL,IAAInB,MAAM,GAAG;gBACX,kDAAkD;gBAClDsB,OAAOG,IAAI,CAACD,aAAaH,KAAK,CAAC,GAAGrB;gBAClCwB,eAAe7B,kBAAkB4B;gBACjCvB,MAAM;YACR;QACF;QACAoB,UAAU;YACR,IAAI,CAACD,KAAK;YACV,oDAAoD;YACpD,IAAIG,OAAOvB,MAAM,KAAK,GAAG;gBACvB,OAAOuB,MAAM,CAAC,EAAE;YAClB;YACA,OAAOI,OAAOC,MAAM,CAACL;QACvB;IACF;AACF"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/streams.ts"],"sourcesContent":["// Shared stream wrappers for lzma-purejs codec interface\n// These adapters convert between Buffer/lzma-purejs stream interfaces\n\nimport { allocBufferUnsafe } from 'extract-base-iterator';\n\n/**\n * Input stream wrapper for lzma-purejs\n * Wraps a Buffer region as a readable stream interface\n */\nexport function createInputStream(buffer: Buffer, offset: number, length: number) {\n let pos = 0;\n const end = Math.min(offset + length, buffer.length);\n const start = offset;\n\n return {\n readByte: (): number => {\n if (start + pos >= end) return -1;\n return buffer[start + pos++];\n },\n read: (buf: number[], bufOffset: number, len: number): number => {\n let bytesRead = 0;\n while (bytesRead < len && start + pos < end) {\n buf[bufOffset + bytesRead] = buffer[start + pos];\n pos++;\n bytesRead++;\n }\n return bytesRead === 0 ? -1 : bytesRead;\n },\n };\n}\n\n/**\n * Output stream wrapper for lzma-purejs\n * Collects output bytes into Buffer chunks\n * Uses typed arrays for memory efficiency (1 byte per element instead of 8)\n *\n * Memory optimization: If expectedSize is provided, pre-allocates a single buffer\n * to avoid double-memory during Buffer.concat.\n *\n * @param expectedSize - Optional expected output size for pre-allocation\n */\nexport function createOutputStream(expectedSize?: number) {\n // Pre-allocation mode: single buffer, no concat needed\n // Includes bounds checking for safety on older Node.js versions\n if (expectedSize && expectedSize > 0) {\n const buffer = allocBufferUnsafe(expectedSize);\n let bufPos = 0;\n const bufLen = buffer.length;\n\n return {\n writeByte: (b: number): void => {\n if (bufPos < bufLen) {\n buffer[bufPos++] = b;\n }\n // Silently ignore overflow (should not happen with correct size)\n },\n write: (buf: number[], bufOffset: number, len: number): number => {\n for (let i = 0; i < len && bufPos < bufLen; i++) {\n buffer[bufPos++] = buf[bufOffset + i];\n }\n return len;\n },\n flush: (): void => {\n // No-op for pre-allocated buffer\n },\n toBuffer: (): Buffer => {\n // Return only the used portion\n return bufPos < buffer.length ? buffer.slice(0, bufPos) : buffer;\n },\n };\n }\n\n // Chunked mode: accumulate in 64KB chunks (fallback for unknown size)\n const chunks: Buffer[] = [];\n const CHUNK_SIZE = 65536; // 64KB chunks for better memory efficiency\n let currentChunk: Buffer = allocBufferUnsafe(CHUNK_SIZE);\n let pos = 0;\n\n return {\n writeByte: (b: number): void => {\n currentChunk[pos++] = b;\n if (pos >= CHUNK_SIZE) {\n chunks.push(currentChunk);\n currentChunk = allocBufferUnsafe(CHUNK_SIZE);\n pos = 0;\n }\n },\n write: function (buf: number[], bufOffset: number, len: number): number {\n for (let i = 0; i < len; i++) {\n this.writeByte(buf[bufOffset + i]);\n }\n return len;\n },\n flush: (): void => {\n if (pos > 0) {\n // Only keep the used portion of the current chunk\n chunks.push(currentChunk.slice(0, pos));\n currentChunk = allocBufferUnsafe(CHUNK_SIZE);\n pos = 0;\n }\n },\n toBuffer: function (): Buffer {\n this.flush();\n // Optimization: if single chunk, return it directly\n if (chunks.length === 1) {\n return chunks[0];\n }\n return Buffer.concat(chunks);\n },\n };\n}\n"],"names":["allocBufferUnsafe","createInputStream","buffer","offset","length","pos","end","Math","min","start","readByte","read","buf","bufOffset","len","bytesRead","createOutputStream","expectedSize","bufPos","bufLen","writeByte","b","write","i","flush","toBuffer","slice","chunks","CHUNK_SIZE","currentChunk","push","Buffer","concat"],"mappings":"AAAA,yDAAyD;AACzD,sEAAsE;AAEtE,SAASA,iBAAiB,QAAQ,wBAAwB;AAE1D;;;CAGC,GACD,OAAO,SAASC,kBAAkBC,MAAc,EAAEC,MAAc,EAAEC,MAAc;IAC9E,IAAIC,MAAM;IACV,MAAMC,MAAMC,KAAKC,GAAG,CAACL,SAASC,QAAQF,OAAOE,MAAM;IACnD,MAAMK,QAAQN;IAEd,OAAO;QACLO,UAAU;YACR,IAAID,QAAQJ,OAAOC,KAAK,OAAO,CAAC;YAChC,OAAOJ,MAAM,CAACO,QAAQJ,MAAM;QAC9B;QACAM,MAAM,CAACC,KAAeC,WAAmBC;YACvC,IAAIC,YAAY;YAChB,MAAOA,YAAYD,OAAOL,QAAQJ,MAAMC,IAAK;gBAC3CM,GAAG,CAACC,YAAYE,UAAU,GAAGb,MAAM,CAACO,QAAQJ,IAAI;gBAChDA;gBACAU;YACF;YACA,OAAOA,cAAc,IAAI,CAAC,IAAIA;QAChC;IACF;AACF;AAEA;;;;;;;;;CASC,GACD,OAAO,SAASC,mBAAmBC,YAAqB;IACtD,uDAAuD;IACvD,gEAAgE;IAChE,IAAIA,gBAAgBA,eAAe,GAAG;QACpC,MAAMf,SAASF,kBAAkBiB;QACjC,IAAIC,SAAS;QACb,MAAMC,SAASjB,OAAOE,MAAM;QAE5B,OAAO;YACLgB,WAAW,CAACC;gBACV,IAAIH,SAASC,QAAQ;oBACnBjB,MAAM,CAACgB,SAAS,GAAGG;gBACrB;YACA,iEAAiE;YACnE;YACAC,OAAO,CAACV,KAAeC,WAAmBC;gBACxC,IAAK,IAAIS,IAAI,GAAGA,IAAIT,OAAOI,SAASC,QAAQI,IAAK;oBAC/CrB,MAAM,CAACgB,SAAS,GAAGN,GAAG,CAACC,YAAYU,EAAE;gBACvC;gBACA,OAAOT;YACT;YACAU,OAAO;YACL,iCAAiC;YACnC;YACAC,UAAU;gBACR,+BAA+B;gBAC/B,OAAOP,SAAShB,OAAOE,MAAM,GAAGF,OAAOwB,KAAK,CAAC,GAAGR,UAAUhB;YAC5D;QACF;IACF;IAEA,sEAAsE;IACtE,MAAMyB,SAAmB,EAAE;IAC3B,MAAMC,aAAa,OAAO,2CAA2C;IACrE,IAAIC,eAAuB7B,kBAAkB4B;IAC7C,IAAIvB,MAAM;IAEV,OAAO;QACLe,WAAW,CAACC;YACVQ,YAAY,CAACxB,MAAM,GAAGgB;YACtB,IAAIhB,OAAOuB,YAAY;gBACrBD,OAAOG,IAAI,CAACD;gBACZA,eAAe7B,kBAAkB4B;gBACjCvB,MAAM;YACR;QACF;QACAiB,OAAO,SAAUV,GAAa,EAAEC,SAAiB,EAAEC,GAAW;YAC5D,IAAK,IAAIS,IAAI,GAAGA,IAAIT,KAAKS,IAAK;gBAC5B,IAAI,CAACH,SAAS,CAACR,GAAG,CAACC,YAAYU,EAAE;YACnC;YACA,OAAOT;QACT;QACAU,OAAO;YACL,IAAInB,MAAM,GAAG;gBACX,kDAAkD;gBAClDsB,OAAOG,IAAI,CAACD,aAAaH,KAAK,CAAC,GAAGrB;gBAClCwB,eAAe7B,kBAAkB4B;gBACjCvB,MAAM;YACR;QACF;QACAoB,UAAU;YACR,IAAI,CAACD,KAAK;YACV,oDAAoD;YACpD,IAAIG,OAAOvB,MAAM,KAAK,GAAG;gBACvB,OAAOuB,MAAM,CAAC,EAAE;YAClB;YACA,OAAOI,OAAOC,MAAM,CAACL;QACvB;IACF;AACF"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/constants.ts"],"sourcesContent":["// 7z format constants\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n\n// 7z signature: '7z' + magic bytes\nexport const SEVENZ_MAGIC = [0x37, 0x7a, 0xbc, 0xaf, 0x27, 0x1c];\n\n// Header sizes\nexport const SIGNATURE_HEADER_SIZE = 32;\nexport const START_HEADER_SIZE = 20; // Part of signature header after magic + version\n\n// Property IDs for encoded header\nexport const PropertyId = {\n kEnd: 0x00,\n kHeader: 0x01,\n kArchiveProperties: 0x02,\n kAdditionalStreamsInfo: 0x03,\n kMainStreamsInfo: 0x04,\n kFilesInfo: 0x05,\n kPackInfo: 0x06,\n kUnpackInfo: 0x07,\n kSubStreamsInfo: 0x08,\n kSize: 0x09,\n kCRC: 0x0a,\n kFolder: 0x0b,\n kCodersUnpackSize: 0x0c,\n kNumUnpackStream: 0x0d,\n kEmptyStream: 0x0e,\n kEmptyFile: 0x0f,\n kAnti: 0x10,\n kName: 0x11,\n kCTime: 0x12,\n kATime: 0x13,\n kMTime: 0x14,\n kWinAttributes: 0x15,\n kComment: 0x16,\n kEncodedHeader: 0x17,\n kStartPos: 0x18,\n kDummy: 0x19,\n};\n\n// Codec IDs\n// 7z uses variable-length codec IDs\n// Reference: 7za i output shows hex codec IDs (e.g., 3030501 = ARM)\nexport const CodecId = {\n COPY: [0x00],\n DELTA: [0x03],\n LZMA: [0x03, 0x01, 0x01],\n LZMA2: [0x21],\n BCJ_X86: [0x03, 0x03, 0x01, 0x03],\n BCJ_PPC: [0x03, 0x03, 0x02, 0x05],\n BCJ_IA64: [0x03, 0x03, 0x04, 0x01],\n BCJ_ARM: [0x03, 0x03, 0x05, 0x01],\n BCJ_ARMT: [0x03, 0x03, 0x07, 0x01],\n BCJ_SPARC: [0x03, 0x03, 0x08, 0x05],\n BCJ_ARM64: [0x03, 0x03, 0x0a, 0x01],\n BCJ2: [0x03, 0x03, 0x01, 0x1b],\n PPMD: [0x03, 0x04, 0x01],\n DEFLATE: [0x04, 0x01, 0x08],\n BZIP2: [0x04, 0x02, 0x02],\n AES: [0x06, 0xf1, 0x07, 0x01],\n};\n\n// File attribute flags (Windows style, stored in FilesInfo)\nexport const FileAttribute = {\n READONLY: 0x01,\n HIDDEN: 0x02,\n SYSTEM: 0x04,\n DIRECTORY: 0x10,\n ARCHIVE: 0x20,\n DEVICE: 0x40,\n NORMAL: 0x80,\n TEMPORARY: 0x100,\n SPARSE_FILE: 0x200,\n REPARSE_POINT: 0x400,\n COMPRESSED: 0x800,\n OFFLINE: 0x1000,\n NOT_CONTENT_INDEXED: 0x2000,\n ENCRYPTED: 0x4000,\n UNIX_EXTENSION: 0x8000,\n};\n\n// Unix permission modes (decimal values for Node 0.8 compatibility)\nexport const UnixMode = {\n DIR: 16384, // 0o40000 - directory\n FILE: 32768, // 0o100000 - regular file\n SYMLINK: 40960, // 0o120000 - symbolic link\n RWXRWXRWX: 511, // 0o777\n RWXRXRX: 493, // 0o755\n RWRR: 420, // 0o644\n DEFAULT_DIR: 493, // 0o755 - rwxr-xr-x\n DEFAULT_FILE: 420, // 0o644 - rw-r--r--\n};\n\n// Error codes\nexport const ErrorCode = {\n INVALID_SIGNATURE: 'INVALID_SIGNATURE',\n CRC_MISMATCH: 'CRC_MISMATCH',\n UNSUPPORTED_CODEC: 'UNSUPPORTED_CODEC',\n UNSUPPORTED_VERSION: 'UNSUPPORTED_VERSION',\n UNSUPPORTED_FEATURE: 'UNSUPPORTED_FEATURE',\n TRUNCATED_ARCHIVE: 'TRUNCATED_ARCHIVE',\n CORRUPT_ARCHIVE: 'CORRUPT_ARCHIVE',\n CORRUPT_HEADER: 'CORRUPT_HEADER',\n ENCRYPTED_ARCHIVE: 'ENCRYPTED_ARCHIVE',\n COMPRESSED_HEADER: 'COMPRESSED_HEADER',\n DECOMPRESSION_FAILED: 'DECOMPRESSION_FAILED',\n};\n\n// Error with code property\nexport interface CodedError extends Error {\n code: string;\n}\n\n/**\n * Create an error with a code property\n */\nexport function createCodedError(message: string, code: string): CodedError {\n const err = new Error(message) as CodedError;\n err.code = code;\n return err;\n}\n"],"names":["SEVENZ_MAGIC","SIGNATURE_HEADER_SIZE","START_HEADER_SIZE","PropertyId","kEnd","kHeader","kArchiveProperties","kAdditionalStreamsInfo","kMainStreamsInfo","kFilesInfo","kPackInfo","kUnpackInfo","kSubStreamsInfo","kSize","kCRC","kFolder","kCodersUnpackSize","kNumUnpackStream","kEmptyStream","kEmptyFile","kAnti","kName","kCTime","kATime","kMTime","kWinAttributes","kComment","kEncodedHeader","kStartPos","kDummy","CodecId","COPY","DELTA","LZMA","LZMA2","BCJ_X86","BCJ_PPC","BCJ_IA64","BCJ_ARM","BCJ_ARMT","BCJ_SPARC","BCJ_ARM64","BCJ2","PPMD","DEFLATE","BZIP2","AES","FileAttribute","READONLY","HIDDEN","SYSTEM","DIRECTORY","ARCHIVE","DEVICE","NORMAL","TEMPORARY","SPARSE_FILE","REPARSE_POINT","COMPRESSED","OFFLINE","NOT_CONTENT_INDEXED","ENCRYPTED","UNIX_EXTENSION","UnixMode","DIR","FILE","SYMLINK","RWXRWXRWX","RWXRXRX","RWRR","DEFAULT_DIR","DEFAULT_FILE","ErrorCode","INVALID_SIGNATURE","CRC_MISMATCH","UNSUPPORTED_CODEC","UNSUPPORTED_VERSION","UNSUPPORTED_FEATURE","TRUNCATED_ARCHIVE","CORRUPT_ARCHIVE","CORRUPT_HEADER","ENCRYPTED_ARCHIVE","COMPRESSED_HEADER","DECOMPRESSION_FAILED","createCodedError","message","code","err","Error"],"mappings":"AAAA,sBAAsB;AACtB,wEAAwE;AAExE,mCAAmC;AACnC,OAAO,MAAMA,eAAe;IAAC;IAAM;IAAM;IAAM;IAAM;IAAM;CAAK,CAAC;AAEjE,eAAe;AACf,OAAO,MAAMC,wBAAwB,GAAG;AACxC,OAAO,MAAMC,oBAAoB,GAAG,CAAC,iDAAiD;AAEtF,kCAAkC;AAClC,OAAO,MAAMC,aAAa;IACxBC,MAAM;IACNC,SAAS;IACTC,oBAAoB;IACpBC,wBAAwB;IACxBC,kBAAkB;IAClBC,YAAY;IACZC,WAAW;IACXC,aAAa;IACbC,iBAAiB;IACjBC,OAAO;IACPC,MAAM;IACNC,SAAS;IACTC,mBAAmB;IACnBC,kBAAkB;IAClBC,cAAc;IACdC,YAAY;IACZC,OAAO;IACPC,OAAO;IACPC,QAAQ;IACRC,QAAQ;IACRC,QAAQ;IACRC,gBAAgB;IAChBC,UAAU;IACVC,gBAAgB;IAChBC,WAAW;IACXC,QAAQ;AACV,EAAE;AAEF,YAAY;AACZ,oCAAoC;AACpC,oEAAoE;AACpE,OAAO,MAAMC,UAAU;IACrBC,MAAM;QAAC;KAAK;IACZC,OAAO;QAAC;KAAK;IACbC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,OAAO;QAAC;KAAK;IACbC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,UAAU;QAAC;QAAM;QAAM;QAAM;KAAK;IAClCC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,UAAU;QAAC;QAAM;QAAM;QAAM;KAAK;IAClCC,WAAW;QAAC;QAAM;QAAM;QAAM;KAAK;IACnCC,WAAW;QAAC;QAAM;QAAM;QAAM;KAAK;IACnCC,MAAM;QAAC;QAAM;QAAM;QAAM;KAAK;IAC9BC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,SAAS;QAAC;QAAM;QAAM;KAAK;IAC3BC,OAAO;QAAC;QAAM;QAAM;KAAK;IACzBC,KAAK;QAAC;QAAM;QAAM;QAAM;KAAK;AAC/B,EAAE;AAEF,4DAA4D;AAC5D,OAAO,MAAMC,gBAAgB;IAC3BC,UAAU;IACVC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,SAAS;IACTC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,aAAa;IACbC,eAAe;IACfC,YAAY;IACZC,SAAS;IACTC,qBAAqB;IACrBC,WAAW;IACXC,gBAAgB;AAClB,EAAE;AAEF,oEAAoE;AACpE,OAAO,MAAMC,WAAW;IACtBC,KAAK;IACLC,MAAM;IACNC,SAAS;IACTC,WAAW;IACXC,SAAS;IACTC,MAAM;IACNC,aAAa;IACbC,cAAc;AAChB,EAAE;AAEF,cAAc;AACd,OAAO,MAAMC,YAAY;IACvBC,mBAAmB;IACnBC,cAAc;IACdC,mBAAmB;IACnBC,qBAAqB;IACrBC,qBAAqB;IACrBC,mBAAmB;IACnBC,iBAAiB;IACjBC,gBAAgB;IAChBC,mBAAmB;IACnBC,mBAAmB;IACnBC,sBAAsB;AACxB,EAAE;AAOF;;CAEC,GACD,OAAO,SAASC,iBAAiBC,OAAe,EAAEC,IAAY;IAC5D,MAAMC,MAAM,IAAIC,MAAMH;IACtBE,IAAID,IAAI,GAAGA;IACX,OAAOC;AACT"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/constants.ts"],"sourcesContent":["// 7z format constants\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n\n// 7z signature: '7z' + magic bytes\nexport const SEVENZ_MAGIC = [0x37, 0x7a, 0xbc, 0xaf, 0x27, 0x1c];\n\n// Header sizes\nexport const SIGNATURE_HEADER_SIZE = 32;\nexport const START_HEADER_SIZE = 20; // Part of signature header after magic + version\n\n// Property IDs for encoded header\nexport const PropertyId = {\n kEnd: 0x00,\n kHeader: 0x01,\n kArchiveProperties: 0x02,\n kAdditionalStreamsInfo: 0x03,\n kMainStreamsInfo: 0x04,\n kFilesInfo: 0x05,\n kPackInfo: 0x06,\n kUnpackInfo: 0x07,\n kSubStreamsInfo: 0x08,\n kSize: 0x09,\n kCRC: 0x0a,\n kFolder: 0x0b,\n kCodersUnpackSize: 0x0c,\n kNumUnpackStream: 0x0d,\n kEmptyStream: 0x0e,\n kEmptyFile: 0x0f,\n kAnti: 0x10,\n kName: 0x11,\n kCTime: 0x12,\n kATime: 0x13,\n kMTime: 0x14,\n kWinAttributes: 0x15,\n kComment: 0x16,\n kEncodedHeader: 0x17,\n kStartPos: 0x18,\n kDummy: 0x19,\n};\n\n// Codec IDs\n// 7z uses variable-length codec IDs\n// Reference: 7za i output shows hex codec IDs (e.g., 3030501 = ARM)\nexport const CodecId = {\n COPY: [0x00],\n DELTA: [0x03],\n LZMA: [0x03, 0x01, 0x01],\n LZMA2: [0x21],\n BCJ_X86: [0x03, 0x03, 0x01, 0x03],\n BCJ_PPC: [0x03, 0x03, 0x02, 0x05],\n BCJ_IA64: [0x03, 0x03, 0x04, 0x01],\n BCJ_ARM: [0x03, 0x03, 0x05, 0x01],\n BCJ_ARMT: [0x03, 0x03, 0x07, 0x01],\n BCJ_SPARC: [0x03, 0x03, 0x08, 0x05],\n BCJ_ARM64: [0x03, 0x03, 0x0a, 0x01],\n BCJ2: [0x03, 0x03, 0x01, 0x1b],\n PPMD: [0x03, 0x04, 0x01],\n DEFLATE: [0x04, 0x01, 0x08],\n BZIP2: [0x04, 0x02, 0x02],\n AES: [0x06, 0xf1, 0x07, 0x01],\n};\n\n// File attribute flags (Windows style, stored in FilesInfo)\nexport const FileAttribute = {\n READONLY: 0x01,\n HIDDEN: 0x02,\n SYSTEM: 0x04,\n DIRECTORY: 0x10,\n ARCHIVE: 0x20,\n DEVICE: 0x40,\n NORMAL: 0x80,\n TEMPORARY: 0x100,\n SPARSE_FILE: 0x200,\n REPARSE_POINT: 0x400,\n COMPRESSED: 0x800,\n OFFLINE: 0x1000,\n NOT_CONTENT_INDEXED: 0x2000,\n ENCRYPTED: 0x4000,\n UNIX_EXTENSION: 0x8000,\n};\n\n// Unix permission modes (decimal values for Node 0.8 compatibility)\nexport const UnixMode = {\n DIR: 16384, // 0o40000 - directory\n FILE: 32768, // 0o100000 - regular file\n SYMLINK: 40960, // 0o120000 - symbolic link\n RWXRWXRWX: 511, // 0o777\n RWXRXRX: 493, // 0o755\n RWRR: 420, // 0o644\n DEFAULT_DIR: 493, // 0o755 - rwxr-xr-x\n DEFAULT_FILE: 420, // 0o644 - rw-r--r--\n};\n\n// Error codes\nexport const ErrorCode = {\n INVALID_SIGNATURE: 'INVALID_SIGNATURE',\n CRC_MISMATCH: 'CRC_MISMATCH',\n UNSUPPORTED_CODEC: 'UNSUPPORTED_CODEC',\n UNSUPPORTED_VERSION: 'UNSUPPORTED_VERSION',\n UNSUPPORTED_FEATURE: 'UNSUPPORTED_FEATURE',\n TRUNCATED_ARCHIVE: 'TRUNCATED_ARCHIVE',\n CORRUPT_ARCHIVE: 'CORRUPT_ARCHIVE',\n CORRUPT_HEADER: 'CORRUPT_HEADER',\n ENCRYPTED_ARCHIVE: 'ENCRYPTED_ARCHIVE',\n COMPRESSED_HEADER: 'COMPRESSED_HEADER',\n DECOMPRESSION_FAILED: 'DECOMPRESSION_FAILED',\n};\n\n// Error with code property\nexport interface CodedError extends Error {\n code: string;\n}\n\n/**\n * Create an error with a code property\n */\nexport function createCodedError(message: string, code: string): CodedError {\n const err = new Error(message) as CodedError;\n err.code = code;\n return err;\n}\n"],"names":["SEVENZ_MAGIC","SIGNATURE_HEADER_SIZE","START_HEADER_SIZE","PropertyId","kEnd","kHeader","kArchiveProperties","kAdditionalStreamsInfo","kMainStreamsInfo","kFilesInfo","kPackInfo","kUnpackInfo","kSubStreamsInfo","kSize","kCRC","kFolder","kCodersUnpackSize","kNumUnpackStream","kEmptyStream","kEmptyFile","kAnti","kName","kCTime","kATime","kMTime","kWinAttributes","kComment","kEncodedHeader","kStartPos","kDummy","CodecId","COPY","DELTA","LZMA","LZMA2","BCJ_X86","BCJ_PPC","BCJ_IA64","BCJ_ARM","BCJ_ARMT","BCJ_SPARC","BCJ_ARM64","BCJ2","PPMD","DEFLATE","BZIP2","AES","FileAttribute","READONLY","HIDDEN","SYSTEM","DIRECTORY","ARCHIVE","DEVICE","NORMAL","TEMPORARY","SPARSE_FILE","REPARSE_POINT","COMPRESSED","OFFLINE","NOT_CONTENT_INDEXED","ENCRYPTED","UNIX_EXTENSION","UnixMode","DIR","FILE","SYMLINK","RWXRWXRWX","RWXRXRX","RWRR","DEFAULT_DIR","DEFAULT_FILE","ErrorCode","INVALID_SIGNATURE","CRC_MISMATCH","UNSUPPORTED_CODEC","UNSUPPORTED_VERSION","UNSUPPORTED_FEATURE","TRUNCATED_ARCHIVE","CORRUPT_ARCHIVE","CORRUPT_HEADER","ENCRYPTED_ARCHIVE","COMPRESSED_HEADER","DECOMPRESSION_FAILED","createCodedError","message","code","err","Error"],"mappings":"AAAA,sBAAsB;AACtB,wEAAwE;AAExE,mCAAmC;AACnC,OAAO,MAAMA,eAAe;IAAC;IAAM;IAAM;IAAM;IAAM;IAAM;CAAK,CAAC;AAEjE,eAAe;AACf,OAAO,MAAMC,wBAAwB,GAAG;AACxC,OAAO,MAAMC,oBAAoB,GAAG,CAAC,iDAAiD;AAEtF,kCAAkC;AAClC,OAAO,MAAMC,aAAa;IACxBC,MAAM;IACNC,SAAS;IACTC,oBAAoB;IACpBC,wBAAwB;IACxBC,kBAAkB;IAClBC,YAAY;IACZC,WAAW;IACXC,aAAa;IACbC,iBAAiB;IACjBC,OAAO;IACPC,MAAM;IACNC,SAAS;IACTC,mBAAmB;IACnBC,kBAAkB;IAClBC,cAAc;IACdC,YAAY;IACZC,OAAO;IACPC,OAAO;IACPC,QAAQ;IACRC,QAAQ;IACRC,QAAQ;IACRC,gBAAgB;IAChBC,UAAU;IACVC,gBAAgB;IAChBC,WAAW;IACXC,QAAQ;AACV,EAAE;AAEF,YAAY;AACZ,oCAAoC;AACpC,oEAAoE;AACpE,OAAO,MAAMC,UAAU;IACrBC,MAAM;QAAC;KAAK;IACZC,OAAO;QAAC;KAAK;IACbC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,OAAO;QAAC;KAAK;IACbC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,UAAU;QAAC;QAAM;QAAM;QAAM;KAAK;IAClCC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,UAAU;QAAC;QAAM;QAAM;QAAM;KAAK;IAClCC,WAAW;QAAC;QAAM;QAAM;QAAM;KAAK;IACnCC,WAAW;QAAC;QAAM;QAAM;QAAM;KAAK;IACnCC,MAAM;QAAC;QAAM;QAAM;QAAM;KAAK;IAC9BC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,SAAS;QAAC;QAAM;QAAM;KAAK;IAC3BC,OAAO;QAAC;QAAM;QAAM;KAAK;IACzBC,KAAK;QAAC;QAAM;QAAM;QAAM;KAAK;AAC/B,EAAE;AAEF,4DAA4D;AAC5D,OAAO,MAAMC,gBAAgB;IAC3BC,UAAU;IACVC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,SAAS;IACTC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,aAAa;IACbC,eAAe;IACfC,YAAY;IACZC,SAAS;IACTC,qBAAqB;IACrBC,WAAW;IACXC,gBAAgB;AAClB,EAAE;AAEF,oEAAoE;AACpE,OAAO,MAAMC,WAAW;IACtBC,KAAK;IACLC,MAAM;IACNC,SAAS;IACTC,WAAW;IACXC,SAAS;IACTC,MAAM;IACNC,aAAa;IACbC,cAAc;AAChB,EAAE;AAEF,cAAc;AACd,OAAO,MAAMC,YAAY;IACvBC,mBAAmB;IACnBC,cAAc;IACdC,mBAAmB;IACnBC,qBAAqB;IACrBC,qBAAqB;IACrBC,mBAAmB;IACnBC,iBAAiB;IACjBC,gBAAgB;IAChBC,mBAAmB;IACnBC,mBAAmB;IACnBC,sBAAsB;AACxB,EAAE;AAOF;;CAEC,GACD,OAAO,SAASC,iBAAiBC,OAAe,EAAEC,IAAY;IAC5D,MAAMC,MAAM,IAAIC,MAAMH;IACtBE,IAAID,IAAI,GAAGA;IACX,OAAOC;AACT"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/FolderStreamSplitter.ts"],"sourcesContent":["/**\n * FolderStreamSplitter - Splits a decompressed folder stream into individual file streams\n *\n * For multi-file solid archives, the folder is decompressed as a single stream.\n * This class splits that stream into individual file streams based on known file boundaries.\n *\n * Features:\n * - Lazy stream creation (streams created on first access)\n * - Backpressure propagation (returns false when downstream is full)\n * - Running CRC verification per file\n * - Automatic cleanup of completed streams\n */\n\nimport { crc32, PassThrough } from 'extract-base-iterator';\nimport type Stream from 'stream';\n\nexport interface FolderStreamSplitterOptions {\n /** Sizes of each file in the folder (in order) */\n fileSizes: number[];\n /** Whether to verify CRC for each file */\n verifyCrc?: boolean;\n /** Expected CRCs for each file (parallel to fileSizes) */\n expectedCrcs?: (number | undefined)[];\n}\n\n/**\n * Splits a decompressed folder stream into individual file streams.\n *\n * Usage:\n * ```\n * const splitter = new FolderStreamSplitter({ fileSizes: [1000, 2000, 500] });\n *\n * decompressStream.on('data', (chunk) => {\n * if (!splitter.write(chunk)) {\n * decompressStream.pause();\n * splitter.onDrain(() => decompressStream.resume());\n * }\n * });\n * decompressStream.on('end', () => splitter.end());\n *\n * // Get stream for file at index 1 (created lazily)\n * const fileStream = splitter.getFileStream(1);\n * ```\n */\nexport class FolderStreamSplitter {\n private fileBoundaries: number[]; // Cumulative offsets [0, size1, size1+size2, ...]\n private fileStreams: (Stream.PassThrough | null)[]; // Lazy-created, null after completion\n private fileCrcs: number[]; // Running CRC per file\n private currentFileIndex: number;\n private bytesWritten: number;\n private currentFileEnd: number;\n private verifyCrc: boolean;\n private expectedCrcs: (number | undefined)[];\n private finished: boolean;\n private error: Error | null;\n private drainCallbacks: (() => void)[];\n private _needsDrain: boolean;\n\n constructor(options: FolderStreamSplitterOptions) {\n const fileSizes = options.fileSizes;\n const verifyCrc = options.verifyCrc !== undefined ? options.verifyCrc : true;\n const expectedCrcs = options.expectedCrcs || [];\n\n this.verifyCrc = verifyCrc;\n this.expectedCrcs = expectedCrcs;\n this.currentFileIndex = 0;\n this.bytesWritten = 0;\n this.finished = false;\n this.error = null;\n this.drainCallbacks = [];\n this._needsDrain = false;\n\n // Calculate cumulative boundaries\n this.fileBoundaries = [0];\n for (let i = 0; i < fileSizes.length; i++) {\n this.fileBoundaries.push(this.fileBoundaries[this.fileBoundaries.length - 1] + fileSizes[i]);\n }\n\n // Initialize streams array (lazy creation - all null initially)\n this.fileStreams = [];\n this.fileCrcs = [];\n for (let i = 0; i < fileSizes.length; i++) {\n this.fileStreams.push(null);\n this.fileCrcs.push(0);\n }\n\n // Set first file boundary\n this.currentFileEnd = this.fileBoundaries[1] || 0;\n }\n\n /**\n * Write decompressed data chunk. Data is routed to appropriate file stream(s).\n * Returns false if backpressure should be applied (downstream is full).\n */\n write(chunk: Buffer): boolean {\n if (this.finished || this.error) return true;\n\n let offset = 0;\n let canContinue = true;\n\n while (offset < chunk.length && this.currentFileIndex < this.fileStreams.length) {\n const remaining = chunk.length - offset;\n const neededForFile = this.currentFileEnd - this.bytesWritten;\n const toWrite = Math.min(remaining, neededForFile);\n\n if (toWrite > 0) {\n const fileChunk = chunk.slice(offset, offset + toWrite);\n\n // Ensure stream exists (lazy creation)\n const fileStream = this.ensureFileStream(this.currentFileIndex);\n\n // Update CRC\n if (this.verifyCrc) {\n this.fileCrcs[this.currentFileIndex] = crc32(fileChunk, this.fileCrcs[this.currentFileIndex]);\n }\n\n // Write to file stream, track backpressure\n if (!fileStream.write(fileChunk)) {\n canContinue = false;\n this._needsDrain = true;\n fileStream.once('drain', () => {\n this._needsDrain = false;\n this.notifyDrain();\n });\n }\n }\n\n this.bytesWritten += toWrite;\n offset += toWrite;\n\n // Check if current file is complete\n if (this.bytesWritten >= this.currentFileEnd) {\n this.finishCurrentFile();\n }\n }\n\n return canContinue;\n }\n\n /**\n * Ensure stream exists for file index (lazy creation)\n */\n private ensureFileStream(fileIndex: number): Stream.PassThrough {\n let stream = this.fileStreams[fileIndex];\n if (!stream) {\n stream = new PassThrough();\n this.fileStreams[fileIndex] = stream;\n }\n return stream;\n }\n\n /**\n * Complete current file and move to next\n */\n private finishCurrentFile(): void {\n const fileStream = this.fileStreams[this.currentFileIndex];\n\n // Verify CRC if enabled\n if (this.verifyCrc) {\n const expectedCrc = this.expectedCrcs[this.currentFileIndex];\n if (expectedCrc !== undefined && this.fileCrcs[this.currentFileIndex] !== expectedCrc) {\n const err = new Error(`CRC mismatch for file ${this.currentFileIndex}: expected ${expectedCrc.toString(16)}, got ${this.fileCrcs[this.currentFileIndex].toString(16)}`);\n this.emitError(err);\n return;\n }\n }\n\n // End this file's stream\n if (fileStream) {\n fileStream.end();\n }\n\n // Release reference for GC\n this.fileStreams[this.currentFileIndex] = null;\n\n // Move to next file\n this.currentFileIndex++;\n if (this.currentFileIndex < this.fileBoundaries.length - 1) {\n this.currentFileEnd = this.fileBoundaries[this.currentFileIndex + 1];\n }\n }\n\n /**\n * Signal end of decompressed data\n */\n end(): void {\n if (this.finished) return;\n this.finished = true;\n\n // End any remaining streams\n for (let i = this.currentFileIndex; i < this.fileStreams.length; i++) {\n const stream = this.fileStreams[i];\n if (stream) {\n stream.end();\n }\n this.fileStreams[i] = null;\n }\n }\n\n /**\n * Emit error to all pending file streams\n */\n private emitError(err: Error): void {\n this.error = err;\n for (let i = this.currentFileIndex; i < this.fileStreams.length; i++) {\n const stream = this.fileStreams[i];\n if (stream) {\n stream.emit('error', err);\n stream.end();\n }\n this.fileStreams[i] = null;\n }\n }\n\n /**\n * Get the stream for a specific file by index.\n * Stream is created lazily on first access.\n */\n getFileStream(fileIndex: number): Stream.PassThrough {\n if (fileIndex < 0 || fileIndex >= this.fileBoundaries.length - 1) {\n throw new Error(`Invalid file index: ${fileIndex}`);\n }\n\n // Check if file already completed\n if (fileIndex < this.currentFileIndex) {\n throw new Error(`File ${fileIndex} already completed - streams must be accessed in order`);\n }\n\n return this.ensureFileStream(fileIndex);\n }\n\n /**\n * Register callback for when backpressure clears\n */\n onDrain(callback: () => void): void {\n if (!this._needsDrain) {\n callback();\n } else {\n this.drainCallbacks.push(callback);\n }\n }\n\n /**\n * Notify all drain callbacks\n */\n private notifyDrain(): void {\n const callbacks = this.drainCallbacks;\n this.drainCallbacks = [];\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i]();\n }\n }\n\n /**\n * Check if a specific file's stream has been fully written\n */\n isFileComplete(fileIndex: number): boolean {\n return fileIndex < this.currentFileIndex;\n }\n\n /**\n * Get total number of files in this folder\n */\n get fileCount(): number {\n return this.fileBoundaries.length - 1;\n }\n\n /**\n * Check if splitter has encountered an error\n */\n getError(): Error | null {\n return this.error;\n }\n}\n"],"names":["crc32","PassThrough","FolderStreamSplitter","write","chunk","finished","error","offset","canContinue","length","currentFileIndex","fileStreams","remaining","neededForFile","currentFileEnd","bytesWritten","toWrite","Math","min","fileChunk","slice","fileStream","ensureFileStream","verifyCrc","fileCrcs","_needsDrain","once","notifyDrain","finishCurrentFile","fileIndex","stream","expectedCrc","expectedCrcs","undefined","err","Error","toString","emitError","end","fileBoundaries","i","emit","getFileStream","onDrain","callback","drainCallbacks","push","callbacks","isFileComplete","fileCount","getError","options","fileSizes"],"mappings":"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"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/FolderStreamSplitter.ts"],"sourcesContent":["/**\n * FolderStreamSplitter - Splits a decompressed folder stream into individual file streams\n *\n * For multi-file solid archives, the folder is decompressed as a single stream.\n * This class splits that stream into individual file streams based on known file boundaries.\n *\n * Features:\n * - Lazy stream creation (streams created on first access)\n * - Backpressure propagation (returns false when downstream is full)\n * - Running CRC verification per file\n * - Automatic cleanup of completed streams\n */\n\nimport { crc32, PassThrough } from 'extract-base-iterator';\nimport type Stream from 'stream';\n\nexport interface FolderStreamSplitterOptions {\n /** Sizes of each file in the folder (in order) */\n fileSizes: number[];\n /** Whether to verify CRC for each file */\n verifyCrc?: boolean;\n /** Expected CRCs for each file (parallel to fileSizes) */\n expectedCrcs?: (number | undefined)[];\n}\n\n/**\n * Splits a decompressed folder stream into individual file streams.\n *\n * Usage:\n * ```\n * const splitter = new FolderStreamSplitter({ fileSizes: [1000, 2000, 500] });\n *\n * decompressStream.on('data', (chunk) => {\n * if (!splitter.write(chunk)) {\n * decompressStream.pause();\n * splitter.onDrain(() => decompressStream.resume());\n * }\n * });\n * decompressStream.on('end', () => splitter.end());\n *\n * // Get stream for file at index 1 (created lazily)\n * const fileStream = splitter.getFileStream(1);\n * ```\n */\nexport class FolderStreamSplitter {\n private fileBoundaries: number[]; // Cumulative offsets [0, size1, size1+size2, ...]\n private fileStreams: (Stream.PassThrough | null)[]; // Lazy-created, null after completion\n private fileCrcs: number[]; // Running CRC per file\n private currentFileIndex: number;\n private bytesWritten: number;\n private currentFileEnd: number;\n private verifyCrc: boolean;\n private expectedCrcs: (number | undefined)[];\n private finished: boolean;\n private error: Error | null;\n private drainCallbacks: (() => void)[];\n private _needsDrain: boolean;\n\n constructor(options: FolderStreamSplitterOptions) {\n const fileSizes = options.fileSizes;\n const verifyCrc = options.verifyCrc !== undefined ? options.verifyCrc : true;\n const expectedCrcs = options.expectedCrcs || [];\n\n this.verifyCrc = verifyCrc;\n this.expectedCrcs = expectedCrcs;\n this.currentFileIndex = 0;\n this.bytesWritten = 0;\n this.finished = false;\n this.error = null;\n this.drainCallbacks = [];\n this._needsDrain = false;\n\n // Calculate cumulative boundaries\n this.fileBoundaries = [0];\n for (let i = 0; i < fileSizes.length; i++) {\n this.fileBoundaries.push(this.fileBoundaries[this.fileBoundaries.length - 1] + fileSizes[i]);\n }\n\n // Initialize streams array (lazy creation - all null initially)\n this.fileStreams = [];\n this.fileCrcs = [];\n for (let i = 0; i < fileSizes.length; i++) {\n this.fileStreams.push(null);\n this.fileCrcs.push(0);\n }\n\n // Set first file boundary\n this.currentFileEnd = this.fileBoundaries[1] || 0;\n }\n\n /**\n * Write decompressed data chunk. Data is routed to appropriate file stream(s).\n * Returns false if backpressure should be applied (downstream is full).\n */\n write(chunk: Buffer): boolean {\n if (this.finished || this.error) return true;\n\n let offset = 0;\n let canContinue = true;\n\n while (offset < chunk.length && this.currentFileIndex < this.fileStreams.length) {\n const remaining = chunk.length - offset;\n const neededForFile = this.currentFileEnd - this.bytesWritten;\n const toWrite = Math.min(remaining, neededForFile);\n\n if (toWrite > 0) {\n const fileChunk = chunk.slice(offset, offset + toWrite);\n\n // Ensure stream exists (lazy creation)\n const fileStream = this.ensureFileStream(this.currentFileIndex);\n\n // Update CRC\n if (this.verifyCrc) {\n this.fileCrcs[this.currentFileIndex] = crc32(fileChunk, this.fileCrcs[this.currentFileIndex]);\n }\n\n // Write to file stream, track backpressure\n if (!fileStream.write(fileChunk)) {\n canContinue = false;\n this._needsDrain = true;\n fileStream.once('drain', () => {\n this._needsDrain = false;\n this.notifyDrain();\n });\n }\n }\n\n this.bytesWritten += toWrite;\n offset += toWrite;\n\n // Check if current file is complete\n if (this.bytesWritten >= this.currentFileEnd) {\n this.finishCurrentFile();\n }\n }\n\n return canContinue;\n }\n\n /**\n * Ensure stream exists for file index (lazy creation)\n */\n private ensureFileStream(fileIndex: number): Stream.PassThrough {\n let stream = this.fileStreams[fileIndex];\n if (!stream) {\n stream = new PassThrough();\n this.fileStreams[fileIndex] = stream;\n }\n return stream;\n }\n\n /**\n * Complete current file and move to next\n */\n private finishCurrentFile(): void {\n const fileStream = this.fileStreams[this.currentFileIndex];\n\n // Verify CRC if enabled\n if (this.verifyCrc) {\n const expectedCrc = this.expectedCrcs[this.currentFileIndex];\n if (expectedCrc !== undefined && this.fileCrcs[this.currentFileIndex] !== expectedCrc) {\n const err = new Error(`CRC mismatch for file ${this.currentFileIndex}: expected ${expectedCrc.toString(16)}, got ${this.fileCrcs[this.currentFileIndex].toString(16)}`);\n this.emitError(err);\n return;\n }\n }\n\n // End this file's stream\n if (fileStream) {\n fileStream.end();\n }\n\n // Release reference for GC\n this.fileStreams[this.currentFileIndex] = null;\n\n // Move to next file\n this.currentFileIndex++;\n if (this.currentFileIndex < this.fileBoundaries.length - 1) {\n this.currentFileEnd = this.fileBoundaries[this.currentFileIndex + 1];\n }\n }\n\n /**\n * Signal end of decompressed data\n */\n end(): void {\n if (this.finished) return;\n this.finished = true;\n\n // End any remaining streams\n for (let i = this.currentFileIndex; i < this.fileStreams.length; i++) {\n const stream = this.fileStreams[i];\n if (stream) {\n stream.end();\n }\n this.fileStreams[i] = null;\n }\n }\n\n /**\n * Emit error to all pending file streams\n */\n private emitError(err: Error): void {\n this.error = err;\n for (let i = this.currentFileIndex; i < this.fileStreams.length; i++) {\n const stream = this.fileStreams[i];\n if (stream) {\n stream.emit('error', err);\n stream.end();\n }\n this.fileStreams[i] = null;\n }\n }\n\n /**\n * Get the stream for a specific file by index.\n * Stream is created lazily on first access.\n */\n getFileStream(fileIndex: number): Stream.PassThrough {\n if (fileIndex < 0 || fileIndex >= this.fileBoundaries.length - 1) {\n throw new Error(`Invalid file index: ${fileIndex}`);\n }\n\n // Check if file already completed\n if (fileIndex < this.currentFileIndex) {\n throw new Error(`File ${fileIndex} already completed - streams must be accessed in order`);\n }\n\n return this.ensureFileStream(fileIndex);\n }\n\n /**\n * Register callback for when backpressure clears\n */\n onDrain(callback: () => void): void {\n if (!this._needsDrain) {\n callback();\n } else {\n this.drainCallbacks.push(callback);\n }\n }\n\n /**\n * Notify all drain callbacks\n */\n private notifyDrain(): void {\n const callbacks = this.drainCallbacks;\n this.drainCallbacks = [];\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i]();\n }\n }\n\n /**\n * Check if a specific file's stream has been fully written\n */\n isFileComplete(fileIndex: number): boolean {\n return fileIndex < this.currentFileIndex;\n }\n\n /**\n * Get total number of files in this folder\n */\n get fileCount(): number {\n return this.fileBoundaries.length - 1;\n }\n\n /**\n * Check if splitter has encountered an error\n */\n getError(): Error | null {\n return this.error;\n }\n}\n"],"names":["crc32","PassThrough","FolderStreamSplitter","write","chunk","finished","error","offset","canContinue","length","currentFileIndex","fileStreams","remaining","neededForFile","currentFileEnd","bytesWritten","toWrite","Math","min","fileChunk","slice","fileStream","ensureFileStream","verifyCrc","fileCrcs","_needsDrain","once","notifyDrain","finishCurrentFile","fileIndex","stream","expectedCrc","expectedCrcs","undefined","err","Error","toString","emitError","end","fileBoundaries","i","emit","getFileStream","onDrain","callback","drainCallbacks","push","callbacks","isFileComplete","fileCount","getError","options","fileSizes"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/headers.ts"],"sourcesContent":["// 7z header parsing\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n\nimport { bufferEquals, readUInt64LE, verifyCrc32Region } from 'extract-base-iterator';\nimport { createCodedError, ErrorCode, PropertyId, SEVENZ_MAGIC } from './constants.ts';\nimport { readDefinedVector, readNumber } from './NumberCodec.ts';\n\n// Type definitions\nexport interface SignatureHeader {\n majorVersion: number;\n minorVersion: number;\n startHeaderCRC: number;\n nextHeaderOffset: number;\n nextHeaderSize: number;\n nextHeaderCRC: number;\n}\n\nexport interface Coder {\n id: number[]; // Codec ID bytes\n numInStreams: number; // Number of input streams\n numOutStreams: number; // Number of output streams\n properties?: Buffer; // Optional codec properties\n}\n\nexport interface Folder {\n coders: Coder[];\n bindPairs: { inIndex: number; outIndex: number }[];\n packedStreams: number[]; // Indices of packed streams\n unpackSizes: number[]; // Unpack size for each coder output\n unpackCRC?: number; // CRC of final unpacked data\n hasCRC: boolean;\n}\n\nexport interface StreamsInfo {\n packPos: number; // Position of packed data (relative to end of signature header)\n packSizes: number[]; // Sizes of packed streams\n packCRCs?: number[]; // Optional CRCs for packed streams\n folders: Folder[]; // Decompression info\n numUnpackStreamsPerFolder: number[]; // Number of files in each folder (for solid archives)\n unpackSizes: number[]; // Size of each unpacked file\n unpackCRCs?: number[]; // Optional CRCs for unpacked files\n}\n\nexport interface FileInfo {\n name: string;\n size: number;\n isDirectory: boolean;\n isAntiFile: boolean; // \"Anti\" items mark files to delete in delta archives\n hasStream: boolean; // False for empty files/directories\n crc?: number;\n ctime?: Date;\n atime?: Date;\n mtime?: Date;\n attributes?: number;\n}\n\nexport interface ArchiveHeader {\n signature: SignatureHeader;\n streamsInfo?: StreamsInfo;\n filesInfo: FileInfo[];\n}\n\n/**\n * Parse the signature header (first 32 bytes)\n */\nexport function parseSignatureHeader(buf: Buffer): SignatureHeader {\n // Verify magic bytes\n if (!bufferEquals(buf, 0, SEVENZ_MAGIC)) {\n throw createCodedError('Not a valid 7z archive', ErrorCode.INVALID_SIGNATURE);\n }\n\n // Read version\n const majorVersion = buf[6];\n const minorVersion = buf[7];\n\n // Version check - we support 0.x (current is 0.4)\n if (majorVersion > 0) {\n throw createCodedError(`Unsupported 7z version: ${majorVersion}.${minorVersion}`, ErrorCode.UNSUPPORTED_VERSION);\n }\n\n // Read start header CRC (CRC of the next 20 bytes)\n const startHeaderCRC = buf.readUInt32LE(8);\n\n // Verify start header CRC\n if (!verifyCrc32Region(buf, 12, 20, startHeaderCRC)) {\n throw createCodedError('Start header CRC mismatch', ErrorCode.CRC_MISMATCH);\n }\n\n // Read next header location\n const nextHeaderOffset = readUInt64LE(buf, 12);\n const nextHeaderSize = readUInt64LE(buf, 20);\n const nextHeaderCRC = buf.readUInt32LE(28);\n\n return {\n majorVersion: majorVersion,\n minorVersion: minorVersion,\n startHeaderCRC: startHeaderCRC,\n nextHeaderOffset: nextHeaderOffset,\n nextHeaderSize: nextHeaderSize,\n nextHeaderCRC: nextHeaderCRC,\n };\n}\n\n/**\n * Parse the encoded header (metadata block at end of archive)\n */\nexport function parseEncodedHeader(buf: Buffer, expectedCRC: number): { streamsInfo?: StreamsInfo; filesInfo: FileInfo[] } {\n // Verify CRC\n if (!verifyCrc32Region(buf, 0, buf.length, expectedCRC)) {\n throw createCodedError('Encoded header CRC mismatch', ErrorCode.CRC_MISMATCH);\n }\n\n let offset = 0;\n\n // Read property ID\n const propertyId = buf[offset++];\n\n // Handle kEncodedHeader - means the header itself is compressed\n if (propertyId === PropertyId.kEncodedHeader) {\n // Return indicator that we need to decompress\n throw createCodedError('Compressed header - needs decompression first', ErrorCode.COMPRESSED_HEADER);\n }\n\n // Should be kHeader\n if (propertyId !== PropertyId.kHeader) {\n throw createCodedError(`Expected kHeader, got ${propertyId}`, ErrorCode.CORRUPT_HEADER);\n }\n\n // Parse header contents (after kHeader byte)\n return parseHeaderContent(buf, offset);\n}\n\n/**\n * Parse header content (after kHeader byte has been read)\n * Used by parseEncodedHeader and for decompressed headers\n */\nexport function parseHeaderContent(buf: Buffer, offset: number): { streamsInfo?: StreamsInfo; filesInfo: FileInfo[] } {\n const result: { streamsInfo?: StreamsInfo; filesInfo: FileInfo[] } = {\n filesInfo: [],\n };\n\n // Parse header contents\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n switch (propertyId) {\n case PropertyId.kArchiveProperties:\n offset = skipArchiveProperties(buf, offset);\n break;\n case PropertyId.kAdditionalStreamsInfo:\n // Additional streams - skip for now\n offset = skipStreamsInfo(buf, offset);\n break;\n case PropertyId.kMainStreamsInfo: {\n const streamsResult = parseStreamsInfo(buf, offset);\n result.streamsInfo = streamsResult.info;\n offset = streamsResult.offset;\n break;\n }\n case PropertyId.kFilesInfo: {\n const filesResult = parseFilesInfo(buf, offset);\n result.filesInfo = filesResult.files;\n offset = filesResult.offset;\n break;\n }\n default:\n throw createCodedError(`Unknown property ID in header: ${propertyId}`, ErrorCode.CORRUPT_HEADER);\n }\n }\n\n return result;\n}\n\n/**\n * Parse StreamsInfo block\n */\nfunction parseStreamsInfo(buf: Buffer, offset: number): { info: StreamsInfo; offset: number } {\n const info: StreamsInfo = {\n packPos: 0,\n packSizes: [],\n folders: [],\n numUnpackStreamsPerFolder: [],\n unpackSizes: [],\n };\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n switch (propertyId) {\n case PropertyId.kPackInfo: {\n const packResult = parsePackInfo(buf, offset);\n info.packPos = packResult.packPos;\n info.packSizes = packResult.packSizes;\n info.packCRCs = packResult.packCRCs;\n offset = packResult.offset;\n break;\n }\n case PropertyId.kUnpackInfo: {\n const unpackResult = parseUnpackInfo(buf, offset);\n info.folders = unpackResult.folders;\n offset = unpackResult.offset;\n break;\n }\n case PropertyId.kSubStreamsInfo: {\n const subResult = parseSubStreamsInfo(buf, offset, info.folders);\n info.numUnpackStreamsPerFolder = subResult.numUnpackStreamsPerFolder;\n info.unpackSizes = subResult.unpackSizes;\n info.unpackCRCs = subResult.unpackCRCs;\n offset = subResult.offset;\n break;\n }\n default:\n throw createCodedError(`Unknown property ID in StreamsInfo: ${propertyId}`, ErrorCode.CORRUPT_HEADER);\n }\n }\n\n // If no SubStreamsInfo, each folder produces one file\n if (info.unpackSizes.length === 0 && info.folders.length > 0) {\n for (let i = 0; i < info.folders.length; i++) {\n const folder = info.folders[i];\n // Get the final unpack size (last coder's output)\n const finalSize = folder.unpackSizes[folder.unpackSizes.length - 1];\n info.unpackSizes.push(finalSize);\n info.numUnpackStreamsPerFolder.push(1);\n }\n }\n\n return { info: info, offset: offset };\n}\n\n/**\n * Parse PackInfo block\n */\nfunction parsePackInfo(buf: Buffer, offset: number): { packPos: number; packSizes: number[]; packCRCs?: number[]; offset: number } {\n // Pack position\n const packPosResult = readNumber(buf, offset);\n const packPos = packPosResult.value;\n offset += packPosResult.bytesRead;\n\n // Number of pack streams\n const numPackResult = readNumber(buf, offset);\n const numPackStreams = numPackResult.value;\n offset += numPackResult.bytesRead;\n\n const packSizes: number[] = [];\n let packCRCs: number[] | undefined;\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n if (propertyId === PropertyId.kSize) {\n for (let i = 0; i < numPackStreams; i++) {\n const sizeResult = readNumber(buf, offset);\n packSizes.push(sizeResult.value);\n offset += sizeResult.bytesRead;\n }\n } else if (propertyId === PropertyId.kCRC) {\n packCRCs = [];\n const definedResult = readDefinedVector(buf, offset, numPackStreams);\n offset += definedResult.bytesRead;\n for (let j = 0; j < numPackStreams; j++) {\n if (definedResult.defined[j]) {\n packCRCs.push(buf.readUInt32LE(offset));\n offset += 4;\n } else {\n packCRCs.push(0);\n }\n }\n }\n }\n\n return { packPos: packPos, packSizes: packSizes, packCRCs: packCRCs, offset: offset };\n}\n\n/**\n * Parse UnpackInfo block\n */\nfunction parseUnpackInfo(buf: Buffer, offset: number): { folders: Folder[]; offset: number } {\n const folders: Folder[] = [];\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n if (propertyId === PropertyId.kFolder) {\n // Number of folders\n const numFoldersResult = readNumber(buf, offset);\n const numFolders = numFoldersResult.value;\n offset += numFoldersResult.bytesRead;\n\n // External flag\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External folders not supported', ErrorCode.CORRUPT_HEADER);\n }\n\n // Parse each folder\n for (let i = 0; i < numFolders; i++) {\n const folderResult = parseFolder(buf, offset);\n folders.push(folderResult.folder);\n offset = folderResult.offset;\n }\n } else if (propertyId === PropertyId.kCodersUnpackSize) {\n // Unpack sizes for each coder output\n for (let j = 0; j < folders.length; j++) {\n const folder = folders[j];\n folder.unpackSizes = [];\n // One unpack size per coder output stream\n let numOutputs = 0;\n for (let k = 0; k < folder.coders.length; k++) {\n numOutputs += folder.coders[k].numOutStreams;\n }\n for (let l = 0; l < numOutputs; l++) {\n const sizeResult = readNumber(buf, offset);\n folder.unpackSizes.push(sizeResult.value);\n offset += sizeResult.bytesRead;\n }\n }\n } else if (propertyId === PropertyId.kCRC) {\n // CRCs for folders\n const definedResult = readDefinedVector(buf, offset, folders.length);\n offset += definedResult.bytesRead;\n for (let m = 0; m < folders.length; m++) {\n folders[m].hasCRC = definedResult.defined[m];\n if (definedResult.defined[m]) {\n folders[m].unpackCRC = buf.readUInt32LE(offset);\n offset += 4;\n }\n }\n }\n }\n\n return { folders: folders, offset: offset };\n}\n\n/**\n * Parse a single Folder structure\n */\nfunction parseFolder(buf: Buffer, offset: number): { folder: Folder; offset: number } {\n // Number of coders\n const numCodersResult = readNumber(buf, offset);\n const numCoders = numCodersResult.value;\n offset += numCodersResult.bytesRead;\n\n const coders: Coder[] = [];\n let numInStreamsTotal = 0;\n let numOutStreamsTotal = 0;\n\n for (let i = 0; i < numCoders; i++) {\n const flags = buf[offset++];\n const idSize = flags & 0x0f;\n const isComplex = (flags & 0x10) !== 0;\n const hasAttributes = (flags & 0x20) !== 0;\n\n // Read codec ID\n const id: number[] = [];\n for (let j = 0; j < idSize; j++) {\n id.push(buf[offset++]);\n }\n\n let numInStreams = 1;\n let numOutStreams = 1;\n\n if (isComplex) {\n const inResult = readNumber(buf, offset);\n numInStreams = inResult.value;\n offset += inResult.bytesRead;\n\n const outResult = readNumber(buf, offset);\n numOutStreams = outResult.value;\n offset += outResult.bytesRead;\n }\n\n let properties: Buffer | undefined;\n if (hasAttributes) {\n const propsLenResult = readNumber(buf, offset);\n offset += propsLenResult.bytesRead;\n properties = buf.slice(offset, offset + propsLenResult.value);\n offset += propsLenResult.value;\n }\n\n coders.push({\n id: id,\n numInStreams: numInStreams,\n numOutStreams: numOutStreams,\n properties: properties,\n });\n\n numInStreamsTotal += numInStreams;\n numOutStreamsTotal += numOutStreams;\n }\n\n // Bind pairs\n const numBindPairs = numOutStreamsTotal - 1;\n const bindPairs: { inIndex: number; outIndex: number }[] = [];\n\n for (let k = 0; k < numBindPairs; k++) {\n const inIndexResult = readNumber(buf, offset);\n offset += inIndexResult.bytesRead;\n\n const outIndexResult = readNumber(buf, offset);\n offset += outIndexResult.bytesRead;\n\n bindPairs.push({\n inIndex: inIndexResult.value,\n outIndex: outIndexResult.value,\n });\n }\n\n // Packed stream indices\n const numPackedStreams = numInStreamsTotal - numBindPairs;\n const packedStreams: number[] = [];\n\n if (numPackedStreams === 1) {\n // Find the unbound input stream\n for (let m = 0; m < numInStreamsTotal; m++) {\n let isBound = false;\n for (let n = 0; n < bindPairs.length; n++) {\n if (bindPairs[n].inIndex === m) {\n isBound = true;\n break;\n }\n }\n if (!isBound) {\n packedStreams.push(m);\n break;\n }\n }\n } else {\n for (let p = 0; p < numPackedStreams; p++) {\n const indexResult = readNumber(buf, offset);\n packedStreams.push(indexResult.value);\n offset += indexResult.bytesRead;\n }\n }\n\n return {\n folder: {\n coders: coders,\n bindPairs: bindPairs,\n packedStreams: packedStreams,\n unpackSizes: [],\n hasCRC: false,\n },\n offset: offset,\n };\n}\n\n/**\n * Parse SubStreamsInfo block\n */\nfunction parseSubStreamsInfo(buf: Buffer, offset: number, folders: Folder[]): { numUnpackStreamsPerFolder: number[]; unpackSizes: number[]; unpackCRCs?: number[]; offset: number } {\n const numUnpackStreamsPerFolder: number[] = [];\n const unpackSizes: number[] = [];\n let unpackCRCs: number[] | undefined;\n\n // Default: 1 file per folder\n for (let i = 0; i < folders.length; i++) {\n numUnpackStreamsPerFolder.push(1);\n }\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n if (propertyId === PropertyId.kNumUnpackStream) {\n for (let j = 0; j < folders.length; j++) {\n const numResult = readNumber(buf, offset);\n numUnpackStreamsPerFolder[j] = numResult.value;\n offset += numResult.bytesRead;\n }\n } else if (propertyId === PropertyId.kSize) {\n for (let k = 0; k < folders.length; k++) {\n const numStreams = numUnpackStreamsPerFolder[k];\n if (numStreams === 0) continue;\n\n // Read sizes for all but last stream in folder (last is calculated)\n let remaining = folders[k].unpackSizes[folders[k].unpackSizes.length - 1];\n for (let l = 0; l < numStreams - 1; l++) {\n const sizeResult = readNumber(buf, offset);\n unpackSizes.push(sizeResult.value);\n remaining -= sizeResult.value;\n offset += sizeResult.bytesRead;\n }\n // Last stream size is remainder\n unpackSizes.push(remaining);\n }\n } else if (propertyId === PropertyId.kCRC) {\n // Count files that need CRC\n let numFiles = 0;\n for (let m = 0; m < folders.length; m++) {\n const numStreamsInFolder = numUnpackStreamsPerFolder[m];\n // Only count if folder doesn't have CRC or has multiple streams\n if (!folders[m].hasCRC || numStreamsInFolder > 1) {\n numFiles += numStreamsInFolder;\n }\n }\n\n unpackCRCs = [];\n const definedResult = readDefinedVector(buf, offset, numFiles);\n offset += definedResult.bytesRead;\n for (let n = 0; n < numFiles; n++) {\n if (definedResult.defined[n]) {\n unpackCRCs.push(buf.readUInt32LE(offset));\n offset += 4;\n } else {\n unpackCRCs.push(0);\n }\n }\n }\n }\n\n // If no sizes specified, use folder unpack sizes\n if (unpackSizes.length === 0) {\n for (let p = 0; p < folders.length; p++) {\n const folder = folders[p];\n unpackSizes.push(folder.unpackSizes[folder.unpackSizes.length - 1]);\n }\n }\n\n return { numUnpackStreamsPerFolder: numUnpackStreamsPerFolder, unpackSizes: unpackSizes, unpackCRCs: unpackCRCs, offset: offset };\n}\n\n/**\n * Parse FilesInfo block\n */\nfunction parseFilesInfo(buf: Buffer, offset: number): { files: FileInfo[]; offset: number } {\n // Number of files\n const numFilesResult = readNumber(buf, offset);\n const numFiles = numFilesResult.value;\n offset += numFilesResult.bytesRead;\n\n // Initialize files array\n const files: FileInfo[] = [];\n for (let i = 0; i < numFiles; i++) {\n files.push({\n name: '',\n size: 0,\n isDirectory: false,\n isAntiFile: false,\n hasStream: true,\n });\n }\n\n let emptyStreamFlags: boolean[] = [];\n let emptyFileFlags: boolean[] = [];\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n // Read property size\n const propSizeResult = readNumber(buf, offset);\n const propSize = propSizeResult.value;\n offset += propSizeResult.bytesRead;\n\n const propEnd = offset + propSize;\n\n switch (propertyId) {\n case PropertyId.kEmptyStream:\n emptyStreamFlags = readBoolVector(buf, offset, numFiles);\n // Mark files that don't have streams\n for (let j = 0; j < numFiles; j++) {\n files[j].hasStream = !emptyStreamFlags[j];\n }\n break;\n\n case PropertyId.kEmptyFile: {\n let numEmptyStreams = 0;\n for (let k = 0; k < emptyStreamFlags.length; k++) {\n if (emptyStreamFlags[k]) numEmptyStreams++;\n }\n emptyFileFlags = readBoolVector(buf, offset, numEmptyStreams);\n break;\n }\n\n case PropertyId.kAnti: {\n let numAnti = 0;\n for (let l = 0; l < emptyStreamFlags.length; l++) {\n if (emptyStreamFlags[l]) numAnti++;\n }\n const antiFlags = readBoolVector(buf, offset, numAnti);\n let antiIdx = 0;\n for (let m = 0; m < numFiles; m++) {\n if (emptyStreamFlags[m]) {\n files[m].isAntiFile = antiFlags[antiIdx++];\n }\n }\n break;\n }\n\n case PropertyId.kName:\n offset = parseFileNames(buf, offset, files);\n break;\n\n case PropertyId.kCTime:\n offset = parseFileTimes(buf, offset, files, 'ctime');\n break;\n\n case PropertyId.kATime:\n offset = parseFileTimes(buf, offset, files, 'atime');\n break;\n\n case PropertyId.kMTime:\n offset = parseFileTimes(buf, offset, files, 'mtime');\n break;\n\n case PropertyId.kWinAttributes:\n offset = parseAttributes(buf, offset, files);\n break;\n\n case PropertyId.kDummy:\n // Skip dummy bytes\n break;\n\n default:\n // Skip unknown properties\n break;\n }\n\n offset = propEnd;\n }\n\n // Determine directories from empty stream + not empty file\n let emptyIdx = 0;\n for (let n = 0; n < numFiles; n++) {\n if (emptyStreamFlags[n]) {\n // Empty stream - could be directory or empty file\n if (emptyIdx < emptyFileFlags.length && emptyFileFlags[emptyIdx]) {\n files[n].isDirectory = false; // Empty file\n } else {\n files[n].isDirectory = true; // Directory\n }\n emptyIdx++;\n }\n }\n\n return { files: files, offset: offset };\n}\n\n/**\n * Read a boolean vector (bit-packed)\n */\nfunction readBoolVector(buf: Buffer, offset: number, count: number): boolean[] {\n const result: boolean[] = [];\n let byteIdx = 0;\n let bitMask = 0x80;\n\n for (let i = 0; i < count; i++) {\n result.push((buf[offset + byteIdx] & bitMask) !== 0);\n bitMask = bitMask >>> 1;\n if (bitMask === 0) {\n bitMask = 0x80;\n byteIdx++;\n }\n }\n\n return result;\n}\n\n/**\n * Parse file names (UTF-16LE encoded)\n */\nfunction parseFileNames(buf: Buffer, offset: number, files: FileInfo[]): number {\n // External flag\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External file names not supported', ErrorCode.CORRUPT_HEADER);\n }\n\n // Names are UTF-16LE, null-terminated\n for (let i = 0; i < files.length; i++) {\n const nameChars: number[] = [];\n while (offset < buf.length) {\n const charCode = buf.readUInt16LE(offset);\n offset += 2;\n if (charCode === 0) break;\n nameChars.push(charCode);\n }\n files[i].name = String.fromCharCode.apply(null, nameChars);\n }\n\n return offset;\n}\n\n/**\n * Parse file times (Windows FILETIME format)\n */\nfunction parseFileTimes(buf: Buffer, offset: number, files: FileInfo[], timeType: 'ctime' | 'atime' | 'mtime'): number {\n // Read defined vector (allDefined byte + optional bitmask)\n const definedResult = readDefinedVector(buf, offset, files.length);\n offset += definedResult.bytesRead;\n\n // External flag - 0x00 means data follows inline, non-zero means external stream\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External file times not supported', ErrorCode.UNSUPPORTED_FEATURE);\n }\n\n // Read times\n for (let i = 0; i < files.length; i++) {\n if (definedResult.defined[i]) {\n const filetime = readUInt64LE(buf, offset);\n offset += 8;\n // Convert FILETIME (100ns since 1601) to JavaScript Date\n // FILETIME epoch: 1601-01-01\n // JS Date epoch: 1970-01-01\n // Difference: 11644473600 seconds\n const ms = filetime / 10000 - 11644473600000;\n files[i][timeType] = new Date(ms);\n }\n }\n\n return offset;\n}\n\n/**\n * Parse Windows file attributes\n */\nfunction parseAttributes(buf: Buffer, offset: number, files: FileInfo[]): number {\n // Read defined vector (allDefined byte + optional bitmask)\n const definedResult = readDefinedVector(buf, offset, files.length);\n offset += definedResult.bytesRead;\n\n // External flag - 0x00 means data follows inline, non-zero means external stream\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External file attributes not supported', ErrorCode.UNSUPPORTED_FEATURE);\n }\n\n // Read attributes\n for (let i = 0; i < files.length; i++) {\n if (definedResult.defined[i]) {\n files[i].attributes = buf.readUInt32LE(offset);\n offset += 4;\n }\n }\n\n return offset;\n}\n\n/**\n * Skip archive properties block\n */\nfunction skipArchiveProperties(buf: Buffer, offset: number): number {\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n const sizeResult = readNumber(buf, offset);\n offset += sizeResult.bytesRead + sizeResult.value;\n }\n return offset;\n}\n\n/**\n * Skip streams info block (for additional streams)\n */\nfunction skipStreamsInfo(buf: Buffer, offset: number): number {\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n // For nested structures, recurse\n if (propertyId === PropertyId.kPackInfo || propertyId === PropertyId.kUnpackInfo || propertyId === PropertyId.kSubStreamsInfo) {\n offset = skipStreamsInfo(buf, offset);\n }\n }\n return offset;\n}\n"],"names":["bufferEquals","readUInt64LE","verifyCrc32Region","createCodedError","ErrorCode","PropertyId","SEVENZ_MAGIC","readDefinedVector","readNumber","parseSignatureHeader","buf","INVALID_SIGNATURE","majorVersion","minorVersion","UNSUPPORTED_VERSION","startHeaderCRC","readUInt32LE","CRC_MISMATCH","nextHeaderOffset","nextHeaderSize","nextHeaderCRC","parseEncodedHeader","expectedCRC","length","offset","propertyId","kEncodedHeader","COMPRESSED_HEADER","kHeader","CORRUPT_HEADER","parseHeaderContent","result","filesInfo","kEnd","kArchiveProperties","skipArchiveProperties","kAdditionalStreamsInfo","skipStreamsInfo","kMainStreamsInfo","streamsResult","parseStreamsInfo","streamsInfo","info","kFilesInfo","filesResult","parseFilesInfo","files","packPos","packSizes","folders","numUnpackStreamsPerFolder","unpackSizes","kPackInfo","packResult","parsePackInfo","packCRCs","kUnpackInfo","unpackResult","parseUnpackInfo","kSubStreamsInfo","subResult","parseSubStreamsInfo","unpackCRCs","i","folder","finalSize","push","packPosResult","value","bytesRead","numPackResult","numPackStreams","kSize","sizeResult","kCRC","definedResult","j","defined","kFolder","numFoldersResult","numFolders","external","folderResult","parseFolder","kCodersUnpackSize","numOutputs","k","coders","numOutStreams","l","m","hasCRC","unpackCRC","numCodersResult","numCoders","numInStreamsTotal","numOutStreamsTotal","flags","idSize","isComplex","hasAttributes","id","numInStreams","inResult","outResult","properties","propsLenResult","slice","numBindPairs","bindPairs","inIndexResult","outIndexResult","inIndex","outIndex","numPackedStreams","packedStreams","isBound","n","p","indexResult","kNumUnpackStream","numResult","numStreams","remaining","numFiles","numStreamsInFolder","numFilesResult","name","size","isDirectory","isAntiFile","hasStream","emptyStreamFlags","emptyFileFlags","propSizeResult","propSize","propEnd","kEmptyStream","readBoolVector","kEmptyFile","numEmptyStreams","kAnti","numAnti","antiFlags","antiIdx","kName","parseFileNames","kCTime","parseFileTimes","kATime","kMTime","kWinAttributes","parseAttributes","kDummy","emptyIdx","count","byteIdx","bitMask","nameChars","charCode","readUInt16LE","String","fromCharCode","apply","timeType","UNSUPPORTED_FEATURE","filetime","ms","Date","attributes"],"mappings":"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"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/headers.ts"],"sourcesContent":["// 7z header parsing\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n\nimport { bufferEquals, readUInt64LE, verifyCrc32Region } from 'extract-base-iterator';\nimport { createCodedError, ErrorCode, PropertyId, SEVENZ_MAGIC } from './constants.ts';\nimport { readDefinedVector, readNumber } from './NumberCodec.ts';\n\n// Type definitions\nexport interface SignatureHeader {\n majorVersion: number;\n minorVersion: number;\n startHeaderCRC: number;\n nextHeaderOffset: number;\n nextHeaderSize: number;\n nextHeaderCRC: number;\n}\n\nexport interface Coder {\n id: number[]; // Codec ID bytes\n numInStreams: number; // Number of input streams\n numOutStreams: number; // Number of output streams\n properties?: Buffer; // Optional codec properties\n}\n\nexport interface Folder {\n coders: Coder[];\n bindPairs: { inIndex: number; outIndex: number }[];\n packedStreams: number[]; // Indices of packed streams\n unpackSizes: number[]; // Unpack size for each coder output\n unpackCRC?: number; // CRC of final unpacked data\n hasCRC: boolean;\n}\n\nexport interface StreamsInfo {\n packPos: number; // Position of packed data (relative to end of signature header)\n packSizes: number[]; // Sizes of packed streams\n packCRCs?: number[]; // Optional CRCs for packed streams\n folders: Folder[]; // Decompression info\n numUnpackStreamsPerFolder: number[]; // Number of files in each folder (for solid archives)\n unpackSizes: number[]; // Size of each unpacked file\n unpackCRCs?: number[]; // Optional CRCs for unpacked files\n}\n\nexport interface FileInfo {\n name: string;\n size: number;\n isDirectory: boolean;\n isAntiFile: boolean; // \"Anti\" items mark files to delete in delta archives\n hasStream: boolean; // False for empty files/directories\n crc?: number;\n ctime?: Date;\n atime?: Date;\n mtime?: Date;\n attributes?: number;\n}\n\nexport interface ArchiveHeader {\n signature: SignatureHeader;\n streamsInfo?: StreamsInfo;\n filesInfo: FileInfo[];\n}\n\n/**\n * Parse the signature header (first 32 bytes)\n */\nexport function parseSignatureHeader(buf: Buffer): SignatureHeader {\n // Verify magic bytes\n if (!bufferEquals(buf, 0, SEVENZ_MAGIC)) {\n throw createCodedError('Not a valid 7z archive', ErrorCode.INVALID_SIGNATURE);\n }\n\n // Read version\n const majorVersion = buf[6];\n const minorVersion = buf[7];\n\n // Version check - we support 0.x (current is 0.4)\n if (majorVersion > 0) {\n throw createCodedError(`Unsupported 7z version: ${majorVersion}.${minorVersion}`, ErrorCode.UNSUPPORTED_VERSION);\n }\n\n // Read start header CRC (CRC of the next 20 bytes)\n const startHeaderCRC = buf.readUInt32LE(8);\n\n // Verify start header CRC\n if (!verifyCrc32Region(buf, 12, 20, startHeaderCRC)) {\n throw createCodedError('Start header CRC mismatch', ErrorCode.CRC_MISMATCH);\n }\n\n // Read next header location\n const nextHeaderOffset = readUInt64LE(buf, 12);\n const nextHeaderSize = readUInt64LE(buf, 20);\n const nextHeaderCRC = buf.readUInt32LE(28);\n\n return {\n majorVersion: majorVersion,\n minorVersion: minorVersion,\n startHeaderCRC: startHeaderCRC,\n nextHeaderOffset: nextHeaderOffset,\n nextHeaderSize: nextHeaderSize,\n nextHeaderCRC: nextHeaderCRC,\n };\n}\n\n/**\n * Parse the encoded header (metadata block at end of archive)\n */\nexport function parseEncodedHeader(buf: Buffer, expectedCRC: number): { streamsInfo?: StreamsInfo; filesInfo: FileInfo[] } {\n // Verify CRC\n if (!verifyCrc32Region(buf, 0, buf.length, expectedCRC)) {\n throw createCodedError('Encoded header CRC mismatch', ErrorCode.CRC_MISMATCH);\n }\n\n let offset = 0;\n\n // Read property ID\n const propertyId = buf[offset++];\n\n // Handle kEncodedHeader - means the header itself is compressed\n if (propertyId === PropertyId.kEncodedHeader) {\n // Return indicator that we need to decompress\n throw createCodedError('Compressed header - needs decompression first', ErrorCode.COMPRESSED_HEADER);\n }\n\n // Should be kHeader\n if (propertyId !== PropertyId.kHeader) {\n throw createCodedError(`Expected kHeader, got ${propertyId}`, ErrorCode.CORRUPT_HEADER);\n }\n\n // Parse header contents (after kHeader byte)\n return parseHeaderContent(buf, offset);\n}\n\n/**\n * Parse header content (after kHeader byte has been read)\n * Used by parseEncodedHeader and for decompressed headers\n */\nexport function parseHeaderContent(buf: Buffer, offset: number): { streamsInfo?: StreamsInfo; filesInfo: FileInfo[] } {\n const result: { streamsInfo?: StreamsInfo; filesInfo: FileInfo[] } = {\n filesInfo: [],\n };\n\n // Parse header contents\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n switch (propertyId) {\n case PropertyId.kArchiveProperties:\n offset = skipArchiveProperties(buf, offset);\n break;\n case PropertyId.kAdditionalStreamsInfo:\n // Additional streams - skip for now\n offset = skipStreamsInfo(buf, offset);\n break;\n case PropertyId.kMainStreamsInfo: {\n const streamsResult = parseStreamsInfo(buf, offset);\n result.streamsInfo = streamsResult.info;\n offset = streamsResult.offset;\n break;\n }\n case PropertyId.kFilesInfo: {\n const filesResult = parseFilesInfo(buf, offset);\n result.filesInfo = filesResult.files;\n offset = filesResult.offset;\n break;\n }\n default:\n throw createCodedError(`Unknown property ID in header: ${propertyId}`, ErrorCode.CORRUPT_HEADER);\n }\n }\n\n return result;\n}\n\n/**\n * Parse StreamsInfo block\n */\nfunction parseStreamsInfo(buf: Buffer, offset: number): { info: StreamsInfo; offset: number } {\n const info: StreamsInfo = {\n packPos: 0,\n packSizes: [],\n folders: [],\n numUnpackStreamsPerFolder: [],\n unpackSizes: [],\n };\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n switch (propertyId) {\n case PropertyId.kPackInfo: {\n const packResult = parsePackInfo(buf, offset);\n info.packPos = packResult.packPos;\n info.packSizes = packResult.packSizes;\n info.packCRCs = packResult.packCRCs;\n offset = packResult.offset;\n break;\n }\n case PropertyId.kUnpackInfo: {\n const unpackResult = parseUnpackInfo(buf, offset);\n info.folders = unpackResult.folders;\n offset = unpackResult.offset;\n break;\n }\n case PropertyId.kSubStreamsInfo: {\n const subResult = parseSubStreamsInfo(buf, offset, info.folders);\n info.numUnpackStreamsPerFolder = subResult.numUnpackStreamsPerFolder;\n info.unpackSizes = subResult.unpackSizes;\n info.unpackCRCs = subResult.unpackCRCs;\n offset = subResult.offset;\n break;\n }\n default:\n throw createCodedError(`Unknown property ID in StreamsInfo: ${propertyId}`, ErrorCode.CORRUPT_HEADER);\n }\n }\n\n // If no SubStreamsInfo, each folder produces one file\n if (info.unpackSizes.length === 0 && info.folders.length > 0) {\n for (let i = 0; i < info.folders.length; i++) {\n const folder = info.folders[i];\n // Get the final unpack size (last coder's output)\n const finalSize = folder.unpackSizes[folder.unpackSizes.length - 1];\n info.unpackSizes.push(finalSize);\n info.numUnpackStreamsPerFolder.push(1);\n }\n }\n\n return { info: info, offset: offset };\n}\n\n/**\n * Parse PackInfo block\n */\nfunction parsePackInfo(buf: Buffer, offset: number): { packPos: number; packSizes: number[]; packCRCs?: number[]; offset: number } {\n // Pack position\n const packPosResult = readNumber(buf, offset);\n const packPos = packPosResult.value;\n offset += packPosResult.bytesRead;\n\n // Number of pack streams\n const numPackResult = readNumber(buf, offset);\n const numPackStreams = numPackResult.value;\n offset += numPackResult.bytesRead;\n\n const packSizes: number[] = [];\n let packCRCs: number[] | undefined;\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n if (propertyId === PropertyId.kSize) {\n for (let i = 0; i < numPackStreams; i++) {\n const sizeResult = readNumber(buf, offset);\n packSizes.push(sizeResult.value);\n offset += sizeResult.bytesRead;\n }\n } else if (propertyId === PropertyId.kCRC) {\n packCRCs = [];\n const definedResult = readDefinedVector(buf, offset, numPackStreams);\n offset += definedResult.bytesRead;\n for (let j = 0; j < numPackStreams; j++) {\n if (definedResult.defined[j]) {\n packCRCs.push(buf.readUInt32LE(offset));\n offset += 4;\n } else {\n packCRCs.push(0);\n }\n }\n }\n }\n\n return { packPos: packPos, packSizes: packSizes, packCRCs: packCRCs, offset: offset };\n}\n\n/**\n * Parse UnpackInfo block\n */\nfunction parseUnpackInfo(buf: Buffer, offset: number): { folders: Folder[]; offset: number } {\n const folders: Folder[] = [];\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n if (propertyId === PropertyId.kFolder) {\n // Number of folders\n const numFoldersResult = readNumber(buf, offset);\n const numFolders = numFoldersResult.value;\n offset += numFoldersResult.bytesRead;\n\n // External flag\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External folders not supported', ErrorCode.CORRUPT_HEADER);\n }\n\n // Parse each folder\n for (let i = 0; i < numFolders; i++) {\n const folderResult = parseFolder(buf, offset);\n folders.push(folderResult.folder);\n offset = folderResult.offset;\n }\n } else if (propertyId === PropertyId.kCodersUnpackSize) {\n // Unpack sizes for each coder output\n for (let j = 0; j < folders.length; j++) {\n const folder = folders[j];\n folder.unpackSizes = [];\n // One unpack size per coder output stream\n let numOutputs = 0;\n for (let k = 0; k < folder.coders.length; k++) {\n numOutputs += folder.coders[k].numOutStreams;\n }\n for (let l = 0; l < numOutputs; l++) {\n const sizeResult = readNumber(buf, offset);\n folder.unpackSizes.push(sizeResult.value);\n offset += sizeResult.bytesRead;\n }\n }\n } else if (propertyId === PropertyId.kCRC) {\n // CRCs for folders\n const definedResult = readDefinedVector(buf, offset, folders.length);\n offset += definedResult.bytesRead;\n for (let m = 0; m < folders.length; m++) {\n folders[m].hasCRC = definedResult.defined[m];\n if (definedResult.defined[m]) {\n folders[m].unpackCRC = buf.readUInt32LE(offset);\n offset += 4;\n }\n }\n }\n }\n\n return { folders: folders, offset: offset };\n}\n\n/**\n * Parse a single Folder structure\n */\nfunction parseFolder(buf: Buffer, offset: number): { folder: Folder; offset: number } {\n // Number of coders\n const numCodersResult = readNumber(buf, offset);\n const numCoders = numCodersResult.value;\n offset += numCodersResult.bytesRead;\n\n const coders: Coder[] = [];\n let numInStreamsTotal = 0;\n let numOutStreamsTotal = 0;\n\n for (let i = 0; i < numCoders; i++) {\n const flags = buf[offset++];\n const idSize = flags & 0x0f;\n const isComplex = (flags & 0x10) !== 0;\n const hasAttributes = (flags & 0x20) !== 0;\n\n // Read codec ID\n const id: number[] = [];\n for (let j = 0; j < idSize; j++) {\n id.push(buf[offset++]);\n }\n\n let numInStreams = 1;\n let numOutStreams = 1;\n\n if (isComplex) {\n const inResult = readNumber(buf, offset);\n numInStreams = inResult.value;\n offset += inResult.bytesRead;\n\n const outResult = readNumber(buf, offset);\n numOutStreams = outResult.value;\n offset += outResult.bytesRead;\n }\n\n let properties: Buffer | undefined;\n if (hasAttributes) {\n const propsLenResult = readNumber(buf, offset);\n offset += propsLenResult.bytesRead;\n properties = buf.slice(offset, offset + propsLenResult.value);\n offset += propsLenResult.value;\n }\n\n coders.push({\n id: id,\n numInStreams: numInStreams,\n numOutStreams: numOutStreams,\n properties: properties,\n });\n\n numInStreamsTotal += numInStreams;\n numOutStreamsTotal += numOutStreams;\n }\n\n // Bind pairs\n const numBindPairs = numOutStreamsTotal - 1;\n const bindPairs: { inIndex: number; outIndex: number }[] = [];\n\n for (let k = 0; k < numBindPairs; k++) {\n const inIndexResult = readNumber(buf, offset);\n offset += inIndexResult.bytesRead;\n\n const outIndexResult = readNumber(buf, offset);\n offset += outIndexResult.bytesRead;\n\n bindPairs.push({\n inIndex: inIndexResult.value,\n outIndex: outIndexResult.value,\n });\n }\n\n // Packed stream indices\n const numPackedStreams = numInStreamsTotal - numBindPairs;\n const packedStreams: number[] = [];\n\n if (numPackedStreams === 1) {\n // Find the unbound input stream\n for (let m = 0; m < numInStreamsTotal; m++) {\n let isBound = false;\n for (let n = 0; n < bindPairs.length; n++) {\n if (bindPairs[n].inIndex === m) {\n isBound = true;\n break;\n }\n }\n if (!isBound) {\n packedStreams.push(m);\n break;\n }\n }\n } else {\n for (let p = 0; p < numPackedStreams; p++) {\n const indexResult = readNumber(buf, offset);\n packedStreams.push(indexResult.value);\n offset += indexResult.bytesRead;\n }\n }\n\n return {\n folder: {\n coders: coders,\n bindPairs: bindPairs,\n packedStreams: packedStreams,\n unpackSizes: [],\n hasCRC: false,\n },\n offset: offset,\n };\n}\n\n/**\n * Parse SubStreamsInfo block\n */\nfunction parseSubStreamsInfo(buf: Buffer, offset: number, folders: Folder[]): { numUnpackStreamsPerFolder: number[]; unpackSizes: number[]; unpackCRCs?: number[]; offset: number } {\n const numUnpackStreamsPerFolder: number[] = [];\n const unpackSizes: number[] = [];\n let unpackCRCs: number[] | undefined;\n\n // Default: 1 file per folder\n for (let i = 0; i < folders.length; i++) {\n numUnpackStreamsPerFolder.push(1);\n }\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n if (propertyId === PropertyId.kNumUnpackStream) {\n for (let j = 0; j < folders.length; j++) {\n const numResult = readNumber(buf, offset);\n numUnpackStreamsPerFolder[j] = numResult.value;\n offset += numResult.bytesRead;\n }\n } else if (propertyId === PropertyId.kSize) {\n for (let k = 0; k < folders.length; k++) {\n const numStreams = numUnpackStreamsPerFolder[k];\n if (numStreams === 0) continue;\n\n // Read sizes for all but last stream in folder (last is calculated)\n let remaining = folders[k].unpackSizes[folders[k].unpackSizes.length - 1];\n for (let l = 0; l < numStreams - 1; l++) {\n const sizeResult = readNumber(buf, offset);\n unpackSizes.push(sizeResult.value);\n remaining -= sizeResult.value;\n offset += sizeResult.bytesRead;\n }\n // Last stream size is remainder\n unpackSizes.push(remaining);\n }\n } else if (propertyId === PropertyId.kCRC) {\n // Count files that need CRC\n let numFiles = 0;\n for (let m = 0; m < folders.length; m++) {\n const numStreamsInFolder = numUnpackStreamsPerFolder[m];\n // Only count if folder doesn't have CRC or has multiple streams\n if (!folders[m].hasCRC || numStreamsInFolder > 1) {\n numFiles += numStreamsInFolder;\n }\n }\n\n unpackCRCs = [];\n const definedResult = readDefinedVector(buf, offset, numFiles);\n offset += definedResult.bytesRead;\n for (let n = 0; n < numFiles; n++) {\n if (definedResult.defined[n]) {\n unpackCRCs.push(buf.readUInt32LE(offset));\n offset += 4;\n } else {\n unpackCRCs.push(0);\n }\n }\n }\n }\n\n // If no sizes specified, use folder unpack sizes\n if (unpackSizes.length === 0) {\n for (let p = 0; p < folders.length; p++) {\n const folder = folders[p];\n unpackSizes.push(folder.unpackSizes[folder.unpackSizes.length - 1]);\n }\n }\n\n return { numUnpackStreamsPerFolder: numUnpackStreamsPerFolder, unpackSizes: unpackSizes, unpackCRCs: unpackCRCs, offset: offset };\n}\n\n/**\n * Parse FilesInfo block\n */\nfunction parseFilesInfo(buf: Buffer, offset: number): { files: FileInfo[]; offset: number } {\n // Number of files\n const numFilesResult = readNumber(buf, offset);\n const numFiles = numFilesResult.value;\n offset += numFilesResult.bytesRead;\n\n // Initialize files array\n const files: FileInfo[] = [];\n for (let i = 0; i < numFiles; i++) {\n files.push({\n name: '',\n size: 0,\n isDirectory: false,\n isAntiFile: false,\n hasStream: true,\n });\n }\n\n let emptyStreamFlags: boolean[] = [];\n let emptyFileFlags: boolean[] = [];\n\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n\n // Read property size\n const propSizeResult = readNumber(buf, offset);\n const propSize = propSizeResult.value;\n offset += propSizeResult.bytesRead;\n\n const propEnd = offset + propSize;\n\n switch (propertyId) {\n case PropertyId.kEmptyStream:\n emptyStreamFlags = readBoolVector(buf, offset, numFiles);\n // Mark files that don't have streams\n for (let j = 0; j < numFiles; j++) {\n files[j].hasStream = !emptyStreamFlags[j];\n }\n break;\n\n case PropertyId.kEmptyFile: {\n let numEmptyStreams = 0;\n for (let k = 0; k < emptyStreamFlags.length; k++) {\n if (emptyStreamFlags[k]) numEmptyStreams++;\n }\n emptyFileFlags = readBoolVector(buf, offset, numEmptyStreams);\n break;\n }\n\n case PropertyId.kAnti: {\n let numAnti = 0;\n for (let l = 0; l < emptyStreamFlags.length; l++) {\n if (emptyStreamFlags[l]) numAnti++;\n }\n const antiFlags = readBoolVector(buf, offset, numAnti);\n let antiIdx = 0;\n for (let m = 0; m < numFiles; m++) {\n if (emptyStreamFlags[m]) {\n files[m].isAntiFile = antiFlags[antiIdx++];\n }\n }\n break;\n }\n\n case PropertyId.kName:\n offset = parseFileNames(buf, offset, files);\n break;\n\n case PropertyId.kCTime:\n offset = parseFileTimes(buf, offset, files, 'ctime');\n break;\n\n case PropertyId.kATime:\n offset = parseFileTimes(buf, offset, files, 'atime');\n break;\n\n case PropertyId.kMTime:\n offset = parseFileTimes(buf, offset, files, 'mtime');\n break;\n\n case PropertyId.kWinAttributes:\n offset = parseAttributes(buf, offset, files);\n break;\n\n case PropertyId.kDummy:\n // Skip dummy bytes\n break;\n\n default:\n // Skip unknown properties\n break;\n }\n\n offset = propEnd;\n }\n\n // Determine directories from empty stream + not empty file\n let emptyIdx = 0;\n for (let n = 0; n < numFiles; n++) {\n if (emptyStreamFlags[n]) {\n // Empty stream - could be directory or empty file\n if (emptyIdx < emptyFileFlags.length && emptyFileFlags[emptyIdx]) {\n files[n].isDirectory = false; // Empty file\n } else {\n files[n].isDirectory = true; // Directory\n }\n emptyIdx++;\n }\n }\n\n return { files: files, offset: offset };\n}\n\n/**\n * Read a boolean vector (bit-packed)\n */\nfunction readBoolVector(buf: Buffer, offset: number, count: number): boolean[] {\n const result: boolean[] = [];\n let byteIdx = 0;\n let bitMask = 0x80;\n\n for (let i = 0; i < count; i++) {\n result.push((buf[offset + byteIdx] & bitMask) !== 0);\n bitMask = bitMask >>> 1;\n if (bitMask === 0) {\n bitMask = 0x80;\n byteIdx++;\n }\n }\n\n return result;\n}\n\n/**\n * Parse file names (UTF-16LE encoded)\n */\nfunction parseFileNames(buf: Buffer, offset: number, files: FileInfo[]): number {\n // External flag\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External file names not supported', ErrorCode.CORRUPT_HEADER);\n }\n\n // Names are UTF-16LE, null-terminated\n for (let i = 0; i < files.length; i++) {\n const nameChars: number[] = [];\n while (offset < buf.length) {\n const charCode = buf.readUInt16LE(offset);\n offset += 2;\n if (charCode === 0) break;\n nameChars.push(charCode);\n }\n files[i].name = String.fromCharCode.apply(null, nameChars);\n }\n\n return offset;\n}\n\n/**\n * Parse file times (Windows FILETIME format)\n */\nfunction parseFileTimes(buf: Buffer, offset: number, files: FileInfo[], timeType: 'ctime' | 'atime' | 'mtime'): number {\n // Read defined vector (allDefined byte + optional bitmask)\n const definedResult = readDefinedVector(buf, offset, files.length);\n offset += definedResult.bytesRead;\n\n // External flag - 0x00 means data follows inline, non-zero means external stream\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External file times not supported', ErrorCode.UNSUPPORTED_FEATURE);\n }\n\n // Read times\n for (let i = 0; i < files.length; i++) {\n if (definedResult.defined[i]) {\n const filetime = readUInt64LE(buf, offset);\n offset += 8;\n // Convert FILETIME (100ns since 1601) to JavaScript Date\n // FILETIME epoch: 1601-01-01\n // JS Date epoch: 1970-01-01\n // Difference: 11644473600 seconds\n const ms = filetime / 10000 - 11644473600000;\n files[i][timeType] = new Date(ms);\n }\n }\n\n return offset;\n}\n\n/**\n * Parse Windows file attributes\n */\nfunction parseAttributes(buf: Buffer, offset: number, files: FileInfo[]): number {\n // Read defined vector (allDefined byte + optional bitmask)\n const definedResult = readDefinedVector(buf, offset, files.length);\n offset += definedResult.bytesRead;\n\n // External flag - 0x00 means data follows inline, non-zero means external stream\n const external = buf[offset++];\n if (external !== 0) {\n throw createCodedError('External file attributes not supported', ErrorCode.UNSUPPORTED_FEATURE);\n }\n\n // Read attributes\n for (let i = 0; i < files.length; i++) {\n if (definedResult.defined[i]) {\n files[i].attributes = buf.readUInt32LE(offset);\n offset += 4;\n }\n }\n\n return offset;\n}\n\n/**\n * Skip archive properties block\n */\nfunction skipArchiveProperties(buf: Buffer, offset: number): number {\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n const sizeResult = readNumber(buf, offset);\n offset += sizeResult.bytesRead + sizeResult.value;\n }\n return offset;\n}\n\n/**\n * Skip streams info block (for additional streams)\n */\nfunction skipStreamsInfo(buf: Buffer, offset: number): number {\n while (offset < buf.length) {\n const propertyId = buf[offset++];\n if (propertyId === PropertyId.kEnd) {\n break;\n }\n // For nested structures, recurse\n if (propertyId === PropertyId.kPackInfo || propertyId === PropertyId.kUnpackInfo || propertyId === PropertyId.kSubStreamsInfo) {\n offset = skipStreamsInfo(buf, offset);\n }\n }\n return offset;\n}\n"],"names":["bufferEquals","readUInt64LE","verifyCrc32Region","createCodedError","ErrorCode","PropertyId","SEVENZ_MAGIC","readDefinedVector","readNumber","parseSignatureHeader","buf","INVALID_SIGNATURE","majorVersion","minorVersion","UNSUPPORTED_VERSION","startHeaderCRC","readUInt32LE","CRC_MISMATCH","nextHeaderOffset","nextHeaderSize","nextHeaderCRC","parseEncodedHeader","expectedCRC","length","offset","propertyId","kEncodedHeader","COMPRESSED_HEADER","kHeader","CORRUPT_HEADER","parseHeaderContent","result","filesInfo","kEnd","kArchiveProperties","skipArchiveProperties","kAdditionalStreamsInfo","skipStreamsInfo","kMainStreamsInfo","streamsResult","parseStreamsInfo","streamsInfo","info","kFilesInfo","filesResult","parseFilesInfo","files","packPos","packSizes","folders","numUnpackStreamsPerFolder","unpackSizes","kPackInfo","packResult","parsePackInfo","packCRCs","kUnpackInfo","unpackResult","parseUnpackInfo","kSubStreamsInfo","subResult","parseSubStreamsInfo","unpackCRCs","i","folder","finalSize","push","packPosResult","value","bytesRead","numPackResult","numPackStreams","kSize","sizeResult","kCRC","definedResult","j","defined","kFolder","numFoldersResult","numFolders","external","folderResult","parseFolder","kCodersUnpackSize","numOutputs","k","coders","numOutStreams","l","m","hasCRC","unpackCRC","numCodersResult","numCoders","numInStreamsTotal","numOutStreamsTotal","flags","idSize","isComplex","hasAttributes","id","numInStreams","inResult","outResult","properties","propsLenResult","slice","numBindPairs","bindPairs","inIndexResult","outIndexResult","inIndex","outIndex","numPackedStreams","packedStreams","isBound","n","p","indexResult","kNumUnpackStream","numResult","numStreams","remaining","numFiles","numStreamsInFolder","numFilesResult","name","size","isDirectory","isAntiFile","hasStream","emptyStreamFlags","emptyFileFlags","propSizeResult","propSize","propEnd","kEmptyStream","readBoolVector","kEmptyFile","numEmptyStreams","kAnti","numAnti","antiFlags","antiIdx","kName","parseFileNames","kCTime","parseFileTimes","kATime","kMTime","kWinAttributes","parseAttributes","kDummy","emptyIdx","count","byteIdx","bitMask","nameChars","charCode","readUInt16LE","String","fromCharCode","apply","timeType","UNSUPPORTED_FEATURE","filetime","ms","Date","attributes"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/sevenz/index.ts"],"sourcesContent":["// 7z format parser exports\n// Only exports needed for public API - internal functions remain internal\n\n// Error types for handling specific error conditions\nexport type { CodedError } from './constants.ts';\nexport { createCodedError, ErrorCode } from './constants.ts';\n// Parser and sources for advanced users\nexport type { ArchiveSource, SevenZipEntry, VoidCallback } from './SevenZipParser.ts';\nexport { BufferSource, FileSource, SevenZipParser } from './SevenZipParser.ts';\n"],"names":["createCodedError","ErrorCode","BufferSource","FileSource","SevenZipParser"],"mappings":"AAAA,2BAA2B;AAC3B,0EAA0E;AAE1E,qDAAqD;AAErD,SAASA,gBAAgB,EAAEC,SAAS,QAAQ,iBAAiB;AAG7D,SAASC,YAAY,EAAEC,UAAU,EAAEC,cAAc,QAAQ,sBAAsB"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/index.ts"],"sourcesContent":["// 7z format parser exports\n// Only exports needed for public API - internal functions remain internal\n\n// Error types for handling specific error conditions\nexport type { CodedError } from './constants.ts';\nexport { createCodedError, ErrorCode } from './constants.ts';\n// Parser and sources for advanced users\nexport type { ArchiveSource, SevenZipEntry, VoidCallback } from './SevenZipParser.ts';\nexport { BufferSource, FileSource, SevenZipParser } from './SevenZipParser.ts';\n"],"names":["createCodedError","ErrorCode","BufferSource","FileSource","SevenZipParser"],"mappings":"AAAA,2BAA2B;AAC3B,0EAA0E;AAE1E,qDAAqD;AAErD,SAASA,gBAAgB,EAAEC,SAAS,QAAQ,iBAAiB;AAG7D,SAASC,YAAY,EAAEC,UAAU,EAAEC,cAAc,QAAQ,sBAAsB"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/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 const 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 let extraBytes = 0;\n let 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 const highPart = firstByte & (mask - 1);\n\n // Read extra bytes as LITTLE-ENDIAN\n let value = 0;\n for (let 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 const allDefined = buf[offset] !== 0;\n let bytesRead = 1;\n const defined: boolean[] = [];\n\n if (allDefined) {\n // All items are defined\n for (let i = 0; i < count; i++) {\n defined.push(true);\n }\n } else {\n // Read bitmask\n const bitsNeeded = count;\n const bytesNeeded = Math.ceil(bitsNeeded / 8);\n\n for (let byteIdx = 0; byteIdx < bytesNeeded; byteIdx++) {\n const byte = buf[offset + 1 + byteIdx];\n for (let 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 const values: number[] = [];\n let totalBytesRead = 0;\n\n for (let i = 0; i < count; i++) {\n const 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":["readUInt64LE","readNumber","buf","offset","firstByte","value","bytesRead","extraBytes","mask","highPart","i","readRawNumber","encodedSize","readBoolean","readDefinedVector","count","allDefined","defined","push","bitsNeeded","bytesNeeded","Math","ceil","byteIdx","byte","bit","length","readNumberArray","values","totalBytesRead","result"],"mappings":"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"}
{"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 const 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 let extraBytes = 0;\n let 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 const highPart = firstByte & (mask - 1);\n\n // Read extra bytes as LITTLE-ENDIAN\n let value = 0;\n for (let 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 const allDefined = buf[offset] !== 0;\n let bytesRead = 1;\n const defined: boolean[] = [];\n\n if (allDefined) {\n // All items are defined\n for (let i = 0; i < count; i++) {\n defined.push(true);\n }\n } else {\n // Read bitmask\n const bitsNeeded = count;\n const bytesNeeded = Math.ceil(bitsNeeded / 8);\n\n for (let byteIdx = 0; byteIdx < bytesNeeded; byteIdx++) {\n const byte = buf[offset + 1 + byteIdx];\n for (let 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 const values: number[] = [];\n let totalBytesRead = 0;\n\n for (let i = 0; i < count; i++) {\n const 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":["readUInt64LE","readNumber","buf","offset","firstByte","value","bytesRead","extraBytes","mask","highPart","i","readRawNumber","encodedSize","readBoolean","readDefinedVector","count","allDefined","defined","push","bitsNeeded","bytesNeeded","Math","ceil","byteIdx","byte","bit","length","readNumberArray","values","totalBytesRead","result"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/SevenZipIterator.ts"],"sourcesContent":["import BaseIterator, { Lock } from 'extract-base-iterator';\nimport { rmSync } from 'fs-remove-compat';\nimport fs from 'graceful-fs';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport shortHash from 'short-hash';\nimport tempSuffix from 'temp-suffix';\nimport { tmpdir } from './compat.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\nimport type { Entry, ExtractOptions } from './types.ts';\n\n/**\n * Internal iterator interface for SevenZipParser entries\n * @internal\n */\ninterface SevenZipFileIterator {\n next(): SevenZipEntry | null;\n getParser(): SevenZipParser;\n}\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<Entry> {\n lock: Lock | null;\n /** @internal - Do not use directly */\n _iterator: unknown;\n\n constructor(source: string | NodeJS.ReadableStream, options: ExtractOptions = {}) {\n super(options);\n this.lock = new Lock();\n this.lock.onDestroy = (err) => BaseIterator.prototype.end.call(this, err);\n const queue = new Queue(1);\n let cancelled = false;\n let archiveSource: ArchiveSource | null = null;\n const setup = (): void => {\n cancelled = true;\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 // Register cleanup for file descriptor\n this.lock.registerCleanup(() => {\n fs.closeSync(fd);\n });\n cb();\n });\n });\n });\n } else {\n // Stream input - write to temp file for random access\n // Register cleanup for source stream\n const stream = source as NodeJS.ReadableStream;\n this.lock.registerCleanup(() => {\n const s = stream as NodeJS.ReadableStream & { destroy?: () => void };\n if (typeof s.destroy === 'function') s.destroy();\n });\n\n const tempPath = path.join(tmpdir(), '7z-iterator', shortHash(process.cwd()), tempSuffix('tmp.7z'));\n queue.defer((cb: (err?: Error) => void) => {\n streamToSource(source, { tempPath }, (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\n // Register cleanup for file descriptor\n this.lock.registerCleanup(() => {\n fs.closeSync(result.fd);\n });\n\n // Register cleanup for temp file\n this.lock.registerCleanup(() => {\n try {\n rmSync(result.tempPath);\n } catch (_e) {\n /* ignore */\n }\n });\n\n cb();\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 const parser = new SevenZipParser(archiveSource);\n parser.parse((parseErr) => {\n if (parseErr) {\n cb(parseErr);\n return;\n }\n try {\n this._iterator = new EntryIterator(parser);\n cb();\n } catch (err) {\n cb(err as Error);\n }\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 /**\n * Check if streaming extraction is available for any folder in this archive.\n * Streaming is possible when folders use codecs like BZip2, Deflate, or Copy\n * that can decompress incrementally without buffering the entire input.\n *\n * @returns true if at least one folder supports streaming\n */\n canStream(): boolean {\n if (!this._iterator) return false;\n const parser = (this._iterator as SevenZipFileIterator).getParser();\n if (!parser) return false;\n\n const entries = parser.getEntries();\n const checkedFolders: { [key: number]: boolean } = {};\n\n for (let i = 0; i < entries.length; i++) {\n const folderIndex = entries[i]._folderIndex;\n if (folderIndex >= 0 && checkedFolders[folderIndex] === undefined) {\n checkedFolders[folderIndex] = parser.canStreamFolder(folderIndex);\n if (checkedFolders[folderIndex]) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Get entries sorted for optimal streaming extraction.\n *\n * Entries are sorted by:\n * 1. Folder index (process one folder at a time)\n * 2. Stream index within folder (for solid block streaming)\n *\n * This ordering allows multi-file solid folders to stream with\n * O(largest file) memory instead of O(folder size).\n *\n * @returns Array of entries in streaming order\n */\n getStreamingOrder(): SevenZipEntry[] {\n if (!this._iterator) return [];\n const parser = (this._iterator as SevenZipFileIterator).getParser();\n if (!parser) return [];\n\n const entries = parser.getEntries();\n\n // Create a copy and sort for streaming order\n const sorted: SevenZipEntry[] = [];\n for (let i = 0; i < entries.length; i++) {\n sorted.push(entries[i]);\n }\n\n sorted.sort((a, b) => {\n // First by folder index\n if (a._folderIndex !== b._folderIndex) {\n return a._folderIndex - b._folderIndex;\n }\n // Then by stream index within folder\n return a._streamIndexInFolder - b._streamIndexInFolder;\n });\n\n return sorted;\n }\n}\n"],"names":["BaseIterator","Lock","rmSync","fs","path","Queue","shortHash","tempSuffix","tmpdir","streamToSource","nextEntry","setPassword","FileSource","SevenZipParser","EntryIterator","next","index","entries","length","getParser","parser","getEntries","SevenZipIterator","end","err","lock","release","_iterator","canStream","checkedFolders","i","folderIndex","_folderIndex","undefined","canStreamFolder","getStreamingOrder","sorted","push","sort","a","b","_streamIndexInFolder","source","options","onDestroy","prototype","call","queue","cancelled","archiveSource","setup","processing","password","defer","cb","stat","statErr","stats","done","open","fd","size","registerCleanup","closeSync","stream","s","destroy","tempPath","join","process","cwd","result","Error","_e","parse","parseErr","await","remove"],"mappings":"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"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/SevenZipIterator.ts"],"sourcesContent":["import BaseIterator, { Lock } from 'extract-base-iterator';\nimport { rmSync } from 'fs-remove-compat';\nimport fs from 'graceful-fs';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport shortHash from 'short-hash';\nimport tempSuffix from 'temp-suffix';\nimport { tmpdir } from './compat.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\nimport type { Entry, ExtractOptions } from './types.ts';\n\n/**\n * Internal iterator interface for SevenZipParser entries\n * @internal\n */\ninterface SevenZipFileIterator {\n next(): SevenZipEntry | null;\n getParser(): SevenZipParser;\n}\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<Entry> {\n lock: Lock | null;\n /** @internal - Do not use directly */\n _iterator: unknown;\n\n constructor(source: string | NodeJS.ReadableStream, options: ExtractOptions = {}) {\n super(options);\n this.lock = new Lock();\n this.lock.onDestroy = (err) => BaseIterator.prototype.end.call(this, err);\n const queue = new Queue(1);\n let cancelled = false;\n let archiveSource: ArchiveSource | null = null;\n const setup = (): void => {\n cancelled = true;\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 // Register cleanup for file descriptor\n this.lock.registerCleanup(() => {\n fs.closeSync(fd);\n });\n cb();\n });\n });\n });\n } else {\n // Stream input - write to temp file for random access\n // Register cleanup for source stream\n const stream = source as NodeJS.ReadableStream;\n this.lock.registerCleanup(() => {\n const s = stream as NodeJS.ReadableStream & { destroy?: () => void };\n if (typeof s.destroy === 'function') s.destroy();\n });\n\n const tempPath = path.join(tmpdir(), '7z-iterator', shortHash(process.cwd()), tempSuffix('tmp.7z'));\n queue.defer((cb: (err?: Error) => void) => {\n streamToSource(source, { tempPath }, (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\n // Register cleanup for file descriptor\n this.lock.registerCleanup(() => {\n fs.closeSync(result.fd);\n });\n\n // Register cleanup for temp file\n this.lock.registerCleanup(() => {\n try {\n rmSync(result.tempPath);\n } catch (_e) {\n /* ignore */\n }\n });\n\n cb();\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 const parser = new SevenZipParser(archiveSource);\n parser.parse((parseErr) => {\n if (parseErr) {\n cb(parseErr);\n return;\n }\n try {\n this._iterator = new EntryIterator(parser);\n cb();\n } catch (err) {\n cb(err as Error);\n }\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 /**\n * Check if streaming extraction is available for any folder in this archive.\n * Streaming is possible when folders use codecs like BZip2, Deflate, or Copy\n * that can decompress incrementally without buffering the entire input.\n *\n * @returns true if at least one folder supports streaming\n */\n canStream(): boolean {\n if (!this._iterator) return false;\n const parser = (this._iterator as SevenZipFileIterator).getParser();\n if (!parser) return false;\n\n const entries = parser.getEntries();\n const checkedFolders: { [key: number]: boolean } = {};\n\n for (let i = 0; i < entries.length; i++) {\n const folderIndex = entries[i]._folderIndex;\n if (folderIndex >= 0 && checkedFolders[folderIndex] === undefined) {\n checkedFolders[folderIndex] = parser.canStreamFolder(folderIndex);\n if (checkedFolders[folderIndex]) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Get entries sorted for optimal streaming extraction.\n *\n * Entries are sorted by:\n * 1. Folder index (process one folder at a time)\n * 2. Stream index within folder (for solid block streaming)\n *\n * This ordering allows multi-file solid folders to stream with\n * O(largest file) memory instead of O(folder size).\n *\n * @returns Array of entries in streaming order\n */\n getStreamingOrder(): SevenZipEntry[] {\n if (!this._iterator) return [];\n const parser = (this._iterator as SevenZipFileIterator).getParser();\n if (!parser) return [];\n\n const entries = parser.getEntries();\n\n // Create a copy and sort for streaming order\n const sorted: SevenZipEntry[] = [];\n for (let i = 0; i < entries.length; i++) {\n sorted.push(entries[i]);\n }\n\n sorted.sort((a, b) => {\n // First by folder index\n if (a._folderIndex !== b._folderIndex) {\n return a._folderIndex - b._folderIndex;\n }\n // Then by stream index within folder\n return a._streamIndexInFolder - b._streamIndexInFolder;\n });\n\n return sorted;\n }\n}\n"],"names":["BaseIterator","Lock","rmSync","fs","path","Queue","shortHash","tempSuffix","tmpdir","streamToSource","nextEntry","setPassword","FileSource","SevenZipParser","EntryIterator","next","index","entries","length","getParser","parser","getEntries","SevenZipIterator","end","err","lock","release","_iterator","canStream","checkedFolders","i","folderIndex","_folderIndex","undefined","canStreamFolder","getStreamingOrder","sorted","push","sort","a","b","_streamIndexInFolder","source","options","onDestroy","prototype","call","queue","cancelled","archiveSource","setup","processing","password","defer","cb","stat","statErr","stats","done","open","fd","size","registerCleanup","closeSync","stream","s","destroy","tempPath","join","process","cwd","result","Error","_e","parse","parseErr","await","remove"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"sources":["/Users/kevin/Dev/iterators/7z-iterator/src/types.ts"],"sourcesContent":["export { DirectoryEntry, LinkEntry, Lock, SymbolicLinkEntry } from 'extract-base-iterator';\nexport { default as FileEntry } from './FileEntry.ts';\nexport type { SevenZipEntry } from './sevenz/SevenZipParser.ts';\n\nimport type { ExtractOptions as BaseExtractOptions, DirectoryEntry, LinkEntry, SymbolicLinkEntry } from 'extract-base-iterator';\nimport type FileEntry from './FileEntry.ts';\n\n// 7z-specific Entry union type with 7z-specific FileEntry\nexport type Entry = DirectoryEntry | FileEntry | LinkEntry | SymbolicLinkEntry;\n\n/**\n * Options for SevenZipIterator\n */\nexport interface ExtractOptions extends BaseExtractOptions {\n /**\n * Password for encrypted archives\n */\n password?: string;\n}\n\nexport type EntryCallback = (error?: Error, result?: IteratorResult<Entry>) => void;\n"],"names":["DirectoryEntry","LinkEntry","Lock","SymbolicLinkEntry","default","FileEntry"],"mappings":"AAAA,SAASA,cAAc,EAAEC,SAAS,EAAEC,IAAI,EAAEC,iBAAiB,QAAQ,wBAAwB;AAC3F,SAASC,WAAWC,SAAS,QAAQ,iBAAiB"}
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/types.ts"],"sourcesContent":["export { DirectoryEntry, LinkEntry, Lock, SymbolicLinkEntry } from 'extract-base-iterator';\nexport { default as FileEntry } from './FileEntry.ts';\nexport type { SevenZipEntry } from './sevenz/SevenZipParser.ts';\n\nimport type { ExtractOptions as BaseExtractOptions, DirectoryEntry, LinkEntry, SymbolicLinkEntry } from 'extract-base-iterator';\nimport type FileEntry from './FileEntry.ts';\n\n// 7z-specific Entry union type with 7z-specific FileEntry\nexport type Entry = DirectoryEntry | FileEntry | LinkEntry | SymbolicLinkEntry;\n\n/**\n * Options for SevenZipIterator\n */\nexport interface ExtractOptions extends BaseExtractOptions {\n /**\n * Password for encrypted archives\n */\n password?: string;\n}\n\nexport type EntryCallback = (error?: Error, result?: IteratorResult<Entry>) => void;\n"],"names":["DirectoryEntry","LinkEntry","Lock","SymbolicLinkEntry","default","FileEntry"],"mappings":"AAAA,SAASA,cAAc,EAAEC,SAAS,EAAEC,IAAI,EAAEC,iBAAiB,QAAQ,wBAAwB;AAC3F,SAASC,WAAWC,SAAS,QAAQ,iBAAiB"}
{
"name": "7z-iterator",
"version": "2.2.0",
"version": "2.2.1",
"description": "Extract contents from 7z archives using an iterator API. Pure JavaScript, works on Node.js 0.8+",

@@ -5,0 +5,0 @@ "keywords": [

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display