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.
Files changed (58) hide show
  1. package/dist/cjs/sevenz/codecs/BcjArm.d.cts +20 -0
  2. package/dist/cjs/sevenz/codecs/BcjArm.d.ts +20 -0
  3. package/dist/cjs/sevenz/codecs/BcjArm.js +62 -0
  4. package/dist/cjs/sevenz/codecs/BcjArm.js.map +1 -0
  5. package/dist/cjs/sevenz/codecs/BcjArm64.d.cts +21 -0
  6. package/dist/cjs/sevenz/codecs/BcjArm64.d.ts +21 -0
  7. package/dist/cjs/sevenz/codecs/BcjArm64.js +65 -0
  8. package/dist/cjs/sevenz/codecs/BcjArm64.js.map +1 -0
  9. package/dist/cjs/sevenz/codecs/BcjArmt.d.cts +19 -0
  10. package/dist/cjs/sevenz/codecs/BcjArmt.d.ts +19 -0
  11. package/dist/cjs/sevenz/codecs/BcjArmt.js +76 -0
  12. package/dist/cjs/sevenz/codecs/BcjArmt.js.map +1 -0
  13. package/dist/cjs/sevenz/codecs/BcjIa64.d.cts +15 -0
  14. package/dist/cjs/sevenz/codecs/BcjIa64.d.ts +15 -0
  15. package/dist/cjs/sevenz/codecs/BcjIa64.js +141 -0
  16. package/dist/cjs/sevenz/codecs/BcjIa64.js.map +1 -0
  17. package/dist/cjs/sevenz/codecs/BcjPpc.d.cts +20 -0
  18. package/dist/cjs/sevenz/codecs/BcjPpc.d.ts +20 -0
  19. package/dist/cjs/sevenz/codecs/BcjPpc.js +64 -0
  20. package/dist/cjs/sevenz/codecs/BcjPpc.js.map +1 -0
  21. package/dist/cjs/sevenz/codecs/BcjSparc.d.cts +19 -0
  22. package/dist/cjs/sevenz/codecs/BcjSparc.d.ts +19 -0
  23. package/dist/cjs/sevenz/codecs/BcjSparc.js +69 -0
  24. package/dist/cjs/sevenz/codecs/BcjSparc.js.map +1 -0
  25. package/dist/cjs/sevenz/codecs/index.js +44 -1
  26. package/dist/cjs/sevenz/codecs/index.js.map +1 -1
  27. package/dist/cjs/sevenz/codecs/lzmaCompat.js +12 -7
  28. package/dist/cjs/sevenz/codecs/lzmaCompat.js.map +1 -1
  29. package/dist/cjs/sevenz/constants.d.cts +7 -0
  30. package/dist/cjs/sevenz/constants.d.ts +7 -0
  31. package/dist/cjs/sevenz/constants.js +41 -0
  32. package/dist/cjs/sevenz/constants.js.map +1 -1
  33. package/dist/esm/sevenz/codecs/BcjArm.d.ts +20 -0
  34. package/dist/esm/sevenz/codecs/BcjArm.js +53 -0
  35. package/dist/esm/sevenz/codecs/BcjArm.js.map +1 -0
  36. package/dist/esm/sevenz/codecs/BcjArm64.d.ts +21 -0
  37. package/dist/esm/sevenz/codecs/BcjArm64.js +57 -0
  38. package/dist/esm/sevenz/codecs/BcjArm64.js.map +1 -0
  39. package/dist/esm/sevenz/codecs/BcjArmt.d.ts +19 -0
  40. package/dist/esm/sevenz/codecs/BcjArmt.js +66 -0
  41. package/dist/esm/sevenz/codecs/BcjArmt.js.map +1 -0
  42. package/dist/esm/sevenz/codecs/BcjIa64.d.ts +15 -0
  43. package/dist/esm/sevenz/codecs/BcjIa64.js +127 -0
  44. package/dist/esm/sevenz/codecs/BcjIa64.js.map +1 -0
  45. package/dist/esm/sevenz/codecs/BcjPpc.d.ts +20 -0
  46. package/dist/esm/sevenz/codecs/BcjPpc.js +55 -0
  47. package/dist/esm/sevenz/codecs/BcjPpc.js.map +1 -0
  48. package/dist/esm/sevenz/codecs/BcjSparc.d.ts +19 -0
  49. package/dist/esm/sevenz/codecs/BcjSparc.js +59 -0
  50. package/dist/esm/sevenz/codecs/BcjSparc.js.map +1 -0
  51. package/dist/esm/sevenz/codecs/index.js +44 -1
  52. package/dist/esm/sevenz/codecs/index.js.map +1 -1
  53. package/dist/esm/sevenz/codecs/lzmaCompat.js +12 -7
  54. package/dist/esm/sevenz/codecs/lzmaCompat.js.map +1 -1
  55. package/dist/esm/sevenz/constants.d.ts +7 -0
  56. package/dist/esm/sevenz/constants.js +42 -0
  57. package/dist/esm/sevenz/constants.js.map +1 -1
  58. 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
