@zip.js/zip.js 2.5.22 → 2.5.25
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 +72 -45
- package/dist/zip-fs-full.min.js +1 -1
- package/dist/zip-fs.js +72 -45
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-full.js +72 -45
- 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 +72 -45
- 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 +3 -3
- package/lib/core/zip-writer.js +59 -28
- package/package.json +1 -1
package/dist/zip-fs.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
|
}
|
|
@@ -3095,9 +3096,9 @@
|
|
|
3095
3096
|
const extractPrependedData = getOptionValue$1(zipReader, options, "extractPrependedData");
|
|
3096
3097
|
const extractAppendedData = getOptionValue$1(zipReader, options, "extractAppendedData");
|
|
3097
3098
|
if (extractPrependedData) {
|
|
3098
|
-
zipReader.prependedData = await readUint8Array(reader, 0, startOffset);
|
|
3099
|
+
zipReader.prependedData = startOffset > 0 ? await readUint8Array(reader, 0, startOffset) : new Uint8Array();
|
|
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;
|
|
3728
|
+
let fileWriter;
|
|
3714
3729
|
files.set(name, fileEntry);
|
|
3715
3730
|
try {
|
|
3716
3731
|
let lockPreviousFileEntry;
|
|
3717
|
-
|
|
3718
|
-
if (options.keepOrder) {
|
|
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;
|
|
@@ -3730,20 +3744,20 @@
|
|
|
3730
3744
|
}
|
|
3731
3745
|
fileWriter = writer;
|
|
3732
3746
|
}
|
|
3733
|
-
fileEntry = await createFileEntry(reader, fileWriter.writable, zipWriter.config, options);
|
|
3747
|
+
fileEntry = await createFileEntry(reader, fileEntry, fileWriter.writable, zipWriter.config, options);
|
|
3734
3748
|
files.set(name, fileEntry);
|
|
3735
3749
|
fileEntry.filename = name;
|
|
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,32 +3783,37 @@
|
|
|
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
|
-
|
|
3775
|
-
zipWriter.offset += fileEntry.uncompressedSize;
|
|
3776
|
-
}
|
|
3788
|
+
zipWriter.offset += fileWriter.size;
|
|
3777
3789
|
}
|
|
3778
3790
|
files.delete(name);
|
|
3779
3791
|
throw error;
|
|
3780
3792
|
} finally {
|
|
3781
|
-
|
|
3793
|
+
if (releaseLockCurrentFileEntry) {
|
|
3794
|
+
releaseLockCurrentFileEntry();
|
|
3795
|
+
}
|
|
3782
3796
|
if (releaseLockWriter) {
|
|
3783
3797
|
releaseLockWriter();
|
|
3784
3798
|
}
|
|
3785
3799
|
}
|
|
3786
3800
|
|
|
3787
|
-
|
|
3788
|
-
|
|
3789
|
-
|
|
3790
|
-
|
|
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();
|
|
3791
3810
|
} else {
|
|
3792
3811
|
zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
|
|
3793
3812
|
}
|
|
3794
3813
|
}
|
|
3795
3814
|
}
|
|
3796
3815
|
|
|
3797
|
-
async function createFileEntry(reader, writable, config, options) {
|
|
3816
|
+
async function createFileEntry(reader, pendingFileEntry, writable, config, options) {
|
|
3798
3817
|
const {
|
|
3799
3818
|
rawFilename,
|
|
3800
3819
|
lastAccessDate,
|
|
@@ -3929,7 +3948,7 @@
|
|
|
3929
3948
|
const rawLastModDate = dateArray[0];
|
|
3930
3949
|
setUint32(headerView, 6, rawLastModDate);
|
|
3931
3950
|
setUint16(headerView, 22, rawFilename.length);
|
|
3932
|
-
const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length +
|
|
3951
|
+
const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + rawExtraField.length;
|
|
3933
3952
|
setUint16(headerView, 24, extraFieldLength);
|
|
3934
3953
|
const localHeaderArray = new Uint8Array(30 + rawFilename.length + extraFieldLength);
|
|
3935
3954
|
const localHeaderView = getDataView(localHeaderArray);
|
|
@@ -3939,16 +3958,16 @@
|
|
|
3939
3958
|
arraySet(localHeaderArray, rawExtraFieldAES, 30 + rawFilename.length);
|
|
3940
3959
|
arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, 30 + rawFilename.length + rawExtraFieldAES.length);
|
|
3941
3960
|
arraySet(localHeaderArray, rawExtraFieldNTFS, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length);
|
|
3942
|
-
arraySet(localHeaderArray,
|
|
3961
|
+
arraySet(localHeaderArray, rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
|
|
3943
3962
|
let result;
|
|
3944
3963
|
let compressedSize = 0;
|
|
3945
3964
|
if (reader) {
|
|
3965
|
+
reader.chunkSize = getChunkSize(config);
|
|
3946
3966
|
await writeUint8Array(writable, localHeaderArray);
|
|
3947
|
-
fileEntry.dataWritten = true;
|
|
3967
|
+
fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
|
|
3948
3968
|
const size = () => reader.size;
|
|
3949
3969
|
const readable = reader.readable;
|
|
3950
3970
|
readable.size = size;
|
|
3951
|
-
readable.chunkSize = getChunkSize(config);
|
|
3952
3971
|
const workerOptions = {
|
|
3953
3972
|
options: {
|
|
3954
3973
|
codecType: CODEC_DEFLATE,
|
|
@@ -3972,7 +3991,7 @@
|
|
|
3972
3991
|
compressedSize = result.length;
|
|
3973
3992
|
} else {
|
|
3974
3993
|
await writeUint8Array(writable, localHeaderArray);
|
|
3975
|
-
fileEntry.dataWritten = true;
|
|
3994
|
+
fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
|
|
3976
3995
|
}
|
|
3977
3996
|
let dataDescriptorArray = new Uint8Array();
|
|
3978
3997
|
let dataDescriptorView, dataDescriptorOffset = 0;
|
|
@@ -4018,7 +4037,15 @@
|
|
|
4018
4037
|
await writeUint8Array(writable, dataDescriptorArray);
|
|
4019
4038
|
}
|
|
4020
4039
|
const length = localHeaderArray.length + compressedSize + dataDescriptorArray.length;
|
|
4021
|
-
Object.assign(fileEntry, {
|
|
4040
|
+
Object.assign(fileEntry, {
|
|
4041
|
+
compressedSize,
|
|
4042
|
+
lastModDate,
|
|
4043
|
+
rawLastModDate,
|
|
4044
|
+
creationDate,
|
|
4045
|
+
lastAccessDate,
|
|
4046
|
+
encrypted,
|
|
4047
|
+
length
|
|
4048
|
+
});
|
|
4022
4049
|
return fileEntry;
|
|
4023
4050
|
}
|
|
4024
4051
|
|