7z-iterator 0.2.9 → 0.2.11
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/FileEntry.js +1 -1
- package/dist/cjs/FileEntry.js.map +1 -1
- package/dist/cjs/SevenZipIterator.js +1 -1
- package/dist/cjs/SevenZipIterator.js.map +1 -1
- package/dist/cjs/compat.js +1 -1
- package/dist/cjs/compat.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/lib/Lock.js +1 -1
- package/dist/cjs/lib/streamToSource.js +1 -1
- package/dist/cjs/lib/streamToSource.js.map +1 -1
- package/dist/cjs/nextEntry.js +1 -1
- package/dist/cjs/nextEntry.js.map +1 -1
- package/dist/cjs/sevenz/NumberCodec.js +1 -1
- package/dist/cjs/sevenz/NumberCodec.js.map +1 -1
- package/dist/cjs/sevenz/SevenZipParser.js +1 -1
- package/dist/cjs/sevenz/SevenZipParser.js.map +1 -1
- package/dist/cjs/sevenz/codecs/Aes.js +1 -1
- package/dist/cjs/sevenz/codecs/Aes.js.map +1 -1
- package/dist/cjs/sevenz/codecs/BZip2.js +1 -1
- package/dist/cjs/sevenz/codecs/Bcj.js +2 -2
- package/dist/cjs/sevenz/codecs/Bcj.js.map +1 -1
- package/dist/cjs/sevenz/codecs/Bcj2.js +1 -1
- package/dist/cjs/sevenz/codecs/Bcj2.js.map +1 -1
- package/dist/cjs/sevenz/codecs/BcjArm.js +1 -1
- package/dist/cjs/sevenz/codecs/BcjArm.js.map +1 -1
- package/dist/cjs/sevenz/codecs/BcjArm64.js +1 -1
- package/dist/cjs/sevenz/codecs/BcjArm64.js.map +1 -1
- package/dist/cjs/sevenz/codecs/BcjArmt.js +1 -1
- package/dist/cjs/sevenz/codecs/BcjArmt.js.map +1 -1
- package/dist/cjs/sevenz/codecs/BcjIa64.js +1 -1
- package/dist/cjs/sevenz/codecs/BcjIa64.js.map +1 -1
- package/dist/cjs/sevenz/codecs/BcjPpc.js +1 -1
- package/dist/cjs/sevenz/codecs/BcjPpc.js.map +1 -1
- package/dist/cjs/sevenz/codecs/BcjSparc.js +1 -1
- package/dist/cjs/sevenz/codecs/BcjSparc.js.map +1 -1
- package/dist/cjs/sevenz/codecs/Copy.js +1 -1
- package/dist/cjs/sevenz/codecs/Deflate.js +1 -1
- package/dist/cjs/sevenz/codecs/Delta.js +1 -1
- package/dist/cjs/sevenz/codecs/Delta.js.map +1 -1
- package/dist/cjs/sevenz/codecs/Lzma.js +1 -1
- package/dist/cjs/sevenz/codecs/Lzma.js.map +1 -1
- package/dist/cjs/sevenz/codecs/Lzma2.js +1 -1
- package/dist/cjs/sevenz/codecs/Lzma2.js.map +1 -1
- package/dist/cjs/sevenz/codecs/createBufferingDecoder.js +1 -1
- package/dist/cjs/sevenz/codecs/createBufferingDecoder.js.map +1 -1
- package/dist/cjs/sevenz/codecs/index.js +1 -1
- package/dist/cjs/sevenz/codecs/index.js.map +1 -1
- package/dist/cjs/sevenz/codecs/lzmaCompat.d.cts +1 -1
- package/dist/cjs/sevenz/codecs/lzmaCompat.d.ts +1 -1
- package/dist/cjs/sevenz/codecs/lzmaCompat.js +1 -1
- package/dist/cjs/sevenz/codecs/lzmaCompat.js.map +1 -1
- package/dist/cjs/sevenz/codecs/streams.js +1 -1
- package/dist/cjs/sevenz/codecs/streams.js.map +1 -1
- package/dist/cjs/sevenz/constants.d.cts +8 -8
- package/dist/cjs/sevenz/constants.d.ts +8 -8
- package/dist/cjs/sevenz/constants.js +1 -1
- package/dist/cjs/sevenz/constants.js.map +1 -1
- package/dist/cjs/sevenz/headers.js +2 -2
- package/dist/cjs/sevenz/headers.js.map +1 -1
- package/dist/cjs/sevenz/index.js +1 -1
- package/dist/cjs/types.js +1 -1
- package/dist/esm/FileEntry.js +1 -1
- package/dist/esm/FileEntry.js.map +1 -1
- package/dist/esm/SevenZipIterator.js +6 -6
- package/dist/esm/SevenZipIterator.js.map +1 -1
- package/dist/esm/compat.js +2 -2
- package/dist/esm/compat.js.map +1 -1
- package/dist/esm/lib/streamToSource.js +12 -12
- package/dist/esm/lib/streamToSource.js.map +1 -1
- package/dist/esm/nextEntry.js +11 -11
- package/dist/esm/nextEntry.js.map +1 -1
- package/dist/esm/sevenz/NumberCodec.js +19 -19
- package/dist/esm/sevenz/NumberCodec.js.map +1 -1
- package/dist/esm/sevenz/SevenZipParser.js +191 -191
- package/dist/esm/sevenz/SevenZipParser.js.map +1 -1
- package/dist/esm/sevenz/codecs/Aes.js +29 -29
- package/dist/esm/sevenz/codecs/Aes.js.map +1 -1
- package/dist/esm/sevenz/codecs/Bcj.js +8 -8
- package/dist/esm/sevenz/codecs/Bcj.js.map +1 -1
- package/dist/esm/sevenz/codecs/Bcj2.js +35 -35
- package/dist/esm/sevenz/codecs/Bcj2.js.map +1 -1
- package/dist/esm/sevenz/codecs/BcjArm.js +4 -4
- package/dist/esm/sevenz/codecs/BcjArm.js.map +1 -1
- package/dist/esm/sevenz/codecs/BcjArm64.js +5 -5
- package/dist/esm/sevenz/codecs/BcjArm64.js.map +1 -1
- package/dist/esm/sevenz/codecs/BcjArmt.js +10 -10
- package/dist/esm/sevenz/codecs/BcjArmt.js.map +1 -1
- package/dist/esm/sevenz/codecs/BcjIa64.js +24 -24
- package/dist/esm/sevenz/codecs/BcjIa64.js.map +1 -1
- package/dist/esm/sevenz/codecs/BcjPpc.js +5 -5
- package/dist/esm/sevenz/codecs/BcjPpc.js.map +1 -1
- package/dist/esm/sevenz/codecs/BcjSparc.js +8 -8
- package/dist/esm/sevenz/codecs/BcjSparc.js.map +1 -1
- package/dist/esm/sevenz/codecs/Delta.js +6 -6
- package/dist/esm/sevenz/codecs/Delta.js.map +1 -1
- package/dist/esm/sevenz/codecs/Lzma.js +16 -16
- package/dist/esm/sevenz/codecs/Lzma.js.map +1 -1
- package/dist/esm/sevenz/codecs/Lzma2.js +35 -35
- package/dist/esm/sevenz/codecs/Lzma2.js.map +1 -1
- package/dist/esm/sevenz/codecs/createBufferingDecoder.js +3 -3
- package/dist/esm/sevenz/codecs/createBufferingDecoder.js.map +1 -1
- package/dist/esm/sevenz/codecs/index.js +6 -6
- package/dist/esm/sevenz/codecs/index.js.map +1 -1
- package/dist/esm/sevenz/codecs/lzmaCompat.d.ts +1 -1
- package/dist/esm/sevenz/codecs/lzmaCompat.js +5 -5
- package/dist/esm/sevenz/codecs/lzmaCompat.js.map +1 -1
- package/dist/esm/sevenz/codecs/streams.js +13 -13
- package/dist/esm/sevenz/codecs/streams.js.map +1 -1
- package/dist/esm/sevenz/constants.d.ts +8 -8
- package/dist/esm/sevenz/constants.js +9 -9
- package/dist/esm/sevenz/constants.js.map +1 -1
- package/dist/esm/sevenz/headers.js +134 -134
- package/dist/esm/sevenz/headers.js.map +1 -1
- package/package.json +20 -20
|
@@ -11,22 +11,22 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
11
11
|
throw createCodedError('Not a valid 7z archive', ErrorCode.INVALID_SIGNATURE);
|
|
12
12
|
}
|
|
13
13
|
// Read version
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
const majorVersion = buf[6];
|
|
15
|
+
const minorVersion = buf[7];
|
|
16
16
|
// Version check - we support 0.x (current is 0.4)
|
|
17
17
|
if (majorVersion > 0) {
|
|
18
18
|
throw createCodedError(`Unsupported 7z version: ${majorVersion}.${minorVersion}`, ErrorCode.UNSUPPORTED_VERSION);
|
|
19
19
|
}
|
|
20
20
|
// Read start header CRC (CRC of the next 20 bytes)
|
|
21
|
-
|
|
21
|
+
const startHeaderCRC = buf.readUInt32LE(8);
|
|
22
22
|
// Verify start header CRC
|
|
23
23
|
if (!verifyCrc32Region(buf, 12, 20, startHeaderCRC)) {
|
|
24
24
|
throw createCodedError('Start header CRC mismatch', ErrorCode.CRC_MISMATCH);
|
|
25
25
|
}
|
|
26
26
|
// Read next header location
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
const nextHeaderOffset = readUInt64LE(buf, 12);
|
|
28
|
+
const nextHeaderSize = readUInt64LE(buf, 20);
|
|
29
|
+
const nextHeaderCRC = buf.readUInt32LE(28);
|
|
30
30
|
return {
|
|
31
31
|
majorVersion: majorVersion,
|
|
32
32
|
minorVersion: minorVersion,
|
|
@@ -43,9 +43,9 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
43
43
|
if (!verifyCrc32Region(buf, 0, buf.length, expectedCRC)) {
|
|
44
44
|
throw createCodedError('Encoded header CRC mismatch', ErrorCode.CRC_MISMATCH);
|
|
45
45
|
}
|
|
46
|
-
|
|
46
|
+
let offset = 0;
|
|
47
47
|
// Read property ID
|
|
48
|
-
|
|
48
|
+
const propertyId = buf[offset++];
|
|
49
49
|
// Handle kEncodedHeader - means the header itself is compressed
|
|
50
50
|
if (propertyId === PropertyId.kEncodedHeader) {
|
|
51
51
|
// Return indicator that we need to decompress
|
|
@@ -62,12 +62,12 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
62
62
|
* Parse header content (after kHeader byte has been read)
|
|
63
63
|
* Used by parseEncodedHeader and for decompressed headers
|
|
64
64
|
*/ export function parseHeaderContent(buf, offset) {
|
|
65
|
-
|
|
65
|
+
const result = {
|
|
66
66
|
filesInfo: []
|
|
67
67
|
};
|
|
68
68
|
// Parse header contents
|
|
69
69
|
while(offset < buf.length){
|
|
70
|
-
|
|
70
|
+
const propertyId = buf[offset++];
|
|
71
71
|
if (propertyId === PropertyId.kEnd) {
|
|
72
72
|
break;
|
|
73
73
|
}
|
|
@@ -81,14 +81,14 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
81
81
|
break;
|
|
82
82
|
case PropertyId.kMainStreamsInfo:
|
|
83
83
|
{
|
|
84
|
-
|
|
84
|
+
const streamsResult = parseStreamsInfo(buf, offset);
|
|
85
85
|
result.streamsInfo = streamsResult.info;
|
|
86
86
|
offset = streamsResult.offset;
|
|
87
87
|
break;
|
|
88
88
|
}
|
|
89
89
|
case PropertyId.kFilesInfo:
|
|
90
90
|
{
|
|
91
|
-
|
|
91
|
+
const filesResult = parseFilesInfo(buf, offset);
|
|
92
92
|
result.filesInfo = filesResult.files;
|
|
93
93
|
offset = filesResult.offset;
|
|
94
94
|
break;
|
|
@@ -102,7 +102,7 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
102
102
|
/**
|
|
103
103
|
* Parse StreamsInfo block
|
|
104
104
|
*/ function parseStreamsInfo(buf, offset) {
|
|
105
|
-
|
|
105
|
+
const info = {
|
|
106
106
|
packPos: 0,
|
|
107
107
|
packSizes: [],
|
|
108
108
|
folders: [],
|
|
@@ -110,14 +110,14 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
110
110
|
unpackSizes: []
|
|
111
111
|
};
|
|
112
112
|
while(offset < buf.length){
|
|
113
|
-
|
|
113
|
+
const propertyId = buf[offset++];
|
|
114
114
|
if (propertyId === PropertyId.kEnd) {
|
|
115
115
|
break;
|
|
116
116
|
}
|
|
117
117
|
switch(propertyId){
|
|
118
118
|
case PropertyId.kPackInfo:
|
|
119
119
|
{
|
|
120
|
-
|
|
120
|
+
const packResult = parsePackInfo(buf, offset);
|
|
121
121
|
info.packPos = packResult.packPos;
|
|
122
122
|
info.packSizes = packResult.packSizes;
|
|
123
123
|
info.packCRCs = packResult.packCRCs;
|
|
@@ -126,14 +126,14 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
126
126
|
}
|
|
127
127
|
case PropertyId.kUnpackInfo:
|
|
128
128
|
{
|
|
129
|
-
|
|
129
|
+
const unpackResult = parseUnpackInfo(buf, offset);
|
|
130
130
|
info.folders = unpackResult.folders;
|
|
131
131
|
offset = unpackResult.offset;
|
|
132
132
|
break;
|
|
133
133
|
}
|
|
134
134
|
case PropertyId.kSubStreamsInfo:
|
|
135
135
|
{
|
|
136
|
-
|
|
136
|
+
const subResult = parseSubStreamsInfo(buf, offset, info.folders);
|
|
137
137
|
info.numUnpackStreamsPerFolder = subResult.numUnpackStreamsPerFolder;
|
|
138
138
|
info.unpackSizes = subResult.unpackSizes;
|
|
139
139
|
info.unpackCRCs = subResult.unpackCRCs;
|
|
@@ -146,10 +146,10 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
146
146
|
}
|
|
147
147
|
// If no SubStreamsInfo, each folder produces one file
|
|
148
148
|
if (info.unpackSizes.length === 0 && info.folders.length > 0) {
|
|
149
|
-
for(
|
|
150
|
-
|
|
149
|
+
for(let i = 0; i < info.folders.length; i++){
|
|
150
|
+
const folder = info.folders[i];
|
|
151
151
|
// Get the final unpack size (last coder's output)
|
|
152
|
-
|
|
152
|
+
const finalSize = folder.unpackSizes[folder.unpackSizes.length - 1];
|
|
153
153
|
info.unpackSizes.push(finalSize);
|
|
154
154
|
info.numUnpackStreamsPerFolder.push(1);
|
|
155
155
|
}
|
|
@@ -163,31 +163,31 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
163
163
|
* Parse PackInfo block
|
|
164
164
|
*/ function parsePackInfo(buf, offset) {
|
|
165
165
|
// Pack position
|
|
166
|
-
|
|
167
|
-
|
|
166
|
+
const packPosResult = readNumber(buf, offset);
|
|
167
|
+
const packPos = packPosResult.value;
|
|
168
168
|
offset += packPosResult.bytesRead;
|
|
169
169
|
// Number of pack streams
|
|
170
|
-
|
|
171
|
-
|
|
170
|
+
const numPackResult = readNumber(buf, offset);
|
|
171
|
+
const numPackStreams = numPackResult.value;
|
|
172
172
|
offset += numPackResult.bytesRead;
|
|
173
|
-
|
|
174
|
-
|
|
173
|
+
const packSizes = [];
|
|
174
|
+
let packCRCs;
|
|
175
175
|
while(offset < buf.length){
|
|
176
|
-
|
|
176
|
+
const propertyId = buf[offset++];
|
|
177
177
|
if (propertyId === PropertyId.kEnd) {
|
|
178
178
|
break;
|
|
179
179
|
}
|
|
180
180
|
if (propertyId === PropertyId.kSize) {
|
|
181
|
-
for(
|
|
182
|
-
|
|
181
|
+
for(let i = 0; i < numPackStreams; i++){
|
|
182
|
+
const sizeResult = readNumber(buf, offset);
|
|
183
183
|
packSizes.push(sizeResult.value);
|
|
184
184
|
offset += sizeResult.bytesRead;
|
|
185
185
|
}
|
|
186
186
|
} else if (propertyId === PropertyId.kCRC) {
|
|
187
187
|
packCRCs = [];
|
|
188
|
-
|
|
188
|
+
const definedResult = readDefinedVector(buf, offset, numPackStreams);
|
|
189
189
|
offset += definedResult.bytesRead;
|
|
190
|
-
for(
|
|
190
|
+
for(let j = 0; j < numPackStreams; j++){
|
|
191
191
|
if (definedResult.defined[j]) {
|
|
192
192
|
packCRCs.push(buf.readUInt32LE(offset));
|
|
193
193
|
offset += 4;
|
|
@@ -207,49 +207,49 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
207
207
|
/**
|
|
208
208
|
* Parse UnpackInfo block
|
|
209
209
|
*/ function parseUnpackInfo(buf, offset) {
|
|
210
|
-
|
|
210
|
+
const folders = [];
|
|
211
211
|
while(offset < buf.length){
|
|
212
|
-
|
|
212
|
+
const propertyId = buf[offset++];
|
|
213
213
|
if (propertyId === PropertyId.kEnd) {
|
|
214
214
|
break;
|
|
215
215
|
}
|
|
216
216
|
if (propertyId === PropertyId.kFolder) {
|
|
217
217
|
// Number of folders
|
|
218
|
-
|
|
219
|
-
|
|
218
|
+
const numFoldersResult = readNumber(buf, offset);
|
|
219
|
+
const numFolders = numFoldersResult.value;
|
|
220
220
|
offset += numFoldersResult.bytesRead;
|
|
221
221
|
// External flag
|
|
222
|
-
|
|
222
|
+
const external = buf[offset++];
|
|
223
223
|
if (external !== 0) {
|
|
224
224
|
throw createCodedError('External folders not supported', ErrorCode.CORRUPT_HEADER);
|
|
225
225
|
}
|
|
226
226
|
// Parse each folder
|
|
227
|
-
for(
|
|
228
|
-
|
|
227
|
+
for(let i = 0; i < numFolders; i++){
|
|
228
|
+
const folderResult = parseFolder(buf, offset);
|
|
229
229
|
folders.push(folderResult.folder);
|
|
230
230
|
offset = folderResult.offset;
|
|
231
231
|
}
|
|
232
232
|
} else if (propertyId === PropertyId.kCodersUnpackSize) {
|
|
233
233
|
// Unpack sizes for each coder output
|
|
234
|
-
for(
|
|
235
|
-
|
|
234
|
+
for(let j = 0; j < folders.length; j++){
|
|
235
|
+
const folder = folders[j];
|
|
236
236
|
folder.unpackSizes = [];
|
|
237
237
|
// One unpack size per coder output stream
|
|
238
|
-
|
|
239
|
-
for(
|
|
238
|
+
let numOutputs = 0;
|
|
239
|
+
for(let k = 0; k < folder.coders.length; k++){
|
|
240
240
|
numOutputs += folder.coders[k].numOutStreams;
|
|
241
241
|
}
|
|
242
|
-
for(
|
|
243
|
-
|
|
242
|
+
for(let l = 0; l < numOutputs; l++){
|
|
243
|
+
const sizeResult = readNumber(buf, offset);
|
|
244
244
|
folder.unpackSizes.push(sizeResult.value);
|
|
245
245
|
offset += sizeResult.bytesRead;
|
|
246
246
|
}
|
|
247
247
|
}
|
|
248
248
|
} else if (propertyId === PropertyId.kCRC) {
|
|
249
249
|
// CRCs for folders
|
|
250
|
-
|
|
250
|
+
const definedResult = readDefinedVector(buf, offset, folders.length);
|
|
251
251
|
offset += definedResult.bytesRead;
|
|
252
|
-
for(
|
|
252
|
+
for(let m = 0; m < folders.length; m++){
|
|
253
253
|
folders[m].hasCRC = definedResult.defined[m];
|
|
254
254
|
if (definedResult.defined[m]) {
|
|
255
255
|
folders[m].unpackCRC = buf.readUInt32LE(offset);
|
|
@@ -267,35 +267,35 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
267
267
|
* Parse a single Folder structure
|
|
268
268
|
*/ function parseFolder(buf, offset) {
|
|
269
269
|
// Number of coders
|
|
270
|
-
|
|
271
|
-
|
|
270
|
+
const numCodersResult = readNumber(buf, offset);
|
|
271
|
+
const numCoders = numCodersResult.value;
|
|
272
272
|
offset += numCodersResult.bytesRead;
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
for(
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
273
|
+
const coders = [];
|
|
274
|
+
let numInStreamsTotal = 0;
|
|
275
|
+
let numOutStreamsTotal = 0;
|
|
276
|
+
for(let i = 0; i < numCoders; i++){
|
|
277
|
+
const flags = buf[offset++];
|
|
278
|
+
const idSize = flags & 0x0f;
|
|
279
|
+
const isComplex = (flags & 0x10) !== 0;
|
|
280
|
+
const hasAttributes = (flags & 0x20) !== 0;
|
|
281
281
|
// Read codec ID
|
|
282
|
-
|
|
283
|
-
for(
|
|
282
|
+
const id = [];
|
|
283
|
+
for(let j = 0; j < idSize; j++){
|
|
284
284
|
id.push(buf[offset++]);
|
|
285
285
|
}
|
|
286
|
-
|
|
287
|
-
|
|
286
|
+
let numInStreams = 1;
|
|
287
|
+
let numOutStreams = 1;
|
|
288
288
|
if (isComplex) {
|
|
289
|
-
|
|
289
|
+
const inResult = readNumber(buf, offset);
|
|
290
290
|
numInStreams = inResult.value;
|
|
291
291
|
offset += inResult.bytesRead;
|
|
292
|
-
|
|
292
|
+
const outResult = readNumber(buf, offset);
|
|
293
293
|
numOutStreams = outResult.value;
|
|
294
294
|
offset += outResult.bytesRead;
|
|
295
295
|
}
|
|
296
|
-
|
|
296
|
+
let properties;
|
|
297
297
|
if (hasAttributes) {
|
|
298
|
-
|
|
298
|
+
const propsLenResult = readNumber(buf, offset);
|
|
299
299
|
offset += propsLenResult.bytesRead;
|
|
300
300
|
properties = buf.slice(offset, offset + propsLenResult.value);
|
|
301
301
|
offset += propsLenResult.value;
|
|
@@ -310,12 +310,12 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
310
310
|
numOutStreamsTotal += numOutStreams;
|
|
311
311
|
}
|
|
312
312
|
// Bind pairs
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
for(
|
|
316
|
-
|
|
313
|
+
const numBindPairs = numOutStreamsTotal - 1;
|
|
314
|
+
const bindPairs = [];
|
|
315
|
+
for(let k = 0; k < numBindPairs; k++){
|
|
316
|
+
const inIndexResult = readNumber(buf, offset);
|
|
317
317
|
offset += inIndexResult.bytesRead;
|
|
318
|
-
|
|
318
|
+
const outIndexResult = readNumber(buf, offset);
|
|
319
319
|
offset += outIndexResult.bytesRead;
|
|
320
320
|
bindPairs.push({
|
|
321
321
|
inIndex: inIndexResult.value,
|
|
@@ -323,13 +323,13 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
323
323
|
});
|
|
324
324
|
}
|
|
325
325
|
// Packed stream indices
|
|
326
|
-
|
|
327
|
-
|
|
326
|
+
const numPackedStreams = numInStreamsTotal - numBindPairs;
|
|
327
|
+
const packedStreams = [];
|
|
328
328
|
if (numPackedStreams === 1) {
|
|
329
329
|
// Find the unbound input stream
|
|
330
|
-
for(
|
|
331
|
-
|
|
332
|
-
for(
|
|
330
|
+
for(let m = 0; m < numInStreamsTotal; m++){
|
|
331
|
+
let isBound = false;
|
|
332
|
+
for(let n = 0; n < bindPairs.length; n++){
|
|
333
333
|
if (bindPairs[n].inIndex === m) {
|
|
334
334
|
isBound = true;
|
|
335
335
|
break;
|
|
@@ -341,8 +341,8 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
341
341
|
}
|
|
342
342
|
}
|
|
343
343
|
} else {
|
|
344
|
-
for(
|
|
345
|
-
|
|
344
|
+
for(let p = 0; p < numPackedStreams; p++){
|
|
345
|
+
const indexResult = readNumber(buf, offset);
|
|
346
346
|
packedStreams.push(indexResult.value);
|
|
347
347
|
offset += indexResult.bytesRead;
|
|
348
348
|
}
|
|
@@ -361,32 +361,32 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
361
361
|
/**
|
|
362
362
|
* Parse SubStreamsInfo block
|
|
363
363
|
*/ function parseSubStreamsInfo(buf, offset, folders) {
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
364
|
+
const numUnpackStreamsPerFolder = [];
|
|
365
|
+
const unpackSizes = [];
|
|
366
|
+
let unpackCRCs;
|
|
367
367
|
// Default: 1 file per folder
|
|
368
|
-
for(
|
|
368
|
+
for(let i = 0; i < folders.length; i++){
|
|
369
369
|
numUnpackStreamsPerFolder.push(1);
|
|
370
370
|
}
|
|
371
371
|
while(offset < buf.length){
|
|
372
|
-
|
|
372
|
+
const propertyId = buf[offset++];
|
|
373
373
|
if (propertyId === PropertyId.kEnd) {
|
|
374
374
|
break;
|
|
375
375
|
}
|
|
376
376
|
if (propertyId === PropertyId.kNumUnpackStream) {
|
|
377
|
-
for(
|
|
378
|
-
|
|
377
|
+
for(let j = 0; j < folders.length; j++){
|
|
378
|
+
const numResult = readNumber(buf, offset);
|
|
379
379
|
numUnpackStreamsPerFolder[j] = numResult.value;
|
|
380
380
|
offset += numResult.bytesRead;
|
|
381
381
|
}
|
|
382
382
|
} else if (propertyId === PropertyId.kSize) {
|
|
383
|
-
for(
|
|
384
|
-
|
|
383
|
+
for(let k = 0; k < folders.length; k++){
|
|
384
|
+
const numStreams = numUnpackStreamsPerFolder[k];
|
|
385
385
|
if (numStreams === 0) continue;
|
|
386
386
|
// Read sizes for all but last stream in folder (last is calculated)
|
|
387
|
-
|
|
388
|
-
for(
|
|
389
|
-
|
|
387
|
+
let remaining = folders[k].unpackSizes[folders[k].unpackSizes.length - 1];
|
|
388
|
+
for(let l = 0; l < numStreams - 1; l++){
|
|
389
|
+
const sizeResult = readNumber(buf, offset);
|
|
390
390
|
unpackSizes.push(sizeResult.value);
|
|
391
391
|
remaining -= sizeResult.value;
|
|
392
392
|
offset += sizeResult.bytesRead;
|
|
@@ -396,18 +396,18 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
396
396
|
}
|
|
397
397
|
} else if (propertyId === PropertyId.kCRC) {
|
|
398
398
|
// Count files that need CRC
|
|
399
|
-
|
|
400
|
-
for(
|
|
401
|
-
|
|
399
|
+
let numFiles = 0;
|
|
400
|
+
for(let m = 0; m < folders.length; m++){
|
|
401
|
+
const numStreamsInFolder = numUnpackStreamsPerFolder[m];
|
|
402
402
|
// Only count if folder doesn't have CRC or has multiple streams
|
|
403
403
|
if (!folders[m].hasCRC || numStreamsInFolder > 1) {
|
|
404
404
|
numFiles += numStreamsInFolder;
|
|
405
405
|
}
|
|
406
406
|
}
|
|
407
407
|
unpackCRCs = [];
|
|
408
|
-
|
|
408
|
+
const definedResult = readDefinedVector(buf, offset, numFiles);
|
|
409
409
|
offset += definedResult.bytesRead;
|
|
410
|
-
for(
|
|
410
|
+
for(let n = 0; n < numFiles; n++){
|
|
411
411
|
if (definedResult.defined[n]) {
|
|
412
412
|
unpackCRCs.push(buf.readUInt32LE(offset));
|
|
413
413
|
offset += 4;
|
|
@@ -419,8 +419,8 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
419
419
|
}
|
|
420
420
|
// If no sizes specified, use folder unpack sizes
|
|
421
421
|
if (unpackSizes.length === 0) {
|
|
422
|
-
for(
|
|
423
|
-
|
|
422
|
+
for(let p = 0; p < folders.length; p++){
|
|
423
|
+
const folder = folders[p];
|
|
424
424
|
unpackSizes.push(folder.unpackSizes[folder.unpackSizes.length - 1]);
|
|
425
425
|
}
|
|
426
426
|
}
|
|
@@ -435,12 +435,12 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
435
435
|
* Parse FilesInfo block
|
|
436
436
|
*/ function parseFilesInfo(buf, offset) {
|
|
437
437
|
// Number of files
|
|
438
|
-
|
|
439
|
-
|
|
438
|
+
const numFilesResult = readNumber(buf, offset);
|
|
439
|
+
const numFiles = numFilesResult.value;
|
|
440
440
|
offset += numFilesResult.bytesRead;
|
|
441
441
|
// Initialize files array
|
|
442
|
-
|
|
443
|
-
for(
|
|
442
|
+
const files = [];
|
|
443
|
+
for(let i = 0; i < numFiles; i++){
|
|
444
444
|
files.push({
|
|
445
445
|
name: '',
|
|
446
446
|
size: 0,
|
|
@@ -449,30 +449,30 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
449
449
|
hasStream: true
|
|
450
450
|
});
|
|
451
451
|
}
|
|
452
|
-
|
|
453
|
-
|
|
452
|
+
let emptyStreamFlags = [];
|
|
453
|
+
let emptyFileFlags = [];
|
|
454
454
|
while(offset < buf.length){
|
|
455
|
-
|
|
455
|
+
const propertyId = buf[offset++];
|
|
456
456
|
if (propertyId === PropertyId.kEnd) {
|
|
457
457
|
break;
|
|
458
458
|
}
|
|
459
459
|
// Read property size
|
|
460
|
-
|
|
461
|
-
|
|
460
|
+
const propSizeResult = readNumber(buf, offset);
|
|
461
|
+
const propSize = propSizeResult.value;
|
|
462
462
|
offset += propSizeResult.bytesRead;
|
|
463
|
-
|
|
463
|
+
const propEnd = offset + propSize;
|
|
464
464
|
switch(propertyId){
|
|
465
465
|
case PropertyId.kEmptyStream:
|
|
466
466
|
emptyStreamFlags = readBoolVector(buf, offset, numFiles);
|
|
467
467
|
// Mark files that don't have streams
|
|
468
|
-
for(
|
|
468
|
+
for(let j = 0; j < numFiles; j++){
|
|
469
469
|
files[j].hasStream = !emptyStreamFlags[j];
|
|
470
470
|
}
|
|
471
471
|
break;
|
|
472
472
|
case PropertyId.kEmptyFile:
|
|
473
473
|
{
|
|
474
|
-
|
|
475
|
-
for(
|
|
474
|
+
let numEmptyStreams = 0;
|
|
475
|
+
for(let k = 0; k < emptyStreamFlags.length; k++){
|
|
476
476
|
if (emptyStreamFlags[k]) numEmptyStreams++;
|
|
477
477
|
}
|
|
478
478
|
emptyFileFlags = readBoolVector(buf, offset, numEmptyStreams);
|
|
@@ -480,13 +480,13 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
480
480
|
}
|
|
481
481
|
case PropertyId.kAnti:
|
|
482
482
|
{
|
|
483
|
-
|
|
484
|
-
for(
|
|
483
|
+
let numAnti = 0;
|
|
484
|
+
for(let l = 0; l < emptyStreamFlags.length; l++){
|
|
485
485
|
if (emptyStreamFlags[l]) numAnti++;
|
|
486
486
|
}
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
for(
|
|
487
|
+
const antiFlags = readBoolVector(buf, offset, numAnti);
|
|
488
|
+
let antiIdx = 0;
|
|
489
|
+
for(let m = 0; m < numFiles; m++){
|
|
490
490
|
if (emptyStreamFlags[m]) {
|
|
491
491
|
files[m].isAntiFile = antiFlags[antiIdx++];
|
|
492
492
|
}
|
|
@@ -516,8 +516,8 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
516
516
|
offset = propEnd;
|
|
517
517
|
}
|
|
518
518
|
// Determine directories from empty stream + not empty file
|
|
519
|
-
|
|
520
|
-
for(
|
|
519
|
+
let emptyIdx = 0;
|
|
520
|
+
for(let n = 0; n < numFiles; n++){
|
|
521
521
|
if (emptyStreamFlags[n]) {
|
|
522
522
|
// Empty stream - could be directory or empty file
|
|
523
523
|
if (emptyIdx < emptyFileFlags.length && emptyFileFlags[emptyIdx]) {
|
|
@@ -536,10 +536,10 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
536
536
|
/**
|
|
537
537
|
* Read a boolean vector (bit-packed)
|
|
538
538
|
*/ function readBoolVector(buf, offset, count) {
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
for(
|
|
539
|
+
const result = [];
|
|
540
|
+
let byteIdx = 0;
|
|
541
|
+
let bitMask = 0x80;
|
|
542
|
+
for(let i = 0; i < count; i++){
|
|
543
543
|
result.push((buf[offset + byteIdx] & bitMask) !== 0);
|
|
544
544
|
bitMask = bitMask >>> 1;
|
|
545
545
|
if (bitMask === 0) {
|
|
@@ -553,15 +553,15 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
553
553
|
* Parse file names (UTF-16LE encoded)
|
|
554
554
|
*/ function parseFileNames(buf, offset, files) {
|
|
555
555
|
// External flag
|
|
556
|
-
|
|
556
|
+
const external = buf[offset++];
|
|
557
557
|
if (external !== 0) {
|
|
558
558
|
throw createCodedError('External file names not supported', ErrorCode.CORRUPT_HEADER);
|
|
559
559
|
}
|
|
560
560
|
// Names are UTF-16LE, null-terminated
|
|
561
|
-
for(
|
|
562
|
-
|
|
561
|
+
for(let i = 0; i < files.length; i++){
|
|
562
|
+
const nameChars = [];
|
|
563
563
|
while(offset < buf.length){
|
|
564
|
-
|
|
564
|
+
const charCode = buf.readUInt16LE(offset);
|
|
565
565
|
offset += 2;
|
|
566
566
|
if (charCode === 0) break;
|
|
567
567
|
nameChars.push(charCode);
|
|
@@ -574,23 +574,23 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
574
574
|
* Parse file times (Windows FILETIME format)
|
|
575
575
|
*/ function parseFileTimes(buf, offset, files, timeType) {
|
|
576
576
|
// Read defined vector (allDefined byte + optional bitmask)
|
|
577
|
-
|
|
577
|
+
const definedResult = readDefinedVector(buf, offset, files.length);
|
|
578
578
|
offset += definedResult.bytesRead;
|
|
579
579
|
// External flag - 0x00 means data follows inline, non-zero means external stream
|
|
580
|
-
|
|
580
|
+
const external = buf[offset++];
|
|
581
581
|
if (external !== 0) {
|
|
582
582
|
throw createCodedError('External file times not supported', ErrorCode.UNSUPPORTED_FEATURE);
|
|
583
583
|
}
|
|
584
584
|
// Read times
|
|
585
|
-
for(
|
|
585
|
+
for(let i = 0; i < files.length; i++){
|
|
586
586
|
if (definedResult.defined[i]) {
|
|
587
|
-
|
|
587
|
+
const filetime = readUInt64LE(buf, offset);
|
|
588
588
|
offset += 8;
|
|
589
589
|
// Convert FILETIME (100ns since 1601) to JavaScript Date
|
|
590
590
|
// FILETIME epoch: 1601-01-01
|
|
591
591
|
// JS Date epoch: 1970-01-01
|
|
592
592
|
// Difference: 11644473600 seconds
|
|
593
|
-
|
|
593
|
+
const ms = filetime / 10000 - 11644473600000;
|
|
594
594
|
files[i][timeType] = new Date(ms);
|
|
595
595
|
}
|
|
596
596
|
}
|
|
@@ -600,15 +600,15 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
600
600
|
* Parse Windows file attributes
|
|
601
601
|
*/ function parseAttributes(buf, offset, files) {
|
|
602
602
|
// Read defined vector (allDefined byte + optional bitmask)
|
|
603
|
-
|
|
603
|
+
const definedResult = readDefinedVector(buf, offset, files.length);
|
|
604
604
|
offset += definedResult.bytesRead;
|
|
605
605
|
// External flag - 0x00 means data follows inline, non-zero means external stream
|
|
606
|
-
|
|
606
|
+
const external = buf[offset++];
|
|
607
607
|
if (external !== 0) {
|
|
608
608
|
throw createCodedError('External file attributes not supported', ErrorCode.UNSUPPORTED_FEATURE);
|
|
609
609
|
}
|
|
610
610
|
// Read attributes
|
|
611
|
-
for(
|
|
611
|
+
for(let i = 0; i < files.length; i++){
|
|
612
612
|
if (definedResult.defined[i]) {
|
|
613
613
|
files[i].attributes = buf.readUInt32LE(offset);
|
|
614
614
|
offset += 4;
|
|
@@ -620,11 +620,11 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
620
620
|
* Skip archive properties block
|
|
621
621
|
*/ function skipArchiveProperties(buf, offset) {
|
|
622
622
|
while(offset < buf.length){
|
|
623
|
-
|
|
623
|
+
const propertyId = buf[offset++];
|
|
624
624
|
if (propertyId === PropertyId.kEnd) {
|
|
625
625
|
break;
|
|
626
626
|
}
|
|
627
|
-
|
|
627
|
+
const sizeResult = readNumber(buf, offset);
|
|
628
628
|
offset += sizeResult.bytesRead + sizeResult.value;
|
|
629
629
|
}
|
|
630
630
|
return offset;
|
|
@@ -633,7 +633,7 @@ import { readDefinedVector, readNumber } from './NumberCodec.js';
|
|
|
633
633
|
* Skip streams info block (for additional streams)
|
|
634
634
|
*/ function skipStreamsInfo(buf, offset) {
|
|
635
635
|
while(offset < buf.length){
|
|
636
|
-
|
|
636
|
+
const propertyId = buf[offset++];
|
|
637
637
|
if (propertyId === PropertyId.kEnd) {
|
|
638
638
|
break;
|
|
639
639
|
}
|