@push.rocks/smartarchive 4.2.3 → 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.
Files changed (42) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/bzip2/bititerator.d.ts +6 -1
  3. package/dist_ts/bzip2/bititerator.js +30 -24
  4. package/dist_ts/bzip2/bzip2.d.ts +27 -12
  5. package/dist_ts/bzip2/bzip2.js +325 -263
  6. package/dist_ts/bzip2/index.d.ts +4 -1
  7. package/dist_ts/bzip2/index.js +36 -38
  8. package/dist_ts/classes.archiveanalyzer.d.ts +25 -5
  9. package/dist_ts/classes.archiveanalyzer.js +19 -8
  10. package/dist_ts/classes.bzip2tools.d.ts +1 -1
  11. package/dist_ts/classes.gziptools.d.ts +39 -6
  12. package/dist_ts/classes.gziptools.js +85 -24
  13. package/dist_ts/classes.smartarchive.d.ts +101 -16
  14. package/dist_ts/classes.smartarchive.js +398 -61
  15. package/dist_ts/classes.tartools.d.ts +31 -4
  16. package/dist_ts/classes.tartools.js +97 -36
  17. package/dist_ts/classes.ziptools.d.ts +47 -12
  18. package/dist_ts/classes.ziptools.js +142 -23
  19. package/dist_ts/errors.d.ts +44 -0
  20. package/dist_ts/errors.js +62 -0
  21. package/dist_ts/index.d.ts +4 -0
  22. package/dist_ts/index.js +9 -1
  23. package/dist_ts/interfaces.d.ts +115 -0
  24. package/dist_ts/interfaces.js +2 -0
  25. package/dist_ts/plugins.d.ts +9 -3
  26. package/dist_ts/plugins.js +27 -4
  27. package/package.json +3 -4
  28. package/readme.hints.md +38 -1
  29. package/readme.md +248 -137
  30. package/ts/00_commitinfo_data.ts +1 -1
  31. package/ts/bzip2/bititerator.ts +43 -27
  32. package/ts/bzip2/bzip2.ts +289 -171
  33. package/ts/bzip2/index.ts +52 -50
  34. package/ts/classes.archiveanalyzer.ts +42 -28
  35. package/ts/classes.gziptools.ts +96 -33
  36. package/ts/classes.smartarchive.ts +472 -122
  37. package/ts/classes.tartools.ts +128 -59
  38. package/ts/classes.ziptools.ts +160 -34
  39. package/ts/errors.ts +70 -0
  40. package/ts/index.ts +11 -0
  41. package/ts/interfaces.ts +131 -0
  42. package/ts/plugins.ts +29 -3
@@ -1,2 +1,5 @@
1
1
  import * as plugins from '../plugins.js';
