@zip.js/zip.js 2.5.21 → 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 +71 -44
- package/dist/zip-fs-full.min.js +1 -1
- package/dist/zip-fs.js +71 -44
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-full.js +71 -44
- 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 +71 -44
- 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 +65 -36
- 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;
|
|
320
|
+
let fileWriter;
|
|
304
321
|
files.set(name, fileEntry);
|
|
305
322
|
try {
|
|
306
323
|
let lockPreviousFileEntry;
|
|
307
|
-
|
|
308
|
-
if (options.keepOrder) {
|
|
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;
|
|
@@ -320,20 +336,20 @@ async function getFileEntry(zipWriter, name, reader, options) {
|
|
|
320
336
|
}
|
|
321
337
|
fileWriter = writer;
|
|
322
338
|
}
|
|
323
|
-
fileEntry = await createFileEntry(reader, fileWriter.writable, zipWriter.config, options);
|
|
339
|
+
fileEntry = await createFileEntry(reader, fileEntry, fileWriter.writable, zipWriter.config, options);
|
|
324
340
|
files.set(name, fileEntry);
|
|
325
341
|
fileEntry.filename = name;
|
|
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,32 +375,37 @@ 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
|
-
|
|
365
|
-
zipWriter.offset += fileEntry.uncompressedSize;
|
|
366
|
-
}
|
|
380
|
+
zipWriter.offset += fileWriter.size;
|
|
367
381
|
}
|
|
368
382
|
files.delete(name);
|
|
369
383
|
throw error;
|
|
370
384
|
} finally {
|
|
371
|
-
|
|
385
|
+
if (releaseLockCurrentFileEntry) {
|
|
386
|
+
releaseLockCurrentFileEntry();
|
|
387
|
+
}
|
|
372
388
|
if (releaseLockWriter) {
|
|
373
389
|
releaseLockWriter();
|
|
374
390
|
}
|
|
375
391
|
}
|
|
376
392
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
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();
|
|
381
402
|
} else {
|
|
382
403
|
zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
|
|
383
404
|
}
|
|
384
405
|
}
|
|
385
406
|
}
|
|
386
407
|
|
|
387
|
-
async function createFileEntry(reader, writable, config, options) {
|
|
408
|
+
async function createFileEntry(reader, pendingFileEntry, writable, config, options) {
|
|
388
409
|
const {
|
|
389
410
|
rawFilename,
|
|
390
411
|
lastAccessDate,
|
|
@@ -519,7 +540,7 @@ async function createFileEntry(reader, writable, config, options) {
|
|
|
519
540
|
const rawLastModDate = dateArray[0];
|
|
520
541
|
setUint32(headerView, 6, rawLastModDate);
|
|
521
542
|
setUint16(headerView, 22, rawFilename.length);
|
|
522
|
-
const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length +
|
|
543
|
+
const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + rawExtraField.length;
|
|
523
544
|
setUint16(headerView, 24, extraFieldLength);
|
|
524
545
|
const localHeaderArray = new Uint8Array(30 + rawFilename.length + extraFieldLength);
|
|
525
546
|
const localHeaderView = getDataView(localHeaderArray);
|
|
@@ -529,16 +550,16 @@ async function createFileEntry(reader, writable, config, options) {
|
|
|
529
550
|
arraySet(localHeaderArray, rawExtraFieldAES, 30 + rawFilename.length);
|
|
530
551
|
arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, 30 + rawFilename.length + rawExtraFieldAES.length);
|
|
531
552
|
arraySet(localHeaderArray, rawExtraFieldNTFS, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length);
|
|
532
|
-
arraySet(localHeaderArray,
|
|
553
|
+
arraySet(localHeaderArray, rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
|
|
533
554
|
let result;
|
|
534
555
|
let compressedSize = 0;
|
|
535
556
|
if (reader) {
|
|
557
|
+
reader.chunkSize = getChunkSize(config);
|
|
536
558
|
await writeUint8Array(writable, localHeaderArray);
|
|
537
|
-
fileEntry.dataWritten = true;
|
|
559
|
+
fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
|
|
538
560
|
const size = () => reader.size;
|
|
539
561
|
const readable = reader.readable;
|
|
540
562
|
readable.size = size;
|
|
541
|
-
readable.chunkSize = getChunkSize(config);
|
|
542
563
|
const workerOptions = {
|
|
543
564
|
options: {
|
|
544
565
|
codecType: CODEC_DEFLATE,
|
|
@@ -562,7 +583,7 @@ async function createFileEntry(reader, writable, config, options) {
|
|
|
562
583
|
compressedSize = result.length;
|
|
563
584
|
} else {
|
|
564
585
|
await writeUint8Array(writable, localHeaderArray);
|
|
565
|
-
fileEntry.dataWritten = true;
|
|
586
|
+
fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
|
|
566
587
|
}
|
|
567
588
|
let dataDescriptorArray = new Uint8Array();
|
|
568
589
|
let dataDescriptorView, dataDescriptorOffset = 0;
|
|
@@ -608,7 +629,15 @@ async function createFileEntry(reader, writable, config, options) {
|
|
|
608
629
|
await writeUint8Array(writable, dataDescriptorArray);
|
|
609
630
|
}
|
|
610
631
|
const length = localHeaderArray.length + compressedSize + dataDescriptorArray.length;
|
|
611
|
-
Object.assign(fileEntry, {
|
|
632
|
+
Object.assign(fileEntry, {
|
|
633
|
+
compressedSize,
|
|
634
|
+
lastModDate,
|
|
635
|
+
rawLastModDate,
|
|
636
|
+
creationDate,
|
|
637
|
+
lastAccessDate,
|
|
638
|
+
encrypted,
|
|
639
|
+
length
|
|
640
|
+
});
|
|
612
641
|
return fileEntry;
|
|
613
642
|
}
|
|
614
643
|
|