@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/lib/core/zip-writer.js
CHANGED
|
@@ -68,7 +68,9 @@ import {
|
|
|
68
68
|
runWorker
|
|
69
69
|
} from "./codec-pool.js";
|
|
70
70
|
import encodeText from "./util/encode-text.js";
|
|
71
|
-
import {
|
|
71
|
+
import {
|
|
72
|
+
BlobWriter
|
|
73
|
+
} from "./io.js";
|
|
72
74
|
import Entry from "./zip-entry.js";
|
|
73
75
|
|
|
74
76
|
const ERR_DUPLICATED_NAME = "File already exists";
|
|
@@ -103,17 +105,22 @@ class ZipWriter {
|
|
|
103
105
|
|
|
104
106
|
async add(name = "", reader, options = {}) {
|
|
105
107
|
const zipWriter = this;
|
|
106
|
-
|
|
108
|
+
const {
|
|
109
|
+
pendingAddFileCalls,
|
|
110
|
+
pendingEntries,
|
|
111
|
+
config
|
|
112
|
+
} = zipWriter;
|
|
113
|
+
if (workers < config.maxWorkers) {
|
|
107
114
|
workers++;
|
|
108
115
|
let promiseAddFile;
|
|
109
116
|
try {
|
|
110
117
|
promiseAddFile = addFile(zipWriter, name, reader, options);
|
|
111
|
-
|
|
118
|
+
pendingAddFileCalls.add(promiseAddFile);
|
|
112
119
|
return await promiseAddFile;
|
|
113
120
|
} finally {
|
|
114
|
-
|
|
121
|
+
pendingAddFileCalls.delete(promiseAddFile);
|
|
115
122
|
workers--;
|
|
116
|
-
const pendingEntry =
|
|
123
|
+
const pendingEntry = pendingEntries.shift();
|
|
117
124
|
if (pendingEntry) {
|
|
118
125
|
zipWriter.add(pendingEntry.name, pendingEntry.reader, pendingEntry.options)
|
|
119
126
|
.then(pendingEntry.resolve)
|
|
@@ -121,7 +128,7 @@ class ZipWriter {
|
|
|
121
128
|
}
|
|
122
129
|
}
|
|
123
130
|
} else {
|
|
124
|
-
return new Promise((resolve, reject) =>
|
|
131
|
+
return new Promise((resolve, reject) => pendingEntries.push({ name, reader, options, resolve, reject }));
|
|
125
132
|
}
|
|
126
133
|
}
|
|
127
134
|
|
|
@@ -294,22 +301,31 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
294
301
|
}
|
|
295
302
|
|
|
296
303
|
async function getFileEntry(zipWriter, name, reader, options) {
|
|
297
|
-
const {
|
|
304
|
+
const {
|
|
305
|
+
files,
|
|
306
|
+
writer
|
|
307
|
+
} = zipWriter;
|
|
308
|
+
const {
|
|
309
|
+
keepOrder,
|
|
310
|
+
dataDescriptor,
|
|
311
|
+
zipCrypto,
|
|
312
|
+
signal
|
|
313
|
+
} = options;
|
|
298
314
|
const previousFileEntry = Array.from(files.values()).pop();
|
|
299
315
|
let fileEntry = {};
|
|
300
316
|
let bufferedWrite;
|
|
301
317
|
let releaseLockWriter;
|
|
302
|
-
let
|
|
303
|
-
let
|
|
318
|
+
let releaseLockCurrentFileEntry;
|
|
319
|
+
let bufferedDataWritten;
|
|
304
320
|
let fileWriter;
|
|
305
321
|
files.set(name, fileEntry);
|
|
306
322
|
try {
|
|
307
323
|
let lockPreviousFileEntry;
|
|
308
|
-
if (
|
|
324
|
+
if (keepOrder) {
|
|
309
325
|
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
|
|
326
|
+
requestLockCurrentFileEntry();
|
|
310
327
|
}
|
|
311
|
-
|
|
312
|
-
if (options.bufferedWrite || zipWriter.lockWriter || !options.dataDescriptor) {
|
|
328
|
+
if (options.bufferedWrite || zipWriter.lockWriter || !dataDescriptor) {
|
|
313
329
|
fileWriter = new BlobWriter();
|
|
314
330
|
fileWriter.init();
|
|
315
331
|
bufferedWrite = true;
|
|
@@ -326,14 +342,14 @@ async function getFileEntry(zipWriter, name, reader, options) {
|
|
|
326
342
|
if (bufferedWrite) {
|
|
327
343
|
let blob = fileWriter.getData();
|
|
328
344
|
await lockPreviousFileEntry;
|
|
329
|
-
await
|
|
330
|
-
|
|
345
|
+
await requestLockWriter();
|
|
346
|
+
bufferedDataWritten = true;
|
|
331
347
|
const { writable } = writer;
|
|
332
|
-
if (!
|
|
348
|
+
if (!dataDescriptor) {
|
|
333
349
|
const headerLength = 26;
|
|
334
350
|
const arrayBuffer = await sliceAsArrayBuffer(blob, 0, headerLength);
|
|
335
351
|
const arrayBufferView = new DataView(arrayBuffer);
|
|
336
|
-
if (!fileEntry.encrypted ||
|
|
352
|
+
if (!fileEntry.encrypted || zipCrypto) {
|
|
337
353
|
setUint32(arrayBufferView, 14, fileEntry.signature);
|
|
338
354
|
}
|
|
339
355
|
if (fileEntry.zip64) {
|
|
@@ -346,8 +362,8 @@ async function getFileEntry(zipWriter, name, reader, options) {
|
|
|
346
362
|
await writeUint8Array(writable, new Uint8Array(arrayBuffer));
|
|
347
363
|
blob = blob.slice(headerLength);
|
|
348
364
|
}
|
|
349
|
-
await blob.stream().pipeTo(writable, { preventClose: true });
|
|
350
|
-
|
|
365
|
+
await blob.stream().pipeTo(writable, { preventClose: true, signal });
|
|
366
|
+
bufferedDataWritten = false;
|
|
351
367
|
}
|
|
352
368
|
fileEntry.offset = zipWriter.offset;
|
|
353
369
|
if (fileEntry.zip64) {
|
|
@@ -359,23 +375,30 @@ async function getFileEntry(zipWriter, name, reader, options) {
|
|
|
359
375
|
zipWriter.offset += fileEntry.length;
|
|
360
376
|
return fileEntry;
|
|
361
377
|
} catch (error) {
|
|
362
|
-
if ((bufferedWrite &&
|
|
378
|
+
if ((bufferedWrite && bufferedDataWritten) || (!bufferedWrite && fileEntry.dataWritten)) {
|
|
363
379
|
error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
|
|
364
380
|
zipWriter.offset += fileWriter.size;
|
|
365
381
|
}
|
|
366
382
|
files.delete(name);
|
|
367
383
|
throw error;
|
|
368
384
|
} finally {
|
|
369
|
-
|
|
385
|
+
if (releaseLockCurrentFileEntry) {
|
|
386
|
+
releaseLockCurrentFileEntry();
|
|
387
|
+
}
|
|
370
388
|
if (releaseLockWriter) {
|
|
371
389
|
releaseLockWriter();
|
|
372
390
|
}
|
|
373
391
|
}
|
|
374
392
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
393
|
+
function requestLockCurrentFileEntry() {
|
|
394
|
+
fileEntry.lock = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
async function requestLockWriter() {
|
|
398
|
+
const { lockWriter } = zipWriter;
|
|
399
|
+
if (lockWriter) {
|
|
400
|
+
await lockWriter.then(() => delete zipWriter.lockWriter);
|
|
401
|
+
return requestLockWriter();
|
|
379
402
|
} else {
|
|
380
403
|
zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
|
|
381
404
|
}
|
|
@@ -517,7 +540,7 @@ async function createFileEntry(reader, pendingFileEntry, writable, config, optio
|
|
|
517
540
|
const rawLastModDate = dateArray[0];
|
|
518
541
|
setUint32(headerView, 6, rawLastModDate);
|
|
519
542
|
setUint16(headerView, 22, rawFilename.length);
|
|
520
|
-
const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length +
|
|
543
|
+
const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + rawExtraField.length;
|
|
521
544
|
setUint16(headerView, 24, extraFieldLength);
|
|
522
545
|
const localHeaderArray = new Uint8Array(30 + rawFilename.length + extraFieldLength);
|
|
523
546
|
const localHeaderView = getDataView(localHeaderArray);
|
|
@@ -527,16 +550,16 @@ async function createFileEntry(reader, pendingFileEntry, writable, config, optio
|
|
|
527
550
|
arraySet(localHeaderArray, rawExtraFieldAES, 30 + rawFilename.length);
|
|
528
551
|
arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, 30 + rawFilename.length + rawExtraFieldAES.length);
|
|
529
552
|
arraySet(localHeaderArray, rawExtraFieldNTFS, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length);
|
|
530
|
-
arraySet(localHeaderArray,
|
|
553
|
+
arraySet(localHeaderArray, rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
|
|
531
554
|
let result;
|
|
532
555
|
let compressedSize = 0;
|
|
533
556
|
if (reader) {
|
|
557
|
+
reader.chunkSize = getChunkSize(config);
|
|
534
558
|
await writeUint8Array(writable, localHeaderArray);
|
|
535
559
|
fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
|
|
536
560
|
const size = () => reader.size;
|
|
537
561
|
const readable = reader.readable;
|
|
538
562
|
readable.size = size;
|
|
539
|
-
readable.chunkSize = getChunkSize(config);
|
|
540
563
|
const workerOptions = {
|
|
541
564
|
options: {
|
|
542
565
|
codecType: CODEC_DEFLATE,
|
|
@@ -606,7 +629,15 @@ async function createFileEntry(reader, pendingFileEntry, writable, config, optio
|
|
|
606
629
|
await writeUint8Array(writable, dataDescriptorArray);
|
|
607
630
|
}
|
|
608
631
|
const length = localHeaderArray.length + compressedSize + dataDescriptorArray.length;
|
|
609
|
-
Object.assign(fileEntry, {
|
|
632
|
+
Object.assign(fileEntry, {
|
|
633
|
+
compressedSize,
|
|
634
|
+
lastModDate,
|
|
635
|
+
rawLastModDate,
|
|
636
|
+
creationDate,
|
|
637
|
+
lastAccessDate,
|
|
638
|
+
encrypted,
|
|
639
|
+
length
|
|
640
|
+
});
|
|
610
641
|
return fileEntry;
|
|
611
642
|
}
|
|
612
643
|
|