7z-iterator 0.1.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 (166) hide show
  1. package/LICENSE +42 -0
  2. package/README.md +142 -0
  3. package/dist/cjs/FileEntry.d.cts +12 -0
  4. package/dist/cjs/FileEntry.d.ts +12 -0
  5. package/dist/cjs/FileEntry.js +147 -0
  6. package/dist/cjs/FileEntry.js.map +1 -0
  7. package/dist/cjs/SevenZipIterator.d.cts +8 -0
  8. package/dist/cjs/SevenZipIterator.d.ts +8 -0
  9. package/dist/cjs/SevenZipIterator.js +204 -0
  10. package/dist/cjs/SevenZipIterator.js.map +1 -0
  11. package/dist/cjs/index.d.cts +4 -0
  12. package/dist/cjs/index.d.ts +4 -0
  13. package/dist/cjs/index.js +40 -0
  14. package/dist/cjs/index.js.map +1 -0
  15. package/dist/cjs/lib/Lock.d.cts +11 -0
  16. package/dist/cjs/lib/Lock.d.ts +11 -0
  17. package/dist/cjs/lib/Lock.js +65 -0
  18. package/dist/cjs/lib/Lock.js.map +1 -0
  19. package/dist/cjs/lib/streamToSource.d.cts +20 -0
  20. package/dist/cjs/lib/streamToSource.d.ts +20 -0
  21. package/dist/cjs/lib/streamToSource.js +116 -0
  22. package/dist/cjs/lib/streamToSource.js.map +1 -0
  23. package/dist/cjs/nextEntry.d.cts +4 -0
  24. package/dist/cjs/nextEntry.d.ts +4 -0
  25. package/dist/cjs/nextEntry.js +102 -0
  26. package/dist/cjs/nextEntry.js.map +1 -0
  27. package/dist/cjs/package.json +1 -0
  28. package/dist/cjs/sevenz/NumberCodec.d.cts +58 -0
  29. package/dist/cjs/sevenz/NumberCodec.d.ts +58 -0
  30. package/dist/cjs/sevenz/NumberCodec.js +133 -0
  31. package/dist/cjs/sevenz/NumberCodec.js.map +1 -0
  32. package/dist/cjs/sevenz/SevenZipParser.d.cts +96 -0
  33. package/dist/cjs/sevenz/SevenZipParser.d.ts +96 -0
  34. package/dist/cjs/sevenz/SevenZipParser.js +457 -0
  35. package/dist/cjs/sevenz/SevenZipParser.js.map +1 -0
  36. package/dist/cjs/sevenz/codecs/Aes.d.cts +22 -0
  37. package/dist/cjs/sevenz/codecs/Aes.d.ts +22 -0
  38. package/dist/cjs/sevenz/codecs/Aes.js +179 -0
  39. package/dist/cjs/sevenz/codecs/Aes.js.map +1 -0
  40. package/dist/cjs/sevenz/codecs/BZip2.d.cts +14 -0
  41. package/dist/cjs/sevenz/codecs/BZip2.d.ts +14 -0
  42. package/dist/cjs/sevenz/codecs/BZip2.js +37 -0
  43. package/dist/cjs/sevenz/codecs/BZip2.js.map +1 -0
  44. package/dist/cjs/sevenz/codecs/Bcj.d.cts +15 -0
  45. package/dist/cjs/sevenz/codecs/Bcj.d.ts +15 -0
  46. package/dist/cjs/sevenz/codecs/Bcj.js +89 -0
  47. package/dist/cjs/sevenz/codecs/Bcj.js.map +1 -0
  48. package/dist/cjs/sevenz/codecs/Copy.d.cts +14 -0
  49. package/dist/cjs/sevenz/codecs/Copy.d.ts +14 -0
  50. package/dist/cjs/sevenz/codecs/Copy.js +28 -0
  51. package/dist/cjs/sevenz/codecs/Copy.js.map +1 -0
  52. package/dist/cjs/sevenz/codecs/Deflate.d.cts +14 -0
  53. package/dist/cjs/sevenz/codecs/Deflate.d.ts +14 -0
  54. package/dist/cjs/sevenz/codecs/Deflate.js +39 -0
  55. package/dist/cjs/sevenz/codecs/Deflate.js.map +1 -0
  56. package/dist/cjs/sevenz/codecs/Delta.d.cts +15 -0
  57. package/dist/cjs/sevenz/codecs/Delta.d.ts +15 -0
  58. package/dist/cjs/sevenz/codecs/Delta.js +55 -0
  59. package/dist/cjs/sevenz/codecs/Delta.js.map +1 -0
  60. package/dist/cjs/sevenz/codecs/Lzma.d.cts +14 -0
  61. package/dist/cjs/sevenz/codecs/Lzma.d.ts +14 -0
  62. package/dist/cjs/sevenz/codecs/Lzma.js +53 -0
  63. package/dist/cjs/sevenz/codecs/Lzma.js.map +1 -0
  64. package/dist/cjs/sevenz/codecs/Lzma2.d.cts +14 -0
  65. package/dist/cjs/sevenz/codecs/Lzma2.d.ts +14 -0
  66. package/dist/cjs/sevenz/codecs/Lzma2.js +160 -0
  67. package/dist/cjs/sevenz/codecs/Lzma2.js.map +1 -0
  68. package/dist/cjs/sevenz/codecs/createBufferingDecoder.d.cts +7 -0
  69. package/dist/cjs/sevenz/codecs/createBufferingDecoder.d.ts +7 -0
  70. package/dist/cjs/sevenz/codecs/createBufferingDecoder.js +36 -0
  71. package/dist/cjs/sevenz/codecs/createBufferingDecoder.js.map +1 -0
  72. package/dist/cjs/sevenz/codecs/index.d.cts +24 -0
  73. package/dist/cjs/sevenz/codecs/index.d.ts +24 -0
  74. package/dist/cjs/sevenz/codecs/index.js +128 -0
  75. package/dist/cjs/sevenz/codecs/index.js.map +1 -0
  76. package/dist/cjs/sevenz/codecs/streams.d.cts +18 -0
  77. package/dist/cjs/sevenz/codecs/streams.d.ts +18 -0
  78. package/dist/cjs/sevenz/codecs/streams.js +79 -0
  79. package/dist/cjs/sevenz/codecs/streams.js.map +1 -0
  80. package/dist/cjs/sevenz/constants.d.cts +86 -0
  81. package/dist/cjs/sevenz/constants.d.ts +86 -0
  82. package/dist/cjs/sevenz/constants.js +162 -0
  83. package/dist/cjs/sevenz/constants.js.map +1 -0
  84. package/dist/cjs/sevenz/headers.d.cts +70 -0
  85. package/dist/cjs/sevenz/headers.d.ts +70 -0
  86. package/dist/cjs/sevenz/headers.js +661 -0
  87. package/dist/cjs/sevenz/headers.js.map +1 -0
  88. package/dist/cjs/sevenz/index.d.cts +4 -0
  89. package/dist/cjs/sevenz/index.d.ts +4 -0
  90. package/dist/cjs/sevenz/index.js +33 -0
  91. package/dist/cjs/sevenz/index.js.map +1 -0
  92. package/dist/cjs/types.d.cts +37 -0
  93. package/dist/cjs/types.d.ts +37 -0
  94. package/dist/cjs/types.js +32 -0
  95. package/dist/cjs/types.js.map +1 -0
  96. package/dist/esm/FileEntry.d.ts +12 -0
  97. package/dist/esm/FileEntry.js +63 -0
  98. package/dist/esm/FileEntry.js.map +1 -0
  99. package/dist/esm/SevenZipIterator.d.ts +8 -0
  100. package/dist/esm/SevenZipIterator.js +116 -0
  101. package/dist/esm/SevenZipIterator.js.map +1 -0
  102. package/dist/esm/index.d.ts +4 -0
  103. package/dist/esm/index.js +3 -0
  104. package/dist/esm/index.js.map +1 -0
  105. package/dist/esm/lib/Lock.d.ts +11 -0
  106. package/dist/esm/lib/Lock.js +41 -0
  107. package/dist/esm/lib/Lock.js.map +1 -0
  108. package/dist/esm/lib/streamToSource.d.ts +20 -0
  109. package/dist/esm/lib/streamToSource.js +100 -0
  110. package/dist/esm/lib/streamToSource.js.map +1 -0
  111. package/dist/esm/nextEntry.d.ts +4 -0
  112. package/dist/esm/nextEntry.js +86 -0
  113. package/dist/esm/nextEntry.js.map +1 -0
  114. package/dist/esm/package.json +1 -0
  115. package/dist/esm/sevenz/NumberCodec.d.ts +58 -0
  116. package/dist/esm/sevenz/NumberCodec.js +138 -0
  117. package/dist/esm/sevenz/NumberCodec.js.map +1 -0
  118. package/dist/esm/sevenz/SevenZipParser.d.ts +96 -0
  119. package/dist/esm/sevenz/SevenZipParser.js +419 -0
  120. package/dist/esm/sevenz/SevenZipParser.js.map +1 -0
  121. package/dist/esm/sevenz/codecs/Aes.d.ts +22 -0
  122. package/dist/esm/sevenz/codecs/Aes.js +162 -0
  123. package/dist/esm/sevenz/codecs/Aes.js.map +1 -0
  124. package/dist/esm/sevenz/codecs/BZip2.d.ts +14 -0
  125. package/dist/esm/sevenz/codecs/BZip2.js +22 -0
  126. package/dist/esm/sevenz/codecs/BZip2.js.map +1 -0
  127. package/dist/esm/sevenz/codecs/Bcj.d.ts +15 -0
  128. package/dist/esm/sevenz/codecs/Bcj.js +75 -0
  129. package/dist/esm/sevenz/codecs/Bcj.js.map +1 -0
  130. package/dist/esm/sevenz/codecs/Copy.d.ts +14 -0
  131. package/dist/esm/sevenz/codecs/Copy.js +18 -0
  132. package/dist/esm/sevenz/codecs/Copy.js.map +1 -0
  133. package/dist/esm/sevenz/codecs/Deflate.d.ts +14 -0
  134. package/dist/esm/sevenz/codecs/Deflate.js +24 -0
  135. package/dist/esm/sevenz/codecs/Deflate.js.map +1 -0
  136. package/dist/esm/sevenz/codecs/Delta.d.ts +15 -0
  137. package/dist/esm/sevenz/codecs/Delta.js +41 -0
  138. package/dist/esm/sevenz/codecs/Delta.js.map +1 -0
  139. package/dist/esm/sevenz/codecs/Lzma.d.ts +14 -0
  140. package/dist/esm/sevenz/codecs/Lzma.js +38 -0
  141. package/dist/esm/sevenz/codecs/Lzma.js.map +1 -0
  142. package/dist/esm/sevenz/codecs/Lzma2.d.ts +14 -0
  143. package/dist/esm/sevenz/codecs/Lzma2.js +145 -0
  144. package/dist/esm/sevenz/codecs/Lzma2.js.map +1 -0
  145. package/dist/esm/sevenz/codecs/createBufferingDecoder.d.ts +7 -0
  146. package/dist/esm/sevenz/codecs/createBufferingDecoder.js +25 -0
  147. package/dist/esm/sevenz/codecs/createBufferingDecoder.js.map +1 -0
  148. package/dist/esm/sevenz/codecs/index.d.ts +24 -0
  149. package/dist/esm/sevenz/codecs/index.js +108 -0
  150. package/dist/esm/sevenz/codecs/index.js.map +1 -0
  151. package/dist/esm/sevenz/codecs/streams.d.ts +18 -0
  152. package/dist/esm/sevenz/codecs/streams.js +66 -0
  153. package/dist/esm/sevenz/codecs/streams.js.map +1 -0
  154. package/dist/esm/sevenz/constants.d.ts +86 -0
  155. package/dist/esm/sevenz/constants.js +131 -0
  156. package/dist/esm/sevenz/constants.js.map +1 -0
  157. package/dist/esm/sevenz/headers.d.ts +70 -0
  158. package/dist/esm/sevenz/headers.js +646 -0
  159. package/dist/esm/sevenz/headers.js.map +1 -0
  160. package/dist/esm/sevenz/index.d.ts +4 -0
  161. package/dist/esm/sevenz/index.js +5 -0
  162. package/dist/esm/sevenz/index.js.map +1 -0
  163. package/dist/esm/types.d.ts +37 -0
  164. package/dist/esm/types.js +2 -0
  165. package/dist/esm/types.js.map +1 -0
  166. package/package.json +77 -0
