@intactfile/engines 0.1.0
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/README.md +68 -0
- package/dist/archive/diagnose.d.ts +37 -0
- package/dist/archive/diagnose.d.ts.map +1 -0
- package/dist/archive/diagnose.js +165 -0
- package/dist/archive/diagnose.js.map +1 -0
- package/dist/archive/format.d.ts +52 -0
- package/dist/archive/format.d.ts.map +1 -0
- package/dist/archive/format.js +87 -0
- package/dist/archive/format.js.map +1 -0
- package/dist/archive/host.d.ts +83 -0
- package/dist/archive/host.d.ts.map +1 -0
- package/dist/archive/host.js +92 -0
- package/dist/archive/host.js.map +1 -0
- package/dist/archive/index.d.ts +22 -0
- package/dist/archive/index.d.ts.map +1 -0
- package/dist/archive/index.js +19 -0
- package/dist/archive/index.js.map +1 -0
- package/dist/archive/salvage.d.ts +73 -0
- package/dist/archive/salvage.d.ts.map +1 -0
- package/dist/archive/salvage.js +210 -0
- package/dist/archive/salvage.js.map +1 -0
- package/dist/byte-source.d.ts +19 -0
- package/dist/byte-source.d.ts.map +1 -0
- package/dist/byte-source.js +16 -0
- package/dist/byte-source.js.map +1 -0
- package/dist/bytesource/blob.d.ts +14 -0
- package/dist/bytesource/blob.d.ts.map +1 -0
- package/dist/bytesource/blob.js +23 -0
- package/dist/bytesource/blob.js.map +1 -0
- package/dist/crc32.d.ts +2 -0
- package/dist/crc32.d.ts.map +1 -0
- package/dist/crc32.js +18 -0
- package/dist/crc32.js.map +1 -0
- package/dist/detect/index.d.ts +16 -0
- package/dist/detect/index.d.ts.map +1 -0
- package/dist/detect/index.js +159 -0
- package/dist/detect/index.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/jpeg/browser-loader.d.ts +21 -0
- package/dist/jpeg/browser-loader.d.ts.map +1 -0
- package/dist/jpeg/browser-loader.js +28 -0
- package/dist/jpeg/browser-loader.js.map +1 -0
- package/dist/jpeg/diagnose.d.ts +50 -0
- package/dist/jpeg/diagnose.d.ts.map +1 -0
- package/dist/jpeg/diagnose.js +124 -0
- package/dist/jpeg/diagnose.js.map +1 -0
- package/dist/jpeg/exif.d.ts +11 -0
- package/dist/jpeg/exif.d.ts.map +1 -0
- package/dist/jpeg/exif.js +50 -0
- package/dist/jpeg/exif.js.map +1 -0
- package/dist/jpeg/format.d.ts +106 -0
- package/dist/jpeg/format.d.ts.map +1 -0
- package/dist/jpeg/format.js +248 -0
- package/dist/jpeg/format.js.map +1 -0
- package/dist/jpeg/index.d.ts +18 -0
- package/dist/jpeg/index.d.ts.map +1 -0
- package/dist/jpeg/index.js +14 -0
- package/dist/jpeg/index.js.map +1 -0
- package/dist/jpeg/mozjpeg-host.d.ts +60 -0
- package/dist/jpeg/mozjpeg-host.d.ts.map +1 -0
- package/dist/jpeg/mozjpeg-host.js +138 -0
- package/dist/jpeg/mozjpeg-host.js.map +1 -0
- package/dist/jpeg/repair.d.ts +89 -0
- package/dist/jpeg/repair.d.ts.map +1 -0
- package/dist/jpeg/repair.js +216 -0
- package/dist/jpeg/repair.js.map +1 -0
- package/dist/node.d.ts +11 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +29 -0
- package/dist/node.js.map +1 -0
- package/dist/pdf/browser-loader.d.ts +30 -0
- package/dist/pdf/browser-loader.d.ts.map +1 -0
- package/dist/pdf/browser-loader.js +21 -0
- package/dist/pdf/browser-loader.js.map +1 -0
- package/dist/pdf/diagnose.d.ts +23 -0
- package/dist/pdf/diagnose.d.ts.map +1 -0
- package/dist/pdf/diagnose.js +113 -0
- package/dist/pdf/diagnose.js.map +1 -0
- package/dist/pdf/format.d.ts +61 -0
- package/dist/pdf/format.d.ts.map +1 -0
- package/dist/pdf/format.js +150 -0
- package/dist/pdf/format.js.map +1 -0
- package/dist/pdf/index.d.ts +17 -0
- package/dist/pdf/index.d.ts.map +1 -0
- package/dist/pdf/index.js +12 -0
- package/dist/pdf/index.js.map +1 -0
- package/dist/pdf/qpdf-host.d.ts +66 -0
- package/dist/pdf/qpdf-host.d.ts.map +1 -0
- package/dist/pdf/qpdf-host.js +149 -0
- package/dist/pdf/qpdf-host.js.map +1 -0
- package/dist/pdf/rebuild.d.ts +32 -0
- package/dist/pdf/rebuild.d.ts.map +1 -0
- package/dist/pdf/rebuild.js +90 -0
- package/dist/pdf/rebuild.js.map +1 -0
- package/dist/pdf/repair.d.ts +61 -0
- package/dist/pdf/repair.d.ts.map +1 -0
- package/dist/pdf/repair.js +167 -0
- package/dist/pdf/repair.js.map +1 -0
- package/dist/png/diagnose.d.ts +50 -0
- package/dist/png/diagnose.d.ts.map +1 -0
- package/dist/png/diagnose.js +261 -0
- package/dist/png/diagnose.js.map +1 -0
- package/dist/png/format.d.ts +133 -0
- package/dist/png/format.d.ts.map +1 -0
- package/dist/png/format.js +350 -0
- package/dist/png/format.js.map +1 -0
- package/dist/png/index.d.ts +13 -0
- package/dist/png/index.d.ts.map +1 -0
- package/dist/png/index.js +10 -0
- package/dist/png/index.js.map +1 -0
- package/dist/png/repair.d.ts +31 -0
- package/dist/png/repair.d.ts.map +1 -0
- package/dist/png/repair.js +335 -0
- package/dist/png/repair.js.map +1 -0
- package/dist/sqlite/diagnose.d.ts +31 -0
- package/dist/sqlite/diagnose.d.ts.map +1 -0
- package/dist/sqlite/diagnose.js +169 -0
- package/dist/sqlite/diagnose.js.map +1 -0
- package/dist/sqlite/format.d.ts +103 -0
- package/dist/sqlite/format.d.ts.map +1 -0
- package/dist/sqlite/format.js +237 -0
- package/dist/sqlite/format.js.map +1 -0
- package/dist/sqlite/index.d.ts +24 -0
- package/dist/sqlite/index.d.ts.map +1 -0
- package/dist/sqlite/index.js +19 -0
- package/dist/sqlite/index.js.map +1 -0
- package/dist/sqlite/recover.d.ts +66 -0
- package/dist/sqlite/recover.d.ts.map +1 -0
- package/dist/sqlite/recover.js +305 -0
- package/dist/sqlite/recover.js.map +1 -0
- package/dist/sqlite/scan.d.ts +94 -0
- package/dist/sqlite/scan.d.ts.map +1 -0
- package/dist/sqlite/scan.js +356 -0
- package/dist/sqlite/scan.js.map +1 -0
- package/dist/sqlite/sqlite-host.d.ts +37 -0
- package/dist/sqlite/sqlite-host.d.ts.map +1 -0
- package/dist/sqlite/sqlite-host.js +80 -0
- package/dist/sqlite/sqlite-host.js.map +1 -0
- package/dist/sqlite/wal.d.ts +14 -0
- package/dist/sqlite/wal.d.ts.map +1 -0
- package/dist/sqlite/wal.js +79 -0
- package/dist/sqlite/wal.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/video/diagnose.d.ts +41 -0
- package/dist/video/diagnose.d.ts.map +1 -0
- package/dist/video/diagnose.js +188 -0
- package/dist/video/diagnose.js.map +1 -0
- package/dist/video/format.d.ts +87 -0
- package/dist/video/format.d.ts.map +1 -0
- package/dist/video/format.js +273 -0
- package/dist/video/format.js.map +1 -0
- package/dist/video/index.d.ts +21 -0
- package/dist/video/index.d.ts.map +1 -0
- package/dist/video/index.js +17 -0
- package/dist/video/index.js.map +1 -0
- package/dist/video/libav-host.d.ts +88 -0
- package/dist/video/libav-host.d.ts.map +1 -0
- package/dist/video/libav-host.js +66 -0
- package/dist/video/libav-host.js.map +1 -0
- package/dist/video/mp4-rebuild.d.ts +167 -0
- package/dist/video/mp4-rebuild.d.ts.map +1 -0
- package/dist/video/mp4-rebuild.js +270 -0
- package/dist/video/mp4-rebuild.js.map +1 -0
- package/dist/video/mp4box-host.d.ts +62 -0
- package/dist/video/mp4box-host.d.ts.map +1 -0
- package/dist/video/mp4box-host.js +209 -0
- package/dist/video/mp4box-host.js.map +1 -0
- package/dist/video/reconstruct.d.ts +97 -0
- package/dist/video/reconstruct.d.ts.map +1 -0
- package/dist/video/reconstruct.js +271 -0
- package/dist/video/reconstruct.js.map +1 -0
- package/dist/video/remux.d.ts +85 -0
- package/dist/video/remux.d.ts.map +1 -0
- package/dist/video/remux.js +350 -0
- package/dist/video/remux.js.map +1 -0
- package/dist/zip/diagnose.d.ts +22 -0
- package/dist/zip/diagnose.d.ts.map +1 -0
- package/dist/zip/diagnose.js +126 -0
- package/dist/zip/diagnose.js.map +1 -0
- package/dist/zip/format.d.ts +79 -0
- package/dist/zip/format.d.ts.map +1 -0
- package/dist/zip/format.js +129 -0
- package/dist/zip/format.js.map +1 -0
- package/dist/zip/repair.d.ts +32 -0
- package/dist/zip/repair.d.ts.map +1 -0
- package/dist/zip/repair.js +82 -0
- package/dist/zip/repair.js.map +1 -0
- package/dist/zip/salvage.d.ts +23 -0
- package/dist/zip/salvage.d.ts.map +1 -0
- package/dist/zip/salvage.js +140 -0
- package/dist/zip/salvage.js.map +1 -0
- package/dist/zip/scan.d.ts +64 -0
- package/dist/zip/scan.d.ts.map +1 -0
- package/dist/zip/scan.js +386 -0
- package/dist/zip/scan.js.map +1 -0
- package/dist/zip/writer.d.ts +14 -0
- package/dist/zip/writer.d.ts.map +1 -0
- package/dist/zip/writer.js +131 -0
- package/dist/zip/writer.js.map +1 -0
- package/package.json +71 -0
- package/src/archive/LICENSE-unrar.txt +53 -0
package/dist/zip/scan.js
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { CDH_FIXED_SIZE, EOCD_FIXED_SIZE, FLAG_DATA_DESCRIPTOR, FLAG_UTF8, LFH_FIXED_SIZE, MAX_COMMENT, SIG_CDH, SIG_DD, SIG_EOCD, SIG_EOCD64, SIG_EOCD64_LOC, SIG_LFH, U32_MAX, localHeaderLooksSane, parseEocd, parseLocalHeader, parseZip64Extra, readU16, readU32, readU64, reconcileDeclaredSize, } from './format.js';
|
|
2
|
+
const CHUNK = 1 << 20;
|
|
3
|
+
function concat(a, b) {
|
|
4
|
+
const out = new Uint8Array(a.length + b.length);
|
|
5
|
+
out.set(a, 0);
|
|
6
|
+
out.set(b, a.length);
|
|
7
|
+
return out;
|
|
8
|
+
}
|
|
9
|
+
async function* iterateSignatures(src, from, sigs) {
|
|
10
|
+
let base = from;
|
|
11
|
+
let carry = new Uint8Array(0);
|
|
12
|
+
while (base < src.size) {
|
|
13
|
+
const chunk = await src.read(base, CHUNK);
|
|
14
|
+
if (chunk.length === 0)
|
|
15
|
+
break;
|
|
16
|
+
const buf = carry.length ? concat(carry, chunk) : chunk;
|
|
17
|
+
const bufBase = base - carry.length;
|
|
18
|
+
for (let i = 0; i + 4 <= buf.length; i++) {
|
|
19
|
+
if (buf[i] === 0x50 && buf[i + 1] === 0x4b) {
|
|
20
|
+
const sig = readU32(buf, i);
|
|
21
|
+
if (sigs.has(sig))
|
|
22
|
+
yield { offset: bufBase + i, sig };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
carry = buf.subarray(Math.max(0, buf.length - 3));
|
|
26
|
+
base += chunk.length;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const STRUCT_SIGS = new Set([SIG_LFH, SIG_CDH, SIG_EOCD]);
|
|
30
|
+
/** Find the next plausible structural record (validated LFH, CDH, or EOCD) at or after `from`. */
|
|
31
|
+
export async function nextStructuralBoundary(src, from) {
|
|
32
|
+
for await (const m of iterateSignatures(src, from, STRUCT_SIGS)) {
|
|
33
|
+
if (m.sig === SIG_LFH) {
|
|
34
|
+
const h = parseLocalHeader(await src.read(m.offset, LFH_FIXED_SIZE));
|
|
35
|
+
if (h && localHeaderLooksSane(h))
|
|
36
|
+
return m;
|
|
37
|
+
}
|
|
38
|
+
else if (m.sig === SIG_CDH) {
|
|
39
|
+
const b = await src.read(m.offset, CDH_FIXED_SIZE);
|
|
40
|
+
if (b.length === CDH_FIXED_SIZE && readU16(b, 28) <= 4096)
|
|
41
|
+
return m;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
return m;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Locate the data descriptor for an entry starting at `dataStart`. A PK\x07\x08
|
|
51
|
+
* candidate only counts when its compressed-size field equals the distance from
|
|
52
|
+
* dataStart (filters signatures occurring inside compressed data). Falls back
|
|
53
|
+
* to signature-less descriptors validated against the next structural record.
|
|
54
|
+
*/
|
|
55
|
+
async function resolveDescriptor(src, dataStart) {
|
|
56
|
+
for await (const m of iterateSignatures(src, dataStart, new Set([SIG_DD]))) {
|
|
57
|
+
const b = await src.read(m.offset + 4, 20);
|
|
58
|
+
const dist = m.offset - dataStart;
|
|
59
|
+
if (b.length >= 12 && readU32(b, 4) === dist) {
|
|
60
|
+
return {
|
|
61
|
+
crc32: readU32(b, 0),
|
|
62
|
+
compressedSize: dist,
|
|
63
|
+
uncompressedSize: readU32(b, 8),
|
|
64
|
+
descriptorLength: 16,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (b.length >= 20 && readU64(b, 4) === dist) {
|
|
68
|
+
return {
|
|
69
|
+
crc32: readU32(b, 0),
|
|
70
|
+
compressedSize: dist,
|
|
71
|
+
uncompressedSize: readU64(b, 12),
|
|
72
|
+
descriptorLength: 24,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const next = await nextStructuralBoundary(src, dataStart + 1);
|
|
77
|
+
if (next) {
|
|
78
|
+
for (const [len, wide] of [
|
|
79
|
+
[12, false],
|
|
80
|
+
[20, true],
|
|
81
|
+
]) {
|
|
82
|
+
const end = next.offset - len;
|
|
83
|
+
if (end < dataStart)
|
|
84
|
+
continue;
|
|
85
|
+
const b = await src.read(end, len);
|
|
86
|
+
if (b.length !== len)
|
|
87
|
+
continue;
|
|
88
|
+
const csize = wide ? readU64(b, 4) : readU32(b, 4);
|
|
89
|
+
if (csize === end - dataStart) {
|
|
90
|
+
return {
|
|
91
|
+
crc32: readU32(b, 0),
|
|
92
|
+
compressedSize: csize,
|
|
93
|
+
uncompressedSize: wide ? readU64(b, 12) : readU32(b, 8),
|
|
94
|
+
descriptorLength: len,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
function decodeName(bytes, flags) {
|
|
102
|
+
if (flags & FLAG_UTF8)
|
|
103
|
+
return new TextDecoder('utf-8').decode(bytes);
|
|
104
|
+
try {
|
|
105
|
+
return new TextDecoder('utf-8', { fatal: true }).decode(bytes);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// CP437 in the wild; latin1 is a lossy but stable stand-in.
|
|
109
|
+
return new TextDecoder('latin1').decode(bytes);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** Forward streaming scan for local file entries; tolerates garbage prefixes, lying headers, and truncation. */
|
|
113
|
+
export async function scanLocalEntries(src) {
|
|
114
|
+
const result = {
|
|
115
|
+
entries: [],
|
|
116
|
+
prefixOffset: 0,
|
|
117
|
+
firstCdhOffset: undefined,
|
|
118
|
+
truncatedTail: false,
|
|
119
|
+
gaps: 0,
|
|
120
|
+
notes: [],
|
|
121
|
+
};
|
|
122
|
+
const first = await nextStructuralBoundary(src, 0);
|
|
123
|
+
if (!first) {
|
|
124
|
+
result.notes.push('no zip structures found');
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
if (first.sig !== SIG_LFH) {
|
|
128
|
+
// Central directory or EOCD with no local entries (e.g. empty zip).
|
|
129
|
+
if (first.sig === SIG_CDH)
|
|
130
|
+
result.firstCdhOffset = first.offset;
|
|
131
|
+
if (first.offset > 0)
|
|
132
|
+
result.prefixOffset = first.offset;
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
result.prefixOffset = first.offset;
|
|
136
|
+
if (first.offset > 0)
|
|
137
|
+
result.notes.push(`first local header at offset ${first.offset} (garbage prefix)`);
|
|
138
|
+
let pos = first.offset;
|
|
139
|
+
while (pos < src.size) {
|
|
140
|
+
const sigBytes = await src.read(pos, 4);
|
|
141
|
+
if (sigBytes.length < 4) {
|
|
142
|
+
if (sigBytes.length > 0)
|
|
143
|
+
result.truncatedTail = true;
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
const sig = readU32(sigBytes, 0);
|
|
147
|
+
if (sig === SIG_CDH) {
|
|
148
|
+
result.firstCdhOffset = pos;
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
if (sig === SIG_EOCD || sig === SIG_EOCD64 || sig === SIG_EOCD64_LOC)
|
|
152
|
+
break;
|
|
153
|
+
if (sig !== SIG_LFH) {
|
|
154
|
+
const next = await nextStructuralBoundary(src, pos + 1);
|
|
155
|
+
if (!next) {
|
|
156
|
+
result.notes.push(`unparseable trailing region at offset ${pos}`);
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
result.gaps++;
|
|
160
|
+
if (next.sig !== SIG_LFH) {
|
|
161
|
+
if (next.sig === SIG_CDH)
|
|
162
|
+
result.firstCdhOffset = next.offset;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
pos = next.offset;
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const fixed = await src.read(pos, LFH_FIXED_SIZE);
|
|
169
|
+
const h = parseLocalHeader(fixed);
|
|
170
|
+
if (!h) {
|
|
171
|
+
result.truncatedTail = true;
|
|
172
|
+
result.notes.push(`local header at ${pos} cut off by EOF`);
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
if (!localHeaderLooksSane(h)) {
|
|
176
|
+
const next = await nextStructuralBoundary(src, pos + 1);
|
|
177
|
+
if (!next)
|
|
178
|
+
break;
|
|
179
|
+
result.gaps++;
|
|
180
|
+
if (next.sig !== SIG_LFH) {
|
|
181
|
+
if (next.sig === SIG_CDH)
|
|
182
|
+
result.firstCdhOffset = next.offset;
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
pos = next.offset;
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const notes = [];
|
|
189
|
+
const nameBytes = await src.read(pos + LFH_FIXED_SIZE, h.nameLength);
|
|
190
|
+
const extraBytes = await src.read(pos + LFH_FIXED_SIZE + h.nameLength, h.extraLength);
|
|
191
|
+
const dataStart = pos + LFH_FIXED_SIZE + h.nameLength + h.extraLength;
|
|
192
|
+
const entry = {
|
|
193
|
+
headerOffset: pos,
|
|
194
|
+
dataStart,
|
|
195
|
+
method: h.method,
|
|
196
|
+
flags: h.flags,
|
|
197
|
+
nameBytes,
|
|
198
|
+
name: decodeName(nameBytes, h.flags),
|
|
199
|
+
dosTime: h.dosTime,
|
|
200
|
+
dosDate: h.dosDate,
|
|
201
|
+
// With bit 3 the LFH CRC is customarily 0; a real 0 CRC (empty file) is fine to trust.
|
|
202
|
+
crc32: h.flags & FLAG_DATA_DESCRIPTOR ? undefined : h.crc32,
|
|
203
|
+
compressedSize: 0,
|
|
204
|
+
uncompressedSize: undefined,
|
|
205
|
+
hasDescriptor: (h.flags & FLAG_DATA_DESCRIPTOR) !== 0,
|
|
206
|
+
descriptorLength: 0,
|
|
207
|
+
usedZip64: false,
|
|
208
|
+
complete: false,
|
|
209
|
+
sizeFromScan: false,
|
|
210
|
+
dataEndUncertain: false,
|
|
211
|
+
endValidated: false,
|
|
212
|
+
wrapAroundFixed: false,
|
|
213
|
+
notes,
|
|
214
|
+
};
|
|
215
|
+
if (nameBytes.length < h.nameLength || extraBytes.length < h.extraLength) {
|
|
216
|
+
notes.push('header truncated by EOF');
|
|
217
|
+
result.truncatedTail = true;
|
|
218
|
+
result.entries.push(entry);
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
let declaredCsize = h.compressedSize;
|
|
222
|
+
let declaredUsize = h.uncompressedSize;
|
|
223
|
+
if (h.compressedSize === U32_MAX || h.uncompressedSize === U32_MAX) {
|
|
224
|
+
const z64 = parseZip64Extra(extraBytes, {
|
|
225
|
+
uncompressedSize: h.uncompressedSize === U32_MAX,
|
|
226
|
+
compressedSize: h.compressedSize === U32_MAX,
|
|
227
|
+
});
|
|
228
|
+
if (z64 && !z64.malformed) {
|
|
229
|
+
entry.usedZip64 = true;
|
|
230
|
+
if (h.compressedSize === U32_MAX)
|
|
231
|
+
declaredCsize = z64.compressedSize;
|
|
232
|
+
if (h.uncompressedSize === U32_MAX)
|
|
233
|
+
declaredUsize = z64.uncompressedSize;
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
notes.push(z64 ? 'malformed zip64 extra field' : 'zip64 sizes without zip64 extra field');
|
|
237
|
+
declaredCsize = undefined;
|
|
238
|
+
declaredUsize = undefined;
|
|
239
|
+
entry.sizeFromScan = true;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (entry.hasDescriptor) {
|
|
243
|
+
const desc = await resolveDescriptor(src, dataStart);
|
|
244
|
+
if (desc) {
|
|
245
|
+
entry.compressedSize = desc.compressedSize;
|
|
246
|
+
entry.uncompressedSize = desc.uncompressedSize;
|
|
247
|
+
entry.crc32 = desc.crc32;
|
|
248
|
+
entry.descriptorLength = desc.descriptorLength;
|
|
249
|
+
entry.complete = dataStart + desc.compressedSize <= src.size;
|
|
250
|
+
entry.endValidated = true;
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
entry.compressedSize = Math.max(0, src.size - dataStart);
|
|
254
|
+
entry.uncompressedSize = undefined;
|
|
255
|
+
entry.crc32 = h.crc32 || undefined;
|
|
256
|
+
entry.sizeFromScan = true;
|
|
257
|
+
entry.dataEndUncertain = true;
|
|
258
|
+
notes.push('data descriptor not found; data runs to EOF');
|
|
259
|
+
result.truncatedTail = true;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else if (declaredCsize === undefined) {
|
|
263
|
+
// zip64 fields unusable: recover the size from the next structural record.
|
|
264
|
+
const next = await nextStructuralBoundary(src, dataStart + 1);
|
|
265
|
+
const end = next ? next.offset : src.size;
|
|
266
|
+
entry.compressedSize = Math.max(0, end - dataStart);
|
|
267
|
+
entry.complete = next !== null || src.size > dataStart;
|
|
268
|
+
entry.uncompressedSize = declaredUsize;
|
|
269
|
+
entry.dataEndUncertain = true;
|
|
270
|
+
notes.push('compressed size recovered by structure scan');
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
const declaredEnd = dataStart + declaredCsize;
|
|
274
|
+
if (declaredEnd > src.size) {
|
|
275
|
+
entry.compressedSize = Math.max(0, src.size - dataStart);
|
|
276
|
+
entry.uncompressedSize = declaredUsize;
|
|
277
|
+
entry.complete = false;
|
|
278
|
+
notes.push('entry data truncated by EOF');
|
|
279
|
+
result.truncatedTail = true;
|
|
280
|
+
result.entries.push(entry);
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
const after = await src.read(declaredEnd, 4);
|
|
284
|
+
const afterSig = after.length === 4 ? readU32(after, 0) : undefined;
|
|
285
|
+
const boundaryOk = declaredEnd === src.size ||
|
|
286
|
+
afterSig === SIG_LFH ||
|
|
287
|
+
afterSig === SIG_CDH ||
|
|
288
|
+
afterSig === SIG_EOCD ||
|
|
289
|
+
afterSig === SIG_EOCD64;
|
|
290
|
+
if (boundaryOk) {
|
|
291
|
+
entry.compressedSize = declaredCsize;
|
|
292
|
+
entry.uncompressedSize = declaredUsize;
|
|
293
|
+
entry.complete = true;
|
|
294
|
+
entry.endValidated = true;
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
const next = await nextStructuralBoundary(src, dataStart + 1);
|
|
298
|
+
const actual = (next ? next.offset : src.size) - dataStart;
|
|
299
|
+
const reconciled = actual > 0 ? reconcileDeclaredSize(declaredCsize, actual) : null;
|
|
300
|
+
if (reconciled && reconciled.wrapAroundFixed) {
|
|
301
|
+
entry.compressedSize = reconciled.size;
|
|
302
|
+
entry.wrapAroundFixed = true;
|
|
303
|
+
entry.uncompressedSize = undefined;
|
|
304
|
+
entry.complete = true;
|
|
305
|
+
entry.sizeFromScan = true;
|
|
306
|
+
entry.endValidated = true;
|
|
307
|
+
notes.push('32-bit size wraparound fixed (OneDrive-style bad zip64)');
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
// Header may lie (or junk may follow a truthful size): keep both
|
|
311
|
+
// candidates and let data validation pick the right one.
|
|
312
|
+
entry.compressedSize = Math.max(0, actual);
|
|
313
|
+
entry.altCompressedSize = declaredCsize;
|
|
314
|
+
entry.uncompressedSize = undefined;
|
|
315
|
+
entry.complete = true;
|
|
316
|
+
entry.sizeFromScan = true;
|
|
317
|
+
entry.dataEndUncertain = true;
|
|
318
|
+
notes.push(`declared compressed size ${declaredCsize} inconsistent with structure at +${actual}; kept as fallback candidate`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
result.entries.push(entry);
|
|
323
|
+
const nextPos = dataStart + entry.compressedSize + entry.descriptorLength;
|
|
324
|
+
if (nextPos <= pos)
|
|
325
|
+
break;
|
|
326
|
+
pos = nextPos;
|
|
327
|
+
}
|
|
328
|
+
return result;
|
|
329
|
+
}
|
|
330
|
+
/** Locate the EOCD record by scanning the file tail; resolves zip64 overrides when present. */
|
|
331
|
+
export async function findEocd(src) {
|
|
332
|
+
const tailLen = Math.min(src.size, EOCD_FIXED_SIZE + MAX_COMMENT + 64);
|
|
333
|
+
if (tailLen < EOCD_FIXED_SIZE)
|
|
334
|
+
return null;
|
|
335
|
+
const tailStart = src.size - tailLen;
|
|
336
|
+
const tail = await src.read(tailStart, tailLen);
|
|
337
|
+
let found = null;
|
|
338
|
+
const notes = [];
|
|
339
|
+
for (let i = tail.length - EOCD_FIXED_SIZE; i >= 0; i--) {
|
|
340
|
+
if (readU32(tail, i) !== SIG_EOCD)
|
|
341
|
+
continue;
|
|
342
|
+
const eocd = parseEocd(tail, i, tailStart + i);
|
|
343
|
+
if (!eocd)
|
|
344
|
+
continue;
|
|
345
|
+
const end = tailStart + i + EOCD_FIXED_SIZE + eocd.commentLength;
|
|
346
|
+
if (end === src.size) {
|
|
347
|
+
found = eocd;
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
if (!found && end < src.size) {
|
|
351
|
+
found = eocd;
|
|
352
|
+
notes.push('EOCD followed by trailing junk');
|
|
353
|
+
// keep scanning for an exact match closer to nothing? exact match wins via break above
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
if (!found)
|
|
357
|
+
return null;
|
|
358
|
+
const result = { eocd: found, notes };
|
|
359
|
+
if (found.totalEntries === 0xffff ||
|
|
360
|
+
found.cdOffset === U32_MAX ||
|
|
361
|
+
found.cdSize === U32_MAX) {
|
|
362
|
+
const locOff = found.offset - 20;
|
|
363
|
+
if (locOff >= 0) {
|
|
364
|
+
const loc = await src.read(locOff, 20);
|
|
365
|
+
if (loc.length === 20 && readU32(loc, 0) === SIG_EOCD64_LOC) {
|
|
366
|
+
const eocd64Off = readU64(loc, 8);
|
|
367
|
+
const rec = await src.read(eocd64Off, 56);
|
|
368
|
+
if (rec.length === 56 && readU32(rec, 0) === SIG_EOCD64) {
|
|
369
|
+
result.zip64 = {
|
|
370
|
+
totalEntries: readU64(rec, 32),
|
|
371
|
+
cdSize: readU64(rec, 40),
|
|
372
|
+
cdOffset: readU64(rec, 48),
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
notes.push('zip64 EOCD locator points to invalid record');
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
notes.push('zip64 markers in EOCD but no zip64 locator found');
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return result;
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/zip/scan.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,SAAS,EACT,cAAc,EACd,WAAW,EACX,OAAO,EACP,MAAM,EACN,QAAQ,EACR,UAAU,EACV,cAAc,EACd,OAAO,EACP,OAAO,EACP,oBAAoB,EACpB,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,OAAO,EACP,OAAO,EACP,OAAO,EACP,qBAAqB,GAEtB,MAAM,aAAa,CAAC;AAErB,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;AAqDtB,SAAS,MAAM,CAAC,CAAa,EAAE,CAAa;IAC1C,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAChD,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACd,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACrB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,SAAS,CAAC,CAAC,iBAAiB,CAC/B,GAAe,EACf,IAAY,EACZ,IAAyB;IAEzB,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,KAAK,GAAe,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAC1C,OAAO,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACxD,MAAM,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;YACxD,CAAC;QACH,CAAC;QACD,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE/E,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAAe,EACf,IAAY;IAEZ,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;YACrE,IAAI,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YACnD,IAAI,CAAC,CAAC,MAAM,KAAK,cAAc,IAAI,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI;gBAAE,OAAO,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AASD;;;;;GAKG;AACH,KAAK,UAAU,iBAAiB,CAAC,GAAe,EAAE,SAAiB;IACjE,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;QAClC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7C,OAAO;gBACL,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpB,cAAc,EAAE,IAAI;gBACpB,gBAAgB,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/B,gBAAgB,EAAE,EAAE;aACrB,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7C,OAAO;gBACL,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpB,cAAc,EAAE,IAAI;gBACpB,gBAAgB,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC;gBAChC,gBAAgB,EAAE,EAAE;aACrB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI;YACxB,CAAC,EAAE,EAAE,KAAK,CAAC;YACX,CAAC,EAAE,EAAE,IAAI,CAAC;SACF,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YAC9B,IAAI,GAAG,GAAG,SAAS;gBAAE,SAAS;YAC9B,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG;gBAAE,SAAS;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACnD,IAAI,KAAK,KAAK,GAAG,GAAG,SAAS,EAAE,CAAC;gBAC9B,OAAO;oBACL,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;oBACpB,cAAc,EAAE,KAAK;oBACrB,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;oBACvD,gBAAgB,EAAE,GAAG;iBACtB,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,KAAiB,EAAE,KAAa;IAClD,IAAI,KAAK,GAAG,SAAS;QAAE,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;QAC5D,OAAO,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,gHAAgH;AAChH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAe;IACpD,MAAM,MAAM,GAAe;QACzB,OAAO,EAAE,EAAE;QACX,YAAY,EAAE,CAAC;QACf,cAAc,EAAE,SAAS;QACzB,aAAa,EAAE,KAAK;QACpB,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,EAAE;KACV,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;QAC1B,oEAAoE;QACpE,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO;YAAE,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC;QAChE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;QACzD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,KAAK,CAAC,MAAM,mBAAmB,CAAC,CAAC;IAEzG,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,OAAO,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACxC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;YACrD,MAAM;QACR,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAEjC,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,cAAc,GAAG,GAAG,CAAC;YAC5B,MAAM;QACR,CAAC;QACD,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,cAAc;YAAE,MAAM;QAE5E,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;YACxD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,yCAAyC,GAAG,EAAE,CAAC,CAAC;gBAClE,MAAM;YACR,CAAC;YACD,MAAM,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO;oBAAE,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC9D,MAAM;YACR,CAAC;YACD,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;YAClB,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,GAAG,iBAAiB,CAAC,CAAC;YAC3D,MAAM;QACR,CAAC;QACD,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;YACxD,IAAI,CAAC,IAAI;gBAAE,MAAM;YACjB,MAAM,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO;oBAAE,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC9D,MAAM;YACR,CAAC;YACD,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;YAClB,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,cAAc,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QACrE,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,cAAc,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;QACtF,MAAM,SAAS,GAAG,GAAG,GAAG,cAAc,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC;QAEtE,MAAM,KAAK,GAAiB;YAC1B,YAAY,EAAE,GAAG;YACjB,SAAS;YACT,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,SAAS;YACT,IAAI,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC;YACpC,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,uFAAuF;YACvF,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;YAC3D,cAAc,EAAE,CAAC;YACjB,gBAAgB,EAAE,SAAS;YAC3B,aAAa,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC;YACrD,gBAAgB,EAAE,CAAC;YACnB,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,KAAK;YACvB,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,KAAK;SACN,CAAC;QAEF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;YACzE,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACtC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;YAC5B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,MAAM;QACR,CAAC;QAED,IAAI,aAAa,GAAuB,CAAC,CAAC,cAAc,CAAC;QACzD,IAAI,aAAa,GAAuB,CAAC,CAAC,gBAAgB,CAAC;QAE3D,IAAI,CAAC,CAAC,cAAc,KAAK,OAAO,IAAI,CAAC,CAAC,gBAAgB,KAAK,OAAO,EAAE,CAAC;YACnE,MAAM,GAAG,GAAG,eAAe,CAAC,UAAU,EAAE;gBACtC,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,KAAK,OAAO;gBAChD,cAAc,EAAE,CAAC,CAAC,cAAc,KAAK,OAAO;aAC7C,CAAC,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC1B,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;gBACvB,IAAI,CAAC,CAAC,cAAc,KAAK,OAAO;oBAAE,aAAa,GAAG,GAAG,CAAC,cAAc,CAAC;gBACrE,IAAI,CAAC,CAAC,gBAAgB,KAAK,OAAO;oBAAE,aAAa,GAAG,GAAG,CAAC,gBAAgB,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC;gBAC1F,aAAa,GAAG,SAAS,CAAC;gBAC1B,aAAa,GAAG,SAAS,CAAC;gBAC1B,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACrD,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;gBAC3C,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBAC/C,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;gBACzB,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBAC/C,KAAK,CAAC,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,cAAc,IAAI,GAAG,CAAC,IAAI,CAAC;gBAC7D,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC;gBACzD,KAAK,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBACnC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC;gBACnC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC1B,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAC1D,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;YAC9B,CAAC;QACH,CAAC;aAAM,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YACvC,2EAA2E;YAC3E,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;YAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;YAC1C,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC,CAAC;YACpD,KAAK,CAAC,QAAQ,GAAG,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;YACvD,KAAK,CAAC,gBAAgB,GAAG,aAAa,CAAC;YACvC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;YAC9C,IAAI,WAAW,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC3B,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC;gBACzD,KAAK,CAAC,gBAAgB,GAAG,aAAa,CAAC;gBACvC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBAC1C,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC5B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3B,MAAM;YACR,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpE,MAAM,UAAU,GACd,WAAW,KAAK,GAAG,CAAC,IAAI;gBACxB,QAAQ,KAAK,OAAO;gBACpB,QAAQ,KAAK,OAAO;gBACpB,QAAQ,KAAK,QAAQ;gBACrB,QAAQ,KAAK,UAAU,CAAC;YAC1B,IAAI,UAAU,EAAE,CAAC;gBACf,KAAK,CAAC,cAAc,GAAG,aAAa,CAAC;gBACrC,KAAK,CAAC,gBAAgB,GAAG,aAAa,CAAC;gBACvC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACtB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;gBAC9D,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;gBAC3D,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpF,IAAI,UAAU,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC;oBAC7C,KAAK,CAAC,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC;oBACvC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;oBAC7B,KAAK,CAAC,gBAAgB,GAAG,SAAS,CAAC;oBACnC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACtB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;oBAC1B,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;oBAC1B,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;gBACxE,CAAC;qBAAM,CAAC;oBACN,iEAAiE;oBACjE,yDAAyD;oBACzD,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;oBAC3C,KAAK,CAAC,iBAAiB,GAAG,aAAa,CAAC;oBACxC,KAAK,CAAC,gBAAgB,GAAG,SAAS,CAAC;oBACnC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACtB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;oBAC1B,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;oBAC9B,KAAK,CAAC,IAAI,CACR,4BAA4B,aAAa,oCAAoC,MAAM,8BAA8B,CAClH,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,gBAAgB,CAAC;QAC1E,IAAI,OAAO,IAAI,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,OAAO,CAAC;IAChB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAe;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,GAAG,EAAE,CAAC,CAAC;IACvE,IAAI,OAAO,GAAG,eAAe;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEhD,IAAI,KAAK,GAAgB,IAAI,CAAC;IAC9B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,QAAQ;YAAE,SAAS;QAC5C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,GAAG,GAAG,SAAS,GAAG,CAAC,GAAG,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC;QACjE,IAAI,GAAG,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,GAAG,IAAI,CAAC;YACb,MAAM;QACR,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YAC7B,KAAK,GAAG,IAAI,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC7C,uFAAuF;QACzF,CAAC;IACH,CAAC;IACD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAClD,IACE,KAAK,CAAC,YAAY,KAAK,MAAM;QAC7B,KAAK,CAAC,QAAQ,KAAK,OAAO;QAC1B,KAAK,CAAC,MAAM,KAAK,OAAO,EACxB,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;QACjC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,cAAc,EAAE,CAAC;gBAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAClC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBAC1C,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;oBACxD,MAAM,CAAC,KAAK,GAAG;wBACb,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;wBAC9B,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;wBACxB,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;qBAC3B,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface OutEntry {
|
|
2
|
+
nameBytes: Uint8Array;
|
|
3
|
+
flags: number;
|
|
4
|
+
method: number;
|
|
5
|
+
dosTime: number;
|
|
6
|
+
dosDate: number;
|
|
7
|
+
crc32: number;
|
|
8
|
+
uncompressedSize: number;
|
|
9
|
+
/** Bytes stored in the entry data area (already compressed per `method`). */
|
|
10
|
+
data: Uint8Array;
|
|
11
|
+
}
|
|
12
|
+
/** Serialize entries into a fresh, spec-valid ZIP (local headers + central directory + EOCD, zip64 when required). */
|
|
13
|
+
export declare function buildZip(entries: OutEntry[]): Uint8Array;
|
|
14
|
+
//# sourceMappingURL=writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/zip/writer.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,UAAU,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,IAAI,EAAE,UAAU,CAAC;CAClB;AA6BD,sHAAsH;AACtH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,UAAU,CAyGxD"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { CDH_FIXED_SIZE, EOCD_FIXED_SIZE, LFH_FIXED_SIZE, SIG_CDH, SIG_EOCD, SIG_EOCD64, SIG_EOCD64_LOC, SIG_LFH, U16_MAX, U32_MAX, } from './format.js';
|
|
2
|
+
class Cursor {
|
|
3
|
+
buf;
|
|
4
|
+
pos = 0;
|
|
5
|
+
constructor(buf) {
|
|
6
|
+
this.buf = buf;
|
|
7
|
+
}
|
|
8
|
+
u16(v) {
|
|
9
|
+
this.buf[this.pos++] = v & 0xff;
|
|
10
|
+
this.buf[this.pos++] = (v >>> 8) & 0xff;
|
|
11
|
+
}
|
|
12
|
+
u32(v) {
|
|
13
|
+
this.buf[this.pos++] = v & 0xff;
|
|
14
|
+
this.buf[this.pos++] = (v >>> 8) & 0xff;
|
|
15
|
+
this.buf[this.pos++] = (v >>> 16) & 0xff;
|
|
16
|
+
this.buf[this.pos++] = (v >>> 24) & 0xff;
|
|
17
|
+
}
|
|
18
|
+
u64(v) {
|
|
19
|
+
this.u32(v % 0x1_0000_0000);
|
|
20
|
+
this.u32(Math.floor(v / 0x1_0000_0000));
|
|
21
|
+
}
|
|
22
|
+
bytes(b) {
|
|
23
|
+
this.buf.set(b, this.pos);
|
|
24
|
+
this.pos += b.length;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function needsZip64(e, offset) {
|
|
28
|
+
return e.data.length >= U32_MAX || e.uncompressedSize >= U32_MAX || offset >= U32_MAX;
|
|
29
|
+
}
|
|
30
|
+
/** Serialize entries into a fresh, spec-valid ZIP (local headers + central directory + EOCD, zip64 when required). */
|
|
31
|
+
export function buildZip(entries) {
|
|
32
|
+
const offsets = [];
|
|
33
|
+
let size = 0;
|
|
34
|
+
for (const e of entries) {
|
|
35
|
+
offsets.push(size);
|
|
36
|
+
const z64 = needsZip64(e, size);
|
|
37
|
+
size += LFH_FIXED_SIZE + e.nameBytes.length + (z64 ? 20 : 0) + e.data.length;
|
|
38
|
+
}
|
|
39
|
+
const cdStart = size;
|
|
40
|
+
for (let i = 0; i < entries.length; i++) {
|
|
41
|
+
const e = entries[i];
|
|
42
|
+
const z64 = needsZip64(e, offsets[i]);
|
|
43
|
+
size += CDH_FIXED_SIZE + e.nameBytes.length + (z64 ? 32 : 0);
|
|
44
|
+
}
|
|
45
|
+
const cdSize = size - cdStart;
|
|
46
|
+
const anyZip64 = entries.some((e, i) => needsZip64(e, offsets[i])) || entries.length > U16_MAX || cdStart >= U32_MAX;
|
|
47
|
+
if (anyZip64)
|
|
48
|
+
size += 56 + 20;
|
|
49
|
+
size += EOCD_FIXED_SIZE;
|
|
50
|
+
const c = new Cursor(new Uint8Array(size));
|
|
51
|
+
for (let i = 0; i < entries.length; i++) {
|
|
52
|
+
const e = entries[i];
|
|
53
|
+
const z64 = needsZip64(e, offsets[i]);
|
|
54
|
+
c.u32(SIG_LFH);
|
|
55
|
+
c.u16(z64 ? 45 : 20);
|
|
56
|
+
c.u16(e.flags);
|
|
57
|
+
c.u16(e.method);
|
|
58
|
+
c.u16(e.dosTime);
|
|
59
|
+
c.u16(e.dosDate);
|
|
60
|
+
c.u32(e.crc32);
|
|
61
|
+
c.u32(z64 ? U32_MAX : e.data.length);
|
|
62
|
+
c.u32(z64 ? U32_MAX : e.uncompressedSize);
|
|
63
|
+
c.u16(e.nameBytes.length);
|
|
64
|
+
c.u16(z64 ? 20 : 0);
|
|
65
|
+
c.bytes(e.nameBytes);
|
|
66
|
+
if (z64) {
|
|
67
|
+
c.u16(0x0001);
|
|
68
|
+
c.u16(16);
|
|
69
|
+
c.u64(e.uncompressedSize);
|
|
70
|
+
c.u64(e.data.length);
|
|
71
|
+
}
|
|
72
|
+
c.bytes(e.data);
|
|
73
|
+
}
|
|
74
|
+
for (let i = 0; i < entries.length; i++) {
|
|
75
|
+
const e = entries[i];
|
|
76
|
+
const z64 = needsZip64(e, offsets[i]);
|
|
77
|
+
c.u32(SIG_CDH);
|
|
78
|
+
c.u16(z64 ? 45 : 20);
|
|
79
|
+
c.u16(z64 ? 45 : 20);
|
|
80
|
+
c.u16(e.flags);
|
|
81
|
+
c.u16(e.method);
|
|
82
|
+
c.u16(e.dosTime);
|
|
83
|
+
c.u16(e.dosDate);
|
|
84
|
+
c.u32(e.crc32);
|
|
85
|
+
c.u32(z64 ? U32_MAX : e.data.length);
|
|
86
|
+
c.u32(z64 ? U32_MAX : e.uncompressedSize);
|
|
87
|
+
c.u16(e.nameBytes.length);
|
|
88
|
+
c.u16(z64 ? 32 : 0);
|
|
89
|
+
c.u16(0); // comment length
|
|
90
|
+
c.u16(0); // disk number start
|
|
91
|
+
c.u16(0); // internal attrs
|
|
92
|
+
c.u32(0); // external attrs
|
|
93
|
+
c.u32(z64 ? U32_MAX : offsets[i]);
|
|
94
|
+
c.bytes(e.nameBytes);
|
|
95
|
+
if (z64) {
|
|
96
|
+
c.u16(0x0001);
|
|
97
|
+
c.u16(28);
|
|
98
|
+
c.u64(e.uncompressedSize);
|
|
99
|
+
c.u64(e.data.length);
|
|
100
|
+
c.u64(offsets[i]);
|
|
101
|
+
c.u32(0);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (anyZip64) {
|
|
105
|
+
const eocd64Offset = c.pos;
|
|
106
|
+
c.u32(SIG_EOCD64);
|
|
107
|
+
c.u64(44); // size of remaining record
|
|
108
|
+
c.u16(45);
|
|
109
|
+
c.u16(45);
|
|
110
|
+
c.u32(0);
|
|
111
|
+
c.u32(0);
|
|
112
|
+
c.u64(entries.length);
|
|
113
|
+
c.u64(entries.length);
|
|
114
|
+
c.u64(cdSize);
|
|
115
|
+
c.u64(cdStart);
|
|
116
|
+
c.u32(SIG_EOCD64_LOC);
|
|
117
|
+
c.u32(0);
|
|
118
|
+
c.u64(eocd64Offset);
|
|
119
|
+
c.u32(1);
|
|
120
|
+
}
|
|
121
|
+
c.u32(SIG_EOCD);
|
|
122
|
+
c.u16(0);
|
|
123
|
+
c.u16(0);
|
|
124
|
+
c.u16(Math.min(entries.length, U16_MAX));
|
|
125
|
+
c.u16(Math.min(entries.length, U16_MAX));
|
|
126
|
+
c.u32(Math.min(cdSize, U32_MAX));
|
|
127
|
+
c.u32(anyZip64 ? U32_MAX : cdStart);
|
|
128
|
+
c.u16(0);
|
|
129
|
+
return c.buf;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/zip/writer.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@intactfile/engines",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "IntactFile repair engines (SDK): repair corrupted video, ZIP/Office, PDF, JPEG, PNG, SQLite and RAR/7z entirely in-process. Runs in the browser and in Node — files never leave the machine.",
|
|
5
|
+
"private": false,
|
|
6
|
+
"type": "module",
|
|
7
|
+
"license": "UNLICENSED",
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./node": {
|
|
15
|
+
"types": "./dist/node.d.ts",
|
|
16
|
+
"default": "./dist/node.js"
|
|
17
|
+
},
|
|
18
|
+
"./pdf": {
|
|
19
|
+
"types": "./dist/pdf/index.d.ts",
|
|
20
|
+
"default": "./dist/pdf/index.js"
|
|
21
|
+
},
|
|
22
|
+
"./video": {
|
|
23
|
+
"types": "./dist/video/index.d.ts",
|
|
24
|
+
"default": "./dist/video/index.js"
|
|
25
|
+
},
|
|
26
|
+
"./jpeg": {
|
|
27
|
+
"types": "./dist/jpeg/index.d.ts",
|
|
28
|
+
"default": "./dist/jpeg/index.js"
|
|
29
|
+
},
|
|
30
|
+
"./sqlite": {
|
|
31
|
+
"types": "./dist/sqlite/index.d.ts",
|
|
32
|
+
"default": "./dist/sqlite/index.js"
|
|
33
|
+
},
|
|
34
|
+
"./archive": {
|
|
35
|
+
"types": "./dist/archive/index.d.ts",
|
|
36
|
+
"default": "./dist/archive/index.js"
|
|
37
|
+
},
|
|
38
|
+
"./png": {
|
|
39
|
+
"types": "./dist/png/index.d.ts",
|
|
40
|
+
"default": "./dist/png/index.js"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"files": [
|
|
44
|
+
"dist",
|
|
45
|
+
"src/archive/LICENSE-unrar.txt"
|
|
46
|
+
],
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"7z-wasm": "1.2.0",
|
|
49
|
+
"@jsquash/jpeg": "1.6.0",
|
|
50
|
+
"@libav.js/variant-webcodecs": "6.9.8",
|
|
51
|
+
"@neslinesli93/qpdf-wasm": "0.3.0",
|
|
52
|
+
"exifr": "7.1.3",
|
|
53
|
+
"fast-png": "^8.0.0",
|
|
54
|
+
"fflate": "^0.8.3",
|
|
55
|
+
"mp4box": "2.4.1",
|
|
56
|
+
"pako": "^3.0.1"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@types/node": "^22.15.0",
|
|
60
|
+
"@zip.js/zip.js": "^2.8.31",
|
|
61
|
+
"tsx": "^4.23.1",
|
|
62
|
+
"typescript": "^5.9.3",
|
|
63
|
+
"vitest": "^4.1.10"
|
|
64
|
+
},
|
|
65
|
+
"scripts": {
|
|
66
|
+
"build": "tsc -p tsconfig.json",
|
|
67
|
+
"test": "vitest run",
|
|
68
|
+
"generate-corpus": "tsx scripts/generate-corpus.ts",
|
|
69
|
+
"generate-jpeg-corpus": "tsx scripts/jpeg-corpus.ts"
|
|
70
|
+
}
|
|
71
|
+
}
|