@zip.js/zip.js 2.5.23 → 2.5.24
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/z-worker-fflate.js +1 -1
- package/dist/z-worker-pako.js +1 -1
- package/dist/zip-fs-full.js +65 -36
- package/dist/zip-fs-full.min.js +1 -1
- package/dist/zip-fs.js +65 -36
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-full.js +65 -36
- package/dist/zip-full.min.js +1 -1
- package/dist/zip-no-worker-deflate.min.js +1 -1
- package/dist/zip-no-worker-inflate.min.js +1 -1
- package/dist/zip-no-worker.min.js +1 -1
- package/dist/zip.js +65 -36
- package/dist/zip.min.js +1 -1
- package/lib/core/io.js +4 -3
- package/lib/core/util/stream-codec-shim.js +3 -4
- package/lib/core/zip-reader.js +2 -2
- package/lib/core/zip-writer.js +59 -28
- package/package.json +1 -1
package/dist/zip.js
CHANGED
|
@@ -192,14 +192,13 @@
|
|
|
192
192
|
if (codecAdapter.pendingData) {
|
|
193
193
|
const { pendingData } = codecAdapter;
|
|
194
194
|
codecAdapter.pendingData = new Uint8Array(pendingData.length + data.length);
|
|
195
|
-
|
|
196
|
-
|
|
195
|
+
pendingData.set(pendingData, 0);
|
|
196
|
+
pendingData.set(data, pendingData.length);
|
|
197
197
|
} else {
|
|
198
198
|
codecAdapter.pendingData = new Uint8Array(data);
|
|
199
199
|
}
|
|
200
200
|
};
|
|
201
|
-
|
|
202
|
-
if (options.hasOwnProperty("level") && options.level === undefined) {
|
|
201
|
+
if (Object.hasOwn(options, "level") && options.level === undefined) {
|
|
203
202
|
delete options.level;
|
|
204
203
|
}
|
|
205
204
|
codecAdapter.codec = new constructor(Object.assign({}, constructorOptions, options));
|
|
@@ -2256,12 +2255,13 @@
|
|
|
2256
2255
|
|
|
2257
2256
|
get readable() {
|
|
2258
2257
|
const reader = this;
|
|
2258
|
+
const { chunkSize = DEFAULT_CHUNK_SIZE } = reader;
|
|
2259
2259
|
const readable = new ReadableStream({
|
|
2260
2260
|
start() {
|
|
2261
2261
|
this.chunkOffset = 0;
|
|
2262
2262
|
},
|
|
2263
2263
|
async pull(controller) {
|
|
2264
|
-
const { offset = 0,
|
|
2264
|
+
const { offset = 0, size } = readable;
|
|
2265
2265
|
const { chunkOffset } = this;
|
|
2266
2266
|
controller.enqueue(await reader.readUint8Array(offset + chunkOffset, Math.min(chunkSize, size() - chunkOffset)));
|
|
2267
2267
|
if (chunkOffset + chunkSize > size()) {
|
|
@@ -2621,7 +2621,7 @@
|
|
|
2621
2621
|
if (response.status < 400) {
|
|
2622
2622
|
return response;
|
|
2623
2623
|
} else {
|
|
2624
|
-
throw new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
|
|
2624
|
+
throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
|
|
2625
2625
|
}
|
|
2626
2626
|
}
|
|
2627
2627
|
|
|
@@ -2642,7 +2642,7 @@
|
|
|
2642
2642
|
headers: new Map(headers)
|
|
2643
2643
|
});
|
|
2644
2644
|
} else {
|
|
2645
|
-
reject(new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
|
|
2645
|
+
reject(request.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
|
|
2646
2646
|
}
|
|
2647
2647
|
}, false);
|
|
2648
2648
|
request.addEventListener("error", event => reject(event.detail.error), false);
|
|
@@ -2979,6 +2979,7 @@
|
|
|
2979
2979
|
if (!reader.initialized) {
|
|
2980
2980
|
await reader.init();
|
|
2981
2981
|
}
|
|
2982
|
+
reader.chunkSize = getChunkSize(config);
|
|
2982
2983
|
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
2983
2984
|
throw new Error(ERR_BAD_FORMAT);
|
|
2984
2985
|
}
|
|
@@ -3097,7 +3098,7 @@
|
|
|
3097
3098
|
if (extractPrependedData) {
|
|
3098
3099
|
zipReader.prependedData = await readUint8Array(reader, 0, startOffset);
|
|
3099
3100
|
}
|
|
3100
|
-
zipReader.comment = await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength);
|
|
3101
|
+
zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : new Uint8Array();
|
|
3101
3102
|
if (extractAppendedData) {
|
|
3102
3103
|
zipReader.appendedData = appendedDataOffset < reader.size ? await readUint8Array(reader, appendedDataOffset, reader.size - appendedDataOffset) : new Uint8Array();
|
|
3103
3104
|
}
|
|
@@ -3175,7 +3176,6 @@
|
|
|
3175
3176
|
const readable = reader.readable;
|
|
3176
3177
|
readable.offset = dataOffset;
|
|
3177
3178
|
readable.size = size;
|
|
3178
|
-
readable.chunkSize = getChunkSize(config);
|
|
3179
3179
|
const { writable } = writer;
|
|
3180
3180
|
const signal = getOptionValue$1(zipEntry, options, "signal");
|
|
3181
3181
|
if (writer.init && !writer.initialized) {
|
|
@@ -3526,17 +3526,22 @@
|
|
|
3526
3526
|
|
|
3527
3527
|
async add(name = "", reader, options = {}) {
|
|
3528
3528
|
const zipWriter = this;
|
|
3529
|
-
|
|
3529
|
+
const {
|
|
3530
|
+
pendingAddFileCalls,
|
|
3531
|
+
pendingEntries,
|
|
3532
|
+
config
|
|
3533
|
+
} = zipWriter;
|
|
3534
|
+
if (workers < config.maxWorkers) {
|
|
3530
3535
|
workers++;
|
|
3531
3536
|
let promiseAddFile;
|
|
3532
3537
|
try {
|
|
3533
3538
|
promiseAddFile = addFile(zipWriter, name, reader, options);
|
|
3534
|
-
|
|
3539
|
+
pendingAddFileCalls.add(promiseAddFile);
|
|
3535
3540
|
return await promiseAddFile;
|
|
3536
3541
|
} finally {
|
|
3537
|
-
|
|
3542
|
+
pendingAddFileCalls.delete(promiseAddFile);
|
|
3538
3543
|
workers--;
|
|
3539
|
-
const pendingEntry =
|
|
3544
|
+
const pendingEntry = pendingEntries.shift();
|
|
3540
3545
|
if (pendingEntry) {
|
|
3541
3546
|
zipWriter.add(pendingEntry.name, pendingEntry.reader, pendingEntry.options)
|
|
3542
3547
|
.then(pendingEntry.resolve)
|
|
@@ -3544,7 +3549,7 @@
|
|
|
3544
3549
|
}
|
|
3545
3550
|
}
|
|
3546
3551
|
} else {
|
|
3547
|
-
return new Promise((resolve, reject) =>
|
|
3552
|
+
return new Promise((resolve, reject) => pendingEntries.push({ name, reader, options, resolve, reject }));
|
|
3548
3553
|
}
|
|
3549
3554
|
}
|
|
3550
3555
|
|
|
@@ -3704,22 +3709,31 @@
|
|
|
3704
3709
|
}
|
|
3705
3710
|
|
|
3706
3711
|
async function getFileEntry(zipWriter, name, reader, options) {
|
|
3707
|
-
const {
|
|
3712
|
+
const {
|
|
3713
|
+
files,
|
|
3714
|
+
writer
|
|
3715
|
+
} = zipWriter;
|
|
3716
|
+
const {
|
|
3717
|
+
keepOrder,
|
|
3718
|
+
dataDescriptor,
|
|
3719
|
+
zipCrypto,
|
|
3720
|
+
signal
|
|
3721
|
+
} = options;
|
|
3708
3722
|
const previousFileEntry = Array.from(files.values()).pop();
|
|
3709
3723
|
let fileEntry = {};
|
|
3710
3724
|
let bufferedWrite;
|
|
3711
3725
|
let releaseLockWriter;
|
|
3712
|
-
let
|
|
3713
|
-
let
|
|
3726
|
+
let releaseLockCurrentFileEntry;
|
|
3727
|
+
let bufferedDataWritten;
|
|
3714
3728
|
let fileWriter;
|
|
3715
3729
|
files.set(name, fileEntry);
|
|
3716
3730
|
try {
|
|
3717
3731
|
let lockPreviousFileEntry;
|
|
3718
|
-
if (
|
|
3732
|
+
if (keepOrder) {
|
|
3719
3733
|
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
|
|
3734
|
+
requestLockCurrentFileEntry();
|
|
3720
3735
|
}
|
|
3721
|
-
|
|
3722
|
-
if (options.bufferedWrite || zipWriter.lockWriter || !options.dataDescriptor) {
|
|
3736
|
+
if (options.bufferedWrite || zipWriter.lockWriter || !dataDescriptor) {
|
|
3723
3737
|
fileWriter = new BlobWriter();
|
|
3724
3738
|
fileWriter.init();
|
|
3725
3739
|
bufferedWrite = true;
|
|
@@ -3736,14 +3750,14 @@
|
|
|
3736
3750
|
if (bufferedWrite) {
|
|
3737
3751
|
let blob = fileWriter.getData();
|
|
3738
3752
|
await lockPreviousFileEntry;
|
|
3739
|
-
await
|
|
3740
|
-
|
|
3753
|
+
await requestLockWriter();
|
|
3754
|
+
bufferedDataWritten = true;
|
|
3741
3755
|
const { writable } = writer;
|
|
3742
|
-
if (!
|
|
3756
|
+
if (!dataDescriptor) {
|
|
3743
3757
|
const headerLength = 26;
|
|
3744
3758
|
const arrayBuffer = await sliceAsArrayBuffer(blob, 0, headerLength);
|
|
3745
3759
|
const arrayBufferView = new DataView(arrayBuffer);
|
|
3746
|
-
if (!fileEntry.encrypted ||
|
|
3760
|
+
if (!fileEntry.encrypted || zipCrypto) {
|
|
3747
3761
|
setUint32(arrayBufferView, 14, fileEntry.signature);
|
|
3748
3762
|
}
|
|
3749
3763
|
if (fileEntry.zip64) {
|
|
@@ -3756,8 +3770,8 @@
|
|
|
3756
3770
|
await writeUint8Array(writable, new Uint8Array(arrayBuffer));
|
|
3757
3771
|
blob = blob.slice(headerLength);
|
|
3758
3772
|
}
|
|
3759
|
-
await blob.stream().pipeTo(writable, { preventClose: true });
|
|
3760
|
-
|
|
3773
|
+
await blob.stream().pipeTo(writable, { preventClose: true, signal });
|
|
3774
|
+
bufferedDataWritten = false;
|
|
3761
3775
|
}
|
|
3762
3776
|
fileEntry.offset = zipWriter.offset;
|
|
3763
3777
|
if (fileEntry.zip64) {
|
|
@@ -3769,23 +3783,30 @@
|
|
|
3769
3783
|
zipWriter.offset += fileEntry.length;
|
|
3770
3784
|
return fileEntry;
|
|
3771
3785
|
} catch (error) {
|
|
3772
|
-
if ((bufferedWrite &&
|
|
3786
|
+
if ((bufferedWrite && bufferedDataWritten) || (!bufferedWrite && fileEntry.dataWritten)) {
|
|
3773
3787
|
error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
|
|
3774
3788
|
zipWriter.offset += fileWriter.size;
|
|
3775
3789
|
}
|
|
3776
3790
|
files.delete(name);
|
|
3777
3791
|
throw error;
|
|
3778
3792
|
} finally {
|
|
3779
|
-
|
|
3793
|
+
if (releaseLockCurrentFileEntry) {
|
|
3794
|
+
releaseLockCurrentFileEntry();
|
|
3795
|
+
}
|
|
3780
3796
|
if (releaseLockWriter) {
|
|
3781
3797
|
releaseLockWriter();
|
|
3782
3798
|
}
|
|
3783
3799
|
}
|
|
3784
3800
|
|
|
3785
|
-
|
|
3786
|
-
|
|
3787
|
-
|
|
3788
|
-
|
|
3801
|
+
function requestLockCurrentFileEntry() {
|
|
3802
|
+
fileEntry.lock = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
|
|
3803
|
+
}
|
|
3804
|
+
|
|
3805
|
+
async function requestLockWriter() {
|
|
3806
|
+
const { lockWriter } = zipWriter;
|
|
3807
|
+
if (lockWriter) {
|
|
3808
|
+
await lockWriter.then(() => delete zipWriter.lockWriter);
|
|
3809
|
+
return requestLockWriter();
|
|
3789
3810
|
} else {
|
|
3790
3811
|
zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
|
|
3791
3812
|
}
|
|
@@ -3927,7 +3948,7 @@
|
|
|
3927
3948
|
const rawLastModDate = dateArray[0];
|
|
3928
3949
|
setUint32(headerView, 6, rawLastModDate);
|
|
3929
3950
|
setUint16(headerView, 22, rawFilename.length);
|
|
3930
|
-
const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length +
|
|
3951
|
+
const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + rawExtraField.length;
|
|
3931
3952
|
setUint16(headerView, 24, extraFieldLength);
|
|
3932
3953
|
const localHeaderArray = new Uint8Array(30 + rawFilename.length + extraFieldLength);
|
|
3933
3954
|
const localHeaderView = getDataView(localHeaderArray);
|
|
@@ -3937,16 +3958,16 @@
|
|
|
3937
3958
|
arraySet(localHeaderArray, rawExtraFieldAES, 30 + rawFilename.length);
|
|
3938
3959
|
arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, 30 + rawFilename.length + rawExtraFieldAES.length);
|
|
3939
3960
|
arraySet(localHeaderArray, rawExtraFieldNTFS, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length);
|
|
3940
|
-
arraySet(localHeaderArray,
|
|
3961
|
+
arraySet(localHeaderArray, rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
|
|
3941
3962
|
let result;
|
|
3942
3963
|
let compressedSize = 0;
|
|
3943
3964
|
if (reader) {
|
|
3965
|
+
reader.chunkSize = getChunkSize(config);
|
|
3944
3966
|
await writeUint8Array(writable, localHeaderArray);
|
|
3945
3967
|
fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
|
|
3946
3968
|
const size = () => reader.size;
|
|
3947
3969
|
const readable = reader.readable;
|
|
3948
3970
|
readable.size = size;
|
|
3949
|
-
readable.chunkSize = getChunkSize(config);
|
|
3950
3971
|
const workerOptions = {
|
|
3951
3972
|
options: {
|
|
3952
3973
|
codecType: CODEC_DEFLATE,
|
|
@@ -4016,7 +4037,15 @@
|
|
|
4016
4037
|
await writeUint8Array(writable, dataDescriptorArray);
|
|
4017
4038
|
}
|
|
4018
4039
|
const length = localHeaderArray.length + compressedSize + dataDescriptorArray.length;
|
|
4019
|
-
Object.assign(fileEntry, {
|
|
4040
|
+
Object.assign(fileEntry, {
|
|
4041
|
+
compressedSize,
|
|
4042
|
+
lastModDate,
|
|
4043
|
+
rawLastModDate,
|
|
4044
|
+
creationDate,
|
|
4045
|
+
lastAccessDate,
|
|
4046
|
+
encrypted,
|
|
4047
|
+
length
|
|
4048
|
+
});
|
|
4020
4049
|
return fileEntry;
|
|
4021
4050
|
}
|
|
4022
4051
|
|