@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-full.js
CHANGED
|
@@ -4426,14 +4426,13 @@
|
|
|
4426
4426
|
if (codecAdapter.pendingData) {
|
|
4427
4427
|
const { pendingData } = codecAdapter;
|
|
4428
4428
|
codecAdapter.pendingData = new Uint8Array(pendingData.length + data.length);
|
|
4429
|
-
|
|
4430
|
-
|
|
4429
|
+
pendingData.set(pendingData, 0);
|
|
4430
|
+
pendingData.set(data, pendingData.length);
|
|
4431
4431
|
} else {
|
|
4432
4432
|
codecAdapter.pendingData = new Uint8Array(data);
|
|
4433
4433
|
}
|
|
4434
4434
|
};
|
|
4435
|
-
|
|
4436
|
-
if (options.hasOwnProperty("level") && options.level === undefined) {
|
|
4435
|
+
if (Object.hasOwn(options, "level") && options.level === undefined) {
|
|
4437
4436
|
delete options.level;
|
|
4438
4437
|
}
|
|
4439
4438
|
codecAdapter.codec = new constructor(Object.assign({}, constructorOptions, options));
|
|
@@ -6459,7 +6458,7 @@
|
|
|
6459
6458
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
6460
6459
|
*/
|
|
6461
6460
|
|
|
6462
|
-
/* global Blob, atob, btoa, XMLHttpRequest, URL, fetch, ReadableStream, WritableStream */
|
|
6461
|
+
/* global Blob, atob, btoa, XMLHttpRequest, URL, fetch, ReadableStream, WritableStream, FileReader */
|
|
6463
6462
|
|
|
6464
6463
|
const ERR_HTTP_STATUS = "HTTP error ";
|
|
6465
6464
|
const ERR_HTTP_RANGE = "HTTP Range not supported";
|
|
@@ -6490,12 +6489,13 @@
|
|
|
6490
6489
|
|
|
6491
6490
|
get readable() {
|
|
6492
6491
|
const reader = this;
|
|
6492
|
+
const { chunkSize = DEFAULT_CHUNK_SIZE } = reader;
|
|
6493
6493
|
const readable = new ReadableStream({
|
|
6494
6494
|
start() {
|
|
6495
6495
|
this.chunkOffset = 0;
|
|
6496
6496
|
},
|
|
6497
6497
|
async pull(controller) {
|
|
6498
|
-
const { offset = 0,
|
|
6498
|
+
const { offset = 0, size } = readable;
|
|
6499
6499
|
const { chunkOffset } = this;
|
|
6500
6500
|
controller.enqueue(await reader.readUint8Array(offset + chunkOffset, Math.min(chunkSize, size() - chunkOffset)));
|
|
6501
6501
|
if (chunkOffset + chunkSize > size()) {
|
|
@@ -6568,7 +6568,16 @@
|
|
|
6568
6568
|
|
|
6569
6569
|
getData() {
|
|
6570
6570
|
const writer = this;
|
|
6571
|
-
|
|
6571
|
+
if (writer.blob.text && (writer.encoding === undefined || (writer.encoding && writer.encoding.toLowerCase() == "utf-8"))) {
|
|
6572
|
+
return writer.blob.text();
|
|
6573
|
+
} else {
|
|
6574
|
+
const reader = new FileReader();
|
|
6575
|
+
return new Promise((resolve, reject) => {
|
|
6576
|
+
reader.onload = event => resolve(event.target.result);
|
|
6577
|
+
reader.onerror = () => reject(reader.error);
|
|
6578
|
+
reader.readAsText(writer.blob, writer.encoding);
|
|
6579
|
+
});
|
|
6580
|
+
}
|
|
6572
6581
|
}
|
|
6573
6582
|
}
|
|
6574
6583
|
|
|
@@ -6855,7 +6864,7 @@
|
|
|
6855
6864
|
if (response.status < 400) {
|
|
6856
6865
|
return response;
|
|
6857
6866
|
} else {
|
|
6858
|
-
throw new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
|
|
6867
|
+
throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
|
|
6859
6868
|
}
|
|
6860
6869
|
}
|
|
6861
6870
|
|
|
@@ -6876,7 +6885,7 @@
|
|
|
6876
6885
|
headers: new Map(headers)
|
|
6877
6886
|
});
|
|
6878
6887
|
} else {
|
|
6879
|
-
reject(new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
|
|
6888
|
+
reject(request.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
|
|
6880
6889
|
}
|
|
6881
6890
|
}, false);
|
|
6882
6891
|
request.addEventListener("error", event => reject(event.detail.error), false);
|
|
@@ -7213,6 +7222,7 @@
|
|
|
7213
7222
|
if (!reader.initialized) {
|
|
7214
7223
|
await reader.init();
|
|
7215
7224
|
}
|
|
7225
|
+
reader.chunkSize = getChunkSize(config);
|
|
7216
7226
|
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
7217
7227
|
throw new Error(ERR_BAD_FORMAT);
|
|
7218
7228
|
}
|
|
@@ -7329,9 +7339,9 @@
|
|
|
7329
7339
|
const extractPrependedData = getOptionValue$1(zipReader, options, "extractPrependedData");
|
|
7330
7340
|
const extractAppendedData = getOptionValue$1(zipReader, options, "extractAppendedData");
|
|
7331
7341
|
if (extractPrependedData) {
|
|
7332
|
-
zipReader.prependedData = await readUint8Array(reader, 0, startOffset);
|
|
7342
|
+
zipReader.prependedData = startOffset > 0 ? await readUint8Array(reader, 0, startOffset) : new Uint8Array();
|
|
7333
7343
|
}
|
|
7334
|
-
zipReader.comment = await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength);
|
|
7344
|
+
zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : new Uint8Array();
|
|
7335
7345
|
if (extractAppendedData) {
|
|
7336
7346
|
zipReader.appendedData = appendedDataOffset < reader.size ? await readUint8Array(reader, appendedDataOffset, reader.size - appendedDataOffset) : new Uint8Array();
|
|
7337
7347
|
}
|
|
@@ -7409,7 +7419,6 @@
|
|
|
7409
7419
|
const readable = reader.readable;
|
|
7410
7420
|
readable.offset = dataOffset;
|
|
7411
7421
|
readable.size = size;
|
|
7412
|
-
readable.chunkSize = getChunkSize(config);
|
|
7413
7422
|
const { writable } = writer;
|
|
7414
7423
|
const signal = getOptionValue$1(zipEntry, options, "signal");
|
|
7415
7424
|
if (writer.init && !writer.initialized) {
|
|
@@ -7760,17 +7769,22 @@
|
|
|
7760
7769
|
|
|
7761
7770
|
async add(name = "", reader, options = {}) {
|
|
7762
7771
|
const zipWriter = this;
|
|
7763
|
-
|
|
7772
|
+
const {
|
|
7773
|
+
pendingAddFileCalls,
|
|
7774
|
+
pendingEntries,
|
|
7775
|
+
config
|
|
7776
|
+
} = zipWriter;
|
|
7777
|
+
if (workers < config.maxWorkers) {
|
|
7764
7778
|
workers++;
|
|
7765
7779
|
let promiseAddFile;
|
|
7766
7780
|
try {
|
|
7767
7781
|
promiseAddFile = addFile(zipWriter, name, reader, options);
|
|
7768
|
-
|
|
7782
|
+
pendingAddFileCalls.add(promiseAddFile);
|
|
7769
7783
|
return await promiseAddFile;
|
|
7770
7784
|
} finally {
|
|
7771
|
-
|
|
7785
|
+
pendingAddFileCalls.delete(promiseAddFile);
|
|
7772
7786
|
workers--;
|
|
7773
|
-
const pendingEntry =
|
|
7787
|
+
const pendingEntry = pendingEntries.shift();
|
|
7774
7788
|
if (pendingEntry) {
|
|
7775
7789
|
zipWriter.add(pendingEntry.name, pendingEntry.reader, pendingEntry.options)
|
|
7776
7790
|
.then(pendingEntry.resolve)
|
|
@@ -7778,7 +7792,7 @@
|
|
|
7778
7792
|
}
|
|
7779
7793
|
}
|
|
7780
7794
|
} else {
|
|
7781
|
-
return new Promise((resolve, reject) =>
|
|
7795
|
+
return new Promise((resolve, reject) => pendingEntries.push({ name, reader, options, resolve, reject }));
|
|
7782
7796
|
}
|
|
7783
7797
|
}
|
|
7784
7798
|
|
|
@@ -7938,22 +7952,31 @@
|
|
|
7938
7952
|
}
|
|
7939
7953
|
|
|
7940
7954
|
async function getFileEntry(zipWriter, name, reader, options) {
|
|
7941
|
-
const {
|
|
7955
|
+
const {
|
|
7956
|
+
files,
|
|
7957
|
+
writer
|
|
7958
|
+
} = zipWriter;
|
|
7959
|
+
const {
|
|
7960
|
+
keepOrder,
|
|
7961
|
+
dataDescriptor,
|
|
7962
|
+
zipCrypto,
|
|
7963
|
+
signal
|
|
7964
|
+
} = options;
|
|
7942
7965
|
const previousFileEntry = Array.from(files.values()).pop();
|
|
7943
7966
|
let fileEntry = {};
|
|
7944
7967
|
let bufferedWrite;
|
|
7945
7968
|
let releaseLockWriter;
|
|
7946
|
-
let
|
|
7947
|
-
let
|
|
7969
|
+
let releaseLockCurrentFileEntry;
|
|
7970
|
+
let bufferedDataWritten;
|
|
7948
7971
|
let fileWriter;
|
|
7949
7972
|
files.set(name, fileEntry);
|
|
7950
7973
|
try {
|
|
7951
7974
|
let lockPreviousFileEntry;
|
|
7952
|
-
if (
|
|
7975
|
+
if (keepOrder) {
|
|
7953
7976
|
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
|
|
7977
|
+
requestLockCurrentFileEntry();
|
|
7954
7978
|
}
|
|
7955
|
-
|
|
7956
|
-
if (options.bufferedWrite || zipWriter.lockWriter || !options.dataDescriptor) {
|
|
7979
|
+
if (options.bufferedWrite || zipWriter.lockWriter || !dataDescriptor) {
|
|
7957
7980
|
fileWriter = new BlobWriter();
|
|
7958
7981
|
fileWriter.init();
|
|
7959
7982
|
bufferedWrite = true;
|
|
@@ -7970,14 +7993,14 @@
|
|
|
7970
7993
|
if (bufferedWrite) {
|
|
7971
7994
|
let blob = fileWriter.getData();
|
|
7972
7995
|
await lockPreviousFileEntry;
|
|
7973
|
-
await
|
|
7974
|
-
|
|
7996
|
+
await requestLockWriter();
|
|
7997
|
+
bufferedDataWritten = true;
|
|
7975
7998
|
const { writable } = writer;
|
|
7976
|
-
if (!
|
|
7999
|
+
if (!dataDescriptor) {
|
|
7977
8000
|
const headerLength = 26;
|
|
7978
8001
|
const arrayBuffer = await sliceAsArrayBuffer(blob, 0, headerLength);
|
|
7979
8002
|
const arrayBufferView = new DataView(arrayBuffer);
|
|
7980
|
-
if (!fileEntry.encrypted ||
|
|
8003
|
+
if (!fileEntry.encrypted || zipCrypto) {
|
|
7981
8004
|
setUint32(arrayBufferView, 14, fileEntry.signature);
|
|
7982
8005
|
}
|
|
7983
8006
|
if (fileEntry.zip64) {
|
|
@@ -7990,8 +8013,8 @@
|
|
|
7990
8013
|
await writeUint8Array(writable, new Uint8Array(arrayBuffer));
|
|
7991
8014
|
blob = blob.slice(headerLength);
|
|
7992
8015
|
}
|
|
7993
|
-
await blob.stream().pipeTo(writable, { preventClose: true });
|
|
7994
|
-
|
|
8016
|
+
await blob.stream().pipeTo(writable, { preventClose: true, signal });
|
|
8017
|
+
bufferedDataWritten = false;
|
|
7995
8018
|
}
|
|
7996
8019
|
fileEntry.offset = zipWriter.offset;
|
|
7997
8020
|
if (fileEntry.zip64) {
|
|
@@ -8003,23 +8026,30 @@
|
|
|
8003
8026
|
zipWriter.offset += fileEntry.length;
|
|
8004
8027
|
return fileEntry;
|
|
8005
8028
|
} catch (error) {
|
|
8006
|
-
if ((bufferedWrite &&
|
|
8029
|
+
if ((bufferedWrite && bufferedDataWritten) || (!bufferedWrite && fileEntry.dataWritten)) {
|
|
8007
8030
|
error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
|
|
8008
8031
|
zipWriter.offset += fileWriter.size;
|
|
8009
8032
|
}
|
|
8010
8033
|
files.delete(name);
|
|
8011
8034
|
throw error;
|
|
8012
8035
|
} finally {
|
|
8013
|
-
|
|
8036
|
+
if (releaseLockCurrentFileEntry) {
|
|
8037
|
+
releaseLockCurrentFileEntry();
|
|
8038
|
+
}
|
|
8014
8039
|
if (releaseLockWriter) {
|
|
8015
8040
|
releaseLockWriter();
|
|
8016
8041
|
}
|
|
8017
8042
|
}
|
|
8018
8043
|
|
|
8019
|
-
|
|
8020
|
-
|
|
8021
|
-
|
|
8022
|
-
|
|
8044
|
+
function requestLockCurrentFileEntry() {
|
|
8045
|
+
fileEntry.lock = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
|
|
8046
|
+
}
|
|
8047
|
+
|
|
8048
|
+
async function requestLockWriter() {
|
|
8049
|
+
const { lockWriter } = zipWriter;
|
|
8050
|
+
if (lockWriter) {
|
|
8051
|
+
await lockWriter.then(() => delete zipWriter.lockWriter);
|
|
8052
|
+
return requestLockWriter();
|
|
8023
8053
|
} else {
|
|
8024
8054
|
zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
|
|
8025
8055
|
}
|
|
@@ -8161,7 +8191,7 @@
|
|
|
8161
8191
|
const rawLastModDate = dateArray[0];
|
|
8162
8192
|
setUint32(headerView, 6, rawLastModDate);
|
|
8163
8193
|
setUint16(headerView, 22, rawFilename.length);
|
|
8164
|
-
const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length +
|
|
8194
|
+
const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + rawExtraField.length;
|
|
8165
8195
|
setUint16(headerView, 24, extraFieldLength);
|
|
8166
8196
|
const localHeaderArray = new Uint8Array(30 + rawFilename.length + extraFieldLength);
|
|
8167
8197
|
const localHeaderView = getDataView(localHeaderArray);
|
|
@@ -8171,16 +8201,16 @@
|
|
|
8171
8201
|
arraySet(localHeaderArray, rawExtraFieldAES, 30 + rawFilename.length);
|
|
8172
8202
|
arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, 30 + rawFilename.length + rawExtraFieldAES.length);
|
|
8173
8203
|
arraySet(localHeaderArray, rawExtraFieldNTFS, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length);
|
|
8174
|
-
arraySet(localHeaderArray,
|
|
8204
|
+
arraySet(localHeaderArray, rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
|
|
8175
8205
|
let result;
|
|
8176
8206
|
let compressedSize = 0;
|
|
8177
8207
|
if (reader) {
|
|
8208
|
+
reader.chunkSize = getChunkSize(config);
|
|
8178
8209
|
await writeUint8Array(writable, localHeaderArray);
|
|
8179
8210
|
fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
|
|
8180
8211
|
const size = () => reader.size;
|
|
8181
8212
|
const readable = reader.readable;
|
|
8182
8213
|
readable.size = size;
|
|
8183
|
-
readable.chunkSize = getChunkSize(config);
|
|
8184
8214
|
const workerOptions = {
|
|
8185
8215
|
options: {
|
|
8186
8216
|
codecType: CODEC_DEFLATE,
|
|
@@ -8250,7 +8280,15 @@
|
|
|
8250
8280
|
await writeUint8Array(writable, dataDescriptorArray);
|
|
8251
8281
|
}
|
|
8252
8282
|
const length = localHeaderArray.length + compressedSize + dataDescriptorArray.length;
|
|
8253
|
-
Object.assign(fileEntry, {
|
|
8283
|
+
Object.assign(fileEntry, {
|
|
8284
|
+
compressedSize,
|
|
8285
|
+
lastModDate,
|
|
8286
|
+
rawLastModDate,
|
|
8287
|
+
creationDate,
|
|
8288
|
+
lastAccessDate,
|
|
8289
|
+
encrypted,
|
|
8290
|
+
length
|
|
8291
|
+
});
|
|
8254
8292
|
return fileEntry;
|
|
8255
8293
|
}
|
|
8256
8294
|
|