7z-iterator 2.2.7 → 2.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/cjs/FileEntry.js +30 -6
  2. package/dist/cjs/FileEntry.js.map +1 -1
  3. package/dist/cjs/SevenZipIterator.d.cts +1 -1
  4. package/dist/cjs/SevenZipIterator.d.ts +1 -1
  5. package/dist/cjs/SevenZipIterator.js +2 -5
  6. package/dist/cjs/SevenZipIterator.js.map +1 -1
  7. package/dist/cjs/lib/streamToSource.d.cts +1 -1
  8. package/dist/cjs/lib/streamToSource.d.ts +1 -1
  9. package/dist/cjs/lib/streamToSource.js +1 -1
  10. package/dist/cjs/lib/streamToSource.js.map +1 -1
  11. package/dist/cjs/nextEntry.d.cts +1 -1
  12. package/dist/cjs/nextEntry.d.ts +1 -1
  13. package/dist/cjs/nextEntry.js +8 -11
  14. package/dist/cjs/nextEntry.js.map +1 -1
  15. package/dist/cjs/sevenz/SevenZipParser.d.cts +1 -1
  16. package/dist/cjs/sevenz/SevenZipParser.d.ts +1 -1
  17. package/dist/cjs/sevenz/SevenZipParser.js +7 -6
  18. package/dist/cjs/sevenz/SevenZipParser.js.map +1 -1
  19. package/dist/cjs/sevenz/codecs/createBufferingDecoder.js +4 -9
  20. package/dist/cjs/sevenz/codecs/createBufferingDecoder.js.map +1 -1
  21. package/dist/cjs/sevenz/codecs/index.js +11 -7
  22. package/dist/cjs/sevenz/codecs/index.js.map +1 -1
  23. package/dist/cjs/sevenz/codecs/streams.js +8 -8
  24. package/dist/cjs/sevenz/codecs/streams.js.map +1 -1
  25. package/dist/cjs/types.d.cts +1 -1
  26. package/dist/cjs/types.d.ts +1 -1
  27. package/dist/cjs/types.js.map +1 -1
  28. package/dist/esm/FileEntry.js +6 -5
  29. package/dist/esm/FileEntry.js.map +1 -1
  30. package/dist/esm/SevenZipIterator.d.ts +1 -1
  31. package/dist/esm/SevenZipIterator.js +1 -4
  32. package/dist/esm/SevenZipIterator.js.map +1 -1
  33. package/dist/esm/lib/streamToSource.d.ts +1 -1
  34. package/dist/esm/lib/streamToSource.js +1 -1
  35. package/dist/esm/lib/streamToSource.js.map +1 -1
  36. package/dist/esm/nextEntry.d.ts +1 -1
  37. package/dist/esm/nextEntry.js +8 -11
  38. package/dist/esm/nextEntry.js.map +1 -1
  39. package/dist/esm/sevenz/SevenZipParser.d.ts +1 -1
  40. package/dist/esm/sevenz/SevenZipParser.js.map +1 -1
  41. package/dist/esm/sevenz/codecs/createBufferingDecoder.js +2 -7
  42. package/dist/esm/sevenz/codecs/createBufferingDecoder.js.map +1 -1
  43. package/dist/esm/sevenz/codecs/index.js +11 -7
  44. package/dist/esm/sevenz/codecs/index.js.map +1 -1
  45. package/dist/esm/types.d.ts +1 -1
  46. package/dist/esm/types.js.map +1 -1
  47. package/package.json +4 -1
