@push.rocks/smartarchive 5.0.1 → 5.2.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 (80) hide show
  1. package/dist_ts/00_commitinfo_data.js +2 -2
  2. package/dist_ts/classes.archiveanalyzer.d.ts +1 -1
  3. package/dist_ts/classes.archiveanalyzer.js +34 -4
  4. package/dist_ts/classes.smartarchive.d.ts +4 -4
  5. package/dist_ts/classes.smartarchive.js +45 -26
  6. package/dist_ts/classes.tartools.d.ts +74 -23
  7. package/dist_ts/classes.tartools.js +190 -139
  8. package/dist_ts/index.d.ts +2 -6
  9. package/dist_ts/index.js +7 -11
  10. package/dist_ts/paths.js +1 -1
  11. package/dist_ts/plugins.d.ts +4 -9
  12. package/dist_ts/plugins.js +9 -13
  13. package/{dist_ts → dist_ts_shared}/bzip2/bititerator.d.ts +1 -1
  14. package/dist_ts_shared/bzip2/bititerator.js +50 -0
  15. package/{dist_ts → dist_ts_shared}/bzip2/bzip2.d.ts +2 -2
  16. package/{dist_ts → dist_ts_shared}/bzip2/bzip2.js +1 -1
  17. package/{dist_ts → dist_ts_shared}/bzip2/index.d.ts +1 -1
  18. package/dist_ts_shared/bzip2/index.js +92 -0
  19. package/dist_ts_shared/classes.bzip2tools.d.ts +10 -0
  20. package/dist_ts_shared/classes.bzip2tools.js +14 -0
  21. package/dist_ts_shared/classes.gziptools.d.ts +26 -0
  22. package/dist_ts_shared/classes.gziptools.js +38 -0
  23. package/dist_ts_shared/classes.tartools.d.ts +30 -0
  24. package/dist_ts_shared/classes.tartools.js +78 -0
  25. package/dist_ts_shared/classes.ziptools.d.ts +31 -0
  26. package/dist_ts_shared/classes.ziptools.js +103 -0
  27. package/{dist_ts → dist_ts_shared}/errors.js +1 -1
  28. package/dist_ts_shared/index.d.ts +8 -0
  29. package/dist_ts_shared/index.js +14 -0
  30. package/{dist_ts → dist_ts_shared}/interfaces.d.ts +17 -7
  31. package/{dist_ts → dist_ts_shared}/interfaces.js +1 -1
  32. package/dist_ts_shared/plugins.d.ts +9 -0
  33. package/dist_ts_shared/plugins.js +14 -0
  34. package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
  35. package/dist_ts_web/00_commitinfo_data.js +9 -0
  36. package/dist_ts_web/index.d.ts +1 -0
  37. package/dist_ts_web/index.js +4 -0
  38. package/dist_ts_web/plugins.d.ts +1 -0
  39. package/dist_ts_web/plugins.js +4 -0
  40. package/npmextra.json +13 -7
  41. package/package.json +24 -13
  42. package/readme.md +154 -46
  43. package/ts/00_commitinfo_data.ts +1 -1
  44. package/ts/classes.archiveanalyzer.ts +33 -5
  45. package/ts/classes.smartarchive.ts +48 -27
  46. package/ts/classes.tartools.ts +217 -153
  47. package/ts/index.ts +7 -11
  48. package/ts/plugins.ts +8 -16
  49. package/{ts → ts_shared}/bzip2/bititerator.ts +1 -1
  50. package/{ts → ts_shared}/bzip2/bzip2.ts +2 -2
  51. package/{ts → ts_shared}/bzip2/index.ts +6 -6
  52. package/ts_shared/classes.bzip2tools.ts +14 -0
  53. package/ts_shared/classes.gziptools.ts +42 -0
  54. package/ts_shared/classes.tartools.ts +89 -0
  55. package/ts_shared/classes.ziptools.ts +107 -0
  56. package/ts_shared/index.ts +17 -0
  57. package/{ts → ts_shared}/interfaces.ts +18 -7
  58. package/ts_shared/plugins.ts +22 -0
  59. package/ts_web/00_commitinfo_data.ts +8 -0
  60. package/ts_web/index.ts +4 -0
  61. package/ts_web/plugins.ts +3 -0
  62. package/dist_ts/bzip2/bititerator.js +0 -50
  63. package/dist_ts/bzip2/index.js +0 -92
  64. package/dist_ts/classes.bzip2tools.d.ts +0 -7
  65. package/dist_ts/classes.bzip2tools.js +0 -11
  66. package/dist_ts/classes.gziptools.d.ts +0 -53
  67. package/dist_ts/classes.gziptools.js +0 -116
  68. package/dist_ts/classes.ziptools.d.ts +0 -56
  69. package/dist_ts/classes.ziptools.js +0 -171
  70. package/dist_ts/smartarchive.classes.smartarchive.d.ts +0 -34
  71. package/dist_ts/smartarchive.classes.smartarchive.js +0 -116
  72. package/dist_ts/smartarchive.paths.d.ts +0 -2
  73. package/dist_ts/smartarchive.paths.js +0 -4
  74. package/dist_ts/smartarchive.plugins.d.ts +0 -14
  75. package/dist_ts/smartarchive.plugins.js +0 -19
  76. package/ts/classes.bzip2tools.ts +0 -16
  77. package/ts/classes.gziptools.ts +0 -138
  78. package/ts/classes.ziptools.ts +0 -196
  79. /package/{dist_ts → dist_ts_shared}/errors.d.ts +0 -0
  80. /package/{ts → ts_shared}/errors.ts +0 -0
