@push.rocks/smartarchive 4.2.4 → 5.0.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/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 +39 -6
- package/dist_ts/classes.gziptools.js +85 -24
- package/dist_ts/classes.smartarchive.d.ts +101 -16
- package/dist_ts/classes.smartarchive.js +395 -58
- 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 +142 -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 +115 -0
- package/dist_ts/interfaces.js +2 -0
- package/package.json +1 -1
- 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 +96 -33
- package/ts/classes.smartarchive.ts +469 -118
- package/ts/classes.tartools.ts +124 -52
- package/ts/classes.ziptools.ts +160 -34
- package/ts/errors.ts +70 -0
- package/ts/index.ts +11 -0
- package/ts/interfaces.ts +131 -0
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
+
import { GzipTools } from './classes.gziptools.js';
|
|
3
|
+
/**
|
|
4
|
+
* TAR archive creation and extraction utilities
|
|
5
|
+
*/
|
|
2
6
|
export class TarTools {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Add a file to a TAR pack stream
|
|
9
|
+
*/
|
|
6
10
|
async addFileToPack(pack, optionsArg) {
|
|
7
11
|
return new Promise(async (resolve, reject) => {
|
|
8
12
|
let fileName = null;
|
|
@@ -13,15 +17,16 @@ export class TarTools {
|
|
|
13
17
|
fileName = optionsArg.content.relative;
|
|
14
18
|
}
|
|
15
19
|
else if (optionsArg.content instanceof plugins.smartfile.StreamFile) {
|
|
16
|
-
fileName = optionsArg.content
|
|
17
|
-
.relativeFilePath;
|
|
20
|
+
fileName = optionsArg.content.relativeFilePath;
|
|
18
21
|
}
|
|
19
22
|
else if (optionsArg.filePath) {
|
|
20
23
|
fileName = optionsArg.filePath;
|
|
21
24
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
if (!fileName) {
|
|
26
|
+
reject(new Error('No filename specified for TAR entry'));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Determine content byte length
|
|
25
30
|
let contentByteLength;
|
|
26
31
|
if (optionsArg.byteLength) {
|
|
27
32
|
contentByteLength = optionsArg.byteLength;
|
|
@@ -33,44 +38,42 @@ export class TarTools {
|
|
|
33
38
|
contentByteLength = optionsArg.content.length;
|
|
34
39
|
}
|
|
35
40
|
else if (optionsArg.content instanceof plugins.smartfile.SmartFile) {
|
|
36
|
-
contentByteLength = await optionsArg.content.getSize();
|
|
41
|
+
contentByteLength = await optionsArg.content.getSize();
|
|
37
42
|
}
|
|
38
43
|
else if (optionsArg.content instanceof plugins.smartfile.StreamFile) {
|
|
39
|
-
contentByteLength = await optionsArg.content.getSize();
|
|
40
|
-
}
|
|
41
|
-
else if (optionsArg.content instanceof plugins.smartstream.stream.Readable) {
|
|
42
|
-
console.warn('@push.rocks/smartarchive: When streaming, it is recommended to provide byteLength, if known.');
|
|
44
|
+
contentByteLength = await optionsArg.content.getSize();
|
|
43
45
|
}
|
|
44
46
|
else if (optionsArg.filePath) {
|
|
45
47
|
const fileStat = await plugins.fsPromises.stat(optionsArg.filePath);
|
|
46
48
|
contentByteLength = fileStat.size;
|
|
47
49
|
}
|
|
48
|
-
|
|
49
|
-
* here we try to harmonize all kind of entries towards a readable stream
|
|
50
|
-
*/
|
|
50
|
+
// Convert all content types to Readable stream
|
|
51
51
|
let content;
|
|
52
52
|
if (Buffer.isBuffer(optionsArg.content)) {
|
|
53
|
-
content = plugins.
|
|
53
|
+
content = plugins.stream.Readable.from(optionsArg.content);
|
|
54
54
|
}
|
|
55
55
|
else if (typeof optionsArg.content === 'string') {
|
|
56
|
-
content = plugins.
|
|
56
|
+
content = plugins.stream.Readable.from(Buffer.from(optionsArg.content));
|
|
57
57
|
}
|
|
58
58
|
else if (optionsArg.content instanceof plugins.smartfile.SmartFile) {
|
|
59
|
-
content = plugins.
|
|
59
|
+
content = plugins.stream.Readable.from(optionsArg.content.contents);
|
|
60
60
|
}
|
|
61
61
|
else if (optionsArg.content instanceof plugins.smartfile.StreamFile) {
|
|
62
62
|
content = await optionsArg.content.createReadStream();
|
|
63
63
|
}
|
|
64
|
-
else if (optionsArg.content instanceof plugins.
|
|
64
|
+
else if (optionsArg.content instanceof plugins.stream.Readable) {
|
|
65
65
|
content = optionsArg.content;
|
|
66
66
|
}
|
|
67
|
+
else if (optionsArg.filePath) {
|
|
68
|
+
content = plugins.fs.createReadStream(optionsArg.filePath);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
reject(new Error('No content or filePath specified for TAR entry'));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
67
74
|
const entry = pack.entry({
|
|
68
75
|
name: fileName,
|
|
69
|
-
...(contentByteLength
|
|
70
|
-
? {
|
|
71
|
-
size: contentByteLength,
|
|
72
|
-
}
|
|
73
|
-
: null),
|
|
76
|
+
...(contentByteLength !== undefined ? { size: contentByteLength } : {}),
|
|
74
77
|
}, (err) => {
|
|
75
78
|
if (err) {
|
|
76
79
|
reject(err);
|
|
@@ -80,12 +83,11 @@ export class TarTools {
|
|
|
80
83
|
}
|
|
81
84
|
});
|
|
82
85
|
content.pipe(entry);
|
|
83
|
-
resolve()
|
|
86
|
+
// Note: resolve() is called in the callback above when pipe completes
|
|
84
87
|
});
|
|
85
88
|
}
|
|
86
89
|
/**
|
|
87
|
-
*
|
|
88
|
-
* @param directoryPath
|
|
90
|
+
* Pack a directory into a TAR stream
|
|
89
91
|
*/
|
|
90
92
|
async packDirectory(directoryPath) {
|
|
91
93
|
const fileTree = await plugins.listFileTree(directoryPath, '**/*');
|
|
@@ -102,13 +104,72 @@ export class TarTools {
|
|
|
102
104
|
}
|
|
103
105
|
return pack;
|
|
104
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* Get a new TAR pack stream
|
|
109
|
+
*/
|
|
105
110
|
async getPackStream() {
|
|
106
|
-
|
|
107
|
-
return pack;
|
|
111
|
+
return plugins.tarStream.pack();
|
|
108
112
|
}
|
|
109
|
-
|
|
113
|
+
/**
|
|
114
|
+
* Get a TAR extraction stream
|
|
115
|
+
*/
|
|
110
116
|
getDecompressionStream() {
|
|
111
117
|
return plugins.tarStream.extract();
|
|
112
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* Pack files into a TAR buffer
|
|
121
|
+
*/
|
|
122
|
+
async packFiles(files) {
|
|
123
|
+
const pack = await this.getPackStream();
|
|
124
|
+
for (const file of files) {
|
|
125
|
+
await this.addFileToPack(pack, {
|
|
126
|
+
fileName: file.archivePath,
|
|
127
|
+
content: file.content,
|
|
128
|
+
byteLength: file.size,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
pack.finalize();
|
|
132
|
+
const chunks = [];
|
|
133
|
+
return new Promise((resolve, reject) => {
|
|
134
|
+
pack.on('data', (chunk) => chunks.push(chunk));
|
|
135
|
+
pack.on('end', () => resolve(Buffer.concat(chunks)));
|
|
136
|
+
pack.on('error', reject);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Pack a directory into a TAR.GZ buffer
|
|
141
|
+
*/
|
|
142
|
+
async packDirectoryToTarGz(directoryPath, compressionLevel) {
|
|
143
|
+
const pack = await this.packDirectory(directoryPath);
|
|
144
|
+
pack.finalize();
|
|
145
|
+
const gzipTools = new GzipTools();
|
|
146
|
+
const gzipStream = gzipTools.getCompressionStream(compressionLevel);
|
|
147
|
+
const chunks = [];
|
|
148
|
+
return new Promise((resolve, reject) => {
|
|
149
|
+
pack
|
|
150
|
+
.pipe(gzipStream)
|
|
151
|
+
.on('data', (chunk) => chunks.push(chunk))
|
|
152
|
+
.on('end', () => resolve(Buffer.concat(chunks)))
|
|
153
|
+
.on('error', reject);
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Pack a directory into a TAR.GZ stream
|
|
158
|
+
*/
|
|
159
|
+
async packDirectoryToTarGzStream(directoryPath, compressionLevel) {
|
|
160
|
+
const pack = await this.packDirectory(directoryPath);
|
|
161
|
+
pack.finalize();
|
|
162
|
+
const gzipTools = new GzipTools();
|
|
163
|
+
const gzipStream = gzipTools.getCompressionStream(compressionLevel);
|
|
164
|
+
return pack.pipe(gzipStream);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Pack files into a TAR.GZ buffer
|
|
168
|
+
*/
|
|
169
|
+
async packFilesToTarGz(files, compressionLevel) {
|
|
170
|
+
const tarBuffer = await this.packFiles(files);
|
|
171
|
+
const gzipTools = new GzipTools();
|
|
172
|
+
return gzipTools.compress(tarBuffer, compressionLevel);
|
|
173
|
+
}
|
|
113
174
|
}
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
175
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50YXJ0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMudGFydG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRW5EOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFDbkI7O09BRUc7SUFDSSxLQUFLLENBQUMsYUFBYSxDQUN4QixJQUE0QixFQUM1QixVQVVDO1FBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ2pELElBQUksUUFBUSxHQUFrQixJQUFJLENBQUM7WUFFbkMsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3hCLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ2pDLENBQUM7aUJBQU0sSUFBSSxVQUFVLENBQUMsT0FBTyxZQUFZLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3JFLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUN6QyxDQUFDO2lCQUFNLElBQUksVUFBVSxDQUFDLE9BQU8sWUFBWSxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN0RSxRQUFRLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztZQUNqRCxDQUFDO2lCQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMvQixRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNqQyxDQUFDO1lBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELE9BQU87WUFDVCxDQUFD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
|
|
@@ -1,21 +1,56 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import type { IArchiveEntry, TCompressionLevel } from './interfaces.js';
|
|
3
|
+
/**
|
|
4
|
+
* Transform stream for ZIP decompression using fflate
|
|
5
|
+
* Emits StreamFile objects for each file in the archive
|
|
6
|
+
*/
|
|
7
|
+
export declare class ZipDecompressionTransform extends plugins.smartstream.SmartDuplex<Buffer, plugins.smartfile.StreamFile> {
|
|
4
8
|
private streamtools;
|
|
5
9
|
private unzipper;
|
|
6
10
|
constructor();
|
|
7
11
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Streaming ZIP compression using fflate
|
|
14
|
+
* Allows adding multiple entries before finalizing
|
|
15
|
+
*/
|
|
16
|
+
export declare class ZipCompressionStream extends plugins.stream.Duplex {
|
|
17
|
+
private files;
|
|
18
|
+
private finalized;
|
|
12
19
|
constructor();
|
|
13
|
-
|
|
14
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Add a file entry to the ZIP archive
|
|
22
|
+
*/
|
|
23
|
+
addEntry(fileName: string, content: Buffer | plugins.stream.Readable, options?: {
|
|
24
|
+
compressionLevel?: TCompressionLevel;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Finalize the ZIP archive and emit the compressed data
|
|
28
|
+
*/
|
|
29
|
+
finalize(): Promise<void>;
|
|
30
|
+
_read(): void;
|
|
31
|
+
_write(_chunk: Buffer, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void;
|
|
15
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* ZIP compression and decompression utilities
|
|
35
|
+
*/
|
|
16
36
|
export declare class ZipTools {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Get a streaming compression object for creating ZIP archives
|
|
39
|
+
*/
|
|
40
|
+
getCompressionStream(): ZipCompressionStream;
|
|
41
|
+
/**
|
|
42
|
+
* Get a streaming decompression transform for extracting ZIP archives
|
|
43
|
+
*/
|
|
44
|
+
getDecompressionStream(): ZipDecompressionTransform;
|
|
45
|
+
/**
|
|
46
|
+
* Create a ZIP archive from an array of entries
|
|
47
|
+
*/
|
|
48
|
+
createZip(entries: IArchiveEntry[], compressionLevel?: TCompressionLevel): Promise<Buffer>;
|
|
49
|
+
/**
|
|
50
|
+
* Extract a ZIP buffer to an array of entries
|
|
51
|
+
*/
|
|
52
|
+
extractZip(data: Buffer): Promise<Array<{
|
|
53
|
+
path: string;
|
|
54
|
+
content: Buffer;
|
|
55
|
+
}>>;
|
|
20
56
|
}
|
|
21
|
-
export {};
|
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Transform stream for ZIP decompression using fflate
|
|
4
|
+
* Emits StreamFile objects for each file in the archive
|
|
5
|
+
*/
|
|
6
|
+
export class ZipDecompressionTransform extends plugins.smartstream.SmartDuplex {
|
|
4
7
|
constructor() {
|
|
5
8
|
super({
|
|
6
9
|
objectMode: true,
|
|
7
10
|
writeFunction: async (chunkArg, streamtoolsArg) => {
|
|
8
11
|
this.streamtools ? null : (this.streamtools = streamtoolsArg);
|
|
9
12
|
this.unzipper.push(Buffer.isBuffer(chunkArg) ? chunkArg : Buffer.from(chunkArg), false);
|
|
13
|
+
return null;
|
|
10
14
|
},
|
|
11
15
|
finalFunction: async () => {
|
|
12
16
|
this.unzipper.push(Buffer.from(''), true);
|
|
13
17
|
await plugins.smartdelay.delayFor(0);
|
|
14
18
|
await this.streamtools.push(null);
|
|
19
|
+
return null;
|
|
15
20
|
},
|
|
16
21
|
});
|
|
17
22
|
this.unzipper = new plugins.fflate.Unzip(async (fileArg) => {
|
|
18
23
|
let resultBuffer;
|
|
19
|
-
fileArg.ondata = async (
|
|
24
|
+
fileArg.ondata = async (_flateError, dat, final) => {
|
|
20
25
|
resultBuffer
|
|
21
26
|
? (resultBuffer = Buffer.concat([resultBuffer, Buffer.from(dat)]))
|
|
22
27
|
: (resultBuffer = Buffer.from(dat));
|
|
@@ -31,36 +36,150 @@ class DecompressZipTransform extends plugins.smartstream
|
|
|
31
36
|
this.unzipper.register(plugins.fflate.UnzipInflate);
|
|
32
37
|
}
|
|
33
38
|
}
|
|
34
|
-
|
|
35
|
-
|
|
39
|
+
/**
|
|
40
|
+
* Streaming ZIP compression using fflate
|
|
41
|
+
* Allows adding multiple entries before finalizing
|
|
42
|
+
*/
|
|
43
|
+
export class ZipCompressionStream extends plugins.stream.Duplex {
|
|
36
44
|
constructor() {
|
|
37
45
|
super();
|
|
38
|
-
this.files =
|
|
46
|
+
this.files = new Map();
|
|
47
|
+
this.finalized = false;
|
|
39
48
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
/**
|
|
50
|
+
* Add a file entry to the ZIP archive
|
|
51
|
+
*/
|
|
52
|
+
async addEntry(fileName, content, options) {
|
|
53
|
+
if (this.finalized) {
|
|
54
|
+
throw new Error('Cannot add entries to a finalized ZIP archive');
|
|
55
|
+
}
|
|
56
|
+
let data;
|
|
57
|
+
if (Buffer.isBuffer(content)) {
|
|
58
|
+
data = content;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Collect stream to buffer
|
|
62
|
+
const chunks = [];
|
|
63
|
+
for await (const chunk of content) {
|
|
64
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
53
65
|
}
|
|
66
|
+
data = Buffer.concat(chunks);
|
|
67
|
+
}
|
|
68
|
+
this.files.set(fileName, {
|
|
69
|
+
data: new Uint8Array(data),
|
|
70
|
+
options: options?.compressionLevel !== undefined ? { level: options.compressionLevel } : undefined,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Finalize the ZIP archive and emit the compressed data
|
|
75
|
+
*/
|
|
76
|
+
async finalize() {
|
|
77
|
+
if (this.finalized) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this.finalized = true;
|
|
81
|
+
const filesObj = {};
|
|
82
|
+
for (const [name, { data, options }] of this.files) {
|
|
83
|
+
filesObj[name] = options ? [data, options] : data;
|
|
84
|
+
}
|
|
85
|
+
return new Promise((resolve, reject) => {
|
|
86
|
+
plugins.fflate.zip(filesObj, (err, result) => {
|
|
87
|
+
if (err) {
|
|
88
|
+
reject(err);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
this.push(Buffer.from(result));
|
|
92
|
+
this.push(null);
|
|
93
|
+
resolve();
|
|
94
|
+
}
|
|
95
|
+
});
|
|
54
96
|
});
|
|
55
97
|
}
|
|
98
|
+
_read() {
|
|
99
|
+
// No-op: data is pushed when finalize() is called
|
|
100
|
+
}
|
|
101
|
+
_write(_chunk, _encoding, callback) {
|
|
102
|
+
// Not used for ZIP creation - use addEntry() instead
|
|
103
|
+
callback(new Error('Use addEntry() to add files to the ZIP archive'));
|
|
104
|
+
}
|
|
56
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* ZIP compression and decompression utilities
|
|
108
|
+
*/
|
|
57
109
|
export class ZipTools {
|
|
58
|
-
|
|
110
|
+
/**
|
|
111
|
+
* Get a streaming compression object for creating ZIP archives
|
|
112
|
+
*/
|
|
59
113
|
getCompressionStream() {
|
|
60
|
-
return new
|
|
114
|
+
return new ZipCompressionStream();
|
|
61
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Get a streaming decompression transform for extracting ZIP archives
|
|
118
|
+
*/
|
|
62
119
|
getDecompressionStream() {
|
|
63
|
-
return new
|
|
120
|
+
return new ZipDecompressionTransform();
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Create a ZIP archive from an array of entries
|
|
124
|
+
*/
|
|
125
|
+
async createZip(entries, compressionLevel) {
|
|
126
|
+
const filesObj = {};
|
|
127
|
+
for (const entry of entries) {
|
|
128
|
+
let data;
|
|
129
|
+
if (typeof entry.content === 'string') {
|
|
130
|
+
data = new TextEncoder().encode(entry.content);
|
|
131
|
+
}
|
|
132
|
+
else if (Buffer.isBuffer(entry.content)) {
|
|
133
|
+
data = new Uint8Array(entry.content);
|
|
134
|
+
}
|
|
135
|
+
else if (entry.content instanceof plugins.smartfile.SmartFile) {
|
|
136
|
+
data = new Uint8Array(entry.content.contents);
|
|
137
|
+
}
|
|
138
|
+
else if (entry.content instanceof plugins.smartfile.StreamFile) {
|
|
139
|
+
const buffer = await entry.content.getContentAsBuffer();
|
|
140
|
+
data = new Uint8Array(buffer);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// Readable stream
|
|
144
|
+
const chunks = [];
|
|
145
|
+
for await (const chunk of entry.content) {
|
|
146
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
147
|
+
}
|
|
148
|
+
data = new Uint8Array(Buffer.concat(chunks));
|
|
149
|
+
}
|
|
150
|
+
if (compressionLevel !== undefined) {
|
|
151
|
+
filesObj[entry.archivePath] = [data, { level: compressionLevel }];
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
filesObj[entry.archivePath] = data;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return new Promise((resolve, reject) => {
|
|
158
|
+
plugins.fflate.zip(filesObj, (err, result) => {
|
|
159
|
+
if (err)
|
|
160
|
+
reject(err);
|
|
161
|
+
else
|
|
162
|
+
resolve(Buffer.from(result));
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Extract a ZIP buffer to an array of entries
|
|
168
|
+
*/
|
|
169
|
+
async extractZip(data) {
|
|
170
|
+
return new Promise((resolve, reject) => {
|
|
171
|
+
plugins.fflate.unzip(data, (err, result) => {
|
|
172
|
+
if (err) {
|
|
173
|
+
reject(err);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const entries = [];
|
|
177
|
+
for (const [path, content] of Object.entries(result)) {
|
|
178
|
+
entries.push({ path, content: Buffer.from(content) });
|
|
179
|
+
}
|
|
180
|
+
resolve(entries);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
64
183
|
}
|
|
65
184
|
}
|
|
66
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
185
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy56aXB0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuemlwdG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFHeEM7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLHlCQUEwQixTQUFRLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBaUQ7SUFpQmxIO1FBQ0UsS0FBSyxDQUFDO1lBQ0osVUFBVSxFQUFFLElBQUk7WUFDaEIsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLEVBQUU7Z0JBQ2hELElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDaEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQWtDLENBQUMsRUFDdEYsS0FBSyxDQUNOLENBQUM7Z0JBQ0YsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsYUFBYSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7U0FDRixDQUFDLENBQUM7UUFoQ0csYUFBUSxHQUFHLElBQUksT0FB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
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for smartarchive
|
|
3
|
+
*/
|
|
4
|
+
export declare class SmartArchiveError extends Error {
|
|
5
|
+
readonly code: string;
|
|
6
|
+
constructor(message: string, code: string);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* BZIP2-specific decompression errors
|
|
10
|
+
*/
|
|
11
|
+
export declare class Bzip2Error extends SmartArchiveError {
|
|
12
|
+
constructor(message: string, code?: string);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Archive format detection errors
|
|
16
|
+
*/
|
|
17
|
+
export declare class ArchiveFormatError extends SmartArchiveError {
|
|
18
|
+
constructor(message: string);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Stream processing errors
|
|
22
|
+
*/
|
|
23
|
+
export declare class StreamError extends SmartArchiveError {
|
|
24
|
+
constructor(message: string);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* BZIP2 error codes for programmatic error handling
|
|
28
|
+
*/
|
|
29
|
+
export declare const BZIP2_ERROR_CODES: {
|
|
30
|
+
readonly NO_MAGIC_NUMBER: "BZIP2_NO_MAGIC";
|
|
31
|
+
readonly INVALID_ARCHIVE: "BZIP2_INVALID_ARCHIVE";
|
|
32
|
+
readonly CRC_MISMATCH: "BZIP2_CRC_MISMATCH";
|
|
33
|
+
readonly INVALID_BLOCK_DATA: "BZIP2_INVALID_BLOCK";
|
|
34
|
+
readonly BUFFER_OVERFLOW: "BZIP2_BUFFER_OVERFLOW";
|
|
35
|
+
readonly INVALID_HUFFMAN: "BZIP2_INVALID_HUFFMAN";
|
|
36
|
+
readonly INVALID_SELECTOR: "BZIP2_INVALID_SELECTOR";
|
|
37
|
+
readonly INVALID_POSITION: "BZIP2_INVALID_POSITION";
|
|
38
|
+
readonly PREMATURE_END: "BZIP2_PREMATURE_END";
|
|
39
|
+
};
|
|
40
|
+
export type TBzip2ErrorCode = typeof BZIP2_ERROR_CODES[keyof typeof BZIP2_ERROR_CODES];
|
|
41
|
+
/**
|
|
42
|
+
* Throw a BZIP2 error with a specific code
|
|
43
|
+
*/
|
|
44
|
+
export declare function throwBzip2Error(message: string, code: TBzip2ErrorCode): never;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for smartarchive
|
|
3
|
+
*/
|
|
4
|
+
export class SmartArchiveError extends Error {
|
|
5
|
+
constructor(message, code) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'SmartArchiveError';
|
|
8
|
+
this.code = code;
|
|
9
|
+
// Maintains proper stack trace for where error was thrown (V8)
|
|
10
|
+
if (Error.captureStackTrace) {
|
|
11
|
+
Error.captureStackTrace(this, this.constructor);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* BZIP2-specific decompression errors
|
|
17
|
+
*/
|
|
18
|
+
export class Bzip2Error extends SmartArchiveError {
|
|
19
|
+
constructor(message, code = 'BZIP2_ERROR') {
|
|
20
|
+
super(message, code);
|
|
21
|
+
this.name = 'Bzip2Error';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Archive format detection errors
|
|
26
|
+
*/
|
|
27
|
+
export class ArchiveFormatError extends SmartArchiveError {
|
|
28
|
+
constructor(message) {
|
|
29
|
+
super(message, 'ARCHIVE_FORMAT_ERROR');
|
|
30
|
+
this.name = 'ArchiveFormatError';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Stream processing errors
|
|
35
|
+
*/
|
|
36
|
+
export class StreamError extends SmartArchiveError {
|
|
37
|
+
constructor(message) {
|
|
38
|
+
super(message, 'STREAM_ERROR');
|
|
39
|
+
this.name = 'StreamError';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* BZIP2 error codes for programmatic error handling
|
|
44
|
+
*/
|
|
45
|
+
export const BZIP2_ERROR_CODES = {
|
|
46
|
+
NO_MAGIC_NUMBER: 'BZIP2_NO_MAGIC',
|
|
47
|
+
INVALID_ARCHIVE: 'BZIP2_INVALID_ARCHIVE',
|
|
48
|
+
CRC_MISMATCH: 'BZIP2_CRC_MISMATCH',
|
|
49
|
+
INVALID_BLOCK_DATA: 'BZIP2_INVALID_BLOCK',
|
|
50
|
+
BUFFER_OVERFLOW: 'BZIP2_BUFFER_OVERFLOW',
|
|
51
|
+
INVALID_HUFFMAN: 'BZIP2_INVALID_HUFFMAN',
|
|
52
|
+
INVALID_SELECTOR: 'BZIP2_INVALID_SELECTOR',
|
|
53
|
+
INVALID_POSITION: 'BZIP2_INVALID_POSITION',
|
|
54
|
+
PREMATURE_END: 'BZIP2_PREMATURE_END',
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Throw a BZIP2 error with a specific code
|
|
58
|
+
*/
|
|
59
|
+
export function throwBzip2Error(message, code) {
|
|
60
|
+
throw new Bzip2Error(message, code);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGlCQUFrQixTQUFRLEtBQUs7SUFHMUMsWUFBWSxPQUFlLEVBQUUsSUFBWTtRQUN2QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDO1FBQ2hDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLCtEQUErRDtRQUMvRCxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzVCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxVQUFXLFNBQVEsaUJBQWlCO0lBQy9DLFlBQVksT0FBZSxFQUFFLE9BQWUsYUFBYTtRQUN2RCxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO0lBQzNCLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGlCQUFpQjtJQUN2RCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLEdBQUcsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLGlCQUFpQjtJQUNoRCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztJQUM1QixDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHO0lBQy9CLGVBQWUsRUFBRSxnQkFBZ0I7SUFDakMsZUFBZSxFQUFFLHVCQUF1QjtJQUN4QyxZQUFZLEVBQUUsb0JBQW9CO0lBQ2xDLGtCQUFrQixFQUFFLHFCQUFxQjtJQUN6QyxlQUFlLEVBQUUsdUJBQXVCO0lBQ3hDLGVBQWUsRUFBRSx1QkFBdUI7SUFDeEMsZ0JBQWdCLEVBQUUsd0JBQXdCO0lBQzFDLGdCQUFnQixFQUFFLHdCQUF3QjtJQUMxQyxhQUFhLEVBQUUscUJBQXFCO0NBQzVCLENBQUM7QUFJWDs7R0FFRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsT0FBZSxFQUFFLElBQXFCO0lBQ3BFLE1BQU0sSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3RDLENBQUMifQ==
|
package/dist_ts/index.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
export * from './interfaces.js';
|
|
2
|
+
export * from './errors.js';
|
|
1
3
|
export * from './classes.smartarchive.js';
|
|
2
4
|
export * from './classes.tartools.js';
|
|
3
5
|
export * from './classes.ziptools.js';
|
|
4
6
|
export * from './classes.gziptools.js';
|
|
7
|
+
export * from './classes.bzip2tools.js';
|
|
8
|
+
export * from './classes.archiveanalyzer.js';
|
package/dist_ts/index.js
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
|
+
// Core types and errors
|
|
2
|
+
export * from './interfaces.js';
|
|
3
|
+
export * from './errors.js';
|
|
4
|
+
// Main archive class
|
|
1
5
|
export * from './classes.smartarchive.js';
|
|
6
|
+
// Format-specific tools
|
|
2
7
|
export * from './classes.tartools.js';
|
|
3
8
|
export * from './classes.ziptools.js';
|
|
4
9
|
export * from './classes.gziptools.js';
|
|
5
|
-
|
|
10
|
+
export * from './classes.bzip2tools.js';
|
|
11
|
+
// Archive analysis
|
|
12
|
+
export * from './classes.archiveanalyzer.js';
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3QkFBd0I7QUFDeEIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGFBQWEsQ0FBQztBQUU1QixxQkFBcUI7QUFDckIsY0FBYywyQkFBMkIsQ0FBQztBQUUxQyx3QkFBd0I7QUFDeEIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyx5QkFBeUIsQ0FBQztBQUV4QyxtQkFBbUI7QUFDbkIsY0FBYyw4QkFBOEIsQ0FBQyJ9
|