@@ -24,11 +24,11 @@ function createInputStream(buffer, offset, length) {
24
24
  var end = Math.min(offset + length, buffer.length);
25
25
  var start = offset;
26
26
  return {
27
- readByte: function() {
27
+ readByte: function readByte() {
28
28
  if (start + pos >= end) return -1;
29
29
  return buffer[start + pos++];
30
30
  },
31
- read: function(buf, bufOffset, len) {
31
+ read: function read(buf, bufOffset, len) {
32
32
  var bytesRead = 0;
33
33
  while(bytesRead < len && start + pos < end){
34
34
  buf[bufOffset + bytesRead] = buffer[start + pos];
@@ -47,22 +47,22 @@ function createOutputStream(expectedSize) {
47
47
  var bufPos = 0;
48
48
  var bufLen = buffer.length;
49
49
  return {
50
- writeByte: function(b) {
50
+ writeByte: function writeByte(b) {
51
51
  if (bufPos < bufLen) {
52
52
  buffer[bufPos++] = b;
53
53
  }
54
54
  // Silently ignore overflow (should not happen with correct size)
55
55
  },
56
- write: function(buf, bufOffset, len) {
56
+ write: function write(buf, bufOffset, len) {
57
57
  for(var i = 0; i < len && bufPos < bufLen; i++){
58
58
  buffer[bufPos++] = buf[bufOffset + i];
59
59
  }
60
60
  return len;
61
61
  },
62
- flush: function() {
62
+ flush: function flush() {
63
63
  // No-op for pre-allocated buffer
64
64
  },
65
- toBuffer: function() {
65
+ toBuffer: function toBuffer() {
66
66
  // Return only the used portion
67
67
  return bufPos < buffer.length ? buffer.slice(0, bufPos) : buffer;
68
68
  }
@@ -74,7 +74,7 @@ function createOutputStream(expectedSize) {
74
74
  var currentChunk = (0, _extractbaseiterator.allocBufferUnsafe)(CHUNK_SIZE);
75
75
  var pos = 0;
76
76
  return {
77
- writeByte: function(b) {
77
+ writeByte: function writeByte(b) {
78
78
  currentChunk[pos++] = b;
79
79
  if (pos >= CHUNK_SIZE) {
80
80
  chunks.push(currentChunk);
@@ -88,7 +88,7 @@ function createOutputStream(expectedSize) {
88
88
  }
89
89
  return len;
90
90
  },
91
- flush: function() {
91
+ flush: function flush() {
92
92
  if (pos > 0) {
93
93
  // Only keep the used portion of the current chunk
94
94
  chunks.push(currentChunk.slice(0, pos));
@@ -1 +1 @@
1
- {"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
+ {"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,SAAVA;YACE,IAAID,QAAQJ,OAAOC,KAAK,OAAO,CAAC;YAChC,OAAOJ,MAAM,CAACO,QAAQJ,MAAM;QAC9B;QACAM,MAAM,SAANA,KAAOC,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,SAAXA,UAAYC;gBACV,IAAIH,SAASC,QAAQ;oBACnBjB,MAAM,CAACgB,SAAS,GAAGG;gBACrB;YACA,iEAAiE;YACnE;YACAC,OAAO,SAAPA,MAAQV,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,SAAPA;YACE,iCAAiC;YACnC;YACAC,UAAU,SAAVA;gBACE,+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,SAAXA,UAAYC;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,SAAPA;YACE,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"}
@@ -13,4 +13,4 @@ export interface ExtractOptions extends BaseExtractOptions {
13
13
  */
14
14
  password?: string;
15
15
  }
16
- export type EntryCallback = (error?: Error, result?: IteratorResult<Entry>) => void;
16
+ export type EntryCallback = (error?: Error | null, result?: IteratorResult<Entry>) => void;
@@ -13,4 +13,4 @@ export interface ExtractOptions extends BaseExtractOptions {
13
13
  */
14
14
  password?: string;
15
15
  }
16
- export type EntryCallback = (error?: Error, result?: IteratorResult<Entry>) => void;
16
+ export type EntryCallback = (error?: Error | null, result?: IteratorResult<Entry>) => void;
@@ -1 +1 @@
1
- {"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
+ {"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 | null, 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"}
@@ -12,15 +12,17 @@ let SevenZipFileEntry = class SevenZipFileEntry extends FileEntry {
12
12
  callback = typeof options === 'function' ? options : callback;
13
13
  options = typeof options === 'function' ? {} : options || {};
14
14
  if (typeof callback === 'function') {
15
- return FileEntry.prototype.create.call(this, dest, options, (err)=>{
15
+ const cb = (err)=>{
16
16
  callback(err);
17
17
  if (this.lock) {
18
18
  this.lock.release();
19
19
  this.lock = null;
20
20
  }
21
- });
21
+ };
22
+ super.create(dest, options, cb);
23
+ return;
22
24
  }
23
- return new Promise((resolve, reject)=>this.create(dest, options, (err, done)=>err ? reject(err) : resolve(done)));
25
+ return new Promise((resolve, reject)=>this.create(dest, options, (err)=>err ? reject(err) : resolve(true)));
24
26
  }
25
27
  _writeFile(fullPath, _options, callback) {
26
28
  if (!this.stream) {
@@ -29,7 +31,6 @@ let SevenZipFileEntry = class SevenZipFileEntry extends FileEntry {
29
31
  }
30
32
  const stream = this.stream;
31
33
  this.stream = null; // Prevent reuse
32
- // Use once since errors can come from either stream
33
34
  const cb = once((err)=>{
34
35
  err ? callback(err) : waitForAccess(fullPath, callback);
35
36
  });
@@ -60,7 +61,7 @@ let SevenZipFileEntry = class SevenZipFileEntry extends FileEntry {
60
61
  }
61
62
  }
62
63
  destroy() {
63
- FileEntry.prototype.destroy.call(this);
64
+ super.destroy();
64
65
  if (this.stream) {
65
66
  // Use destroy() to prevent decompression (our stream has custom destroy that sets destroyed flag)
66
67
  // Fallback to resume() for older Node versions without destroy()
@@ -1 +1 @@
1
- {"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) => this.create(dest, options, (err?: Error, done?: boolean) => (err ? reject(err) : resolve(done))));\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,SAAW,IAAI,CAACX,MAAM,CAACC,MAAMC,SAAS,CAACI,KAAaM,OAAoBN,MAAMK,OAAOL,OAAOI,QAAQE;IACnI;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;IAjFA,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;AA4EF;AA3FA,SAAqB9B,+BA2FpB"}
1
+ {"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 type { CallFn } from 'call-once-fn';\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 | null;\n private stream: NodeJS.ReadableStream | null;\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 const cb: NoParamCallback = (err?: Error | null) => {\n (callback as NoParamCallback)(err);\n if (this.lock) {\n this.lock.release();\n this.lock = null;\n }\n };\n super.create(dest, options as ExtractOptions, cb);\n return;\n }\n return new Promise((resolve, reject) => this.create(dest, options as ExtractOptions, (err?: Error | null) => (err ? reject(err) : resolve(true))));\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 const cb = once(((err?: Error | null) => {\n err ? callback(err) : waitForAccess(fullPath, callback);\n }) as unknown as CallFn) as unknown as (err?: Error | null) => void;\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 as unknown as CallFn);\n } catch (pipeErr) {\n cb(pipeErr as Error);\n }\n }\n\n destroy() {\n super.destroy();\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","cb","err","lock","release","Promise","resolve","reject","_writeFile","fullPath","_options","stream","Error","writeStream","createWriteStream","on","streamErr","ws","destroy","pipe","pipeErr","s","attributes","canStream","retain","_canStream"],"mappings":"AAAA;;;;;CAKC,GAGD,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,MAAMC,KAAsB,CAACC;gBAC1BF,SAA6BE;gBAC9B,IAAI,IAAI,CAACC,IAAI,EAAE;oBACb,IAAI,CAACA,IAAI,CAACC,OAAO;oBACjB,IAAI,CAACD,IAAI,GAAG;gBACd;YACF;YACA,KAAK,CAACN,OAAOC,MAAMC,SAA2BE;YAC9C;QACF;QACA,OAAO,IAAII,QAAQ,CAACC,SAASC,SAAW,IAAI,CAACV,MAAM,CAACC,MAAMC,SAA2B,CAACG,MAAwBA,MAAMK,OAAOL,OAAOI,QAAQ;IAC5I;IAEAE,WAAWC,QAAgB,EAAEC,QAAwB,EAAEV,QAAyB,EAAQ;QACtF,IAAI,CAAC,IAAI,CAACW,MAAM,EAAE;YAChBX,SAAS,IAAIY,MAAM;YACnB;QACF;QAEA,MAAMD,SAAS,IAAI,CAACA,MAAM;QAC1B,IAAI,CAACA,MAAM,GAAG,MAAM,gBAAgB;QAEpC,MAAMV,KAAKV,KAAM,CAACW;YAChBA,MAAMF,SAASE,OAAOT,cAAcgB,UAAUT;QAChD;QAEA,IAAI;YACF,MAAMa,cAAcnB,GAAGoB,iBAAiB,CAACL;YAEzC,2EAA2E;YAC3EE,OAAOI,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;gBAChDjB,GAAGe;YACL;YAEA,qDAAqD;YACrDL,OAAOQ,IAAI,CAACN;YACZlB,GAAGkB,aAAa;gBAAC;gBAAS;gBAAS;aAAS,EAAEZ;QAChD,EAAE,OAAOmB,SAAS;YAChBnB,GAAGmB;QACL;IACF;IAEAF,UAAU;QACR,KAAK,CAACA;QACN,IAAI,IAAI,CAACP,MAAM,EAAE;YACf,kGAAkG;YAClG,iEAAiE;YACjE,MAAMU,IAAI,IAAI,CAACV,MAAM;YACrB,IAAI,OAAOU,EAAEH,OAAO,KAAK,YAAY;gBACnCG,EAAEH,OAAO;YACX;YACA,IAAI,CAACP,MAAM,GAAG;QAChB;QACA,IAAI,IAAI,CAACR,IAAI,EAAE;YACb,IAAI,CAACA,IAAI,CAACC,OAAO;YACjB,IAAI,CAACD,IAAI,GAAG;QACd;IACF;IAlFA,YAAYmB,UAA0B,EAAEX,MAA6B,EAAER,IAAU,EAAEoB,SAAkB,CAAE;QACrG,KAAK,CAACD;QACN,IAAI,CAACX,MAAM,GAAGA;QACd,IAAI,CAACR,IAAI,GAAGA;QACZ,IAAI,CAACA,IAAI,CAACqB,MAAM;QAChB,IAAI,CAACC,UAAU,GAAGF;IACpB;AA6EF;AA5FA,SAAqB3B,+BA4FpB"}
@@ -6,7 +6,7 @@ export default class SevenZipIterator extends BaseIterator<Entry> {
6
6
  /** @internal - Do not use directly */
7
7
  _iterator: unknown;
8
8
  constructor(source: string | NodeJS.ReadableStream, options?: ExtractOptions);
9
- end(err?: Error): void;
9
+ end(err?: Error | null): void;
10
10
  /**
11
11
  * Check if streaming extraction is available for any folder in this archive.
12
12
  * Streaming is possible when folders use codecs like BZip2, Deflate, or Copy
@@ -33,7 +33,7 @@ let SevenZipIterator = class SevenZipIterator extends BaseIterator {
33
33
  if (this.lock) {
34
34
  const lock = this.lock;
35
35
  this.lock = null; // Clear before release to prevent re-entrancy
36
- lock.err = err;
36
+ lock.err = err !== null && err !== void 0 ? err : null;
37
37
  lock.release();
38
38
  }
39
39
  // Don't call base end here - Lock.__destroy() handles it
@@ -116,7 +116,6 @@ let SevenZipIterator = class SevenZipIterator extends BaseIterator {
116
116
  if (this.done || cancelled) return;
117
117
  if (err) return cb(err);
118
118
  archiveSource = new FileSource(fd, stats.size);
119
- // Register cleanup for file descriptor
120
119
  this.lock.registerCleanup(()=>{
121
120
  fs.closeSync(fd);
122
121
  });
@@ -141,11 +140,9 @@ let SevenZipIterator = class SevenZipIterator extends BaseIterator {
141
140
  if (err) return cb(err);
142
141
  if (!result) return cb(new Error('No result from streamToSource'));
143
142
  archiveSource = result.source;
144
- // Register cleanup for file descriptor
145
143
  this.lock.registerCleanup(()=>{
146
144
  fs.closeSync(result.fd);
147
145
  });
148
- // Register cleanup for temp file
149
146
  this.lock.registerCleanup(()=>{
150
147
  try {
151
148
  rmSync(result.tempPath);
@@ -1 +1 @@
1
- {"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
+ {"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: Error | null) => 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 | null) => void) => {\n fs.stat(source, (statErr, stats) => {\n if (this.done || cancelled) return;\n if (statErr) return cb(statErr);\n\n fs.open(source, 'r', (err, fd) => {\n if (this.done || cancelled) return;\n if (err) return cb(err);\n\n archiveSource = new FileSource(fd, stats.size);\n (this.lock as 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 as 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 | null) => void) => {\n streamToSource(source, { tempPath }, (err?: Error | null, 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 (this.lock as Lock).registerCleanup(() => {\n fs.closeSync(result.fd);\n });\n\n (this.lock as 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 | null) => 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 | null) => {\n this.processing.remove(setup);\n if (this.done || cancelled) return;\n err ? this.end(err) : this.push(nextEntry as unknown as Parameters<typeof this.push>[0]);\n });\n }\n\n end(err?: Error | null) {\n if (this.lock) {\n const lock = this.lock;\n this.lock = null; // Clear before release to prevent re-entrancy\n lock.err = err ?? null;\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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"}
@@ -7,7 +7,7 @@ export interface SourceResult {
7
7
  fd: number;
8
8
  tempPath: string;
9
9
  }
10
- export type Callback = (error?: Error, result?: SourceResult) => void;
10
+ export type Callback = (error?: Error | null, result?: SourceResult) => void;
11
11
  /**
12
12
  * Convert a stream to a FileSource by writing to temp file
13
13
  *
@@ -29,7 +29,7 @@ import { FileSource } from '../sevenz/SevenZipParser.js';
29
29
  fs.closeSync(fd);
30
30
  return end(statErr);
31
31
  }
32
- end(null, {
32
+ end(undefined, {
33
33
  source: new FileSource(fd, stats.size),
34
34
  fd: fd,
35
35
  tempPath: tempPath
@@ -1 +1 @@
1
- {"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
+ {"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 type { CallFn } from 'call-once-fn';\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 | null, 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 as unknown as CallFn) as unknown as 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(undefined, {\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 as unknown as CallFn);\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","undefined","source","size","onError","on"],"mappings":"AAAA,4EAA4E;AAE5E,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,IAAIiB,WAAW;wBACbC,QAAQ,IAAIxB,WAAWkB,IAAIG,MAAMI,IAAI;wBACrCP,IAAIA;wBACJb,UAAUA;oBACZ;gBACF;YACF;QACF;IACF;IAEA,SAASqB,QAAQT,GAAU;QACzBR,YAAYH,GAAG;QACfA,IAAIW;IACN;IAEAf,OAAOyB,EAAE,CAAC,QAAQhB;IAClBb,GAAGI,QAAQ;QAAC;KAAQ,EAAEwB;IACtB5B,GAAGI,QAAQ;QAAC;QAAO;QAAS;KAAS,EAAEa;AACzC"}
@@ -1,4 +1,4 @@
1
1
  import type SevenZipIterator from './SevenZipIterator.js';
2
2
  import type { Entry, EntryCallback } from './types.js';
3
- export type NextCallback = (error?: Error, entry?: Entry) => void;
3
+ export type NextCallback = (error?: Error | null, entry?: Entry) => void;
4
4
  export default function nextEntry<_T>(iterator: SevenZipIterator, callback: EntryCallback): void;
@@ -12,25 +12,22 @@ export default function nextEntry(iterator, callback) {
12
12
  let entry = null;
13
13
  entry = internalIter.next();
14
14
  const nextCallback = once((err, entry)=>{
15
- // keep processing
16
15
  if (entry) iterator.push(nextEntry);
17
- err ? callback(err) : callback(null, entry ? {
16
+ err ? callback(err) : callback(undefined, entry ? {
18
17
  done: false,
19
18
  value: entry
20
19
  } : {
21
20
  done: true,
22
- value: null
21
+ value: undefined
23
22
  });
24
23
  });
25
- // done: signal iteration is complete (guard against stale lock)
26
- if (!iterator.lock || iterator.isDone() || !entry) return callback(null, {
24
+ if (!iterator.lock || iterator.isDone() || !entry) return callback(undefined, {
27
25
  done: true,
28
- value: null
26
+ value: undefined
29
27
  });
30
- // Skip anti-files (these mark files to delete in delta archives)
31
28
  if (entry.isAntiFile) {
32
29
  iterator.push(nextEntry);
33
- return callback(null, null);
30
+ return callback();
34
31
  }
35
32
  // Determine type from entry
36
33
  const type = entry.type;
@@ -47,7 +44,7 @@ export default function nextEntry(iterator, callback) {
47
44
  switch(type){
48
45
  case 'directory':
49
46
  attributes.type = 'directory';
50
- return nextCallback(null, new DirectoryEntry(attributes));
47
+ return nextCallback(undefined, new DirectoryEntry(attributes));
51
48
  case 'link':
52
49
  {
53
50
  // For symlinks, the file content IS the symlink target path
@@ -66,7 +63,7 @@ export default function nextEntry(iterator, callback) {
66
63
  mode: attributes.mode,
67
64
  linkpath: linkpath
68
65
  };
69
- nextCallback(null, new SymbolicLinkEntry(linkAttributes));
66
+ nextCallback(undefined, new SymbolicLinkEntry(linkAttributes));
70
67
  });
71
68
  stream.on('error', (streamErr)=>{
72
69
  nextCallback(streamErr);
@@ -79,7 +76,7 @@ export default function nextEntry(iterator, callback) {
79
76
  attributes.size = entry.size;
80
77
  const parser = internalIter.getParser();
81
78
  const stream = parser.getEntryStream(entry);
82
- return nextCallback(null, new FileEntry(attributes, stream, iterator.lock, entry._canStream));
79
+ return nextCallback(undefined, new FileEntry(attributes, stream, iterator.lock, entry._canStream));
83
80
  }
84
81
  }
85
82
  return callback(new Error(`Unrecognized entry type: ${type}`));
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/nextEntry.ts"],"sourcesContent":["import once from 'call-once-fn';\nimport { type DirectoryAttributes, DirectoryEntry, type FileAttributes, type LinkAttributes, SymbolicLinkEntry } from 'extract-base-iterator';\nimport path from 'path';\nimport FileEntry from './FileEntry.ts';\nimport type SevenZipIterator from './SevenZipIterator.ts';\nimport { UnixMode } from './sevenz/constants.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 const defaultMode = type === 'directory' ? UnixMode.DEFAULT_DIR : UnixMode.DEFAULT_FILE;\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","UnixMode","nextEntry","iterator","callback","internalIter","_iterator","Error","entry","next","nextCallback","err","push","done","value","lock","isDone","isAntiFile","type","defaultMode","DEFAULT_DIR","DEFAULT_FILE","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;AAEvC,SAASC,QAAQ,QAAQ,wBAAwB;AAuBjD,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,eAAed,KAAK,CAACe,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,MAAMC,cAAcD,SAAS,cAAcjB,SAASmB,WAAW,GAAGnB,SAASoB,YAAY;IAEvF,iCAAiC;IACjC,oEAAoE;IACpE,MAAMC,YAAYd,MAAMe,KAAK,IAAI,IAAIC;IACrC,MAAMC,aAAqC;QACzC1B,MAAMS,MAAMT,IAAI,CAAC2B,KAAK,CAAC3B,KAAK4B,GAAG,EAAEC,MAAM,CAACC,SAASC,IAAI,CAAC/B,KAAK4B,GAAG;QAC9DI,UAAUvB,MAAMwB,IAAI;QACpBT,OAAOD,UAAUW,OAAO;QACxBC,MAAM1B,MAAM0B,IAAI,KAAKC,YAAY3B,MAAM0B,IAAI,GAAGf;IAChD;IAEA,OAAQD;QACN,KAAK;YACHO,WAAWP,IAAI,GAAG;YAClB,OAAOR,aAAa,MAAM,IAAIb,eAAe4B;QAE/C,KAAK;YAAQ;gBACX,4DAA4D;gBAC5D,6DAA6D;gBAC7D,MAAMW,SAAS/B,aAAagC,SAAS;gBACrC,MAAMC,SAASF,OAAOG,cAAc,CAAC/B;gBAErC,MAAMgC,SAAmB,EAAE;gBAE3BF,OAAOG,EAAE,CAAC,QAAQ,CAACC;oBACjBF,OAAO5B,IAAI,CAAC8B;gBACd;gBACAJ,OAAOG,EAAE,CAAC,OAAO;oBACf,MAAME,WAAWC,OAAOC,MAAM,CAACL,QAAQM,QAAQ,CAAC;oBAEhD,MAAMC,iBAAiC;wBACrChD,MAAM0B,WAAW1B,IAAI;wBACrBwB,OAAOE,WAAWF,KAAK;wBACvBW,MAAMT,WAAWS,IAAI;wBACrBS,UAAUA;oBACZ;oBAEAjC,aAAa,MAAM,IAAIZ,kBAAkBiD;gBAC3C;gBACAT,OAAOG,EAAE,CAAC,SAAS,CAACO;oBAClBtC,aAAasC;gBACf;gBACA;YACF;QAEA,KAAK;YAAQ;gBACXvB,WAAWP,IAAI,GAAG;gBAClBO,WAAWwB,IAAI,GAAGzC,MAAMyC,IAAI;gBAC5B,MAAMb,SAAS/B,aAAagC,SAAS;gBAErC,MAAMC,SAASF,OAAOG,cAAc,CAAC/B;gBACrC,OAAOE,aAAa,MAAM,IAAIV,UAAUyB,YAA8Ba,QAAQnC,SAASY,IAAI,EAAEP,MAAM0C,UAAU;YAC/G;IACF;IAEA,OAAO9C,SAAS,IAAIG,MAAM,CAAC,yBAAyB,EAAEW,MAAM;AAC9D"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/nextEntry.ts"],"sourcesContent":["import type { CallFn } from 'call-once-fn';\nimport once from 'call-once-fn';\nimport { type DirectoryAttributes, DirectoryEntry, type FileAttributes, type LinkAttributes, type Lock, SymbolicLinkEntry } from 'extract-base-iterator';\nimport path from 'path';\nimport FileEntry from './FileEntry.ts';\nimport type SevenZipIterator from './SevenZipIterator.ts';\nimport { UnixMode } from './sevenz/constants.ts';\nimport type { SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.ts';\nimport type { Entry, EntryCallback } from './types.ts';\n\nexport type NextCallback = (error?: Error | null, 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 | null, entry?: Entry) => {\n if (entry) iterator.push(nextEntry as unknown as Parameters<typeof iterator.push>[0]);\n err ? callback(err) : callback(undefined, entry ? { done: false, value: entry } : { done: true, value: undefined as unknown as Entry });\n }) as unknown as CallFn) as unknown as NextCallback;\n\n if (!iterator.lock || iterator.isDone() || !entry) return callback(undefined, { done: true, value: undefined as unknown as Entry });\n\n if (entry.isAntiFile) {\n iterator.push(nextEntry as unknown as Parameters<typeof iterator.push>[0]);\n return callback();\n }\n\n // Determine type from entry\n const type = entry.type;\n\n const defaultMode = type === 'directory' ? UnixMode.DEFAULT_DIR : UnixMode.DEFAULT_FILE;\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(undefined, 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(undefined, 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(undefined, new FileEntry(attributes as FileAttributes, stream, iterator.lock as Lock, entry._canStream));\n }\n }\n\n return callback(new Error(`Unrecognized entry type: ${type}`));\n}\n"],"names":["once","DirectoryEntry","SymbolicLinkEntry","path","FileEntry","UnixMode","nextEntry","iterator","callback","internalIter","_iterator","Error","entry","next","nextCallback","err","push","undefined","done","value","lock","isDone","isAntiFile","type","defaultMode","DEFAULT_DIR","DEFAULT_FILE","mtimeDate","mtime","Date","attributes","split","sep","filter","Boolean","join","basename","name","getTime","mode","parser","getParser","stream","getEntryStream","chunks","on","chunk","linkpath","Buffer","concat","toString","linkAttributes","streamErr","size","_canStream"],"mappings":"AACA,OAAOA,UAAU,eAAe;AAChC,SAAmCC,cAAc,EAAuDC,iBAAiB,QAAQ,wBAAwB;AACzJ,OAAOC,UAAU,OAAO;AACxB,OAAOC,eAAe,iBAAiB;AAEvC,SAASC,QAAQ,QAAQ,wBAAwB;AAuBjD,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,eAAed,KAAM,CAACe,KAAoBH;QAC9C,IAAIA,OAAOL,SAASS,IAAI,CAACV;QACzBS,MAAMP,SAASO,OAAOP,SAASS,WAAWL,QAAQ;YAAEM,MAAM;YAAOC,OAAOP;QAAM,IAAI;YAAEM,MAAM;YAAMC,OAAOF;QAA8B;IACvI;IAEA,IAAI,CAACV,SAASa,IAAI,IAAIb,SAASc,MAAM,MAAM,CAACT,OAAO,OAAOJ,SAASS,WAAW;QAAEC,MAAM;QAAMC,OAAOF;IAA8B;IAEjI,IAAIL,MAAMU,UAAU,EAAE;QACpBf,SAASS,IAAI,CAACV;QACd,OAAOE;IACT;IAEA,4BAA4B;IAC5B,MAAMe,OAAOX,MAAMW,IAAI;IAEvB,MAAMC,cAAcD,SAAS,cAAclB,SAASoB,WAAW,GAAGpB,SAASqB,YAAY;IAEvF,iCAAiC;IACjC,oEAAoE;IACpE,MAAMC,YAAYf,MAAMgB,KAAK,IAAI,IAAIC;IACrC,MAAMC,aAAqC;QACzC3B,MAAMS,MAAMT,IAAI,CAAC4B,KAAK,CAAC5B,KAAK6B,GAAG,EAAEC,MAAM,CAACC,SAASC,IAAI,CAAChC,KAAK6B,GAAG;QAC9DI,UAAUxB,MAAMyB,IAAI;QACpBT,OAAOD,UAAUW,OAAO;QACxBC,MAAM3B,MAAM2B,IAAI,KAAKtB,YAAYL,MAAM2B,IAAI,GAAGf;IAChD;IAEA,OAAQD;QACN,KAAK;YACHO,WAAWP,IAAI,GAAG;YAClB,OAAOT,aAAaG,WAAW,IAAIhB,eAAe6B;QAEpD,KAAK;YAAQ;gBACX,4DAA4D;gBAC5D,6DAA6D;gBAC7D,MAAMU,SAAS/B,aAAagC,SAAS;gBACrC,MAAMC,SAASF,OAAOG,cAAc,CAAC/B;gBAErC,MAAMgC,SAAmB,EAAE;gBAE3BF,OAAOG,EAAE,CAAC,QAAQ,CAACC;oBACjBF,OAAO5B,IAAI,CAAC8B;gBACd;gBACAJ,OAAOG,EAAE,CAAC,OAAO;oBACf,MAAME,WAAWC,OAAOC,MAAM,CAACL,QAAQM,QAAQ,CAAC;oBAEhD,MAAMC,iBAAiC;wBACrChD,MAAM2B,WAAW3B,IAAI;wBACrByB,OAAOE,WAAWF,KAAK;wBACvBW,MAAMT,WAAWS,IAAI;wBACrBQ,UAAUA;oBACZ;oBAEAjC,aAAaG,WAAW,IAAIf,kBAAkBiD;gBAChD;gBACAT,OAAOG,EAAE,CAAC,SAAS,CAACO;oBAClBtC,aAAasC;gBACf;gBACA;YACF;QAEA,KAAK;YAAQ;gBACXtB,WAAWP,IAAI,GAAG;gBAClBO,WAAWuB,IAAI,GAAGzC,MAAMyC,IAAI;gBAC5B,MAAMb,SAAS/B,aAAagC,SAAS;gBAErC,MAAMC,SAASF,OAAOG,cAAc,CAAC/B;gBACrC,OAAOE,aAAaG,WAAW,IAAIb,UAAU0B,YAA8BY,QAAQnC,SAASa,IAAI,EAAUR,MAAM0C,UAAU;YAC5H;IACF;IAEA,OAAO9C,SAAS,IAAIG,MAAM,CAAC,yBAAyB,EAAEY,MAAM;AAC9D"}
@@ -165,7 +165,7 @@ export declare class SevenZipParser {
165
165
  output: Readable;
166
166
  pause: () => void;
167
167
  resume: () => void;
168
- destroy: (err?: Error) => void;
168
+ destroy: (err?: Error | null) => void;
169
169
  };
170
170
  /**
171
171
  * Get a streaming entry stream (Promise-based API).