7z-iterator 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/dist/cjs/FileEntry.d.cts +12 -4
  2. package/dist/cjs/FileEntry.d.ts +12 -4
  3. package/dist/cjs/FileEntry.js +52 -24
  4. package/dist/cjs/FileEntry.js.map +1 -1
  5. package/dist/cjs/SevenZipIterator.d.cts +25 -2
  6. package/dist/cjs/SevenZipIterator.d.ts +25 -2
  7. package/dist/cjs/SevenZipIterator.js +68 -21
  8. package/dist/cjs/SevenZipIterator.js.map +1 -1
  9. package/dist/cjs/compat.js +1 -8
  10. package/dist/cjs/compat.js.map +1 -1
  11. package/dist/cjs/index.d.cts +0 -2
  12. package/dist/cjs/index.d.ts +0 -2
  13. package/dist/cjs/index.js +3 -12
  14. package/dist/cjs/index.js.map +1 -1
  15. package/dist/cjs/lib/streamToSource.d.cts +8 -11
  16. package/dist/cjs/lib/streamToSource.d.ts +8 -11
  17. package/dist/cjs/lib/streamToSource.js +21 -67
  18. package/dist/cjs/lib/streamToSource.js.map +1 -1
  19. package/dist/cjs/lzma/Lzma2ChunkParser.d.cts +73 -0
  20. package/dist/cjs/lzma/Lzma2ChunkParser.d.ts +73 -0
  21. package/dist/cjs/lzma/Lzma2ChunkParser.js +148 -0
  22. package/dist/cjs/lzma/Lzma2ChunkParser.js.map +1 -0
  23. package/dist/cjs/lzma/index.d.cts +13 -0
  24. package/dist/cjs/lzma/index.d.ts +13 -0
  25. package/dist/cjs/lzma/index.js +63 -0
  26. package/dist/cjs/lzma/index.js.map +1 -0
  27. package/dist/cjs/lzma/stream/transforms.d.cts +38 -0
  28. package/dist/cjs/lzma/stream/transforms.d.ts +38 -0
  29. package/dist/cjs/lzma/stream/transforms.js +149 -0
  30. package/dist/cjs/lzma/stream/transforms.js.map +1 -0
  31. package/dist/cjs/lzma/sync/Lzma2Decoder.d.cts +30 -0
  32. package/dist/cjs/lzma/sync/Lzma2Decoder.d.ts +30 -0
  33. package/dist/cjs/lzma/sync/Lzma2Decoder.js +135 -0
  34. package/dist/cjs/lzma/sync/Lzma2Decoder.js.map +1 -0
  35. package/dist/cjs/lzma/sync/LzmaDecoder.d.cts +82 -0
  36. package/dist/cjs/lzma/sync/LzmaDecoder.d.ts +82 -0
  37. package/dist/cjs/lzma/sync/LzmaDecoder.js +440 -0
  38. package/dist/cjs/lzma/sync/LzmaDecoder.js.map +1 -0
  39. package/dist/cjs/lzma/sync/RangeDecoder.d.cts +69 -0
  40. package/dist/cjs/lzma/sync/RangeDecoder.d.ts +69 -0
  41. package/dist/cjs/lzma/sync/RangeDecoder.js +162 -0
  42. package/dist/cjs/lzma/sync/RangeDecoder.js.map +1 -0
  43. package/dist/cjs/lzma/types.d.cts +110 -0
  44. package/dist/cjs/lzma/types.d.ts +110 -0
  45. package/dist/cjs/lzma/types.js +264 -0
  46. package/dist/cjs/lzma/types.js.map +1 -0
  47. package/dist/cjs/nextEntry.js +24 -26
  48. package/dist/cjs/nextEntry.js.map +1 -1
  49. package/dist/cjs/sevenz/ArchiveSource.d.cts +16 -0
  50. package/dist/cjs/sevenz/ArchiveSource.d.ts +16 -0
  51. package/dist/cjs/sevenz/ArchiveSource.js +69 -0
  52. package/dist/cjs/sevenz/ArchiveSource.js.map +1 -1
  53. package/dist/cjs/sevenz/FolderStreamSplitter.d.cts +101 -0
  54. package/dist/cjs/sevenz/FolderStreamSplitter.d.ts +101 -0
  55. package/dist/cjs/sevenz/FolderStreamSplitter.js +229 -0
  56. package/dist/cjs/sevenz/FolderStreamSplitter.js.map +1 -0
  57. package/dist/cjs/sevenz/SevenZipParser.d.cts +71 -10
  58. package/dist/cjs/sevenz/SevenZipParser.d.ts +71 -10
  59. package/dist/cjs/sevenz/SevenZipParser.js +574 -203
  60. package/dist/cjs/sevenz/SevenZipParser.js.map +1 -1
  61. package/dist/cjs/sevenz/codecs/BZip2.js +2 -1
  62. package/dist/cjs/sevenz/codecs/BZip2.js.map +1 -1
  63. package/dist/cjs/sevenz/codecs/Bcj.d.cts +5 -4
  64. package/dist/cjs/sevenz/codecs/Bcj.d.ts +5 -4
  65. package/dist/cjs/sevenz/codecs/Bcj.js +102 -8
  66. package/dist/cjs/sevenz/codecs/Bcj.js.map +1 -1
  67. package/dist/cjs/sevenz/codecs/BcjArm.d.cts +5 -4
  68. package/dist/cjs/sevenz/codecs/BcjArm.d.ts +5 -4
  69. package/dist/cjs/sevenz/codecs/BcjArm.js +51 -9
  70. package/dist/cjs/sevenz/codecs/BcjArm.js.map +1 -1
  71. package/dist/cjs/sevenz/codecs/Copy.d.cts +2 -4
  72. package/dist/cjs/sevenz/codecs/Copy.d.ts +2 -4
  73. package/dist/cjs/sevenz/codecs/Copy.js +2 -15
  74. package/dist/cjs/sevenz/codecs/Copy.js.map +1 -1
  75. package/dist/cjs/sevenz/codecs/Deflate.d.cts +6 -4
  76. package/dist/cjs/sevenz/codecs/Deflate.d.ts +6 -4
  77. package/dist/cjs/sevenz/codecs/Deflate.js +4 -9
  78. package/dist/cjs/sevenz/codecs/Deflate.js.map +1 -1
  79. package/dist/cjs/sevenz/codecs/Delta.d.cts +5 -4
  80. package/dist/cjs/sevenz/codecs/Delta.d.ts +5 -4
  81. package/dist/cjs/sevenz/codecs/Delta.js +29 -10
  82. package/dist/cjs/sevenz/codecs/Delta.js.map +1 -1
  83. package/dist/cjs/sevenz/codecs/Lzma.d.cts +5 -2
  84. package/dist/cjs/sevenz/codecs/Lzma.d.ts +5 -2
  85. package/dist/cjs/sevenz/codecs/Lzma.js +13 -28
  86. package/dist/cjs/sevenz/codecs/Lzma.js.map +1 -1
  87. package/dist/cjs/sevenz/codecs/Lzma2.d.cts +9 -3
  88. package/dist/cjs/sevenz/codecs/Lzma2.d.ts +9 -3
  89. package/dist/cjs/sevenz/codecs/Lzma2.js +17 -198
  90. package/dist/cjs/sevenz/codecs/Lzma2.js.map +1 -1
  91. package/dist/cjs/sevenz/codecs/createBufferingDecoder.d.cts +2 -2
  92. package/dist/cjs/sevenz/codecs/createBufferingDecoder.d.ts +2 -2
  93. package/dist/cjs/sevenz/codecs/createBufferingDecoder.js +2 -15
  94. package/dist/cjs/sevenz/codecs/createBufferingDecoder.js.map +1 -1
  95. package/dist/cjs/types.d.cts +2 -16
  96. package/dist/cjs/types.d.ts +2 -16
  97. package/dist/cjs/types.js.map +1 -1
  98. package/dist/esm/FileEntry.d.ts +12 -4
  99. package/dist/esm/FileEntry.js +52 -26
  100. package/dist/esm/FileEntry.js.map +1 -1
  101. package/dist/esm/SevenZipIterator.d.ts +25 -2
  102. package/dist/esm/SevenZipIterator.js +69 -22
  103. package/dist/esm/SevenZipIterator.js.map +1 -1
  104. package/dist/esm/compat.js +1 -8
  105. package/dist/esm/compat.js.map +1 -1
  106. package/dist/esm/index.d.ts +0 -2
  107. package/dist/esm/index.js +0 -1
  108. package/dist/esm/index.js.map +1 -1
  109. package/dist/esm/lib/streamToSource.d.ts +8 -11
  110. package/dist/esm/lib/streamToSource.js +22 -68
  111. package/dist/esm/lib/streamToSource.js.map +1 -1
  112. package/dist/esm/lzma/Lzma2ChunkParser.d.ts +73 -0
  113. package/dist/esm/lzma/Lzma2ChunkParser.js +137 -0
  114. package/dist/esm/lzma/Lzma2ChunkParser.js.map +1 -0
  115. package/dist/esm/lzma/index.d.ts +13 -0
  116. package/dist/esm/lzma/index.js +15 -0
  117. package/dist/esm/lzma/index.js.map +1 -0
  118. package/dist/esm/lzma/stream/transforms.d.ts +38 -0
  119. package/dist/esm/lzma/stream/transforms.js +150 -0
  120. package/dist/esm/lzma/stream/transforms.js.map +1 -0
  121. package/dist/esm/lzma/sync/Lzma2Decoder.d.ts +30 -0
  122. package/dist/esm/lzma/sync/Lzma2Decoder.js +115 -0
  123. package/dist/esm/lzma/sync/Lzma2Decoder.js.map +1 -0
  124. package/dist/esm/lzma/sync/LzmaDecoder.d.ts +82 -0
  125. package/dist/esm/lzma/sync/LzmaDecoder.js +403 -0
  126. package/dist/esm/lzma/sync/LzmaDecoder.js.map +1 -0
  127. package/dist/esm/lzma/sync/RangeDecoder.d.ts +69 -0
  128. package/dist/esm/lzma/sync/RangeDecoder.js +132 -0
  129. package/dist/esm/lzma/sync/RangeDecoder.js.map +1 -0
  130. package/dist/esm/lzma/types.d.ts +110 -0
  131. package/dist/esm/lzma/types.js +154 -0
  132. package/dist/esm/lzma/types.js.map +1 -0
  133. package/dist/esm/nextEntry.js +24 -26
  134. package/dist/esm/nextEntry.js.map +1 -1
  135. package/dist/esm/sevenz/ArchiveSource.d.ts +16 -0
  136. package/dist/esm/sevenz/ArchiveSource.js +70 -1
  137. package/dist/esm/sevenz/ArchiveSource.js.map +1 -1
  138. package/dist/esm/sevenz/FolderStreamSplitter.d.ts +101 -0
  139. package/dist/esm/sevenz/FolderStreamSplitter.js +207 -0
  140. package/dist/esm/sevenz/FolderStreamSplitter.js.map +1 -0
  141. package/dist/esm/sevenz/SevenZipParser.d.ts +71 -10
  142. package/dist/esm/sevenz/SevenZipParser.js +414 -198
  143. package/dist/esm/sevenz/SevenZipParser.js.map +1 -1
  144. package/dist/esm/sevenz/codecs/BZip2.js +2 -1
  145. package/dist/esm/sevenz/codecs/BZip2.js.map +1 -1
  146. package/dist/esm/sevenz/codecs/Bcj.d.ts +5 -4
  147. package/dist/esm/sevenz/codecs/Bcj.js +106 -6
  148. package/dist/esm/sevenz/codecs/Bcj.js.map +1 -1
  149. package/dist/esm/sevenz/codecs/BcjArm.d.ts +5 -4
  150. package/dist/esm/sevenz/codecs/BcjArm.js +55 -7
  151. package/dist/esm/sevenz/codecs/BcjArm.js.map +1 -1
  152. package/dist/esm/sevenz/codecs/Copy.d.ts +2 -4
  153. package/dist/esm/sevenz/codecs/Copy.js +1 -9
  154. package/dist/esm/sevenz/codecs/Copy.js.map +1 -1
  155. package/dist/esm/sevenz/codecs/Deflate.d.ts +6 -4
  156. package/dist/esm/sevenz/codecs/Deflate.js +9 -7
  157. package/dist/esm/sevenz/codecs/Deflate.js.map +1 -1
  158. package/dist/esm/sevenz/codecs/Delta.d.ts +5 -4
  159. package/dist/esm/sevenz/codecs/Delta.js +33 -8
  160. package/dist/esm/sevenz/codecs/Delta.js.map +1 -1
  161. package/dist/esm/sevenz/codecs/Lzma.d.ts +5 -2
  162. package/dist/esm/sevenz/codecs/Lzma.js +17 -24
  163. package/dist/esm/sevenz/codecs/Lzma.js.map +1 -1
  164. package/dist/esm/sevenz/codecs/Lzma2.d.ts +9 -3
  165. package/dist/esm/sevenz/codecs/Lzma2.js +15 -196
  166. package/dist/esm/sevenz/codecs/Lzma2.js.map +1 -1
  167. package/dist/esm/sevenz/codecs/createBufferingDecoder.d.ts +2 -2
  168. package/dist/esm/sevenz/codecs/createBufferingDecoder.js +1 -9
  169. package/dist/esm/sevenz/codecs/createBufferingDecoder.js.map +1 -1
  170. package/dist/esm/types.d.ts +2 -16
  171. package/dist/esm/types.js.map +1 -1
  172. package/package.json +3 -3
  173. package/assets/lzma-purejs/LICENSE +0 -11
  174. package/assets/lzma-purejs/index.js +0 -19
  175. package/assets/lzma-purejs/lib/LZ/OutWindow.js +0 -78
  176. package/assets/lzma-purejs/lib/LZ.js +0 -6
  177. package/assets/lzma-purejs/lib/LZMA/Base.js +0 -48
  178. package/assets/lzma-purejs/lib/LZMA/Decoder.js +0 -328
  179. package/assets/lzma-purejs/lib/LZMA.js +0 -6
  180. package/assets/lzma-purejs/lib/RangeCoder/BitTreeDecoder.js +0 -41
  181. package/assets/lzma-purejs/lib/RangeCoder/Decoder.js +0 -58
  182. package/assets/lzma-purejs/lib/RangeCoder/Encoder.js +0 -106
  183. package/assets/lzma-purejs/lib/RangeCoder.js +0 -10
  184. package/assets/lzma-purejs/lib/Stream.js +0 -41
  185. package/assets/lzma-purejs/lib/Util.js +0 -114
  186. package/assets/lzma-purejs/lib/makeBuffer.js +0 -25
  187. package/assets/lzma-purejs/package-lock.json +0 -13
  188. package/assets/lzma-purejs/package.json +0 -8