@@ -1,175 +1,226 @@
1
1
  import * as plugins from './plugins.js';
2
- import { GzipTools } from './classes.gziptools.js';
2
+ import { TarTools as SharedTarTools } from '../ts_shared/classes.tartools.js';
3
3
  /**
4
- * TAR archive creation and extraction utilities
4
+ * Extended TAR archive utilities with Node.js streaming support
5
+ *
6
+ * For small archives: Use inherited buffer-based methods (packFiles, extractTar, etc.)
7
+ * For large archives: Use streaming methods (getPackStream, getExtractStream, etc.)
5
8
  */
6
- export class TarTools {
9
+ export class TarTools extends SharedTarTools {
10
+ // ============================================
11
+ // STREAMING PACK METHODS (for large files)
12
+ // ============================================
13
+ /**
14
+ * Get a streaming TAR pack instance
15
+ * Use this for packing large files without buffering everything in memory
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const pack = tarTools.getPackStream();
20
+ *
21
+ * await tarTools.addFileToPack(pack, { fileName: 'large.bin', content: readStream, size: fileSize });
22
+ * await tarTools.addFileToPack(pack, { fileName: 'small.txt', content: 'Hello World' });
23
+ *
24
+ * pack.finalize();
25
+ * pack.pipe(fs.createWriteStream('output.tar'));
26
+ * ```
27
+ */
28
+ getPackStream() {
29
+ return plugins.tarStream.pack();
30
+ }
7
31
  /**
8
32
  * Add a file to a TAR pack stream
33
+ * Supports strings, buffers, and readable streams
34
+ *
35
+ * @param pack - The pack stream from getPackStream()
36
+ * @param options - File options including name, content, and optional metadata
9
37
  */
10
- async addFileToPack(pack, optionsArg) {
11
- return new Promise(async (resolve, reject) => {
12
- let fileName = null;
13
- if (optionsArg.fileName) {
14
- fileName = optionsArg.fileName;
15
- }
16
- else if (optionsArg.content instanceof plugins.smartfile.SmartFile) {
17
- fileName = optionsArg.content.relative;
18
- }
19
- else if (optionsArg.content instanceof plugins.smartfile.StreamFile) {
20
- fileName = optionsArg.content.relativeFilePath;
21
- }
22
- else if (optionsArg.filePath) {
23
- fileName = optionsArg.filePath;
24
- }
25
- if (!fileName) {
26
- reject(new Error('No filename specified for TAR entry'));
27
- return;
28
- }
29
- // Determine content byte length
30
- let contentByteLength;
31
- if (optionsArg.byteLength) {
32
- contentByteLength = optionsArg.byteLength;
33
- }
34
- else if (typeof optionsArg.content === 'string') {
35
- contentByteLength = Buffer.byteLength(optionsArg.content, 'utf8');
36
- }
37
- else if (Buffer.isBuffer(optionsArg.content)) {
38
- contentByteLength = optionsArg.content.length;
39
- }
40
- else if (optionsArg.content instanceof plugins.smartfile.SmartFile) {
41
- contentByteLength = await optionsArg.content.getSize();
42
- }
43
- else if (optionsArg.content instanceof plugins.smartfile.StreamFile) {
44
- contentByteLength = await optionsArg.content.getSize();
45
- }
46
- else if (optionsArg.filePath) {
47
- const fileStat = await plugins.fsPromises.stat(optionsArg.filePath);
48
- contentByteLength = fileStat.size;
49
- }
50
- // Convert all content types to Readable stream
51
- let content;
52
- if (Buffer.isBuffer(optionsArg.content)) {
53
- content = plugins.stream.Readable.from(optionsArg.content);
54
- }
55
- else if (typeof optionsArg.content === 'string') {
56
- content = plugins.stream.Readable.from(Buffer.from(optionsArg.content));
57
- }
58
- else if (optionsArg.content instanceof plugins.smartfile.SmartFile) {
59
- content = plugins.stream.Readable.from(optionsArg.content.contents);
60
- }
61
- else if (optionsArg.content instanceof plugins.smartfile.StreamFile) {
62
- content = await optionsArg.content.createReadStream();
63
- }
64
- else if (optionsArg.content instanceof plugins.stream.Readable) {
65
- content = optionsArg.content;
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
- }
38
+ async addFileToPack(pack, options) {
39
+ const { fileName, content, mode = 0o644, mtime = new Date() } = options;
40
+ if (typeof content === 'string') {
41
+ // String content - convert to buffer
42
+ const buffer = Buffer.from(content, 'utf8');
43
+ const entry = pack.entry({
44
+ name: fileName,
45
+ size: buffer.length,
46
+ mode,
47
+ mtime,
48
+ });
49
+ entry.write(buffer);
50
+ entry.end();
51
+ }
52
+ else if (Buffer.isBuffer(content) || content instanceof Uint8Array) {
53
+ // Buffer content
54
+ const buffer = Buffer.isBuffer(content) ? content : Buffer.from(content);
74
55
  const entry = pack.entry({
75
56
  name: fileName,
76
- ...(contentByteLength !== undefined ? { size: contentByteLength } : {}),
77
- }, (err) => {
78
- if (err) {
79
- reject(err);
57
+ size: buffer.length,
58
+ mode,
59
+ mtime,
60
+ });
61
+ entry.write(buffer);
62
+ entry.end();
63
+ }
64
+ else if (content && typeof content.pipe === 'function') {
65
+ // Readable stream - requires size to be provided
66
+ const size = options.size;
67
+ if (size === undefined) {
68
+ throw new Error('Size must be provided when adding a stream to TAR pack');
69
+ }
70
+ return new Promise((resolve, reject) => {
71
+ const entry = pack.entry({
72
+ name: fileName,
73
+ size,
74
+ mode,
75
+ mtime,
76
+ }, (err) => {
77
+ if (err)
78
+ reject(err);
79
+ else
80
+ resolve();
81
+ });
82
+ content.pipe(entry);
83
+ });
84
+ }
85
+ else {
86
+ throw new Error('Unsupported content type for TAR entry');
87
+ }
88
+ }
89
+ // ============================================
90
+ // STREAMING EXTRACT METHODS (for large files)
91
+ // ============================================
92
+ /**
93
+ * Get a streaming TAR extract instance
94
+ * Use this for extracting large archives without buffering everything in memory
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * const extract = tarTools.getExtractStream();
99
+ *
100
+ * extract.on('entry', (header, stream, next) => {
101
+ * console.log(`Extracting: ${header.name}`);
102
+ * stream.pipe(fs.createWriteStream(`./out/${header.name}`));
103
+ * stream.on('end', next);
104
+ * });
105
+ *
106
+ * fs.createReadStream('archive.tar').pipe(extract);
107
+ * ```
108
+ */
109
+ getExtractStream() {
110
+ return plugins.tarStream.extract();
111
+ }
112
+ /**
113
+ * Extract a TAR stream to a directory with true streaming (no buffering)
114
+ *
115
+ * @param sourceStream - The TAR archive stream
116
+ * @param targetDir - Directory to extract files to
117
+ */
118
+ async extractToDirectory(sourceStream, targetDir) {
119
+ await plugins.fsPromises.mkdir(targetDir, { recursive: true });
120
+ return new Promise((resolve, reject) => {
121
+ const extract = this.getExtractStream();
122
+ extract.on('entry', async (header, stream, next) => {
123
+ const filePath = plugins.path.join(targetDir, header.name);
124
+ if (header.type === 'directory') {
125
+ await plugins.fsPromises.mkdir(filePath, { recursive: true });
126
+ stream.resume(); // Drain the stream
127
+ next();
128
+ }
129
+ else if (header.type === 'file') {
130
+ await plugins.fsPromises.mkdir(plugins.path.dirname(filePath), { recursive: true });
131
+ const writeStream = plugins.fs.createWriteStream(filePath);
132
+ stream.pipe(writeStream);
133
+ writeStream.on('finish', next);
134
+ writeStream.on('error', reject);
80
135
  }
81
136
  else {
82
- resolve();
137
+ stream.resume(); // Skip other types
138
+ next();
83
139
  }
84
140
  });
85
- content.pipe(entry);
86
- // Note: resolve() is called in the callback above when pipe completes
141
+ extract.on('finish', resolve);
142
+ extract.on('error', reject);
143
+ sourceStream.pipe(extract);
87
144
  });
88
145
  }
146
+ // ============================================
147
+ // STREAMING DIRECTORY PACK (for large directories)
148
+ // ============================================
89
149
  /**
90
- * Pack a directory into a TAR stream
150
+ * Pack a directory into a TAR stream with true streaming (no buffering)
151
+ * Files are read and written one at a time, never loading everything into memory
91
152
  */
92
- async packDirectory(directoryPath) {
153
+ async getDirectoryPackStream(directoryPath) {
154
+ const pack = this.getPackStream();
93
155
  const fileTree = await plugins.listFileTree(directoryPath, '**/*');
94
- const pack = await this.getPackStream();
95
- for (const filePath of fileTree) {
96
- const absolutePath = plugins.path.join(directoryPath, filePath);
97
- const fileStat = await plugins.fsPromises.stat(absolutePath);
98
- await this.addFileToPack(pack, {
99
- byteLength: fileStat.size,
100
- filePath: absolutePath,
101
- fileName: filePath,
102
- content: plugins.fs.createReadStream(absolutePath),
103
- });
104
- }
156
+ // Process files sequentially to avoid memory issues
157
+ (async () => {
158
+ for (const filePath of fileTree) {
159
+ const absolutePath = plugins.path.join(directoryPath, filePath);
160
+ const stat = await plugins.fsPromises.stat(absolutePath);
161
+ if (stat.isFile()) {
162
+ const readStream = plugins.fs.createReadStream(absolutePath);
163
+ await this.addFileToPack(pack, {
164
+ fileName: filePath,
165
+ content: readStream,
166
+ size: stat.size,
167
+ mode: stat.mode,
168
+ mtime: stat.mtime,
169
+ });
170
+ }
171
+ }
172
+ pack.finalize();
173
+ })().catch((err) => pack.destroy(err));
105
174
  return pack;
106
175
  }
107
176
  /**
108
- * Get a new TAR pack stream
109
- */
110
- async getPackStream() {
111
- return plugins.tarStream.pack();
112
- }
113
- /**
114
- * Get a TAR extraction stream
177
+ * Pack a directory into a TAR.GZ stream with true streaming
178
+ * Uses Node.js zlib for streaming compression
115
179
  */
116
- getDecompressionStream() {
117
- return plugins.tarStream.extract();
180
+ async getDirectoryPackStreamGz(directoryPath, compressionLevel) {
181
+ const tarStream = await this.getDirectoryPackStream(directoryPath);
182
+ const { createGzip } = await import('node:zlib');
183
+ const gzip = createGzip({ level: compressionLevel ?? 6 });
184
+ return tarStream.pipe(gzip);
118
185
  }
186
+ // ============================================
187
+ // BUFFER-BASED METHODS (inherited + filesystem)
188
+ // ============================================
119
189
  /**
120
- * Pack files into a TAR buffer
190
+ * Pack a directory into a TAR buffer (loads all files into memory)
191
+ * For large directories, use getDirectoryPackStream() instead
121
192
  */
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
- });
193
+ async packDirectory(directoryPath) {
194
+ const fileTree = await plugins.listFileTree(directoryPath, '**/*');
195
+ const entries = [];
196
+ for (const filePath of fileTree) {
197
+ const absolutePath = plugins.path.join(directoryPath, filePath);
198
+ const stat = await plugins.fsPromises.stat(absolutePath);
199
+ if (stat.isFile()) {
200
+ const content = await plugins.fsPromises.readFile(absolutePath);
201
+ entries.push({
202
+ archivePath: filePath,
203
+ content: new Uint8Array(content),
204
+ });
205
+ }
130
206
  }
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
- });
207
+ return this.packFiles(entries);
138
208
  }
139
209
  /**
140
- * Pack a directory into a TAR.GZ buffer
210
+ * Pack a directory into a TAR.GZ buffer (loads all files into memory)
211
+ * For large directories, use getDirectoryPackStreamGz() instead
141
212
  */
142
213
  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
- });
214
+ const tarBuffer = await this.packDirectory(directoryPath);
215
+ const { gzipSync } = await import('fflate');
216
+ return gzipSync(new Uint8Array(tarBuffer), { level: compressionLevel ?? 6 });
155
217
  }
156
218
  /**
157
219
  * Pack a directory into a TAR.GZ stream
220
+ * This is now a true streaming implementation
158
221
  */
159
222
  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);
