@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,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
- // INSTANCE
4
- constructor() { }
5
- // packing
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
- * contentByteLength is used to set the size of the entry in the tar file
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(); // assuming SmartFile has getSize method
41
+ contentByteLength = await optionsArg.content.getSize();
37
42
  }
38
43
  else if (optionsArg.content instanceof plugins.smartfile.StreamFile) {
39
- contentByteLength = await optionsArg.content.getSize(); // assuming StreamFile has getSize method
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
- const fileStat = await plugins.smartfile.fs.stat(optionsArg.filePath);
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.smartstream.stream.Readable.from(optionsArg.content);
53
+ content = plugins.stream.Readable.from(optionsArg.content);
54
54
  }
55
55
  else if (typeof optionsArg.content === 'string') {
56
- content = plugins.smartstream.stream.Readable.from(Buffer.from(optionsArg.content));
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.smartstream.stream.Readable.from(optionsArg.content.contents);
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.smartstream.stream.Readable) {
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,35 +83,93 @@ 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
- * packs a directory from disk into a tar stream
88
- * @param directoryPath
90
+ * Pack a directory into a TAR stream
89
91
  */
90
92
  async packDirectory(directoryPath) {
91
- const fileTree = await plugins.smartfile.fs.listFileTree(directoryPath, '**/*');
93
+ const fileTree = await plugins.listFileTree(directoryPath, '**/*');
92
94
  const pack = await this.getPackStream();
93
95
  for (const filePath of fileTree) {
94
96
  const absolutePath = plugins.path.join(directoryPath, filePath);
95
- const fileStat = await plugins.smartfile.fs.stat(absolutePath);
97
+ const fileStat = await plugins.fsPromises.stat(absolutePath);
96
98
  await this.addFileToPack(pack, {
97
99
  byteLength: fileStat.size,
98
100
  filePath: absolutePath,
99
101
  fileName: filePath,
100
- content: plugins.smartfile.fsStream.createReadStream(absolutePath),
102
+ content: plugins.fs.createReadStream(absolutePath),
101
103
  });
102
104
  }
103
105
  return pack;
104
106
  }
107
+ /**
108
+ * Get a new TAR pack stream
109
+ */
105
110
  async getPackStream() {
106
- const pack = plugins.tarStream.pack();
107
- return pack;
111
+ return plugins.tarStream.pack();
108
112
  }
109
- // extracting
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50YXJ0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMudGFydG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxPQUFPLFFBQVE7SUFDbkIsV0FBVztJQUNYLGdCQUFlLENBQUM7SUFFaEIsVUFBVTtJQUNILEtBQUssQ0FBQyxhQUFhLENBQ3hCLElBQTRCLEVBQzVCLFVBVUM7UUFFRCxPQUFPLElBQUksT0FBTyxDQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDakQsSUFBSSxRQUFRLEdBQWtCLElBQUksQ0FBQztZQUVuQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDeEIsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDakMsQ0FBQztpQkFBTSxJQUFJLFVBQVUsQ0FBQyxPQUFPLFlBQVksT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDckUsUUFBUSxHQUFJLFVBQVUsQ0FBQyxPQUF1QyxDQUFDLFFBQVEsQ0FBQztZQUMxRSxDQUFDO2lCQUFNLElBQUksVUFBVSxDQUFDLE9BQU8sWUFBWSxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN0RSxRQUFRLEdBQUksVUFBVSxDQUFDLE9BQXdDO3FCQUM1RCxnQkFBZ0IsQ0FBQztZQUN0QixDQUFDO2lCQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMvQixRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNqQyxDQUFDO1lBRUQ7O2VBRUc7WUFDSCxJQUFJLGlCQUF5QixDQUFDO1lBQzlCLElBQUksVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMxQixpQkFBaUIsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1lBQzVDLENBQUM7aUJBQU0sSUFB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
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50YXJ0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMudGFydG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRW5EOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFDbkI7O09BRUc7SUFDSSxLQUFLLENBQUMsYUFBYSxDQUN4QixJQUE0QixFQUM1QixVQVVDO1FBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ2pELElBQUksUUFBUSxHQUFrQixJQUFJLENBQUM7WUFFbkMsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3hCLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ2pDLENBQUM7aUJBQU0sSUFBSSxVQUFVLENBQUMsT0FBTyxZQUFZLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3JFLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUN6QyxDQUFDO2lCQUFNLElBQUksVUFBVSxDQUFDLE9BQU8sWUFBWSxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN0RSxRQUFRLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztZQUNqRCxDQUFDO2lCQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMvQixRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNqQyxDQUFDO1lBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELE9BQU87WUFDVCxDQUFD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
@@ -1,21 +1,56 @@
1
1
  import * as plugins from './plugins.js';
2
- declare class DecompressZipTransform extends plugins.smartstream
3
- .SmartDuplex<ArrayBufferLike> {
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
- export declare class CompressZipTransform extends plugins.stream.Transform {
9
- files: {
10
- [fileName: string]: Uint8Array;
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
- _transform(chunk: Buffer, encoding: BufferEncoding, callback: plugins.stream.TransformCallback): void;
14
- _flush(callback: plugins.stream.TransformCallback): void;
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
- constructor();
18
- getCompressionStream(): CompressZipTransform;
19
- getDecompressionStream(): DecompressZipTransform;
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
- class DecompressZipTransform extends plugins.smartstream
3
- .SmartDuplex {
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 (flateError, dat, final) => {
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
- // This class wraps fflate's zip in a Node.js Transform stream for compression
35
- export class CompressZipTransform extends plugins.stream.Transform {
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
- _transform(chunk, encoding, callback) {
41
- // Simple example: storing chunks in memory before finalizing ZIP in _flush
42
- this.files['file.txt'] = new Uint8Array(chunk);
43
- callback();
44
- }
45
- _flush(callback) {
46
- plugins.fflate.zip(this.files, (err, zipped) => {
47
- if (err) {
48
- callback(err);
49
- }
50
- else {
51
- this.push(Buffer.from(zipped));
52
- callback();
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
- constructor() { }
110
+ /**
111
+ * Get a streaming compression object for creating ZIP archives
112
+ */
59
113
  getCompressionStream() {
60
- return new CompressZipTransform();
114
+ return new ZipCompressionStream();
61
115
  }
116
+ /**
117
+ * Get a streaming decompression transform for extracting ZIP archives
118
+ */
62
119
  getDecompressionStream() {
63
- return new DecompressZipTransform();
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy56aXB0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuemlwdG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxzQkFBdUIsU0FBUSxPQUFPLENBQUMsV0FBVztLQUNyRCxXQUE0QjtJQWlCN0I7UUFDRSxLQUFLLENBQUM7WUFDSixVQUFVLEVBQUUsSUFBSTtZQUNoQixhQUFhLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsRUFBRTtnQkFDaEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUNoQixNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQzVELEtBQUssQ0FDTixDQUFDO1lBQ0osQ0FBQztZQUNELGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDMUMsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBOUJHLGFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUM1RCxJQUFJLFlBQW9CLENBQUM7WUFDekIsT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDaEQsWUFBWTtvQkFDVixDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDbEUsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDVixNQUFNLFVBQVUsR0FDZCxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3hELFVBQVUsQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDcEMsQ0FBQztZQUNILENBQUMsQ0FBQztZQUNGLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQWlCRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FDRjtBQUVELDhFQUE4RTtBQUM5RSxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTO0lBR2hFO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsVUFBVSxDQUNSLEtBQWEsRUFDYixRQUF3QixFQUN4QixRQUEwQztRQUUxQywyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxRQUFRLEVBQUUsQ0FBQztJQUNiLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBMEM7UUFDL0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM3QyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLFFBQVEsRUFBRSxDQUFDO1lBQ2IsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFFBQVE7SUFDbkIsZ0JBQWUsQ0FBQztJQUVULG9CQUFvQjtRQUN6QixPQUFPLElBQUksb0JBQW9CLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU0sc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxzQkFBc0IsRUFBRSxDQUFDO0lBQ3RDLENBQUM7Q0FDRiJ9
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==
@@ -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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHdCQUF3QixDQUFDIn0=
10
+ export * from './classes.bzip2tools.js';
11
+ // Archive analysis
12
+ export * from './classes.archiveanalyzer.js';
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3QkFBd0I7QUFDeEIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGFBQWEsQ0FBQztBQUU1QixxQkFBcUI7QUFDckIsY0FBYywyQkFBMkIsQ0FBQztBQUUxQyx3QkFBd0I7QUFDeEIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyx5QkFBeUIsQ0FBQztBQUV4QyxtQkFBbUI7QUFDbkIsY0FBYyw4QkFBOEIsQ0FBQyJ9