@myrialabs/zipkit 0.0.6
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/LICENSE +21 -0
- package/README.md +329 -0
- package/dist/bench/corpus.d.ts +21 -0
- package/dist/bench/corpus.d.ts.map +1 -0
- package/dist/bench/corpus.js +92 -0
- package/dist/bench/corpus.js.map +1 -0
- package/dist/checksum.d.ts +29 -0
- package/dist/checksum.d.ts.map +1 -0
- package/dist/checksum.js +35 -0
- package/dist/checksum.js.map +1 -0
- package/dist/cli.d.ts +17 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +427 -0
- package/dist/cli.js.map +1 -0
- package/dist/codecs/brotli.d.ts +6 -0
- package/dist/codecs/brotli.d.ts.map +1 -0
- package/dist/codecs/brotli.js +15 -0
- package/dist/codecs/brotli.js.map +1 -0
- package/dist/codecs/bzip2.d.ts +6 -0
- package/dist/codecs/bzip2.d.ts.map +1 -0
- package/dist/codecs/bzip2.js +15 -0
- package/dist/codecs/bzip2.js.map +1 -0
- package/dist/codecs/deflate.d.ts +6 -0
- package/dist/codecs/deflate.d.ts.map +1 -0
- package/dist/codecs/deflate.js +25 -0
- package/dist/codecs/deflate.js.map +1 -0
- package/dist/codecs/gzip.d.ts +6 -0
- package/dist/codecs/gzip.d.ts.map +1 -0
- package/dist/codecs/gzip.js +25 -0
- package/dist/codecs/gzip.js.map +1 -0
- package/dist/codecs/image.d.ts +5 -0
- package/dist/codecs/image.d.ts.map +1 -0
- package/dist/codecs/image.js +16 -0
- package/dist/codecs/image.js.map +1 -0
- package/dist/codecs/index.d.ts +18 -0
- package/dist/codecs/index.d.ts.map +1 -0
- package/dist/codecs/index.js +18 -0
- package/dist/codecs/index.js.map +1 -0
- package/dist/codecs/lz4.d.ts +6 -0
- package/dist/codecs/lz4.d.ts.map +1 -0
- package/dist/codecs/lz4.js +17 -0
- package/dist/codecs/lz4.js.map +1 -0
- package/dist/codecs/lzma.d.ts +6 -0
- package/dist/codecs/lzma.d.ts.map +1 -0
- package/dist/codecs/lzma.js +15 -0
- package/dist/codecs/lzma.js.map +1 -0
- package/dist/codecs/snappy.d.ts +6 -0
- package/dist/codecs/snappy.d.ts.map +1 -0
- package/dist/codecs/snappy.js +14 -0
- package/dist/codecs/snappy.js.map +1 -0
- package/dist/codecs/video.d.ts +13 -0
- package/dist/codecs/video.d.ts.map +1 -0
- package/dist/codecs/video.js +26 -0
- package/dist/codecs/video.js.map +1 -0
- package/dist/codecs/xz.d.ts +6 -0
- package/dist/codecs/xz.d.ts.map +1 -0
- package/dist/codecs/xz.js +30 -0
- package/dist/codecs/xz.js.map +1 -0
- package/dist/codecs/zlib.d.ts +6 -0
- package/dist/codecs/zlib.d.ts.map +1 -0
- package/dist/codecs/zlib.js +15 -0
- package/dist/codecs/zlib.js.map +1 -0
- package/dist/codecs/zstd.d.ts +6 -0
- package/dist/codecs/zstd.d.ts.map +1 -0
- package/dist/codecs/zstd.js +24 -0
- package/dist/codecs/zstd.js.map +1 -0
- package/dist/compress.d.ts +20 -0
- package/dist/compress.d.ts.map +1 -0
- package/dist/compress.js +83 -0
- package/dist/compress.js.map +1 -0
- package/dist/delta.d.ts +30 -0
- package/dist/delta.d.ts.map +1 -0
- package/dist/delta.js +44 -0
- package/dist/delta.js.map +1 -0
- package/dist/detect.d.ts +46 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +86 -0
- package/dist/detect.js.map +1 -0
- package/dist/dictionary.d.ts +37 -0
- package/dist/dictionary.d.ts.map +1 -0
- package/dist/dictionary.js +71 -0
- package/dist/dictionary.js.map +1 -0
- package/dist/engine.d.ts +102 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +204 -0
- package/dist/engine.js.map +1 -0
- package/dist/fsa.d.ts +54 -0
- package/dist/fsa.d.ts.map +1 -0
- package/dist/fsa.js +45 -0
- package/dist/fsa.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +21 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +42 -0
- package/dist/internal.js.map +1 -0
- package/dist/middleware/elysia.d.ts +15 -0
- package/dist/middleware/elysia.d.ts.map +1 -0
- package/dist/middleware/elysia.js +43 -0
- package/dist/middleware/elysia.js.map +1 -0
- package/dist/middleware/express.d.ts +17 -0
- package/dist/middleware/express.d.ts.map +1 -0
- package/dist/middleware/express.js +62 -0
- package/dist/middleware/express.js.map +1 -0
- package/dist/middleware/hono.d.ts +17 -0
- package/dist/middleware/hono.d.ts.map +1 -0
- package/dist/middleware/hono.js +41 -0
- package/dist/middleware/hono.js.map +1 -0
- package/dist/middleware/index.d.ts +14 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +14 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/shared.d.ts +29 -0
- package/dist/middleware/shared.d.ts.map +1 -0
- package/dist/middleware/shared.js +47 -0
- package/dist/middleware/shared.js.map +1 -0
- package/dist/pack.d.ts +36 -0
- package/dist/pack.d.ts.map +1 -0
- package/dist/pack.js +75 -0
- package/dist/pack.js.map +1 -0
- package/dist/parallel/index.d.ts +56 -0
- package/dist/parallel/index.d.ts.map +1 -0
- package/dist/parallel/index.js +158 -0
- package/dist/parallel/index.js.map +1 -0
- package/dist/sevenzip/index.d.ts +45 -0
- package/dist/sevenzip/index.d.ts.map +1 -0
- package/dist/sevenzip/index.js +646 -0
- package/dist/sevenzip/index.js.map +1 -0
- package/dist/streams/index.d.ts +32 -0
- package/dist/streams/index.d.ts.map +1 -0
- package/dist/streams/index.js +74 -0
- package/dist/streams/index.js.map +1 -0
- package/dist/string.d.ts +38 -0
- package/dist/string.d.ts.map +1 -0
- package/dist/string.js +64 -0
- package/dist/string.js.map +1 -0
- package/dist/tar/index.d.ts +99 -0
- package/dist/tar/index.d.ts.map +1 -0
- package/dist/tar/index.js +380 -0
- package/dist/tar/index.js.map +1 -0
- package/dist/types.d.ts +59 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +22 -0
- package/dist/types.js.map +1 -0
- package/dist/workers/index.d.ts +58 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/workers/index.js +158 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/worker.d.ts +18 -0
- package/dist/workers/worker.d.ts.map +1 -0
- package/dist/workers/worker.js +45 -0
- package/dist/workers/worker.js.map +1 -0
- package/dist/zip/crypto/aes.d.ts +25 -0
- package/dist/zip/crypto/aes.d.ts.map +1 -0
- package/dist/zip/crypto/aes.js +156 -0
- package/dist/zip/crypto/aes.js.map +1 -0
- package/dist/zip/crypto/winzip.d.ts +28 -0
- package/dist/zip/crypto/winzip.d.ts.map +1 -0
- package/dist/zip/crypto/winzip.js +87 -0
- package/dist/zip/crypto/winzip.js.map +1 -0
- package/dist/zip/crypto/zipcrypto.d.ts +14 -0
- package/dist/zip/crypto/zipcrypto.d.ts.map +1 -0
- package/dist/zip/crypto/zipcrypto.js +65 -0
- package/dist/zip/crypto/zipcrypto.js.map +1 -0
- package/dist/zip/datetime.d.ts +9 -0
- package/dist/zip/datetime.d.ts.map +1 -0
- package/dist/zip/datetime.js +13 -0
- package/dist/zip/datetime.js.map +1 -0
- package/dist/zip/index.d.ts +134 -0
- package/dist/zip/index.d.ts.map +1 -0
- package/dist/zip/index.js +473 -0
- package/dist/zip/index.js.map +1 -0
- package/dist/zip/stream.d.ts +38 -0
- package/dist/zip/stream.d.ts.map +1 -0
- package/dist/zip/stream.js +240 -0
- package/dist/zip/stream.js.map +1 -0
- package/dist/zipkit.d.ts +74 -0
- package/dist/zipkit.d.ts.map +1 -0
- package/dist/zipkit.js +168 -0
- package/dist/zipkit.js.map +1 -0
- package/engine/dist/zipkit-engine.mjs +2 -0
- package/engine/dist/zipkit-engine.wasm +0 -0
- package/package.json +137 -0
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZIP container — create and read multi-file archives.
|
|
3
|
+
*
|
|
4
|
+
* Interoperates with standard tools (`unzip`, Explorer, fflate): `store` and
|
|
5
|
+
* `deflate` entries round-trip everywhere. ZipKit additionally supports `zstd`
|
|
6
|
+
* (method 93) inside the container for much denser archives between ZipKit-aware
|
|
7
|
+
* peers. Entry metadata (modification time, Unix permissions, comment) is
|
|
8
|
+
* preserved both ways, and archives over 4 GB / 65 535 entries transparently
|
|
9
|
+
* use ZIP64.
|
|
10
|
+
*
|
|
11
|
+
* Everything is in-memory and async (the codecs are Wasm). Reading supports a
|
|
12
|
+
* `filter` so you only pay to decompress the entries you want.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { zip, unzip } from '@myrialabs/zipkit/zip';
|
|
17
|
+
* const archive = await zip([
|
|
18
|
+
* { name: 'hello.txt', data: strToU8('hi') },
|
|
19
|
+
* { name: 'data.json', data: bytes, method: 'zstd' }
|
|
20
|
+
* ]);
|
|
21
|
+
* const files = await unzip(archive, { filter: (e) => e.name.endsWith('.json') });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
import { getEngine } from '../engine.js';
|
|
25
|
+
import { ZipKitError } from '../types.js';
|
|
26
|
+
import { sharedPool } from '../workers/index.js';
|
|
27
|
+
import { toDosDateTime, fromDosDateTime } from './datetime.js';
|
|
28
|
+
import { aesEncrypt, aesDecrypt } from './crypto/winzip.js';
|
|
29
|
+
import { zipCryptoDecrypt } from './crypto/zipcrypto.js';
|
|
30
|
+
/** Compress entries concurrently once an archive is at least this large. */
|
|
31
|
+
const PARALLEL_MIN_BYTES = 256 * 1024;
|
|
32
|
+
const SIG_LOCAL = 0x04034b50;
|
|
33
|
+
const SIG_CENTRAL = 0x02014b50;
|
|
34
|
+
const SIG_EOCD = 0x06054b50;
|
|
35
|
+
const SIG_EOCD64 = 0x06064b50;
|
|
36
|
+
const SIG_EOCD64_LOC = 0x07064b50;
|
|
37
|
+
const U32_MAX = 0xffffffff;
|
|
38
|
+
const U16_MAX = 0xffff;
|
|
39
|
+
const METHOD_CODE = { store: 0, deflate: 8, zstd: 93 };
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Writing
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/** A growable little-endian byte writer. */
|
|
44
|
+
class Writer {
|
|
45
|
+
buf = new Uint8Array(1024);
|
|
46
|
+
view = new DataView(this.buf.buffer);
|
|
47
|
+
len = 0;
|
|
48
|
+
grow(extra) {
|
|
49
|
+
if (this.len + extra <= this.buf.length)
|
|
50
|
+
return;
|
|
51
|
+
let cap = this.buf.length * 2;
|
|
52
|
+
while (cap < this.len + extra)
|
|
53
|
+
cap *= 2;
|
|
54
|
+
const next = new Uint8Array(cap);
|
|
55
|
+
next.set(this.buf.subarray(0, this.len));
|
|
56
|
+
this.buf = next;
|
|
57
|
+
this.view = new DataView(this.buf.buffer);
|
|
58
|
+
}
|
|
59
|
+
u16(v) {
|
|
60
|
+
this.grow(2);
|
|
61
|
+
this.view.setUint16(this.len, v, true);
|
|
62
|
+
this.len += 2;
|
|
63
|
+
}
|
|
64
|
+
u32(v) {
|
|
65
|
+
this.grow(4);
|
|
66
|
+
this.view.setUint32(this.len, v >>> 0, true);
|
|
67
|
+
this.len += 4;
|
|
68
|
+
}
|
|
69
|
+
u64(v) {
|
|
70
|
+
this.grow(8);
|
|
71
|
+
this.view.setBigUint64(this.len, BigInt(v), true);
|
|
72
|
+
this.len += 8;
|
|
73
|
+
}
|
|
74
|
+
bytes(b) {
|
|
75
|
+
this.grow(b.length);
|
|
76
|
+
this.buf.set(b, this.len);
|
|
77
|
+
this.len += b.length;
|
|
78
|
+
}
|
|
79
|
+
done() {
|
|
80
|
+
return this.buf.slice(0, this.len);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Write a WinZip AES (0x9901) extra field: version 2 (AE-2), vendor "AE". */
|
|
84
|
+
function writeAesExtra(out, strength, actualMethod) {
|
|
85
|
+
out.u16(0x9901); // header id
|
|
86
|
+
out.u16(7); // data size
|
|
87
|
+
out.u16(2); // AE-2
|
|
88
|
+
out.u16(0x4541); // "AE" (little-endian 'A','E')
|
|
89
|
+
out.bytes(new Uint8Array([strength]));
|
|
90
|
+
out.u16(actualMethod);
|
|
91
|
+
}
|
|
92
|
+
/** Scan an extra field for the WinZip AES (0x9901) record. */
|
|
93
|
+
function readAesExtra(view, start, len) {
|
|
94
|
+
let off = start;
|
|
95
|
+
const end = start + len;
|
|
96
|
+
while (off + 4 <= end) {
|
|
97
|
+
const id = view.getUint16(off, true);
|
|
98
|
+
const size = view.getUint16(off + 2, true);
|
|
99
|
+
if (id === 0x9901 && size >= 7) {
|
|
100
|
+
return { strength: view.getUint8(off + 8), actualMethod: view.getUint16(off + 9, true) };
|
|
101
|
+
}
|
|
102
|
+
off += 4 + size;
|
|
103
|
+
}
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
async function compressEntry(data, method, level) {
|
|
107
|
+
if (method === 'store')
|
|
108
|
+
return data;
|
|
109
|
+
const e = await getEngine();
|
|
110
|
+
if (method === 'deflate')
|
|
111
|
+
return e.deflateCompress(data, level ?? 6);
|
|
112
|
+
if (method === 'zstd')
|
|
113
|
+
return e.zstdCompress(data, level ?? 19);
|
|
114
|
+
throw new ZipKitError(`Unsupported ZIP method: ${method}`);
|
|
115
|
+
}
|
|
116
|
+
const utf8 = new TextEncoder();
|
|
117
|
+
/**
|
|
118
|
+
* Build a ZIP archive from a list of entries. Returns the complete archive
|
|
119
|
+
* bytes. Uses ZIP64 automatically when any size/offset exceeds 4 GB or there
|
|
120
|
+
* are more than 65 535 entries.
|
|
121
|
+
*/
|
|
122
|
+
export async function zip(entries, opts = {}) {
|
|
123
|
+
const e = await getEngine();
|
|
124
|
+
// Prepare every entry up front: CRC-32 (libdeflate's SIMD path, on the main
|
|
125
|
+
// thread) plus the compressed payload. For larger archives the per-entry
|
|
126
|
+
// compression fans out across the worker pool — independent blocks, one per
|
|
127
|
+
// core — while the container below is still assembled strictly in order, so
|
|
128
|
+
// the bytes are identical to the single-threaded path.
|
|
129
|
+
const totalBytes = entries.reduce((n, x) => n + x.data.length, 0);
|
|
130
|
+
const useParallel = opts.parallel ?? (entries.length >= 2 && totalBytes >= PARALLEL_MIN_BYTES);
|
|
131
|
+
const pool = useParallel ? sharedPool() : undefined;
|
|
132
|
+
const crcs = entries.map((entry) => e.crc32(entry.data));
|
|
133
|
+
let done = 0;
|
|
134
|
+
const tick = opts.onProgress;
|
|
135
|
+
const compressedList = await Promise.all(entries.map((entry) => {
|
|
136
|
+
const method = entry.method ?? 'deflate';
|
|
137
|
+
const work = method === 'store'
|
|
138
|
+
? Promise.resolve(entry.data)
|
|
139
|
+
: pool
|
|
140
|
+
? pool.zipCompress(entry.data, method, entry.level ?? (method === 'zstd' ? 19 : 6))
|
|
141
|
+
: compressEntry(entry.data, method, entry.level);
|
|
142
|
+
return tick ? work.then((r) => (tick(++done, entries.length), r)) : work;
|
|
143
|
+
}));
|
|
144
|
+
// When encrypting, wrap each compressed payload in a WinZip AE-2 envelope.
|
|
145
|
+
const AES_STRENGTH = 3; // AES-256
|
|
146
|
+
const encrypted = opts.password
|
|
147
|
+
? await Promise.all(compressedList.map((c) => aesEncrypt(c, opts.password, AES_STRENGTH)))
|
|
148
|
+
: undefined;
|
|
149
|
+
const storedList = encrypted ? encrypted.map((x) => x.payload) : compressedList;
|
|
150
|
+
const out = new Writer();
|
|
151
|
+
const central = [];
|
|
152
|
+
let needZip64 = entries.length > U16_MAX;
|
|
153
|
+
for (let i = 0; i < entries.length; i++) {
|
|
154
|
+
const entry = entries[i];
|
|
155
|
+
const method = entry.method ?? 'deflate';
|
|
156
|
+
const actualMethod = METHOD_CODE[method];
|
|
157
|
+
const isEnc = encrypted !== undefined;
|
|
158
|
+
// AE-2 entries advertise method 99 (AE-x) and carry the real method in the
|
|
159
|
+
// 0x9901 extra field; their CRC is stored as 0 per the AE-2 spec.
|
|
160
|
+
const methodCode = isEnc ? 99 : actualMethod;
|
|
161
|
+
const flag = 0x0800 | (isEnc ? 0x0001 : 0); // UTF-8 names + encrypted bit
|
|
162
|
+
const nameBytes = utf8.encode(entry.name);
|
|
163
|
+
const commentBytes = entry.comment ? utf8.encode(entry.comment) : new Uint8Array(0);
|
|
164
|
+
const crc = crcs[i];
|
|
165
|
+
const storedCrc = isEnc ? 0 : crc;
|
|
166
|
+
const stored = storedList[i];
|
|
167
|
+
const size = entry.data.length;
|
|
168
|
+
const compSize = stored.length;
|
|
169
|
+
const mtime = entry.mtime === undefined ? new Date() : new Date(entry.mtime);
|
|
170
|
+
const { date: dosDate, time: dosTime } = toDosDateTime(mtime);
|
|
171
|
+
// Unix mode goes in the high 16 bits of the external attributes.
|
|
172
|
+
const externalAttrs = entry.unixPermissions !== undefined ? (entry.unixPermissions & 0xffff) << 16 : 0;
|
|
173
|
+
const offset = out.len;
|
|
174
|
+
const entryZip64 = needZip64 || size > U32_MAX || compSize > U32_MAX || offset > U32_MAX;
|
|
175
|
+
if (entryZip64)
|
|
176
|
+
needZip64 = true;
|
|
177
|
+
// --- Local file header ---
|
|
178
|
+
const localExtraLen = (entryZip64 ? 20 : 0) + (isEnc ? 11 : 0);
|
|
179
|
+
out.u32(SIG_LOCAL);
|
|
180
|
+
out.u16(entryZip64 ? 45 : 20); // version needed
|
|
181
|
+
out.u16(flag);
|
|
182
|
+
out.u16(methodCode);
|
|
183
|
+
out.u16(dosTime);
|
|
184
|
+
out.u16(dosDate);
|
|
185
|
+
out.u32(storedCrc);
|
|
186
|
+
out.u32(entryZip64 ? U32_MAX : compSize);
|
|
187
|
+
out.u32(entryZip64 ? U32_MAX : size);
|
|
188
|
+
out.u16(nameBytes.length);
|
|
189
|
+
out.u16(localExtraLen);
|
|
190
|
+
out.bytes(nameBytes);
|
|
191
|
+
if (entryZip64) {
|
|
192
|
+
out.u16(0x0001);
|
|
193
|
+
out.u16(16);
|
|
194
|
+
out.u64(size);
|
|
195
|
+
out.u64(compSize);
|
|
196
|
+
}
|
|
197
|
+
if (isEnc)
|
|
198
|
+
writeAesExtra(out, AES_STRENGTH, actualMethod);
|
|
199
|
+
out.bytes(stored);
|
|
200
|
+
central.push({
|
|
201
|
+
nameBytes,
|
|
202
|
+
commentBytes,
|
|
203
|
+
method: methodCode,
|
|
204
|
+
actualMethod,
|
|
205
|
+
encrypted: isEnc,
|
|
206
|
+
crc: storedCrc,
|
|
207
|
+
compSize,
|
|
208
|
+
size,
|
|
209
|
+
dosDate,
|
|
210
|
+
dosTime,
|
|
211
|
+
offset,
|
|
212
|
+
externalAttrs,
|
|
213
|
+
zip64: entryZip64
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
// --- Central directory ---
|
|
217
|
+
const cdStart = out.len;
|
|
218
|
+
for (const c of central) {
|
|
219
|
+
out.u32(SIG_CENTRAL);
|
|
220
|
+
out.u16(c.zip64 ? 45 : 20); // version made by
|
|
221
|
+
out.u16(c.zip64 ? 45 : 20); // version needed
|
|
222
|
+
out.u16(0x0800 | (c.encrypted ? 0x0001 : 0)); // UTF-8 names (+ encrypted)
|
|
223
|
+
out.u16(c.method);
|
|
224
|
+
out.u16(c.dosTime);
|
|
225
|
+
out.u16(c.dosDate);
|
|
226
|
+
out.u32(c.crc);
|
|
227
|
+
const useZip64 = c.zip64;
|
|
228
|
+
out.u32(useZip64 ? U32_MAX : c.compSize);
|
|
229
|
+
out.u32(useZip64 ? U32_MAX : c.size);
|
|
230
|
+
out.u16(c.nameBytes.length);
|
|
231
|
+
// ZIP64 extra holds whichever 64-bit fields we masked out above.
|
|
232
|
+
const zip64Extra = [];
|
|
233
|
+
if (useZip64) {
|
|
234
|
+
zip64Extra.push(c.size, c.compSize, c.offset);
|
|
235
|
+
}
|
|
236
|
+
const extraLen = (useZip64 ? 4 + zip64Extra.length * 8 : 0) + (c.encrypted ? 11 : 0);
|
|
237
|
+
out.u16(extraLen);
|
|
238
|
+
out.u16(c.commentBytes.length);
|
|
239
|
+
out.u16(0); // disk number start
|
|
240
|
+
out.u16(0); // internal attributes
|
|
241
|
+
out.u32(c.externalAttrs);
|
|
242
|
+
out.u32(useZip64 ? U32_MAX : c.offset);
|
|
243
|
+
out.bytes(c.nameBytes);
|
|
244
|
+
if (useZip64) {
|
|
245
|
+
out.u16(0x0001);
|
|
246
|
+
out.u16(zip64Extra.length * 8);
|
|
247
|
+
for (const v of zip64Extra)
|
|
248
|
+
out.u64(v);
|
|
249
|
+
}
|
|
250
|
+
if (c.encrypted)
|
|
251
|
+
writeAesExtra(out, 3, c.actualMethod);
|
|
252
|
+
out.bytes(c.commentBytes);
|
|
253
|
+
}
|
|
254
|
+
const cdSize = out.len - cdStart;
|
|
255
|
+
const count = central.length;
|
|
256
|
+
// --- ZIP64 end-of-central-directory (when needed) ---
|
|
257
|
+
if (needZip64 || count > U16_MAX || cdSize > U32_MAX || cdStart > U32_MAX) {
|
|
258
|
+
const eocd64Offset = out.len;
|
|
259
|
+
out.u32(SIG_EOCD64);
|
|
260
|
+
out.u64(44); // size of remaining EOCD64 record
|
|
261
|
+
out.u16(45); // version made by
|
|
262
|
+
out.u16(45); // version needed
|
|
263
|
+
out.u32(0); // this disk
|
|
264
|
+
out.u32(0); // disk with CD start
|
|
265
|
+
out.u64(count);
|
|
266
|
+
out.u64(count);
|
|
267
|
+
out.u64(cdSize);
|
|
268
|
+
out.u64(cdStart);
|
|
269
|
+
// ZIP64 EOCD locator
|
|
270
|
+
out.u32(SIG_EOCD64_LOC);
|
|
271
|
+
out.u32(0); // disk with EOCD64
|
|
272
|
+
out.u64(eocd64Offset);
|
|
273
|
+
out.u32(1); // total disks
|
|
274
|
+
}
|
|
275
|
+
// --- End of central directory ---
|
|
276
|
+
out.u32(SIG_EOCD);
|
|
277
|
+
out.u16(0); // this disk
|
|
278
|
+
out.u16(0); // disk with CD start
|
|
279
|
+
out.u16(count > U16_MAX ? U16_MAX : count);
|
|
280
|
+
out.u16(count > U16_MAX ? U16_MAX : count);
|
|
281
|
+
out.u32(cdSize > U32_MAX ? U32_MAX : cdSize);
|
|
282
|
+
out.u32(cdStart > U32_MAX ? U32_MAX : cdStart);
|
|
283
|
+
out.u16(0); // comment length
|
|
284
|
+
return out.done();
|
|
285
|
+
}
|
|
286
|
+
// ---------------------------------------------------------------------------
|
|
287
|
+
// Reading
|
|
288
|
+
// ---------------------------------------------------------------------------
|
|
289
|
+
async function decompressEntry(data, method, size) {
|
|
290
|
+
if (method === 0)
|
|
291
|
+
return data;
|
|
292
|
+
const e = await getEngine();
|
|
293
|
+
if (method === 8)
|
|
294
|
+
return e.deflateDecompress(data);
|
|
295
|
+
if (method === 93)
|
|
296
|
+
return e.zstdDecompress(data);
|
|
297
|
+
throw new ZipKitError(`Unsupported ZIP method ${method} for entry of ${size} bytes`);
|
|
298
|
+
}
|
|
299
|
+
/** Locate the End-Of-Central-Directory record, scanning back from the tail. */
|
|
300
|
+
function findEocd(view, data) {
|
|
301
|
+
// EOCD is 22 bytes + up to 65 535 bytes of comment.
|
|
302
|
+
const min = Math.max(0, data.length - (22 + U16_MAX));
|
|
303
|
+
for (let i = data.length - 22; i >= min; i--) {
|
|
304
|
+
if (view.getUint32(i, true) === SIG_EOCD)
|
|
305
|
+
return i;
|
|
306
|
+
}
|
|
307
|
+
throw new ZipKitError('Not a ZIP archive: end-of-central-directory record not found');
|
|
308
|
+
}
|
|
309
|
+
/** Read a ZIP64 extra field, returning any 64-bit overrides it carries. */
|
|
310
|
+
function readZip64Extra(view, start, extraLen, need) {
|
|
311
|
+
let p = start;
|
|
312
|
+
const end = start + extraLen;
|
|
313
|
+
const result = {};
|
|
314
|
+
while (p + 4 <= end) {
|
|
315
|
+
const id = view.getUint16(p, true);
|
|
316
|
+
const len = view.getUint16(p + 2, true);
|
|
317
|
+
let q = p + 4;
|
|
318
|
+
if (id === 0x0001) {
|
|
319
|
+
if (need.size) {
|
|
320
|
+
result.size = Number(view.getBigUint64(q, true));
|
|
321
|
+
q += 8;
|
|
322
|
+
}
|
|
323
|
+
if (need.compSize) {
|
|
324
|
+
result.compSize = Number(view.getBigUint64(q, true));
|
|
325
|
+
q += 8;
|
|
326
|
+
}
|
|
327
|
+
if (need.offset) {
|
|
328
|
+
result.offset = Number(view.getBigUint64(q, true));
|
|
329
|
+
q += 8;
|
|
330
|
+
}
|
|
331
|
+
return result;
|
|
332
|
+
}
|
|
333
|
+
p += 4 + len;
|
|
334
|
+
}
|
|
335
|
+
return result;
|
|
336
|
+
}
|
|
337
|
+
const utf8Decode = new TextDecoder('utf-8');
|
|
338
|
+
/**
|
|
339
|
+
* Read a ZIP archive. Returns one {@link ZipEntry} per file. Pass
|
|
340
|
+
* `opts.filter` to skip decompressing entries you don't need — rejected
|
|
341
|
+
* entries are omitted from the result.
|
|
342
|
+
*/
|
|
343
|
+
export async function unzip(data, opts = {}) {
|
|
344
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
345
|
+
const eocd = findEocd(view, data);
|
|
346
|
+
let count = view.getUint16(eocd + 10, true);
|
|
347
|
+
let cdOffset = view.getUint32(eocd + 16, true);
|
|
348
|
+
// Follow the ZIP64 locator if the classic EOCD fields are saturated.
|
|
349
|
+
if (count === U16_MAX || cdOffset === U32_MAX) {
|
|
350
|
+
const locOff = eocd - 20;
|
|
351
|
+
if (locOff >= 0 && view.getUint32(locOff, true) === SIG_EOCD64_LOC) {
|
|
352
|
+
const eocd64 = Number(view.getBigUint64(locOff + 8, true));
|
|
353
|
+
if (view.getUint32(eocd64, true) === SIG_EOCD64) {
|
|
354
|
+
count = Number(view.getBigUint64(eocd64 + 32, true));
|
|
355
|
+
cdOffset = Number(view.getBigUint64(eocd64 + 48, true));
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
const entries = [];
|
|
360
|
+
const verifier = opts.verify ? await getEngine() : undefined;
|
|
361
|
+
let p = cdOffset;
|
|
362
|
+
for (let i = 0; i < count; i++) {
|
|
363
|
+
if (view.getUint32(p, true) !== SIG_CENTRAL) {
|
|
364
|
+
throw new ZipKitError('Corrupt ZIP: bad central directory signature');
|
|
365
|
+
}
|
|
366
|
+
const flag = view.getUint16(p + 8, true);
|
|
367
|
+
const method = view.getUint16(p + 10, true);
|
|
368
|
+
const dosTime = view.getUint16(p + 12, true);
|
|
369
|
+
const dosDate = view.getUint16(p + 14, true);
|
|
370
|
+
const crc = view.getUint32(p + 16, true);
|
|
371
|
+
let compSize = view.getUint32(p + 20, true);
|
|
372
|
+
let size = view.getUint32(p + 24, true);
|
|
373
|
+
const nameLen = view.getUint16(p + 28, true);
|
|
374
|
+
const extraLen = view.getUint16(p + 30, true);
|
|
375
|
+
const commentLen = view.getUint16(p + 32, true);
|
|
376
|
+
const externalAttrs = view.getUint32(p + 38, true);
|
|
377
|
+
let localOffset = view.getUint32(p + 42, true);
|
|
378
|
+
const nameStart = p + 46;
|
|
379
|
+
const name = utf8Decode.decode(data.subarray(nameStart, nameStart + nameLen));
|
|
380
|
+
const extraStart = nameStart + nameLen;
|
|
381
|
+
if (size === U32_MAX || compSize === U32_MAX || localOffset === U32_MAX) {
|
|
382
|
+
const z = readZip64Extra(view, extraStart, extraLen, {
|
|
383
|
+
size: size === U32_MAX,
|
|
384
|
+
compSize: compSize === U32_MAX,
|
|
385
|
+
offset: localOffset === U32_MAX
|
|
386
|
+
});
|
|
387
|
+
if (z.size !== undefined)
|
|
388
|
+
size = z.size;
|
|
389
|
+
if (z.compSize !== undefined)
|
|
390
|
+
compSize = z.compSize;
|
|
391
|
+
if (z.offset !== undefined)
|
|
392
|
+
localOffset = z.offset;
|
|
393
|
+
}
|
|
394
|
+
const commentStart = extraStart + extraLen;
|
|
395
|
+
const comment = commentLen > 0 ? utf8Decode.decode(data.subarray(commentStart, commentStart + commentLen)) : undefined;
|
|
396
|
+
const unixPermissions = externalAttrs >>> 16 ? (externalAttrs >>> 16) & 0xffff : undefined;
|
|
397
|
+
const mtime = fromDosDateTime(dosDate, dosTime);
|
|
398
|
+
p = commentStart + commentLen;
|
|
399
|
+
const info = { name, method, size, compressedSize: compSize, mtime, unixPermissions };
|
|
400
|
+
if (opts.filter && !opts.filter(info))
|
|
401
|
+
continue;
|
|
402
|
+
// Jump to the local header to find the actual data start (its extra
|
|
403
|
+
// field length may differ from the central directory's).
|
|
404
|
+
if (view.getUint32(localOffset, true) !== SIG_LOCAL) {
|
|
405
|
+
throw new ZipKitError(`Corrupt ZIP: bad local header for "${name}"`);
|
|
406
|
+
}
|
|
407
|
+
const localNameLen = view.getUint16(localOffset + 26, true);
|
|
408
|
+
const localExtraLen = view.getUint16(localOffset + 28, true);
|
|
409
|
+
const dataStart = localOffset + 30 + localNameLen + localExtraLen;
|
|
410
|
+
const stored = data.subarray(dataStart, dataStart + compSize);
|
|
411
|
+
// Decrypt first when the entry is encrypted, resolving the real
|
|
412
|
+
// compression method (AES carries it in the 0x9901 extra field).
|
|
413
|
+
const isEnc = (flag & 0x0001) !== 0;
|
|
414
|
+
let effectiveMethod = method;
|
|
415
|
+
let payload = stored;
|
|
416
|
+
if (isEnc) {
|
|
417
|
+
if (opts.password === undefined) {
|
|
418
|
+
throw new ZipKitError(`Entry "${name}" is encrypted — pass { password } to unzip()`);
|
|
419
|
+
}
|
|
420
|
+
if (method === 99) {
|
|
421
|
+
const aes = readAesExtra(view, extraStart, extraLen);
|
|
422
|
+
if (!aes)
|
|
423
|
+
throw new ZipKitError(`Entry "${name}" is AES-encrypted but has no AES extra field`);
|
|
424
|
+
payload = await aesDecrypt(stored, opts.password, aes.strength);
|
|
425
|
+
effectiveMethod = aes.actualMethod;
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
// Legacy ZipCrypto: the verification byte is the CRC's high byte, or
|
|
429
|
+
// the DOS time's high byte when a data descriptor (bit 3) is used.
|
|
430
|
+
const checkByte = flag & 0x0008 ? (dosTime >>> 8) & 0xff : (crc >>> 24) & 0xff;
|
|
431
|
+
payload = zipCryptoDecrypt(stored, opts.password, checkByte);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
const decompressed = await decompressEntry(payload, effectiveMethod, size);
|
|
435
|
+
// AE-2 stores CRC as 0 and relies on its own HMAC, so only verify when a
|
|
436
|
+
// real CRC is present.
|
|
437
|
+
if (verifier && !(isEnc && method === 99)) {
|
|
438
|
+
const actual = verifier.crc32(decompressed) >>> 0;
|
|
439
|
+
if (actual !== (crc >>> 0)) {
|
|
440
|
+
throw new ZipKitError(`Checksum mismatch for "${name}": expected ${(crc >>> 0).toString(16)}, got ${actual.toString(16)}`);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
entries.push({
|
|
444
|
+
name,
|
|
445
|
+
data: decompressed,
|
|
446
|
+
method: effectiveMethod,
|
|
447
|
+
mtime,
|
|
448
|
+
size,
|
|
449
|
+
compressedSize: compSize,
|
|
450
|
+
crc32: crc,
|
|
451
|
+
unixPermissions,
|
|
452
|
+
comment
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
return entries;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* List the entries in an archive without decompressing them. Cheaper than
|
|
459
|
+
* {@link unzip} when you only need names, sizes, and metadata.
|
|
460
|
+
*/
|
|
461
|
+
export async function listEntries(data) {
|
|
462
|
+
const infos = [];
|
|
463
|
+
await unzip(data, {
|
|
464
|
+
filter: (info) => {
|
|
465
|
+
infos.push(info);
|
|
466
|
+
return false;
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
return infos;
|
|
470
|
+
}
|
|
471
|
+
// ---- Streaming writer (incremental, memory-bounded) ----
|
|
472
|
+
export { zipStream } from './stream.js';
|
|
473
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/zip/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming ZIP writer — build an archive incrementally without ever holding
|
|
3
|
+
* the whole thing in memory.
|
|
4
|
+
*
|
|
5
|
+
* {@link zipStream} consumes entries one at a time (from a sync or async
|
|
6
|
+
* iterable) and emits archive bytes through a web-standard
|
|
7
|
+
* `ReadableStream<Uint8Array>` you can pipe straight to a file, an HTTP
|
|
8
|
+
* response, or `FileSystemWritableFileStream`. Peak memory is bounded by the
|
|
9
|
+
* single largest entry, not the archive total — so hundreds-of-MB / multi-GB
|
|
10
|
+
* archives never OOM in Node, Bun, or the browser.
|
|
11
|
+
*
|
|
12
|
+
* Each entry is compressed as one buffer (the engine is one-shot), so its
|
|
13
|
+
* CRC-32 and sizes are known before its local header is written — the output is
|
|
14
|
+
* byte-compatible with {@link import('./index.js').zip}, ZIP64 and all, and
|
|
15
|
+
* reads back with {@link import('./index.js').unzip} or any standard tool.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* import { zipStream } from '@myrialabs/zipkit/zip';
|
|
20
|
+
* const stream = zipStream(async function* () {
|
|
21
|
+
* for await (const file of files) yield { name: file.name, data: await file.bytes() };
|
|
22
|
+
* }());
|
|
23
|
+
* await stream.pipeTo(destinationWritable);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
import type { ZipEntryInput } from './index.js';
|
|
27
|
+
/** Options for {@link zipStream}. */
|
|
28
|
+
export interface ZipStreamOptions {
|
|
29
|
+
/** Invoked after each entry is written, with the running entry/byte counts. */
|
|
30
|
+
onProgress?: (entriesWritten: number, bytesWritten: number) => void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Stream a ZIP archive built from `entries` (a sync or async iterable). Returns
|
|
34
|
+
* a `ReadableStream<Uint8Array>` of the archive bytes. Uses ZIP64 automatically
|
|
35
|
+
* for entries/offsets past 4 GB or more than 65 535 entries.
|
|
36
|
+
*/
|
|
37
|
+
export declare function zipStream(entries: Iterable<ZipEntryInput> | AsyncIterable<ZipEntryInput>, opts?: ZipStreamOptions): ReadableStream<Uint8Array>;
|
|
38
|
+
//# sourceMappingURL=stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/zip/stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,YAAY,CAAC;AAa3D,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAChC,+EAA+E;IAC/E,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CACpE;AAmED;;;;GAIG;AACH,wBAAgB,SAAS,CACxB,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC,aAAa,CAAC,EAC/D,IAAI,GAAE,gBAAqB,GACzB,cAAc,CAAC,UAAU,CAAC,CAkJ5B"}
|