223
+ return this.getDirectoryPackStreamGz(directoryPath, compressionLevel);
173
224
  }
174
225
  }
175
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50YXJ0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMudGFydG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRW5EOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFDbkI7O09BRUc7SUFDSSxLQUFLLENBQUMsYUFBYSxDQUN4QixJQUE0QixFQUM1QixVQVVDO1FBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ2pELElBQUksUUFBUSxHQUFrQixJQUFJLENBQUM7WUFFbkMsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3hCLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ2pDLENBQUM7aUJBQU0sSUFBSSxVQUFVLENBQUMsT0FBTyxZQUFZLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3JFLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUN6QyxDQUFDO2lCQUFNLElBQUksVUFBVSxDQUFDLE9BQU8sWUFBWSxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN0RSxRQUFRLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztZQUNqRCxDQUFDO2lCQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMvQixRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNqQyxDQUFDO1lBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELE9BQU87WUFDVCxDQUFD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
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50YXJ0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NsYXNzZXMudGFydG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxFQUFFLFFBQVEsSUFBSSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQWE5RTs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxRQUFTLFNBQVEsY0FBYztJQUMxQywrQ0FBK0M7SUFDL0MsMkNBQTJDO0lBQzNDLCtDQUErQztJQUUvQzs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNJLGFBQWE7UUFDbEIsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsYUFBYSxDQUN4QixJQUE0QixFQUM1QixPQUE0QjtRQUU1QixNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEdBQUcsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRXhFLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEMscUNBQXFDO1lBQ3JDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxRQUFRO2dCQUNkLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTTtnQkFDbkIsSUFBSTtnQkFDSixLQUFLO2FBQ04sQ0FBQyxDQUFDO1lBQ0gsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwQixLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFBSSxNQUFNLENBQUMs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
@@ -1,8 +1,4 @@
1
- export * from './interfaces.js';
2
- export * from './errors.js';
1
+ export * from '../ts_shared/index.js';
3
2
  export * from './classes.smartarchive.js';