@@ -1,11 +1,19 @@
1
+ /**
2
+ * FileEntry for 7z archives
3
+ *
4
+ * Wraps a lazy stream - decompression happens when the stream is read.
5
+ * API consistent with zip-iterator and tar-iterator.
6
+ */
1
7
  import { type FileAttributes, FileEntry, type Lock, type NoParamCallback } from 'extract-base-iterator';
2
- import type { SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.js';
3
8
  import type { ExtractOptions } from './types.js';
4
9
  export default class SevenZipFileEntry extends FileEntry {
5
10
  private lock;
6
- private entry;
7
- private parser;
8
- constructor(attributes: FileAttributes, entry: SevenZipEntry, parser: SevenZipParser, lock: Lock);
11
+ private stream;
12
+ /**
13
+ * Whether this entry's folder supports streaming decompression.
14
+ */
15
+ readonly _canStream: boolean;
16
+ constructor(attributes: FileAttributes, stream: NodeJS.ReadableStream, lock: Lock, canStream: boolean);
9
17
  create(dest: string, callback: NoParamCallback): void;
10
18
  create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;
11
19
  create(dest: string, options?: ExtractOptions): Promise<boolean>;
@@ -1,11 +1,19 @@
1
+ /**
2
+ * FileEntry for 7z archives
3
+ *
4
+ * Wraps a lazy stream - decompression happens when the stream is read.
5
+ * API consistent with zip-iterator and tar-iterator.
6
+ */
1
7
  import { type FileAttributes, FileEntry, type Lock, type NoParamCallback } from 'extract-base-iterator';
2
- import type { SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.js';
3
8
  import type { ExtractOptions } from './types.js';
4
9
  export default class SevenZipFileEntry extends FileEntry {
5
10
  private lock;
6
- private entry;
7
- private parser;
8
- constructor(attributes: FileAttributes, entry: SevenZipEntry, parser: SevenZipParser, lock: Lock);
11
+ private stream;
12
+ /**
13
+ * Whether this entry's folder supports streaming decompression.
14
+ */
15
+ readonly _canStream: boolean;
16
+ constructor(attributes: FileAttributes, stream: NodeJS.ReadableStream, lock: Lock, canStream: boolean);
9
17
  create(dest: string, callback: NoParamCallback): void;
10
18
  create(dest: string, options: ExtractOptions, callback: NoParamCallback): void;
11
19
  create(dest: string, options?: ExtractOptions): Promise<boolean>;
@@ -1,4 +1,9 @@
1
- "use strict";
1
+ /**
2
+ * FileEntry for 7z archives
3
+ *
4
+ * Wraps a lazy stream - decompression happens when the stream is read.
5
+ * API consistent with zip-iterator and tar-iterator.
6
+ */ "use strict";
2
7
  Object.defineProperty(exports, "__esModule", {
3
8
  value: true
4
9
  });
@@ -8,6 +13,7 @@ Object.defineProperty(exports, "default", {
8
13
  return SevenZipFileEntry;
9
14
  }
10
15
  });
16
+ var _calloncefn = /*#__PURE__*/ _interop_require_default(require("call-once-fn"));
11
17
  var _extractbaseiterator = require("extract-base-iterator");
12
18
  var _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
13
19
  var _onone = /*#__PURE__*/ _interop_require_default(require("on-one"));
@@ -78,27 +84,24 @@ function _is_native_reflect_construct() {
78
84
  var SevenZipFileEntry = /*#__PURE__*/ function(FileEntry) {
79
85
  "use strict";
80
86
  _inherits(SevenZipFileEntry, FileEntry);
81
- function SevenZipFileEntry(attributes, entry, parser, lock) {
87
+ function SevenZipFileEntry(attributes, stream, lock, canStream) {
82
88
  _class_call_check(this, SevenZipFileEntry);
83
89
  var _this;
84
90
  _this = _call_super(this, SevenZipFileEntry, [
85
91
  attributes
86
92
  ]);
87
- _this.entry = entry;
88
- _this.parser = parser;
93
+ _this.stream = stream;
89
94
  _this.lock = lock;
90
95
  _this.lock.retain();
96
+ _this._canStream = canStream;
91
97
  return _this;
92
98
  }
93
99
  var _proto = SevenZipFileEntry.prototype;
94
100
  _proto.create = function create(dest, options, callback) {
95
101
  var _this = this;
96
- if (typeof options === 'function') {
97
- callback = options;
98
- options = null;
99
- }
102
+ callback = typeof options === 'function' ? options : callback;
103
+ options = typeof options === 'function' ? {} : options || {};
100
104
  if (typeof callback === 'function') {
101
- options = options || {};
102
105
  return _extractbaseiterator.FileEntry.prototype.create.call(this, dest, options, function(err) {
103
106
  callback(err);
104
107
  if (_this.lock) {
@@ -108,34 +111,59 @@ var SevenZipFileEntry = /*#__PURE__*/ function(FileEntry) {
108
111
  });
109
112
  }
110
113
  return new Promise(function(resolve, reject) {
111
- _this.create(dest, options, function(err, done) {
114
+ return _this.create(dest, options, function(err, done) {
112
115
  err ? reject(err) : resolve(done);
113
116
  });
114
117
  });
115
118
  };
116
119
  _proto._writeFile = function _writeFile(fullPath, _options, callback) {
117
- if (!this.entry || !this.parser) {
118
- callback(new Error('7z FileEntry missing entry. Check for calling create multiple times'));
120
+ if (!this.stream) {
121
+ callback(new Error('7z FileEntry missing stream. Check for calling create multiple times'));
119
122
  return;
120
123
  }
121
- // Use callback-based async decompression
122
- this.parser.getEntryStreamAsync(this.entry, function(err, stream) {
123
- if (err) return callback(err);
124
- if (!stream) return callback(new Error('No stream returned'));
125
- var res = stream.pipe(_fs.default.createWriteStream(fullPath));
126
- (0, _onone.default)(res, [
124
+ var stream = this.stream;
125
+ this.stream = null; // Prevent reuse
126
+ // Use once since errors can come from either stream
127
+ var cb = (0, _calloncefn.default)(function(err) {
128
+ err ? callback(err) : (0, _extractbaseiterator.waitForAccess)(fullPath, callback);
129
+ });
130
+ try {
131
+ var writeStream = _fs.default.createWriteStream(fullPath);
132
+ // Listen for errors on source stream (errors don't propagate through pipe)
133
+ stream.on('error', function(streamErr) {
134
+ // Destroy the write stream on source error.
135
+ // On Node 0.8, destroy() emits 'close' before 'error'. Since on-one is listening
136
+ // for ['error', 'close', 'finish'], it catches 'close' first, calls our callback,
137
+ // and removes ALL listeners - including the 'error' listener. The subsequent EBADF
138
+ // error then fires with no handler, causing an uncaught exception.
139
+ // Adding a no-op error handler ensures there's always a listener for any error.
140
+ var ws = writeStream;
141
+ writeStream.on('error', function() {});
142
+ if (typeof ws.destroy === 'function') ws.destroy();
143
+ cb(streamErr);
144
+ });
145
+ // Pipe and listen for write stream completion/errors
146
+ stream.pipe(writeStream);
147
+ (0, _onone.default)(writeStream, [
127
148
  'error',
128
149
  'close',
129
150
  'finish'
130
- ], function(writeErr) {
131
- writeErr ? callback(writeErr) : (0, _extractbaseiterator.waitForAccess)(fullPath, callback);
132
- });
133
- });
151
+ ], cb);
152
+ } catch (pipeErr) {
153
+ cb(pipeErr);
154
+ }
134
155
  };
135
156
  _proto.destroy = function destroy() {
136
157
  _extractbaseiterator.FileEntry.prototype.destroy.call(this);
137
- this.entry = null;
138
- this.parser = null;
158
+ if (this.stream) {
159
+ // Use destroy() to prevent decompression (our stream has custom destroy that sets destroyed flag)
160
+ // Fallback to resume() for older Node versions without destroy()
161
+ var s = this.stream;
162
+ if (typeof s.destroy === 'function') {
163
+ s.destroy();
164
+ }
165
+ this.stream = null;
166
+ }
139
167
  if (this.lock) {
140
168
  this.lock.release();
141
169
  this.lock = null;
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/FileEntry.ts"],"sourcesContent":["import { type FileAttributes, FileEntry, type Lock, type NoParamCallback, waitForAccess } from 'extract-base-iterator';\nimport fs from 'fs';\nimport oo from 'on-one';\nimport type { SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.ts';\nimport type { ExtractOptions } from './types.ts';\n\nexport default class SevenZipFileEntry extends FileEntry {\n private lock: Lock;\n private entry: SevenZipEntry;\n private parser: SevenZipParser;\n\n constructor(attributes: FileAttributes, entry: SevenZipEntry, parser: SevenZipParser, lock: Lock) {\n super(attributes);\n this.entry = entry;\n this.parser = parser;\n this.lock = lock;\n this.lock.retain();\n }\n\n create(dest: string, 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 if (typeof options === 'function') {\n callback = options;\n options = null;\n }\n\n if (typeof callback === 'function') {\n options = options || {};\n return FileEntry.prototype.create.call(this, dest, options, (err?: Error) => {\n callback(err);\n if (this.lock) {\n this.lock.release();\n this.lock = null;\n }\n });\n }\n return new Promise((resolve, reject) => {\n this.create(dest, options as ExtractOptions, (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.entry || !this.parser) {\n callback(new Error('7z FileEntry missing entry. Check for calling create multiple times'));\n return;\n }\n\n // Use callback-based async decompression\n this.parser.getEntryStreamAsync(this.entry, (err, stream) => {\n if (err) return callback(err);\n if (!stream) return callback(new Error('No stream returned'));\n\n const res = stream.pipe(fs.createWriteStream(fullPath));\n oo(res, ['error', 'close', 'finish'], (writeErr?: Error) => {\n writeErr ? callback(writeErr) : waitForAccess(fullPath, callback);\n });\n });\n }\n\n destroy() {\n FileEntry.prototype.destroy.call(this);\n this.entry = null;\n this.parser = null;\n if (this.lock) {\n this.lock.release();\n this.lock = null;\n }\n }\n}\n"],"names":["SevenZipFileEntry","attributes","entry","parser","lock","retain","create","dest","options","callback","FileEntry","prototype","call","err","release","Promise","resolve","reject","done","_writeFile","fullPath","_options","Error","getEntryStreamAsync","stream","res","pipe","fs","createWriteStream","oo","writeErr","waitForAccess","destroy"],"mappings":";;;;;;;eAMqBA;;;mCAN0E;yDAChF;4DACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAA,AAAMA,kCAAN;;cAAMA;aAAAA,kBAKPC,UAA0B,EAAEC,KAAoB,EAAEC,MAAsB,EAAEC,IAAU;gCAL7EJ;;gBAMjB,kBANiBA;YAMXC;;QACN,MAAKC,KAAK,GAAGA;QACb,MAAKC,MAAM,GAAGA;QACd,MAAKC,IAAI,GAAGA;QACZ,MAAKA,IAAI,CAACC,MAAM;;;iBAVCL;IAgBnBM,OAAAA,MAqBC,GArBDA,SAAAA,OAAOC,IAAY,EAAEC,OAA0C,EAAEC,QAA0B;;QACzF,IAAI,OAAOD,YAAY,YAAY;YACjCC,WAAWD;YACXA,UAAU;QACZ;QAEA,IAAI,OAAOC,aAAa,YAAY;YAClCD,UAAUA,WAAW,CAAC;YACtB,OAAOE,8BAAS,CAACC,SAAS,CAACL,MAAM,CAACM,IAAI,CAAC,IAAI,EAAEL,MAAMC,SAAS,SAACK;gBAC3DJ,SAASI;gBACT,IAAI,MAAKT,IAAI,EAAE;oBACb,MAAKA,IAAI,CAACU,OAAO;oBACjB,MAAKV,IAAI,GAAG;gBACd;YACF;QACF;QACA,OAAO,IAAIW,QAAQ,SAACC,SAASC;YAC3B,MAAKX,MAAM,CAACC,MAAMC,SAA2B,SAACK,KAAaK;gBACzDL,MAAMI,OAAOJ,OAAOG,QAAQE;YAC9B;QACF;IACF;IAEAC,OAAAA,UAgBC,GAhBDA,SAAAA,WAAWC,QAAgB,EAAEC,QAAwB,EAAEZ,QAAyB;QAC9E,IAAI,CAAC,IAAI,CAACP,KAAK,IAAI,CAAC,IAAI,CAACC,MAAM,EAAE;YAC/BM,SAAS,IAAIa,MAAM;YACnB;QACF;QAEA,yCAAyC;QACzC,IAAI,CAACnB,MAAM,CAACoB,mBAAmB,CAAC,IAAI,CAACrB,KAAK,EAAE,SAACW,KAAKW;YAChD,IAAIX,KAAK,OAAOJ,SAASI;YACzB,IAAI,CAACW,QAAQ,OAAOf,SAAS,IAAIa,MAAM;YAEvC,IAAMG,MAAMD,OAAOE,IAAI,CAACC,WAAE,CAACC,iBAAiB,CAACR;YAC7CS,IAAAA,cAAE,EAACJ,KAAK;gBAAC;gBAAS;gBAAS;aAAS,EAAE,SAACK;gBACrCA,WAAWrB,SAASqB,YAAYC,IAAAA,kCAAa,EAACX,UAAUX;YAC1D;QACF;IACF;IAEAuB,OAAAA,OAQC,GARDA,SAAAA;QACEtB,8BAAS,CAACC,SAAS,CAACqB,OAAO,CAACpB,IAAI,CAAC,IAAI;QACrC,IAAI,CAACV,KAAK,GAAG;QACb,IAAI,CAACC,MAAM,GAAG;QACd,IAAI,IAAI,CAACC,IAAI,EAAE;YACb,IAAI,CAACA,IAAI,CAACU,OAAO;YACjB,IAAI,CAACV,IAAI,GAAG;QACd;IACF;WAjEmBJ;EAA0BU,8BAAS"}
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 '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;yDAChF;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,WAAE,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,8 +1,31 @@
1
1
  import BaseIterator, { Lock } from 'extract-base-iterator';
2
- import type { Entry, ExtractOptions, SevenZipFileIterator } from './types.js';
2
+ import { type SevenZipEntry } from './sevenz/SevenZipParser.js';
3
+ import type { Entry, ExtractOptions } from './types.js';
3
4
  export default class SevenZipIterator extends BaseIterator<Entry> {
4
5
  lock: Lock | null;
5
- iterator: SevenZipFileIterator;
6
+ /** @internal - Do not use directly */
7
+ _iterator: unknown;
6
8
  constructor(source: string | NodeJS.ReadableStream, options?: ExtractOptions);
7
9
  end(err?: Error): void;
10
+ /**
11
+ * Check if streaming extraction is available for any folder in this archive.
12
+ * Streaming is possible when folders use codecs like BZip2, Deflate, or Copy
13
+ * that can decompress incrementally without buffering the entire input.
14
+ *
15
+ * @returns true if at least one folder supports streaming
16
+ */
17
+ canStream(): boolean;
18
+ /**
19
+ * Get entries sorted for optimal streaming extraction.
20
+ *
21
+ * Entries are sorted by:
22
+ * 1. Folder index (process one folder at a time)
23
+ * 2. Stream index within folder (for solid block streaming)
24
+ *
25
+ * This ordering allows multi-file solid folders to stream with
26
+ * O(largest file) memory instead of O(folder size).
27
+ *
28
+ * @returns Array of entries in streaming order
29
+ */
30
+ getStreamingOrder(): SevenZipEntry[];
8
31
  }
@@ -1,8 +1,31 @@
1
1
  import BaseIterator, { Lock } from 'extract-base-iterator';
2
- import type { Entry, ExtractOptions, SevenZipFileIterator } from './types.js';
2
+ import { type SevenZipEntry } from './sevenz/SevenZipParser.js';
3
+ import type { Entry, ExtractOptions } from './types.js';
3
4
  export default class SevenZipIterator extends BaseIterator<Entry> {
4
5
  lock: Lock | null;
5
- iterator: SevenZipFileIterator;
6
+ /** @internal - Do not use directly */
7
+ _iterator: unknown;
6
8
  constructor(source: string | NodeJS.ReadableStream, options?: ExtractOptions);
7
9
  end(err?: Error): void;
10
+ /**
11
+ * Check if streaming extraction is available for any folder in this archive.
12
+ * Streaming is possible when folders use codecs like BZip2, Deflate, or Copy
13
+ * that can decompress incrementally without buffering the entire input.
14
+ *
15
+ * @returns true if at least one folder supports streaming
16
+ */
17
+ canStream(): boolean;
18
+ /**
19
+ * Get entries sorted for optimal streaming extraction.
20
+ *
21
+ * Entries are sorted by:
22
+ * 1. Folder index (process one folder at a time)
23
+ * 2. Stream index within folder (for solid block streaming)
24
+ *
25
+ * This ordering allows multi-file solid folders to stream with
26
+ * O(largest file) memory instead of O(folder size).
27
+ *
28
+ * @returns Array of entries in streaming order
29
+ */
30
+ getStreamingOrder(): SevenZipEntry[];
8
31
  }
@@ -189,7 +189,7 @@ var SevenZipIterator = /*#__PURE__*/ function(BaseIterator) {
189
189
  });
190
190
  });
191
191
  } else {
192
- // Stream input - use hybrid memory/temp-file approach
192
+ // Stream input - write to temp file for random access
193
193
  // Register cleanup for source stream
194
194
  var stream = source;
195
195
  _this.lock.registerCleanup(function() {
@@ -199,30 +199,23 @@ var SevenZipIterator = /*#__PURE__*/ function(BaseIterator) {
199
199
  var tempPath = _path.default.join((0, _compatts.tmpdir)(), '7z-iterator', (0, _shorthash.default)(process.cwd()), (0, _tempsuffix.default)('tmp.7z'));
200
200
  queue.defer(function(cb) {
201
201
  (0, _streamToSourcets.default)(source, {
202
- memoryThreshold: options.memoryThreshold,
203
202
  tempPath: tempPath
204
203
  }, function(err, result) {
205
204
  if (_this.done || cancelled) return;
206
205
  if (err) return cb(err);
207
206
  if (!result) return cb(new Error('No result from streamToSource'));
208
207
  archiveSource = result.source;
209
- if (result.fd !== undefined) {
210
- var fd = result.fd;
211
- // Register cleanup for file descriptor
212
- _this.lock.registerCleanup(function() {
213
- _fs.default.closeSync(fd);
214
- });
215
- }
216
- if (result.tempPath) {
217
- var tp = result.tempPath;
218
- // Register cleanup for temp file
219
- _this.lock.registerCleanup(function() {
220
- try {
221
- (0, _fsremovecompat.rmSync)(tp);
222
- } catch (_e) {
223
- /* ignore */ }
224
- });
225
- }
208
+ // Register cleanup for file descriptor
209
+ _this.lock.registerCleanup(function() {
210
+ _fs.default.closeSync(result.fd);
211
+ });
212
+ // Register cleanup for temp file
213
+ _this.lock.registerCleanup(function() {
214
+ try {
215
+ (0, _fsremovecompat.rmSync)(result.tempPath);
216
+ } catch (_e) {
217
+ /* ignore */ }
218
+ });
226
219
  cb();
227
220
  });
228
221
  });
@@ -234,7 +227,7 @@ var SevenZipIterator = /*#__PURE__*/ function(BaseIterator) {
234
227
  try {
235
228
  var parser = new _SevenZipParserts.SevenZipParser(archiveSource);
236
229
  parser.parse();
237
- _this.iterator = new EntryIterator(parser);
230
+ _this._iterator = new EntryIterator(parser);
238
231
  cb();
239
232
  } catch (parseErr) {
240
233
  cb(parseErr);
@@ -257,7 +250,61 @@ var SevenZipIterator = /*#__PURE__*/ function(BaseIterator) {
257
250
  lock.release();
258
251
  }
259
252
  // Don't call base end here - Lock.__destroy() handles it
260
- this.iterator = null;
253
+ this._iterator = null;
254
+ };
255
+ /**
256
+ * Check if streaming extraction is available for any folder in this archive.
257
+ * Streaming is possible when folders use codecs like BZip2, Deflate, or Copy
258
+ * that can decompress incrementally without buffering the entire input.
259
+ *
260
+ * @returns true if at least one folder supports streaming
261
+ */ _proto.canStream = function canStream() {
262
+ if (!this._iterator) return false;
263
+ var parser = this._iterator.getParser();
264
+ if (!parser) return false;
265
+ var entries = parser.getEntries();
266
+ var checkedFolders = {};
267
+ for(var i = 0; i < entries.length; i++){
268
+ var folderIndex = entries[i]._folderIndex;
269
+ if (folderIndex >= 0 && checkedFolders[folderIndex] === undefined) {
270
+ checkedFolders[folderIndex] = parser.canStreamFolder(folderIndex);
271
+ if (checkedFolders[folderIndex]) {
272
+ return true;
273
+ }
274
+ }
275
+ }
276
+ return false;
277
+ };
278
+ /**
279
+ * Get entries sorted for optimal streaming extraction.
280
+ *
281
+ * Entries are sorted by:
282
+ * 1. Folder index (process one folder at a time)
283
+ * 2. Stream index within folder (for solid block streaming)
284
+ *
285
+ * This ordering allows multi-file solid folders to stream with
286
+ * O(largest file) memory instead of O(folder size).
287
+ *
288
+ * @returns Array of entries in streaming order
289
+ */ _proto.getStreamingOrder = function getStreamingOrder() {
290
+ if (!this._iterator) return [];
291
+ var parser = this._iterator.getParser();
292
+ if (!parser) return [];
293
+ var entries = parser.getEntries();
294
+ // Create a copy and sort for streaming order
295
+ var sorted = [];
296
+ for(var i = 0; i < entries.length; i++){
297
+ sorted.push(entries[i]);
298
+ }
299
+ sorted.sort(function(a, b) {
300
+ // First by folder index
301
+ if (a._folderIndex !== b._folderIndex) {
302
+ return a._folderIndex - b._folderIndex;
303
+ }
304
+ // Then by stream index within folder
305
+ return a._streamIndexInFolder - b._streamIndexInFolder;
306
+ });
307
+ return sorted;
261
308
  };
262
309
  return SevenZipIterator;
263
310
  }(_extractbaseiterator.default);
@@ -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 fs from 'fs';\nimport { rmSync } from 'fs-remove-compat';\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, SevenZipFileIterator } from './types.ts';\n\n/**\n * Iterator wrapper around SevenZipParser entries\n */\nclass EntryIterator implements SevenZipFileIterator {\n private parser: SevenZipParser;\n private entries: SevenZipEntry[];\n private index = 0;\n\n constructor(parser: SevenZipParser) {\n this.parser = parser;\n this.entries = parser.getEntries();\n }\n\n next(): SevenZipEntry | null {\n if (this.index >= this.entries.length) {\n return null;\n }\n return this.entries[this.index++];\n }\n\n getParser(): SevenZipParser {\n return this.parser;\n }\n}\n\nexport default class SevenZipIterator extends BaseIterator<Entry> {\n lock: Lock | null;\n iterator: SevenZipFileIterator;\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 - use hybrid memory/temp-file approach\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(\n source,\n {\n memoryThreshold: options.memoryThreshold,\n tempPath: tempPath,\n },\n (err?: Error, result?: SourceResult) => {\n if (this.done || cancelled) return;\n if (err) return cb(err);\n if (!result) return cb(new Error('No result from streamToSource'));\n\n archiveSource = result.source;\n if (result.fd !== undefined) {\n const fd = result.fd;\n // Register cleanup for file descriptor\n this.lock.registerCleanup(() => {\n fs.closeSync(fd);\n });\n }\n if (result.tempPath) {\n const tp = result.tempPath;\n // Register cleanup for temp file\n this.lock.registerCleanup(() => {\n try {\n rmSync(tp);\n } catch (_e) {\n /* ignore */\n }\n });\n }\n cb();\n }\n );\n });\n }\n\n // Parse and build iterator\n queue.defer((cb: (err?: Error) => void) => {\n if (this.done || cancelled) return;\n if (!archiveSource) return cb(new Error('No archive source'));\n\n try {\n const parser = new SevenZipParser(archiveSource);\n parser.parse();\n this.iterator = new EntryIterator(parser);\n cb();\n } catch (parseErr) {\n cb(parseErr as Error);\n }\n });\n\n // start processing\n queue.await((err?: Error) => {\n this.processing.remove(setup);\n if (this.done || cancelled) return;\n err ? this.end(err) : this.push(nextEntry);\n });\n }\n\n end(err?: Error) {\n if (this.lock) {\n const lock = this.lock;\n this.lock = null; // Clear before release to prevent re-entrancy\n lock.err = err;\n lock.release();\n }\n // Don't call base end here - Lock.__destroy() handles it\n this.iterator = null;\n }\n}\n"],"names":["SevenZipIterator","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","memoryThreshold","result","Error","undefined","tp","rmSync","_e","SevenZipParser","parse","iterator","parseErr","await","remove","nextEntry","release"],"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 fs from 'fs';\nimport { rmSync } from 'fs-remove-compat';\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 try {\n const parser = new SevenZipParser(archiveSource);\n parser.parse();\n this._iterator = new EntryIterator(parser);\n cb();\n } catch (parseErr) {\n cb(parseErr as Error);\n }\n });\n\n // start processing\n queue.await((err?: Error) => {\n this.processing.remove(setup);\n if (this.done || cancelled) return;\n err ? this.end(err) : this.push(nextEntry);\n });\n }\n\n end(err?: Error) {\n if (this.lock) {\n const lock = this.lock;\n this.lock = null; // Clear before release to prevent re-entrancy\n lock.err = err;\n lock.release();\n }\n // Don't call base end here - Lock.__destroy() handles it\n this._iterator = null;\n }\n\n /**\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","_iterator","parseErr","await","remove","nextEntry","release","canStream","checkedFolders","i","folderIndex","_folderIndex","undefined","canStreamFolder","getStreamingOrder","sorted","sort","a","b","_streamIndexInFolder"],"mappings":"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"}
@@ -17,14 +17,7 @@ function _interop_require_default(obj) {
17
17
  default: obj
18
18
  };
19
19
  }
20
- /**
21
- * os.tmpdir wrapper for Node.js 0.8+
22
- * - Uses native os.tmpdir on Node 0.10+
23
- * - Falls back to os-shim on Node 0.8
24
- */ var hasTmpdir = typeof _os.default.tmpdir === 'function';
25
20
  function tmpdir() {
26
- if (hasTmpdir) return _os.default.tmpdir();
27
- var osShim = require('os-shim');
28
- return osShim.tmpdir();
21
+ return typeof _os.default.tmpdir === 'function' ? _os.default.tmpdir() : require('os-shim').tmpdir();
29
22
  }
30
23
  /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -1 +1 @@
1
- {"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\n/**\n * os.tmpdir wrapper for Node.js 0.8+\n * - Uses native os.tmpdir on Node 0.10+\n * - Falls back to os-shim on Node 0.8\n */\nconst hasTmpdir = typeof os.tmpdir === 'function';\nexport function tmpdir(): string {\n if (hasTmpdir) return os.tmpdir();\n const osShim = require('os-shim');\n return osShim.tmpdir();\n}\n"],"names":["tmpdir","hasTmpdir","os","osShim","require"],"mappings":"AAAA;;;CAGC;;;;+BASeA;;;eAAAA;;;yDARD;;;;;;AAEf;;;;CAIC,GACD,IAAMC,YAAY,OAAOC,WAAE,CAACF,MAAM,KAAK;AAChC,SAASA;IACd,IAAIC,WAAW,OAAOC,WAAE,CAACF,MAAM;IAC/B,IAAMG,SAASC,QAAQ;IACvB,OAAOD,OAAOH,MAAM;AACtB"}
1
+ {"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,4 +1,2 @@
1
1
  export { default } from './SevenZipIterator.js';
2
- export type { ArchiveSource, SevenZipEntry } from './sevenz/index.js';
3
- export { SevenZipParser } from './sevenz/index.js';
4
2
  export * from './types.js';
@@ -1,4 +1,2 @@
1
1
  export { default } from './SevenZipIterator.js';
2
- export type { ArchiveSource, SevenZipEntry } from './sevenz/index.js';
3
- export { SevenZipParser } from './sevenz/index.js';
4
2
  export * from './types.js';
package/dist/cjs/index.js CHANGED
@@ -2,22 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- function _export(target, all) {
6
- for(var name in all)Object.defineProperty(target, name, {
7
- enumerable: true,
8
- get: Object.getOwnPropertyDescriptor(all, name).get
9
- });
10
- }
11
- _export(exports, {
12
- get SevenZipParser () {
13
- return _indexts.SevenZipParser;
14
- },
15
- get default () {
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
16
8
  return _SevenZipIteratorts.default;
17
9
  }
18
10
  });
19
11
  var _SevenZipIteratorts = /*#__PURE__*/ _interop_require_default(require("./SevenZipIterator.js"));
20
- var _indexts = require("./sevenz/index.js");
21
12
  _export_star(require("./types.js"), exports);
22
13
  function _export_star(from, to) {
23
14
  Object.keys(from).forEach(function(k) {
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/index.ts"],"sourcesContent":["export { default } from './SevenZipIterator.ts';\nexport type { ArchiveSource, SevenZipEntry } from './sevenz/index.ts';\nexport { SevenZipParser } from './sevenz/index.ts';\nexport * from './types.ts';\n"],"names":["SevenZipParser","default"],"mappings":";;;;;;;;;;;QAESA;eAAAA,uBAAc;;QAFdC;eAAAA,2BAAO;;;yEAAQ;uBAEO;qBACjB"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/index.ts"],"sourcesContent":["export { default } from './SevenZipIterator.ts';\nexport * from './types.ts';\n"],"names":["default"],"mappings":";;;;+BAASA;;;eAAAA,2BAAO;;;yEAAQ;qBACV"}
@@ -1,20 +1,17 @@
1
- import { BufferSource, FileSource } from '../sevenz/SevenZipParser.js';
1
+ import { FileSource } from '../sevenz/SevenZipParser.js';
2
2
  export interface StreamToSourceOptions {
3
- memoryThreshold?: number;
4
- tempPath?: string;
3
+ tempPath: string;
5
4
  }
6
5
  export interface SourceResult {
7
- source: BufferSource | FileSource;
8
- fd?: number;
9
- tempPath?: string;
6
+ source: FileSource;
7
+ fd: number;
8
+ tempPath: string;
10
9
  }
11
10
  export type Callback = (error?: Error, result?: SourceResult) => void;
12
11
  /**
13
- * Convert a stream to an ArchiveSource (BufferSource for small files, FileSource for large)
12
+ * Convert a stream to a FileSource by writing to temp file
14
13
  *
15
- * Algorithm:
16
- * 1. Buffer stream data in memory up to memoryThreshold
17
- * 2. If threshold exceeded, write all buffered data to temp file and continue streaming
18
- * 3. When done, return BufferSource for memory buffer or FileSource for temp file
14
+ * 7z format requires random access for header parsing, so temp file is necessary for streams.
15
+ * Writes directly to temp file for predictable O(1) memory usage during stream consumption.
19
16
  */
20
17
  export default function streamToSource(stream: NodeJS.ReadableStream, options: StreamToSourceOptions, callback: Callback): void;
@@ -1,20 +1,17 @@
1
- import { BufferSource, FileSource } from '../sevenz/SevenZipParser.js';
1
+ import { FileSource } from '../sevenz/SevenZipParser.js';
2
2
  export interface StreamToSourceOptions {
3
- memoryThreshold?: number;
4
- tempPath?: string;
3
+ tempPath: string;
5
4
  }
6
5
  export interface SourceResult {
7
- source: BufferSource | FileSource;
8
- fd?: number;
9
- tempPath?: string;
6
+ source: FileSource;
7
+ fd: number;
8
+ tempPath: string;
10
9
  }
11
10
  export type Callback = (error?: Error, result?: SourceResult) => void;
12
11
  /**
13
- * Convert a stream to an ArchiveSource (BufferSource for small files, FileSource for large)
12
+ * Convert a stream to a FileSource by writing to temp file
14
13
  *
15
- * Algorithm:
16
- * 1. Buffer stream data in memory up to memoryThreshold
17
- * 2. If threshold exceeded, write all buffered data to temp file and continue streaming
18
- * 3. When done, return BufferSource for memory buffer or FileSource for temp file
14
+ * 7z format requires random access for header parsing, so temp file is necessary for streams.
15
+ * Writes directly to temp file for predictable O(1) memory usage during stream consumption.
19
16
  */
20
17
  export default function streamToSource(stream: NodeJS.ReadableStream, options: StreamToSourceOptions, callback: Callback): void;