- try {
42
- lzmaNative = _require('lzma-native');
43
- // Verify rawDecoder support
44
- _hasNativeLzmaLib = lzmaNative !== null && typeof lzmaNative.createStream === 'function';
45
- } catch (_e) {
46
- // lzma-native not available - will use lzma-purejs
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\ntry {\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// 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","createStream","_e","dictSize","filterOpts","id","FILTER_LZMA2","undefined","dict_size","filters","_lc","_lp","_pb","_dictSize"],"mappings":"AAAA;;;;;;;;;CASC;;;;;;;;;;;QA6DeA;eAAAA;;QAhCAC;eAAAA;;QATLC;eAAAA;;;6DAlBQ;;;;;;AAGnB,IAAIC,WAAW,OAAOC,YAAY,cAAcC,eAAM,CAACC,aAAa,CAAC,uDAAmBF;AAExF,0BAA0B;AAC1B,IAAIG,aAAkD;AACtD,IAAIC,oBAAoB;AAExB,IAAI;IACFD,aAAaJ,SAAS;IACtB,4BAA4B;IAC5BK,oBAAoBD,eAAe,QAAQ,OAAOA,WAAWE,YAAY,KAAK;AAChF,EAAE,OAAOC,IAAI;AACX,mDAAmD;AACrD;AAGO,IAAIR,gBAAgBM;AASpB,SAASP,yBAAyBU,QAAiB;IACxD,IAAI,CAACJ,YAAY;QACf,OAAO;IACT;IAEA,IAAIK,aAAiD;QACnDC,IAAIN,WAAWO,YAAY;IAC7B;IAEA,IAAIH,aAAaI,WAAW;QAC1BH,WAAWI,SAAS,GAAGL;IACzB;IAEA,OAAOJ,WAAWE,YAAY,CAAC,cAAc;QAC3CQ,SAAS;YAACL;SAAW;IACvB;AACF;AAgBO,SAASZ,yBAAyBkB,GAAW,EAAEC,GAAW,EAAEC,GAAW,EAAEC,SAAiB;IAC/F,qFAAqF;IACrF,4CAA4C;IAC5C,qEAAqE;IACrE,OAAO;AACT"}
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;;;;;;;;;;;;QAuCxBA;eAAAA;;QA4CAC;eAAAA;;QA/BAC;eAAAA;;QA5CAC;eAAAA;;QAPAC;eAAAA;;QAGAC;eAAAA;;QACAC;eAAAA;;QAkEAC;eAAAA;;QAiCKC;eAAAA;;;AAvGT,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;AAIO,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,MAAM;QAAC;QAAM;QAAM;QAAM;KAAK;IAC9BC,SAAS;QAAC;QAAM;QAAM;KAAK;IAC3BC,OAAO;QAAC;QAAM;QAAM;KAAK;IACzBC,KAAK;QAAC;QAAM;QAAM;QAAM;KAAK;AAC/B;AAGO,IAAIzC,gBAAgB;IACzB0C,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,IAAInD,WAAW;IACpBoD,KAAK;IACLC,MAAM;IACNC,SAAS;IACTC,WAAW;IACXC,SAAS;IACTC,MAAM;IACNC,aAAa;IACbC,cAAc;AAChB;AAGO,IAAIjE,YAAY;IACrBkE,mBAAmB;IACnBC,cAAc;IACdC,mBAAmB;IACnBC,qBAAqB;IACrBC,qBAAqB;IACrBC,mBAAmB;IACnBC,gBAAgB;IAChBC,mBAAmB;IACnBC,mBAAmB;IACnBC,sBAAsB;AACxB;AAUO,SAASpE,iBAAiBqE,OAAe,EAAEC,IAAY;IAC5D,IAAIC,MAAM,IAAIC,MAAMH;IACpBE,IAAID,IAAI,GAAGA;IACX,OAAOC;AACT"}
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;