4
- export * from './classes.tartools.js';
5
- export * from './classes.ziptools.js';
6
- export * from './classes.gziptools.js';
7
- export * from './classes.bzip2tools.js';
8
3
  export * from './classes.archiveanalyzer.js';
4
+ export { TarTools, type ITarPackFileOptions } from './classes.tartools.js';
package/dist_ts/index.js CHANGED
@@ -1,13 +1,9 @@
1
- // Core types and errors
2
- export * from './interfaces.js';
3
- export * from './errors.js';
4
- // Main archive class
1
+ // Re-export everything from ts_shared (browser-compatible)
2
+ export * from '../ts_shared/index.js';
3
+ // Node.js-specific: Main archive class with filesystem support
5
4
  export * from './classes.smartarchive.js';
6
- // Format-specific tools
7
- export * from './classes.tartools.js';
8
- export * from './classes.ziptools.js';
9
- export * from './classes.gziptools.js';
10
- export * from './classes.bzip2tools.js';
11
- // Archive analysis
5
+ // Node.js-specific: Archive analysis with SmartArchive integration
12
6
  export * from './classes.archiveanalyzer.js';
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3QkFBd0I7QUFDeEIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGFBQWEsQ0FBQztBQUU1QixxQkFBcUI7QUFDckIsY0FBYywyQkFBMkIsQ0FBQztBQUUxQyx3QkFBd0I7QUFDeEIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyx5QkFBeUIsQ0FBQztBQUV4QyxtQkFBbUI7QUFDbkIsY0FBYyw4QkFBOEIsQ0FBQyJ9
7
+ // Node.js-specific: Extended TarTools with streaming support (overrides shared TarTools)
8
+ export { TarTools } from './classes.tartools.js';
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyREFBMkQ7QUFDM0QsY0FBYyx1QkFBdUIsQ0FBQztBQUV0QywrREFBK0Q7QUFDL0QsY0FBYywyQkFBMkIsQ0FBQztBQUUxQyxtRUFBbUU7QUFDbkUsY0FBYyw4QkFBOEIsQ0FBQztBQUU3Qyx5RkFBeUY7QUFDekYsT0FBTyxFQUFFLFFBQVEsRUFBNEIsTUFBTSx1QkFBdUIsQ0FBQyJ9
package/dist_ts/paths.js CHANGED
@@ -1,4 +1,4 @@
1
1
  import * as plugins from './plugins.js';
