7z-iterator 0.1.2 → 0.1.4
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/SevenZipIterator.js +2 -0
- package/dist/cjs/SevenZipIterator.js.map +1 -1
- package/dist/cjs/lib/Lock.d.cts +1 -0
- package/dist/cjs/lib/Lock.d.ts +1 -0
- package/dist/cjs/lib/Lock.js +8 -0
- package/dist/cjs/lib/Lock.js.map +1 -1
- package/dist/cjs/nextEntry.js +2 -2
- package/dist/cjs/nextEntry.js.map +1 -1
- package/dist/cjs/sevenz/NumberCodec.d.cts +9 -0
- package/dist/cjs/sevenz/NumberCodec.d.ts +9 -0
- package/dist/cjs/sevenz/NumberCodec.js +39 -14
- package/dist/cjs/sevenz/NumberCodec.js.map +1 -1
- package/dist/cjs/sevenz/SevenZipParser.d.cts +13 -0
- package/dist/cjs/sevenz/SevenZipParser.d.ts +13 -0
- package/dist/cjs/sevenz/SevenZipParser.js +250 -11
- package/dist/cjs/sevenz/SevenZipParser.js.map +1 -1
- package/dist/cjs/sevenz/codecs/Bcj2.d.cts +16 -0
- package/dist/cjs/sevenz/codecs/Bcj2.d.ts +16 -0
- package/dist/cjs/sevenz/codecs/Bcj2.js +201 -0
- package/dist/cjs/sevenz/codecs/Bcj2.js.map +1 -0
- package/dist/cjs/sevenz/codecs/Lzma2.js +54 -10
- package/dist/cjs/sevenz/codecs/Lzma2.js.map +1 -1
- package/dist/cjs/sevenz/codecs/index.d.cts +6 -0
- package/dist/cjs/sevenz/codecs/index.d.ts +6 -0
- package/dist/cjs/sevenz/codecs/index.js +17 -0
- package/dist/cjs/sevenz/codecs/index.js.map +1 -1
- package/dist/cjs/sevenz/constants.d.cts +1 -0
- package/dist/cjs/sevenz/constants.d.ts +1 -0
- package/dist/cjs/sevenz/constants.js +6 -0
- package/dist/cjs/sevenz/constants.js.map +1 -1
- package/dist/cjs/types.d.cts +1 -0
- package/dist/cjs/types.d.ts +1 -0
- package/dist/cjs/types.js.map +1 -1
- package/dist/esm/SevenZipIterator.js +2 -0
- package/dist/esm/SevenZipIterator.js.map +1 -1
- package/dist/esm/lib/Lock.d.ts +1 -0
- package/dist/esm/lib/Lock.js +8 -0
- package/dist/esm/lib/Lock.js.map +1 -1
- package/dist/esm/nextEntry.js +2 -2
- package/dist/esm/nextEntry.js.map +1 -1
- package/dist/esm/sevenz/NumberCodec.d.ts +9 -0
- package/dist/esm/sevenz/NumberCodec.js +48 -14
- package/dist/esm/sevenz/NumberCodec.js.map +1 -1
- package/dist/esm/sevenz/SevenZipParser.d.ts +13 -0
- package/dist/esm/sevenz/SevenZipParser.js +251 -12
- package/dist/esm/sevenz/SevenZipParser.js.map +1 -1
- package/dist/esm/sevenz/codecs/Bcj2.d.ts +16 -0
- package/dist/esm/sevenz/codecs/Bcj2.js +183 -0
- package/dist/esm/sevenz/codecs/Bcj2.js.map +1 -0
- package/dist/esm/sevenz/codecs/Lzma2.js +54 -10
- package/dist/esm/sevenz/codecs/Lzma2.js.map +1 -1
- package/dist/esm/sevenz/codecs/index.d.ts +6 -0
- package/dist/esm/sevenz/codecs/index.js +15 -0
- package/dist/esm/sevenz/codecs/index.js.map +1 -1
- package/dist/esm/sevenz/constants.d.ts +1 -0
- package/dist/esm/sevenz/constants.js +6 -0
- package/dist/esm/sevenz/constants.js.map +1 -1
- package/dist/esm/types.d.ts +1 -0
- package/dist/esm/types.js.map +1 -1
- package/package.json +9 -3
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// BCJ2 (x86-64) filter codec - advanced branch/call/jump converter
|
|
2
|
+
// BCJ2 uses 4 input streams and arithmetic (range) coding for better compression
|
|
3
|
+
// Reference: LZMA SDK Bcj2.c
|
|
4
|
+
//
|
|
5
|
+
// Stream layout:
|
|
6
|
+
// Stream 0: Main data (contains literals and branch opcode markers)
|
|
7
|
+
// Stream 1: CALL addresses (for 0xE8 instructions)
|
|
8
|
+
// Stream 2: JUMP addresses (for 0xE9 instructions)
|
|
9
|
+
// Stream 3: Range coder data (probability decisions)
|
|
10
|
+
"use strict";
|
|
11
|
+
Object.defineProperty(exports, "__esModule", {
|
|
12
|
+
value: true
|
|
13
|
+
});
|
|
14
|
+
function _export(target, all) {
|
|
15
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
_export(exports, {
|
|
21
|
+
get createBcj2Decoder () {
|
|
22
|
+
return createBcj2Decoder;
|
|
23
|
+
},
|
|
24
|
+
get decodeBcj2 () {
|
|
25
|
+
return decodeBcj2;
|
|
26
|
+
},
|
|
27
|
+
get decodeBcj2Multi () {
|
|
28
|
+
return decodeBcj2Multi;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
var _extractbaseiterator = require("extract-base-iterator");
|
|
32
|
+
var _createBufferingDecoderts = /*#__PURE__*/ _interop_require_default(require("./createBufferingDecoder.js"));
|
|
33
|
+
function _interop_require_default(obj) {
|
|
34
|
+
return obj && obj.__esModule ? obj : {
|
|
35
|
+
default: obj
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// Range coder constants
|
|
39
|
+
var kTopValue = 1 << 24;
|
|
40
|
+
var kNumBitModelTotalBits = 11;
|
|
41
|
+
var kBitModelTotal = 1 << kNumBitModelTotalBits;
|
|
42
|
+
var kNumMoveBits = 5;
|
|
43
|
+
// Number of probability models (256 for each byte value that can precede a branch)
|
|
44
|
+
var kNumProbs = 256 + 2;
|
|
45
|
+
/**
|
|
46
|
+
* Initialize range decoder
|
|
47
|
+
*/ function initRangeDecoder(stream) {
|
|
48
|
+
var rd = {
|
|
49
|
+
range: 0xffffffff,
|
|
50
|
+
code: 0,
|
|
51
|
+
stream: stream,
|
|
52
|
+
pos: 0
|
|
53
|
+
};
|
|
54
|
+
// Initialize code from first 5 bytes
|
|
55
|
+
for(var i = 0; i < 5; i++){
|
|
56
|
+
rd.code = rd.code << 8 | (rd.pos < stream.length ? stream[rd.pos++] : 0);
|
|
57
|
+
}
|
|
58
|
+
return rd;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Decode a single bit using probability model
|
|
62
|
+
*/ function decodeBit(rd, prob, probIndex) {
|
|
63
|
+
var ttt = prob[probIndex];
|
|
64
|
+
var bound = (rd.range >>> kNumBitModelTotalBits) * ttt;
|
|
65
|
+
var symbol;
|
|
66
|
+
if (rd.code >>> 0 < bound >>> 0) {
|
|
67
|
+
rd.range = bound;
|
|
68
|
+
prob[probIndex] = ttt + (kBitModelTotal - ttt >>> kNumMoveBits) | 0;
|
|
69
|
+
symbol = 0;
|
|
70
|
+
} else {
|
|
71
|
+
rd.range = rd.range - bound >>> 0;
|
|
72
|
+
rd.code = rd.code - bound >>> 0;
|
|
73
|
+
prob[probIndex] = ttt - (ttt >>> kNumMoveBits) | 0;
|
|
74
|
+
symbol = 1;
|
|
75
|
+
}
|
|
76
|
+
// Normalize
|
|
77
|
+
if (rd.range < kTopValue) {
|
|
78
|
+
rd.range = rd.range << 8 >>> 0;
|
|
79
|
+
rd.code = (rd.code << 8 | (rd.pos < rd.stream.length ? rd.stream[rd.pos++] : 0)) >>> 0;
|
|
80
|
+
}
|
|
81
|
+
return symbol;
|
|
82
|
+
}
|
|
83
|
+
function decodeBcj2Multi(streams, _properties, unpackSize) {
|
|
84
|
+
if (streams.length !== 4) {
|
|
85
|
+
throw new Error("BCJ2 requires 4 input streams, got ".concat(streams.length));
|
|
86
|
+
}
|
|
87
|
+
// Stream assignment (based on 7z bind pair convention):
|
|
88
|
+
// streams[0] = main data (after LZMA2)
|
|
89
|
+
// streams[1] = call stream (after LZMA)
|
|
90
|
+
// streams[2] = jump stream (after LZMA)
|
|
91
|
+
// streams[3] = range coder stream (uncompressed)
|
|
92
|
+
var mainStream = streams[0];
|
|
93
|
+
var callStream = streams[1];
|
|
94
|
+
var jumpStream = streams[2];
|
|
95
|
+
var rcStream = streams[3];
|
|
96
|
+
// Output buffer
|
|
97
|
+
var outSize = unpackSize || mainStream.length + callStream.length + jumpStream.length;
|
|
98
|
+
var output = (0, _extractbaseiterator.allocBuffer)(outSize);
|
|
99
|
+
var outPos = 0;
|
|
100
|
+
// Stream positions
|
|
101
|
+
var mainPos = 0;
|
|
102
|
+
var callPos = 0;
|
|
103
|
+
var jumpPos = 0;
|
|
104
|
+
// Initialize range decoder
|
|
105
|
+
var rd = initRangeDecoder(rcStream);
|
|
106
|
+
// Initialize probability models
|
|
107
|
+
var probs = [];
|
|
108
|
+
for(var i = 0; i < kNumProbs; i++){
|
|
109
|
+
probs.push(kBitModelTotal >>> 1);
|
|
110
|
+
}
|
|
111
|
+
// Track previous byte for probability context
|
|
112
|
+
var prevByte = 0;
|
|
113
|
+
// Instruction pointer for address conversion
|
|
114
|
+
var ip = 0;
|
|
115
|
+
while(outPos < outSize && mainPos < mainStream.length){
|
|
116
|
+
var b = mainStream[mainPos++];
|
|
117
|
+
// Check for branch opcodes
|
|
118
|
+
if (b === 0xe8 || b === 0xe9) {
|
|
119
|
+
// CALL (0xE8) or JMP (0xE9)
|
|
120
|
+
// Use range decoder to check if this should be processed
|
|
121
|
+
var probIndex = prevByte;
|
|
122
|
+
var isMatch = decodeBit(rd, probs, probIndex);
|
|
123
|
+
output[outPos++] = b;
|
|
124
|
+
ip++;
|
|
125
|
+
if (isMatch) {
|
|
126
|
+
// Read 4-byte address from appropriate stream
|
|
127
|
+
var addrStream = b === 0xe8 ? callStream : jumpStream;
|
|
128
|
+
var addrPos = b === 0xe8 ? callPos : jumpPos;
|
|
129
|
+
if (addrPos + 4 > addrStream.length) {
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
// Read as big-endian (BCJ2 stores addresses big-endian)
|
|
133
|
+
var addr = addrStream[addrPos] << 24 | addrStream[addrPos + 1] << 16 | addrStream[addrPos + 2] << 8 | addrStream[addrPos + 3];
|
|
134
|
+
if (b === 0xe8) {
|
|
135
|
+
callPos += 4;
|
|
136
|
+
} else {
|
|
137
|
+
jumpPos += 4;
|
|
138
|
+
}
|
|
139
|
+
// Convert absolute to relative address
|
|
140
|
+
addr = addr - (ip + 4) | 0;
|
|
141
|
+
// Write as little-endian
|
|
142
|
+
output[outPos++] = addr & 0xff;
|
|
143
|
+
output[outPos++] = addr >>> 8 & 0xff;
|
|
144
|
+
output[outPos++] = addr >>> 16 & 0xff;
|
|
145
|
+
output[outPos++] = addr >>> 24 & 0xff;
|
|
146
|
+
ip += 4;
|
|
147
|
+
prevByte = addr >>> 24 & 0xff;
|
|
148
|
+
} else {
|
|
149
|
+
prevByte = b;
|
|
150
|
+
}
|
|
151
|
+
} else if (b === 0x0f && mainPos < mainStream.length) {
|
|
152
|
+
// Potential conditional jump (0x0F 0x8x)
|
|
153
|
+
output[outPos++] = b;
|
|
154
|
+
ip++;
|
|
155
|
+
var b2 = mainStream[mainPos];
|
|
156
|
+
if ((b2 & 0xf0) === 0x80) {
|
|
157
|
+
// Conditional jump
|
|
158
|
+
mainPos++;
|
|
159
|
+
var probIndex2 = 256 + (b2 >>> 4 & 1);
|
|
160
|
+
var isMatch2 = decodeBit(rd, probs, probIndex2);
|
|
161
|
+
output[outPos++] = b2;
|
|
162
|
+
ip++;
|
|
163
|
+
if (isMatch2) {
|
|
164
|
+
// Read 4-byte address from jump stream
|
|
165
|
+
if (jumpPos + 4 > jumpStream.length) {
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
var addr2 = jumpStream[jumpPos] << 24 | jumpStream[jumpPos + 1] << 16 | jumpStream[jumpPos + 2] << 8 | jumpStream[jumpPos + 3];
|
|
169
|
+
jumpPos += 4;
|
|
170
|
+
// Convert absolute to relative
|
|
171
|
+
addr2 = addr2 - (ip + 4) | 0;
|
|
172
|
+
// Write as little-endian
|
|
173
|
+
output[outPos++] = addr2 & 0xff;
|
|
174
|
+
output[outPos++] = addr2 >>> 8 & 0xff;
|
|
175
|
+
output[outPos++] = addr2 >>> 16 & 0xff;
|
|
176
|
+
output[outPos++] = addr2 >>> 24 & 0xff;
|
|
177
|
+
ip += 4;
|
|
178
|
+
prevByte = addr2 >>> 24 & 0xff;
|
|
179
|
+
} else {
|
|
180
|
+
prevByte = b2;
|
|
181
|
+
}
|
|
182
|
+
} else {
|
|
183
|
+
prevByte = b;
|
|
184
|
+
}
|
|
185
|
+
} else {
|
|
186
|
+
// Regular byte
|
|
187
|
+
output[outPos++] = b;
|
|
188
|
+
ip++;
|
|
189
|
+
prevByte = b;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Return only the used portion
|
|
193
|
+
return outPos < output.length ? output.slice(0, outPos) : output;
|
|
194
|
+
}
|
|
195
|
+
function decodeBcj2(_input, _properties, _unpackSize) {
|
|
196
|
+
throw new Error('BCJ2 requires multi-stream decoding - use decodeBcj2Multi');
|
|
197
|
+
}
|
|
198
|
+
function createBcj2Decoder(_properties, _unpackSize) {
|
|
199
|
+
return (0, _createBufferingDecoderts.default)(decodeBcj2, _properties, _unpackSize);
|
|
200
|
+
}
|
|
201
|
+
/* 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/Bcj2.ts"],"sourcesContent":["// BCJ2 (x86-64) filter codec - advanced branch/call/jump converter\n// BCJ2 uses 4 input streams and arithmetic (range) coding for better compression\n// Reference: LZMA SDK Bcj2.c\n//\n// Stream layout:\n// Stream 0: Main data (contains literals and branch opcode markers)\n// Stream 1: CALL addresses (for 0xE8 instructions)\n// Stream 2: JUMP addresses (for 0xE9 instructions)\n// Stream 3: Range coder data (probability decisions)\n\nimport { allocBuffer } from 'extract-base-iterator';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\n\n// Range coder constants\nvar kTopValue = 1 << 24;\nvar kNumBitModelTotalBits = 11;\nvar kBitModelTotal = 1 << kNumBitModelTotalBits;\nvar kNumMoveBits = 5;\n\n// Number of probability models (256 for each byte value that can precede a branch)\nvar kNumProbs = 256 + 2;\n\n/**\n * Range decoder state\n */\ninterface RangeDecoder {\n range: number;\n code: number;\n stream: Buffer;\n pos: number;\n}\n\n/**\n * Initialize range decoder\n */\nfunction initRangeDecoder(stream: Buffer): RangeDecoder {\n var rd: RangeDecoder = {\n range: 0xffffffff,\n code: 0,\n stream: stream,\n pos: 0,\n };\n\n // Initialize code from first 5 bytes\n for (var i = 0; i < 5; i++) {\n rd.code = (rd.code << 8) | (rd.pos < stream.length ? stream[rd.pos++] : 0);\n }\n\n return rd;\n}\n\n/**\n * Decode a single bit using probability model\n */\nfunction decodeBit(rd: RangeDecoder, prob: number[], probIndex: number): number {\n var ttt = prob[probIndex];\n var bound = (rd.range >>> kNumBitModelTotalBits) * ttt;\n\n var symbol: number;\n if (rd.code >>> 0 < bound >>> 0) {\n rd.range = bound;\n prob[probIndex] = (ttt + ((kBitModelTotal - ttt) >>> kNumMoveBits)) | 0;\n symbol = 0;\n } else {\n rd.range = (rd.range - bound) >>> 0;\n rd.code = (rd.code - bound) >>> 0;\n prob[probIndex] = (ttt - (ttt >>> kNumMoveBits)) | 0;\n symbol = 1;\n }\n\n // Normalize\n if (rd.range < kTopValue) {\n rd.range = (rd.range << 8) >>> 0;\n rd.code = ((rd.code << 8) | (rd.pos < rd.stream.length ? rd.stream[rd.pos++] : 0)) >>> 0;\n }\n\n return symbol;\n}\n\n/**\n * BCJ2 multi-stream decoder\n * Takes 4 pre-decompressed streams and combines them\n */\nexport function decodeBcj2Multi(streams: Buffer[], _properties?: Buffer, unpackSize?: number): Buffer {\n if (streams.length !== 4) {\n throw new Error(`BCJ2 requires 4 input streams, got ${streams.length}`);\n }\n\n // Stream assignment (based on 7z bind pair convention):\n // streams[0] = main data (after LZMA2)\n // streams[1] = call stream (after LZMA)\n // streams[2] = jump stream (after LZMA)\n // streams[3] = range coder stream (uncompressed)\n var mainStream = streams[0];\n var callStream = streams[1];\n var jumpStream = streams[2];\n var rcStream = streams[3];\n\n // Output buffer\n var outSize = unpackSize || mainStream.length + callStream.length + jumpStream.length;\n var output = allocBuffer(outSize);\n var outPos = 0;\n\n // Stream positions\n var mainPos = 0;\n var callPos = 0;\n var jumpPos = 0;\n\n // Initialize range decoder\n var rd = initRangeDecoder(rcStream);\n\n // Initialize probability models\n var probs: number[] = [];\n for (var i = 0; i < kNumProbs; i++) {\n probs.push(kBitModelTotal >>> 1);\n }\n\n // Track previous byte for probability context\n var prevByte = 0;\n\n // Instruction pointer for address conversion\n var ip = 0;\n\n while (outPos < outSize && mainPos < mainStream.length) {\n var b = mainStream[mainPos++];\n\n // Check for branch opcodes\n if (b === 0xe8 || b === 0xe9) {\n // CALL (0xE8) or JMP (0xE9)\n // Use range decoder to check if this should be processed\n var probIndex = prevByte;\n var isMatch = decodeBit(rd, probs, probIndex);\n\n output[outPos++] = b;\n ip++;\n\n if (isMatch) {\n // Read 4-byte address from appropriate stream\n var addrStream = b === 0xe8 ? callStream : jumpStream;\n var addrPos = b === 0xe8 ? callPos : jumpPos;\n\n if (addrPos + 4 > addrStream.length) {\n // Not enough data, copy remaining\n break;\n }\n\n // Read as big-endian (BCJ2 stores addresses big-endian)\n var addr = (addrStream[addrPos] << 24) | (addrStream[addrPos + 1] << 16) | (addrStream[addrPos + 2] << 8) | addrStream[addrPos + 3];\n\n if (b === 0xe8) {\n callPos += 4;\n } else {\n jumpPos += 4;\n }\n\n // Convert absolute to relative address\n addr = (addr - (ip + 4)) | 0;\n\n // Write as little-endian\n output[outPos++] = addr & 0xff;\n output[outPos++] = (addr >>> 8) & 0xff;\n output[outPos++] = (addr >>> 16) & 0xff;\n output[outPos++] = (addr >>> 24) & 0xff;\n ip += 4;\n\n prevByte = (addr >>> 24) & 0xff;\n } else {\n prevByte = b;\n }\n } else if (b === 0x0f && mainPos < mainStream.length) {\n // Potential conditional jump (0x0F 0x8x)\n output[outPos++] = b;\n ip++;\n\n var b2 = mainStream[mainPos];\n if ((b2 & 0xf0) === 0x80) {\n // Conditional jump\n mainPos++;\n var probIndex2 = 256 + ((b2 >>> 4) & 1);\n var isMatch2 = decodeBit(rd, probs, probIndex2);\n\n output[outPos++] = b2;\n ip++;\n\n if (isMatch2) {\n // Read 4-byte address from jump stream\n if (jumpPos + 4 > jumpStream.length) {\n break;\n }\n\n var addr2 = (jumpStream[jumpPos] << 24) | (jumpStream[jumpPos + 1] << 16) | (jumpStream[jumpPos + 2] << 8) | jumpStream[jumpPos + 3];\n jumpPos += 4;\n\n // Convert absolute to relative\n addr2 = (addr2 - (ip + 4)) | 0;\n\n // Write as little-endian\n output[outPos++] = addr2 & 0xff;\n output[outPos++] = (addr2 >>> 8) & 0xff;\n output[outPos++] = (addr2 >>> 16) & 0xff;\n output[outPos++] = (addr2 >>> 24) & 0xff;\n ip += 4;\n\n prevByte = (addr2 >>> 24) & 0xff;\n } else {\n prevByte = b2;\n }\n } else {\n prevByte = b;\n }\n } else {\n // Regular byte\n output[outPos++] = b;\n ip++;\n prevByte = b;\n }\n }\n\n // Return only the used portion\n return outPos < output.length ? output.slice(0, outPos) : output;\n}\n\n/**\n * Single-buffer decode (for API compatibility)\n * Note: BCJ2 requires multi-stream, this throws\n */\nexport function decodeBcj2(_input: Buffer, _properties?: Buffer, _unpackSize?: number): Buffer {\n throw new Error('BCJ2 requires multi-stream decoding - use decodeBcj2Multi');\n}\n\n/**\n * Create a BCJ2 decoder Transform stream\n * Note: BCJ2 requires multi-stream, this is for API compatibility\n */\nexport function createBcj2Decoder(_properties?: Buffer, _unpackSize?: number): Transform {\n return createBufferingDecoder(decodeBcj2, _properties, _unpackSize);\n}\n"],"names":["createBcj2Decoder","decodeBcj2","decodeBcj2Multi","kTopValue","kNumBitModelTotalBits","kBitModelTotal","kNumMoveBits","kNumProbs","initRangeDecoder","stream","rd","range","code","pos","i","length","decodeBit","prob","probIndex","ttt","bound","symbol","streams","_properties","unpackSize","Error","mainStream","callStream","jumpStream","rcStream","outSize","output","allocBuffer","outPos","mainPos","callPos","jumpPos","probs","push","prevByte","ip","b","isMatch","addrStream","addrPos","addr","b2","probIndex2","isMatch2","addr2","slice","_input","_unpackSize","createBufferingDecoder"],"mappings":"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"}
|
|
@@ -9,7 +9,11 @@
|
|
|
9
9
|
// 0x01 = Uncompressed chunk, dictionary reset
|
|
10
10
|
// 0x02 = Uncompressed chunk, no dictionary reset
|
|
11
11
|
// 0x80-0xFF = LZMA compressed chunk (bits encode reset flags and size)
|
|
12
|
-
//
|
|
12
|
+
//
|
|
13
|
+
// Note: lzma-purejs is patched via patch-package to support LZMA2 state preservation.
|
|
14
|
+
// The patch adds setSolid(true/false) method to control whether state is preserved
|
|
15
|
+
// across code() calls.
|
|
16
|
+
// Import lzma-purejs - provides raw LZMA decoder (patched for LZMA2 support)
|
|
13
17
|
"use strict";
|
|
14
18
|
Object.defineProperty(exports, "__esModule", {
|
|
15
19
|
value: true
|
|
@@ -68,8 +72,12 @@ function decodeLzma2(input, properties, _unpackSize) {
|
|
|
68
72
|
var output = [];
|
|
69
73
|
var offset = 0;
|
|
70
74
|
// LZMA decoder instance - reused across chunks
|
|
75
|
+
// The decoder is patched via patch-package to support setSolid() for LZMA2 state preservation
|
|
76
|
+
// The decoder also has _nowPos64 which tracks cumulative position for rep0 validation
|
|
77
|
+
// and _prevByte which is used for literal decoder context selection
|
|
71
78
|
var decoder = new LzmaDecoder();
|
|
72
79
|
decoder.setDictionarySize(dictSize);
|
|
80
|
+
var outWindow = decoder._outWindow;
|
|
73
81
|
// Track current LZMA properties (lc, lp, pb)
|
|
74
82
|
var propsSet = false;
|
|
75
83
|
while(offset < input.length){
|
|
@@ -81,8 +89,12 @@ function decodeLzma2(input, properties, _unpackSize) {
|
|
|
81
89
|
// Uncompressed chunk
|
|
82
90
|
// 0x01 = dictionary reset + uncompressed
|
|
83
91
|
// 0x02 = uncompressed (no reset)
|
|
84
|
-
//
|
|
85
|
-
|
|
92
|
+
// Handle dictionary reset for 0x01
|
|
93
|
+
if (control === 0x01) {
|
|
94
|
+
outWindow._pos = 0;
|
|
95
|
+
outWindow._streamPos = 0;
|
|
96
|
+
decoder._nowPos64 = 0;
|
|
97
|
+
}
|
|
86
98
|
if (offset + 2 > input.length) {
|
|
87
99
|
throw new Error('Truncated LZMA2 uncompressed chunk header');
|
|
88
100
|
}
|
|
@@ -92,17 +104,49 @@ function decodeLzma2(input, properties, _unpackSize) {
|
|
|
92
104
|
if (offset + uncompSize > input.length) {
|
|
93
105
|
throw new Error('Truncated LZMA2 uncompressed data');
|
|
94
106
|
}
|
|
95
|
-
//
|
|
96
|
-
|
|
107
|
+
// Get the uncompressed data
|
|
108
|
+
var uncompData = input.slice(offset, offset + uncompSize);
|
|
109
|
+
// Copy uncompressed data to output
|
|
110
|
+
output.push(uncompData);
|
|
111
|
+
// Also update the decoder's internal dictionary so subsequent LZMA chunks can reference it
|
|
112
|
+
// The decoder needs to track this data for LZ77 back-references
|
|
113
|
+
// We write directly to _buffer to avoid flush() which requires _stream to be set
|
|
114
|
+
// We must also update _streamPos to match _pos so that flush() doesn't try to write
|
|
115
|
+
for(var i = 0; i < uncompData.length; i++){
|
|
116
|
+
outWindow._buffer[outWindow._pos++] = uncompData[i];
|
|
117
|
+
// Handle circular buffer wrap-around
|
|
118
|
+
if (outWindow._pos >= outWindow._windowSize) {
|
|
119
|
+
outWindow._pos = 0;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Keep _streamPos in sync so flush() doesn't try to write these bytes
|
|
123
|
+
// (they're already in our output buffer)
|
|
124
|
+
outWindow._streamPos = outWindow._pos;
|
|
125
|
+
// Update decoder's cumulative position so subsequent LZMA chunks have correct rep0 validation
|
|
126
|
+
decoder._nowPos64 += uncompSize;
|
|
127
|
+
// Update prevByte for literal decoder context in subsequent LZMA chunks
|
|
128
|
+
decoder._prevByte = uncompData[uncompData.length - 1];
|
|
97
129
|
offset += uncompSize;
|
|
98
130
|
} else if (control >= 0x80) {
|
|
99
131
|
// LZMA compressed chunk
|
|
100
132
|
// Control byte format (bits 7-0):
|
|
101
133
|
// Bit 7: always 1 for LZMA chunk
|
|
102
|
-
//
|
|
103
|
-
// Bit 5: new properties (implies state reset)
|
|
134
|
+
// Bits 6-5: reset mode (00=nothing, 01=state, 10=state+props, 11=all)
|
|
104
135
|
// Bits 4-0: high 5 bits of uncompressed size - 1
|
|
105
|
-
|
|
136
|
+
// Control byte ranges (based on bits 6-5):
|
|
137
|
+
// 0x80-0x9F (00): no reset - continue existing state (solid mode)
|
|
138
|
+
// 0xA0-0xBF (01): reset state only
|
|
139
|
+
// 0xC0-0xDF (10): reset state + new properties
|
|
140
|
+
// 0xE0-0xFF (11): reset dictionary + state + new properties
|
|
141
|
+
var resetState = control >= 0xa0;
|
|
142
|
+
var newProps = control >= 0xc0;
|
|
143
|
+
var dictReset = control >= 0xe0;
|
|
144
|
+
var useSolidMode = !resetState;
|
|
145
|
+
// Handle dictionary reset for control bytes 0xE0-0xFF
|
|
146
|
+
if (dictReset) {
|
|
147
|
+
outWindow._pos = 0;
|
|
148
|
+
outWindow._streamPos = 0;
|
|
149
|
+
}
|
|
106
150
|
if (offset + 4 > input.length) {
|
|
107
151
|
throw new Error('Truncated LZMA2 LZMA chunk header');
|
|
108
152
|
}
|
|
@@ -139,8 +183,8 @@ function decodeLzma2(input, properties, _unpackSize) {
|
|
|
139
183
|
// Decode LZMA chunk
|
|
140
184
|
var inStream = (0, _streamsts.createInputStream)(input, offset, compSize);
|
|
141
185
|
var outStream = (0, _streamsts.createOutputStream)();
|
|
142
|
-
//
|
|
143
|
-
|
|
186
|
+
// Set solid mode based on control byte - this preserves state across code() calls
|
|
187
|
+
decoder.setSolid(useSolidMode);
|
|
144
188
|
// Decode the chunk
|
|
145
189
|
var success = decoder.code(inStream, outStream, uncompSize2);
|
|
146
190
|
if (!success) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Lzma2.ts"],"sourcesContent":["// LZMA2 codec - wrapper around lzma-purejs for LZMA2 decompression\n// LZMA2 is a container format that wraps LZMA chunks with framing\n//\n// LZMA2 format specification:\n// https://github.com/ulikunitz/xz/blob/master/doc/LZMA2.md\n//\n// Control byte values:\n// 0x00 = End of stream\n// 0x01 = Uncompressed chunk, dictionary reset\n// 0x02 = Uncompressed chunk, no dictionary reset\n// 0x80-0xFF = LZMA compressed chunk (bits encode reset flags and size)\n\n// Import lzma-purejs - provides raw LZMA decoder\nimport lzmajs from 'lzma-purejs';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\nimport { createInputStream, createOutputStream } from './streams.ts';\n\nvar LzmaDecoder = lzmajs.LZMA.Decoder;\n\n/**\n * Decode LZMA2 dictionary size from properties byte\n * Properties byte encodes dictionary size as: 2^(dictByte/2 + 12) or similar\n *\n * Per XZ spec, dictionary sizes are:\n * 0x00 = 4 KiB (2^12)\n * 0x01 = 6 KiB\n * 0x02 = 8 KiB (2^13)\n * ...\n * 0x28 = 1.5 GiB\n */\nfunction decodeDictionarySize(propByte: number): number {\n if (propByte > 40) {\n throw new Error(`Invalid LZMA2 dictionary size property: ${propByte}`);\n }\n if (propByte === 40) {\n // Max dictionary size: 4 GiB - 1\n return 0xffffffff;\n }\n // Dictionary size = 2 | (propByte & 1) << (propByte / 2 + 11)\n var base = 2 | (propByte & 1);\n var shift = Math.floor(propByte / 2) + 11;\n return base << shift;\n}\n\n/**\n * Decode LZMA2 compressed data to buffer\n *\n * @param input - LZMA2 compressed data\n * @param properties - Properties buffer (1 byte: dictionary size)\n * @param _unpackSize - Unused (LZMA2 has internal size markers)\n * @returns Decompressed data\n */\nexport function decodeLzma2(input: Buffer, properties?: Buffer, _unpackSize?: number): Buffer {\n if (!properties || properties.length < 1) {\n throw new Error('LZMA2 requires properties byte');\n }\n\n var dictSize = decodeDictionarySize(properties[0]);\n var output: Buffer[] = [];\n var offset = 0;\n\n // LZMA decoder instance - reused across chunks\n var decoder = new LzmaDecoder();\n decoder.setDictionarySize(dictSize);\n\n // Track current LZMA properties (lc, lp, pb)\n var propsSet = false;\n\n while (offset < input.length) {\n var control = input[offset++];\n\n if (control === 0x00) {\n // End of LZMA2 stream\n break;\n }\n\n if (control === 0x01 || control === 0x02) {\n // Uncompressed chunk\n // 0x01 = dictionary reset + uncompressed\n // 0x02 = uncompressed (no reset)\n // Note: Dictionary reset (0x01) is handled implicitly since we don't\n // maintain dictionary state across uncompressed chunks in this implementation\n\n if (offset + 2 > input.length) {\n throw new Error('Truncated LZMA2 uncompressed chunk header');\n }\n\n // Size is big-endian, 16-bit, value + 1\n var uncompSize = ((input[offset] << 8) | input[offset + 1]) + 1;\n offset += 2;\n\n if (offset + uncompSize > input.length) {\n throw new Error('Truncated LZMA2 uncompressed data');\n }\n\n // Copy uncompressed data\n output.push(input.slice(offset, offset + uncompSize));\n offset += uncompSize;\n } else if (control >= 0x80) {\n // LZMA compressed chunk\n // Control byte format (bits 7-0):\n // Bit 7: always 1 for LZMA chunk\n // Bit 6: reset state\n // Bit 5: new properties (implies state reset)\n // Bits 4-0: high 5 bits of uncompressed size - 1\n\n var newProps = (control & 0x20) !== 0;\n\n if (offset + 4 > input.length) {\n throw new Error('Truncated LZMA2 LZMA chunk header');\n }\n\n // Uncompressed size: 5 bits from control + 16 bits from next 2 bytes + 1\n var uncompHigh = control & 0x1f;\n var uncompSize2 = ((uncompHigh << 16) | (input[offset] << 8) | input[offset + 1]) + 1;\n offset += 2;\n\n // Compressed size: 16 bits + 1\n var compSize = ((input[offset] << 8) | input[offset + 1]) + 1;\n offset += 2;\n\n // If new properties, read 1-byte LZMA properties\n if (newProps) {\n if (offset >= input.length) {\n throw new Error('Truncated LZMA2 properties byte');\n }\n var propsByte = input[offset++];\n\n // Properties byte: pb * 45 + lp * 9 + lc\n // where pb, lp, lc are LZMA parameters\n var lc = propsByte % 9;\n var remainder = Math.floor(propsByte / 9);\n var lp = remainder % 5;\n var pb = Math.floor(remainder / 5);\n\n if (!decoder.setLcLpPb(lc, lp, pb)) {\n throw new Error(`Invalid LZMA properties: lc=${lc} lp=${lp} pb=${pb}`);\n }\n propsSet = true;\n }\n\n if (!propsSet) {\n throw new Error('LZMA chunk without properties');\n }\n\n if (offset + compSize > input.length) {\n throw new Error('Truncated LZMA2 compressed data');\n }\n\n // Decode LZMA chunk\n var inStream = createInputStream(input, offset, compSize);\n var outStream = createOutputStream();\n\n // Note: decoder.code() internally calls init() after setting streams\n // For LZMA2, the decoder state is managed per-chunk through props resets\n\n // Decode the chunk\n var success = decoder.code(inStream, outStream, uncompSize2);\n if (!success) {\n throw new Error('LZMA decompression failed');\n }\n\n output.push(outStream.toBuffer());\n offset += compSize;\n } else {\n throw new Error(`Invalid LZMA2 control byte: 0x${control.toString(16)}`);\n }\n }\n\n return Buffer.concat(output);\n}\n\n/**\n * Create an LZMA2 decoder Transform stream\n */\nexport function createLzma2Decoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeLzma2, properties, unpackSize);\n}\n"],"names":["createLzma2Decoder","decodeLzma2","LzmaDecoder","lzmajs","LZMA","Decoder","decodeDictionarySize","propByte","Error","base","shift","Math","floor","input","properties","_unpackSize","length","dictSize","output","offset","decoder","setDictionarySize","propsSet","control","uncompSize","push","slice","newProps","uncompHigh","uncompSize2","compSize","propsByte","lc","remainder","lp","pb","setLcLpPb","inStream","createInputStream","outStream","createOutputStream","success","code","toBuffer","toString","Buffer","concat","unpackSize","createBufferingDecoder"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/Lzma2.ts"],"sourcesContent":["// LZMA2 codec - wrapper around lzma-purejs for LZMA2 decompression\n// LZMA2 is a container format that wraps LZMA chunks with framing\n//\n// LZMA2 format specification:\n// https://github.com/ulikunitz/xz/blob/master/doc/LZMA2.md\n//\n// Control byte values:\n// 0x00 = End of stream\n// 0x01 = Uncompressed chunk, dictionary reset\n// 0x02 = Uncompressed chunk, no dictionary reset\n// 0x80-0xFF = LZMA compressed chunk (bits encode reset flags and size)\n//\n// Note: lzma-purejs is patched via patch-package to support LZMA2 state preservation.\n// The patch adds setSolid(true/false) method to control whether state is preserved\n// across code() calls.\n\n// Import lzma-purejs - provides raw LZMA decoder (patched for LZMA2 support)\nimport lzmajs from 'lzma-purejs';\nimport type { Transform } from 'readable-stream';\nimport createBufferingDecoder from './createBufferingDecoder.ts';\nimport { createInputStream, createOutputStream } from './streams.ts';\n\nvar LzmaDecoder = lzmajs.LZMA.Decoder;\n\n/**\n * Decode LZMA2 dictionary size from properties byte\n * Properties byte encodes dictionary size as: 2^(dictByte/2 + 12) or similar\n *\n * Per XZ spec, dictionary sizes are:\n * 0x00 = 4 KiB (2^12)\n * 0x01 = 6 KiB\n * 0x02 = 8 KiB (2^13)\n * ...\n * 0x28 = 1.5 GiB\n */\nfunction decodeDictionarySize(propByte: number): number {\n if (propByte > 40) {\n throw new Error(`Invalid LZMA2 dictionary size property: ${propByte}`);\n }\n if (propByte === 40) {\n // Max dictionary size: 4 GiB - 1\n return 0xffffffff;\n }\n // Dictionary size = 2 | (propByte & 1) << (propByte / 2 + 11)\n var base = 2 | (propByte & 1);\n var shift = Math.floor(propByte / 2) + 11;\n return base << shift;\n}\n\n/**\n * Decode LZMA2 compressed data to buffer\n *\n * @param input - LZMA2 compressed data\n * @param properties - Properties buffer (1 byte: dictionary size)\n * @param _unpackSize - Unused (LZMA2 has internal size markers)\n * @returns Decompressed data\n */\nexport function decodeLzma2(input: Buffer, properties?: Buffer, _unpackSize?: number): Buffer {\n if (!properties || properties.length < 1) {\n throw new Error('LZMA2 requires properties byte');\n }\n\n var dictSize = decodeDictionarySize(properties[0]);\n var output: Buffer[] = [];\n var offset = 0;\n\n // LZMA decoder instance - reused across chunks\n // The decoder is patched via patch-package to support setSolid() for LZMA2 state preservation\n // The decoder also has _nowPos64 which tracks cumulative position for rep0 validation\n // and _prevByte which is used for literal decoder context selection\n var decoder = new LzmaDecoder() as InstanceType<typeof LzmaDecoder> & {\n setSolid: (solid: boolean) => void;\n _nowPos64: number;\n _prevByte: number;\n };\n decoder.setDictionarySize(dictSize);\n\n // Access internal _outWindow for dictionary management\n // We need to preserve dictionary state across LZMA2 chunks\n type OutWindowType = {\n _buffer: Buffer;\n _pos: number;\n _streamPos: number;\n _windowSize: number;\n init: (solid: boolean) => void;\n };\n var outWindow = (decoder as unknown as { _outWindow: OutWindowType })._outWindow;\n\n // Track current LZMA properties (lc, lp, pb)\n var propsSet = false;\n\n while (offset < input.length) {\n var control = input[offset++];\n\n if (control === 0x00) {\n // End of LZMA2 stream\n break;\n }\n\n if (control === 0x01 || control === 0x02) {\n // Uncompressed chunk\n // 0x01 = dictionary reset + uncompressed\n // 0x02 = uncompressed (no reset)\n\n // Handle dictionary reset for 0x01\n if (control === 0x01) {\n outWindow._pos = 0;\n outWindow._streamPos = 0;\n decoder._nowPos64 = 0;\n }\n\n if (offset + 2 > input.length) {\n throw new Error('Truncated LZMA2 uncompressed chunk header');\n }\n\n // Size is big-endian, 16-bit, value + 1\n var uncompSize = ((input[offset] << 8) | input[offset + 1]) + 1;\n offset += 2;\n\n if (offset + uncompSize > input.length) {\n throw new Error('Truncated LZMA2 uncompressed data');\n }\n\n // Get the uncompressed data\n var uncompData = input.slice(offset, offset + uncompSize);\n\n // Copy uncompressed data to output\n output.push(uncompData);\n\n // Also update the decoder's internal dictionary so subsequent LZMA chunks can reference it\n // The decoder needs to track this data for LZ77 back-references\n // We write directly to _buffer to avoid flush() which requires _stream to be set\n // We must also update _streamPos to match _pos so that flush() doesn't try to write\n for (var i = 0; i < uncompData.length; i++) {\n outWindow._buffer[outWindow._pos++] = uncompData[i];\n // Handle circular buffer wrap-around\n if (outWindow._pos >= outWindow._windowSize) {\n outWindow._pos = 0;\n }\n }\n // Keep _streamPos in sync so flush() doesn't try to write these bytes\n // (they're already in our output buffer)\n outWindow._streamPos = outWindow._pos;\n\n // Update decoder's cumulative position so subsequent LZMA chunks have correct rep0 validation\n decoder._nowPos64 += uncompSize;\n\n // Update prevByte for literal decoder context in subsequent LZMA chunks\n decoder._prevByte = uncompData[uncompData.length - 1];\n\n offset += uncompSize;\n } else if (control >= 0x80) {\n // LZMA compressed chunk\n // Control byte format (bits 7-0):\n // Bit 7: always 1 for LZMA chunk\n // Bits 6-5: reset mode (00=nothing, 01=state, 10=state+props, 11=all)\n // Bits 4-0: high 5 bits of uncompressed size - 1\n\n // Control byte ranges (based on bits 6-5):\n // 0x80-0x9F (00): no reset - continue existing state (solid mode)\n // 0xA0-0xBF (01): reset state only\n // 0xC0-0xDF (10): reset state + new properties\n // 0xE0-0xFF (11): reset dictionary + state + new properties\n var resetState = control >= 0xa0;\n var newProps = control >= 0xc0;\n var dictReset = control >= 0xe0;\n var useSolidMode = !resetState;\n\n // Handle dictionary reset for control bytes 0xE0-0xFF\n if (dictReset) {\n outWindow._pos = 0;\n outWindow._streamPos = 0;\n }\n\n if (offset + 4 > input.length) {\n throw new Error('Truncated LZMA2 LZMA chunk header');\n }\n\n // Uncompressed size: 5 bits from control + 16 bits from next 2 bytes + 1\n var uncompHigh = control & 0x1f;\n var uncompSize2 = ((uncompHigh << 16) | (input[offset] << 8) | input[offset + 1]) + 1;\n offset += 2;\n\n // Compressed size: 16 bits + 1\n var compSize = ((input[offset] << 8) | input[offset + 1]) + 1;\n offset += 2;\n\n // If new properties, read 1-byte LZMA properties\n if (newProps) {\n if (offset >= input.length) {\n throw new Error('Truncated LZMA2 properties byte');\n }\n var propsByte = input[offset++];\n\n // Properties byte: pb * 45 + lp * 9 + lc\n // where pb, lp, lc are LZMA parameters\n var lc = propsByte % 9;\n var remainder = Math.floor(propsByte / 9);\n var lp = remainder % 5;\n var pb = Math.floor(remainder / 5);\n\n if (!decoder.setLcLpPb(lc, lp, pb)) {\n throw new Error(`Invalid LZMA properties: lc=${lc} lp=${lp} pb=${pb}`);\n }\n propsSet = true;\n }\n\n if (!propsSet) {\n throw new Error('LZMA chunk without properties');\n }\n\n if (offset + compSize > input.length) {\n throw new Error('Truncated LZMA2 compressed data');\n }\n\n // Decode LZMA chunk\n var inStream = createInputStream(input, offset, compSize);\n var outStream = createOutputStream();\n\n // Set solid mode based on control byte - this preserves state across code() calls\n decoder.setSolid(useSolidMode);\n\n // Decode the chunk\n var success = decoder.code(inStream, outStream, uncompSize2);\n if (!success) {\n throw new Error('LZMA decompression failed');\n }\n\n output.push(outStream.toBuffer());\n\n offset += compSize;\n } else {\n throw new Error(`Invalid LZMA2 control byte: 0x${control.toString(16)}`);\n }\n }\n\n return Buffer.concat(output);\n}\n\n/**\n * Create an LZMA2 decoder Transform stream\n */\nexport function createLzma2Decoder(properties?: Buffer, unpackSize?: number): Transform {\n return createBufferingDecoder(decodeLzma2, properties, unpackSize);\n}\n"],"names":["createLzma2Decoder","decodeLzma2","LzmaDecoder","lzmajs","LZMA","Decoder","decodeDictionarySize","propByte","Error","base","shift","Math","floor","input","properties","_unpackSize","length","dictSize","output","offset","decoder","setDictionarySize","outWindow","_outWindow","propsSet","control","_pos","_streamPos","_nowPos64","uncompSize","uncompData","slice","push","i","_buffer","_windowSize","_prevByte","resetState","newProps","dictReset","useSolidMode","uncompHigh","uncompSize2","compSize","propsByte","lc","remainder","lp","pb","setLcLpPb","inStream","createInputStream","outStream","createOutputStream","setSolid","success","code","toBuffer","toString","Buffer","concat","unpackSize","createBufferingDecoder"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Transform } from 'readable-stream';
|
|
2
2
|
import { getPassword, setPassword } from './Aes.js';
|
|
3
|
+
import { decodeBcj2Multi } from './Bcj2.js';
|
|
3
4
|
export { getPassword, setPassword };
|
|
4
5
|
export interface Codec {
|
|
5
6
|
decode: (input: Buffer, properties?: Buffer, unpackSize?: number) => Buffer;
|
|
@@ -22,3 +23,8 @@ export declare function isCodecSupported(id: number[]): boolean;
|
|
|
22
23
|
* Get human-readable codec name
|
|
23
24
|
*/
|
|
24
25
|
export declare function getCodecName(id: number[]): string;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a codec ID matches BCJ2
|
|
28
|
+
*/
|
|
29
|
+
export declare function isBcj2Codec(id: number[]): boolean;
|
|
30
|
+
export { decodeBcj2Multi };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Transform } from 'readable-stream';
|
|
2
2
|
import { getPassword, setPassword } from './Aes.js';
|
|
3
|
+
import { decodeBcj2Multi } from './Bcj2.js';
|
|
3
4
|
export { getPassword, setPassword };
|
|
4
5
|
export interface Codec {
|
|
5
6
|
decode: (input: Buffer, properties?: Buffer, unpackSize?: number) => Buffer;
|
|
@@ -22,3 +23,8 @@ export declare function isCodecSupported(id: number[]): boolean;
|
|
|
22
23
|
* Get human-readable codec name
|
|
23
24
|
*/
|
|
24
25
|
export declare function getCodecName(id: number[]): string;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a codec ID matches BCJ2
|
|
28
|
+
*/
|
|
29
|
+
export declare function isBcj2Codec(id: number[]): boolean;
|
|
30
|
+
export { decodeBcj2Multi };
|
|
@@ -11,6 +11,9 @@ function _export(target, all) {
|
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
13
|
_export(exports, {
|
|
14
|
+
get decodeBcj2Multi () {
|
|
15
|
+
return _Bcj2ts.decodeBcj2Multi;
|
|
16
|
+
},
|
|
14
17
|
get getCodec () {
|
|
15
18
|
return getCodec;
|
|
16
19
|
},
|
|
@@ -20,6 +23,9 @@ _export(exports, {
|
|
|
20
23
|
get getPassword () {
|
|
21
24
|
return _Aests.getPassword;
|
|
22
25
|
},
|
|
26
|
+
get isBcj2Codec () {
|
|
27
|
+
return isBcj2Codec;
|
|
28
|
+
},
|
|
23
29
|
get isCodecSupported () {
|
|
24
30
|
return isCodecSupported;
|
|
25
31
|
},
|
|
@@ -33,6 +39,7 @@ _export(exports, {
|
|
|
33
39
|
var _constantsts = require("../constants.js");
|
|
34
40
|
var _Aests = require("./Aes.js");
|
|
35
41
|
var _Bcjts = require("./Bcj.js");
|
|
42
|
+
var _Bcj2ts = require("./Bcj2.js");
|
|
36
43
|
var _BZip2ts = require("./BZip2.js");
|
|
37
44
|
var _Copyts = require("./Copy.js");
|
|
38
45
|
var _Deflatets = require("./Deflate.js");
|
|
@@ -78,12 +85,16 @@ function getCodecName(id) {
|
|
|
78
85
|
if (codecIdEquals(id, _constantsts.CodecId.LZMA)) return 'LZMA';
|
|
79
86
|
if (codecIdEquals(id, _constantsts.CodecId.LZMA2)) return 'LZMA2';
|
|
80
87
|
if (codecIdEquals(id, _constantsts.CodecId.BCJ_X86)) return 'BCJ (x86)';
|
|
88
|
+
if (codecIdEquals(id, _constantsts.CodecId.BCJ2)) return 'BCJ2';
|
|
81
89
|
if (codecIdEquals(id, _constantsts.CodecId.DELTA)) return 'Delta';
|
|
82
90
|
if (codecIdEquals(id, _constantsts.CodecId.DEFLATE)) return 'Deflate';
|
|
83
91
|
if (codecIdEquals(id, _constantsts.CodecId.BZIP2)) return 'BZip2';
|
|
84
92
|
if (codecIdEquals(id, _constantsts.CodecId.AES)) return 'AES-256';
|
|
85
93
|
return "Unknown (".concat(codecIdToKey(id), ")");
|
|
86
94
|
}
|
|
95
|
+
function isBcj2Codec(id) {
|
|
96
|
+
return codecIdEquals(id, _constantsts.CodecId.BCJ2);
|
|
97
|
+
}
|
|
87
98
|
// Register built-in codecs
|
|
88
99
|
// Copy codec (no compression)
|
|
89
100
|
registerCodec(_constantsts.CodecId.COPY, {
|
|
@@ -125,4 +136,10 @@ registerCodec(_constantsts.CodecId.AES, {
|
|
|
125
136
|
decode: _Aests.decodeAes,
|
|
126
137
|
createDecoder: _Aests.createAesDecoder
|
|
127
138
|
});
|
|
139
|
+
// BCJ2 (x86-64) filter - multi-stream
|
|
140
|
+
// Note: BCJ2 requires special handling in SevenZipParser due to 4-stream architecture
|
|
141
|
+
registerCodec(_constantsts.CodecId.BCJ2, {
|
|
142
|
+
decode: _Bcj2ts.decodeBcj2,
|
|
143
|
+
createDecoder: _Bcj2ts.createBcj2Decoder
|
|
144
|
+
});
|
|
128
145
|
/* 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 { 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.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// 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"],"names":["getCodec","getCodecName","getPassword","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","DELTA","DEFLATE","BZIP2","AES","decode","decodeCopy","createDecoder","createCopyDecoder","decodeLzma","createLzmaDecoder","decodeLzma2","createLzma2Decoder","decodeBcj","createBcjDecoder","decodeDelta","createDeltaDecoder","decodeDeflate","createDeflateDecoder","decodeBzip2","createBzip2Decoder","decodeAes","createAesDecoder"],"mappings":"AAAA,sCAAsC;AACtC,2EAA2E;;;;;;;;;;;;
|
|
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 +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 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};\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","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","message","code","err","Error"],"mappings":"AAAA,sBAAsB;AACtB,wEAAwE;AAExE,mCAAmC;;;;;;;;;;;;QAuCxBA;eAAAA;;
|
|
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};\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","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;;QAgCKC;eAAAA;;;AAtGT,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;AACrB;AAUO,SAASnE,iBAAiBoE,OAAe,EAAEC,IAAY;IAC5D,IAAIC,MAAM,IAAIC,MAAMH;IACpBE,IAAID,IAAI,GAAGA;IACX,OAAOC;AACT"}
|
package/dist/cjs/types.d.cts
CHANGED
package/dist/cjs/types.d.ts
CHANGED
package/dist/cjs/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/types.ts"],"sourcesContent":["export { DirectoryEntry, type Entry, LinkEntry, SymbolicLinkEntry } from 'extract-base-iterator';\n\nimport type { ExtractOptions as BaseExtractOptions } from 'extract-base-iterator';\n\n/**\n * Options for SevenZipIterator\n */\nexport interface ExtractOptions extends BaseExtractOptions {\n /**\n * Password for encrypted archives\n */\n password?: string;\n\n /**\n * Memory threshold in bytes for stream input.\n * Archives smaller than this are buffered in memory for faster processing.\n * Archives larger than this are written to a temp file.\n * Default: 100 MB (100 * 1024 * 1024)\n */\n memoryThreshold?: number;\n}\nexport { default as FileEntry } from './FileEntry.ts';\n\nimport type { SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.ts';\n\nexport interface LockT {\n iterator?: unknown;\n err?: Error;\n fd?: number;\n tempPath: string;\n retain: () => void;\n release: () => void;\n}\n\nexport interface SevenZipFile {\n getStream: () => NodeJS.ReadableStream;\n}\n\nexport interface SevenZipFileIterator {\n next: () => SevenZipEntry | null;\n getParser: () => SevenZipParser;\n}\n\nimport type { Entry } from 'extract-base-iterator';\n\nexport type EntryCallback = (error?: Error, result?: IteratorResult<Entry>) => undefined;\n"],"names":["DirectoryEntry","FileEntry","LinkEntry","SymbolicLinkEntry"],"mappings":";;;;;;;;;;;QAASA;eAAAA,mCAAc;;QAqBHC;eAAAA,oBAAS;;QArBQC;eAAAA,8BAAS;;QAAEC;eAAAA,sCAAiB;;;mCAAQ;kEAqBpC"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/types.ts"],"sourcesContent":["export { DirectoryEntry, type Entry, LinkEntry, SymbolicLinkEntry } from 'extract-base-iterator';\n\nimport type { ExtractOptions as BaseExtractOptions } from 'extract-base-iterator';\n\n/**\n * Options for SevenZipIterator\n */\nexport interface ExtractOptions extends BaseExtractOptions {\n /**\n * Password for encrypted archives\n */\n password?: string;\n\n /**\n * Memory threshold in bytes for stream input.\n * Archives smaller than this are buffered in memory for faster processing.\n * Archives larger than this are written to a temp file.\n * Default: 100 MB (100 * 1024 * 1024)\n */\n memoryThreshold?: number;\n}\nexport { default as FileEntry } from './FileEntry.ts';\n\nimport type { SevenZipEntry, SevenZipParser } from './sevenz/SevenZipParser.ts';\n\nexport interface LockT {\n iterator?: unknown;\n err?: Error;\n fd?: number;\n tempPath: string;\n sourceStream?: NodeJS.ReadableStream;\n retain: () => void;\n release: () => void;\n}\n\nexport interface SevenZipFile {\n getStream: () => NodeJS.ReadableStream;\n}\n\nexport interface SevenZipFileIterator {\n next: () => SevenZipEntry | null;\n getParser: () => SevenZipParser;\n}\n\nimport type { Entry } from 'extract-base-iterator';\n\nexport type EntryCallback = (error?: Error, result?: IteratorResult<Entry>) => undefined;\n"],"names":["DirectoryEntry","FileEntry","LinkEntry","SymbolicLinkEntry"],"mappings":";;;;;;;;;;;QAASA;eAAAA,mCAAc;;QAqBHC;eAAAA,oBAAS;;QArBQC;eAAAA,8BAAS;;QAAEC;eAAAA,sCAAiB;;;mCAAQ;kEAqBpC"}
|
|
@@ -72,6 +72,8 @@ let SevenZipIterator = class SevenZipIterator extends BaseIterator {
|
|
|
72
72
|
});
|
|
73
73
|
} else {
|
|
74
74
|
// Stream input - use hybrid memory/temp-file approach
|
|
75
|
+
// Store source stream in lock for cleanup if destroyed during download
|
|
76
|
+
this.lock.sourceStream = source;
|
|
75
77
|
var tempPath = path.join(tmpdir(), '7z-iterator', shortHash(process.cwd()), tempSuffix('tmp.7z'));
|
|
76
78
|
queue.defer((cb)=>{
|
|
77
79
|
streamToSource(source, {
|