@zip.js/zip.js 2.6.16 → 2.6.19

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.
Files changed (140) hide show
  1. package/.eslintrc.json +0 -0
  2. package/README.md +2 -0
  3. package/cli-deno/mc-zip.js +0 -0
  4. package/dist/README.md +0 -0
  5. package/dist/z-worker-fflate.js +1 -1
  6. package/dist/z-worker-pako.js +1 -1
  7. package/dist/z-worker.js +1 -1
  8. package/dist/zip-fs-full.js +78 -70
  9. package/dist/zip-fs-full.min.js +1 -1
  10. package/dist/zip-fs.js +78 -70
  11. package/dist/zip-fs.min.js +1 -1
  12. package/dist/zip-full.js +73 -70
  13. package/dist/zip-full.min.js +1 -1
  14. package/dist/zip-no-worker-deflate.min.js +1 -1
  15. package/dist/zip-no-worker-inflate.min.js +1 -1
  16. package/dist/zip-no-worker.min.js +1 -1
  17. package/dist/zip.js +73 -70
  18. package/dist/zip.min.js +1 -1
  19. package/index-fflate.js +0 -0
  20. package/index.d.ts +17 -18
  21. package/index.js +0 -0
  22. package/lib/core/codec-interface.js +12 -1
  23. package/lib/core/codec-pool-worker.js +1 -0
  24. package/lib/core/codec-pool.js +0 -0
  25. package/lib/core/configuration.js +0 -0
  26. package/lib/core/constants.js +0 -0
  27. package/lib/core/io.js +27 -42
  28. package/lib/core/streams/aes-crypto-stream.js +0 -0
  29. package/lib/core/streams/codec-stream.js +0 -0
  30. package/lib/core/streams/codecs/crc32.js +0 -0
  31. package/lib/core/streams/codecs/deflate.js +0 -0
  32. package/lib/core/streams/codecs/inflate.js +0 -0
  33. package/lib/core/streams/codecs/sjcl.js +0 -0
  34. package/lib/core/streams/common-crypto.js +0 -0
  35. package/lib/core/streams/crc32-stream.js +0 -0
  36. package/lib/core/streams/zip-crypto-stream.js +0 -0
  37. package/lib/core/streams/zip-entry-stream.js +1 -9
  38. package/lib/core/util/cp437-decode.js +0 -0
  39. package/lib/core/util/decode-text.js +0 -0
  40. package/lib/core/util/default-mime-type.js +0 -0
  41. package/lib/core/util/encode-text.js +0 -0
  42. package/lib/core/util/mime-type.js +0 -0
  43. package/lib/core/util/stream-codec-shim.js +0 -0
  44. package/lib/core/z-worker-core.js +0 -0
  45. package/lib/core/zip-entry.js +0 -0
  46. package/lib/core/zip-fs-core.js +5 -0
  47. package/lib/core/zip-reader.js +2 -1
  48. package/lib/core/zip-writer.js +30 -16
  49. package/lib/z-worker-bootstrap-fflate.js +0 -0
  50. package/lib/z-worker-bootstrap-pako.js +0 -0
  51. package/lib/z-worker-fflate.js +0 -0
  52. package/lib/z-worker-inline-template-base64.js +0 -0
  53. package/lib/z-worker-inline-template.js +0 -0
  54. package/lib/z-worker-inline.js +1 -1
  55. package/lib/z-worker.js +0 -0
  56. package/lib/zip-fflate-shim.js +0 -0
  57. package/lib/zip-fs.js +0 -0
  58. package/lib/zip-full-fflate.js +0 -0
  59. package/lib/zip-full.js +0 -0
  60. package/lib/zip-no-worker-deflate.js +0 -0
  61. package/lib/zip-no-worker-fflate-deflate.js +0 -0
  62. package/lib/zip-no-worker-fflate-inflate.js +0 -0
  63. package/lib/zip-no-worker-fflate.js +0 -0
  64. package/lib/zip-no-worker-inflate.js +0 -0
  65. package/lib/zip-no-worker.js +0 -0
  66. package/lib/zip.js +0 -0
  67. package/package.json +1 -1
  68. package/rollup-fflate.config.dev.js +0 -0
  69. package/rollup-fflate.config.js +0 -0
  70. package/rollup.config.dev.js +0 -0
  71. package/rollup.config.js +0 -0
  72. package/tests/all/loader.html +0 -0
  73. package/tests/all/test-abort-signal-read.js +1 -1
  74. package/tests/all/test-abort-signal-write.js +0 -0
  75. package/tests/all/test-array.js +1 -1
  76. package/tests/all/test-base64.js +1 -1
  77. package/tests/all/test-blob.js +1 -1
  78. package/tests/all/test-codecs-interoperability.js +1 -1
  79. package/tests/all/test-crc.js +1 -1
  80. package/tests/all/test-crypto.js +1 -1
  81. package/tests/all/test-custom-io.js +1 -2
  82. package/tests/all/test-data-descriptor-signature.js +1 -1
  83. package/tests/all/test-data-descriptor.js +1 -1
  84. package/tests/all/test-duplicated-filename.js +0 -0
  85. package/tests/all/test-empty.js +1 -1
  86. package/tests/all/test-extended-timestamp.js +1 -1
  87. package/tests/all/test-extra-field.js +1 -1
  88. package/tests/all/test-fflate-no-worker.js +1 -1
  89. package/tests/all/test-fflate.js +1 -1
  90. package/tests/all/test-fs-base64.js +0 -0
  91. package/tests/all/test-fs-export-options.js +0 -0
  92. package/tests/all/test-fs-http-import.js +0 -0
  93. package/tests/all/test-fs-http-reader.js +0 -0
  94. package/tests/all/test-fs-replace.js +0 -0
  95. package/tests/all/test-fs-streams.js +0 -0
  96. package/tests/all/test-fs-text.js +0 -0
  97. package/tests/all/test-fs-unzip-store.js +0 -0
  98. package/tests/all/test-fs.js +0 -0
  99. package/tests/all/test-http-crypto.js +0 -0
  100. package/tests/all/test-http-range.js +0 -0
  101. package/tests/all/test-http-zip64.js +0 -0
  102. package/tests/all/test-invalid-crc.js +0 -0
  103. package/tests/all/test-multiple-writers.js +19 -0
  104. package/tests/all/test-no-worker.js +1 -1
  105. package/tests/all/test-pako-no-worker.js +1 -1
  106. package/tests/all/test-pako.js +1 -1
  107. package/tests/all/test-parallel-reads.js +1 -1
  108. package/tests/all/test-parallel-writes-auto-buffered.js +1 -1
  109. package/tests/all/test-parallel-writes-ordered.js +1 -1
  110. package/tests/all/test-parallel-writes.js +1 -1
  111. package/tests/all/test-readable-stream.js +1 -1
  112. package/tests/all/test-readable-zip-stream.js +0 -0
  113. package/tests/all/test-safe-closing.js +1 -1
  114. package/tests/all/test-store.js +1 -1
  115. package/tests/all/test-sw-worker.js +0 -0
  116. package/tests/all/test-sw.js +0 -0
  117. package/tests/all/test-worker-timeout.js +1 -1
  118. package/tests/all/test-wrapped.js +45 -3
  119. package/tests/all/test-writable-stream.js +1 -1
  120. package/tests/all/test-zip64-auto.js +47 -4
  121. package/tests/all/test-zip64-crypto.js +1 -1
  122. package/tests/all/test-zip64.js +1 -1
  123. package/tests/all/test-zipcrypto.js +1 -1
  124. package/tests/data/lorem-encrypted.zip +0 -0
  125. package/tests/data/lorem-invalid-crc.zip +0 -0
  126. package/tests/data/lorem-store.zip +0 -0
  127. package/tests/data/lorem-zip64.zip +0 -0
  128. package/tests/data/lorem.txt +0 -0
  129. package/tests/data/lorem.zip +0 -0
  130. package/tests/deno-runner.js +0 -0
  131. package/tests/index.html +0 -0
  132. package/tests/node-runner.js +0 -0
  133. package/tests/tests-data.js +1 -0
  134. package/tests/vendor/fflate-es2019.min.js +0 -0
  135. package/tests/vendor/fflate.min.js +0 -0
  136. package/tests/vendor/pako.min.js +0 -0
  137. package/tests/vendor/pako_deflate.min.js +0 -0
  138. package/tests/vendor/pako_inflate.min.js +0 -0
  139. package/tests/web-runner.js +1 -1
  140. package/tsconfig.json +0 -0
