@push.rocks/smartarchive 4.2.4 → 5.0.1
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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/bzip2/bititerator.d.ts +6 -1
- package/dist_ts/bzip2/bititerator.js +30 -24
- package/dist_ts/bzip2/bzip2.d.ts +27 -12
- package/dist_ts/bzip2/bzip2.js +325 -263
- package/dist_ts/bzip2/index.d.ts +4 -1
- package/dist_ts/bzip2/index.js +36 -38
- package/dist_ts/classes.archiveanalyzer.d.ts +25 -5
- package/dist_ts/classes.archiveanalyzer.js +19 -8
- package/dist_ts/classes.bzip2tools.d.ts +1 -1
- package/dist_ts/classes.gziptools.d.ts +43 -6
- package/dist_ts/classes.gziptools.js +76 -24
- package/dist_ts/classes.smartarchive.d.ts +198 -16
- package/dist_ts/classes.smartarchive.js +652 -79
- package/dist_ts/classes.tartools.d.ts +31 -4
- package/dist_ts/classes.tartools.js +93 -32
- package/dist_ts/classes.ziptools.d.ts +47 -12
- package/dist_ts/classes.ziptools.js +128 -23
- package/dist_ts/errors.d.ts +44 -0
- package/dist_ts/errors.js +62 -0
- package/dist_ts/index.d.ts +4 -0
- package/dist_ts/index.js +9 -1
- package/dist_ts/interfaces.d.ts +119 -0
- package/dist_ts/interfaces.js +2 -0
- package/package.json +1 -1
- package/readme.hints.md +69 -23
- package/readme.md +360 -274
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/bzip2/bititerator.ts +43 -27
- package/ts/bzip2/bzip2.ts +289 -171
- package/ts/bzip2/index.ts +52 -50
- package/ts/classes.archiveanalyzer.ts +42 -28
- package/ts/classes.gziptools.ts +91 -33
- package/ts/classes.smartarchive.ts +765 -140
- package/ts/classes.tartools.ts +124 -52
- package/ts/classes.ziptools.ts +147 -34
- package/ts/errors.ts +70 -0
- package/ts/index.ts +11 -0
- package/ts/interfaces.ts +136 -0
package/dist_ts/bzip2/index.d.ts
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Creates a streaming BZIP2 decompression transform
|
|
4
|
+
*/
|
|
5
|
+
export declare function unbzip2Stream(): plugins.smartstream.SmartDuplex<Buffer, Buffer>;
|
package/dist_ts/bzip2/index.js
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
|
+
import { Bzip2Error, BZIP2_ERROR_CODES } from '../errors.js';
|
|
2
3
|
import { Bzip2 } from './bzip2.js';
|
|
3
4
|
import { bitIterator } from './bititerator.js';
|
|
5
|
+
/**
|
|
6
|
+
* Creates a streaming BZIP2 decompression transform
|
|
7
|
+
*/
|
|
4
8
|
export function unbzip2Stream() {
|
|
5
9
|
const bzip2Instance = new Bzip2();
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var streamCRC = null;
|
|
10
|
+
const bufferQueue = [];
|
|
11
|
+
let hasBytes = 0;
|
|
12
|
+
let blockSize = 0;
|
|
13
|
+
let broken = false;
|
|
14
|
+
let bitReader = null;
|
|
15
|
+
let streamCRC = null;
|
|
13
16
|
function decompressBlock() {
|
|
14
17
|
if (!blockSize) {
|
|
15
18
|
blockSize = bzip2Instance.header(bitReader);
|
|
16
19
|
streamCRC = 0;
|
|
20
|
+
return undefined;
|
|
17
21
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
return Buffer.from(chunk);
|
|
33
|
-
}
|
|
22
|
+
const bufsize = 100000 * blockSize;
|
|
23
|
+
const buf = new Int32Array(bufsize);
|
|
24
|
+
const chunk = [];
|
|
25
|
+
const outputFunc = (b) => {
|
|
26
|
+
chunk.push(b);
|
|
27
|
+
};
|
|
28
|
+
streamCRC = bzip2Instance.decompress(bitReader, outputFunc, buf, bufsize, streamCRC);
|
|
29
|
+
if (streamCRC === null) {
|
|
30
|
+
// Reset for next bzip2 header
|
|
31
|
+
blockSize = 0;
|
|
32
|
+
return undefined;
|
|
34
33
|
}
|
|
34
|
+
return Buffer.from(chunk);
|
|
35
35
|
}
|
|
36
|
-
|
|
36
|
+
let outlength = 0;
|
|
37
37
|
const decompressAndPush = async () => {
|
|
38
38
|
if (broken)
|
|
39
|
-
return;
|
|
39
|
+
return undefined;
|
|
40
40
|
try {
|
|
41
41
|
const resultChunk = decompressBlock();
|
|
42
42
|
if (resultChunk) {
|
|
@@ -45,18 +45,18 @@ export function unbzip2Stream() {
|
|
|
45
45
|
return resultChunk;
|
|
46
46
|
}
|
|
47
47
|
catch (e) {
|
|
48
|
-
console.error(e);
|
|
49
48
|
broken = true;
|
|
49
|
+
if (e instanceof Error) {
|
|
50
|
+
throw new Bzip2Error(`Decompression failed: ${e.message}`, BZIP2_ERROR_CODES.INVALID_BLOCK_DATA);
|
|
51
|
+
}
|
|
52
|
+
throw e;
|
|
50
53
|
}
|
|
51
54
|
};
|
|
52
|
-
let counter = 0;
|
|
53
55
|
return new plugins.smartstream.SmartDuplex({
|
|
54
56
|
objectMode: true,
|
|
55
57
|
name: 'bzip2',
|
|
56
|
-
debug: false,
|
|
57
58
|
highWaterMark: 1,
|
|
58
59
|
writeFunction: async function (data, streamTools) {
|
|
59
|
-
// console.log(`got chunk ${counter++}`)
|
|
60
60
|
bufferQueue.push(data);
|
|
61
61
|
hasBytes += data.length;
|
|
62
62
|
if (bitReader === null) {
|
|
@@ -64,19 +64,17 @@ export function unbzip2Stream() {
|
|
|
64
64
|
return bufferQueue.shift();
|
|
65
65
|
});
|
|
66
66
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
//console.error('decompressing with', hasBytes - bitReader.bytesRead + 1, 'bytes in buffer');
|
|
67
|
+
const threshold = 25000 + 100000 * blockSize || 4;
|
|
68
|
+
while (!broken && hasBytes - bitReader.bytesRead + 1 >= threshold) {
|
|
70
69
|
const result = await decompressAndPush();
|
|
71
70
|
if (!result) {
|
|
72
71
|
continue;
|
|
73
72
|
}
|
|
74
|
-
// console.log(result.toString());
|
|
75
73
|
await streamTools.push(result);
|
|
76
74
|
}
|
|
75
|
+
return null;
|
|
77
76
|
},
|
|
78
77
|
finalFunction: async function (streamTools) {
|
|
79
|
-
//console.error(x,'last compressing with', hasBytes, 'bytes in buffer');
|
|
80
78
|
while (!broken && bitReader && hasBytes > bitReader.bytesRead) {
|
|
81
79
|
const result = await decompressAndPush();
|
|
82
80
|
if (!result) {
|
|
@@ -84,11 +82,11 @@ export function unbzip2Stream() {
|
|
|
84
82
|
}
|
|
85
83
|
await streamTools.push(result);
|
|
86
84
|
}
|
|
87
|
-
if (!broken) {
|
|
88
|
-
|
|
89
|
-
this.emit('error', new Error('input stream ended prematurely'));
|
|
85
|
+
if (!broken && streamCRC !== null) {
|
|
86
|
+
this.emit('error', new Bzip2Error('Input stream ended prematurely', BZIP2_ERROR_CODES.PREMATURE_END));
|
|
90
87
|
}
|
|
88
|
+
return null;
|
|
91
89
|
},
|
|
92
90
|
});
|
|
93
91
|
}
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9iemlwMi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRzdELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9DOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGFBQWE7SUFDM0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUNsQyxNQUFNLFdBQVcsR0FBYSxFQUFFLENBQUM7SUFDakMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNsQixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDbkIsSUFBSSxTQUFTLEdBQXNCLElBQUksQ0FBQztJQUN4QyxJQUFJLFNBQVMsR0FBa0IsSUFBSSxDQUFDO0lBRXBDLFNBQVMsZUFBZTtRQUN0QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixTQUFTLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxTQUFVLENBQUMsQ0FBQztZQUM3QyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDbkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBRTNCLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBUyxFQUFRLEVBQUU7WUFDckMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztR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
|
|
@@ -1,15 +1,35 @@
|
|
|
1
1
|
import type { SmartArchive } from './classes.smartarchive.js';
|
|
2
2
|
import * as plugins from './plugins.js';
|
|
3
|
+
/**
|
|
4
|
+
* Type for decompression streams
|
|
5
|
+
*/
|
|
6
|
+
export type TDecompressionStream = plugins.stream.Transform | plugins.stream.Duplex | plugins.tarStream.Extract;
|
|
7
|
+
/**
|
|
8
|
+
* Result of archive analysis
|
|
9
|
+
*/
|
|
3
10
|
export interface IAnalyzedResult {
|
|
4
|
-
fileType: plugins.fileType.FileTypeResult;
|
|
11
|
+
fileType: plugins.fileType.FileTypeResult | undefined;
|
|
5
12
|
isArchive: boolean;
|
|
6
|
-
resultStream: plugins.smartstream.SmartDuplex
|
|
7
|
-
decompressionStream:
|
|
13
|
+
resultStream: plugins.smartstream.SmartDuplex<Buffer, Buffer>;
|
|
14
|
+
decompressionStream: TDecompressionStream;
|
|
8
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Analyzes archive streams to detect format and provide decompression
|
|
18
|
+
*/
|
|
9
19
|
export declare class ArchiveAnalyzer {
|
|
10
|
-
smartArchiveRef
|
|
20
|
+
private smartArchiveRef;
|
|
11
21
|
constructor(smartArchiveRefArg: SmartArchive);
|
|
22
|
+
/**
|
|
23
|
+
* Check if a MIME type represents an archive format
|
|
24
|
+
*/
|
|
12
25
|
private mimeTypeIsArchive;
|
|
26
|
+
/**
|
|
27
|
+
* Get the appropriate decompression stream for a MIME type
|
|
28
|
+
*/
|
|
13
29
|
private getDecompressionStream;
|
|
14
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Create an analyzed stream that detects archive type and provides decompression
|
|
32
|
+
* Emits a single IAnalyzedResult object
|
|
33
|
+
*/
|
|
34
|
+
getAnalyzedStream(): plugins.smartstream.SmartDuplex<Buffer, IAnalyzedResult>;
|
|
15
35
|
}
|
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* Analyzes archive streams to detect format and provide decompression
|
|
4
|
+
*/
|
|
2
5
|
export class ArchiveAnalyzer {
|
|
3
6
|
constructor(smartArchiveRefArg) {
|
|
4
7
|
this.smartArchiveRef = smartArchiveRefArg;
|
|
5
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Check if a MIME type represents an archive format
|
|
11
|
+
*/
|
|
6
12
|
async mimeTypeIsArchive(mimeType) {
|
|
13
|
+
if (!mimeType)
|
|
14
|
+
return false;
|
|
7
15
|
const archiveMimeTypes = new Set([
|
|
8
16
|
'application/zip',
|
|
9
17
|
'application/x-rar-compressed',
|
|
@@ -11,10 +19,12 @@ export class ArchiveAnalyzer {
|
|
|
11
19
|
'application/gzip',
|
|
12
20
|
'application/x-7z-compressed',
|
|
13
21
|
'application/x-bzip2',
|
|
14
|
-
// Add other archive mime types here
|
|
15
22
|
]);
|
|
16
23
|
return archiveMimeTypes.has(mimeType);
|
|
17
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Get the appropriate decompression stream for a MIME type
|
|
27
|
+
*/
|
|
18
28
|
async getDecompressionStream(mimeTypeArg) {
|
|
19
29
|
switch (mimeTypeArg) {
|
|
20
30
|
case 'application/gzip':
|
|
@@ -22,14 +32,18 @@ export class ArchiveAnalyzer {
|
|
|
22
32
|
case 'application/zip':
|
|
23
33
|
return this.smartArchiveRef.zipTools.getDecompressionStream();
|
|
24
34
|
case 'application/x-bzip2':
|
|
25
|
-
return
|
|
35
|
+
return this.smartArchiveRef.bzip2Tools.getDecompressionStream();
|
|
26
36
|
case 'application/x-tar':
|
|
27
|
-
return this.smartArchiveRef.tarTools.getDecompressionStream();
|
|
37
|
+
return this.smartArchiveRef.tarTools.getDecompressionStream();
|
|
28
38
|
default:
|
|
29
39
|
// Handle unsupported formats or no decompression needed
|
|
30
40
|
return plugins.smartstream.createPassThrough();
|
|
31
41
|
}
|
|
32
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Create an analyzed stream that detects archive type and provides decompression
|
|
45
|
+
* Emits a single IAnalyzedResult object
|
|
46
|
+
*/
|
|
33
47
|
getAnalyzedStream() {
|
|
34
48
|
let firstRun = true;
|
|
35
49
|
const resultStream = plugins.smartstream.createPassThrough();
|
|
@@ -40,9 +54,6 @@ export class ArchiveAnalyzer {
|
|
|
40
54
|
firstRun = false;
|
|
41
55
|
const fileType = await plugins.fileType.fileTypeFromBuffer(chunkArg);
|
|
42
56
|
const decompressionStream = await this.getDecompressionStream(fileType?.mime);
|
|
43
|
-
/**
|
|
44
|
-
* analyzed stream emits once with this object
|
|
45
|
-
*/
|
|
46
57
|
const result = {
|
|
47
58
|
fileType,
|
|
48
59
|
isArchive: await this.mimeTypeIsArchive(fileType?.mime),
|
|
@@ -54,7 +65,7 @@ export class ArchiveAnalyzer {
|
|
|
54
65
|
await resultStream.backpressuredPush(chunkArg);
|
|
55
66
|
return null;
|
|
56
67
|
},
|
|
57
|
-
finalFunction: async (
|
|
68
|
+
finalFunction: async () => {
|
|
58
69
|
resultStream.push(null);
|
|
59
70
|
return null;
|
|
60
71
|
},
|
|
@@ -62,4 +73,4 @@ export class ArchiveAnalyzer {
|
|
|
62
73
|
return analyzerstream;
|
|
63
74
|
}
|
|
64
75
|
}
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hcmNoaXZlYW5hbHl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmFyY2hpdmVhbmFseXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQW9CeEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUcxQixZQUFZLGtCQUFnQztRQUMxQyxJQUFJLENBQUMsZUFBZSxHQUFHLGtCQUFrQixDQUFDO0lBQzVDLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUE0QjtRQUMxRCxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTVCLE1BQU0sZ0JBQWdCLEdBQWdCLElBQUksR0FBRyxDQUFDO1lBQzVDLGlCQUFpQjtZQUNqQiw4QkFBOEI7WUFDOUIsbUJBQW1CO1lBQ25CLGtCQUFrQjtZQUNsQiw2QkFBNkI7WUFDN0IscUJBQXFCO1NBQ3RCLENBQUMsQ0FBQztRQUVILE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxXQUEyQjtRQUM5RCxRQUFRLFdBQVcsRUFBRSxDQUFDO1lBQ3BCLEtBQUssa0JBQWtCO2dCQUNyQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDakUsS0FBSyxpQkFBaUI7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNoRSxLQUFLLHFCQUFxQjtnQkFDeEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ2xFLEtBQUssbUJBQW1CO2dCQUN0QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDaEU7Z0JBQ0Usd0RBQXdEO2dCQUN4RCxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGlCQUFpQjtRQUN0QixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDcEIsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRTdELE1BQU0sY0FBYyxHQUFHLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQTBCO1lBQ2xGLGtCQUFrQixFQUFFLElBQUk7WUFDeEIsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFnQixFQUFFLFdBQVcsRUFBRSxFQUFFO2dCQUNyRCxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNiLFFBQVEsR0FBRyxLQUFLLENBQUM7b0JBQ2pCLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDckUsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsSUFBc0IsQ0FBQyxDQUFDO29CQUVoRyxNQUFNLE1BQU0sR0FBb0I7d0JBQzlCLFFBQVE7d0JBQ1IsU0FBUyxFQUFFLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7d0JBQ3ZELFlBQVk7d0JBQ1osbUJBQW1CO3FCQUNwQixDQUFDO29CQUNGLE1BQU0sV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakMsQ0FBQztnQkFDRCxNQUFNLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDL0MsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsYUFBYSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUN4QixZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN4QixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7U0FDRixDQUFDLENBQUM7UUFFSCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0NBQ0YifQ==
|
|
@@ -3,5 +3,5 @@ import * as plugins from './plugins.js';
|
|
|
3
3
|
export declare class Bzip2Tools {
|
|
4
4
|
smartArchiveRef: SmartArchive;
|
|
5
5
|
constructor(smartArchiveRefArg: SmartArchive);
|
|
6
|
-
getDecompressionStream(): plugins.smartstream.SmartDuplex<
|
|
6
|
+
getDecompressionStream(): plugins.smartstream.SmartDuplex<Buffer<ArrayBufferLike>, Buffer<ArrayBufferLike>>;
|
|
7
7
|
}
|
|
@@ -1,16 +1,53 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import type { TCompressionLevel } from './interfaces.js';
|
|
3
|
+
/**
|
|
4
|
+
* Transform stream for GZIP compression using fflate
|
|
5
|
+
*/
|
|
6
|
+
export declare class GzipCompressionTransform extends plugins.stream.Transform {
|
|
7
|
+
private gzip;
|
|
8
|
+
constructor(level?: TCompressionLevel);
|
|
4
9
|
_transform(chunk: Buffer, encoding: BufferEncoding, callback: plugins.stream.TransformCallback): void;
|
|
10
|
+
_flush(callback: plugins.stream.TransformCallback): void;
|
|
5
11
|
}
|
|
6
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Transform stream for GZIP decompression using fflate
|
|
14
|
+
*/
|
|
15
|
+
export declare class GzipDecompressionTransform extends plugins.stream.Transform {
|
|
7
16
|
private gunzip;
|
|
8
17
|
constructor();
|
|
9
18
|
_transform(chunk: Buffer, encoding: BufferEncoding, callback: plugins.stream.TransformCallback): void;
|
|
10
19
|
_flush(callback: plugins.stream.TransformCallback): void;
|
|
11
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* GZIP compression and decompression utilities
|
|
23
|
+
*/
|
|
12
24
|
export declare class GzipTools {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Get a streaming compression transform
|
|
27
|
+
*/
|
|
28
|
+
getCompressionStream(level?: TCompressionLevel): plugins.stream.Transform;
|
|
29
|
+
/**
|
|
30
|
+
* Get a streaming decompression transform
|
|
31
|
+
*/
|
|
32
|
+
getDecompressionStream(): plugins.stream.Transform;
|
|
33
|
+
/**
|
|
34
|
+
* Compress data synchronously
|
|
35
|
+
*/
|
|
36
|
+
compressSync(data: Buffer, level?: TCompressionLevel): Buffer;
|
|
37
|
+
/**
|
|
38
|
+
* Decompress data synchronously
|
|
39
|
+
*/
|
|
40
|
+
decompressSync(data: Buffer): Buffer;
|
|
41
|
+
/**
|
|
42
|
+
* Compress data asynchronously
|
|
43
|
+
* Note: Uses sync version for Deno compatibility (fflate async uses Web Workers
|
|
44
|
+
* which have issues in Deno)
|
|
45
|
+
*/
|
|
46
|
+
compress(data: Buffer, level?: TCompressionLevel): Promise<Buffer>;
|
|
47
|
+
/**
|
|
48
|
+
* Decompress data asynchronously
|
|
49
|
+
* Note: Uses sync version for Deno compatibility (fflate async uses Web Workers
|
|
50
|
+
* which have issues in Deno)
|
|
51
|
+
*/
|
|
52
|
+
decompress(data: Buffer): Promise<Buffer>;
|
|
16
53
|
}
|
|
@@ -1,39 +1,53 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Transform stream for GZIP compression using fflate
|
|
4
|
+
*/
|
|
5
|
+
export class GzipCompressionTransform extends plugins.stream.Transform {
|
|
6
|
+
constructor(level = 6) {
|
|
5
7
|
super();
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
if (
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
else {
|
|
13
|
-
this.push(decompressed);
|
|
14
|
-
callback();
|
|
8
|
+
// Create a streaming Gzip compressor
|
|
9
|
+
this.gzip = new plugins.fflate.Gzip({ level }, (chunk, final) => {
|
|
10
|
+
this.push(Buffer.from(chunk));
|
|
11
|
+
if (final) {
|
|
12
|
+
this.push(null);
|
|
15
13
|
}
|
|
16
14
|
});
|
|
17
15
|
}
|
|
16
|
+
_transform(chunk, encoding, callback) {
|
|
17
|
+
try {
|
|
18
|
+
this.gzip.push(chunk, false);
|
|
19
|
+
callback();
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
callback(err);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
_flush(callback) {
|
|
26
|
+
try {
|
|
27
|
+
this.gzip.push(new Uint8Array(0), true);
|
|
28
|
+
callback();
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
callback(err);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
18
34
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Transform stream for GZIP decompression using fflate
|
|
37
|
+
*/
|
|
38
|
+
export class GzipDecompressionTransform extends plugins.stream.Transform {
|
|
22
39
|
constructor() {
|
|
23
40
|
super();
|
|
24
41
|
// Create a streaming Gunzip decompressor
|
|
25
42
|
this.gunzip = new plugins.fflate.Gunzip((chunk, final) => {
|
|
26
|
-
// Push decompressed chunks to the output stream
|
|
27
43
|
this.push(Buffer.from(chunk));
|
|
28
44
|
if (final) {
|
|
29
|
-
// Signal end of stream when decompression is complete
|
|
30
45
|
this.push(null);
|
|
31
46
|
}
|
|
32
47
|
});
|
|
33
48
|
}
|
|
34
49
|
_transform(chunk, encoding, callback) {
|
|
35
50
|
try {
|
|
36
|
-
// Feed chunks to the gunzip stream
|
|
37
51
|
this.gunzip.push(chunk, false);
|
|
38
52
|
callback();
|
|
39
53
|
}
|
|
@@ -43,7 +57,6 @@ export class DecompressGunzipTransform extends plugins.stream.Transform {
|
|
|
43
57
|
}
|
|
44
58
|
_flush(callback) {
|
|
45
59
|
try {
|
|
46
|
-
// Signal end of input to gunzip
|
|
47
60
|
this.gunzip.push(new Uint8Array(0), true);
|
|
48
61
|
callback();
|
|
49
62
|
}
|
|
@@ -52,13 +65,52 @@ export class DecompressGunzipTransform extends plugins.stream.Transform {
|
|
|
52
65
|
}
|
|
53
66
|
}
|
|
54
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* GZIP compression and decompression utilities
|
|
70
|
+
*/
|
|
55
71
|
export class GzipTools {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
72
|
+
/**
|
|
73
|
+
* Get a streaming compression transform
|
|
74
|
+
*/
|
|
75
|
+
getCompressionStream(level) {
|
|
76
|
+
return new GzipCompressionTransform(level);
|
|
59
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Get a streaming decompression transform
|
|
80
|
+
*/
|
|
60
81
|
getDecompressionStream() {
|
|
61
|
-
return new
|
|
82
|
+
return new GzipDecompressionTransform();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Compress data synchronously
|
|
86
|
+
*/
|
|
87
|
+
compressSync(data, level) {
|
|
88
|
+
const options = level !== undefined ? { level } : undefined;
|
|
89
|
+
return Buffer.from(plugins.fflate.gzipSync(data, options));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Decompress data synchronously
|
|
93
|
+
*/
|
|
94
|
+
decompressSync(data) {
|
|
95
|
+
return Buffer.from(plugins.fflate.gunzipSync(data));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Compress data asynchronously
|
|
99
|
+
* Note: Uses sync version for Deno compatibility (fflate async uses Web Workers
|
|
100
|
+
* which have issues in Deno)
|
|
101
|
+
*/
|
|
102
|
+
async compress(data, level) {
|
|
103
|
+
// Use sync version wrapped in Promise for cross-runtime compatibility
|
|
104
|
+
return this.compressSync(data, level);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Decompress data asynchronously
|
|
108
|
+
* Note: Uses sync version for Deno compatibility (fflate async uses Web Workers
|
|
109
|
+
* which have issues in Deno)
|
|
110
|
+
*/
|
|
111
|
+
async decompress(data) {
|
|
112
|
+
// Use sync version wrapped in Promise for cross-runtime compatibility
|
|
113
|
+
return this.decompressSync(data);
|
|
62
114
|
}
|
|
63
115
|
}
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5nemlwdG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmd6aXB0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUd4Qzs7R0FFRztBQUNILE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVM7SUFHcEUsWUFBWSxRQUEyQixDQUFDO1FBQ3RDLEtBQUssRUFBRSxDQUFDO1FBRVIscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsVUFBVSxDQUNSLEtBQWEsRUFDYixRQUF3QixFQUN4QixRQUEwQztRQUUxQyxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0IsUUFBUSxFQUFFLENBQUM7UUFDYixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLFFBQVEsQ0FBQyxHQUFZLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUEwQztRQUMvQyxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMs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
|