@zip.js/zip.js 2.7.64 → 2.7.66

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.
@@ -55,6 +55,9 @@ import {
55
55
  BITFLAG_ENCRYPTED,
56
56
  BITFLAG_DATA_DESCRIPTOR,
57
57
  BITFLAG_LANG_ENCODING_FLAG,
58
+ BITFLAG_LEVEL_FAST_MASK,
59
+ BITFLAG_LEVEL_SUPER_FAST_MASK,
60
+ BITFLAG_LEVEL_MAX_MASK,
58
61
  FILE_ATTR_MSDOS_DIR_MASK,
59
62
  FILE_ATTR_UNIX_TYPE_DIR,
60
63
  FILE_ATTR_UNIX_EXECUTABLE_MASK,
@@ -64,6 +67,9 @@ import {
64
67
  VERSION_AES,
65
68
  DIRECTORY_SIGNATURE,
66
69
  HEADER_SIZE,
70
+ HEADER_OFFSET_SIGNATURE,
71
+ HEADER_OFFSET_COMPRESSED_SIZE,
72
+ HEADER_OFFSET_UNCOMPRESSED_SIZE,
67
73
  MIN_DATE,
68
74
  MAX_DATE,
69
75
  UNDEFINED_VALUE
@@ -78,8 +84,8 @@ import {
78
84
  } from "./codec-pool.js";
79
85
  import {
80
86
  initStream,
81
- initReader,
82
- initWriter
87
+ GenericWriter,
88
+ GenericReader
83
89
  } from "./io.js";
84
90
  import { encodeText } from "./util/encode-text.js";
85
91
  import {
@@ -124,7 +130,7 @@ const pendingEntries = [];
124
130
  class ZipWriter {
125
131
 
126
132
  constructor(writer, options = {}) {
127
- writer = initWriter(writer);
133
+ writer = new GenericWriter(writer);
128
134
  const addSplitZipSignature =
129
135
  writer.availableSize !== UNDEFINED_VALUE && writer.availableSize > 0 && writer.availableSize !== Infinity &&
130
136
  writer.maxSize !== UNDEFINED_VALUE && writer.maxSize > 0 && writer.maxSize !== Infinity;
@@ -135,7 +141,7 @@ class ZipWriter {
135
141
  config: getConfiguration(),
136
142
  files: new Map(),
137
143
  filenames: new Set(),
138
- offset: options.offset === UNDEFINED_VALUE ? writer.writable.size : options.offset,
144
+ offset: options.offset === UNDEFINED_VALUE ? writer.size || writer.writable.size || 0 : options.offset,
139
145
  pendingEntriesSize: 0,
140
146
  pendingAddFileCalls: new Set(),
141
147
  bufferedWrites: 0
@@ -146,7 +152,7 @@ class ZipWriter {
146
152
  if (this.filenames.size) {
147
153
  throw new Error(ERR_ZIP_NOT_EMPTY);
148
154
  }
149
- ({ reader } = initReader(reader));
155
+ ({ reader } = new GenericReader(reader));
150
156
  const [zipEntriesReader, zipDataReader] = reader.readable.tee();
151
157
  const zipReader = new ZipReader(new ReadableStream({
152
158
  async start(controller) {
@@ -167,7 +173,7 @@ class ZipWriter {
167
173
  const entries = await zipReader.getEntries();
168
174
  await zipReader.close();
169
175
  await zipDataReader.pipeTo(this.writer.writable, { preventClose: true, preventAbort: true });
170
- this.writer.writable.size = this.offset = reader.size;
176
+ this.writer.size = this.offset = reader.size;
171
177
  this.filenames = new Set(entries.map(entry => entry.filename));
172
178
  this.files = new Map(entries.map(entry => {
173
179
  const {
@@ -206,7 +212,7 @@ class ZipWriter {
206
212
  headerView
207
213
  } = getHeaderArrayData({
208
214
  version,
209
- bitflag: getBitflag(level, languageEncodingFlag, dataDescriptor, encrypted),
215
+ bitFlag: getBitFlag(level, languageEncodingFlag, dataDescriptor, encrypted),
210
216
  compressionMethod,
211
217
  uncompressedSize,
212
218
  compressedSize,
@@ -465,7 +471,7 @@ async function addFile(zipWriter, name, reader, options) {
465
471
  }
466
472
  const zip64Enabled = zip64 === true;
467
473
  if (reader) {
468
- reader = initReader(reader);
474
+ reader = new GenericReader(reader);
469
475
  await initStream(reader);
470
476
  if (!passThrough) {
471
477
  if (reader.size === UNDEFINED_VALUE) {
@@ -590,8 +596,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
590
596
  }
591
597
  if ((options.bufferedWrite || zipWriter.writerLocked || (zipWriter.bufferedWrites && keepOrder) || !dataDescriptor) && !usdz) {
592
598
  fileWriter = new TransformStream();
593
- blobPromise = new Response(fileWriter.readable).blob();
594
- fileWriter.writable.size = 0;
599
+ fileWriter.size = 0;
595
600
  bufferedWrite = true;
596
601
  zipWriter.bufferedWrites++;
597
602
  await initStream(writer);
@@ -600,19 +605,22 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
600
605
  await requestLockWriter();
601
606
  }
602
607
  await initStream(fileWriter);
603
- const { writable } = writer;
604
- let { diskOffset } = writer;
608
+ const { writable, diskOffset } = writer;
605
609
  if (zipWriter.addSplitZipSignature) {
606
610
  delete zipWriter.addSplitZipSignature;
607
611
  const signatureArray = new Uint8Array(4);
608
612
  const signatureArrayView = getDataView(signatureArray);
609
613
  setUint32(signatureArrayView, 0, SPLIT_ZIP_FILE_SIGNATURE);
610
- await writeData(writable, signatureArray);
614
+ await writeData(writer, signatureArray);
611
615
  zipWriter.offset += 4;
612
616
  }
613
617
  if (usdz) {
614
618
  appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
615
619
  }
620
+ const {
621
+ localHeaderView,
622
+ localHeaderArray
623
+ } = headerInfo;
616
624
  if (!bufferedWrite) {
617
625
  await lockPreviousFileEntry;
618
626
  await skipDiskIfNeeded(writable);
@@ -620,36 +628,38 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
620
628
  const { diskNumber } = writer;
621
629
  writingEntryData = true;
622
630
  fileEntry.diskNumberStart = diskNumber;
631
+ if (bufferedWrite) {
632
+ blobPromise = new Response(fileWriter.readable).blob();
633
+ } else {
634
+ await writeData(fileWriter, localHeaderArray);
635
+ }
623
636
  fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, zipWriter.config, options);
637
+ const { zip64 } = fileEntry;
624
638
  writingEntryData = false;
625
639
  files.set(name, fileEntry);
626
640
  fileEntry.filename = name;
627
641
  if (bufferedWrite) {
628
- await fileWriter.writable.getWriter().close();
629
- let blob = await blobPromise;
630
- await lockPreviousFileEntry;
642
+ const [blob] = await Promise.all([blobPromise, fileWriter.writable.getWriter().close(), lockPreviousFileEntry]);
631
643
  await requestLockWriter();
632
644
  writingBufferedEntryData = true;
633
645
  fileEntry.diskNumberStart = writer.diskNumber;
634
- diskOffset = writer.diskOffset;
635
- fileEntry.offset = zipWriter.offset - diskOffset;
636
- if (fileEntry.zip64) {
637
- setExtraFieldZip64Data(fileEntry);
638
- }
639
- if (fileEntry.zip64 || !dataDescriptor) {
640
- blob = await patchLocalHeader(fileEntry, blob, writable, options);
646
+ fileEntry.offset = zipWriter.offset - writer.diskOffset;
647
+ if (zip64) {
648
+ updateZip64ExtraField(fileEntry);
641
649
  }
650
+ updateLocalHeader(fileEntry, localHeaderView);
642
651
  await skipDiskIfNeeded(writable);
652
+ await writeData(writer, localHeaderArray);
643
653
  await blob.stream().pipeTo(writable, { preventClose: true, preventAbort: true, signal });
644
- writable.size += blob.size;
654
+ writer.size += fileWriter.size;
645
655
  writingBufferedEntryData = false;
646
656
  } else {
647
657
  fileEntry.offset = zipWriter.offset - diskOffset;
648
- if (fileEntry.zip64) {
649
- setExtraFieldZip64Data(fileEntry);
658
+ if (zip64) {
659
+ updateZip64ExtraField(fileEntry);
650
660
  }
651
661
  }
652
- if (fileEntry.offset > MAX_32_BITS && !fileEntry.zip64) {
662
+ if (fileEntry.offset > MAX_32_BITS && !zip64) {
653
663
  throw new Error(ERR_UNSUPPORTED_FORMAT);
654
664
  }
655
665
  zipWriter.offset += fileEntry.size;
@@ -666,9 +676,9 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
666
676
  }
667
677
  }
668
678
  if (bufferedWrite) {
669
- zipWriter.offset += fileWriter.writable.size;
679
+ zipWriter.offset += fileWriter.size;
670
680
  } else {
671
- zipWriter.offset = fileWriter.writable.size;
681
+ zipWriter.offset = fileWriter.size;
672
682
  }
673
683
  }
674
684
  files.delete(name);
@@ -714,7 +724,6 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
714
724
  metadataSize
715
725
  } = entryInfo;
716
726
  const {
717
- localHeaderArray,
718
727
  headerArray,
719
728
  headerView,
720
729
  lastModDate,
@@ -796,9 +805,8 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
796
805
  const { writable } = writer;
797
806
  if (reader) {
798
807
  reader.chunkSize = getChunkSize(config);
799
- await writeData(writable, localHeaderArray);
800
808
  const readable = reader.readable;
801
- const size = readable.size = reader.size;
809
+ const size = reader.size;
802
810
  const workerOptions = {
803
811
  options: {
804
812
  codecType: CODEC_DEFLATE,
@@ -818,15 +826,21 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
818
826
  config,
819
827
  streamOptions: { signal, size, onstart, onprogress, onend }
820
828
  };
821
- const result = await runWorker({ readable, writable }, workerOptions);
822
- compressedSize = result.outputSize;
823
- if (!passThrough) {
824
- uncompressedSize = result.inputSize;
825
- signature = result.signature;
829
+ try {
830
+ const result = await runWorker({ readable, writable }, workerOptions);
831
+ compressedSize = result.outputSize;
832
+ writer.size += compressedSize;
833
+ if (!passThrough) {
834
+ uncompressedSize = result.inputSize;
835
+ signature = result.signature;
836
+ }
837
+ } catch (error) {
838
+ if (error.outputSize !== UNDEFINED_VALUE) {
839
+ writer.size += error.outputSize;
840
+ }
841
+ throw error;
826
842
  }
827
- writable.size += uncompressedSize;
828
- } else {
829
- await writeData(writable, localHeaderArray);
843
+
830
844
  }
831
845
  setEntryInfo({
832
846
  signature,
@@ -836,7 +850,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
836
850
  dataDescriptorInfo
837
851
  }, options);
838
852
  if (dataDescriptor) {
839
- await writeData(writable, dataDescriptorArray);
853
+ await writeData(writer, dataDescriptorArray);
840
854
  }
841
855
  Object.assign(fileEntry, {
842
856
  uncompressedSize,
@@ -1000,7 +1014,7 @@ function getHeaderInfo(options) {
1000
1014
  rawLastModDate
1001
1015
  } = getHeaderArrayData({
1002
1016
  version,
1003
- bitflag: getBitflag(level, useUnicodeFileNames, dataDescriptor, encrypted),
1017
+ bitFlag: getBitFlag(level, useUnicodeFileNames, dataDescriptor, encrypted),
1004
1018
  compressionMethod,
1005
1019
  uncompressedSize,
1006
1020
  lastModDate: lastModDate < MIN_DATE ? MIN_DATE : lastModDate > MAX_DATE ? MAX_DATE : lastModDate,
@@ -1029,6 +1043,7 @@ function getHeaderInfo(options) {
1029
1043
  arraySet(localHeaderArray, rawExtraField, localHeaderOffset);
1030
1044
  return {
1031
1045
  localHeaderArray,
1046
+ localHeaderView,
1032
1047
  headerArray,
1033
1048
  headerView,
1034
1049
  lastModDate,
@@ -1068,12 +1083,11 @@ function appendExtraFieldUSDZ(entryInfo, zipWriterOffset) {
1068
1083
  entryInfo.metadataSize += extraBytesLength;
1069
1084
  }
1070
1085
 
1071
- function getDataDescriptorInfo(options) {
1072
- const {
1073
- zip64,
1074
- dataDescriptor,
1075
- dataDescriptorSignature
1076
- } = options;
1086
+ function getDataDescriptorInfo({
1087
+ zip64,
1088
+ dataDescriptor,
1089
+ dataDescriptorSignature
1090
+ }) {
1077
1091
  let dataDescriptorArray = new Uint8Array();
1078
1092
  let dataDescriptorView, dataDescriptorOffset = 0;
1079
1093
  if (dataDescriptor) {
@@ -1091,14 +1105,17 @@ function getDataDescriptorInfo(options) {
1091
1105
  };
1092
1106
  }
1093
1107
 
1094
- function setEntryInfo(entryInfo, options) {
1095
- const {
1096
- signature,
1097
- compressedSize,
1098
- uncompressedSize,
1099
- headerInfo,
1100
- dataDescriptorInfo
1101
- } = entryInfo;
1108
+ function setEntryInfo({
1109
+ signature,
1110
+ compressedSize,
1111
+ uncompressedSize,
1112
+ headerInfo,
1113
+ dataDescriptorInfo
1114
+ }, {
1115
+ zip64,
1116
+ zipCrypto,
1117
+ dataDescriptor
1118
+ }) {
1102
1119
  const {
1103
1120
  headerView,
1104
1121
  encrypted
@@ -1107,13 +1124,8 @@ function setEntryInfo(entryInfo, options) {
1107
1124
  dataDescriptorView,
1108
1125
  dataDescriptorOffset
1109
1126
  } = dataDescriptorInfo;
1110
- const {
1111
- zip64,
1112
- zipCrypto,
1113
- dataDescriptor
1114
- } = options;
1115
1127
  if ((!encrypted || zipCrypto) && signature !== UNDEFINED_VALUE) {
1116
- setUint32(headerView, 10, signature);
1128
+ setUint32(headerView, HEADER_OFFSET_SIGNATURE, signature);
1117
1129
  if (dataDescriptor) {
1118
1130
  setUint32(dataDescriptorView, dataDescriptorOffset, signature);
1119
1131
  }
@@ -1124,8 +1136,8 @@ function setEntryInfo(entryInfo, options) {
1124
1136
  setBigUint64(dataDescriptorView, dataDescriptorOffset + 12, BigInt(uncompressedSize));
1125
1137
  }
1126
1138
  } else {
1127
- setUint32(headerView, 14, compressedSize);
1128
- setUint32(headerView, 18, uncompressedSize);
1139
+ setUint32(headerView, HEADER_OFFSET_COMPRESSED_SIZE, compressedSize);
1140
+ setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, uncompressedSize);
1129
1141
  if (dataDescriptor) {
1130
1142
  setUint32(dataDescriptorView, dataDescriptorOffset + 4, compressedSize);
1131
1143
  setUint32(dataDescriptorView, dataDescriptorOffset + 8, uncompressedSize);
@@ -1133,88 +1145,86 @@ function setEntryInfo(entryInfo, options) {
1133
1145
  }
1134
1146
  }
1135
1147
 
1136
- async function patchLocalHeader(fileEntry, entryData, writable, { zipCrypto, dataDescriptor }) {
1137
- const {
1138
- zip64,
1139
- rawFilename,
1140
- localExtraFieldZip64Length,
1141
- signature,
1142
- encrypted,
1143
- zip64UncompressedSize,
1144
- zip64CompressedSize,
1145
- zip64Offset,
1146
- zip64DiskNumberStart,
1147
- uncompressedSize,
1148
- compressedSize,
1149
- offset,
1150
- diskNumberStart
1151
- } = fileEntry;
1152
- let arrayBuffer;
1153
- let rawExtraFieldZip64Offset = HEADER_SIZE + 4 + getLength(rawFilename);
1154
- const arrayBufferSize = zip64 && localExtraFieldZip64Length ? rawExtraFieldZip64Offset + localExtraFieldZip64Length : HEADER_SIZE;
1155
- arrayBuffer = await entryData.slice(0, arrayBufferSize).arrayBuffer();
1156
- if (arrayBuffer.byteLength != arrayBufferSize) {
1157
- arrayBuffer = arrayBuffer.slice(0, arrayBufferSize);
1158
- }
1159
- const arrayBufferView = new DataView(arrayBuffer);
1148
+ function updateLocalHeader({
1149
+ rawFilename,
1150
+ dataDescriptor,
1151
+ encrypted,
1152
+ zip64,
1153
+ localExtraFieldZip64Length,
1154
+ signature,
1155
+ compressedSize,
1156
+ uncompressedSize,
1157
+ offset,
1158
+ diskNumberStart,
1159
+ zip64UncompressedSize,
1160
+ zip64CompressedSize,
1161
+ zip64Offset,
1162
+ zip64DiskNumberStart
1163
+ }, localHeaderView) {
1160
1164
  if (!dataDescriptor) {
1161
- if (!encrypted || zipCrypto) {
1162
- setUint32(arrayBufferView, 14, signature);
1165
+ if (!encrypted) {
1166
+ setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + 4, signature);
1163
1167
  }
1164
1168
  if (!zip64) {
1165
- setUint32(arrayBufferView, 18, compressedSize);
1166
- setUint32(arrayBufferView, 22, uncompressedSize);
1169
+ setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + 4, compressedSize);
1170
+ setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE + 4, uncompressedSize);
1167
1171
  }
1168
1172
  }
1169
1173
  if (zip64) {
1170
- setUint32(arrayBufferView, 18, MAX_32_BITS);
1171
- setUint32(arrayBufferView, 22, MAX_32_BITS);
1172
1174
  if (localExtraFieldZip64Length) {
1173
- rawExtraFieldZip64Offset += 4;
1175
+ let localHeaderOffset = HEADER_SIZE + 4 + getLength(rawFilename) + 4;
1174
1176
  if (zip64UncompressedSize) {
1175
- setBigUint64(arrayBufferView, rawExtraFieldZip64Offset, BigInt(uncompressedSize));
1176
- rawExtraFieldZip64Offset += 8;
1177
+ setBigUint64(localHeaderView, localHeaderOffset, BigInt(uncompressedSize));
1178
+ localHeaderOffset += 8;
1177
1179
  }
1178
1180
  if (zip64CompressedSize) {
1179
- setBigUint64(arrayBufferView, rawExtraFieldZip64Offset, BigInt(compressedSize));
1180
- rawExtraFieldZip64Offset += 8;
1181
+ setBigUint64(localHeaderView, localHeaderOffset, BigInt(compressedSize));
1182
+ localHeaderOffset += 8;
1181
1183
  }
1182
1184
  if (zip64Offset) {
1183
- setBigUint64(arrayBufferView, rawExtraFieldZip64Offset, BigInt(offset));
1184
- rawExtraFieldZip64Offset += 8;
1185
+ setBigUint64(localHeaderView, localHeaderOffset, BigInt(offset));
1186
+ localHeaderOffset += 8;
1185
1187
  }
1186
1188
  if (zip64DiskNumberStart) {
1187
- setUint32(arrayBufferView, rawExtraFieldZip64Offset, diskNumberStart);
1189
+ setUint32(localHeaderView, localHeaderOffset, diskNumberStart);
1188
1190
  }
1189
1191
  }
1190
1192
  }
1191
- await writeData(writable, new Uint8Array(arrayBuffer));
1192
- return entryData.slice(arrayBuffer.byteLength);
1193
1193
  }
1194
1194
 
1195
- function setExtraFieldZip64Data(fileEntry) {
1196
- const rawExtraFieldZip64View = getDataView(fileEntry.rawExtraFieldZip64);
1195
+ function updateZip64ExtraField({
1196
+ compressedSize,
1197
+ uncompressedSize,
1198
+ offset,
1199
+ diskNumberStart,
1200
+ zip64UncompressedSize,
1201
+ zip64CompressedSize,
1202
+ zip64Offset,
1203
+ zip64DiskNumberStart,
1204
+ rawExtraFieldZip64
1205
+ }) {
1206
+ const rawExtraFieldZip64View = getDataView(rawExtraFieldZip64);
1197
1207
  let rawExtraFieldZip64Offset = 4;
1198
- if (fileEntry.zip64UncompressedSize) {
1199
- setBigUint64(rawExtraFieldZip64View, rawExtraFieldZip64Offset, BigInt(fileEntry.uncompressedSize));
1208
+ if (zip64UncompressedSize) {
1209
+ setBigUint64(rawExtraFieldZip64View, rawExtraFieldZip64Offset, BigInt(uncompressedSize));
1200
1210
  rawExtraFieldZip64Offset += 8;
1201
1211
  }
1202
- if (fileEntry.zip64CompressedSize) {
1203
- setBigUint64(rawExtraFieldZip64View, rawExtraFieldZip64Offset, BigInt(fileEntry.compressedSize));
1212
+ if (zip64CompressedSize) {
1213
+ setBigUint64(rawExtraFieldZip64View, rawExtraFieldZip64Offset, BigInt(compressedSize));
1204
1214
  rawExtraFieldZip64Offset += 8;
1205
1215
  }
1206
- if (fileEntry.zip64Offset) {
1207
- setBigUint64(rawExtraFieldZip64View, rawExtraFieldZip64Offset, BigInt(fileEntry.offset));
1216
+ if (zip64Offset) {
1217
+ setBigUint64(rawExtraFieldZip64View, rawExtraFieldZip64Offset, BigInt(offset));
1208
1218
  rawExtraFieldZip64Offset += 8;
1209
1219
  }
1210
- if (fileEntry.zip64DiskNumberStart) {
1211
- setUint32(rawExtraFieldZip64View, rawExtraFieldZip64Offset, fileEntry.diskNumberStart);
1220
+ if (zip64DiskNumberStart) {
1221
+ setUint32(rawExtraFieldZip64View, rawExtraFieldZip64Offset, diskNumberStart);
1212
1222
  }
1213
1223
  }
1214
1224
 
1215
1225
  async function closeFile(zipWriter, comment, options) {
1216
1226
  const { files, writer } = zipWriter;
1217
- const { diskOffset, writable } = writer;
1227
+ const { diskOffset } = writer;
1218
1228
  let { diskNumber } = writer;
1219
1229
  let offset = 0;
1220
1230
  let directoryDataLength = 0;
@@ -1286,10 +1296,10 @@ async function closeFile(zipWriter, comment, options) {
1286
1296
  setUint32(directoryView, offset, CENTRAL_FILE_HEADER_SIGNATURE);
1287
1297
  setUint16(directoryView, offset + 4, versionMadeBy);
1288
1298
  if (!zip64UncompressedSize) {
1289
- setUint32(headerView, 18, uncompressedSize);
1299
+ setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, uncompressedSize);
1290
1300
  }
1291
1301
  if (!zip64CompressedSize) {
1292
- setUint32(headerView, 14, compressedSize);
1302
+ setUint32(headerView, HEADER_OFFSET_COMPRESSED_SIZE, compressedSize);
1293
1303
  }
1294
1304
  arraySet(directoryArray, headerArray, offset + 6);
1295
1305
  let directoryOffset = offset + HEADER_SIZE + 4;
@@ -1322,7 +1332,7 @@ async function closeFile(zipWriter, comment, options) {
1322
1332
  arraySet(directoryArray, rawComment, directoryOffset);
1323
1333
  if (offset - directoryDiskOffset > writer.availableSize) {
1324
1334
  writer.availableSize = 0;
1325
- await writeData(writable, directoryArray.slice(directoryDiskOffset, offset));
1335
+ await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
1326
1336
  directoryDiskOffset = offset;
1327
1337
  }
1328
1338
  offset = directoryOffset;
@@ -1335,7 +1345,7 @@ async function closeFile(zipWriter, comment, options) {
1335
1345
  }
1336
1346
  }
1337
1347
  }
1338
- await writeData(writable, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
1348
+ await writeData(writer, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
1339
1349
  let lastDiskNumber = writer.diskNumber;
1340
1350
  const { availableSize } = writer;
1341
1351
  if (availableSize < END_OF_CENTRAL_DIR_LENGTH) {
@@ -1391,17 +1401,18 @@ async function closeFile(zipWriter, comment, options) {
1391
1401
  throw new Error(ERR_INVALID_COMMENT);
1392
1402
  }
1393
1403
  }
1394
- await writeData(writable, endOfdirectoryArray);
1404
+ await writeData(writer, endOfdirectoryArray);
1395
1405
  if (commentLength) {
1396
- await writeData(writable, comment);
1406
+ await writeData(writer, comment);
1397
1407
  }
1398
1408
  }
1399
1409
 
1400
- async function writeData(writable, array) {
1410
+ async function writeData(writer, array) {
1411
+ const { writable } = writer;
1401
1412
  const streamWriter = writable.getWriter();
1402
1413
  try {
1403
1414
  await streamWriter.ready;
1404
- writable.size += getLength(array);
1415
+ writer.size += getLength(array);
1405
1416
  await streamWriter.write(array);
1406
1417
  } finally {
1407
1418
  streamWriter.releaseLock();
@@ -1455,7 +1466,7 @@ function getLength(...arrayLikes) {
1455
1466
 
1456
1467
  function getHeaderArrayData({
1457
1468
  version,
1458
- bitflag,
1469
+ bitFlag,
1459
1470
  compressionMethod,
1460
1471
  uncompressedSize,
1461
1472
  compressedSize,
@@ -1468,7 +1479,7 @@ function getHeaderArrayData({
1468
1479
  const headerArray = new Uint8Array(HEADER_SIZE);
1469
1480
  const headerView = getDataView(headerArray);
1470
1481
  setUint16(headerView, 0, version);
1471
- setUint16(headerView, 2, bitflag);
1482
+ setUint16(headerView, 2, bitFlag);
1472
1483
  setUint16(headerView, 4, compressionMethod);
1473
1484
  const dateArray = new Uint32Array(1);
1474
1485
  const dateView = getDataView(dateArray);
@@ -1477,10 +1488,10 @@ function getHeaderArrayData({
1477
1488
  const rawLastModDate = dateArray[0];
1478
1489
  setUint32(headerView, 6, rawLastModDate);
1479
1490
  if (zip64CompressedSize || compressedSize !== UNDEFINED_VALUE) {
1480
- setUint32(headerView, 14, zip64CompressedSize ? MAX_32_BITS : compressedSize);
1491
+ setUint32(headerView, HEADER_OFFSET_COMPRESSED_SIZE, zip64CompressedSize ? MAX_32_BITS : compressedSize);
1481
1492
  }
1482
1493
  if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
1483
- setUint32(headerView, 18, zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
1494
+ setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
1484
1495
  }
1485
1496
  setUint16(headerView, 22, getLength(rawFilename));
1486
1497
  setUint16(headerView, 24, extraFieldLength);
@@ -1491,7 +1502,8 @@ function getHeaderArrayData({
1491
1502
  };
1492
1503
  }
1493
1504
 
1494
- function getBitflag(level, useUnicodeFileNames, dataDescriptor, encrypted) {
1505
+
1506
+ function getBitFlag(level, useUnicodeFileNames, dataDescriptor, encrypted) {
1495
1507
  let bitFlag = 0;
1496
1508
  if (useUnicodeFileNames) {
1497
1509
  bitFlag = bitFlag | BITFLAG_LANG_ENCODING_FLAG;
@@ -1499,14 +1511,14 @@ function getBitflag(level, useUnicodeFileNames, dataDescriptor, encrypted) {
1499
1511
  if (dataDescriptor) {
1500
1512
  bitFlag = bitFlag | BITFLAG_DATA_DESCRIPTOR;
1501
1513
  }
1502
- if (level >= 1 && level < 3) {
1503
- bitFlag = bitFlag | 0b110;
1514
+ if (level > 0 && level <= 3) {
1515
+ bitFlag = bitFlag | BITFLAG_LEVEL_SUPER_FAST_MASK;
1504
1516
  }
1505
- if (level >= 3 && level < 5) {
1506
- bitFlag = bitFlag | 0b01;
1517
+ if (level > 3 && level <= 5) {
1518
+ bitFlag = bitFlag | BITFLAG_LEVEL_FAST_MASK;
1507
1519
  }
1508
- if (level === 9) {
1509
- bitFlag = bitFlag | 0b10;
1520
+ if (level == 9) {
1521
+ bitFlag = bitFlag | BITFLAG_LEVEL_MAX_MASK;
1510
1522
  }
1511
1523
  if (encrypted) {
1512
1524
  bitFlag = bitFlag | BITFLAG_ENCRYPTED;