@@ -27,6 +27,7 @@
27
27
  */
28
28
 
29
29
  // deno-lint-ignore-file no-this-alias
30
+ /* global TransformStream */
30
31
 
31
32
  import {
32
33
  InflateStream,
@@ -68,7 +69,17 @@ class Codec {
68
69
 
69
70
  async function run(StreamConstructor) {
70
71
  const stream = new StreamConstructor(codecConstructor, options, config);
71
- await readable.pipeThrough(stream).pipeTo(writable, { preventClose: true });
72
+ await readable
73
+ .pipeThrough(stream)
74
+ .pipeThrough(new TransformStream({
75
+ transform(chunk, controller) {
76
+ if (chunk && chunk.length) {
77
+ writable.size += chunk.length;
78
+ controller.enqueue(chunk);
79
+ }
80
+ }
81
+ }))
82
+ .pipeTo(writable, { preventClose: true, preventAbort: true });
72
83
  const { size, signature } = stream;
73
84
  return { size, signature };
74
85
  }
@@ -208,6 +208,7 @@ function createWebWorkerInterface(workerData, { baseURL, chunkSize }) {
208
208
  }
209
209
  if (type == MESSAGE_DATA) {
210
210
  await writer.ready;
211
+ workerData.writable.size += data.byteLength;
211
212
  await writer.write(new Uint8Array(data));
212
213
  }
213
214
  if (type == MESSAGE_CLOSE) {
File without changes
File without changes
File without changes
package/lib/core/io.js CHANGED
@@ -26,7 +26,7 @@
26
26
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
27
  */
28
28
 
29
- /* global Blob, atob, btoa, XMLHttpRequest, URL, fetch, ReadableStream, WritableStream, FileReader */
29
+ /* global Blob, atob, btoa, XMLHttpRequest, URL, fetch, ReadableStream, WritableStream, FileReader, TransformStream, Response */
30
30
 
31
31
  const ERR_HTTP_STATUS = "HTTP error ";
32
32
  const ERR_HTTP_RANGE = "HTTP Range not supported";
@@ -78,7 +78,7 @@ class Reader extends Stream {
78
78
  }
79
79
  }
80
80
 
81
- class WriterStream extends Stream {
81
+ class Writer extends Stream {
82
82
 
83
83
  constructor() {
84
84
  super();
@@ -88,18 +88,15 @@ class WriterStream extends Stream {
88
88
  return writer.writeUint8Array(chunk);
89
89
  }
90
90
  });
91
- Object.defineProperty(this, "writable", {
91
+ Object.defineProperty(writer, "writable", {
92
92
  get() {
93
93
  return writable;
94
94
  }
95
95
  });
96
96
  }
97
- }
98
-
99
- class Writer extends WriterStream {
100
97
 
101
- writeUint8Array(array) {
102
- this.size += array.length;
98
+ writeUint8Array() {
99
+ // abstract
103
100
  }
104
101
  }
105
102
 
@@ -131,7 +128,6 @@ class TextWriter extends Writer {
131
128
  }
132
129
 
133
130
  writeUint8Array(array) {
134
- super.writeUint8Array(array);
135
131
  this.blob = new Blob([this.blob, array.buffer], { type: CONTENT_TYPE_TEXT_PLAIN });
136
132
  }
137
133
 
@@ -186,7 +182,6 @@ class Data64URIWriter extends Writer {
186
182
  }
187
183
 
188
184
  writeUint8Array(array) {
189
- super.writeUint8Array(array);
190
185
  const writer = this;
191
186
  let indexArray = 0;
192
187
  let dataString = writer.pending;
@@ -224,48 +219,35 @@ class BlobReader extends Reader {
224
219
  }
225
220
  }
226
221
 
227
- class BlobWriter extends Writer {
222
+ class BlobWriter extends Stream {
228
223
 
229
224
  constructor(contentType) {
230
225
  super();
231
226
  const writer = this;
232
227
  writer.contentType = contentType;
233
- writer.arrayBuffersMaxlength = 8;
234
- initArrayBuffers(writer);
228
+ writer.transformStream = new TransformStream();
229
+ Object.defineProperty(this, "writable", {
230
+ get() {
231
+ return writer.transformStream.writable;
232
+ }
233
+ });
235
234
  }
236
235
 
237
- writeUint8Array(array) {
238
- super.writeUint8Array(array);
236
+ init() {
237
+ super.init();
239
238
  const writer = this;
240
- if (writer.arrayBuffers.length == writer.arrayBuffersMaxlength) {
241
- flushArrayBuffers(writer);
242
- }
243
- writer.arrayBuffers.push(array.buffer);
239
+ const {
240
+ transformStream,
241
+ contentType
242
+ } = writer;
243
+ writer.blob = new Response(transformStream.readable).blob({ type: contentType });
244
244
  }
245
245
 
246
246
  getData() {
247
- const writer = this;
248
- if (!writer.blob) {
249
- if (writer.arrayBuffers.length) {
250
- flushArrayBuffers(writer);
251
- }
252
- writer.blob = writer.pendingBlob;
253
- initArrayBuffers(writer);
254
- }
255
- return writer.blob;
247
+ return this.blob;
256
248
  }
257
249
  }
258
250
 
259
- function initArrayBuffers(blobWriter) {
260
- blobWriter.pendingBlob = new Blob([], { type: blobWriter.contentType });
261
- blobWriter.arrayBuffers = [];
262
- }
263
-
264
- function flushArrayBuffers(blobWriter) {
265
- blobWriter.pendingBlob = new Blob([blobWriter.pendingBlob, ...blobWriter.arrayBuffers], { type: blobWriter.contentType });
266
- blobWriter.arrayBuffers = [];
267
- }
268
-
269
251
  class FetchReader extends Reader {
270
252
 
271
253
  constructor(url, options) {
@@ -495,18 +477,21 @@ class Uint8ArrayReader extends Reader {
495
477
  class Uint8ArrayWriter extends Writer {
496
478
 
497
479
  init(initSize = 0) {
498
- this.array = new Uint8Array(initSize);
480
+ super.init();
481
+ const writer = this;
482
+ writer.offset = 0;
483
+ writer.array = new Uint8Array(initSize);
499
484
  }
500
485
 
501
486
  writeUint8Array(array) {
502
487
  const writer = this;
503
- if (writer.size + array.length > writer.array.length) {
488
+ if (writer.offset + array.length > writer.array.length) {
504
489
  const previousArray = writer.array;
505
490
  writer.array = new Uint8Array(previousArray.length + array.length);
506
491
  writer.array.set(previousArray);
507
492
  }
508
- writer.array.set(array, writer.size);
509
- super.writeUint8Array(array);
493
+ writer.array.set(array, writer.offset);
494
+ writer.offset += array.length;
510
495
  }
511
496
 
512
497
  getData() {
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -167,15 +167,7 @@ function filterEmptyChunks(readable) {
167
167
  }
168
168
 
169
169
  function setReadable(stream, readable, flush) {
170
- stream.size = 0;
171
- readable = readable.pipeThrough(new TransformStream({
172
- transform(chunk, controller) {
173
- if (chunk && chunk.length) {
174
- stream.size += chunk.length;
175
- controller.enqueue(chunk);
176
- }
177
- }, flush
178
- }));
170
+ readable = readable.pipeThrough(new TransformStream({ flush }));
179
171
  Object.defineProperty(stream, "readable", {
180
172
  get() {
181
173
  return readable;
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -437,6 +437,11 @@ class FS {
437
437
  await this.root.importData64URI(dataURI, options);
438
438
  }
439
439
 
440
+ async importUint8Array(array, options) {
441
+ resetFS(this);
442
+ await this.root.importUint8Array(array, options);
443
+ }
444
+
440
445
  async importHttpContent(url, options) {
441
446
  resetFS(this);
442
447
  await this.root.importHttpContent(url, options);
@@ -344,7 +344,8 @@ class ZipEntry {
344
344
  codecConstructor: config.Inflate
345
345
  };
346
346
  await runWorker({ readable, writable }, workerOptions);
347
- if (!writer.preventClose) {
347
+ const preventClose = getOptionValue(zipEntry, options, "preventClose");
348
+ if (!preventClose) {
348
349
  await writable.getWriter().close();
349
350
  }
350
351
  return writer.getData ? writer.getData() : writable;
@@ -93,13 +93,16 @@ const pendingEntries = [];
93
93
  class ZipWriter {
94
94
 
95
95
  constructor(writer, options = {}) {
96
+ if (writer.writable.size == undefined) {
97
+ writer.writable.size = 0;
98
+ }
96
99
  Object.assign(this, {
97
100
  writer,
98
101
  options,
99
102
  config: getConfiguration(),
100
103
  files: new Map(),
101
104
  filenames: new Set(),
102
- offset: writer.size || 0,
105
+ offset: writer.writable.size,
103
106
  pendingCompressedSize: 0,
104
107
  pendingAddFileCalls: new Set()
105
108
  });
@@ -321,7 +324,6 @@ async function getFileEntry(zipWriter, name, reader, options) {
321
324
  let releaseLockCurrentFileEntry;
322
325
  let writingBufferedData;
323
326
  let fileWriter;
324
- let fileWriterSize;
325
327
  files.set(name, fileEntry);
326
328
  try {
327
329
  let lockPreviousFileEntry;
@@ -331,26 +333,30 @@ async function getFileEntry(zipWriter, name, reader, options) {
331
333
  }
332
334
  if (options.bufferedWrite || zipWriter.lockWriter || !dataDescriptor) {
333
335
  fileWriter = new BlobWriter();
334
- fileWriter.init();
336
+ fileWriter.writable.size = 0;
335
337
  bufferedWrite = true;
336
- } else {
337
- zipWriter.lockWriter = Promise.resolve();
338
338
  await initStream(writer);
339
+ } else {
339
340
  fileWriter = writer;
341
+ zipWriter.lockWriter = Promise.resolve();
342
+ releaseLockWriter = () => delete zipWriter.lockWriter;
340
343
  }
341
- fileWriterSize = fileWriter.size;
342
- fileEntry = await createFileEntry(reader, fileEntry, fileWriter.writable, zipWriter.config, options);
344
+ await initStream(fileWriter);
345
+ if (!bufferedWrite) {
346
+ await lockPreviousFileEntry;
347
+ }
348
+ fileEntry = await createFileEntry(reader, fileWriter, fileEntry, zipWriter.config, options);
343
349
  files.set(name, fileEntry);
344
350
  fileEntry.filename = name;
345
351
  if (bufferedWrite) {
346
- let blob = fileWriter.getData();
352
+ await fileWriter.writable.getWriter().close();
353
+ let blob = await fileWriter.getData();
347
354
  await lockPreviousFileEntry;
348
355
  await requestLockWriter();
349
356
  writingBufferedData = true;
350
357
  const { writable } = writer;
351
358
  if (!dataDescriptor) {
352
- const headerLength = 26;
353
- const arrayBuffer = await sliceAsArrayBuffer(blob, 0, headerLength);
359
+ const arrayBuffer = await sliceAsArrayBuffer(blob, 0, 26);
354
360
  const arrayBufferView = new DataView(arrayBuffer);
355
361
  if (!fileEntry.encrypted || zipCrypto) {
356
362
  setUint32(arrayBufferView, 14, fileEntry.signature);
@@ -363,7 +369,7 @@ async function getFileEntry(zipWriter, name, reader, options) {
363
369
  setUint32(arrayBufferView, 22, fileEntry.uncompressedSize);
364
370
  }
365
371
  await writeData(writable, new Uint8Array(arrayBuffer));
366
- blob = blob.slice(headerLength);
372
+ blob = blob.slice(arrayBuffer.byteLength);
367
373
  }
368
374
  await blob.stream().pipeTo(writable, { preventClose: true, signal });
369
375
  writingBufferedData = false;
@@ -383,7 +389,11 @@ async function getFileEntry(zipWriter, name, reader, options) {
383
389
  if (error) {
384
390
  error.corruptedEntry = true;
385
391
  }
386
- zipWriter.offset += fileWriter.size - fileWriterSize;
392
+ if (bufferedWrite) {
393
+ zipWriter.offset += fileWriter.writable.size;
394
+ } else {
395
+ zipWriter.offset = fileWriter.writable.size;
396
+ }
387
397
  }
388
398
  files.delete(name);
389
399
  throw error;
@@ -411,7 +421,7 @@ async function getFileEntry(zipWriter, name, reader, options) {
411
421
  }
412
422
  }
413
423
 
414
- async function createFileEntry(reader, pendingFileEntry, writable, config, options) {
424
+ async function createFileEntry(reader, writer, pendingFileEntry, config, options) {
415
425
  const {
416
426
  rawFilename,
417
427
  lastAccessDate,
@@ -504,7 +514,7 @@ async function createFileEntry(reader, pendingFileEntry, writable, config, optio
504
514
  internalFileAttribute,
505
515
  externalFileAttribute
506
516
  };
507
- let uncompressedSize = fileEntry.uncompressedSize = 0;
517
+ let uncompressedSize = 0;
508
518
  let bitFlag = BITFLAG_LANG_ENCODING_FLAG;
509
519
  if (dataDescriptor) {
510
520
  bitFlag = bitFlag | BITFLAG_DATA_DESCRIPTOR;
@@ -560,6 +570,7 @@ async function createFileEntry(reader, pendingFileEntry, writable, config, optio
560
570
  arraySet(localHeaderArray, rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
561
571
  let result;
562
572
  let compressedSize = 0;
573
+ const { writable } = writer;
563
574
  fileEntry.writingData = pendingFileEntry.writingData = true;
564
575
  if (reader) {
565
576
  reader.chunkSize = getChunkSize(config);
@@ -585,9 +596,10 @@ async function createFileEntry(reader, pendingFileEntry, writable, config, optio
585
596
  streamOptions: { signal, size, onstart, onprogress, onend },
586
597
  codecConstructor: config.Deflate
587
598
  };
599
+ const previousSize = writable.size;
588
600
  result = await runWorker({ readable, writable }, workerOptions);
589
- uncompressedSize = fileEntry.uncompressedSize = reader.size = readable.size();
590
- compressedSize = result.size;
601
+ uncompressedSize = reader.size = readable.size();
602
+ compressedSize = writable.size - previousSize;
591
603
  } else {
592
604
  await writeData(writable, localHeaderArray);
593
605
  }
@@ -765,6 +777,7 @@ async function closeFile(zipWriter, comment, options) {
765
777
  }
766
778
  }
767
779
  const { writable } = zipWriter.writer;
780
+ await initStream(zipWriter.writer);
768
781
  await writeData(writable, directoryArray);
769
782
  if (comment && comment.length) {
770
783
  await writeData(writable, comment);
@@ -782,6 +795,7 @@ function sliceAsArrayBuffer(blob, start, end) {
782
795
  async function writeData(writable, array) {
783
796
  const streamWriter = writable.getWriter();
784
797
  await streamWriter.ready;
798
+ writable.size += array.length;
785
799
  await streamWriter.write(array);
786
800
  streamWriter.releaseLock();
787
801
  }
File without changes
File without changes
File without changes
File without changes
File without changes