@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.
- package/deno.json +1 -1
- package/dist/z-worker-fflate.js +1 -1
- package/dist/z-worker-pako.js +1 -1
- package/dist/z-worker.js +1 -1
- package/dist/zip-fs-full.js +256 -208
- package/dist/zip-fs-full.min.js +1 -1
- package/dist/zip-fs.js +258 -210
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-full.js +252 -208
- 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 +252 -208
- package/dist/zip.min.js +1 -1
- package/index.cjs +256 -208
- package/index.d.ts +19 -5
- package/index.min.js +1 -1
- package/lib/core/codec-worker.js +11 -6
- package/lib/core/constants.js +19 -7
- package/lib/core/io.js +70 -51
- package/lib/core/streams/codec-stream.js +2 -3
- package/lib/core/z-worker-core.js +4 -2
- package/lib/core/zip-fs-core.js +6 -2
- package/lib/core/zip-reader.js +23 -11
- package/lib/core/zip-writer.js +146 -134
- package/lib/z-worker-inline.js +1 -1
- package/package.json +1 -1
package/lib/core/zip-writer.js
CHANGED
|
@@ -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
|
-
|
|
82
|
-
|
|
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 =
|
|
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 } =
|
|
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.
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
635
|
-
|
|
636
|
-
|
|
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
|
-
|
|
654
|
+
writer.size += fileWriter.size;
|
|
645
655
|
writingBufferedEntryData = false;
|
|
646
656
|
} else {
|
|
647
657
|
fileEntry.offset = zipWriter.offset - diskOffset;
|
|
648
|
-
if (
|
|
649
|
-
|
|
658
|
+
if (zip64) {
|
|
659
|
+
updateZip64ExtraField(fileEntry);
|
|
650
660
|
}
|
|
651
661
|
}
|
|
652
|
-
if (fileEntry.offset > MAX_32_BITS && !
|
|
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.
|
|
679
|
+
zipWriter.offset += fileWriter.size;
|
|
670
680
|
} else {
|
|
671
|
-
zipWriter.offset = fileWriter.
|
|
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 =
|
|
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
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
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(
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
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,
|
|
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,
|
|
1128
|
-
setUint32(headerView,
|
|
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
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
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
|
|
1162
|
-
setUint32(
|
|
1165
|
+
if (!encrypted) {
|
|
1166
|
+
setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + 4, signature);
|
|
1163
1167
|
}
|
|
1164
1168
|
if (!zip64) {
|
|
1165
|
-
setUint32(
|
|
1166
|
-
setUint32(
|
|
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
|
-
|
|
1175
|
+
let localHeaderOffset = HEADER_SIZE + 4 + getLength(rawFilename) + 4;
|
|
1174
1176
|
if (zip64UncompressedSize) {
|
|
1175
|
-
setBigUint64(
|
|
1176
|
-
|
|
1177
|
+
setBigUint64(localHeaderView, localHeaderOffset, BigInt(uncompressedSize));
|
|
1178
|
+
localHeaderOffset += 8;
|
|
1177
1179
|
}
|
|
1178
1180
|
if (zip64CompressedSize) {
|
|
1179
|
-
setBigUint64(
|
|
1180
|
-
|
|
1181
|
+
setBigUint64(localHeaderView, localHeaderOffset, BigInt(compressedSize));
|
|
1182
|
+
localHeaderOffset += 8;
|
|
1181
1183
|
}
|
|
1182
1184
|
if (zip64Offset) {
|
|
1183
|
-
setBigUint64(
|
|
1184
|
-
|
|
1185
|
+
setBigUint64(localHeaderView, localHeaderOffset, BigInt(offset));
|
|
1186
|
+
localHeaderOffset += 8;
|
|
1185
1187
|
}
|
|
1186
1188
|
if (zip64DiskNumberStart) {
|
|
1187
|
-
setUint32(
|
|
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
|
|
1196
|
-
|
|
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 (
|
|
1199
|
-
setBigUint64(rawExtraFieldZip64View, rawExtraFieldZip64Offset, BigInt(
|
|
1208
|
+
if (zip64UncompressedSize) {
|
|
1209
|
+
setBigUint64(rawExtraFieldZip64View, rawExtraFieldZip64Offset, BigInt(uncompressedSize));
|
|
1200
1210
|
rawExtraFieldZip64Offset += 8;
|
|
1201
1211
|
}
|
|
1202
|
-
if (
|
|
1203
|
-
setBigUint64(rawExtraFieldZip64View, rawExtraFieldZip64Offset, BigInt(
|
|
1212
|
+
if (zip64CompressedSize) {
|
|
1213
|
+
setBigUint64(rawExtraFieldZip64View, rawExtraFieldZip64Offset, BigInt(compressedSize));
|
|
1204
1214
|
rawExtraFieldZip64Offset += 8;
|
|
1205
1215
|
}
|
|
1206
|
-
if (
|
|
1207
|
-
setBigUint64(rawExtraFieldZip64View, rawExtraFieldZip64Offset, BigInt(
|
|
1216
|
+
if (zip64Offset) {
|
|
1217
|
+
setBigUint64(rawExtraFieldZip64View, rawExtraFieldZip64Offset, BigInt(offset));
|
|
1208
1218
|
rawExtraFieldZip64Offset += 8;
|
|
1209
1219
|
}
|
|
1210
|
-
if (
|
|
1211
|
-
setUint32(rawExtraFieldZip64View, rawExtraFieldZip64Offset,
|
|
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
|
|
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,
|
|
1299
|
+
setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, uncompressedSize);
|
|
1290
1300
|
}
|
|
1291
1301
|
if (!zip64CompressedSize) {
|
|
1292
|
-
setUint32(headerView,
|
|
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(
|
|
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(
|
|
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(
|
|
1404
|
+
await writeData(writer, endOfdirectoryArray);
|
|
1395
1405
|
if (commentLength) {
|
|
1396
|
-
await writeData(
|
|
1406
|
+
await writeData(writer, comment);
|
|
1397
1407
|
}
|
|
1398
1408
|
}
|
|
1399
1409
|
|
|
1400
|
-
async function writeData(
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
1491
|
+
setUint32(headerView, HEADER_OFFSET_COMPRESSED_SIZE, zip64CompressedSize ? MAX_32_BITS : compressedSize);
|
|
1481
1492
|
}
|
|
1482
1493
|
if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
|
|
1483
|
-
setUint32(headerView,
|
|
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
|
-
|
|
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
|
|
1503
|
-
bitFlag = bitFlag |
|
|
1514
|
+
if (level > 0 && level <= 3) {
|
|
1515
|
+
bitFlag = bitFlag | BITFLAG_LEVEL_SUPER_FAST_MASK;
|
|
1504
1516
|
}
|
|
1505
|
-
if (level
|
|
1506
|
-
bitFlag = bitFlag |
|
|
1517
|
+
if (level > 3 && level <= 5) {
|
|
1518
|
+
bitFlag = bitFlag | BITFLAG_LEVEL_FAST_MASK;
|
|
1507
1519
|
}
|
|
1508
|
-
if (level
|
|
1509
|
-
bitFlag = bitFlag |
|
|
1520
|
+
if (level == 9) {
|
|
1521
|
+
bitFlag = bitFlag | BITFLAG_LEVEL_MAX_MASK;
|
|
1510
1522
|
}
|
|
1511
1523
|
if (encrypted) {
|
|
1512
1524
|
bitFlag = bitFlag | BITFLAG_ENCRYPTED;
|