@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-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));
|
|
@@ -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()) {
|
|
@@ -6855,7 +6855,7 @@
|
|
|
6855
6855
|
if (response.status < 400) {
|
|
6856
6856
|
return response;
|
|
6857
6857
|
} else {
|
|
6858
|
-
throw new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
|
|
6858
|
+
throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
|
|
6859
6859
|
}
|
|
6860
6860
|
}
|
|
6861
6861
|
|
|
@@ -6876,7 +6876,7 @@
|
|
|
6876
6876
|
headers: new Map(headers)
|
|
6877
6877
|
});
|
|
6878
6878
|
} else {
|
|
6879
|
-
reject(new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
|
|
6879
|
+
reject(request.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
|
|
6880
6880
|
}
|
|
6881
6881
|
}, false);
|
|
6882
6882
|
request.addEventListener("error", event => reject(event.detail.error), false);
|
|
@@ -7213,6 +7213,7 @@
|
|
|
7213
7213
|
if (!reader.initialized) {
|
|
7214
7214
|
await reader.init();
|
|
7215
7215
|
}
|
|
7216
|
+
reader.chunkSize = getChunkSize(config);
|
|
7216
7217
|
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
7217
7218
|
throw new Error(ERR_BAD_FORMAT);
|
|
7218
7219
|
}
|
|
@@ -7329,9 +7330,9 @@
|
|
|
7329
7330
|
const extractPrependedData = getOptionValue$1(zipReader, options, "extractPrependedData");
|
|
7330
7331
|
const extractAppendedData = getOptionValue$1(zipReader, options, "extractAppendedData");
|
|
7331
7332
|
if (extractPrependedData) {
|
|
7332
|
-
zipReader.prependedData = await readUint8Array(reader, 0, startOffset);
|
|
7333
|
+
zipReader.prependedData = startOffset > 0 ? await readUint8Array(reader, 0, startOffset) : new Uint8Array();
|
|
7333
7334
|
}
|
|
7334
|
-
zipReader.comment = await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength);
|
|
7335
|
+
zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : new Uint8Array();
|
|
7335
7336
|
if (extractAppendedData) {
|
|
7336
7337
|
zipReader.appendedData = appendedDataOffset < reader.size ? await readUint8Array(reader, appendedDataOffset, reader.size - appendedDataOffset) : new Uint8Array();
|
|
7337
7338
|
}
|
|
@@ -7409,7 +7410,6 @@
|
|
|
7409
7410
|
const readable = reader.readable;
|
|
7410
7411
|
readable.offset = dataOffset;
|
|
7411
7412
|
readable.size = size;
|
|
7412
|
-
readable.chunkSize = getChunkSize(config);
|
|
7413
7413
|
const { writable } = writer;
|
|
7414
7414
|
const signal = getOptionValue$1(zipEntry, options, "signal");
|
|
7415
7415
|
if (writer.init && !writer.initialized) {
|
|
@@ -7760,17 +7760,22 @@
|
|
|
7760
7760
|
|
|
7761
7761
|
async add(name = "", reader, options = {}) {
|
|
7762
7762
|
const zipWriter = this;
|
|
7763
|
-
|
|
7763
|
+
const {
|
|
7764
|
+
pendingAddFileCalls,
|
|
7765
|
+
pendingEntries,
|
|
7766
|
+
config
|
|
7767
|
+
} = zipWriter;
|
|
7768
|
+
if (workers < config.maxWorkers) {
|
|
7764
7769
|
workers++;
|
|
7765
7770
|
let promiseAddFile;
|
|
7766
7771
|
try {
|
|
7767
7772
|
promiseAddFile = addFile(zipWriter, name, reader, options);
|
|
7768
|
-
|
|
7773
|
+
pendingAddFileCalls.add(promiseAddFile);
|
|
7769
7774
|
return await promiseAddFile;
|
|
7770
7775
|
} finally {
|
|
7771
|
-
|
|
7776
|
+
pendingAddFileCalls.delete(promiseAddFile);
|
|
7772
7777
|
workers--;
|
|
7773
|
-
const pendingEntry =
|
|
7778
|
+
const pendingEntry = pendingEntries.shift();
|
|
7774
7779
|
if (pendingEntry) {
|
|
7775
7780
|
zipWriter.add(pendingEntry.name, pendingEntry.reader, pendingEntry.options)
|
|
7776
7781
|
.then(pendingEntry.resolve)
|
|
@@ -7778,7 +7783,7 @@
|
|
|
7778
7783
|
}
|
|
7779
7784
|
}
|
|
7780
7785
|
} else {
|
|
7781
|
-
return new Promise((resolve, reject) =>
|
|
7786
|
+
return new Promise((resolve, reject) => pendingEntries.push({ name, reader, options, resolve, reject }));
|
|
7782
7787
|
}
|
|
7783
7788
|
}
|
|
7784
7789
|
|
|
@@ -7938,22 +7943,31 @@
|
|
|
7938
7943
|
}
|
|
7939
7944
|
|
|
7940
7945
|
async function getFileEntry(zipWriter, name, reader, options) {
|
|
7941
|
-
const {
|
|
7946
|
+
const {
|
|
7947
|
+
files,
|
|
7948
|
+
writer
|
|
7949
|
+
} = zipWriter;
|
|
7950
|
+
const {
|
|
7951
|
+
keepOrder,
|
|
7952
|
+
dataDescriptor,
|
|
7953
|
+
zipCrypto,
|
|
7954
|
+
signal
|
|
7955
|
+
} = options;
|
|
7942
7956
|
const previousFileEntry = Array.from(files.values()).pop();
|
|
7943
7957
|
let fileEntry = {};
|
|
7944
7958
|
let bufferedWrite;
|
|
7945
7959
|
let releaseLockWriter;
|
|
7946
|
-
let
|
|
7947
|
-
let
|
|
7960
|
+
let releaseLockCurrentFileEntry;
|
|
7961
|
+
let bufferedDataWritten;
|
|
7962
|
+
let fileWriter;
|
|
7948
7963
|
files.set(name, fileEntry);
|
|
7949
7964
|
try {
|
|
7950
7965
|
let lockPreviousFileEntry;
|
|
7951
|
-
|
|
7952
|
-
if (options.keepOrder) {
|
|
7966
|
+
if (keepOrder) {
|
|
7953
7967
|
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
|
|
7968
|
+
requestLockCurrentFileEntry();
|
|
7954
7969
|
}
|
|
7955
|
-
|
|
7956
|
-
if (options.bufferedWrite || zipWriter.lockWriter || !options.dataDescriptor) {
|
|
7970
|
+
if (options.bufferedWrite || zipWriter.lockWriter || !dataDescriptor) {
|
|
7957
7971
|
fileWriter = new BlobWriter();
|
|
7958
7972
|
fileWriter.init();
|
|
7959
7973
|
bufferedWrite = true;
|
|
@@ -7964,20 +7978,20 @@
|
|
|
7964
7978
|
}
|
|
7965
7979
|
fileWriter = writer;
|
|
7966
7980
|
}
|
|
7967
|
-
fileEntry = await createFileEntry(reader, fileWriter.writable, zipWriter.config, options);
|
|
7981
|
+
fileEntry = await createFileEntry(reader, fileEntry, fileWriter.writable, zipWriter.config, options);
|
|
7968
7982
|
files.set(name, fileEntry);
|
|
7969
7983
|
fileEntry.filename = name;
|
|
7970
7984
|
if (bufferedWrite) {
|
|
7971
7985
|
let blob = fileWriter.getData();
|
|
7972
7986
|
await lockPreviousFileEntry;
|
|
7973
|
-
await
|
|
7974
|
-
|
|
7987
|
+
await requestLockWriter();
|
|
7988
|
+
bufferedDataWritten = true;
|
|
7975
7989
|
const { writable } = writer;
|
|
7976
|
-
if (!
|
|
7990
|
+
if (!dataDescriptor) {
|
|
7977
7991
|
const headerLength = 26;
|
|
7978
7992
|
const arrayBuffer = await sliceAsArrayBuffer(blob, 0, headerLength);
|
|
7979
7993
|
const arrayBufferView = new DataView(arrayBuffer);
|
|
7980
|
-
if (!fileEntry.encrypted ||
|
|
7994
|
+
if (!fileEntry.encrypted || zipCrypto) {
|
|
7981
7995
|
setUint32(arrayBufferView, 14, fileEntry.signature);
|
|
7982
7996
|
}
|
|
7983
7997
|
if (fileEntry.zip64) {
|
|
@@ -7990,8 +8004,8 @@
|
|
|
7990
8004
|
await writeUint8Array(writable, new Uint8Array(arrayBuffer));
|
|
7991
8005
|
blob = blob.slice(headerLength);
|
|
7992
8006
|
}
|
|
7993
|
-
await blob.stream().pipeTo(writable, { preventClose: true });
|
|
7994
|
-
|
|
8007
|
+
await blob.stream().pipeTo(writable, { preventClose: true, signal });
|
|
8008
|
+
bufferedDataWritten = false;
|
|
7995
8009
|
}
|
|
7996
8010
|
fileEntry.offset = zipWriter.offset;
|
|
7997
8011
|
if (fileEntry.zip64) {
|
|
@@ -8003,32 +8017,37 @@
|
|
|
8003
8017
|
zipWriter.offset += fileEntry.length;
|
|
8004
8018
|
return fileEntry;
|
|
8005
8019
|
} catch (error) {
|
|
8006
|
-
if ((bufferedWrite &&
|
|
8020
|
+
if ((bufferedWrite && bufferedDataWritten) || (!bufferedWrite && fileEntry.dataWritten)) {
|
|
8007
8021
|
error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
|
|
8008
|
-
|
|
8009
|
-
zipWriter.offset += fileEntry.uncompressedSize;
|
|
8010
|
-
}
|
|
8022
|
+
zipWriter.offset += fileWriter.size;
|
|
8011
8023
|
}
|
|
8012
8024
|
files.delete(name);
|
|
8013
8025
|
throw error;
|
|
8014
8026
|
} finally {
|
|
8015
|
-
|
|
8027
|
+
if (releaseLockCurrentFileEntry) {
|
|
8028
|
+
releaseLockCurrentFileEntry();
|
|
8029
|
+
}
|
|
8016
8030
|
if (releaseLockWriter) {
|
|
8017
8031
|
releaseLockWriter();
|
|
8018
8032
|
}
|
|
8019
8033
|
}
|
|
8020
8034
|
|
|
8021
|
-
|
|
8022
|
-
|
|
8023
|
-
|
|
8024
|
-
|
|
8035
|
+
function requestLockCurrentFileEntry() {
|
|
8036
|
+
fileEntry.lock = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
|
|
8037
|
+
}
|
|
8038
|
+
|
|
8039
|
+
async function requestLockWriter() {
|
|
8040
|
+
const { lockWriter } = zipWriter;
|
|
8041
|
+
if (lockWriter) {
|
|
8042
|
+
await lockWriter.then(() => delete zipWriter.lockWriter);
|
|
8043
|
+
return requestLockWriter();
|
|
8025
8044
|
} else {
|
|
8026
8045
|
zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
|
|
8027
8046
|
}
|
|
8028
8047
|
}
|
|
8029
8048
|
}
|
|
8030
8049
|
|
|
8031
|
-
async function createFileEntry(reader, writable, config, options) {
|
|
8050
|
+
async function createFileEntry(reader, pendingFileEntry, writable, config, options) {
|
|
8032
8051
|
const {
|
|
8033
8052
|
rawFilename,
|
|
8034
8053
|
lastAccessDate,
|
|
@@ -8163,7 +8182,7 @@
|
|
|
8163
8182
|
const rawLastModDate = dateArray[0];
|
|
8164
8183
|
setUint32(headerView, 6, rawLastModDate);
|
|
8165
8184
|
setUint16(headerView, 22, rawFilename.length);
|
|
8166
|
-
const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length +
|
|
8185
|
+
const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + rawExtraField.length;
|
|
8167
8186
|
setUint16(headerView, 24, extraFieldLength);
|
|
8168
8187
|
const localHeaderArray = new Uint8Array(30 + rawFilename.length + extraFieldLength);
|
|
8169
8188
|
const localHeaderView = getDataView(localHeaderArray);
|
|
@@ -8173,16 +8192,16 @@
|
|
|
8173
8192
|
arraySet(localHeaderArray, rawExtraFieldAES, 30 + rawFilename.length);
|
|
8174
8193
|
arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, 30 + rawFilename.length + rawExtraFieldAES.length);
|
|
8175
8194
|
arraySet(localHeaderArray, rawExtraFieldNTFS, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length);
|
|
8176
|
-
arraySet(localHeaderArray,
|
|
8195
|
+
arraySet(localHeaderArray, rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
|
|
8177
8196
|
let result;
|
|
8178
8197
|
let compressedSize = 0;
|
|
8179
8198
|
if (reader) {
|
|
8199
|
+
reader.chunkSize = getChunkSize(config);
|
|
8180
8200
|
await writeUint8Array(writable, localHeaderArray);
|
|
8181
|
-
fileEntry.dataWritten = true;
|
|
8201
|
+
fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
|
|
8182
8202
|
const size = () => reader.size;
|
|
8183
8203
|
const readable = reader.readable;
|
|
8184
8204
|
readable.size = size;
|
|
8185
|
-
readable.chunkSize = getChunkSize(config);
|
|
8186
8205
|
const workerOptions = {
|
|
8187
8206
|
options: {
|
|
8188
8207
|
codecType: CODEC_DEFLATE,
|
|
@@ -8206,7 +8225,7 @@
|
|
|
8206
8225
|
compressedSize = result.length;
|
|
8207
8226
|
} else {
|
|
8208
8227
|
await writeUint8Array(writable, localHeaderArray);
|
|
8209
|
-
fileEntry.dataWritten = true;
|
|
8228
|
+
fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
|
|
8210
8229
|
}
|
|
8211
8230
|
let dataDescriptorArray = new Uint8Array();
|
|
8212
8231
|
let dataDescriptorView, dataDescriptorOffset = 0;
|
|
@@ -8252,7 +8271,15 @@
|
|
|
8252
8271
|
await writeUint8Array(writable, dataDescriptorArray);
|
|
8253
8272
|
}
|
|
8254
8273
|
const length = localHeaderArray.length + compressedSize + dataDescriptorArray.length;
|
|
8255
|
-
Object.assign(fileEntry, {
|
|
8274
|
+
Object.assign(fileEntry, {
|
|
8275
|
+
compressedSize,
|
|
8276
|
+
lastModDate,
|
|
8277
|
+
rawLastModDate,
|
|
8278
|
+
creationDate,
|
|
8279
|
+
lastAccessDate,
|
|
8280
|
+
encrypted,
|
|
8281
|
+
length
|
|
8282
|
+
});
|
|
8256
8283
|
return fileEntry;
|
|
8257
8284
|
}
|
|
8258
8285
|
|