@@ -0,0 +1,11 @@
1
+ import BaseIterator from 'extract-base-iterator';
2
+ export default class Lock {
3
+ private count;
4
+ tempPath: string;
5
+ fd: number;
6
+ iterator: BaseIterator;
7
+ err: Error;
8
+ retain(): void;
9
+ release(): void;
10
+ private __destroy;
11
+ }
@@ -0,0 +1,11 @@
1
+ import BaseIterator from 'extract-base-iterator';
2
+ export default class Lock {
3
+ private count;
4
+ tempPath: string;
5
+ fd: number;
6
+ iterator: BaseIterator;
7
+ err: Error;
8
+ retain(): void;
9
+ release(): void;
10
+ private __destroy;
11
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return Lock;
9
+ }
10
+ });
11
+ var _extractbaseiterator = /*#__PURE__*/ _interop_require_default(require("extract-base-iterator"));
12
+ var _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
13
+ var _rimraf2 = /*#__PURE__*/ _interop_require_default(require("rimraf2"));
14
+ function _class_call_check(instance, Constructor) {
15
+ if (!(instance instanceof Constructor)) {
16
+ throw new TypeError("Cannot call a class as a function");
17
+ }
18
+ }
19
+ function _interop_require_default(obj) {
20
+ return obj && obj.__esModule ? obj : {
21
+ default: obj
22
+ };
23
+ }
24
+ var Lock = /*#__PURE__*/ function() {
25
+ "use strict";
26
+ function Lock() {
27
+ _class_call_check(this, Lock);
28
+ this.count = 1;
29
+ // members
30
+ this.tempPath = null;
31
+ this.fd = null;
32
+ this.iterator = null;
33
+ this.err = null;
34
+ }
35
+ var _proto = Lock.prototype;
36
+ _proto.retain = function retain() {
37
+ this.count++;
38
+ };
39
+ _proto.release = function release() {
40
+ if (this.count <= 0) throw new Error('Lock count is corrupted');
41
+ this.count--;
42
+ if (this.count === 0) this.__destroy();
43
+ };
44
+ _proto.__destroy = function __destroy() {
45
+ if (this.tempPath) {
46
+ try {
47
+ _rimraf2.default.sync(this.tempPath, {
48
+ disableGlob: true
49
+ });
50
+ } catch (_err) {
51
+ /* empty */ }
52
+ this.tempPath = null;
53
+ }
54
+ if (this.fd) {
55
+ _fs.default.closeSync(this.fd);
56
+ this.fd = null;
57
+ }
58
+ if (this.iterator) {
59
+ _extractbaseiterator.default.prototype.end.call(this.iterator, this.err || null);
60
+ this.iterator = null;
61
+ }
62
+ };
63
+ return Lock;
64
+ }();
65
+ /* 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; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/lib/Lock.ts"],"sourcesContent":["import BaseIterator from 'extract-base-iterator';\nimport fs from 'fs';\nimport rimraf2 from 'rimraf2';\n\nexport default class Lock {\n private count = 1;\n\n // members\n tempPath: string = null;\n fd: number = null;\n iterator: BaseIterator = null;\n err: Error = null;\n\n retain() {\n this.count++;\n }\n\n release() {\n if (this.count <= 0) throw new Error('Lock count is corrupted');\n this.count--;\n if (this.count === 0) this.__destroy();\n }\n\n private __destroy() {\n if (this.tempPath) {\n try {\n rimraf2.sync(this.tempPath, { disableGlob: true });\n } catch (_err) {\n /* empty */\n }\n this.tempPath = null;\n }\n\n if (this.fd) {\n fs.closeSync(this.fd);\n this.fd = null;\n }\n\n if (this.iterator) {\n BaseIterator.prototype.end.call(this.iterator, this.err || null);\n this.iterator = null;\n }\n }\n}\n"],"names":["Lock","count","tempPath","fd","iterator","err","retain","release","Error","__destroy","rimraf2","sync","disableGlob","_err","fs","closeSync","BaseIterator","prototype","end","call"],"mappings":";;;;;;;eAIqBA;;;0EAJI;yDACV;8DACK;;;;;;;;;;;AAEL,IAAA,AAAMA,qBAAN;;aAAMA;gCAAAA;aACXC,QAAQ;QAEhB,UAAU;aACVC,WAAmB;aACnBC,KAAa;aACbC,WAAyB;aACzBC,MAAa;;iBAPML;IASnBM,OAAAA,MAEC,GAFDA,SAAAA;QACE,IAAI,CAACL,KAAK;IACZ;IAEAM,OAAAA,OAIC,GAJDA,SAAAA;QACE,IAAI,IAAI,CAACN,KAAK,IAAI,GAAG,MAAM,IAAIO,MAAM;QACrC,IAAI,CAACP,KAAK;QACV,IAAI,IAAI,CAACA,KAAK,KAAK,GAAG,IAAI,CAACQ,SAAS;IACtC;IAEA,OAAQA,SAmBP,GAnBD,SAAQA;QACN,IAAI,IAAI,CAACP,QAAQ,EAAE;YACjB,IAAI;gBACFQ,gBAAO,CAACC,IAAI,CAAC,IAAI,CAACT,QAAQ,EAAE;oBAAEU,aAAa;gBAAK;YAClD,EAAE,OAAOC,MAAM;YACb,SAAS,GACX;YACA,IAAI,CAACX,QAAQ,GAAG;QAClB;QAEA,IAAI,IAAI,CAACC,EAAE,EAAE;YACXW,WAAE,CAACC,SAAS,CAAC,IAAI,CAACZ,EAAE;YACpB,IAAI,CAACA,EAAE,GAAG;QACZ;QAEA,IAAI,IAAI,CAACC,QAAQ,EAAE;YACjBY,4BAAY,CAACC,SAAS,CAACC,GAAG,CAACC,IAAI,CAAC,IAAI,CAACf,QAAQ,EAAE,IAAI,CAACC,GAAG,IAAI;YAC3D,IAAI,CAACD,QAAQ,GAAG;QAClB;IACF;WAtCmBJ"}
@@ -0,0 +1,20 @@
1
+ import { BufferSource, FileSource } from '../sevenz/SevenZipParser.js';
2
+ export interface StreamToSourceOptions {
3
+ memoryThreshold?: number;
4
+ tempPath?: string;
5
+ }
6
+ export interface SourceResult {
7
+ source: BufferSource | FileSource;
8
+ fd?: number;
9
+ tempPath?: string;
10
+ }
11
+ export type Callback = (error?: Error, result?: SourceResult) => void;
12
+ /**
13
+ * Convert a stream to an ArchiveSource (BufferSource for small files, FileSource for large)
14
+ *
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
19
+ */
20
+ export default function streamToSource(stream: NodeJS.ReadableStream, options: StreamToSourceOptions, callback: Callback): void;
@@ -0,0 +1,20 @@
1
+ import { BufferSource, FileSource } from '../sevenz/SevenZipParser.js';
2
+ export interface StreamToSourceOptions {
3
+ memoryThreshold?: number;
4
+ tempPath?: string;
5
+ }
6
+ export interface SourceResult {
7
+ source: BufferSource | FileSource;
8
+ fd?: number;
9
+ tempPath?: string;
10
+ }
11
+ export type Callback = (error?: Error, result?: SourceResult) => void;
12
+ /**
13
+ * Convert a stream to an ArchiveSource (BufferSource for small files, FileSource for large)
14
+ *
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
19
+ */
20
+ export default function streamToSource(stream: NodeJS.ReadableStream, options: StreamToSourceOptions, callback: Callback): void;
@@ -0,0 +1,116 @@
1
+ // Hybrid stream handling: buffers in memory up to threshold, then switches to temp file
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, /**
7
+ * Convert a stream to an ArchiveSource (BufferSource for small files, FileSource for large)
8
+ *
9
+ * Algorithm:
10
+ * 1. Buffer stream data in memory up to memoryThreshold
11
+ * 2. If threshold exceeded, write all buffered data to temp file and continue streaming
12
+ * 3. When done, return BufferSource for memory buffer or FileSource for temp file
13
+ */ "default", {
14
+ enumerable: true,
15
+ get: function() {
16
+ return streamToSource;
17
+ }
18
+ });
19
+ var _calloncefn = /*#__PURE__*/ _interop_require_default(require("call-once-fn"));
20
+ var _extractbaseiterator = require("extract-base-iterator");
21
+ var _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
22
+ var _mkdirpclassic = /*#__PURE__*/ _interop_require_default(require("mkdirp-classic"));
23
+ var _onone = /*#__PURE__*/ _interop_require_default(require("on-one"));
24
+ var _path = /*#__PURE__*/ _interop_require_default(require("path"));
25
+ var _SevenZipParserts = require("../sevenz/SevenZipParser.js");
26
+ function _interop_require_default(obj) {
27
+ return obj && obj.__esModule ? obj : {
28
+ default: obj
29
+ };
30
+ }
31
+ // Default memory threshold: 100 MB
32
+ var DEFAULT_MEMORY_THRESHOLD = 100 * 1024 * 1024;
33
+ function streamToSource(stream, options, callback) {
34
+ var threshold = options.memoryThreshold !== undefined ? options.memoryThreshold : DEFAULT_MEMORY_THRESHOLD;
35
+ var tempPath = options.tempPath;
36
+ var chunks = [];
37
+ var totalSize = 0;
38
+ var writeStream = null;
39
+ var useTempFile = false;
40
+ var end = (0, _calloncefn.default)(callback);
41
+ function onData(chunk) {
42
+ // Convert string chunks to Buffer
43
+ var buf = typeof chunk === 'string' ? (0, _extractbaseiterator.bufferFrom)(chunk) : chunk;
44
+ totalSize += buf.length;
45
+ if (!useTempFile && totalSize <= threshold) {
46
+ // Still under threshold - buffer in memory
47
+ chunks.push(buf);
48
+ } else if (!useTempFile) {
49
+ // Just exceeded threshold - switch to temp file
50
+ useTempFile = true;
51
+ if (!tempPath) {
52
+ end(new Error('memoryThreshold exceeded but no tempPath provided'));
53
+ return;
54
+ }
55
+ _mkdirpclassic.default.sync(_path.default.dirname(tempPath));
56
+ writeStream = _fs.default.createWriteStream(tempPath);
57
+ // Write all buffered chunks to temp file
58
+ for(var i = 0; i < chunks.length; i++){
59
+ writeStream.write(chunks[i]);
60
+ }
61
+ chunks = []; // Allow GC
62
+ // Write current chunk
63
+ writeStream.write(buf);
64
+ } else {
65
+ // Already using temp file - write directly
66
+ if (writeStream) {
67
+ writeStream.write(buf);
68
+ }
69
+ }
70
+ }
71
+ function onEnd() {
72
+ if (useTempFile && writeStream && tempPath) {
73
+ // Close write stream, then open for reading
74
+ var filePath = tempPath; // Capture for closure
75
+ writeStream.end(function() {
76
+ _fs.default.open(filePath, 'r', function(err, fd) {
77
+ if (err) return end(err);
78
+ _fs.default.stat(filePath, function(statErr, stats) {
79
+ if (statErr) {
80
+ _fs.default.closeSync(fd);
81
+ return end(statErr);
82
+ }
83
+ end(null, {
84
+ source: new _SevenZipParserts.FileSource(fd, stats.size),
85
+ fd: fd,
86
+ tempPath: filePath
87
+ });
88
+ });
89
+ });
90
+ });
91
+ } else {
92
+ // Use memory buffer
93
+ var fullBuffer = Buffer.concat(chunks);
94
+ end(null, {
95
+ source: new _SevenZipParserts.BufferSource(fullBuffer)
96
+ });
97
+ }
98
+ }
99
+ function onError(err) {
100
+ // Clean up if we created a temp file
101
+ if (writeStream) {
102
+ writeStream.end();
103
+ }
104
+ end(err);
105
+ }
106
+ stream.on('data', onData);
107
+ (0, _onone.default)(stream, [
108
+ 'error'
109
+ ], onError);
110
+ (0, _onone.default)(stream, [
111
+ 'end',
112
+ 'close',
113
+ 'finish'
114
+ ], onEnd);
115
+ }
116
+ /* 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; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/lib/streamToSource.ts"],"sourcesContent":["// Hybrid stream handling: buffers in memory up to threshold, then switches to temp file\nimport once from 'call-once-fn';\nimport { bufferFrom } from 'extract-base-iterator';\nimport fs from 'fs';\nimport mkdirp from 'mkdirp-classic';\nimport oo from 'on-one';\nimport path from 'path';\nimport { BufferSource, FileSource } from '../sevenz/SevenZipParser.ts';\n\n// Default memory threshold: 100 MB\nvar DEFAULT_MEMORY_THRESHOLD = 100 * 1024 * 1024;\n\nexport interface StreamToSourceOptions {\n memoryThreshold?: number;\n tempPath?: string;\n}\n\nexport interface SourceResult {\n source: BufferSource | FileSource;\n fd?: number; // Set if FileSource was used (caller must close)\n tempPath?: string; // Set if temp file was created (caller must clean up)\n}\n\nexport type Callback = (error?: Error, result?: SourceResult) => void;\n\n/**\n * Convert a stream to an ArchiveSource (BufferSource for small files, FileSource for large)\n *\n * Algorithm:\n * 1. Buffer stream data in memory up to memoryThreshold\n * 2. If threshold exceeded, write all buffered data to temp file and continue streaming\n * 3. When done, return BufferSource for memory buffer or FileSource for temp file\n */\nexport default function streamToSource(stream: NodeJS.ReadableStream, options: StreamToSourceOptions, callback: Callback): void {\n var threshold = options.memoryThreshold !== undefined ? options.memoryThreshold : DEFAULT_MEMORY_THRESHOLD;\n var tempPath = options.tempPath;\n\n var chunks: Buffer[] = [];\n var totalSize = 0;\n var writeStream: fs.WriteStream | null = null;\n var useTempFile = false;\n\n var end = once(callback);\n\n function onData(chunk: Buffer | string): void {\n // Convert string chunks to Buffer\n var buf = typeof chunk === 'string' ? bufferFrom(chunk) : chunk;\n totalSize += buf.length;\n\n if (!useTempFile && totalSize <= threshold) {\n // Still under threshold - buffer in memory\n chunks.push(buf);\n } else if (!useTempFile) {\n // Just exceeded threshold - switch to temp file\n useTempFile = true;\n\n if (!tempPath) {\n end(new Error('memoryThreshold exceeded but no tempPath provided'));\n return;\n }\n\n mkdirp.sync(path.dirname(tempPath));\n writeStream = fs.createWriteStream(tempPath);\n\n // Write all buffered chunks to temp file\n for (var i = 0; i < chunks.length; i++) {\n writeStream.write(chunks[i]);\n }\n chunks = []; // Allow GC\n\n // Write current chunk\n writeStream.write(buf);\n } else {\n // Already using temp file - write directly\n if (writeStream) {\n writeStream.write(buf);\n }\n }\n }\n\n function onEnd(): void {\n if (useTempFile && writeStream && tempPath) {\n // Close write stream, then open for reading\n var filePath = tempPath; // Capture for closure\n writeStream.end(() => {\n fs.open(filePath, 'r', (err, fd) => {\n if (err) return end(err);\n fs.stat(filePath, (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: filePath,\n });\n });\n });\n });\n } else {\n // Use memory buffer\n var fullBuffer = Buffer.concat(chunks);\n end(null, {\n source: new BufferSource(fullBuffer),\n });\n }\n }\n\n function onError(err: Error): void {\n // Clean up if we created a temp file\n if (writeStream) {\n writeStream.end();\n }\n end(err);\n }\n\n stream.on('data', onData);\n oo(stream, ['error'], onError);\n oo(stream, ['end', 'close', 'finish'], onEnd);\n}\n"],"names":["streamToSource","DEFAULT_MEMORY_THRESHOLD","stream","options","callback","threshold","memoryThreshold","undefined","tempPath","chunks","totalSize","writeStream","useTempFile","end","once","onData","chunk","buf","bufferFrom","length","push","Error","mkdirp","sync","path","dirname","fs","createWriteStream","i","write","onEnd","filePath","open","err","fd","stat","statErr","stats","closeSync","source","FileSource","size","fullBuffer","Buffer","concat","BufferSource","onError","on","oo"],"mappings":"AAAA,wFAAwF;;;;;+BAyBxF;;;;;;;CAOC,GACD;;;eAAwBA;;;iEAhCP;mCACU;yDACZ;oEACI;4DACJ;2DACE;gCACwB;;;;;;AAEzC,mCAAmC;AACnC,IAAIC,2BAA2B,MAAM,OAAO;AAuB7B,SAASD,eAAeE,MAA6B,EAAEC,OAA8B,EAAEC,QAAkB;IACtH,IAAIC,YAAYF,QAAQG,eAAe,KAAKC,YAAYJ,QAAQG,eAAe,GAAGL;IAClF,IAAIO,WAAWL,QAAQK,QAAQ;IAE/B,IAAIC,SAAmB,EAAE;IACzB,IAAIC,YAAY;IAChB,IAAIC,cAAqC;IACzC,IAAIC,cAAc;IAElB,IAAIC,MAAMC,IAAAA,mBAAI,EAACV;IAEf,SAASW,OAAOC,KAAsB;QACpC,kCAAkC;QAClC,IAAIC,MAAM,OAAOD,UAAU,WAAWE,IAAAA,+BAAU,EAACF,SAASA;QAC1DN,aAAaO,IAAIE,MAAM;QAEvB,IAAI,CAACP,eAAeF,aAAaL,WAAW;YAC1C,2CAA2C;YAC3CI,OAAOW,IAAI,CAACH;QACd,OAAO,IAAI,CAACL,aAAa;YACvB,gDAAgD;YAChDA,cAAc;YAEd,IAAI,CAACJ,UAAU;gBACbK,IAAI,IAAIQ,MAAM;gBACd;YACF;YAEAC,sBAAM,CAACC,IAAI,CAACC,aAAI,CAACC,OAAO,CAACjB;YACzBG,cAAce,WAAE,CAACC,iBAAiB,CAACnB;YAEnC,yCAAyC;YACzC,IAAK,IAAIoB,IAAI,GAAGA,IAAInB,OAAOU,MAAM,EAAES,IAAK;gBACtCjB,YAAYkB,KAAK,CAACpB,MAAM,CAACmB,EAAE;YAC7B;YACAnB,SAAS,EAAE,EAAE,WAAW;YAExB,sBAAsB;YACtBE,YAAYkB,KAAK,CAACZ;QACpB,OAAO;YACL,2CAA2C;YAC3C,IAAIN,aAAa;gBACfA,YAAYkB,KAAK,CAACZ;YACpB;QACF;IACF;IAEA,SAASa;QACP,IAAIlB,eAAeD,eAAeH,UAAU;YAC1C,4CAA4C;YAC5C,IAAIuB,WAAWvB,UAAU,sBAAsB;YAC/CG,YAAYE,GAAG,CAAC;gBACda,WAAE,CAACM,IAAI,CAACD,UAAU,KAAK,SAACE,KAAKC;oBAC3B,IAAID,KAAK,OAAOpB,IAAIoB;oBACpBP,WAAE,CAACS,IAAI,CAACJ,UAAU,SAACK,SAASC;wBAC1B,IAAID,SAAS;4BACXV,WAAE,CAACY,SAAS,CAACJ;4BACb,OAAOrB,IAAIuB;wBACb;wBACAvB,IAAI,MAAM;4BACR0B,QAAQ,IAAIC,4BAAU,CAACN,IAAIG,MAAMI,IAAI;4BACrCP,IAAIA;4BACJ1B,UAAUuB;wBACZ;oBACF;gBACF;YACF;QACF,OAAO;YACL,oBAAoB;YACpB,IAAIW,aAAaC,OAAOC,MAAM,CAACnC;YAC/BI,IAAI,MAAM;gBACR0B,QAAQ,IAAIM,8BAAY,CAACH;YAC3B;QACF;IACF;IAEA,SAASI,QAAQb,GAAU;QACzB,qCAAqC;QACrC,IAAItB,aAAa;YACfA,YAAYE,GAAG;QACjB;QACAA,IAAIoB;IACN;IAEA/B,OAAO6C,EAAE,CAAC,QAAQhC;IAClBiC,IAAAA,cAAE,EAAC9C,QAAQ;QAAC;KAAQ,EAAE4C;IACtBE,IAAAA,cAAE,EAAC9C,QAAQ;QAAC;QAAO;QAAS;KAAS,EAAE4B;AACzC"}
@@ -0,0 +1,4 @@
1
+ import type SevenZipIterator from './SevenZipIterator.js';
2
+ import type { Entry, EntryCallback } from './types.js';
3
+ export type NextCallback = (error?: Error, entry?: Entry) => undefined;
4
+ export default function nextEntry<_T>(iterator: SevenZipIterator, callback: EntryCallback): undefined;
@@ -0,0 +1,4 @@
1
+ import type SevenZipIterator from './SevenZipIterator.js';
2
+ import type { Entry, EntryCallback } from './types.js';
3
+ export type NextCallback = (error?: Error, entry?: Entry) => undefined;
4
+ export default function nextEntry<_T>(iterator: SevenZipIterator, callback: EntryCallback): undefined;
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return nextEntry;
9
+ }
10
+ });
11
+ var _calloncefn = /*#__PURE__*/ _interop_require_default(require("call-once-fn"));
12
+ var _extractbaseiterator = require("extract-base-iterator");
13
+ var _lodashcompact = /*#__PURE__*/ _interop_require_default(require("lodash.compact"));
14
+ var _path = /*#__PURE__*/ _interop_require_default(require("path"));
15
+ var _FileEntryts = /*#__PURE__*/ _interop_require_default(require("./FileEntry.js"));
16
+ function _interop_require_default(obj) {
17
+ return obj && obj.__esModule ? obj : {
18
+ default: obj
19
+ };
20
+ }
21
+ function nextEntry(iterator, callback) {
22
+ if (!iterator.iterator) {
23
+ callback(new Error('iterator missing'));
24
+ return;
25
+ }
26
+ var entry = null;
27
+ entry = iterator.iterator.next();
28
+ var nextCallback = (0, _calloncefn.default)(function(err, entry) {
29
+ // keep processing
30
+ if (entry) iterator.push(nextEntry);
31
+ err ? callback(err) : callback(null, entry ? {
32
+ done: false,
33
+ value: entry
34
+ } : {
35
+ done: true,
36
+ value: null
37
+ });
38
+ });
39
+ // done: signal iteration is complete
40
+ if (iterator.isDone() || !entry) return callback(null, {
41
+ done: true,
42
+ value: null
43
+ });
44
+ // Skip anti-files (these mark files to delete in delta archives)
45
+ if (entry.isAntiFile) {
46
+ iterator.push(nextEntry);
47
+ return callback(null, null);
48
+ }
49
+ // Determine type from entry
50
+ var type = entry.type;
51
+ // Default modes (decimal values for Node 0.8 compatibility)
52
+ // 0o755 = 493, 0o644 = 420
53
+ var defaultMode = type === 'directory' ? 493 : 420;
54
+ // Build attributes from 7z entry
55
+ // mtime must be timestamp (number) for FileAttributes compatibility
56
+ var mtimeDate = entry.mtime || new Date();
57
+ var attributes = {
58
+ path: (0, _lodashcompact.default)(entry.path.split(_path.default.sep)).join(_path.default.sep),
59
+ basename: entry.name,
60
+ mtime: mtimeDate.getTime(),
61
+ mode: entry.mode !== undefined ? entry.mode : defaultMode
62
+ };
63
+ switch(type){
64
+ case 'directory':
65
+ attributes.type = 'directory';
66
+ return nextCallback(null, new _extractbaseiterator.DirectoryEntry(attributes));
67
+ case 'link':
68
+ {
69
+ // For symlinks, the file content IS the symlink target path
70
+ // Read the content to get the linkpath for SymbolicLinkEntry
71
+ var parser = iterator.iterator.getParser();
72
+ var stream = parser.getEntryStream(entry);
73
+ var chunks = [];
74
+ stream.on('data', function(chunk) {
75
+ chunks.push(chunk);
76
+ });
77
+ stream.on('end', function() {
78
+ var linkpath = Buffer.concat(chunks).toString('utf8');
79
+ var linkAttributes = {
80
+ path: attributes.path,
81
+ mtime: attributes.mtime,
82
+ mode: attributes.mode,
83
+ linkpath: linkpath
84
+ };
85
+ nextCallback(null, new _extractbaseiterator.SymbolicLinkEntry(linkAttributes));
86
+ });
87
+ stream.on('error', function(err) {
88
+ nextCallback(err);
89
+ });
90
+ return;
91
+ }
92
+ case 'file':
93
+ {
94
+ attributes.type = 'file';
95
+ attributes.size = entry.size;
96
+ var parser2 = iterator.iterator.getParser();
97
+ return nextCallback(null, new _FileEntryts.default(attributes, entry, parser2, iterator.lock));
98
+ }
99
+ }
100
+ return callback(new Error("Unrecognized entry type: ".concat(type)));
101
+ }
102
+ /* 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; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/nextEntry.ts"],"sourcesContent":["import once from 'call-once-fn';\nimport { type DirectoryAttributes, DirectoryEntry, type FileAttributes, type LinkAttributes, SymbolicLinkEntry } from 'extract-base-iterator';\nimport compact from 'lodash.compact';\nimport path from 'path';\nimport FileEntry from './FileEntry.ts';\nimport type SevenZipIterator from './SevenZipIterator.ts';\nimport type { SevenZipEntry } from './sevenz/SevenZipParser.ts';\nimport type { Entry, EntryCallback } from './types.ts';\n\nexport type NextCallback = (error?: Error, entry?: Entry) => undefined;\n\n// Entry attributes object that gets mutated in switch - union of possible shapes\n// mtime is number for FileAttributes compatibility (timestamp in ms)\ntype EntryAttributesBuilder = {\n path: string;\n basename: string;\n mtime: number;\n mode: number;\n type?: 'file' | 'directory';\n size?: number;\n};\n\nexport default function nextEntry<_T>(iterator: SevenZipIterator, callback: EntryCallback): undefined {\n if (!iterator.iterator) {\n callback(new Error('iterator missing'));\n return;\n }\n\n var entry: SevenZipEntry | null = null;\n entry = iterator.iterator.next();\n\n var nextCallback = once((err?: Error, entry?: Entry) => {\n // keep processing\n if (entry) iterator.push(nextEntry);\n err ? callback(err) : callback(null, entry ? { done: false, value: entry } : { done: true, value: null });\n }) as NextCallback;\n\n // done: signal iteration is complete\n if (iterator.isDone() || !entry) return callback(null, { done: true, value: null });\n\n // Skip anti-files (these mark files to delete in delta archives)\n if (entry.isAntiFile) {\n iterator.push(nextEntry);\n return callback(null, null);\n }\n\n // Determine type from entry\n var type = entry.type;\n\n // Default modes (decimal values for Node 0.8 compatibility)\n // 0o755 = 493, 0o644 = 420\n var defaultMode = type === 'directory' ? 493 : 420;\n\n // Build attributes from 7z entry\n // mtime must be timestamp (number) for FileAttributes compatibility\n var mtimeDate = entry.mtime || new Date();\n var attributes: EntryAttributesBuilder = {\n path: compact(entry.path.split(path.sep)).join(path.sep),\n basename: entry.name,\n mtime: mtimeDate.getTime(),\n mode: entry.mode !== undefined ? entry.mode : defaultMode,\n };\n\n switch (type) {\n case 'directory':\n attributes.type = 'directory';\n return nextCallback(null, new DirectoryEntry(attributes as DirectoryAttributes));\n\n case 'link': {\n // For symlinks, the file content IS the symlink target path\n // Read the content to get the linkpath for SymbolicLinkEntry\n var parser = iterator.iterator.getParser();\n var stream = parser.getEntryStream(entry);\n var chunks: Buffer[] = [];\n\n stream.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n stream.on('end', () => {\n var linkpath = Buffer.concat(chunks).toString('utf8');\n\n var linkAttributes: LinkAttributes = {\n path: attributes.path,\n mtime: attributes.mtime,\n mode: attributes.mode,\n linkpath: linkpath,\n };\n\n nextCallback(null, new SymbolicLinkEntry(linkAttributes));\n });\n stream.on('error', (err: Error) => {\n nextCallback(err);\n });\n return;\n }\n\n case 'file': {\n attributes.type = 'file';\n attributes.size = entry.size;\n var parser2 = iterator.iterator.getParser();\n return nextCallback(null, new FileEntry(attributes as FileAttributes, entry, parser2, iterator.lock));\n }\n }\n\n return callback(new Error(`Unrecognized entry type: ${type}`));\n}\n"],"names":["nextEntry","iterator","callback","Error","entry","next","nextCallback","once","err","push","done","value","isDone","isAntiFile","type","defaultMode","mtimeDate","mtime","Date","attributes","path","compact","split","sep","join","basename","name","getTime","mode","undefined","DirectoryEntry","parser","getParser","stream","getEntryStream","chunks","on","chunk","linkpath","Buffer","concat","toString","linkAttributes","SymbolicLinkEntry","size","parser2","FileEntry","lock"],"mappings":";;;;+BAsBA;;;eAAwBA;;;iEAtBP;mCACqG;oEAClG;2DACH;kEACK;;;;;;AAkBP,SAASA,UAAcC,QAA0B,EAAEC,QAAuB;IACvF,IAAI,CAACD,SAASA,QAAQ,EAAE;QACtBC,SAAS,IAAIC,MAAM;QACnB;IACF;IAEA,IAAIC,QAA8B;IAClCA,QAAQH,SAASA,QAAQ,CAACI,IAAI;IAE9B,IAAIC,eAAeC,IAAAA,mBAAI,EAAC,SAACC,KAAaJ;QACpC,kBAAkB;QAClB,IAAIA,OAAOH,SAASQ,IAAI,CAACT;QACzBQ,MAAMN,SAASM,OAAON,SAAS,MAAME,QAAQ;YAAEM,MAAM;YAAOC,OAAOP;QAAM,IAAI;YAAEM,MAAM;YAAMC,OAAO;QAAK;IACzG;IAEA,qCAAqC;IACrC,IAAIV,SAASW,MAAM,MAAM,CAACR,OAAO,OAAOF,SAAS,MAAM;QAAEQ,MAAM;QAAMC,OAAO;IAAK;IAEjF,iEAAiE;IACjE,IAAIP,MAAMS,UAAU,EAAE;QACpBZ,SAASQ,IAAI,CAACT;QACd,OAAOE,SAAS,MAAM;IACxB;IAEA,4BAA4B;IAC5B,IAAIY,OAAOV,MAAMU,IAAI;IAErB,4DAA4D;IAC5D,2BAA2B;IAC3B,IAAIC,cAAcD,SAAS,cAAc,MAAM;IAE/C,iCAAiC;IACjC,oEAAoE;IACpE,IAAIE,YAAYZ,MAAMa,KAAK,IAAI,IAAIC;IACnC,IAAIC,aAAqC;QACvCC,MAAMC,IAAAA,sBAAO,EAACjB,MAAMgB,IAAI,CAACE,KAAK,CAACF,aAAI,CAACG,GAAG,GAAGC,IAAI,CAACJ,aAAI,CAACG,GAAG;QACvDE,UAAUrB,MAAMsB,IAAI;QACpBT,OAAOD,UAAUW,OAAO;QACxBC,MAAMxB,MAAMwB,IAAI,KAAKC,YAAYzB,MAAMwB,IAAI,GAAGb;IAChD;IAEA,OAAQD;QACN,KAAK;YACHK,WAAWL,IAAI,GAAG;YAClB,OAAOR,aAAa,MAAM,IAAIwB,mCAAc,CAACX;QAE/C,KAAK;YAAQ;gBACX,4DAA4D;gBAC5D,6DAA6D;gBAC7D,IAAIY,SAAS9B,SAASA,QAAQ,CAAC+B,SAAS;gBACxC,IAAIC,SAASF,OAAOG,cAAc,CAAC9B;gBACnC,IAAI+B,SAAmB,EAAE;gBAEzBF,OAAOG,EAAE,CAAC,QAAQ,SAACC;oBACjBF,OAAO1B,IAAI,CAAC4B;gBACd;gBACAJ,OAAOG,EAAE,CAAC,OAAO;oBACf,IAAIE,WAAWC,OAAOC,MAAM,CAACL,QAAQM,QAAQ,CAAC;oBAE9C,IAAIC,iBAAiC;wBACnCtB,MAAMD,WAAWC,IAAI;wBACrBH,OAAOE,WAAWF,KAAK;wBACvBW,MAAMT,WAAWS,IAAI;wBACrBU,UAAUA;oBACZ;oBAEAhC,aAAa,MAAM,IAAIqC,sCAAiB,CAACD;gBAC3C;gBACAT,OAAOG,EAAE,CAAC,SAAS,SAAC5B;oBAClBF,aAAaE;gBACf;gBACA;YACF;QAEA,KAAK;YAAQ;gBACXW,WAAWL,IAAI,GAAG;gBAClBK,WAAWyB,IAAI,GAAGxC,MAAMwC,IAAI;gBAC5B,IAAIC,UAAU5C,SAASA,QAAQ,CAAC+B,SAAS;gBACzC,OAAO1B,aAAa,MAAM,IAAIwC,oBAAS,CAAC3B,YAA8Bf,OAAOyC,SAAS5C,SAAS8C,IAAI;YACrG;IACF;IAEA,OAAO7C,SAAS,IAAIC,MAAM,AAAC,4BAAgC,OAALW;AACxD"}
@@ -0,0 +1 @@
1
+ { "type": "commonjs" }
@@ -0,0 +1,58 @@
1
+ export interface NumberReadResult {
2
+ value: number;
3
+ bytesRead: number;
4
+ }
5
+ /**
6
+ * Read a variable-length encoded number from a buffer
7
+ * @param buf - Buffer containing encoded number
8
+ * @param offset - Offset to start reading from
9
+ * @returns Object with value and number of bytes consumed
10
+ */
11
+ export declare function readNumber(buf: Buffer, offset: number): NumberReadResult;
12
+ /**
13
+ * Read a raw 64-bit little-endian number (used in some fixed-size fields)
14
+ * @param buf - Buffer containing the number
15
+ * @param offset - Offset to start reading from
16
+ * @returns The number value
17
+ */
18
+ export declare function readRawNumber(buf: Buffer, offset: number): number;
19
+ /**
20
+ * Calculate the encoded size of a number
21
+ * @param value - The number to encode
22
+ * @returns Number of bytes needed to encode the value
23
+ */
24
+ export declare function encodedSize(value: number): number;
25
+ /**
26
+ * Read a boolean encoded as a single byte
27
+ * @param buf - Buffer to read from
28
+ * @param offset - Offset to read from
29
+ * @returns true if byte is non-zero
30
+ */
31
+ export declare function readBoolean(buf: Buffer, offset: number): boolean;
32
+ /**
33
+ * Read a "defined" bitmask for an array of items.
34
+ * Used when some items in a list have optional values.
35
+ *
36
+ * Format: If "allDefined" byte is 0, a bitmask follows indicating which items have values.
37
+ * If "allDefined" byte is non-zero, all items are defined.
38
+ *
39
+ * @param buf - Buffer to read from
40
+ * @param offset - Offset to start reading
41
+ * @param count - Number of items
42
+ * @returns Object with defined array and bytes consumed
43
+ */
44
+ export declare function readDefinedVector(buf: Buffer, offset: number, count: number): {
45
+ defined: boolean[];
46
+ bytesRead: number;
47
+ };
48
+ /**
49
+ * Read an array of variable-length numbers
50
+ * @param buf - Buffer to read from
51
+ * @param offset - Offset to start reading
52
+ * @param count - Number of items to read
53
+ * @returns Object with values array and bytes consumed
54
+ */
55
+ export declare function readNumberArray(buf: Buffer, offset: number, count: number): {
56
+ values: number[];
57
+ bytesRead: number;
58
+ };
@@ -0,0 +1,58 @@
1
+ export interface NumberReadResult {
2
+ value: number;
3
+ bytesRead: number;
4
+ }
5
+ /**
6
+ * Read a variable-length encoded number from a buffer
7
+ * @param buf - Buffer containing encoded number
8
+ * @param offset - Offset to start reading from
9
+ * @returns Object with value and number of bytes consumed
10
+ */
11
+ export declare function readNumber(buf: Buffer, offset: number): NumberReadResult;
12
+ /**
13
+ * Read a raw 64-bit little-endian number (used in some fixed-size fields)
14
+ * @param buf - Buffer containing the number
15
+ * @param offset - Offset to start reading from
16
+ * @returns The number value
17
+ */
18
+ export declare function readRawNumber(buf: Buffer, offset: number): number;
19
+ /**
20
+ * Calculate the encoded size of a number
21
+ * @param value - The number to encode
22
+ * @returns Number of bytes needed to encode the value
23
+ */
24
+ export declare function encodedSize(value: number): number;
25
+ /**
26
+ * Read a boolean encoded as a single byte
27
+ * @param buf - Buffer to read from
28
+ * @param offset - Offset to read from
29
+ * @returns true if byte is non-zero
30
+ */
31
+ export declare function readBoolean(buf: Buffer, offset: number): boolean;
32
+ /**
33
+ * Read a "defined" bitmask for an array of items.
34
+ * Used when some items in a list have optional values.
35
+ *
36
+ * Format: If "allDefined" byte is 0, a bitmask follows indicating which items have values.
37
+ * If "allDefined" byte is non-zero, all items are defined.
38
+ *
39
+ * @param buf - Buffer to read from
40
+ * @param offset - Offset to start reading
41
+ * @param count - Number of items
42
+ * @returns Object with defined array and bytes consumed
43
+ */
44
+ export declare function readDefinedVector(buf: Buffer, offset: number, count: number): {
45
+ defined: boolean[];
46
+ bytesRead: number;
47
+ };
48
+ /**
49
+ * Read an array of variable-length numbers
50
+ * @param buf - Buffer to read from
51
+ * @param offset - Offset to start reading
52
+ * @param count - Number of items to read
53
+ * @returns Object with values array and bytes consumed
54
+ */
55
+ export declare function readNumberArray(buf: Buffer, offset: number, count: number): {
56
+ values: number[];
57
+ bytesRead: number;
58
+ };
@@ -0,0 +1,133 @@
1
+ // Variable-length integer encoding for 7z format
2
+ // Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html
3
+ //
4
+ // 7z uses a space-efficient encoding where the first byte determines length:
5
+ // 0xxxxxxx -> 1 byte (0-127)
6
+ // 10xxxxxx xxxxxxxx -> 2 bytes (0-16383)
7
+ // 110xxxxx + 2 bytes -> 3 bytes
8
+ // 1110xxxx + 3 bytes -> 4 bytes
9
+ // 11110xxx + 4 bytes -> 5 bytes
10
+ // 111110xx + 5 bytes -> 6 bytes
11
+ // 1111110x + 6 bytes -> 7 bytes
12
+ // 11111110 + 7 bytes -> 8 bytes
13
+ // 11111111 + 8 bytes -> 9 bytes (full 64-bit)
14
+ //
15
+ // NOTE: Returns JavaScript number which is accurate up to 2^53 - 1 (~9 PB).
16
+ // This covers all practical file sizes.
17
+ "use strict";
18
+ Object.defineProperty(exports, "__esModule", {
19
+ value: true
20
+ });
21
+ function _export(target, all) {
22
+ for(var name in all)Object.defineProperty(target, name, {
23
+ enumerable: true,
24
+ get: Object.getOwnPropertyDescriptor(all, name).get
25
+ });
26
+ }
27
+ _export(exports, {
28
+ get encodedSize () {
29
+ return encodedSize;
30
+ },
31
+ get readBoolean () {
32
+ return readBoolean;
33
+ },
34
+ get readDefinedVector () {
35
+ return readDefinedVector;
36
+ },
37
+ get readNumber () {
38
+ return readNumber;
39
+ },
40
+ get readNumberArray () {
41
+ return readNumberArray;
42
+ },
43
+ get readRawNumber () {
44
+ return readRawNumber;
45
+ }
46
+ });
47
+ var _extractbaseiterator = require("extract-base-iterator");
48
+ function readNumber(buf, offset) {
49
+ var firstByte = buf[offset];
50
+ // Count leading 1 bits to determine extra bytes
51
+ var mask = 0x80;
52
+ var extraBytes = 0;
53
+ while((firstByte & mask) !== 0 && extraBytes < 8){
54
+ extraBytes++;
55
+ mask = mask >>> 1;
56
+ }
57
+ // Special case: all 8 bits set means 8 extra bytes
58
+ if (extraBytes === 8) {
59
+ // Full 64-bit value follows
60
+ return {
61
+ value: (0, _extractbaseiterator.readUInt64LE)(buf, offset + 1),
62
+ bytesRead: 9
63
+ };
64
+ }
65
+ // Mask off the length bits from first byte
66
+ var value = firstByte & (mask - 1 | mask);
67
+ // Add remaining bytes (big-endian order)
68
+ for(var i = 0; i < extraBytes; i++){
69
+ value = value * 256 + buf[offset + 1 + i];
70
+ }
71
+ return {
72
+ value: value,
73
+ bytesRead: 1 + extraBytes
74
+ };
75
+ }
76
+ function readRawNumber(buf, offset) {
77
+ return (0, _extractbaseiterator.readUInt64LE)(buf, offset);
78
+ }
79
+ function encodedSize(value) {
80
+ if (value < 0x80) return 1; // 7 bits
81
+ if (value < 0x4000) return 2; // 14 bits
82
+ if (value < 0x200000) return 3; // 21 bits
83
+ if (value < 0x10000000) return 4; // 28 bits
84
+ if (value < 0x800000000) return 5; // 35 bits
85
+ if (value < 0x40000000000) return 6; // 42 bits
86
+ if (value < 0x2000000000000) return 7; // 49 bits
87
+ // 2^56 = 72057594037927936 (use calculated value to avoid precision loss)
88
+ if (value < 72057594037927936) return 8; // 56 bits
89
+ return 9; // 64 bits
90
+ }
91
+ function readBoolean(buf, offset) {
92
+ return buf[offset] !== 0;
93
+ }
94
+ function readDefinedVector(buf, offset, count) {
95
+ var allDefined = buf[offset] !== 0;
96
+ var bytesRead = 1;
97
+ var defined = [];
98
+ if (allDefined) {
99
+ // All items are defined
100
+ for(var i = 0; i < count; i++){
101
+ defined.push(true);
102
+ }
103
+ } else {
104
+ // Read bitmask
105
+ var bitsNeeded = count;
106
+ var bytesNeeded = Math.ceil(bitsNeeded / 8);
107
+ for(var byteIdx = 0; byteIdx < bytesNeeded; byteIdx++){
108
+ var byte = buf[offset + 1 + byteIdx];
109
+ for(var bit = 7; bit >= 0 && defined.length < count; bit--){
110
+ defined.push((byte & 1 << bit) !== 0);
111
+ }
112
+ }
113
+ bytesRead += bytesNeeded;
114
+ }
115
+ return {
116
+ defined: defined,
117
+ bytesRead: bytesRead
118
+ };
119
+ }
120
+ function readNumberArray(buf, offset, count) {
121
+ var values = [];
122
+ var totalBytesRead = 0;
123
+ for(var i = 0; i < count; i++){
124
+ var result = readNumber(buf, offset + totalBytesRead);
125
+ values.push(result.value);
126
+ totalBytesRead += result.bytesRead;
127
+ }
128
+ return {
129
+ values: values,
130
+ bytesRead: totalBytesRead
131
+ };
132
+ }
133
+ /* 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; }