2
2
  export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../');
3
3
  export const nogitDir = plugins.path.join(packageDir, './.nogit');
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ3pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQy9ELEtBQUssQ0FDTixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyJ9
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ3pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQy9ELEtBQUssQ0FDTixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyJ9
@@ -7,17 +7,12 @@ export { path, stream, fs, fsPromises };
7
7
  * List files in a directory recursively, returning relative paths
8
8
  */
9
9
  export declare function listFileTree(dirPath: string, _pattern?: string): Promise<string[]>;
10
- import * as smartfile from '@push.rocks/smartfile';
11
- import * as smartdelay from '@push.rocks/smartdelay';
10
+ export * from '../ts_shared/plugins.js';
12
11
  import * as smartpath from '@push.rocks/smartpath';
13
- import * as smartpromise from '@push.rocks/smartpromise';
14
12
  import * as smartrequest from '@push.rocks/smartrequest';
15
13
  import * as smartunique from '@push.rocks/smartunique';
16
- import * as smartstream from '@push.rocks/smartstream';
17
14
  import * as smartrx from '@push.rocks/smartrx';
18
15
  import * as smarturl from '@push.rocks/smarturl';
19
- export { smartfile, smartdelay, smartpath, smartpromise, smartrequest, smartunique, smartstream, smartrx, smarturl, };
20
- import * as fileType from 'file-type';
21
- import * as fflate from 'fflate';
22
- import tarStream from 'tar-stream';
23
- export { fileType, fflate, tarStream };
16
+ export { smartpath, smartrequest, smartunique, smartrx, smarturl, };
17
+ import * as tarStream from 'tar-stream';
18
+ export { tarStream };
@@ -1,4 +1,4 @@
1
- // node native scope
1
+ // Node.js native scope
2
2
  import * as path from 'node:path';
