@push.rocks/smartarchive 4.0.6 → 4.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/bzip2/bititerator.d.ts +2 -0
- package/dist_ts/bzip2/bititerator.js +43 -0
- package/dist_ts/bzip2/bzip2.d.ts +14 -0
- package/dist_ts/bzip2/bzip2.js +353 -0
- package/dist_ts/bzip2/index.d.ts +2 -0
- package/dist_ts/bzip2/index.js +83 -0
- package/dist_ts/classes.archiveanalyzer.js +4 -4
- package/dist_ts/classes.bzip2tools.d.ts +1 -9
- package/dist_ts/classes.bzip2tools.js +3 -28
- package/dist_ts/classes.smartarchive.js +6 -2
- package/dist_ts/plugins.d.ts +1 -2
- package/dist_ts/plugins.js +2 -3
- package/license +5 -1
- package/package.json +2 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/bzip2/bititerator.ts +41 -0
- package/ts/bzip2/bzip2.ts +335 -0
- package/ts/bzip2/index.ts +84 -0
- package/ts/classes.archiveanalyzer.ts +4 -4
- package/ts/classes.bzip2tools.ts +2 -31
- package/ts/classes.smartarchive.ts +5 -1
- package/ts/plugins.ts +1 -2
|
@@ -60,6 +60,7 @@ export class SmartArchive {
|
|
|
60
60
|
streamFileStream.pipe(new plugins.smartstream.SmartDuplex({
|
|
61
61
|
objectMode: true,
|
|
62
62
|
writeFunction: async (chunkArg, streamtools) => {
|
|
63
|
+
const done = plugins.smartpromise.defer();
|
|
63
64
|
console.log(chunkArg.relativeFilePath);
|
|
64
65
|
const streamFile = chunkArg;
|
|
65
66
|
const readStream = await streamFile.createReadStream();
|
|
@@ -68,6 +69,10 @@ export class SmartArchive {
|
|
|
68
69
|
await plugins.smartfile.fs.ensureDir(plugins.path.dirname(writePath));
|
|
69
70
|
const writeStream = plugins.smartfile.fsStream.createWriteStream(writePath);
|
|
70
71
|
readStream.pipe(writeStream);
|
|
72
|
+
writeStream.on('finish', () => {
|
|
73
|
+
done.resolve();
|
|
74
|
+
});
|
|
75
|
+
await done.promise;
|
|
71
76
|
},
|
|
72
77
|
finalFunction: async () => {
|
|
73
78
|
done.resolve();
|
|
@@ -91,7 +96,6 @@ export class SmartArchive {
|
|
|
91
96
|
stream.on('end', function () {
|
|
92
97
|
next(); // ready for next entry
|
|
93
98
|
});
|
|
94
|
-
stream.resume(); // just auto drain the stream
|
|
95
99
|
});
|
|
96
100
|
tarStream.on('finish', function () {
|
|
97
101
|
console.log('finished');
|
|
@@ -115,4 +119,4 @@ export class SmartArchive {
|
|
|
115
119
|
return streamFileIntake;
|
|
116
120
|
}
|
|
117
121
|
}
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGFyY2hpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLnNtYXJ0YXJjaGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUVwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsZUFBZSxFQUF3QixNQUFNLDhCQUE4QixDQUFDO0FBSXJGLE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLFNBQVM7SUFDRixNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFjO1FBQy9DLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNoRCxvQkFBb0IsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO1FBQ3hDLE9BQU8sb0JBQW9CLENBQUM7SUFDOUIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFdBQW1CO1FBQ3JELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNoRCxvQkFBb0IsQ0FBQyxjQUFjLEdBQUcsV0FBVyxDQUFDO1FBQ2xELE9BQU8sb0JBQW9CLENBQUM7SUFDOUIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQ25DLFNBQXFGO1FBRXJGLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNoRCxvQkFBb0IsQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1FBQzlDLE9BQU8sb0JBQW9CLENBQUM7SUFDOUIsQ0FBQztJQW1CRDtRQWpCQSxXQUFXO1FBQ0osYUFB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
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -13,5 +13,4 @@ export { smartfile, smartpath, smartpromise, smartrequest, smartunique, smartstr
|
|
|
13
13
|
import * as fileType from 'file-type';
|
|
14
14
|
import * as fflate from 'fflate';
|
|
15
15
|
import tarStream from 'tar-stream';
|
|
16
|
-
|
|
17
|
-
export { fileType, fflate, tarStream, unbzip2Stream };
|
|
16
|
+
export { fileType, fflate, tarStream };
|
package/dist_ts/plugins.js
CHANGED
|
@@ -16,6 +16,5 @@ export { smartfile, smartpath, smartpromise, smartrequest, smartunique, smartstr
|
|
|
16
16
|
import * as fileType from 'file-type';
|
|
17
17
|
import * as fflate from 'fflate';
|
|
18
18
|
import tarStream from 'tar-stream';
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRWpDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFFeEIsbUJBQW1CO0FBQ25CLE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBRXpHLG9CQUFvQjtBQUNwQixPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxhQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxDQUFDIn0=
|
|
19
|
+
export { fileType, fflate, tarStream };
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRWpDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFFeEIsbUJBQW1CO0FBQ25CLE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBRXpHLG9CQUFvQjtBQUNwQixPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFFbkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMifQ==
|
package/license
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
The MIT License (MIT)
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2016
|
|
3
|
+
Copyright (c) 2016 Task Venture Capital GmbH
|
|
4
|
+
|
|
5
|
+
Includes work under MIT license with copyrights:
|
|
6
|
+
* Copyright (c) 2017 by Jan Boelsche (jan@lagomorph.de)
|
|
7
|
+
* Copyright 2011 by antimatter15 (antimatter15@gmail.com)
|
|
4
8
|
|
|
5
9
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
10
|
of this software and associated documentation files (the "Software"), to deal
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartarchive",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.7",
|
|
4
4
|
"description": "work with archives",
|
|
5
5
|
"main": "dist_ts/index.js",
|
|
6
6
|
"typings": "dist_ts/index.d.ts",
|
|
@@ -30,11 +30,10 @@
|
|
|
30
30
|
"@push.rocks/smartunique": "^3.0.6",
|
|
31
31
|
"@push.rocks/smarturl": "^3.0.7",
|
|
32
32
|
"@types/tar-stream": "^3.1.3",
|
|
33
|
-
"@types/unbzip2-stream": "^1.4.3",
|
|
34
33
|
"fflate": "^0.8.1",
|
|
35
34
|
"file-type": "^18.6.0",
|
|
36
35
|
"tar-stream": "^3.1.6",
|
|
37
|
-
"
|
|
36
|
+
"through": "^2.3.8"
|
|
38
37
|
},
|
|
39
38
|
"devDependencies": {
|
|
40
39
|
"@git.zone/tsbuild": "^2.1.66",
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
var BITMASK = [0, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF];
|
|
2
|
+
|
|
3
|
+
// returns a function that reads bits.
|
|
4
|
+
// takes a buffer iterator as input
|
|
5
|
+
export function bitIterator(nextBuffer: () => Buffer) {
|
|
6
|
+
var bit = 0, byte = 0;
|
|
7
|
+
var bytes = nextBuffer();
|
|
8
|
+
var f = function(n) {
|
|
9
|
+
if (n === null && bit != 0) { // align to byte boundary
|
|
10
|
+
bit = 0
|
|
11
|
+
byte++;
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
var result = 0;
|
|
15
|
+
while(n > 0) {
|
|
16
|
+
if (byte >= bytes.length) {
|
|
17
|
+
byte = 0;
|
|
18
|
+
bytes = nextBuffer();
|
|
19
|
+
}
|
|
20
|
+
var left = 8 - bit;
|
|
21
|
+
if (bit === 0 && n > 0)
|
|
22
|
+
// @ts-ignore
|
|
23
|
+
f.bytesRead++;
|
|
24
|
+
if (n >= left) {
|
|
25
|
+
result <<= left;
|
|
26
|
+
result |= (BITMASK[left] & bytes[byte++]);
|
|
27
|
+
bit = 0;
|
|
28
|
+
n -= left;
|
|
29
|
+
} else {
|
|
30
|
+
result <<= n;
|
|
31
|
+
result |= ((bytes[byte] & (BITMASK[n] << (8 - n - bit))) >> (8 - n - bit));
|
|
32
|
+
bit += n;
|
|
33
|
+
n = 0;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
// @ts-ignore
|
|
39
|
+
f.bytesRead = 0;
|
|
40
|
+
return f;
|
|
41
|
+
};
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
export class Bzip2Error extends Error {
|
|
2
|
+
public name: string = 'Bzip2Error';
|
|
3
|
+
public message: string;
|
|
4
|
+
public stack = (new Error()).stack;
|
|
5
|
+
|
|
6
|
+
constructor(messageArg: string) {
|
|
7
|
+
super();
|
|
8
|
+
this.message = messageArg;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
var messageArg = {
|
|
13
|
+
Error: function(message) {throw new Bzip2Error(message);}
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export class Bzip2 {
|
|
17
|
+
public Bzip2Error = Bzip2Error;
|
|
18
|
+
public crcTable =
|
|
19
|
+
[
|
|
20
|
+
0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
|
|
21
|
+
0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
|
|
22
|
+
0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
|
|
23
|
+
0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
|
|
24
|
+
0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
|
|
25
|
+
0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
|
|
26
|
+
0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
|
|
27
|
+
0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
|
|
28
|
+
0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
|
|
29
|
+
0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
|
|
30
|
+
0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
|
|
31
|
+
0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
|
|
32
|
+
0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
|
|
33
|
+
0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
|
|
34
|
+
0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
|
|
35
|
+
0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
|
|
36
|
+
0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
|
|
37
|
+
0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
|
|
38
|
+
0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
|
|
39
|
+
0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
|
|
40
|
+
0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
|
|
41
|
+
0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
|
|
42
|
+
0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
|
|
43
|
+
0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
|
|
44
|
+
0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
|
|
45
|
+
0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
|
|
46
|
+
0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
|
|
47
|
+
0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
|
|
48
|
+
0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
|
|
49
|
+
0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
|
|
50
|
+
0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
|
|
51
|
+
0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
|
|
52
|
+
0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
|
|
53
|
+
0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
|
|
54
|
+
0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
|
|
55
|
+
0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
|
|
56
|
+
0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
|
|
57
|
+
0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
|
|
58
|
+
0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
|
|
59
|
+
0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
|
|
60
|
+
0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
|
|
61
|
+
0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
|
|
62
|
+
0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
|
|
63
|
+
0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
|
|
64
|
+
0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
|
|
65
|
+
0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
|
|
66
|
+
0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
|
|
67
|
+
0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
|
|
68
|
+
0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
|
|
69
|
+
0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
|
|
70
|
+
0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
|
|
71
|
+
0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
|
|
72
|
+
0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
|
|
73
|
+
0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
|
|
74
|
+
0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
|
|
75
|
+
0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
|
|
76
|
+
0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
|
|
77
|
+
0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
|
|
78
|
+
0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
|
|
79
|
+
0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
|
|
80
|
+
0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
|
|
81
|
+
0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
|
|
82
|
+
0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
|
|
83
|
+
0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
|
|
84
|
+
];
|
|
85
|
+
|
|
86
|
+
array = function(bytes) {
|
|
87
|
+
var bit = 0, byte = 0;
|
|
88
|
+
var BITMASK = [0, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF ];
|
|
89
|
+
return function(n) {
|
|
90
|
+
var result = 0;
|
|
91
|
+
while(n > 0) {
|
|
92
|
+
var left = 8 - bit;
|
|
93
|
+
if (n >= left) {
|
|
94
|
+
result <<= left;
|
|
95
|
+
result |= (BITMASK[left] & bytes[byte++]);
|
|
96
|
+
bit = 0;
|
|
97
|
+
n -= left;
|
|
98
|
+
} else {
|
|
99
|
+
result <<= n;
|
|
100
|
+
result |= ((bytes[byte] & (BITMASK[n] << (8 - n - bit))) >> (8 - n - bit));
|
|
101
|
+
bit += n;
|
|
102
|
+
n = 0;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
simple = function(srcbuffer, stream) {
|
|
110
|
+
var bits = this.array(srcbuffer);
|
|
111
|
+
var size = this.header(bits);
|
|
112
|
+
var ret = false;
|
|
113
|
+
var bufsize = 100000 * size;
|
|
114
|
+
var buf = new Int32Array(bufsize);
|
|
115
|
+
|
|
116
|
+
do {
|
|
117
|
+
ret = this.decompress(bits, stream, buf, bufsize);
|
|
118
|
+
} while(!ret);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
header = function(bits) {
|
|
122
|
+
this.byteCount = new Int32Array(256);
|
|
123
|
+
this.symToByte = new Uint8Array(256);
|
|
124
|
+
this.mtfSymbol = new Int32Array(256);
|
|
125
|
+
this.selectors = new Uint8Array(0x8000);
|
|
126
|
+
|
|
127
|
+
if (bits(8*3) != 4348520) messageArg.Error("No magic number found");
|
|
128
|
+
|
|
129
|
+
var i = bits(8) - 48;
|
|
130
|
+
if (i < 1 || i > 9) messageArg.Error("Not a BZIP archive");
|
|
131
|
+
return i;
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
decompress = function(bits, stream, buf, bufsize, streamCRC) {
|
|
135
|
+
var MAX_HUFCODE_BITS = 20;
|
|
136
|
+
var MAX_SYMBOLS = 258;
|
|
137
|
+
var SYMBOL_RUNA = 0;
|
|
138
|
+
var SYMBOL_RUNB = 1;
|
|
139
|
+
var GROUP_SIZE = 50;
|
|
140
|
+
var crc = 0 ^ (-1);
|
|
141
|
+
|
|
142
|
+
for(var h = '', i = 0; i < 6; i++) h += bits(8).toString(16);
|
|
143
|
+
if (h == "177245385090") {
|
|
144
|
+
var finalCRC = bits(32)|0;
|
|
145
|
+
if (finalCRC !== streamCRC) messageArg.Error("Error in bzip2: crc32 do not match");
|
|
146
|
+
// align stream to byte
|
|
147
|
+
bits(null);
|
|
148
|
+
return null; // reset streamCRC for next call
|
|
149
|
+
}
|
|
150
|
+
if (h != "314159265359") messageArg.Error("eek not valid bzip data");
|
|
151
|
+
var crcblock = bits(32)|0; // CRC code
|
|
152
|
+
if (bits(1)) messageArg.Error("unsupported obsolete version");
|
|
153
|
+
var origPtr = bits(24);
|
|
154
|
+
if (origPtr > bufsize) messageArg.Error("Initial position larger than buffer size");
|
|
155
|
+
var t = bits(16);
|
|
156
|
+
var symTotal = 0;
|
|
157
|
+
for (i = 0; i < 16; i++) {
|
|
158
|
+
if (t & (1 << (15 - i))) {
|
|
159
|
+
var k = bits(16);
|
|
160
|
+
for(j = 0; j < 16; j++) {
|
|
161
|
+
if (k & (1 << (15 - j))) {
|
|
162
|
+
this.symToByte[symTotal++] = (16 * i) + j;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
var groupCount = bits(3);
|
|
169
|
+
if (groupCount < 2 || groupCount > 6) messageArg.Error("another error");
|
|
170
|
+
var nSelectors = bits(15);
|
|
171
|
+
if (nSelectors == 0) messageArg.Error("meh");
|
|
172
|
+
for(var i = 0; i < groupCount; i++) this.mtfSymbol[i] = i;
|
|
173
|
+
|
|
174
|
+
for(var i = 0; i < nSelectors; i++) {
|
|
175
|
+
for(var j = 0; bits(1); j++) if (j >= groupCount) messageArg.Error("whoops another error");
|
|
176
|
+
var uc = this.mtfSymbol[j];
|
|
177
|
+
for(var k: any = j-1; k>=0; k--) {
|
|
178
|
+
this.mtfSymbol[k+1] = this.mtfSymbol[k];
|
|
179
|
+
}
|
|
180
|
+
this.mtfSymbol[0] = uc;
|
|
181
|
+
this.selectors[i] = uc;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
var symCount = symTotal + 2;
|
|
185
|
+
var groups = [];
|
|
186
|
+
var length = new Uint8Array(MAX_SYMBOLS),
|
|
187
|
+
temp = new Uint16Array(MAX_HUFCODE_BITS+1);
|
|
188
|
+
|
|
189
|
+
var hufGroup;
|
|
190
|
+
|
|
191
|
+
for(var j = 0; j < groupCount; j++) {
|
|
192
|
+
t = bits(5); //lengths
|
|
193
|
+
for(var i = 0; i < symCount; i++) {
|
|
194
|
+
while(true){
|
|
195
|
+
if (t < 1 || t > MAX_HUFCODE_BITS) messageArg.Error("I gave up a while ago on writing error messages");
|
|
196
|
+
if (!bits(1)) break;
|
|
197
|
+
if (!bits(1)) t++;
|
|
198
|
+
else t--;
|
|
199
|
+
}
|
|
200
|
+
length[i] = t;
|
|
201
|
+
}
|
|
202
|
+
var minLen, maxLen;
|
|
203
|
+
minLen = maxLen = length[0];
|
|
204
|
+
for(var i = 1; i < symCount; i++) {
|
|
205
|
+
if (length[i] > maxLen) maxLen = length[i];
|
|
206
|
+
else if (length[i] < minLen) minLen = length[i];
|
|
207
|
+
}
|
|
208
|
+
hufGroup = groups[j] = {};
|
|
209
|
+
hufGroup.permute = new Int32Array(MAX_SYMBOLS);
|
|
210
|
+
hufGroup.limit = new Int32Array(MAX_HUFCODE_BITS + 1);
|
|
211
|
+
hufGroup.base = new Int32Array(MAX_HUFCODE_BITS + 1);
|
|
212
|
+
|
|
213
|
+
hufGroup.minLen = minLen;
|
|
214
|
+
hufGroup.maxLen = maxLen;
|
|
215
|
+
var base = hufGroup.base;
|
|
216
|
+
var limit = hufGroup.limit;
|
|
217
|
+
var pp = 0;
|
|
218
|
+
for(var i: number = minLen; i <= maxLen; i++)
|
|
219
|
+
for(var t: any = 0; t < symCount; t++)
|
|
220
|
+
if (length[t] == i) hufGroup.permute[pp++] = t;
|
|
221
|
+
for(i = minLen; i <= maxLen; i++) temp[i] = limit[i] = 0;
|
|
222
|
+
for(i = 0; i < symCount; i++) temp[length[i]]++;
|
|
223
|
+
pp = t = 0;
|
|
224
|
+
for(i = minLen; i < maxLen; i++) {
|
|
225
|
+
pp += temp[i];
|
|
226
|
+
limit[i] = pp - 1;
|
|
227
|
+
pp <<= 1;
|
|
228
|
+
base[i+1] = pp - (t += temp[i]);
|
|
229
|
+
}
|
|
230
|
+
limit[maxLen] = pp + temp[maxLen] - 1;
|
|
231
|
+
base[minLen] = 0;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
for(var i = 0; i < 256; i++) {
|
|
235
|
+
this.mtfSymbol[i] = i;
|
|
236
|
+
this.byteCount[i] = 0;
|
|
237
|
+
}
|
|
238
|
+
var runPos, count, symCount: number, selector;
|
|
239
|
+
runPos = count = symCount = selector = 0;
|
|
240
|
+
while(true) {
|
|
241
|
+
if (!(symCount--)) {
|
|
242
|
+
symCount = GROUP_SIZE - 1;
|
|
243
|
+
if (selector >= nSelectors) messageArg.Error("meow i'm a kitty, that's an error");
|
|
244
|
+
hufGroup = groups[this.selectors[selector++]];
|
|
245
|
+
base = hufGroup.base;
|
|
246
|
+
limit = hufGroup.limit;
|
|
247
|
+
}
|
|
248
|
+
i = hufGroup.minLen;
|
|
249
|
+
j = bits(i);
|
|
250
|
+
while(true) {
|
|
251
|
+
if (i > hufGroup.maxLen) messageArg.Error("rawr i'm a dinosaur");
|
|
252
|
+
if (j <= limit[i]) break;
|
|
253
|
+
i++;
|
|
254
|
+
j = (j << 1) | bits(1);
|
|
255
|
+
}
|
|
256
|
+
j -= base[i];
|
|
257
|
+
if (j < 0 || j >= MAX_SYMBOLS) messageArg.Error("moo i'm a cow");
|
|
258
|
+
var nextSym = hufGroup.permute[j];
|
|
259
|
+
if (nextSym == SYMBOL_RUNA || nextSym == SYMBOL_RUNB) {
|
|
260
|
+
if (!runPos){
|
|
261
|
+
runPos = 1;
|
|
262
|
+
t = 0;
|
|
263
|
+
}
|
|
264
|
+
if (nextSym == SYMBOL_RUNA) t += runPos;
|
|
265
|
+
else t += 2 * runPos;
|
|
266
|
+
runPos <<= 1;
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
if (runPos) {
|
|
270
|
+
runPos = 0;
|
|
271
|
+
if (count + t > bufsize) messageArg.Error("Boom.");
|
|
272
|
+
uc = this.symToByte[this.mtfSymbol[0]];
|
|
273
|
+
this.byteCount[uc] += t;
|
|
274
|
+
while(t--) buf[count++] = uc;
|
|
275
|
+
}
|
|
276
|
+
if (nextSym > symTotal) break;
|
|
277
|
+
if (count >= bufsize) messageArg.Error("I can't think of anything. Error");
|
|
278
|
+
i = nextSym - 1;
|
|
279
|
+
uc = this.mtfSymbol[i];
|
|
280
|
+
for(var k: any = i-1; k>=0; k--) {
|
|
281
|
+
this.mtfSymbol[k+1] = this.mtfSymbol[k];
|
|
282
|
+
}
|
|
283
|
+
this.mtfSymbol[0] = uc
|
|
284
|
+
uc = this.symToByte[uc];
|
|
285
|
+
this.byteCount[uc]++;
|
|
286
|
+
buf[count++] = uc;
|
|
287
|
+
}
|
|
288
|
+
if (origPtr < 0 || origPtr >= count) messageArg.Error("I'm a monkey and I'm throwing something at someone, namely you");
|
|
289
|
+
var j = 0;
|
|
290
|
+
for(var i = 0; i < 256; i++) {
|
|
291
|
+
k = j + this.byteCount[i];
|
|
292
|
+
this.byteCount[i] = j;
|
|
293
|
+
j = k;
|
|
294
|
+
}
|
|
295
|
+
for(var i = 0; i < count; i++) {
|
|
296
|
+
uc = buf[i] & 0xff;
|
|
297
|
+
buf[this.byteCount[uc]] |= (i << 8);
|
|
298
|
+
this.byteCount[uc]++;
|
|
299
|
+
}
|
|
300
|
+
var pos = 0, current = 0, run = 0;
|
|
301
|
+
if (count) {
|
|
302
|
+
pos = buf[origPtr];
|
|
303
|
+
current = (pos & 0xff);
|
|
304
|
+
pos >>= 8;
|
|
305
|
+
run = -1;
|
|
306
|
+
}
|
|
307
|
+
count = count;
|
|
308
|
+
var copies, previous, outbyte;
|
|
309
|
+
while(count) {
|
|
310
|
+
count--;
|
|
311
|
+
previous = current;
|
|
312
|
+
pos = buf[pos];
|
|
313
|
+
current = pos & 0xff;
|
|
314
|
+
pos >>= 8;
|
|
315
|
+
if (run++ == 3) {
|
|
316
|
+
copies = current;
|
|
317
|
+
outbyte = previous;
|
|
318
|
+
current = -1;
|
|
319
|
+
} else {
|
|
320
|
+
copies = 1;
|
|
321
|
+
outbyte = current;
|
|
322
|
+
}
|
|
323
|
+
while(copies--) {
|
|
324
|
+
crc = ((crc << 8) ^ this.crcTable[((crc>>24) ^ outbyte) & 0xFF])&0xFFFFFFFF; // crc32
|
|
325
|
+
stream(outbyte);
|
|
326
|
+
}
|
|
327
|
+
if (current != previous) run = 0;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
crc = (crc ^ (-1)) >>> 0;
|
|
331
|
+
if ((crc|0) != (crcblock|0)) messageArg.Error("Error in bzip2: crc32 do not match");
|
|
332
|
+
streamCRC = (crc ^ ((streamCRC << 1) | (streamCRC >>> 31))) & 0xFFFFFFFF;
|
|
333
|
+
return streamCRC;
|
|
334
|
+
};
|
|
335
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
|
|
3
|
+
import { Bzip2 } from './bzip2.js';
|
|
4
|
+
import { bitIterator } from './bititerator.js';
|
|
5
|
+
|
|
6
|
+
export function unbzip2Stream() {
|
|
7
|
+
const bzip2Instance = new Bzip2();
|
|
8
|
+
var bufferQueue = [];
|
|
9
|
+
var hasBytes = 0;
|
|
10
|
+
var blockSize = 0;
|
|
11
|
+
var broken = false;
|
|
12
|
+
var done = false;
|
|
13
|
+
var bitReader = null;
|
|
14
|
+
var streamCRC = null;
|
|
15
|
+
|
|
16
|
+
function decompressBlock() {
|
|
17
|
+
if (!blockSize) {
|
|
18
|
+
blockSize = bzip2Instance.header(bitReader);
|
|
19
|
+
streamCRC = 0;
|
|
20
|
+
} else {
|
|
21
|
+
var bufsize = 100000 * blockSize;
|
|
22
|
+
var buf = new Int32Array(bufsize);
|
|
23
|
+
|
|
24
|
+
var chunk = [];
|
|
25
|
+
var f = function (b) {
|
|
26
|
+
chunk.push(b);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
streamCRC = bzip2Instance.decompress(bitReader, f, buf, bufsize, streamCRC);
|
|
30
|
+
if (streamCRC === null) {
|
|
31
|
+
// reset for next bzip2 header
|
|
32
|
+
blockSize = 0;
|
|
33
|
+
return;
|
|
34
|
+
} else {
|
|
35
|
+
return Buffer.from(chunk);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
var outlength = 0;
|
|
41
|
+
const decompressAndPush = async (smartDuplexStream: plugins.smartstream.SmartDuplex) => {
|
|
42
|
+
if (broken) return;
|
|
43
|
+
try {
|
|
44
|
+
const resultChunk = decompressBlock();
|
|
45
|
+
smartDuplexStream.push(resultChunk);
|
|
46
|
+
if (resultChunk) {
|
|
47
|
+
//console.error('write at', outlength.toString(16));
|
|
48
|
+
outlength += resultChunk.length;
|
|
49
|
+
}
|
|
50
|
+
} catch (e) {
|
|
51
|
+
console.error(e);
|
|
52
|
+
smartDuplexStream.emit('error', e);
|
|
53
|
+
broken = true;
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
return new plugins.smartstream.SmartDuplex({
|
|
59
|
+
writeFunction: async function (data, streamTools) {
|
|
60
|
+
//console.error('received', data.length,'bytes in', typeof data);
|
|
61
|
+
bufferQueue.push(data);
|
|
62
|
+
hasBytes += data.length;
|
|
63
|
+
if (bitReader === null) {
|
|
64
|
+
bitReader = bitIterator(function () {
|
|
65
|
+
return bufferQueue.shift();
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
while (!broken && hasBytes - bitReader.bytesRead + 1 >= (25000 + 100000 * blockSize || 4)) {
|
|
69
|
+
//console.error('decompressing with', hasBytes - bitReader.bytesRead + 1, 'bytes in buffer');
|
|
70
|
+
await decompressAndPush(this);
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
finalFunction: async function (streamTools) {
|
|
74
|
+
//console.error(x,'last compressing with', hasBytes, 'bytes in buffer');
|
|
75
|
+
while (!broken && bitReader && hasBytes > bitReader.bytesRead) {
|
|
76
|
+
await decompressAndPush(this);
|
|
77
|
+
}
|
|
78
|
+
if (!broken) {
|
|
79
|
+
if (streamCRC !== null) this.emit('error', new Error('input stream ended prematurely'));
|
|
80
|
+
this.queue(null);
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
@@ -30,14 +30,14 @@ export class ArchiveAnalyzer {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
private getDecompressionStream(
|
|
33
|
+
private async getDecompressionStream(
|
|
34
34
|
mimeTypeArg: plugins.fileType.FileTypeResult['mime']
|
|
35
|
-
):
|
|
35
|
+
): Promise<plugins.stream.Transform | plugins.stream.Duplex | plugins.tarStream.Extract> {
|
|
36
36
|
switch (mimeTypeArg) {
|
|
37
37
|
case 'application/gzip':
|
|
38
38
|
return this.smartArchiveRef.gzipTools.getDecompressionStream();
|
|
39
39
|
case 'application/x-bzip2':
|
|
40
|
-
return this.smartArchiveRef.bzip2Tools.getDecompressionStream(); // replace with your own bzip2 decompression stream
|
|
40
|
+
return await this.smartArchiveRef.bzip2Tools.getDecompressionStream(); // replace with your own bzip2 decompression stream
|
|
41
41
|
case 'application/x-tar':
|
|
42
42
|
return this.smartArchiveRef.tarTools.getDecompressionStream(); // replace with your own tar decompression stream
|
|
43
43
|
default:
|
|
@@ -53,7 +53,7 @@ export class ArchiveAnalyzer {
|
|
|
53
53
|
readableObjectMode: true,
|
|
54
54
|
writeFunction: async (chunkArg: Buffer, streamtools) => {
|
|
55
55
|
const fileType = await plugins.fileType.fileTypeFromBuffer(chunkArg);
|
|
56
|
-
const decompressionStream = this.getDecompressionStream(fileType?.mime as any);
|
|
56
|
+
const decompressionStream = await this.getDecompressionStream(fileType?.mime as any);
|
|
57
57
|
resultStream.push(chunkArg);
|
|
58
58
|
if (firstRun) {
|
|
59
59
|
firstRun = false;
|
package/ts/classes.bzip2tools.ts
CHANGED
|
@@ -1,36 +1,7 @@
|
|
|
1
1
|
import type { SmartArchive } from './classes.smartarchive.js';
|
|
2
2
|
import * as plugins from './plugins.js';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
private bzip2Decompressor: plugins.stream.Transform;
|
|
6
|
-
|
|
7
|
-
constructor() {
|
|
8
|
-
super();
|
|
9
|
-
// Initialize the bzip2 decompressor once here
|
|
10
|
-
this.bzip2Decompressor = plugins.unbzip2Stream();
|
|
11
|
-
this.bzip2Decompressor.on('data', (data: Buffer) => {
|
|
12
|
-
// When data is decompressed, push it to the stream
|
|
13
|
-
this.push(data);
|
|
14
|
-
});
|
|
15
|
-
this.bzip2Decompressor.on('error', (err) => {
|
|
16
|
-
// If an error occurs, emit it on this stream
|
|
17
|
-
this.emit('error', err);
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
_transform(chunk: Buffer, encoding: BufferEncoding, callback: plugins.stream.TransformCallback) {
|
|
22
|
-
// Pass the chunk directly to the decompressor
|
|
23
|
-
// The decompressor will handle the state across chunks
|
|
24
|
-
this.bzip2Decompressor.write(chunk);
|
|
25
|
-
callback();
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
_flush(callback: plugins.stream.TransformCallback) {
|
|
29
|
-
// When the stream is ending, end the decompressor stream as well
|
|
30
|
-
this.bzip2Decompressor.end();
|
|
31
|
-
callback();
|
|
32
|
-
}
|
|
33
|
-
}
|
|
4
|
+
import { unbzip2Stream } from './bzip2/index.js';
|
|
34
5
|
|
|
35
6
|
export class Bzip2Tools {
|
|
36
7
|
smartArchiveRef: SmartArchive;
|
|
@@ -40,6 +11,6 @@ export class Bzip2Tools {
|
|
|
40
11
|
}
|
|
41
12
|
|
|
42
13
|
getDecompressionStream() {
|
|
43
|
-
return
|
|
14
|
+
return unbzip2Stream();
|
|
44
15
|
}
|
|
45
16
|
}
|