2
- export declare function unbzip2Stream(): plugins.smartstream.SmartDuplex<any, void>;
2
+ /**
3
+ * Creates a streaming BZIP2 decompression transform
4
+ */
5
+ export declare function unbzip2Stream(): plugins.smartstream.SmartDuplex<Buffer, Buffer>;
@@ -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
- var bufferQueue = [];
7
- var hasBytes = 0;
8
- var blockSize = 0;
9
- var broken = false;
10
- var done = false;
11
- var bitReader = null;
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
- else {
19
- var bufsize = 100000 * blockSize;
20
- var buf = new Int32Array(bufsize);
21
- var chunk = [];
22
- var f = function (b) {
23
- chunk.push(b);
24
- };
25
- streamCRC = bzip2Instance.decompress(bitReader, f, buf, bufsize, streamCRC);
26
- if (streamCRC === null) {
27
- // reset for next bzip2 header
28
- blockSize = 0;
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
- var outlength = 0;
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
- while (!broken &&
68
- hasBytes - bitReader.bytesRead + 1 >= (25000 + 100000 * blockSize || 4)) {
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
- if (streamCRC !== null)
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9iemlwMi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxNQUFNLFVBQVUsYUFBYTtJQUMzQixNQUFNLGFBQWEsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0lBQ2xDLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNyQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNuQixJQUFJLElBQUksR0FBRyxLQUFLLENBQUM7SUFDakIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztJQUVyQixTQUFTLGVBQWU7UUFDdEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsU0FBUyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNoQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksT0FBTyxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUM7WUFDakMsSUFBSSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFbEMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDO2dCQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLENBQUMsQ0FBQztZQUVGLFNBQVMsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUNsQyxTQUFT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
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: plugins.stream.Transform | plugins.stream.Duplex | plugins.tarStream.Extract;
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: SmartArchive;
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
- getAnalyzedStream(): plugins.smartstream.SmartDuplex<Buffer<ArrayBufferLike>, IAnalyzedResult>;
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 await this.smartArchiveRef.bzip2Tools.getDecompressionStream(); // replace with your own bzip2 decompression stream
35
+ return this.smartArchiveRef.bzip2Tools.getDecompressionStream();
26
36
  case 'application/x-tar':
27
- return this.smartArchiveRef.tarTools.getDecompressionStream(); // replace with your own tar decompression stream
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 (tools) => {
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hcmNoaXZlYW5hbHl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmFyY2hpdmVhbmFseXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQVl4QyxNQUFNLE9BQU8sZUFBZTtJQUcxQixZQUFZLGtCQUFnQztRQUMxQyxJQUFJLENBQUMsZUFBZSxHQUFHLGtCQUFrQixDQUFDO0lBQzVDLENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBZ0I7UUFDOUMsTUFBTSxnQkFBZ0IsR0FBZ0IsSUFBSSxHQUFHLENBQUM7WUFDNUMsaUJBQWlCO1lBQ2pCLDhCQUE4QjtZQUM5QixtQkFBbUI7WUFDbkIsa0JBQWtCO1lBQ2xCLDZCQUE2QjtZQUM3QixxQkFBcUI7WUFDckIsb0NBQW9DO1NBQ3JDLENBQUMsQ0FBQztRQUVILE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTyxLQUFLLENBQUMsc0JBQXNCLENBQ2xDLFdBQW9EO1FBSXBELFFBQVEsV0FBVyxFQUFFLENBQUM7WUFDcEIsS0FBSyxrQkFBa0I7Z0JBQ3JCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNqRSxLQUFLLGlCQUFpQjtnQkFDcEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ2hFLEtBQUsscUJBQXFCO2dCQUN4QixPQUFPLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLG1EQUFtRDtZQUM1SCxLQUFLLG1CQUFtQjtnQkFDdEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUMsaURBQWlEO1lBQ2xIO2dCQUNFLHdEQUF3RDtnQkFDeEQsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM3RCxNQUFNLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUd4RDtZQUNBLGtCQUFrQixFQUFFLElBQUk7WUFDeEIsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFnQixFQUFFLFdBQVcsRUFBRSxFQUFFO2dCQUNyRCxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNiLFFBQVEsR0FBRyxLQUFLLENBQUM7b0JBQ2pCLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDckUsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FDM0QsUUFBUSxFQUFFLElBQVcsQ0FDdEIsQ0FBQztvQkFDRjs7dUJBRUc7b0JBQ0gsTUFBTSxNQUFNLEdBQW9CO3dCQUM5QixRQUFRO3dCQUNSLFNBQVMsRUFBRSxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDO3dCQUN2RCxZQUFZO3dCQUNaLG1CQUFtQjtxQkFDcEIsQ0FBQztvQkFDRixNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2pDLENBQUM7Z0JBQ0QsTUFBTSxZQUFZLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9DLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELGFBQWEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQzdCLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7Q0FDRiJ9
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<any, void>;
6
+ getDecompressionStream(): plugins.smartstream.SmartDuplex<Buffer<ArrayBufferLike>, Buffer<ArrayBufferLike>>;
7
7
  }
@@ -1,16 +1,49 @@
1
1
  import * as plugins from './plugins.js';
2
- export declare class CompressGunzipTransform extends plugins.stream.Transform {
3
- constructor();
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
- export declare class DecompressGunzipTransform extends plugins.stream.Transform {
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
- constructor();
14
- getCompressionStream(): CompressGunzipTransform;
15
- getDecompressionStream(): DecompressGunzipTransform;
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
+ */
44
+ compress(data: Buffer, level?: TCompressionLevel): Promise<Buffer>;
45
+ /**
46
+ * Decompress data asynchronously
47
+ */
48
+ decompress(data: Buffer): Promise<Buffer>;
16
49
  }
@@ -1,39 +1,53 @@
1
1
  import * as plugins from './plugins.js';
2
- // This class wraps fflate's gunzip in a Node.js Transform stream
3
- export class CompressGunzipTransform extends plugins.stream.Transform {
4
- constructor() {
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
- _transform(chunk, encoding, callback) {
8
- plugins.fflate.gunzip(chunk, (err, decompressed) => {
9
- if (err) {
10
- callback(err);
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
- // DecompressGunzipTransform class that extends the Node.js Transform stream to
20
- // create a stream that decompresses GZip-compressed data using fflate's gunzip function
21
- export class DecompressGunzipTransform extends plugins.stream.Transform {
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,61 @@ 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
- constructor() { }
57
- getCompressionStream() {
58
- return new CompressGunzipTransform();
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 DecompressGunzipTransform();
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
+ */
100
+ async compress(data, level) {
101
+ return new Promise((resolve, reject) => {
102
+ const options = level !== undefined ? { level } : undefined;
103
+ plugins.fflate.gzip(data, options, (err, result) => {
104
+ if (err)
105
+ reject(err);
106
+ else
107
+ resolve(Buffer.from(result));
108
+ });
109
+ });
110
+ }
111
+ /**
112
+ * Decompress data asynchronously
113
+ */
114
+ async decompress(data) {
115
+ return new Promise((resolve, reject) => {
116
+ plugins.fflate.gunzip(data, (err, result) => {
117
+ if (err)
118
+ reject(err);
119
+ else
120
+ resolve(Buffer.from(result));
121
+ });
122
+ });
62
123
  }
63
124
  }
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5nemlwdG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmd6aXB0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxpRUFBaUU7QUFDakUsTUFBTSxPQUFPLHVCQUF3QixTQUFRLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUztJQUNuRTtRQUNFLEtBQUssRUFBRSxDQUFDO0lBQ1YsQ0FBQztJQUVELFVBQVUsQ0FDUixLQUFhLEVBQ2IsUUFBd0IsRUFDeEIsUUFBMEM7UUFFMUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxFQUFFO1lBQ2pELElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN4QixRQUFRLEVBQUUsQ0FBQztZQUNiLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVELCtFQUErRTtBQUMvRSx3RkFBd0Y7QUFDeEYsTUFBTSxPQUFPLHlCQUEwQixTQUFRLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUztJQUdyRTtRQUNFLEtBQUssRUFBRSxDQUFDO1FBRVIseUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN2RCxnREFBZ0Q7WUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixzREFBc0Q7Z0JBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FDUixLQUFhLEVBQ2IsUUFBd0IsRUFDeEIsUUFBMEM7UUFFMUMsSUFBSSxDQUFDO1lBQ0gsbUNBQW1DO1lBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvQixRQUFRLEVBQUUsQ0FBQztRQUNiLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsUUFBUSxDQUFDLEdBQVksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQTBDO1FBQy9DLElBQUksQ0FBQztZQUNILGdDQUFnQztZQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxQyxRQUFRLEVBQUUsQ0FBQztRQUNiLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsUUFBUSxDQUFDLEdBQVksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sU0FBUztJQUNwQixnQkFBZSxDQUFDO0lBRVQsb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSx1QkFBdUIsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxzQkFBc0I7UUFDM0IsT0FBTyxJQUFJLHlCQUF5QixFQUFFLENBQUM7SUFDekMsQ0FBQztDQUNGIn0=
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5nemlwdG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmd6aXB0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUd4Qzs7R0FFRztBQUNILE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVM7SUFHcEUsWUFBWSxRQUEyQixDQUFDO1FBQ3RDLEtBQUssRUFBRSxDQUFDO1FBRVIscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsVUFBVSxDQUNSLEtBQWEsRUFDYixRQUF3QixFQUN4QixRQUEwQztRQUUxQyxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0IsUUFBUSxFQUFFLENBQUM7UUFDYixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLFFBQVEsQ0FBQyxHQUFZLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUEwQztRQUMvQyxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMs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QyxHQUFHLENBQUMsQ0FBQzs7b0JBQ2hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBWTtRQUNsQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDMUMsSUFBSSxHQUFHO29CQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzs7b0JBQ2hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiJ9
@@ -1,32 +1,117 @@
1
1
  import * as plugins from './plugins.js';
2
+ import type { IArchiveCreationOptions, IArchiveEntry, IArchiveExtractionOptions, IArchiveEntryInfo, IArchiveInfo } from './interfaces.js';
2
3
  import { Bzip2Tools } from './classes.bzip2tools.js';
3
4
  import { GzipTools } from './classes.gziptools.js';
4
5
  import { TarTools } from './classes.tartools.js';
5
6
  import { ZipTools } from './classes.ziptools.js';
6
7
  import { ArchiveAnalyzer } from './classes.archiveanalyzer.js';
8
+ /**
9
+ * Main class for archive manipulation
10
+ * Supports TAR, ZIP, GZIP, and BZIP2 formats
11
+ */
7
12
  export declare class SmartArchive {
8
- static fromArchiveUrl(urlArg: string): Promise<SmartArchive>;
9
- static fromArchiveFile(filePathArg: string): Promise<SmartArchive>;
10
- static fromArchiveStream(streamArg: plugins.stream.Readable | plugins.stream.Duplex | plugins.stream.Transform): Promise<SmartArchive>;
13
+ /**
14
+ * Create SmartArchive from a URL
15
+ */
16
+ static fromUrl(urlArg: string): Promise<SmartArchive>;
17
+ /**
18
+ * Create SmartArchive from a local file path
19
+ */
20
+ static fromFile(filePathArg: string): Promise<SmartArchive>;
21
+ /**
22
+ * Create SmartArchive from a readable stream
23
+ */
24
+ static fromStream(streamArg: plugins.stream.Readable | plugins.stream.Duplex | plugins.stream.Transform): Promise<SmartArchive>;
25
+ /**
26
+ * Create SmartArchive from an in-memory buffer
27
+ */
28
+ static fromBuffer(buffer: Buffer): Promise<SmartArchive>;
29
+ /**
30
+ * Create a new archive from a directory
31
+ */
32
+ static fromDirectory(directoryPath: string, options: IArchiveCreationOptions): Promise<SmartArchive>;
33
+ /**
34
+ * Create a new archive from an array of entries
35
+ */
36
+ static fromFiles(files: IArchiveEntry[], options: IArchiveCreationOptions): Promise<SmartArchive>;
37
+ /**
38
+ * Start building an archive incrementally using a builder pattern
39
+ */
40
+ static create(options: IArchiveCreationOptions): SmartArchive;
41
+ /**
42
+ * Helper to convert a stream to buffer
43
+ */
44
+ private static streamToBuffer;
11
45
  tarTools: TarTools;
12
46
  zipTools: ZipTools;
13
47
  gzipTools: GzipTools;
14
48
  bzip2Tools: Bzip2Tools;
15
49
  archiveAnalyzer: ArchiveAnalyzer;
16
- sourceUrl: string;
17
- sourceFilePath: string;
18
- sourceStream: plugins.stream.Readable | plugins.stream.Duplex | plugins.stream.Transform;
19
- archiveName: string;
20
- singleFileMode: boolean;
21
- addedDirectories: string[];
22
- addedFiles: (plugins.smartfile.SmartFile | plugins.smartfile.StreamFile)[];
23
- addedUrls: string[];
50
+ sourceUrl?: string;
51
+ sourceFilePath?: string;
52
+ sourceStream?: plugins.stream.Readable | plugins.stream.Duplex | plugins.stream.Transform;
53
+ private archiveBuffer?;
54
+ private creationOptions?;
55
+ private pendingEntries?;
24
56
  constructor();
25
57
  /**
26
- * gets the original archive stream
58
+ * Add a file to the archive (builder pattern)
59
+ */
60
+ addFile(archivePath: string, content: string | Buffer): this;
61
+ /**
62
+ * Add a SmartFile to the archive (builder pattern)
63
+ */
64
+ addSmartFile(file: plugins.smartfile.SmartFile, archivePath?: string): this;
65
+ /**
66
+ * Add a StreamFile to the archive (builder pattern)
67
+ */
68
+ addStreamFile(file: plugins.smartfile.StreamFile, archivePath?: string): this;
69
+ /**
70
+ * Build the archive from pending entries
71
+ */
72
+ build(): Promise<SmartArchive>;
73
+ /**
74
+ * Get the original archive stream
75
+ */
76
+ toStream(): Promise<plugins.stream.Readable>;
77
+ /**
78
+ * Get archive as a Buffer
79
+ */
80
+ toBuffer(): Promise<Buffer>;
81
+ /**
82
+ * Write archive to a file
83
+ */
84
+ toFile(filePath: string): Promise<void>;
85
+ /**
86
+ * Extract archive to filesystem
87
+ */
88
+ extractToDirectory(targetDir: string, options?: Partial<IArchiveExtractionOptions>): Promise<void>;
89
+ /**
90
+ * Extract archive to a stream of StreamFile objects
91
+ */
92
+ extractToStream(): Promise<plugins.smartstream.StreamIntake<plugins.smartfile.StreamFile>>;
93
+ /**
94
+ * Extract archive to an array of SmartFile objects (in-memory)
95
+ */
96
+ extractToSmartFiles(): Promise<plugins.smartfile.SmartFile[]>;
97
+ /**
98
+ * Extract a single file from the archive by path
99
+ */
100
+ extractFile(filePath: string): Promise<plugins.smartfile.SmartFile | null>;
101
+ /**
102
+ * Analyze the archive and return metadata
103
+ */
104
+ analyze(): Promise<IArchiveInfo>;
105
+ /**
106
+ * List all entries in the archive without extracting
107
+ */
108
+ listEntries(): Promise<IArchiveEntryInfo[]>;
109
+ /**
110
+ * Check if a specific file exists in the archive
111
+ */
112
+ hasFile(filePath: string): Promise<boolean>;
113
+ /**
114
+ * Helper to read first chunk from stream
27
115
  */
28
- getArchiveStream(): Promise<plugins.stream.Readable>;
29
- exportToTarGzStream(): Promise<void>;
30
- exportToFs(targetDir: string, fileNameArg?: string): Promise<void>;
31
- exportToStreamOfStreamFiles(): Promise<plugins.smartstream.StreamIntake<plugins.smartfile.StreamFile>>;
116
+ private readFirstChunk;
32
117
  }