3
3
  import * as stream from 'node:stream';
4
4
  import * as fs from 'node:fs';
@@ -25,20 +25,16 @@ export async function listFileTree(dirPath, _pattern = '**/*') {
25
25
  await walkDir(dirPath);
26
26
  return results;
27
27
  }
28
- // @pushrocks scope
29
- import * as smartfile from '@push.rocks/smartfile';
30
- import * as smartdelay from '@push.rocks/smartdelay';
28
+ // Re-export browser-compatible plugins from ts_shared
29
+ export * from '../ts_shared/plugins.js';
30
+ // Additional Node.js-specific @pushrocks packages
31
31
  import * as smartpath from '@push.rocks/smartpath';
32
- import * as smartpromise from '@push.rocks/smartpromise';
33
32
  import * as smartrequest from '@push.rocks/smartrequest';
34
33
  import * as smartunique from '@push.rocks/smartunique';
35
- import * as smartstream from '@push.rocks/smartstream';
36
34
  import * as smartrx from '@push.rocks/smartrx';
37
35
  import * as smarturl from '@push.rocks/smarturl';
38
- export { smartfile, smartdelay, smartpath, smartpromise, smartrequest, smartunique, smartstream, smartrx, smarturl, };
39
- // third party scope
40
- import * as fileType from 'file-type';
41
- import * as fflate from 'fflate';
42
- import tarStream from 'tar-stream';
43
- export { fileType, fflate, tarStream };
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxVQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFFL0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDO0FBRXhDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQUMsT0FBZSxFQUFFLFdBQW1CLE1BQU07SUFDM0UsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBRTdCLEtBQUssVUFBVSxPQUFPLENBQUMsV0FBbUIsRUFBRSxlQUF1QixFQUFFO1FBQ25FLE1BQU0sT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvRSxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzVCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3JGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV6RCxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUN4QixNQUFNLE9BQU8sQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDN0MsQ0FBQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxtQkFBbUI7QUFDbkIsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssT0FBTyxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osV0FBVyxFQUNYLFdBQVcsRUFDWCxPQUFPLEVBQ1AsUUFBUSxHQUNULENBQUM7QUFFRixvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDIn0=
36
+ export { smartpath, smartrequest, smartunique, smartrx, smarturl, };
37
+ // Node.js-specific: tar-stream for true streaming TAR support
38
+ import * as tarStream from 'tar-stream';
39
+ export { tarStream };
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUJBQXVCO0FBQ3ZCLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxVQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFFL0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDO0FBRXhDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQUMsT0FBZSxFQUFFLFdBQW1CLE1BQU07SUFDM0UsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBRTdCLEtBQUssVUFBVSxPQUFPLENBQUMsV0FBbUIsRUFBRSxlQUF1QixFQUFFO1FBQ25FLE1BQU0sT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvRSxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzVCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3JGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV6RCxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUN4QixNQUFNLE9BQU8sQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDN0MsQ0FBQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxzREFBc0Q7QUFDdEQsY0FBYyx5QkFBeUIsQ0FBQztBQUV4QyxrREFBa0Q7QUFDbEQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBRWpELE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxPQUFPLEVBQ1AsUUFBUSxHQUNULENBQUM7QUFFRiw4REFBOEQ7QUFDOUQsT0FBTyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDIn0=
@@ -3,4 +3,4 @@ import type { IBitReader } from '../interfaces.js';
3
3
  * Creates a bit reader function for BZIP2 decompression.
