@push.rocks/smartarchive 4.2.0 → 4.2.2
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/classes.gziptools.d.ts +2 -0
- package/dist_ts/classes.gziptools.js +28 -13
- package/dist_ts/classes.smartarchive.js +18 -7
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.gziptools.ts +29 -11
- package/ts/classes.smartarchive.ts +22 -6
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartarchive',
|
|
6
|
-
version: '4.2.
|
|
6
|
+
version: '4.2.2',
|
|
7
7
|
description: 'A library for working with archive files, providing utilities for compressing and decompressing data.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSwwQkFBMEI7SUFDaEMsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHVHQUF1RztDQUNySCxDQUFBIn0=
|
|
@@ -4,8 +4,10 @@ export declare class CompressGunzipTransform extends plugins.stream.Transform {
|
|
|
4
4
|
_transform(chunk: Buffer, encoding: BufferEncoding, callback: plugins.stream.TransformCallback): void;
|
|
5
5
|
}
|
|
6
6
|
export declare class DecompressGunzipTransform extends plugins.stream.Transform {
|
|
7
|
+
private gunzip;
|
|
7
8
|
constructor();
|
|
8
9
|
_transform(chunk: Buffer, encoding: BufferEncoding, callback: plugins.stream.TransformCallback): void;
|
|
10
|
+
_flush(callback: plugins.stream.TransformCallback): void;
|
|
9
11
|
}
|
|
10
12
|
export declare class GzipTools {
|
|
11
13
|
constructor();
|
|
@@ -21,21 +21,36 @@ export class CompressGunzipTransform extends plugins.stream.Transform {
|
|
|
21
21
|
export class DecompressGunzipTransform extends plugins.stream.Transform {
|
|
22
22
|
constructor() {
|
|
23
23
|
super();
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
if (
|
|
29
|
-
//
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
// If decompression is successful, push the decompressed data into the stream
|
|
34
|
-
this.push(decompressed);
|
|
35
|
-
callback();
|
|
24
|
+
// Create a streaming Gunzip decompressor
|
|
25
|
+
this.gunzip = new plugins.fflate.Gunzip((chunk, final) => {
|
|
26
|
+
// Push decompressed chunks to the output stream
|
|
27
|
+
this.push(Buffer.from(chunk));
|
|
28
|
+
if (final) {
|
|
29
|
+
// Signal end of stream when decompression is complete
|
|
30
|
+
this.push(null);
|
|
36
31
|
}
|
|
37
32
|
});
|
|
38
33
|
}
|
|
34
|
+
_transform(chunk, encoding, callback) {
|
|
35
|
+
try {
|
|
36
|
+
// Feed chunks to the gunzip stream
|
|
37
|
+
this.gunzip.push(chunk, false);
|
|
38
|
+
callback();
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
callback(err);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
_flush(callback) {
|
|
45
|
+
try {
|
|
46
|
+
// Signal end of input to gunzip
|
|
47
|
+
this.gunzip.push(new Uint8Array(0), true);
|
|
48
|
+
callback();
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
callback(err);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
39
54
|
}
|
|
40
55
|
export class GzipTools {
|
|
41
56
|
constructor() { }
|
|
@@ -46,4 +61,4 @@ export class GzipTools {
|
|
|
46
61
|
return new DecompressGunzipTransform();
|
|
47
62
|
}
|
|
48
63
|
}
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5nemlwdG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmd6aXB0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxpRUFBaUU7QUFDakUsTUFBTSxPQUFPLHVCQUF3QixTQUFRLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUztJQUNuRTtRQUNFLEtBQUssRUFBRSxDQUFDO0lBQ1YsQ0FBQztJQUVELFVBQVUsQ0FDUixLQUFhLEVBQ2IsUUFBd0IsRUFDeEIsUUFBMEM7UUFFMUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxFQUFFO1lBQ2pELElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN4QixRQUFRLEVBQUUsQ0FBQztZQUNiLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVELCtFQUErRTtBQUMvRSx3RkFBd0Y7QUFDeEYsTUFBTSxPQUFPLHlCQUEwQixTQUFRLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUztJQUdyRTtRQUNFLEtBQUssRUFBRSxDQUFDO1FBRVIseUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN2RCxnREFBZ0Q7WUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixzREFBc0Q7Z0JBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FDUixLQUFhLEVBQ2IsUUFBd0IsRUFDeEIsUUFBMEM7UUFFMUMsSUFBSSxDQUFDO1lBQ0gsbUNBQW1DO1lBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvQixRQUFRLEVBQUUsQ0FBQztRQUNiLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsUUFBUSxDQUFDLEdBQVksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQTBDO1FBQy9DLElBQUksQ0FBQztZQUNILGdDQUFnQztZQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxQyxRQUFRLEVBQUUsQ0FBQztRQUNiLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsUUFBUSxDQUFDLEdBQVksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sU0FBUztJQUNwQixnQkFBZSxDQUFDO0lBRVQsb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSx1QkFBdUIsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxzQkFBc0I7UUFDM0IsT0FBTyxJQUFJLHlCQUF5QixFQUFFLENBQUM7SUFDekMsQ0FBQztDQUNGIn0=
|
|
@@ -102,18 +102,27 @@ export class SmartArchive {
|
|
|
102
102
|
tarStream.on('entry', async (header, stream, next) => {
|
|
103
103
|
if (header.type === 'directory') {
|
|
104
104
|
console.log(`tar stream directory: ${header.name} ... skipping!`);
|
|
105
|
-
|
|
105
|
+
stream.resume(); // Consume directory stream
|
|
106
|
+
stream.on('end', () => next());
|
|
106
107
|
return;
|
|
107
108
|
}
|
|
108
109
|
console.log(`tar stream file: ${header.name}`);
|
|
109
|
-
|
|
110
|
+
// Create a PassThrough stream to buffer the data
|
|
111
|
+
const passThrough = new plugins.stream.PassThrough();
|
|
112
|
+
const streamfile = plugins.smartfile.StreamFile.fromStream(passThrough, header.name);
|
|
113
|
+
// Push the streamfile immediately
|
|
110
114
|
streamFileIntake.push(streamfile);
|
|
111
|
-
stream
|
|
112
|
-
|
|
115
|
+
// Pipe the tar entry stream to the passthrough
|
|
116
|
+
stream.pipe(passThrough);
|
|
117
|
+
// Move to next entry when this one ends
|
|
118
|
+
stream.on('end', () => {
|
|
119
|
+
passThrough.end();
|
|
120
|
+
next();
|
|
113
121
|
});
|
|
114
122
|
});
|
|
115
123
|
tarStream.on('finish', function () {
|
|
116
|
-
console.log('finished');
|
|
124
|
+
console.log('tar extraction finished');
|
|
125
|
+
// Only signal end if this is the final stream
|
|
117
126
|
streamFileIntake.signalEnd();
|
|
118
127
|
});
|
|
119
128
|
analyzedResultChunk.resultStream.pipe(analyzedResultChunk.decompressionStream);
|
|
@@ -133,10 +142,12 @@ export class SmartArchive {
|
|
|
133
142
|
}
|
|
134
143
|
else if (analyzedResultChunk.isArchive &&
|
|
135
144
|
analyzedResultChunk.decompressionStream) {
|
|
136
|
-
|
|
145
|
+
// For nested archives (like gzip containing tar)
|
|
146
|
+
const nestedStream = analyzedResultChunk.resultStream
|
|
137
147
|
.pipe(analyzedResultChunk.decompressionStream)
|
|
138
148
|
.pipe(createAnalyzedStream())
|
|
139
149
|
.pipe(createUnpackStream());
|
|
150
|
+
// Don't signal end here - let the nested unpacker handle it
|
|
140
151
|
}
|
|
141
152
|
else {
|
|
142
153
|
const streamFile = plugins.smartfile.StreamFile.fromStream(analyzedResultChunk.resultStream, analyzedResultChunk.fileType?.ext);
|
|
@@ -150,4 +161,4 @@ export class SmartArchive {
|
|
|
150
161
|
return streamFileIntake;
|
|
151
162
|
}
|
|
152
163
|
}
|
|
153
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGFyY2hpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLnNtYXJ0YXJjaGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUVwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFakQsT0FBTyxFQUNMLGVBQWUsR0FFaEIsTUFBTSw4QkFBOEIsQ0FBQztBQUl0QyxNQUFNLE9BQU8sWUFBWTtJQUN2QixTQUFTO0lBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBYztRQUMvQyxNQUFNLG9CQUFvQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDaEQsb0JBQW9CLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztRQUN4QyxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FDakMsV0FBbUI7UUFFbkIsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hELG9CQUFvQixDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUM7UUFDbEQsT0FBTyxvQkFBb0IsQ0FBQztJQUM5QixDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FDbkMsU0FHNEI7UUFFNUIsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hELG9CQUFvQixDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDOUMsT0FBTyxvQkFB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartarchive",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.2",
|
|
4
4
|
"description": "A library for working with archive files, providing utilities for compressing and decompressing data.",
|
|
5
5
|
"main": "dist_ts/index.js",
|
|
6
6
|
"typings": "dist_ts/index.d.ts",
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/classes.gziptools.ts
CHANGED
|
@@ -26,8 +26,20 @@ export class CompressGunzipTransform extends plugins.stream.Transform {
|
|
|
26
26
|
// DecompressGunzipTransform class that extends the Node.js Transform stream to
|
|
27
27
|
// create a stream that decompresses GZip-compressed data using fflate's gunzip function
|
|
28
28
|
export class DecompressGunzipTransform extends plugins.stream.Transform {
|
|
29
|
+
private gunzip: any; // fflate.Gunzip instance
|
|
30
|
+
|
|
29
31
|
constructor() {
|
|
30
32
|
super();
|
|
33
|
+
|
|
34
|
+
// Create a streaming Gunzip decompressor
|
|
35
|
+
this.gunzip = new plugins.fflate.Gunzip((chunk, final) => {
|
|
36
|
+
// Push decompressed chunks to the output stream
|
|
37
|
+
this.push(Buffer.from(chunk));
|
|
38
|
+
if (final) {
|
|
39
|
+
// Signal end of stream when decompression is complete
|
|
40
|
+
this.push(null);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
31
43
|
}
|
|
32
44
|
|
|
33
45
|
_transform(
|
|
@@ -35,17 +47,23 @@ export class DecompressGunzipTransform extends plugins.stream.Transform {
|
|
|
35
47
|
encoding: BufferEncoding,
|
|
36
48
|
callback: plugins.stream.TransformCallback,
|
|
37
49
|
) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
50
|
+
try {
|
|
51
|
+
// Feed chunks to the gunzip stream
|
|
52
|
+
this.gunzip.push(chunk, false);
|
|
53
|
+
callback();
|
|
54
|
+
} catch (err) {
|
|
55
|
+
callback(err as Error);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
_flush(callback: plugins.stream.TransformCallback) {
|
|
60
|
+
try {
|
|
61
|
+
// Signal end of input to gunzip
|
|
62
|
+
this.gunzip.push(new Uint8Array(0), true);
|
|
63
|
+
callback();
|
|
64
|
+
} catch (err) {
|
|
65
|
+
callback(err as Error);
|
|
66
|
+
}
|
|
49
67
|
}
|
|
50
68
|
}
|
|
51
69
|
|
|
@@ -158,21 +158,34 @@ export class SmartArchive {
|
|
|
158
158
|
console.log(
|
|
159
159
|
`tar stream directory: ${header.name} ... skipping!`,
|
|
160
160
|
);
|
|
161
|
-
|
|
161
|
+
stream.resume(); // Consume directory stream
|
|
162
|
+
stream.on('end', () => next());
|
|
162
163
|
return;
|
|
163
164
|
}
|
|
164
165
|
console.log(`tar stream file: ${header.name}`);
|
|
166
|
+
|
|
167
|
+
// Create a PassThrough stream to buffer the data
|
|
168
|
+
const passThrough = new plugins.stream.PassThrough();
|
|
165
169
|
const streamfile = plugins.smartfile.StreamFile.fromStream(
|
|
166
|
-
|
|
170
|
+
passThrough,
|
|
167
171
|
header.name,
|
|
168
172
|
);
|
|
173
|
+
|
|
174
|
+
// Push the streamfile immediately
|
|
169
175
|
streamFileIntake.push(streamfile);
|
|
170
|
-
|
|
171
|
-
|
|
176
|
+
|
|
177
|
+
// Pipe the tar entry stream to the passthrough
|
|
178
|
+
stream.pipe(passThrough);
|
|
179
|
+
|
|
180
|
+
// Move to next entry when this one ends
|
|
181
|
+
stream.on('end', () => {
|
|
182
|
+
passThrough.end();
|
|
183
|
+
next();
|
|
172
184
|
});
|
|
173
185
|
});
|
|
174
186
|
tarStream.on('finish', function () {
|
|
175
|
-
console.log('finished');
|
|
187
|
+
console.log('tar extraction finished');
|
|
188
|
+
// Only signal end if this is the final stream
|
|
176
189
|
streamFileIntake.signalEnd();
|
|
177
190
|
});
|
|
178
191
|
analyzedResultChunk.resultStream.pipe(
|
|
@@ -199,10 +212,13 @@ export class SmartArchive {
|
|
|
199
212
|
analyzedResultChunk.isArchive &&
|
|
200
213
|
analyzedResultChunk.decompressionStream
|
|
201
214
|
) {
|
|
202
|
-
|
|
215
|
+
// For nested archives (like gzip containing tar)
|
|
216
|
+
const nestedStream = analyzedResultChunk.resultStream
|
|
203
217
|
.pipe(analyzedResultChunk.decompressionStream)
|
|
204
218
|
.pipe(createAnalyzedStream())
|
|
205
219
|
.pipe(createUnpackStream());
|
|
220
|
+
|
|
221
|
+
// Don't signal end here - let the nested unpacker handle it
|
|
206
222
|
} else {
|
|
207
223
|
const streamFile = plugins.smartfile.StreamFile.fromStream(
|
|
208
224
|
analyzedResultChunk.resultStream,
|