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.
- package/LICENSE +42 -0
- package/README.md +142 -0
- package/dist/cjs/FileEntry.d.cts +12 -0
- package/dist/cjs/FileEntry.d.ts +12 -0
- package/dist/cjs/FileEntry.js +147 -0
- package/dist/cjs/FileEntry.js.map +1 -0
- package/dist/cjs/SevenZipIterator.d.cts +8 -0
- package/dist/cjs/SevenZipIterator.d.ts +8 -0
- package/dist/cjs/SevenZipIterator.js +204 -0
- package/dist/cjs/SevenZipIterator.js.map +1 -0
- package/dist/cjs/index.d.cts +4 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +40 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lib/Lock.d.cts +11 -0
- package/dist/cjs/lib/Lock.d.ts +11 -0
- package/dist/cjs/lib/Lock.js +65 -0
- package/dist/cjs/lib/Lock.js.map +1 -0
- package/dist/cjs/lib/streamToSource.d.cts +20 -0
- package/dist/cjs/lib/streamToSource.d.ts +20 -0
- package/dist/cjs/lib/streamToSource.js +116 -0
- package/dist/cjs/lib/streamToSource.js.map +1 -0
- package/dist/cjs/nextEntry.d.cts +4 -0
- package/dist/cjs/nextEntry.d.ts +4 -0
- package/dist/cjs/nextEntry.js +102 -0
- package/dist/cjs/nextEntry.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/sevenz/NumberCodec.d.cts +58 -0
- package/dist/cjs/sevenz/NumberCodec.d.ts +58 -0
- package/dist/cjs/sevenz/NumberCodec.js +133 -0
- package/dist/cjs/sevenz/NumberCodec.js.map +1 -0
- package/dist/cjs/sevenz/SevenZipParser.d.cts +96 -0
- package/dist/cjs/sevenz/SevenZipParser.d.ts +96 -0
- package/dist/cjs/sevenz/SevenZipParser.js +457 -0
- package/dist/cjs/sevenz/SevenZipParser.js.map +1 -0
- package/dist/cjs/sevenz/codecs/Aes.d.cts +22 -0
- package/dist/cjs/sevenz/codecs/Aes.d.ts +22 -0
- package/dist/cjs/sevenz/codecs/Aes.js +179 -0
- package/dist/cjs/sevenz/codecs/Aes.js.map +1 -0
- package/dist/cjs/sevenz/codecs/BZip2.d.cts +14 -0
- package/dist/cjs/sevenz/codecs/BZip2.d.ts +14 -0
- package/dist/cjs/sevenz/codecs/BZip2.js +37 -0
- package/dist/cjs/sevenz/codecs/BZip2.js.map +1 -0
- package/dist/cjs/sevenz/codecs/Bcj.d.cts +15 -0
- package/dist/cjs/sevenz/codecs/Bcj.d.ts +15 -0
- package/dist/cjs/sevenz/codecs/Bcj.js +89 -0
- package/dist/cjs/sevenz/codecs/Bcj.js.map +1 -0
- package/dist/cjs/sevenz/codecs/Copy.d.cts +14 -0
- package/dist/cjs/sevenz/codecs/Copy.d.ts +14 -0
- package/dist/cjs/sevenz/codecs/Copy.js +28 -0
- package/dist/cjs/sevenz/codecs/Copy.js.map +1 -0
- package/dist/cjs/sevenz/codecs/Deflate.d.cts +14 -0
- package/dist/cjs/sevenz/codecs/Deflate.d.ts +14 -0
- package/dist/cjs/sevenz/codecs/Deflate.js +39 -0
- package/dist/cjs/sevenz/codecs/Deflate.js.map +1 -0
- package/dist/cjs/sevenz/codecs/Delta.d.cts +15 -0
- package/dist/cjs/sevenz/codecs/Delta.d.ts +15 -0
- package/dist/cjs/sevenz/codecs/Delta.js +55 -0
- package/dist/cjs/sevenz/codecs/Delta.js.map +1 -0
- package/dist/cjs/sevenz/codecs/Lzma.d.cts +14 -0
- package/dist/cjs/sevenz/codecs/Lzma.d.ts +14 -0
- package/dist/cjs/sevenz/codecs/Lzma.js +53 -0
- package/dist/cjs/sevenz/codecs/Lzma.js.map +1 -0
- package/dist/cjs/sevenz/codecs/Lzma2.d.cts +14 -0
- package/dist/cjs/sevenz/codecs/Lzma2.d.ts +14 -0
- package/dist/cjs/sevenz/codecs/Lzma2.js +160 -0
- package/dist/cjs/sevenz/codecs/Lzma2.js.map +1 -0
- package/dist/cjs/sevenz/codecs/createBufferingDecoder.d.cts +7 -0
- package/dist/cjs/sevenz/codecs/createBufferingDecoder.d.ts +7 -0
- package/dist/cjs/sevenz/codecs/createBufferingDecoder.js +36 -0
- package/dist/cjs/sevenz/codecs/createBufferingDecoder.js.map +1 -0
- package/dist/cjs/sevenz/codecs/index.d.cts +24 -0
- package/dist/cjs/sevenz/codecs/index.d.ts +24 -0
- package/dist/cjs/sevenz/codecs/index.js +128 -0
- package/dist/cjs/sevenz/codecs/index.js.map +1 -0
- package/dist/cjs/sevenz/codecs/streams.d.cts +18 -0
- package/dist/cjs/sevenz/codecs/streams.d.ts +18 -0
- package/dist/cjs/sevenz/codecs/streams.js +79 -0
- package/dist/cjs/sevenz/codecs/streams.js.map +1 -0
- package/dist/cjs/sevenz/constants.d.cts +86 -0
- package/dist/cjs/sevenz/constants.d.ts +86 -0
- package/dist/cjs/sevenz/constants.js +162 -0
- package/dist/cjs/sevenz/constants.js.map +1 -0
- package/dist/cjs/sevenz/headers.d.cts +70 -0
- package/dist/cjs/sevenz/headers.d.ts +70 -0
- package/dist/cjs/sevenz/headers.js +661 -0
- package/dist/cjs/sevenz/headers.js.map +1 -0
- package/dist/cjs/sevenz/index.d.cts +4 -0
- package/dist/cjs/sevenz/index.d.ts +4 -0
- package/dist/cjs/sevenz/index.js +33 -0
- package/dist/cjs/sevenz/index.js.map +1 -0
- package/dist/cjs/types.d.cts +37 -0
- package/dist/cjs/types.d.ts +37 -0
- package/dist/cjs/types.js +32 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/FileEntry.d.ts +12 -0
- package/dist/esm/FileEntry.js +63 -0
- package/dist/esm/FileEntry.js.map +1 -0
- package/dist/esm/SevenZipIterator.d.ts +8 -0
- package/dist/esm/SevenZipIterator.js +116 -0
- package/dist/esm/SevenZipIterator.js.map +1 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/Lock.d.ts +11 -0
- package/dist/esm/lib/Lock.js +41 -0
- package/dist/esm/lib/Lock.js.map +1 -0
- package/dist/esm/lib/streamToSource.d.ts +20 -0
- package/dist/esm/lib/streamToSource.js +100 -0
- package/dist/esm/lib/streamToSource.js.map +1 -0
- package/dist/esm/nextEntry.d.ts +4 -0
- package/dist/esm/nextEntry.js +86 -0
- package/dist/esm/nextEntry.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/sevenz/NumberCodec.d.ts +58 -0
- package/dist/esm/sevenz/NumberCodec.js +138 -0
- package/dist/esm/sevenz/NumberCodec.js.map +1 -0
- package/dist/esm/sevenz/SevenZipParser.d.ts +96 -0
- package/dist/esm/sevenz/SevenZipParser.js +419 -0
- package/dist/esm/sevenz/SevenZipParser.js.map +1 -0
- package/dist/esm/sevenz/codecs/Aes.d.ts +22 -0
- package/dist/esm/sevenz/codecs/Aes.js +162 -0
- package/dist/esm/sevenz/codecs/Aes.js.map +1 -0
- package/dist/esm/sevenz/codecs/BZip2.d.ts +14 -0
- package/dist/esm/sevenz/codecs/BZip2.js +22 -0
- package/dist/esm/sevenz/codecs/BZip2.js.map +1 -0
- package/dist/esm/sevenz/codecs/Bcj.d.ts +15 -0
- package/dist/esm/sevenz/codecs/Bcj.js +75 -0
- package/dist/esm/sevenz/codecs/Bcj.js.map +1 -0
- package/dist/esm/sevenz/codecs/Copy.d.ts +14 -0
- package/dist/esm/sevenz/codecs/Copy.js +18 -0
- package/dist/esm/sevenz/codecs/Copy.js.map +1 -0
- package/dist/esm/sevenz/codecs/Deflate.d.ts +14 -0
- package/dist/esm/sevenz/codecs/Deflate.js +24 -0
- package/dist/esm/sevenz/codecs/Deflate.js.map +1 -0
- package/dist/esm/sevenz/codecs/Delta.d.ts +15 -0
- package/dist/esm/sevenz/codecs/Delta.js +41 -0
- package/dist/esm/sevenz/codecs/Delta.js.map +1 -0
- package/dist/esm/sevenz/codecs/Lzma.d.ts +14 -0
- package/dist/esm/sevenz/codecs/Lzma.js +38 -0
- package/dist/esm/sevenz/codecs/Lzma.js.map +1 -0
- package/dist/esm/sevenz/codecs/Lzma2.d.ts +14 -0
- package/dist/esm/sevenz/codecs/Lzma2.js +145 -0
- package/dist/esm/sevenz/codecs/Lzma2.js.map +1 -0
- package/dist/esm/sevenz/codecs/createBufferingDecoder.d.ts +7 -0
- package/dist/esm/sevenz/codecs/createBufferingDecoder.js +25 -0
- package/dist/esm/sevenz/codecs/createBufferingDecoder.js.map +1 -0
- package/dist/esm/sevenz/codecs/index.d.ts +24 -0
- package/dist/esm/sevenz/codecs/index.js +108 -0
- package/dist/esm/sevenz/codecs/index.js.map +1 -0
- package/dist/esm/sevenz/codecs/streams.d.ts +18 -0
- package/dist/esm/sevenz/codecs/streams.js +66 -0
- package/dist/esm/sevenz/codecs/streams.js.map +1 -0
- package/dist/esm/sevenz/constants.d.ts +86 -0
- package/dist/esm/sevenz/constants.js +131 -0
- package/dist/esm/sevenz/constants.js.map +1 -0
- package/dist/esm/sevenz/headers.d.ts +70 -0
- package/dist/esm/sevenz/headers.js +646 -0
- package/dist/esm/sevenz/headers.js.map +1 -0
- package/dist/esm/sevenz/index.d.ts +4 -0
- package/dist/esm/sevenz/index.js +5 -0
- package/dist/esm/sevenz/index.js.map +1 -0
- package/dist/esm/types.d.ts +37 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/package.json +77 -0
|
@@ -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; }
|