@zip.js/zip.js 2.5.23 → 2.5.26
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 +77 -39
- package/dist/zip-fs-full.min.js +1 -1
- package/dist/zip-fs.js +77 -39
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-full.js +77 -39
- 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 +77 -39
- package/dist/zip.min.js +1 -1
- package/lib/core/io.js +15 -5
- 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 +2 -2
- package/rollup-fflate.config.dev.js +3 -1
- package/rollup-fflate.config.js +3 -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));
|
|
@@ -2225,7 +2224,7 @@
|
|
|
2225
2224
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
2226
2225
|
*/
|
|
2227
2226
|
|
|
2228
|
-
/* global Blob, atob, btoa, XMLHttpRequest, URL, fetch, ReadableStream, WritableStream */
|
|
2227
|
+
/* global Blob, atob, btoa, XMLHttpRequest, URL, fetch, ReadableStream, WritableStream, FileReader */
|
|
2229
2228
|
|
|
2230
2229
|
const ERR_HTTP_STATUS = "HTTP error ";
|
|
2231
2230
|
const ERR_HTTP_RANGE = "HTTP Range not supported";
|
|
@@ -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()) {
|
|
@@ -2334,7 +2334,16 @@
|
|
|
2334
2334
|
|
|
2335
2335
|
getData() {
|
|
2336
2336
|
const writer = this;
|
|
2337
|
-
|
|
2337
|
+
if (writer.blob.text && (writer.encoding === undefined || (writer.encoding && writer.encoding.toLowerCase() == "utf-8"))) {
|
|
2338
|
+
return writer.blob.text();
|
|
2339
|
+
} else {
|
|
2340
|
+
const reader = new FileReader();
|
|
2341
|
+
return new Promise((resolve, reject) => {
|
|
2342
|
+
reader.onload = event => resolve(event.target.result);
|
|
2343
|
+
reader.onerror = () => reject(reader.error);
|
|
2344
|
+
reader.readAsText(writer.blob, writer.encoding);
|
|
2345
|
+
});
|
|
2346
|
+
}
|
|
2338
2347
|
}
|
|
2339
2348
|
}
|
|
2340
2349
|
|
|
@@ -2621,7 +2630,7 @@
|
|
|
2621
2630
|
if (response.status < 400) {
|
|
2622
2631
|
return response;
|
|
2623
2632
|
} else {
|
|
2624
|
-
throw new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
|
|
2633
|
+
throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
|
|
2625
2634
|
}
|
|
2626
2635
|
}
|
|
2627
2636
|
|
|
@@ -2642,7 +2651,7 @@
|
|
|
2642
2651
|
headers: new Map(headers)
|
|
2643
2652
|
});
|
|
2644
2653
|
} else {
|
|
2645
|
-
reject(new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
|
|
2654
|
+
reject(request.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
|
|
2646
2655
|
}
|
|
2647
2656
|
}, false);
|
|
2648
2657
|
request.addEventListener("error", event => reject(event.detail.error), false);
|
|
@@ -2979,6 +2988,7 @@
|
|
|
2979
2988
|
if (!reader.initialized) {
|
|
2980
2989
|
await reader.init();
|
|
2981
2990
|
}
|
|
2991
|
+
reader.chunkSize = getChunkSize(config);
|
|
2982
2992
|
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
2983
2993
|
throw new Error(ERR_BAD_FORMAT);
|
|
2984
2994
|
}
|
|
@@ -3095,9 +3105,9 @@
|
|
|
3095
3105
|
const extractPrependedData = getOptionValue$1(zipReader, options, "extractPrependedData");
|
|
3096
3106
|
const extractAppendedData = getOptionValue$1(zipReader, options, "extractAppendedData");
|
|
3097
3107
|
if (extractPrependedData) {
|
|
3098
|
-
zipReader.prependedData = await readUint8Array(reader, 0, startOffset);
|
|
3108
|
+
zipReader.prependedData = startOffset > 0 ? await readUint8Array(reader, 0, startOffset) : new Uint8Array();
|
|
3099
3109
|
}
|
|
3100
|
-
zipReader.comment = await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength);
|
|
3110
|
+
zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : new Uint8Array();
|
|
3101
3111
|
if (extractAppendedData) {
|
|
3102
3112
|
zipReader.appendedData = appendedDataOffset < reader.size ? await readUint8Array(reader, appendedDataOffset, reader.size - appendedDataOffset) : new Uint8Array();
|
|
3103
3113
|
}
|
|
@@ -3175,7 +3185,6 @@
|
|
|
3175
3185
|
const readable = reader.readable;
|
|
3176
3186
|
readable.offset = dataOffset;
|
|
3177
3187
|
readable.size = size;
|
|
3178
|
-
readable.chunkSize = getChunkSize(config);
|
|
3179
3188
|
const { writable } = writer;
|
|
3180
3189
|
const signal = getOptionValue$1(zipEntry, options, "signal");
|
|
3181
3190
|
if (writer.init && !writer.initialized) {
|
|
@@ -3526,17 +3535,22 @@
|
|
|
3526
3535
|
|
|
3527
3536
|
async add(name = "", reader, options = {}) {
|
|
3528
3537
|
const zipWriter = this;
|
|
3529
|
-
|
|
3538
|
+
const {
|
|
3539
|
+
pendingAddFileCalls,
|
|
3540
|
+
pendingEntries,
|
|
3541
|
+
config
|
|
3542
|
+
} = zipWriter;
|
|
3543
|
+
if (workers < config.maxWorkers) {
|
|
3530
3544
|
workers++;
|
|
3531
3545
|
let promiseAddFile;
|
|
3532
3546
|
try {
|
|
3533
3547
|
promiseAddFile = addFile(zipWriter, name, reader, options);
|
|
3534
|
-
|
|
3548
|
+
pendingAddFileCalls.add(promiseAddFile);
|
|
3535
3549
|
return await promiseAddFile;
|
|
3536
3550
|
} finally {
|
|
3537
|
-
|
|
3551
|
+
pendingAddFileCalls.delete(promiseAddFile);
|
|
3538
3552
|
workers--;
|
|
3539
|
-
const pendingEntry =
|
|
3553
|
+
const pendingEntry = pendingEntries.shift();
|
|
3540
3554
|
if (pendingEntry) {
|
|
3541
3555
|
zipWriter.add(pendingEntry.name, pendingEntry.reader, pendingEntry.options)
|
|
3542
3556
|
.then(pendingEntry.resolve)
|
|
@@ -3544,7 +3558,7 @@
|
|
|
3544
3558
|
}
|
|
3545
3559
|
}
|
|
3546
3560
|
} else {
|
|
3547
|
-
return new Promise((resolve, reject) =>
|
|
3561
|
+
return new Promise((resolve, reject) => pendingEntries.push({ name, reader, options, resolve, reject }));
|
|
3548
3562
|
}
|
|
3549
3563
|
}
|
|
3550
3564
|
|
|
@@ -3704,22 +3718,31 @@
|
|
|
3704
3718
|
}
|
|
3705
3719
|
|
|
3706
3720
|
async function getFileEntry(zipWriter, name, reader, options) {
|
|
3707
|
-
const {
|
|
3721
|
+
const {
|
|
3722
|
+
files,
|
|
3723
|
+
writer
|
|
3724
|
+
} = zipWriter;
|
|
3725
|
+
const {
|
|
3726
|
+
keepOrder,
|
|
3727
|
+
dataDescriptor,
|
|
3728
|
+
zipCrypto,
|
|
3729
|
+
signal
|
|
3730
|
+
} = options;
|
|
3708
3731
|
const previousFileEntry = Array.from(files.values()).pop();
|
|
3709
3732
|
let fileEntry = {};
|
|
3710
3733
|
let bufferedWrite;
|
|
3711
3734
|
let releaseLockWriter;
|
|
3712
|
-
let
|
|
3713
|
-
let
|
|
3735
|
+
let releaseLockCurrentFileEntry;
|
|
3736
|
+
let bufferedDataWritten;
|
|
3714
3737
|
let fileWriter;
|
|
3715
3738
|
files.set(name, fileEntry);
|
|
3716
3739
|
try {
|
|
3717
3740
|
let lockPreviousFileEntry;
|
|
3718
|
-
if (
|
|
3741
|
+
if (keepOrder) {
|
|
3719
3742
|
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
|
|
3743
|
+
requestLockCurrentFileEntry();
|
|
3720
3744
|
}
|
|
3721
|
-
|
|
3722
|
-
if (options.bufferedWrite || zipWriter.lockWriter || !options.dataDescriptor) {
|
|
3745
|
+
if (options.bufferedWrite || zipWriter.lockWriter || !dataDescriptor) {
|
|
3723
3746
|
fileWriter = new BlobWriter();
|
|
3724
3747
|
fileWriter.init();
|
|
3725
3748
|
bufferedWrite = true;
|
|
@@ -3736,14 +3759,14 @@
|
|
|
3736
3759
|
if (bufferedWrite) {
|
|
3737
3760
|
let blob = fileWriter.getData();
|
|
3738
3761
|
await lockPreviousFileEntry;
|
|
3739
|
-
await
|
|
3740
|
-
|
|
3762
|
+
await requestLockWriter();
|
|
3763
|
+
bufferedDataWritten = true;
|
|
3741
3764
|
const { writable } = writer;
|
|
3742
|
-
if (!
|
|
3765
|
+
if (!dataDescriptor) {
|
|
3743
3766
|
const headerLength = 26;
|
|
3744
3767
|
const arrayBuffer = await sliceAsArrayBuffer(blob, 0, headerLength);
|
|
3745
3768
|
const arrayBufferView = new DataView(arrayBuffer);
|
|
3746
|
-
if (!fileEntry.encrypted ||
|
|
3769
|
+
if (!fileEntry.encrypted || zipCrypto) {
|
|
3747
3770
|
setUint32(arrayBufferView, 14, fileEntry.signature);
|
|
3748
3771
|
}
|
|
3749
3772
|
if (fileEntry.zip64) {
|
|
@@ -3756,8 +3779,8 @@
|
|
|
3756
3779
|
await writeUint8Array(writable, new Uint8Array(arrayBuffer));
|
|
3757
3780
|
blob = blob.slice(headerLength);
|
|
3758
3781
|
}
|
|
3759
|
-
await blob.stream().pipeTo(writable, { preventClose: true });
|
|
3760
|
-
|
|
3782
|
+
await blob.stream().pipeTo(writable, { preventClose: true, signal });
|
|
3783
|
+
bufferedDataWritten = false;
|
|
3761
3784
|
}
|
|
3762
3785
|
fileEntry.offset = zipWriter.offset;
|
|
3763
3786
|
if (fileEntry.zip64) {
|
|
@@ -3769,23 +3792,30 @@
|
|
|
3769
3792
|
zipWriter.offset += fileEntry.length;
|
|
3770
3793
|
return fileEntry;
|
|
3771
3794
|
} catch (error) {
|
|
3772
|
-
if ((bufferedWrite &&
|
|
3795
|
+
if ((bufferedWrite && bufferedDataWritten) || (!bufferedWrite && fileEntry.dataWritten)) {
|
|
3773
3796
|
error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
|
|
3774
3797
|
zipWriter.offset += fileWriter.size;
|
|
3775
3798
|
}
|
|
3776
3799
|
files.delete(name);
|
|
3777
3800
|
throw error;
|
|
3778
3801
|
} finally {
|
|
3779
|
-
|
|
3802
|
+
if (releaseLockCurrentFileEntry) {
|
|
3803
|
+
releaseLockCurrentFileEntry();
|
|
3804
|
+
}
|
|
3780
3805
|
if (releaseLockWriter) {
|
|
3781
3806
|
releaseLockWriter();
|
|
3782
3807
|
}
|
|
3783
3808
|
}
|
|
3784
3809
|
|
|
3785
|
-
|
|
3786
|
-
|
|
3787
|
-
|
|
3788
|
-
|
|
3810
|
+
function requestLockCurrentFileEntry() {
|
|
3811
|
+
fileEntry.lock = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
|
|
3812
|
+
}
|
|
3813
|
+
|
|
3814
|
+
async function requestLockWriter() {
|
|
3815
|
+
const { lockWriter } = zipWriter;
|
|
3816
|
+
if (lockWriter) {
|
|
3817
|
+
await lockWriter.then(() => delete zipWriter.lockWriter);
|
|
3818
|
+
return requestLockWriter();
|
|
3789
3819
|
} else {
|
|
3790
3820
|
zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
|
|
3791
3821
|
}
|
|
@@ -3927,7 +3957,7 @@
|
|
|
3927
3957
|
const rawLastModDate = dateArray[0];
|
|
3928
3958
|
setUint32(headerView, 6, rawLastModDate);
|
|
3929
3959
|
setUint16(headerView, 22, rawFilename.length);
|
|
3930
|
-
const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length +
|
|
3960
|
+
const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + rawExtraField.length;
|
|
3931
3961
|
setUint16(headerView, 24, extraFieldLength);
|
|
3932
3962
|
const localHeaderArray = new Uint8Array(30 + rawFilename.length + extraFieldLength);
|
|
3933
3963
|
const localHeaderView = getDataView(localHeaderArray);
|
|
@@ -3937,16 +3967,16 @@
|
|
|
3937
3967
|
arraySet(localHeaderArray, rawExtraFieldAES, 30 + rawFilename.length);
|
|
3938
3968
|
arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, 30 + rawFilename.length + rawExtraFieldAES.length);
|
|
3939
3969
|
arraySet(localHeaderArray, rawExtraFieldNTFS, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length);
|
|
3940
|
-
arraySet(localHeaderArray,
|
|
3970
|
+
arraySet(localHeaderArray, rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
|
|
3941
3971
|
let result;
|
|
3942
3972
|
let compressedSize = 0;
|
|
3943
3973
|
if (reader) {
|
|
3974
|
+
reader.chunkSize = getChunkSize(config);
|
|
3944
3975
|
await writeUint8Array(writable, localHeaderArray);
|
|
3945
3976
|
fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
|
|
3946
3977
|
const size = () => reader.size;
|
|
3947
3978
|
const readable = reader.readable;
|
|
3948
3979
|
readable.size = size;
|
|
3949
|
-
readable.chunkSize = getChunkSize(config);
|
|
3950
3980
|
const workerOptions = {
|
|
3951
3981
|
options: {
|
|
3952
3982
|
codecType: CODEC_DEFLATE,
|
|
@@ -4016,7 +4046,15 @@
|
|
|
4016
4046
|
await writeUint8Array(writable, dataDescriptorArray);
|
|
4017
4047
|
}
|
|
4018
4048
|
const length = localHeaderArray.length + compressedSize + dataDescriptorArray.length;
|
|
4019
|
-
Object.assign(fileEntry, {
|
|
4049
|
+
Object.assign(fileEntry, {
|
|
4050
|
+
compressedSize,
|
|
4051
|
+
lastModDate,
|
|
4052
|
+
rawLastModDate,
|
|
4053
|
+
creationDate,
|
|
4054
|
+
lastAccessDate,
|
|
4055
|
+
encrypted,
|
|
4056
|
+
length
|
|
4057
|
+
});
|
|
4020
4058
|
return fileEntry;
|
|
4021
4059
|
}
|
|
4022
4060
|
|