7z-iterator 0.1.9 → 0.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.
- package/dist/cjs/sevenz/codecs/BcjArm.d.cts +20 -0
- package/dist/cjs/sevenz/codecs/BcjArm.d.ts +20 -0
- package/dist/cjs/sevenz/codecs/BcjArm.js +62 -0
- package/dist/cjs/sevenz/codecs/BcjArm.js.map +1 -0
- package/dist/cjs/sevenz/codecs/BcjArm64.d.cts +21 -0
- package/dist/cjs/sevenz/codecs/BcjArm64.d.ts +21 -0
- package/dist/cjs/sevenz/codecs/BcjArm64.js +65 -0
- package/dist/cjs/sevenz/codecs/BcjArm64.js.map +1 -0
- package/dist/cjs/sevenz/codecs/BcjArmt.d.cts +19 -0
- package/dist/cjs/sevenz/codecs/BcjArmt.d.ts +19 -0
- package/dist/cjs/sevenz/codecs/BcjArmt.js +76 -0
- package/dist/cjs/sevenz/codecs/BcjArmt.js.map +1 -0
- package/dist/cjs/sevenz/codecs/BcjIa64.d.cts +15 -0
- package/dist/cjs/sevenz/codecs/BcjIa64.d.ts +15 -0
- package/dist/cjs/sevenz/codecs/BcjIa64.js +141 -0
- package/dist/cjs/sevenz/codecs/BcjIa64.js.map +1 -0
- package/dist/cjs/sevenz/codecs/BcjPpc.d.cts +20 -0
- package/dist/cjs/sevenz/codecs/BcjPpc.d.ts +20 -0
- package/dist/cjs/sevenz/codecs/BcjPpc.js +64 -0
- package/dist/cjs/sevenz/codecs/BcjPpc.js.map +1 -0
- package/dist/cjs/sevenz/codecs/BcjSparc.d.cts +19 -0
- package/dist/cjs/sevenz/codecs/BcjSparc.d.ts +19 -0
- package/dist/cjs/sevenz/codecs/BcjSparc.js +69 -0
- package/dist/cjs/sevenz/codecs/BcjSparc.js.map +1 -0
- package/dist/cjs/sevenz/codecs/index.js +44 -1
- package/dist/cjs/sevenz/codecs/index.js.map +1 -1
- package/dist/cjs/sevenz/codecs/lzmaCompat.js +12 -7
- package/dist/cjs/sevenz/codecs/lzmaCompat.js.map +1 -1
- package/dist/cjs/sevenz/constants.d.cts +7 -0
- package/dist/cjs/sevenz/constants.d.ts +7 -0
- package/dist/cjs/sevenz/constants.js +41 -0
- package/dist/cjs/sevenz/constants.js.map +1 -1
- package/dist/esm/sevenz/codecs/BcjArm.d.ts +20 -0
- package/dist/esm/sevenz/codecs/BcjArm.js +53 -0
- package/dist/esm/sevenz/codecs/BcjArm.js.map +1 -0
- package/dist/esm/sevenz/codecs/BcjArm64.d.ts +21 -0
- package/dist/esm/sevenz/codecs/BcjArm64.js +57 -0
- package/dist/esm/sevenz/codecs/BcjArm64.js.map +1 -0
- package/dist/esm/sevenz/codecs/BcjArmt.d.ts +19 -0
- package/dist/esm/sevenz/codecs/BcjArmt.js +66 -0
- package/dist/esm/sevenz/codecs/BcjArmt.js.map +1 -0
- package/dist/esm/sevenz/codecs/BcjIa64.d.ts +15 -0
- package/dist/esm/sevenz/codecs/BcjIa64.js +127 -0
- package/dist/esm/sevenz/codecs/BcjIa64.js.map +1 -0
- package/dist/esm/sevenz/codecs/BcjPpc.d.ts +20 -0
- package/dist/esm/sevenz/codecs/BcjPpc.js +55 -0
- package/dist/esm/sevenz/codecs/BcjPpc.js.map +1 -0
- package/dist/esm/sevenz/codecs/BcjSparc.d.ts +19 -0
- package/dist/esm/sevenz/codecs/BcjSparc.js +59 -0
- package/dist/esm/sevenz/codecs/BcjSparc.js.map +1 -0
- package/dist/esm/sevenz/codecs/index.js +44 -1
- package/dist/esm/sevenz/codecs/index.js.map +1 -1
- package/dist/esm/sevenz/codecs/lzmaCompat.js +12 -7
- package/dist/esm/sevenz/codecs/lzmaCompat.js.map +1 -1
- package/dist/esm/sevenz/constants.d.ts +7 -0
- package/dist/esm/sevenz/constants.js +42 -0
- package/dist/esm/sevenz/constants.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// BCJ (PowerPC) filter codec - converts PowerPC branch instruction addresses
|
|
2
|
+
// This filter makes PowerPC executables more compressible by LZMA
|
|
3
|
+
//
|
|
4
|
+
// PowerPC is big-endian. Branch instructions use 26-bit signed offsets.
|
|
5
|
+
//
|
|
6
|
+
// Reference: https://github.com/kornelski/7z/blob/main/C/Bra.c
|
|
7
|
+
"use strict";
|
|
8
|
+
Object.defineProperty(exports, "__esModule", {
|
|
9
|
+
value: true
|
|
10
|
+
});
|
|
11
|
+
function _export(target, all) {
|
|
12
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
_export(exports, {
|
|
18
|
+
get createBcjPpcDecoder () {
|
|
19
|
+
return createBcjPpcDecoder;
|
|
20
|
+
},
|
|
21
|
+
get decodeBcjPpc () {
|
|
22
|
+
return decodeBcjPpc;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
var _extractbaseiterator = require("extract-base-iterator");
|
|
26
|
+
var _createBufferingDecoderts = /*#__PURE__*/ _interop_require_default(require("./createBufferingDecoder.js"));
|
|
27
|
+
function _interop_require_default(obj) {
|
|
28
|
+
return obj && obj.__esModule ? obj : {
|
|
29
|
+
default: obj
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function decodeBcjPpc(input, _properties, _unpackSize) {
|
|
33
|
+
var output = (0, _extractbaseiterator.bufferFrom)(input); // Copy since we modify in place
|
|
34
|
+
var pos = 0;
|
|
35
|
+
// Process 4-byte aligned positions
|
|
36
|
+
while(pos + 4 <= output.length){
|
|
37
|
+
// Read 32-bit value (big-endian)
|
|
38
|
+
var instr = output[pos] << 24 | output[pos + 1] << 16 | output[pos + 2] << 8 | output[pos + 3];
|
|
39
|
+
// Check for B/BL instruction: (instr & 0xFC000003) === 0x48000001
|
|
40
|
+
if ((instr & 0xfc000003) === 0x48000001) {
|
|
41
|
+
// Extract 26-bit offset (bits 2-27, the LI field)
|
|
42
|
+
var addr = instr & 0x03fffffc;
|
|
43
|
+
// Sign-extend 26-bit to 32-bit
|
|
44
|
+
if (addr & 0x02000000) {
|
|
45
|
+
addr |= 0xfc000000;
|
|
46
|
+
}
|
|
47
|
+
// Convert absolute to relative: subtract current position
|
|
48
|
+
var relAddr = addr - pos;
|
|
49
|
+
// Clear old offset and write new one
|
|
50
|
+
instr = instr & 0xfc000003 | relAddr & 0x03fffffc;
|
|
51
|
+
// Write back (big-endian)
|
|
52
|
+
output[pos] = instr >>> 24 & 0xff;
|
|
53
|
+
output[pos + 1] = instr >>> 16 & 0xff;
|
|
54
|
+
output[pos + 2] = instr >>> 8 & 0xff;
|
|
55
|
+
output[pos + 3] = instr & 0xff;
|
|
56
|
+
}
|
|
57
|
+
pos += 4;
|
|
58
|
+
}
|
|
59
|
+
return output;
|
|
60
|
+
}
|
|
61
|
+
function createBcjPpcDecoder(properties, unpackSize) {
|
|
62
|
+
return (0, _createBufferingDecoderts.default)(decodeBcjPpc, properties, unpackSize);
|
|
63
|
+
}
|
|
64
|
+
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/BcjPpc.ts"],"sourcesContent":["// BCJ (PowerPC) filter codec - converts PowerPC branch instruction addresses\n// This filter makes PowerPC executables more compressible by LZMA\n//\n// PowerPC is big-endian. Branch instructions use 26-bit signed offsets.\n//\n// Reference: https://github.com/kornelski/7z/blob/main/C/Bra.c\n\nimport { bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n/**\n * Decode PowerPC BCJ filtered data\n * Reverses the BCJ transformation by converting absolute addresses back to relative\n *\n * PowerPC B/BL instruction format (big-endian):\n * - 4 bytes aligned\n * - Opcode 0x48 in high byte with AA=0, LK=1 (0x48000001 mask 0xFC000003)\n * - Bits 6-29 are 24-bit signed offset (in words)\n *\n * @param input - PowerPC BCJ filtered data\n * @param _properties - Unused for PowerPC BCJ\n * @param _unpackSize - Unused for PowerPC BCJ\n * @returns Unfiltered data\n */\nexport function decodeBcjPpc(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n var output = bufferFrom(input); // Copy since we modify in place\n var pos = 0;\n\n // Process 4-byte aligned positions\n while (pos + 4 <= output.length) {\n // Read 32-bit value (big-endian)\n var instr = (output[pos] << 24) | (output[pos + 1] << 16) | (output[pos + 2] << 8) | output[pos + 3];\n\n // Check for B/BL instruction: (instr & 0xFC000003) === 0x48000001\n if ((instr & 0xfc000003) === 0x48000001) {\n // Extract 26-bit offset (bits 2-27, the LI field)\n var addr = instr & 0x03fffffc;\n\n // Sign-extend 26-bit to 32-bit\n if (addr & 0x02000000) {\n addr |= 0xfc000000;\n }\n\n // Convert absolute to relative: subtract current position\n var relAddr = addr - pos;\n\n // Clear old offset and write new one\n instr = (instr & 0xfc000003) | (relAddr & 0x03fffffc);\n\n // Write back (big-endian)\n output[pos] = (instr >>> 24) & 0xff;\n output[pos + 1] = (instr >>> 16) & 0xff;\n output[pos + 2] = (instr >>> 8) & 0xff;\n output[pos + 3] = instr & 0xff;\n }\n pos += 4;\n }\n\n return output;\n}\n\n/**\n * Create a PowerPC BCJ decoder Transform stream\n */\nexport function createBcjPpcDecoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcjPpc, properties, unpackSize);\n}\n"],"names":["createBcjPpcDecoder","decodeBcjPpc","input","_properties","_unpackSize","output","bufferFrom","pos","length","instr","addr","relAddr","properties","unpackSize","createBufferingDecoder"],"mappings":"AAAA,6EAA6E;AAC7E,kEAAkE;AAClE,EAAE;AACF,wEAAwE;AACxE,EAAE;AACF,+DAA+D;;;;;;;;;;;;QA4D/CA;eAAAA;;QAxCAC;eAAAA;;;mCAlBW;+EAEQ;;;;;;AAgB5B,SAASA,aAAaC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACpF,IAAIC,SAASC,IAAAA,+BAAU,EAACJ,QAAQ,gCAAgC;IAChE,IAAIK,MAAM;IAEV,mCAAmC;IACnC,MAAOA,MAAM,KAAKF,OAAOG,MAAM,CAAE;QAC/B,iCAAiC;QACjC,IAAIC,QAAQ,AAACJ,MAAM,CAACE,IAAI,IAAI,KAAOF,MAAM,CAACE,MAAM,EAAE,IAAI,KAAOF,MAAM,CAACE,MAAM,EAAE,IAAI,IAAKF,MAAM,CAACE,MAAM,EAAE;QAEpG,kEAAkE;QAClE,IAAI,AAACE,CAAAA,QAAQ,UAAS,MAAO,YAAY;YACvC,kDAAkD;YAClD,IAAIC,OAAOD,QAAQ;YAEnB,+BAA+B;YAC/B,IAAIC,OAAO,YAAY;gBACrBA,QAAQ;YACV;YAEA,0DAA0D;YAC1D,IAAIC,UAAUD,OAAOH;YAErB,qCAAqC;YACrCE,QAAQ,AAACA,QAAQ,aAAeE,UAAU;YAE1C,0BAA0B;YAC1BN,MAAM,CAACE,IAAI,GAAG,AAACE,UAAU,KAAM;YAC/BJ,MAAM,CAACE,MAAM,EAAE,GAAG,AAACE,UAAU,KAAM;YACnCJ,MAAM,CAACE,MAAM,EAAE,GAAG,AAACE,UAAU,IAAK;YAClCJ,MAAM,CAACE,MAAM,EAAE,GAAGE,QAAQ;QAC5B;QACAF,OAAO;IACT;IAEA,OAAOF;AACT;AAKO,SAASL,oBAAoBY,UAAmB,EAAEC,UAAmB;IAC1E,OAAOC,IAAAA,iCAAsB,EAACb,cAAcW,YAAYC;AAC1D"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Transform } from 'readable-stream';
|
|
2
|
+
/**
|
|
3
|
+
* Decode SPARC BCJ filtered data
|
|
4
|
+
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
+
*
|
|
6
|
+
* SPARC CALL instruction matching (big-endian):
|
|
7
|
+
* - First byte 0x40 and (second byte & 0xC0) == 0x00, OR
|
|
8
|
+
* - First byte 0x7F and (second byte & 0xC0) == 0xC0
|
|
9
|
+
*
|
|
10
|
+
* @param input - SPARC BCJ filtered data
|
|
11
|
+
* @param _properties - Unused for SPARC BCJ
|
|
12
|
+
* @param _unpackSize - Unused for SPARC BCJ
|
|
13
|
+
* @returns Unfiltered data
|
|
14
|
+
*/
|
|
15
|
+
export declare function decodeBcjSparc(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
16
|
+
/**
|
|
17
|
+
* Create a SPARC BCJ decoder Transform stream
|
|
18
|
+
*/
|
|
19
|
+
export declare function createBcjSparcDecoder(properties?: Buffer, unpackSize?: number): Transform;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Transform } from 'readable-stream';
|
|
2
|
+
/**
|
|
3
|
+
* Decode SPARC BCJ filtered data
|
|
4
|
+
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
+
*
|
|
6
|
+
* SPARC CALL instruction matching (big-endian):
|
|
7
|
+
* - First byte 0x40 and (second byte & 0xC0) == 0x00, OR
|
|
8
|
+
* - First byte 0x7F and (second byte & 0xC0) == 0xC0
|
|
9
|
+
*
|
|
10
|
+
* @param input - SPARC BCJ filtered data
|
|
11
|
+
* @param _properties - Unused for SPARC BCJ
|
|
12
|
+
* @param _unpackSize - Unused for SPARC BCJ
|
|
13
|
+
* @returns Unfiltered data
|
|
14
|
+
*/
|
|
15
|
+
export declare function decodeBcjSparc(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
16
|
+
/**
|
|
17
|
+
* Create a SPARC BCJ decoder Transform stream
|
|
18
|
+
*/
|
|
19
|
+
export declare function createBcjSparcDecoder(properties?: Buffer, unpackSize?: number): Transform;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// BCJ (SPARC) filter codec - converts SPARC branch instruction addresses
|
|
2
|
+
// This filter makes SPARC executables more compressible by LZMA
|
|
3
|
+
//
|
|
4
|
+
// SPARC is big-endian. CALL instructions use 30-bit signed offsets.
|
|
5
|
+
// The filter only transforms CALL instructions with specific byte patterns.
|
|
6
|
+
//
|
|
7
|
+
// Reference: https://github.com/kornelski/7z/blob/main/C/Bra.c
|
|
8
|
+
"use strict";
|
|
9
|
+
Object.defineProperty(exports, "__esModule", {
|
|
10
|
+
value: true
|
|
11
|
+
});
|
|
12
|
+
function _export(target, all) {
|
|
13
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
_export(exports, {
|
|
19
|
+
get createBcjSparcDecoder () {
|
|
20
|
+
return createBcjSparcDecoder;
|
|
21
|
+
},
|
|
22
|
+
get decodeBcjSparc () {
|
|
23
|
+
return decodeBcjSparc;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
var _extractbaseiterator = require("extract-base-iterator");
|
|
27
|
+
var _createBufferingDecoderts = /*#__PURE__*/ _interop_require_default(require("./createBufferingDecoder.js"));
|
|
28
|
+
function _interop_require_default(obj) {
|
|
29
|
+
return obj && obj.__esModule ? obj : {
|
|
30
|
+
default: obj
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function decodeBcjSparc(input, _properties, _unpackSize) {
|
|
34
|
+
var output = (0, _extractbaseiterator.bufferFrom)(input); // Copy since we modify in place
|
|
35
|
+
var pos = 0;
|
|
36
|
+
// Process 4-byte aligned positions
|
|
37
|
+
while(pos + 4 <= output.length){
|
|
38
|
+
var b0 = output[pos];
|
|
39
|
+
var b1 = output[pos + 1];
|
|
40
|
+
// Check for CALL instruction with specific byte patterns:
|
|
41
|
+
// (b0 == 0x40 && (b1 & 0xC0) == 0x00) || (b0 == 0x7F && (b1 & 0xC0) == 0xC0)
|
|
42
|
+
if (b0 === 0x40 && (b1 & 0xc0) === 0x00 || b0 === 0x7f && (b1 & 0xc0) === 0xc0) {
|
|
43
|
+
// Read 32-bit value (big-endian)
|
|
44
|
+
var src = b0 << 24 | b1 << 16 | output[pos + 2] << 8 | output[pos + 3];
|
|
45
|
+
// Shift left by 2 (multiply by 4 for word addressing)
|
|
46
|
+
src <<= 2;
|
|
47
|
+
// Decoding: subtract position
|
|
48
|
+
var dest = src - pos;
|
|
49
|
+
// Shift right by 2
|
|
50
|
+
dest >>>= 2;
|
|
51
|
+
// Reconstruct with sign extension and opcode
|
|
52
|
+
// (((0 - ((dest >> 22) & 1)) << 22) & 0x3FFFFFFF) | (dest & 0x3FFFFF) | 0x40000000
|
|
53
|
+
var signBit = dest >>> 22 & 1;
|
|
54
|
+
var signExtend = signBit ? 0x3fc00000 : 0;
|
|
55
|
+
dest = signExtend | dest & 0x3fffff | 0x40000000;
|
|
56
|
+
// Write back (big-endian)
|
|
57
|
+
output[pos] = dest >>> 24 & 0xff;
|
|
58
|
+
output[pos + 1] = dest >>> 16 & 0xff;
|
|
59
|
+
output[pos + 2] = dest >>> 8 & 0xff;
|
|
60
|
+
output[pos + 3] = dest & 0xff;
|
|
61
|
+
}
|
|
62
|
+
pos += 4;
|
|
63
|
+
}
|
|
64
|
+
return output;
|
|
65
|
+
}
|
|
66
|
+
function createBcjSparcDecoder(properties, unpackSize) {
|
|
67
|
+
return (0, _createBufferingDecoderts.default)(decodeBcjSparc, properties, unpackSize);
|
|
68
|
+
}
|
|
69
|
+
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/BcjSparc.ts"],"sourcesContent":["// BCJ (SPARC) filter codec - converts SPARC branch instruction addresses\n// This filter makes SPARC executables more compressible by LZMA\n//\n// SPARC is big-endian. CALL instructions use 30-bit signed offsets.\n// The filter only transforms CALL instructions with specific byte patterns.\n//\n// Reference: https://github.com/kornelski/7z/blob/main/C/Bra.c\n\nimport { bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n/**\n * Decode SPARC BCJ filtered data\n * Reverses the BCJ transformation by converting absolute addresses back to relative\n *\n * SPARC CALL instruction matching (big-endian):\n * - First byte 0x40 and (second byte & 0xC0) == 0x00, OR\n * - First byte 0x7F and (second byte & 0xC0) == 0xC0\n *\n * @param input - SPARC BCJ filtered data\n * @param _properties - Unused for SPARC BCJ\n * @param _unpackSize - Unused for SPARC BCJ\n * @returns Unfiltered data\n */\nexport function decodeBcjSparc(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n var output = bufferFrom(input); // Copy since we modify in place\n var pos = 0;\n\n // Process 4-byte aligned positions\n while (pos + 4 <= output.length) {\n var b0 = output[pos];\n var b1 = output[pos + 1];\n\n // Check for CALL instruction with specific byte patterns:\n // (b0 == 0x40 && (b1 & 0xC0) == 0x00) || (b0 == 0x7F && (b1 & 0xC0) == 0xC0)\n if ((b0 === 0x40 && (b1 & 0xc0) === 0x00) || (b0 === 0x7f && (b1 & 0xc0) === 0xc0)) {\n // Read 32-bit value (big-endian)\n var src = (b0 << 24) | (b1 << 16) | (output[pos + 2] << 8) | output[pos + 3];\n\n // Shift left by 2 (multiply by 4 for word addressing)\n src <<= 2;\n\n // Decoding: subtract position\n var dest = src - pos;\n\n // Shift right by 2\n dest >>>= 2;\n\n // Reconstruct with sign extension and opcode\n // (((0 - ((dest >> 22) & 1)) << 22) & 0x3FFFFFFF) | (dest & 0x3FFFFF) | 0x40000000\n var signBit = (dest >>> 22) & 1;\n var signExtend = signBit ? 0x3fc00000 : 0;\n dest = signExtend | (dest & 0x3fffff) | 0x40000000;\n\n // Write back (big-endian)\n output[pos] = (dest >>> 24) & 0xff;\n output[pos + 1] = (dest >>> 16) & 0xff;\n output[pos + 2] = (dest >>> 8) & 0xff;\n output[pos + 3] = dest & 0xff;\n }\n\n pos += 4;\n }\n\n return output;\n}\n\n/**\n * Create a SPARC BCJ decoder Transform stream\n */\nexport function createBcjSparcDecoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcjSparc, properties, unpackSize);\n}\n"],"names":["createBcjSparcDecoder","decodeBcjSparc","input","_properties","_unpackSize","output","bufferFrom","pos","length","b0","b1","src","dest","signBit","signExtend","properties","unpackSize","createBufferingDecoder"],"mappings":"AAAA,yEAAyE;AACzE,gEAAgE;AAChE,EAAE;AACF,oEAAoE;AACpE,4EAA4E;AAC5E,EAAE;AACF,+DAA+D;;;;;;;;;;;;QAiE/CA;eAAAA;;QA9CAC;eAAAA;;;mCAjBW;+EAEQ;;;;;;AAe5B,SAASA,eAAeC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACtF,IAAIC,SAASC,IAAAA,+BAAU,EAACJ,QAAQ,gCAAgC;IAChE,IAAIK,MAAM;IAEV,mCAAmC;IACnC,MAAOA,MAAM,KAAKF,OAAOG,MAAM,CAAE;QAC/B,IAAIC,KAAKJ,MAAM,CAACE,IAAI;QACpB,IAAIG,KAAKL,MAAM,CAACE,MAAM,EAAE;QAExB,0DAA0D;QAC1D,6EAA6E;QAC7E,IAAI,AAACE,OAAO,QAAQ,AAACC,CAAAA,KAAK,IAAG,MAAO,QAAUD,OAAO,QAAQ,AAACC,CAAAA,KAAK,IAAG,MAAO,MAAO;YAClF,iCAAiC;YACjC,IAAIC,MAAM,AAACF,MAAM,KAAOC,MAAM,KAAOL,MAAM,CAACE,MAAM,EAAE,IAAI,IAAKF,MAAM,CAACE,MAAM,EAAE;YAE5E,sDAAsD;YACtDI,QAAQ;YAER,8BAA8B;YAC9B,IAAIC,OAAOD,MAAMJ;YAEjB,mBAAmB;YACnBK,UAAU;YAEV,6CAA6C;YAC7C,mFAAmF;YACnF,IAAIC,UAAU,AAACD,SAAS,KAAM;YAC9B,IAAIE,aAAaD,UAAU,aAAa;YACxCD,OAAOE,aAAcF,OAAO,WAAY;YAExC,0BAA0B;YAC1BP,MAAM,CAACE,IAAI,GAAG,AAACK,SAAS,KAAM;YAC9BP,MAAM,CAACE,MAAM,EAAE,GAAG,AAACK,SAAS,KAAM;YAClCP,MAAM,CAACE,MAAM,EAAE,GAAG,AAACK,SAAS,IAAK;YACjCP,MAAM,CAACE,MAAM,EAAE,GAAGK,OAAO;QAC3B;QAEAL,OAAO;IACT;IAEA,OAAOF;AACT;AAKO,SAASL,sBAAsBe,UAAmB,EAAEC,UAAmB;IAC5E,OAAOC,IAAAA,iCAAsB,EAAChB,gBAAgBc,YAAYC;AAC5D"}
|
|
@@ -40,6 +40,12 @@ var _constantsts = require("../constants.js");
|
|
|
40
40
|
var _Aests = require("./Aes.js");
|
|
41
41
|
var _Bcjts = require("./Bcj.js");
|
|
42
42
|
var _Bcj2ts = require("./Bcj2.js");
|
|
43
|
+
var _BcjArmts = require("./BcjArm.js");
|
|
44
|
+
var _BcjArm64ts = require("./BcjArm64.js");
|
|
45
|
+
var _BcjArmtts = require("./BcjArmt.js");
|
|
46
|
+
var _BcjIa64ts = require("./BcjIa64.js");
|
|
47
|
+
var _BcjPpcts = require("./BcjPpc.js");
|
|
48
|
+
var _BcjSparcts = require("./BcjSparc.js");
|
|
43
49
|
var _BZip2ts = require("./BZip2.js");
|
|
44
50
|
var _Copyts = require("./Copy.js");
|
|
45
51
|
var _Deflatets = require("./Deflate.js");
|
|
@@ -85,7 +91,14 @@ function getCodecName(id) {
|
|
|
85
91
|
if (codecIdEquals(id, _constantsts.CodecId.LZMA)) return 'LZMA';
|
|
86
92
|
if (codecIdEquals(id, _constantsts.CodecId.LZMA2)) return 'LZMA2';
|
|
87
93
|
if (codecIdEquals(id, _constantsts.CodecId.BCJ_X86)) return 'BCJ (x86)';
|
|
94
|
+
if (codecIdEquals(id, _constantsts.CodecId.BCJ_ARM)) return 'BCJ (ARM)';
|
|
95
|
+
if (codecIdEquals(id, _constantsts.CodecId.BCJ_ARMT)) return 'BCJ (ARM Thumb)';
|
|
96
|
+
if (codecIdEquals(id, _constantsts.CodecId.BCJ_ARM64)) return 'BCJ (ARM64)';
|
|
97
|
+
if (codecIdEquals(id, _constantsts.CodecId.BCJ_PPC)) return 'BCJ (PowerPC)';
|
|
98
|
+
if (codecIdEquals(id, _constantsts.CodecId.BCJ_IA64)) return 'BCJ (IA64)';
|
|
99
|
+
if (codecIdEquals(id, _constantsts.CodecId.BCJ_SPARC)) return 'BCJ (SPARC)';
|
|
88
100
|
if (codecIdEquals(id, _constantsts.CodecId.BCJ2)) return 'BCJ2';
|
|
101
|
+
if (codecIdEquals(id, _constantsts.CodecId.PPMD)) return 'PPMd';
|
|
89
102
|
if (codecIdEquals(id, _constantsts.CodecId.DELTA)) return 'Delta';
|
|
90
103
|
if (codecIdEquals(id, _constantsts.CodecId.DEFLATE)) return 'Deflate';
|
|
91
104
|
if (codecIdEquals(id, _constantsts.CodecId.BZIP2)) return 'BZip2';
|
|
@@ -116,6 +129,36 @@ registerCodec(_constantsts.CodecId.BCJ_X86, {
|
|
|
116
129
|
decode: _Bcjts.decodeBcj,
|
|
117
130
|
createDecoder: _Bcjts.createBcjDecoder
|
|
118
131
|
});
|
|
132
|
+
// BCJ (ARM) filter
|
|
133
|
+
registerCodec(_constantsts.CodecId.BCJ_ARM, {
|
|
134
|
+
decode: _BcjArmts.decodeBcjArm,
|
|
135
|
+
createDecoder: _BcjArmts.createBcjArmDecoder
|
|
136
|
+
});
|
|
137
|
+
// BCJ (ARM Thumb) filter
|
|
138
|
+
registerCodec(_constantsts.CodecId.BCJ_ARMT, {
|
|
139
|
+
decode: _BcjArmtts.decodeBcjArmt,
|
|
140
|
+
createDecoder: _BcjArmtts.createBcjArmtDecoder
|
|
141
|
+
});
|
|
142
|
+
// BCJ (ARM64) filter
|
|
143
|
+
registerCodec(_constantsts.CodecId.BCJ_ARM64, {
|
|
144
|
+
decode: _BcjArm64ts.decodeBcjArm64,
|
|
145
|
+
createDecoder: _BcjArm64ts.createBcjArm64Decoder
|
|
146
|
+
});
|
|
147
|
+
// BCJ (PowerPC) filter
|
|
148
|
+
registerCodec(_constantsts.CodecId.BCJ_PPC, {
|
|
149
|
+
decode: _BcjPpcts.decodeBcjPpc,
|
|
150
|
+
createDecoder: _BcjPpcts.createBcjPpcDecoder
|
|
151
|
+
});
|
|
152
|
+
// BCJ (IA64) filter
|
|
153
|
+
registerCodec(_constantsts.CodecId.BCJ_IA64, {
|
|
154
|
+
decode: _BcjIa64ts.decodeBcjIa64,
|
|
155
|
+
createDecoder: _BcjIa64ts.createBcjIa64Decoder
|
|
156
|
+
});
|
|
157
|
+
// BCJ (SPARC) filter
|
|
158
|
+
registerCodec(_constantsts.CodecId.BCJ_SPARC, {
|
|
159
|
+
decode: _BcjSparcts.decodeBcjSparc,
|
|
160
|
+
createDecoder: _BcjSparcts.createBcjSparcDecoder
|
|
161
|
+
});
|
|
119
162
|
// Delta filter
|
|
120
163
|
registerCodec(_constantsts.CodecId.DELTA, {
|
|
121
164
|
decode: _Deltats.decodeDelta,
|
|
@@ -141,5 +184,5 @@ registerCodec(_constantsts.CodecId.AES, {
|
|
|
141
184
|
registerCodec(_constantsts.CodecId.BCJ2, {
|
|
142
185
|
decode: _Bcj2ts.decodeBcj2,
|
|
143
186
|
createDecoder: _Bcj2ts.createBcj2Decoder
|
|
144
|
-
});
|
|
187
|
+
}); // Note: PPMd codec is not implemented. See FUTURE_ENHANCEMENTS.md
|
|
145
188
|
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/index.ts"],"sourcesContent":["// Codec registry for 7z decompression\n// Each codec provides a decode function and optionally a streaming decoder\n\nimport type { Transform } from 'readable-stream';\nimport { CodecId, createCodedError, ErrorCode } from '../constants.ts';\nimport { createAesDecoder, decodeAes, getPassword, setPassword } from './Aes.ts';\nimport { createBcjDecoder, decodeBcj } from './Bcj.ts';\nimport { createBcj2Decoder, decodeBcj2, decodeBcj2Multi } from './Bcj2.ts';\nimport { createBzip2Decoder, decodeBzip2 } from './BZip2.ts';\nimport { createCopyDecoder, decodeCopy } from './Copy.ts';\nimport { createDeflateDecoder, decodeDeflate } from './Deflate.ts';\nimport { createDeltaDecoder, decodeDelta } from './Delta.ts';\nimport { createLzmaDecoder, decodeLzma } from './Lzma.ts';\nimport { createLzma2Decoder, decodeLzma2 } from './Lzma2.ts';\n\n// Re-export password functions for API access\nexport { getPassword, setPassword };\n\nexport interface Codec {\n decode: (input: Buffer, properties?: Buffer, unpackSize?: number) => Buffer;\n createDecoder: (properties?: Buffer, unpackSize?: number) => Transform;\n}\n\n// Registry of supported codecs\nvar codecs: { [key: string]: Codec } = {};\n\n/**\n * Convert codec ID bytes to a string key\n */\nfunction codecIdToKey(id: number[]): string {\n var parts: string[] = [];\n for (var i = 0; i < id.length; i++) {\n parts.push(id[i].toString(16).toUpperCase());\n }\n return parts.join('-');\n}\n\n/**\n * Check if two codec IDs match\n */\nfunction codecIdEquals(a: number[], b: number[]): boolean {\n if (a.length !== b.length) return false;\n for (var i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\n/**\n * Register a codec\n */\nexport function registerCodec(id: number[], codec: Codec): void {\n codecs[codecIdToKey(id)] = codec;\n}\n\n/**\n * Get a codec by ID\n * @throws Error if codec is not supported\n */\nexport function getCodec(id: number[]): Codec {\n var key = codecIdToKey(id);\n var codec = codecs[key];\n if (!codec) {\n throw createCodedError(`Unsupported codec: ${key}`, ErrorCode.UNSUPPORTED_CODEC);\n }\n return codec;\n}\n\n/**\n * Check if a codec is supported\n */\nexport function isCodecSupported(id: number[]): boolean {\n return codecs[codecIdToKey(id)] !== undefined;\n}\n\n/**\n * Get human-readable codec name\n */\nexport function getCodecName(id: number[]): string {\n if (codecIdEquals(id, CodecId.COPY)) return 'Copy';\n if (codecIdEquals(id, CodecId.LZMA)) return 'LZMA';\n if (codecIdEquals(id, CodecId.LZMA2)) return 'LZMA2';\n if (codecIdEquals(id, CodecId.BCJ_X86)) return 'BCJ (x86)';\n if (codecIdEquals(id, CodecId.BCJ2)) return 'BCJ2';\n if (codecIdEquals(id, CodecId.DELTA)) return 'Delta';\n if (codecIdEquals(id, CodecId.DEFLATE)) return 'Deflate';\n if (codecIdEquals(id, CodecId.BZIP2)) return 'BZip2';\n if (codecIdEquals(id, CodecId.AES)) return 'AES-256';\n return `Unknown (${codecIdToKey(id)})`;\n}\n\n/**\n * Check if a codec ID matches BCJ2\n */\nexport function isBcj2Codec(id: number[]): boolean {\n return codecIdEquals(id, CodecId.BCJ2);\n}\n\n// Re-export BCJ2 multi-stream decoder for special handling\nexport { decodeBcj2Multi };\n\n// Register built-in codecs\n\n// Copy codec (no compression)\nregisterCodec(CodecId.COPY, {\n decode: decodeCopy,\n createDecoder: createCopyDecoder,\n});\n\n// LZMA codec\nregisterCodec(CodecId.LZMA, {\n decode: decodeLzma,\n createDecoder: createLzmaDecoder,\n});\n\n// LZMA2 codec\nregisterCodec(CodecId.LZMA2, {\n decode: decodeLzma2,\n createDecoder: createLzma2Decoder,\n});\n\n// BCJ (x86) filter\nregisterCodec(CodecId.BCJ_X86, {\n decode: decodeBcj,\n createDecoder: createBcjDecoder,\n});\n\n// Delta filter\nregisterCodec(CodecId.DELTA, {\n decode: decodeDelta,\n createDecoder: createDeltaDecoder,\n});\n\n// Deflate codec\nregisterCodec(CodecId.DEFLATE, {\n decode: decodeDeflate,\n createDecoder: createDeflateDecoder,\n});\n\n// BZip2 codec\nregisterCodec(CodecId.BZIP2, {\n decode: decodeBzip2,\n createDecoder: createBzip2Decoder,\n});\n\n// AES-256-CBC codec (encryption)\nregisterCodec(CodecId.AES, {\n decode: decodeAes,\n createDecoder: createAesDecoder,\n});\n\n// BCJ2 (x86-64) filter - multi-stream\n// Note: BCJ2 requires special handling in SevenZipParser due to 4-stream architecture\nregisterCodec(CodecId.BCJ2, {\n decode: decodeBcj2,\n createDecoder: createBcj2Decoder,\n});\n"],"names":["decodeBcj2Multi","getCodec","getCodecName","getPassword","isBcj2Codec","isCodecSupported","registerCodec","setPassword","codecs","codecIdToKey","id","parts","i","length","push","toString","toUpperCase","join","codecIdEquals","a","b","codec","key","createCodedError","ErrorCode","UNSUPPORTED_CODEC","undefined","CodecId","COPY","LZMA","LZMA2","BCJ_X86","BCJ2","DELTA","DEFLATE","BZIP2","AES","decode","decodeCopy","createDecoder","createCopyDecoder","decodeLzma","createLzmaDecoder","decodeLzma2","createLzma2Decoder","decodeBcj","createBcjDecoder","decodeDelta","createDeltaDecoder","decodeDeflate","createDeflateDecoder","decodeBzip2","createBzip2Decoder","decodeAes","createAesDecoder","decodeBcj2","createBcj2Decoder"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/index.ts"],"sourcesContent":["// Codec registry for 7z decompression\n// Each codec provides a decode function and optionally a streaming decoder\n\nimport type { Transform } from 'readable-stream';\nimport { CodecId, createCodedError, ErrorCode } from '../constants.ts';\nimport { createAesDecoder, decodeAes, getPassword, setPassword } from './Aes.ts';\nimport { createBcjDecoder, decodeBcj } from './Bcj.ts';\nimport { createBcj2Decoder, decodeBcj2, decodeBcj2Multi } from './Bcj2.ts';\nimport { createBcjArmDecoder, decodeBcjArm } from './BcjArm.ts';\nimport { createBcjArm64Decoder, decodeBcjArm64 } from './BcjArm64.ts';\nimport { createBcjArmtDecoder, decodeBcjArmt } from './BcjArmt.ts';\nimport { createBcjIa64Decoder, decodeBcjIa64 } from './BcjIa64.ts';\nimport { createBcjPpcDecoder, decodeBcjPpc } from './BcjPpc.ts';\nimport { createBcjSparcDecoder, decodeBcjSparc } from './BcjSparc.ts';\nimport { createBzip2Decoder, decodeBzip2 } from './BZip2.ts';\nimport { createCopyDecoder, decodeCopy } from './Copy.ts';\nimport { createDeflateDecoder, decodeDeflate } from './Deflate.ts';\nimport { createDeltaDecoder, decodeDelta } from './Delta.ts';\nimport { createLzmaDecoder, decodeLzma } from './Lzma.ts';\nimport { createLzma2Decoder, decodeLzma2 } from './Lzma2.ts';\n\n// Re-export password functions for API access\nexport { getPassword, setPassword };\n\nexport interface Codec {\n decode: (input: Buffer, properties?: Buffer, unpackSize?: number) => Buffer;\n createDecoder: (properties?: Buffer, unpackSize?: number) => Transform;\n}\n\n// Registry of supported codecs\nvar codecs: { [key: string]: Codec } = {};\n\n/**\n * Convert codec ID bytes to a string key\n */\nfunction codecIdToKey(id: number[]): string {\n var parts: string[] = [];\n for (var i = 0; i < id.length; i++) {\n parts.push(id[i].toString(16).toUpperCase());\n }\n return parts.join('-');\n}\n\n/**\n * Check if two codec IDs match\n */\nfunction codecIdEquals(a: number[], b: number[]): boolean {\n if (a.length !== b.length) return false;\n for (var i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\n/**\n * Register a codec\n */\nexport function registerCodec(id: number[], codec: Codec): void {\n codecs[codecIdToKey(id)] = codec;\n}\n\n/**\n * Get a codec by ID\n * @throws Error if codec is not supported\n */\nexport function getCodec(id: number[]): Codec {\n var key = codecIdToKey(id);\n var codec = codecs[key];\n if (!codec) {\n throw createCodedError(`Unsupported codec: ${key}`, ErrorCode.UNSUPPORTED_CODEC);\n }\n return codec;\n}\n\n/**\n * Check if a codec is supported\n */\nexport function isCodecSupported(id: number[]): boolean {\n return codecs[codecIdToKey(id)] !== undefined;\n}\n\n/**\n * Get human-readable codec name\n */\nexport function getCodecName(id: number[]): string {\n if (codecIdEquals(id, CodecId.COPY)) return 'Copy';\n if (codecIdEquals(id, CodecId.LZMA)) return 'LZMA';\n if (codecIdEquals(id, CodecId.LZMA2)) return 'LZMA2';\n if (codecIdEquals(id, CodecId.BCJ_X86)) return 'BCJ (x86)';\n if (codecIdEquals(id, CodecId.BCJ_ARM)) return 'BCJ (ARM)';\n if (codecIdEquals(id, CodecId.BCJ_ARMT)) return 'BCJ (ARM Thumb)';\n if (codecIdEquals(id, CodecId.BCJ_ARM64)) return 'BCJ (ARM64)';\n if (codecIdEquals(id, CodecId.BCJ_PPC)) return 'BCJ (PowerPC)';\n if (codecIdEquals(id, CodecId.BCJ_IA64)) return 'BCJ (IA64)';\n if (codecIdEquals(id, CodecId.BCJ_SPARC)) return 'BCJ (SPARC)';\n if (codecIdEquals(id, CodecId.BCJ2)) return 'BCJ2';\n if (codecIdEquals(id, CodecId.PPMD)) return 'PPMd';\n if (codecIdEquals(id, CodecId.DELTA)) return 'Delta';\n if (codecIdEquals(id, CodecId.DEFLATE)) return 'Deflate';\n if (codecIdEquals(id, CodecId.BZIP2)) return 'BZip2';\n if (codecIdEquals(id, CodecId.AES)) return 'AES-256';\n return `Unknown (${codecIdToKey(id)})`;\n}\n\n/**\n * Check if a codec ID matches BCJ2\n */\nexport function isBcj2Codec(id: number[]): boolean {\n return codecIdEquals(id, CodecId.BCJ2);\n}\n\n// Re-export BCJ2 multi-stream decoder for special handling\nexport { decodeBcj2Multi };\n\n// Register built-in codecs\n\n// Copy codec (no compression)\nregisterCodec(CodecId.COPY, {\n decode: decodeCopy,\n createDecoder: createCopyDecoder,\n});\n\n// LZMA codec\nregisterCodec(CodecId.LZMA, {\n decode: decodeLzma,\n createDecoder: createLzmaDecoder,\n});\n\n// LZMA2 codec\nregisterCodec(CodecId.LZMA2, {\n decode: decodeLzma2,\n createDecoder: createLzma2Decoder,\n});\n\n// BCJ (x86) filter\nregisterCodec(CodecId.BCJ_X86, {\n decode: decodeBcj,\n createDecoder: createBcjDecoder,\n});\n\n// BCJ (ARM) filter\nregisterCodec(CodecId.BCJ_ARM, {\n decode: decodeBcjArm,\n createDecoder: createBcjArmDecoder,\n});\n\n// BCJ (ARM Thumb) filter\nregisterCodec(CodecId.BCJ_ARMT, {\n decode: decodeBcjArmt,\n createDecoder: createBcjArmtDecoder,\n});\n\n// BCJ (ARM64) filter\nregisterCodec(CodecId.BCJ_ARM64, {\n decode: decodeBcjArm64,\n createDecoder: createBcjArm64Decoder,\n});\n\n// BCJ (PowerPC) filter\nregisterCodec(CodecId.BCJ_PPC, {\n decode: decodeBcjPpc,\n createDecoder: createBcjPpcDecoder,\n});\n\n// BCJ (IA64) filter\nregisterCodec(CodecId.BCJ_IA64, {\n decode: decodeBcjIa64,\n createDecoder: createBcjIa64Decoder,\n});\n\n// BCJ (SPARC) filter\nregisterCodec(CodecId.BCJ_SPARC, {\n decode: decodeBcjSparc,\n createDecoder: createBcjSparcDecoder,\n});\n\n// Delta filter\nregisterCodec(CodecId.DELTA, {\n decode: decodeDelta,\n createDecoder: createDeltaDecoder,\n});\n\n// Deflate codec\nregisterCodec(CodecId.DEFLATE, {\n decode: decodeDeflate,\n createDecoder: createDeflateDecoder,\n});\n\n// BZip2 codec\nregisterCodec(CodecId.BZIP2, {\n decode: decodeBzip2,\n createDecoder: createBzip2Decoder,\n});\n\n// AES-256-CBC codec (encryption)\nregisterCodec(CodecId.AES, {\n decode: decodeAes,\n createDecoder: createAesDecoder,\n});\n\n// BCJ2 (x86-64) filter - multi-stream\n// Note: BCJ2 requires special handling in SevenZipParser due to 4-stream architecture\nregisterCodec(CodecId.BCJ2, {\n decode: decodeBcj2,\n createDecoder: createBcj2Decoder,\n});\n\n// Note: PPMd codec is not implemented. See FUTURE_ENHANCEMENTS.md\n"],"names":["decodeBcj2Multi","getCodec","getCodecName","getPassword","isBcj2Codec","isCodecSupported","registerCodec","setPassword","codecs","codecIdToKey","id","parts","i","length","push","toString","toUpperCase","join","codecIdEquals","a","b","codec","key","createCodedError","ErrorCode","UNSUPPORTED_CODEC","undefined","CodecId","COPY","LZMA","LZMA2","BCJ_X86","BCJ_ARM","BCJ_ARMT","BCJ_ARM64","BCJ_PPC","BCJ_IA64","BCJ_SPARC","BCJ2","PPMD","DELTA","DEFLATE","BZIP2","AES","decode","decodeCopy","createDecoder","createCopyDecoder","decodeLzma","createLzmaDecoder","decodeLzma2","createLzma2Decoder","decodeBcj","createBcjDecoder","decodeBcjArm","createBcjArmDecoder","decodeBcjArmt","createBcjArmtDecoder","decodeBcjArm64","createBcjArm64Decoder","decodeBcjPpc","createBcjPpcDecoder","decodeBcjIa64","createBcjIa64Decoder","decodeBcjSparc","createBcjSparcDecoder","decodeDelta","createDeltaDecoder","decodeDeflate","createDeflateDecoder","decodeBzip2","createBzip2Decoder","decodeAes","createAesDecoder","decodeBcj2","createBcj2Decoder"],"mappings":"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"}
|
|
@@ -35,15 +35,20 @@ function _interop_require_default(obj) {
|
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
37
|
var _require = typeof require === 'undefined' ? _module.default.createRequire(require("url").pathToFileURL(__filename).toString()) : require;
|
|
38
|
-
// Try to load lzma-native
|
|
38
|
+
// Try to load lzma-native (only on Node 10+ where ES6 class syntax is supported)
|
|
39
|
+
// Note: We must check the version BEFORE requiring because syntax errors during
|
|
40
|
+
// module parsing cannot be caught by try/catch
|
|
39
41
|
var lzmaNative = null;
|
|
40
42
|
var _hasNativeLzmaLib = false;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
var major = +process.versions.node.split('.')[0];
|
|
44
|
+
if (major >= 10) {
|
|
45
|
+
try {
|
|
46
|
+
lzmaNative = _require('lzma-native');
|
|
47
|
+
// Verify rawDecoder support
|
|
48
|
+
_hasNativeLzmaLib = lzmaNative !== null && typeof lzmaNative.createStream === 'function';
|
|
49
|
+
} catch (_e) {
|
|
50
|
+
// lzma-native not available - will use lzma-purejs
|
|
51
|
+
}
|
|
47
52
|
}
|
|
48
53
|
var hasNativeLzma = _hasNativeLzmaLib;
|
|
49
54
|
function createNativeLzma2Decoder(dictSize) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/lzmaCompat.ts"],"sourcesContent":["/**\n * LZMA compatibility layer - uses native lzma when available, falls back to lzma-purejs\n *\n * lzma-native provides native liblzma bindings with rawDecoder support.\n * This gives significant performance improvements on Node.js 8+ while\n * maintaining compatibility with Node.js 0.8+ via lzma-purejs fallback.\n *\n * The native decoder uses Node.js streams which integrate naturally with\n * the callback-based async pattern used throughout the iterator libraries.\n */\n\nimport Module from 'module';\nimport type { Transform } from 'readable-stream';\n\nvar _require = typeof require === 'undefined' ? Module.createRequire(import.meta.url) : require;\n\n// Try to load lzma-native\nvar lzmaNative: typeof import('lzma-native') | null = null;\nvar _hasNativeLzmaLib = false;\n\
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/lzmaCompat.ts"],"sourcesContent":["/**\n * LZMA compatibility layer - uses native lzma when available, falls back to lzma-purejs\n *\n * lzma-native provides native liblzma bindings with rawDecoder support.\n * This gives significant performance improvements on Node.js 8+ while\n * maintaining compatibility with Node.js 0.8+ via lzma-purejs fallback.\n *\n * The native decoder uses Node.js streams which integrate naturally with\n * the callback-based async pattern used throughout the iterator libraries.\n */\n\nimport Module from 'module';\nimport type { Transform } from 'readable-stream';\n\nvar _require = typeof require === 'undefined' ? Module.createRequire(import.meta.url) : require;\n\n// Try to load lzma-native (only on Node 10+ where ES6 class syntax is supported)\n// Note: We must check the version BEFORE requiring because syntax errors during\n// module parsing cannot be caught by try/catch\nvar lzmaNative: typeof import('lzma-native') | null = null;\nvar _hasNativeLzmaLib = false;\nvar major = +process.versions.node.split('.')[0];\n\nif (major >= 10) {\n try {\n lzmaNative = _require('lzma-native');\n // Verify rawDecoder support\n _hasNativeLzmaLib = lzmaNative !== null && typeof lzmaNative.createStream === 'function';\n } catch (_e) {\n // lzma-native not available - will use lzma-purejs\n }\n}\n\n// Export whether native lzma is available for streaming\nexport var hasNativeLzma = _hasNativeLzmaLib;\n\n/**\n * Create a native LZMA2 decoder stream\n * Returns a Transform stream that decodes LZMA2 data\n *\n * @param dictSize - Dictionary size\n * @returns Transform stream for decoding, or null if native not available\n */\nexport function createNativeLzma2Decoder(dictSize?: number): Transform | null {\n if (!lzmaNative) {\n return null;\n }\n\n var filterOpts: { id: string; dict_size?: number } = {\n id: lzmaNative.FILTER_LZMA2,\n };\n\n if (dictSize !== undefined) {\n filterOpts.dict_size = dictSize;\n }\n\n return lzmaNative.createStream('rawDecoder', {\n filters: [filterOpts],\n }) as unknown as Transform;\n}\n\n/**\n * Create a native LZMA1 decoder stream\n * Returns a Transform stream that decodes LZMA1 data\n *\n * Note: Native LZMA1 decoder disabled due to LZMA_BUF_ERROR issues with\n * lzma-native's rawDecoder for LZMA1. Falls back to lzma-purejs which\n * handles 7z's LZMA1 format correctly. LZMA2 native works fine.\n *\n * @param _lc - Literal context bits (0-8)\n * @param _lp - Literal position bits (0-4)\n * @param _pb - Position bits (0-4)\n * @param _dictSize - Dictionary size\n * @returns null - always falls back to pure JS decoder\n */\nexport function createNativeLzma1Decoder(_lc: number, _lp: number, _pb: number, _dictSize: number): Transform | null {\n // Native LZMA1 disabled - lzma-native's rawDecoder has issues with 7z's LZMA1 format\n // (LZMA_BUF_ERROR: No progress is possible)\n // LZMA2 native works correctly and is more common in modern 7z files\n return null;\n}\n"],"names":["createNativeLzma1Decoder","createNativeLzma2Decoder","hasNativeLzma","_require","require","Module","createRequire","lzmaNative","_hasNativeLzmaLib","major","process","versions","node","split","createStream","_e","dictSize","filterOpts","id","FILTER_LZMA2","undefined","dict_size","filters","_lc","_lp","_pb","_dictSize"],"mappings":"AAAA;;;;;;;;;CASC;;;;;;;;;;;QAkEeA;eAAAA;;QAhCAC;eAAAA;;QATLC;eAAAA;;;6DAvBQ;;;;;;AAGnB,IAAIC,WAAW,OAAOC,YAAY,cAAcC,eAAM,CAACC,aAAa,CAAC,uDAAmBF;AAExF,iFAAiF;AACjF,gFAAgF;AAChF,+CAA+C;AAC/C,IAAIG,aAAkD;AACtD,IAAIC,oBAAoB;AACxB,IAAIC,QAAQ,CAACC,QAAQC,QAAQ,CAACC,IAAI,CAACC,KAAK,CAAC,IAAI,CAAC,EAAE;AAEhD,IAAIJ,SAAS,IAAI;IACf,IAAI;QACFF,aAAaJ,SAAS;QACtB,4BAA4B;QAC5BK,oBAAoBD,eAAe,QAAQ,OAAOA,WAAWO,YAAY,KAAK;IAChF,EAAE,OAAOC,IAAI;IACX,mDAAmD;IACrD;AACF;AAGO,IAAIb,gBAAgBM;AASpB,SAASP,yBAAyBe,QAAiB;IACxD,IAAI,CAACT,YAAY;QACf,OAAO;IACT;IAEA,IAAIU,aAAiD;QACnDC,IAAIX,WAAWY,YAAY;IAC7B;IAEA,IAAIH,aAAaI,WAAW;QAC1BH,WAAWI,SAAS,GAAGL;IACzB;IAEA,OAAOT,WAAWO,YAAY,CAAC,cAAc;QAC3CQ,SAAS;YAACL;SAAW;IACvB;AACF;AAgBO,SAASjB,yBAAyBuB,GAAW,EAAEC,GAAW,EAAEC,GAAW,EAAEC,SAAiB;IAC/F,qFAAqF;IACrF,4CAA4C;IAC5C,qEAAqE;IACrE,OAAO;AACT"}
|
|
@@ -35,7 +35,14 @@ export declare var CodecId: {
|
|
|
35
35
|
LZMA: number[];
|
|
36
36
|
LZMA2: number[];
|
|
37
37
|
BCJ_X86: number[];
|
|
38
|
+
BCJ_PPC: number[];
|
|
39
|
+
BCJ_IA64: number[];
|
|
40
|
+
BCJ_ARM: number[];
|
|
41
|
+
BCJ_ARMT: number[];
|
|
42
|
+
BCJ_SPARC: number[];
|
|
43
|
+
BCJ_ARM64: number[];
|
|
38
44
|
BCJ2: number[];
|
|
45
|
+
PPMD: number[];
|
|
39
46
|
DEFLATE: number[];
|
|
40
47
|
BZIP2: number[];
|
|
41
48
|
AES: number[];
|
|
@@ -35,7 +35,14 @@ export declare var CodecId: {
|
|
|
35
35
|
LZMA: number[];
|
|
36
36
|
LZMA2: number[];
|
|
37
37
|
BCJ_X86: number[];
|
|
38
|
+
BCJ_PPC: number[];
|
|
39
|
+
BCJ_IA64: number[];
|
|
40
|
+
BCJ_ARM: number[];
|
|
41
|
+
BCJ_ARMT: number[];
|
|
42
|
+
BCJ_SPARC: number[];
|
|
43
|
+
BCJ_ARM64: number[];
|
|
38
44
|
BCJ2: number[];
|
|
45
|
+
PPMD: number[];
|
|
39
46
|
DEFLATE: number[];
|
|
40
47
|
BZIP2: number[];
|
|
41
48
|
AES: number[];
|
|
@@ -99,12 +99,53 @@ var CodecId = {
|
|
|
99
99
|
0x01,
|
|
100
100
|
0x03
|
|
101
101
|
],
|
|
102
|
+
BCJ_PPC: [
|
|
103
|
+
0x03,
|
|
104
|
+
0x03,
|
|
105
|
+
0x02,
|
|
106
|
+
0x05
|
|
107
|
+
],
|
|
108
|
+
BCJ_IA64: [
|
|
109
|
+
0x03,
|
|
110
|
+
0x03,
|
|
111
|
+
0x04,
|
|
112
|
+
0x01
|
|
113
|
+
],
|
|
114
|
+
BCJ_ARM: [
|
|
115
|
+
0x03,
|
|
116
|
+
0x03,
|
|
117
|
+
0x05,
|
|
118
|
+
0x01
|
|
119
|
+
],
|
|
120
|
+
BCJ_ARMT: [
|
|
121
|
+
0x03,
|
|
122
|
+
0x03,
|
|
123
|
+
0x07,
|
|
124
|
+
0x01
|
|
125
|
+
],
|
|
126
|
+
BCJ_SPARC: [
|
|
127
|
+
0x03,
|
|
128
|
+
0x03,
|
|
129
|
+
0x08,
|
|
130
|
+
0x05
|
|
131
|
+
],
|
|
132
|
+
BCJ_ARM64: [
|
|
133
|
+
0x03,
|
|
134
|
+
0x03,
|
|
135
|
+
0x0a,
|
|
136
|
+
0x01
|
|
137
|
+
],
|
|
102
138
|
BCJ2: [
|
|
103
139
|
0x03,
|
|
104
140
|
0x03,
|
|
105
141
|
0x01,
|
|
106
142
|
0x1b
|
|
107
143
|
],
|
|
144
|
+
PPMD: [
|
|
145
|
+
0x03,
|
|
146
|
+
0x04,
|
|
147
|
+
0x01
|
|
148
|
+
],
|
|
108
149
|
DEFLATE: [
|
|
109
150
|
0x04,
|
|
110
151
|
0x01,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/constants.ts"],"sourcesContent":["// 7z format constants\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n\n// 7z signature: '7z' + magic bytes\nexport var SEVENZ_MAGIC = [0x37, 0x7a, 0xbc, 0xaf, 0x27, 0x1c];\n\n// Header sizes\nexport var SIGNATURE_HEADER_SIZE = 32;\nexport var START_HEADER_SIZE = 20; // Part of signature header after magic + version\n\n// Property IDs for encoded header\nexport var PropertyId = {\n kEnd: 0x00,\n kHeader: 0x01,\n kArchiveProperties: 0x02,\n kAdditionalStreamsInfo: 0x03,\n kMainStreamsInfo: 0x04,\n kFilesInfo: 0x05,\n kPackInfo: 0x06,\n kUnpackInfo: 0x07,\n kSubStreamsInfo: 0x08,\n kSize: 0x09,\n kCRC: 0x0a,\n kFolder: 0x0b,\n kCodersUnpackSize: 0x0c,\n kNumUnpackStream: 0x0d,\n kEmptyStream: 0x0e,\n kEmptyFile: 0x0f,\n kAnti: 0x10,\n kName: 0x11,\n kCTime: 0x12,\n kATime: 0x13,\n kMTime: 0x14,\n kWinAttributes: 0x15,\n kComment: 0x16,\n kEncodedHeader: 0x17,\n kStartPos: 0x18,\n kDummy: 0x19,\n};\n\n// Codec IDs\n// 7z uses variable-length codec IDs\nexport var CodecId = {\n COPY: [0x00],\n DELTA: [0x03],\n LZMA: [0x03, 0x01, 0x01],\n LZMA2: [0x21],\n BCJ_X86: [0x03, 0x03, 0x01, 0x03],\n BCJ2: [0x03, 0x03, 0x01, 0x1b],\n DEFLATE: [0x04, 0x01, 0x08],\n BZIP2: [0x04, 0x02, 0x02],\n AES: [0x06, 0xf1, 0x07, 0x01],\n};\n\n// File attribute flags (Windows style, stored in FilesInfo)\nexport var FileAttribute = {\n READONLY: 0x01,\n HIDDEN: 0x02,\n SYSTEM: 0x04,\n DIRECTORY: 0x10,\n ARCHIVE: 0x20,\n DEVICE: 0x40,\n NORMAL: 0x80,\n TEMPORARY: 0x100,\n SPARSE_FILE: 0x200,\n REPARSE_POINT: 0x400,\n COMPRESSED: 0x800,\n OFFLINE: 0x1000,\n NOT_CONTENT_INDEXED: 0x2000,\n ENCRYPTED: 0x4000,\n UNIX_EXTENSION: 0x8000,\n};\n\n// Unix permission modes (decimal values for Node 0.8 compatibility)\nexport var UnixMode = {\n DIR: 16384, // 0o40000 - directory\n FILE: 32768, // 0o100000 - regular file\n SYMLINK: 40960, // 0o120000 - symbolic link\n RWXRWXRWX: 511, // 0o777\n RWXRXRX: 493, // 0o755\n RWRR: 420, // 0o644\n DEFAULT_DIR: 493, // 0o755 - rwxr-xr-x\n DEFAULT_FILE: 420, // 0o644 - rw-r--r--\n};\n\n// Error codes\nexport var ErrorCode = {\n INVALID_SIGNATURE: 'INVALID_SIGNATURE',\n CRC_MISMATCH: 'CRC_MISMATCH',\n UNSUPPORTED_CODEC: 'UNSUPPORTED_CODEC',\n UNSUPPORTED_VERSION: 'UNSUPPORTED_VERSION',\n UNSUPPORTED_FEATURE: 'UNSUPPORTED_FEATURE',\n TRUNCATED_ARCHIVE: 'TRUNCATED_ARCHIVE',\n CORRUPT_HEADER: 'CORRUPT_HEADER',\n ENCRYPTED_ARCHIVE: 'ENCRYPTED_ARCHIVE',\n COMPRESSED_HEADER: 'COMPRESSED_HEADER',\n DECOMPRESSION_FAILED: 'DECOMPRESSION_FAILED',\n};\n\n// Error with code property\nexport interface CodedError extends Error {\n code: string;\n}\n\n/**\n * Create an error with a code property\n */\nexport function createCodedError(message: string, code: string): CodedError {\n var err = new Error(message) as CodedError;\n err.code = code;\n return err;\n}\n"],"names":["CodecId","ErrorCode","FileAttribute","PropertyId","SEVENZ_MAGIC","SIGNATURE_HEADER_SIZE","START_HEADER_SIZE","UnixMode","createCodedError","kEnd","kHeader","kArchiveProperties","kAdditionalStreamsInfo","kMainStreamsInfo","kFilesInfo","kPackInfo","kUnpackInfo","kSubStreamsInfo","kSize","kCRC","kFolder","kCodersUnpackSize","kNumUnpackStream","kEmptyStream","kEmptyFile","kAnti","kName","kCTime","kATime","kMTime","kWinAttributes","kComment","kEncodedHeader","kStartPos","kDummy","COPY","DELTA","LZMA","LZMA2","BCJ_X86","BCJ2","DEFLATE","BZIP2","AES","READONLY","HIDDEN","SYSTEM","DIRECTORY","ARCHIVE","DEVICE","NORMAL","TEMPORARY","SPARSE_FILE","REPARSE_POINT","COMPRESSED","OFFLINE","NOT_CONTENT_INDEXED","ENCRYPTED","UNIX_EXTENSION","DIR","FILE","SYMLINK","RWXRWXRWX","RWXRXRX","RWRR","DEFAULT_DIR","DEFAULT_FILE","INVALID_SIGNATURE","CRC_MISMATCH","UNSUPPORTED_CODEC","UNSUPPORTED_VERSION","UNSUPPORTED_FEATURE","TRUNCATED_ARCHIVE","CORRUPT_HEADER","ENCRYPTED_ARCHIVE","COMPRESSED_HEADER","DECOMPRESSION_FAILED","message","code","err","Error"],"mappings":"AAAA,sBAAsB;AACtB,wEAAwE;AAExE,mCAAmC;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/constants.ts"],"sourcesContent":["// 7z format constants\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n\n// 7z signature: '7z' + magic bytes\nexport var SEVENZ_MAGIC = [0x37, 0x7a, 0xbc, 0xaf, 0x27, 0x1c];\n\n// Header sizes\nexport var SIGNATURE_HEADER_SIZE = 32;\nexport var START_HEADER_SIZE = 20; // Part of signature header after magic + version\n\n// Property IDs for encoded header\nexport var PropertyId = {\n kEnd: 0x00,\n kHeader: 0x01,\n kArchiveProperties: 0x02,\n kAdditionalStreamsInfo: 0x03,\n kMainStreamsInfo: 0x04,\n kFilesInfo: 0x05,\n kPackInfo: 0x06,\n kUnpackInfo: 0x07,\n kSubStreamsInfo: 0x08,\n kSize: 0x09,\n kCRC: 0x0a,\n kFolder: 0x0b,\n kCodersUnpackSize: 0x0c,\n kNumUnpackStream: 0x0d,\n kEmptyStream: 0x0e,\n kEmptyFile: 0x0f,\n kAnti: 0x10,\n kName: 0x11,\n kCTime: 0x12,\n kATime: 0x13,\n kMTime: 0x14,\n kWinAttributes: 0x15,\n kComment: 0x16,\n kEncodedHeader: 0x17,\n kStartPos: 0x18,\n kDummy: 0x19,\n};\n\n// Codec IDs\n// 7z uses variable-length codec IDs\n// Reference: 7za i output shows hex codec IDs (e.g., 3030501 = ARM)\nexport var CodecId = {\n COPY: [0x00],\n DELTA: [0x03],\n LZMA: [0x03, 0x01, 0x01],\n LZMA2: [0x21],\n BCJ_X86: [0x03, 0x03, 0x01, 0x03],\n BCJ_PPC: [0x03, 0x03, 0x02, 0x05],\n BCJ_IA64: [0x03, 0x03, 0x04, 0x01],\n BCJ_ARM: [0x03, 0x03, 0x05, 0x01],\n BCJ_ARMT: [0x03, 0x03, 0x07, 0x01],\n BCJ_SPARC: [0x03, 0x03, 0x08, 0x05],\n BCJ_ARM64: [0x03, 0x03, 0x0a, 0x01],\n BCJ2: [0x03, 0x03, 0x01, 0x1b],\n PPMD: [0x03, 0x04, 0x01],\n DEFLATE: [0x04, 0x01, 0x08],\n BZIP2: [0x04, 0x02, 0x02],\n AES: [0x06, 0xf1, 0x07, 0x01],\n};\n\n// File attribute flags (Windows style, stored in FilesInfo)\nexport var FileAttribute = {\n READONLY: 0x01,\n HIDDEN: 0x02,\n SYSTEM: 0x04,\n DIRECTORY: 0x10,\n ARCHIVE: 0x20,\n DEVICE: 0x40,\n NORMAL: 0x80,\n TEMPORARY: 0x100,\n SPARSE_FILE: 0x200,\n REPARSE_POINT: 0x400,\n COMPRESSED: 0x800,\n OFFLINE: 0x1000,\n NOT_CONTENT_INDEXED: 0x2000,\n ENCRYPTED: 0x4000,\n UNIX_EXTENSION: 0x8000,\n};\n\n// Unix permission modes (decimal values for Node 0.8 compatibility)\nexport var UnixMode = {\n DIR: 16384, // 0o40000 - directory\n FILE: 32768, // 0o100000 - regular file\n SYMLINK: 40960, // 0o120000 - symbolic link\n RWXRWXRWX: 511, // 0o777\n RWXRXRX: 493, // 0o755\n RWRR: 420, // 0o644\n DEFAULT_DIR: 493, // 0o755 - rwxr-xr-x\n DEFAULT_FILE: 420, // 0o644 - rw-r--r--\n};\n\n// Error codes\nexport var ErrorCode = {\n INVALID_SIGNATURE: 'INVALID_SIGNATURE',\n CRC_MISMATCH: 'CRC_MISMATCH',\n UNSUPPORTED_CODEC: 'UNSUPPORTED_CODEC',\n UNSUPPORTED_VERSION: 'UNSUPPORTED_VERSION',\n UNSUPPORTED_FEATURE: 'UNSUPPORTED_FEATURE',\n TRUNCATED_ARCHIVE: 'TRUNCATED_ARCHIVE',\n CORRUPT_HEADER: 'CORRUPT_HEADER',\n ENCRYPTED_ARCHIVE: 'ENCRYPTED_ARCHIVE',\n COMPRESSED_HEADER: 'COMPRESSED_HEADER',\n DECOMPRESSION_FAILED: 'DECOMPRESSION_FAILED',\n};\n\n// Error with code property\nexport interface CodedError extends Error {\n code: string;\n}\n\n/**\n * Create an error with a code property\n */\nexport function createCodedError(message: string, code: string): CodedError {\n var err = new Error(message) as CodedError;\n err.code = code;\n return err;\n}\n"],"names":["CodecId","ErrorCode","FileAttribute","PropertyId","SEVENZ_MAGIC","SIGNATURE_HEADER_SIZE","START_HEADER_SIZE","UnixMode","createCodedError","kEnd","kHeader","kArchiveProperties","kAdditionalStreamsInfo","kMainStreamsInfo","kFilesInfo","kPackInfo","kUnpackInfo","kSubStreamsInfo","kSize","kCRC","kFolder","kCodersUnpackSize","kNumUnpackStream","kEmptyStream","kEmptyFile","kAnti","kName","kCTime","kATime","kMTime","kWinAttributes","kComment","kEncodedHeader","kStartPos","kDummy","COPY","DELTA","LZMA","LZMA2","BCJ_X86","BCJ_PPC","BCJ_IA64","BCJ_ARM","BCJ_ARMT","BCJ_SPARC","BCJ_ARM64","BCJ2","PPMD","DEFLATE","BZIP2","AES","READONLY","HIDDEN","SYSTEM","DIRECTORY","ARCHIVE","DEVICE","NORMAL","TEMPORARY","SPARSE_FILE","REPARSE_POINT","COMPRESSED","OFFLINE","NOT_CONTENT_INDEXED","ENCRYPTED","UNIX_EXTENSION","DIR","FILE","SYMLINK","RWXRWXRWX","RWXRXRX","RWRR","DEFAULT_DIR","DEFAULT_FILE","INVALID_SIGNATURE","CRC_MISMATCH","UNSUPPORTED_CODEC","UNSUPPORTED_VERSION","UNSUPPORTED_FEATURE","TRUNCATED_ARCHIVE","CORRUPT_HEADER","ENCRYPTED_ARCHIVE","COMPRESSED_HEADER","DECOMPRESSION_FAILED","message","code","err","Error"],"mappings":"AAAA,sBAAsB;AACtB,wEAAwE;AAExE,mCAAmC;;;;;;;;;;;;QAwCxBA;eAAAA;;QAmDAC;eAAAA;;QA/BAC;eAAAA;;QApDAC;eAAAA;;QAPAC;eAAAA;;QAGAC;eAAAA;;QACAC;eAAAA;;QA0EAC;eAAAA;;QAiCKC;eAAAA;;;AA/GT,IAAIJ,eAAe;IAAC;IAAM;IAAM;IAAM;IAAM;IAAM;CAAK;AAGvD,IAAIC,wBAAwB;AAC5B,IAAIC,oBAAoB,IAAI,iDAAiD;AAG7E,IAAIH,aAAa;IACtBM,MAAM;IACNC,SAAS;IACTC,oBAAoB;IACpBC,wBAAwB;IACxBC,kBAAkB;IAClBC,YAAY;IACZC,WAAW;IACXC,aAAa;IACbC,iBAAiB;IACjBC,OAAO;IACPC,MAAM;IACNC,SAAS;IACTC,mBAAmB;IACnBC,kBAAkB;IAClBC,cAAc;IACdC,YAAY;IACZC,OAAO;IACPC,OAAO;IACPC,QAAQ;IACRC,QAAQ;IACRC,QAAQ;IACRC,gBAAgB;IAChBC,UAAU;IACVC,gBAAgB;IAChBC,WAAW;IACXC,QAAQ;AACV;AAKO,IAAIlC,UAAU;IACnBmC,MAAM;QAAC;KAAK;IACZC,OAAO;QAAC;KAAK;IACbC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,OAAO;QAAC;KAAK;IACbC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,UAAU;QAAC;QAAM;QAAM;QAAM;KAAK;IAClCC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,UAAU;QAAC;QAAM;QAAM;QAAM;KAAK;IAClCC,WAAW;QAAC;QAAM;QAAM;QAAM;KAAK;IACnCC,WAAW;QAAC;QAAM;QAAM;QAAM;KAAK;IACnCC,MAAM;QAAC;QAAM;QAAM;QAAM;KAAK;IAC9BC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,SAAS;QAAC;QAAM;QAAM;KAAK;IAC3BC,OAAO;QAAC;QAAM;QAAM;KAAK;IACzBC,KAAK;QAAC;QAAM;QAAM;QAAM;KAAK;AAC/B;AAGO,IAAIhD,gBAAgB;IACzBiD,UAAU;IACVC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,SAAS;IACTC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,aAAa;IACbC,eAAe;IACfC,YAAY;IACZC,SAAS;IACTC,qBAAqB;IACrBC,WAAW;IACXC,gBAAgB;AAClB;AAGO,IAAI1D,WAAW;IACpB2D,KAAK;IACLC,MAAM;IACNC,SAAS;IACTC,WAAW;IACXC,SAAS;IACTC,MAAM;IACNC,aAAa;IACbC,cAAc;AAChB;AAGO,IAAIxE,YAAY;IACrByE,mBAAmB;IACnBC,cAAc;IACdC,mBAAmB;IACnBC,qBAAqB;IACrBC,qBAAqB;IACrBC,mBAAmB;IACnBC,gBAAgB;IAChBC,mBAAmB;IACnBC,mBAAmB;IACnBC,sBAAsB;AACxB;AAUO,SAAS3E,iBAAiB4E,OAAe,EAAEC,IAAY;IAC5D,IAAIC,MAAM,IAAIC,MAAMH;IACpBE,IAAID,IAAI,GAAGA;IACX,OAAOC;AACT"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Transform } from 'readable-stream';
|
|
2
|
+
/**
|
|
3
|
+
* Decode ARM BCJ filtered data
|
|
4
|
+
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
+
*
|
|
6
|
+
* ARM BL instruction format:
|
|
7
|
+
* - 4 bytes aligned
|
|
8
|
+
* - Byte pattern: XX XX XX EB (where EB = 0xEB opcode for BL)
|
|
9
|
+
* - Lower 24 bits are signed offset (in words, not bytes)
|
|
10
|
+
*
|
|
11
|
+
* @param input - ARM BCJ filtered data
|
|
12
|
+
* @param _properties - Unused for ARM BCJ
|
|
13
|
+
* @param _unpackSize - Unused for ARM BCJ
|
|
14
|
+
* @returns Unfiltered data
|
|
15
|
+
*/
|
|
16
|
+
export declare function decodeBcjArm(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
17
|
+
/**
|
|
18
|
+
* Create an ARM BCJ decoder Transform stream
|
|
19
|
+
*/
|
|
20
|
+
export declare function createBcjArmDecoder(properties?: Buffer, unpackSize?: number): Transform;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// BCJ (ARM 32-bit) filter codec - converts ARM branch instruction addresses
|
|
2
|
+
// This filter makes ARM executables more compressible by LZMA
|
|
3
|
+
//
|
|
4
|
+
// ARM branch instructions (BL) use relative addressing. The filter converts
|
|
5
|
+
// these to absolute addresses during compression, and back during decompression.
|
|
6
|
+
//
|
|
7
|
+
// Reference: https://github.com/kornelski/7z/blob/main/C/Bra.c
|
|
8
|
+
import { bufferFrom } from 'extract-base-iterator';
|
|
9
|
+
import createBufferingDecoder from './createBufferingDecoder.js';
|
|
10
|
+
/**
|
|
11
|
+
* Decode ARM BCJ filtered data
|
|
12
|
+
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
13
|
+
*
|
|
14
|
+
* ARM BL instruction format:
|
|
15
|
+
* - 4 bytes aligned
|
|
16
|
+
* - Byte pattern: XX XX XX EB (where EB = 0xEB opcode for BL)
|
|
17
|
+
* - Lower 24 bits are signed offset (in words, not bytes)
|
|
18
|
+
*
|
|
19
|
+
* @param input - ARM BCJ filtered data
|
|
20
|
+
* @param _properties - Unused for ARM BCJ
|
|
21
|
+
* @param _unpackSize - Unused for ARM BCJ
|
|
22
|
+
* @returns Unfiltered data
|
|
23
|
+
*/ export function decodeBcjArm(input, _properties, _unpackSize) {
|
|
24
|
+
var output = bufferFrom(input); // Copy since we modify in place
|
|
25
|
+
var pos = 0;
|
|
26
|
+
// Process 4-byte aligned positions
|
|
27
|
+
while(pos + 4 <= output.length){
|
|
28
|
+
// Check for BL instruction: byte 3 is 0xEB
|
|
29
|
+
if (output[pos + 3] === 0xeb) {
|
|
30
|
+
// Read 24-bit address (little-endian in bytes 0-2)
|
|
31
|
+
var addr = output[pos] | output[pos + 1] << 8 | output[pos + 2] << 16;
|
|
32
|
+
// Sign-extend 24-bit to 32-bit
|
|
33
|
+
if (addr & 0x800000) {
|
|
34
|
+
addr |= 0xff000000;
|
|
35
|
+
}
|
|
36
|
+
// Convert absolute to relative:
|
|
37
|
+
// Subtract current position (in words, so divide by 4)
|
|
38
|
+
// ARM PC is 2 words (8 bytes) ahead during execution
|
|
39
|
+
var relAddr = addr - (pos >>> 2);
|
|
40
|
+
// Write back lower 24 bits
|
|
41
|
+
output[pos] = relAddr & 0xff;
|
|
42
|
+
output[pos + 1] = relAddr >>> 8 & 0xff;
|
|
43
|
+
output[pos + 2] = relAddr >>> 16 & 0xff;
|
|
44
|
+
}
|
|
45
|
+
pos += 4;
|
|
46
|
+
}
|
|
47
|
+
return output;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create an ARM BCJ decoder Transform stream
|
|
51
|
+
*/ export function createBcjArmDecoder(properties, unpackSize) {
|
|
52
|
+
return createBufferingDecoder(decodeBcjArm, properties, unpackSize);
|
|
53
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/BcjArm.ts"],"sourcesContent":["// BCJ (ARM 32-bit) filter codec - converts ARM branch instruction addresses\n// This filter makes ARM executables more compressible by LZMA\n//\n// ARM branch instructions (BL) use relative addressing. The filter converts\n// these to absolute addresses during compression, and back during decompression.\n//\n// Reference: https://github.com/kornelski/7z/blob/main/C/Bra.c\n\nimport { bufferFrom } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n/**\n * Decode ARM BCJ filtered data\n * Reverses the BCJ transformation by converting absolute addresses back to relative\n *\n * ARM BL instruction format:\n * - 4 bytes aligned\n * - Byte pattern: XX XX XX EB (where EB = 0xEB opcode for BL)\n * - Lower 24 bits are signed offset (in words, not bytes)\n *\n * @param input - ARM BCJ filtered data\n * @param _properties - Unused for ARM BCJ\n * @param _unpackSize - Unused for ARM BCJ\n * @returns Unfiltered data\n */\nexport function decodeBcjArm(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n var output = bufferFrom(input); // Copy since we modify in place\n var pos = 0;\n\n // Process 4-byte aligned positions\n while (pos + 4 <= output.length) {\n // Check for BL instruction: byte 3 is 0xEB\n if (output[pos + 3] === 0xeb) {\n // Read 24-bit address (little-endian in bytes 0-2)\n var addr = output[pos] | (output[pos + 1] << 8) | (output[pos + 2] << 16);\n\n // Sign-extend 24-bit to 32-bit\n if (addr & 0x800000) {\n addr |= 0xff000000;\n }\n\n // Convert absolute to relative:\n // Subtract current position (in words, so divide by 4)\n // ARM PC is 2 words (8 bytes) ahead during execution\n var relAddr = addr - (pos >>> 2);\n\n // Write back lower 24 bits\n output[pos] = relAddr & 0xff;\n output[pos + 1] = (relAddr >>> 8) & 0xff;\n output[pos + 2] = (relAddr >>> 16) & 0xff;\n }\n pos += 4;\n }\n\n return output;\n}\n\n/**\n * Create an ARM BCJ decoder Transform stream\n */\nexport function createBcjArmDecoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcjArm, properties, unpackSize);\n}\n"],"names":["bufferFrom","createBufferingDecoder","decodeBcjArm","input","_properties","_unpackSize","output","pos","length","addr","relAddr","createBcjArmDecoder","properties","unpackSize"],"mappings":"AAAA,4EAA4E;AAC5E,8DAA8D;AAC9D,EAAE;AACF,4EAA4E;AAC5E,iFAAiF;AACjF,EAAE;AACF,+DAA+D;AAE/D,SAASA,UAAU,QAAQ,wBAAwB;AAEnD,OAAOC,4BAA4B,8BAA8B;AAEjE;;;;;;;;;;;;;CAaC,GACD,OAAO,SAASC,aAAaC,KAAa,EAAEC,WAAoB,EAAEC,WAAoB;IACpF,IAAIC,SAASN,WAAWG,QAAQ,gCAAgC;IAChE,IAAII,MAAM;IAEV,mCAAmC;IACnC,MAAOA,MAAM,KAAKD,OAAOE,MAAM,CAAE;QAC/B,2CAA2C;QAC3C,IAAIF,MAAM,CAACC,MAAM,EAAE,KAAK,MAAM;YAC5B,mDAAmD;YACnD,IAAIE,OAAOH,MAAM,CAACC,IAAI,GAAID,MAAM,CAACC,MAAM,EAAE,IAAI,IAAMD,MAAM,CAACC,MAAM,EAAE,IAAI;YAEtE,+BAA+B;YAC/B,IAAIE,OAAO,UAAU;gBACnBA,QAAQ;YACV;YAEA,gCAAgC;YAChC,uDAAuD;YACvD,qDAAqD;YACrD,IAAIC,UAAUD,OAAQF,CAAAA,QAAQ,CAAA;YAE9B,2BAA2B;YAC3BD,MAAM,CAACC,IAAI,GAAGG,UAAU;YACxBJ,MAAM,CAACC,MAAM,EAAE,GAAG,AAACG,YAAY,IAAK;YACpCJ,MAAM,CAACC,MAAM,EAAE,GAAG,AAACG,YAAY,KAAM;QACvC;QACAH,OAAO;IACT;IAEA,OAAOD;AACT;AAEA;;CAEC,GACD,OAAO,SAASK,oBAAoBC,UAAmB,EAAEC,UAAmB;IAC1E,OAAOZ,uBAAuBC,cAAcU,YAAYC;AAC1D"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Transform } from 'readable-stream';
|
|
2
|
+
/**
|
|
3
|
+
* Decode ARM64 BCJ filtered data
|
|
4
|
+
* Reverses the BCJ transformation by converting absolute addresses back to relative
|
|
5
|
+
*
|
|
6
|
+
* ARM64 B/BL instruction format (little-endian):
|
|
7
|
+
* - 4 bytes aligned
|
|
8
|
+
* - B: opcode 0x14 (000101xx)
|
|
9
|
+
* - BL: opcode 0x94 (100101xx)
|
|
10
|
+
* - Bits 0-25 are 26-bit signed offset (in words)
|
|
11
|
+
*
|
|
12
|
+
* @param input - ARM64 BCJ filtered data
|
|
13
|
+
* @param _properties - Unused for ARM64 BCJ
|
|
14
|
+
* @param _unpackSize - Unused for ARM64 BCJ
|
|
15
|
+
* @returns Unfiltered data
|
|
16
|
+
*/
|
|
17
|
+
export declare function decodeBcjArm64(input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer;
|
|
18
|
+
/**
|
|
19
|
+
* Create an ARM64 BCJ decoder Transform stream
|
|
20
|
+
*/
|
|
21
|
+
export declare function createBcjArm64Decoder(properties?: Buffer, unpackSize?: number): Transform;
|