4
4
  * Takes a buffer iterator as input and returns a function that reads bits.
5
5
  */
6
- export declare function bitIterator(nextBuffer: () => Buffer): IBitReader;
6
+ export declare function bitIterator(nextBuffer: () => Uint8Array): IBitReader;
@@ -0,0 +1,50 @@
1
+ const BITMASK = [0, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff];
2
+ /**
3
+ * Creates a bit reader function for BZIP2 decompression.
4
+ * Takes a buffer iterator as input and returns a function that reads bits.
5
+ */
6
+ export function bitIterator(nextBuffer) {
7
+ let bit = 0;
8
+ let byte = 0;
9
+ let bytes = nextBuffer();
10
+ let _bytesRead = 0;
11
+ const reader = function (n) {
12
+ if (n === null && bit !== 0) {
13
+ // align to byte boundary
14
+ bit = 0;
15
+ byte++;
16
+ return;
17
+ }
18
+ let result = 0;
19
+ let remaining = n;
20
+ while (remaining > 0) {
21
+ if (byte >= bytes.length) {
22
+ byte = 0;
23
+ bytes = nextBuffer();
24
+ }
25
+ const left = 8 - bit;
26
+ if (bit === 0 && remaining > 0) {
27
+ _bytesRead++;
28
+ }
29
+ if (remaining >= left) {
30
+ result <<= left;
31
+ result |= BITMASK[left] & bytes[byte++];
32
+ bit = 0;
33
+ remaining -= left;
34
+ }
35
+ else {
36
+ result <<= remaining;
37
+ result |= (bytes[byte] & (BITMASK[remaining] << (8 - remaining - bit))) >> (8 - remaining - bit);
38
+ bit += remaining;
39
+ remaining = 0;
40
+ }
41
+ }
42
+ return result;
43
+ };
44
+ Object.defineProperty(reader, 'bytesRead', {
45
+ get: () => _bytesRead,
46
+ enumerable: true,
47
+ });
48
+ return reader;
49
+ }
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0aXRlcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19zaGFyZWQvYnppcDIvYml0aXRlcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBVSxDQUFDO0FBRTdFOzs7R0FHRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsVUFBNEI7SUFDdEQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsSUFBSSxLQUFLLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFDekIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBRW5CLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBZ0I7UUFDdkMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1Qix5QkFBeUI7WUFDekIsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNSLElBQUksRUFBRSxDQUFDO1lBQ1AsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLFNBQVMsR0FBRyxDQUFXLENBQUM7UUFFNUIsT0FBTyxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckIsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN6QixJQUFJLEdBQUcsQ0FBQyxDQUFDO2dCQUNULEtBQUssR0FBRyxVQUFVLEVBQUUsQ0FBQztZQUN2QixDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUVyQixJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMvQixVQUFVLEVBQUUsQ0FBQztZQUNmLENBQUM7WUFFRCxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxLQUFLLElBQUksQ0FBQztnQkFDaEIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDeEMsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDUixTQUFTLElBQUksSUFBSSxDQUFDO1lBQ3BCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLEtBQUssU0FBUyxDQUFDO2dCQUNyQixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ2pHLEdBQUcsSUFBSSxTQUFTLENBQUM7Z0JBQ2pCLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFlLENBQUM7SUFFaEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFO1FBQ3pDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxVQUFVO1FBQ3JCLFVBQVUsRUFBRSxJQUFJO0tBQ2pCLENBQUMsQ0FBQztJQUVILE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMifQ==
@@ -13,11 +13,11 @@ export declare class Bzip2 {
13
13
  /**
14
14
  * Create a bit reader from a byte array
15
15
  */
16
- array(bytes: Uint8Array | Buffer): (n: number) => number;
16
+ array(bytes: Uint8Array): (n: number) => number;
17
17
  /**
18
18
  * Simple decompression from a buffer
19
19
  */
20
- simple(srcbuffer: Uint8Array | Buffer, stream: (byte: number) => void): void;
20
+ simple(srcbuffer: Uint8Array, stream: (byte: number) => void): void;
21
21
  /**
22
22
  * Parse BZIP2 header and return block size
23
23
  */