@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,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tar container — create and read POSIX `ustar` archives.
|
|
3
|
+
*
|
|
4
|
+
* Pure TypeScript, no engine: tar is a framing format, not a codec. {@link tar}
|
|
5
|
+
* concatenates 512-byte headers and padded payloads; {@link untar} walks them
|
|
6
|
+
* back. Long paths and large (>8 GB) entries transparently use PAX extended
|
|
7
|
+
* headers, and reading understands the GNU long-name (`L`) and PAX (`x`/`g`)
|
|
8
|
+
* records that `tar`/Docker emit — so archives round-trip with the standard
|
|
9
|
+
* Unix `tar` CLI and Docker image layers.
|
|
10
|
+
*
|
|
11
|
+
* Combine with a codec for the usual on-disk forms: {@link tarGz} (`.tar.gz`)
|
|
12
|
+
* and {@link tarZstd} (`.tar.zst`) pipe the framing through gzip/zstd so callers
|
|
13
|
+
* never hand-wire two functions.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { tar, untar, tarGz } from '@myrialabs/zipkit/tar';
|
|
18
|
+
* const archive = tar([
|
|
19
|
+
* { name: 'hello.txt', data: strToU8('hi') },
|
|
20
|
+
* { name: 'src/', type: 'directory' }
|
|
21
|
+
* ]);
|
|
22
|
+
* const gz = await tarGz([{ name: 'big.log', data: bytes }]);
|
|
23
|
+
* const files = untar(archive);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
import { gzip, gunzip } from '../codecs/gzip.js';
|
|
27
|
+
import { zstd, unzstd } from '../codecs/zstd.js';
|
|
28
|
+
import { strToU8, strFromU8 } from '../string.js';
|
|
29
|
+
import { ZipKitError } from '../types.js';
|
|
30
|
+
/** A 512-byte tar block. */
|
|
31
|
+
const BLOCK = 512;
|
|
32
|
+
/** Tar typeflag values ZipKit reads/writes. */
|
|
33
|
+
const TYPE_FILE = '0';
|
|
34
|
+
const TYPE_DIR = '5';
|
|
35
|
+
const TYPE_SYMLINK = '2';
|
|
36
|
+
const TYPE_GNU_LONGNAME = 'L';
|
|
37
|
+
const TYPE_GNU_LONGLINK = 'K';
|
|
38
|
+
const TYPE_PAX_NEXT = 'x';
|
|
39
|
+
const TYPE_PAX_GLOBAL = 'g';
|
|
40
|
+
/** Round `n` up to the next multiple of {@link BLOCK}. */
|
|
41
|
+
function pad512(n) {
|
|
42
|
+
return (n + BLOCK - 1) & ~(BLOCK - 1);
|
|
43
|
+
}
|
|
44
|
+
/** Resolve a `Date | number` to seconds since the epoch. */
|
|
45
|
+
function toEpochSeconds(mtime) {
|
|
46
|
+
if (mtime === undefined)
|
|
47
|
+
return Math.floor(nowMs() / 1000);
|
|
48
|
+
const ms = typeof mtime === 'number' ? mtime : mtime.getTime();
|
|
49
|
+
return Math.floor(ms / 1000);
|
|
50
|
+
}
|
|
51
|
+
/** Current wall-clock millis, behind a helper so tests can reason about it. */
|
|
52
|
+
function nowMs() {
|
|
53
|
+
return Date.now();
|
|
54
|
+
}
|
|
55
|
+
/** Write `value` as a NUL-padded octal field of width `width` (incl. terminator). */
|
|
56
|
+
function writeOctal(block, offset, width, value) {
|
|
57
|
+
// Field holds `width - 1` octal digits then a NUL (or space) terminator.
|
|
58
|
+
const digits = width - 1;
|
|
59
|
+
let s = Math.max(0, Math.floor(value)).toString(8);
|
|
60
|
+
if (s.length > digits)
|
|
61
|
+
s = s.slice(-digits); // overflow guarded by PAX upstream
|
|
62
|
+
s = s.padStart(digits, '0');
|
|
63
|
+
for (let i = 0; i < digits; i++)
|
|
64
|
+
block[offset + i] = s.charCodeAt(i);
|
|
65
|
+
block[offset + digits] = 0;
|
|
66
|
+
}
|
|
67
|
+
/** Write an ASCII string into a fixed field, truncating and NUL-padding. */
|
|
68
|
+
function writeStr(block, offset, width, value) {
|
|
69
|
+
const bytes = strToU8(value);
|
|
70
|
+
const n = Math.min(bytes.length, width);
|
|
71
|
+
block.set(bytes.subarray(0, n), offset);
|
|
72
|
+
}
|
|
73
|
+
/** Read a NUL/space-terminated string from a fixed field. */
|
|
74
|
+
function readStr(block, offset, width) {
|
|
75
|
+
let end = offset;
|
|
76
|
+
const limit = offset + width;
|
|
77
|
+
while (end < limit && block[end] !== 0)
|
|
78
|
+
end++;
|
|
79
|
+
return strFromU8(block.subarray(offset, end));
|
|
80
|
+
}
|
|
81
|
+
/** Read an octal numeric field; tolerant of leading/trailing spaces and NULs. */
|
|
82
|
+
function readOctal(block, offset, width) {
|
|
83
|
+
let s = '';
|
|
84
|
+
for (let i = offset; i < offset + width; i++) {
|
|
85
|
+
const c = block[i];
|
|
86
|
+
if (c === 0 || c === 0x20) {
|
|
87
|
+
if (s)
|
|
88
|
+
break;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
s += String.fromCharCode(c);
|
|
92
|
+
}
|
|
93
|
+
return s ? parseInt(s, 8) : 0;
|
|
94
|
+
}
|
|
95
|
+
/** The 8-bit checksum over a header block, with the checksum field read as spaces. */
|
|
96
|
+
function headerChecksum(block) {
|
|
97
|
+
let sum = 0;
|
|
98
|
+
for (let i = 0; i < BLOCK; i++) {
|
|
99
|
+
// Checksum field is offset 148, width 8 — treated as ASCII spaces.
|
|
100
|
+
sum += i >= 148 && i < 156 ? 0x20 : block[i];
|
|
101
|
+
}
|
|
102
|
+
return sum;
|
|
103
|
+
}
|
|
104
|
+
/** Default permission bits for an entry type. */
|
|
105
|
+
function defaultMode(type) {
|
|
106
|
+
return type === 'directory' ? 0o755 : type === 'symlink' ? 0o777 : 0o644;
|
|
107
|
+
}
|
|
108
|
+
/** Normalize a directory name to a trailing slash; leave others untouched. */
|
|
109
|
+
function normalizeName(name, type) {
|
|
110
|
+
if (type === 'directory' && !name.endsWith('/'))
|
|
111
|
+
return name + '/';
|
|
112
|
+
return name;
|
|
113
|
+
}
|
|
114
|
+
/** Resolve the effective type for an input entry. */
|
|
115
|
+
function resolveType(input) {
|
|
116
|
+
if (input.type)
|
|
117
|
+
return input.type;
|
|
118
|
+
if (input.name.endsWith('/'))
|
|
119
|
+
return 'directory';
|
|
120
|
+
return 'file';
|
|
121
|
+
}
|
|
122
|
+
/** Map a normalized type to its on-disk typeflag character. */
|
|
123
|
+
function typeflagFor(type) {
|
|
124
|
+
return type === 'directory' ? TYPE_DIR : type === 'symlink' ? TYPE_SYMLINK : TYPE_FILE;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Build one ustar header block for `entry`. Returns the 512-byte header. Any
|
|
128
|
+
* field that overflows ustar's fixed widths is expected to have been handled by
|
|
129
|
+
* a PAX record the caller emitted first; `name`/`linkname`/`size` here are the
|
|
130
|
+
* (possibly truncated) ustar fallbacks.
|
|
131
|
+
*/
|
|
132
|
+
function buildHeader(name, linkname, size, mode, uid, gid, mtime, type, uname, gname) {
|
|
133
|
+
const block = new Uint8Array(BLOCK);
|
|
134
|
+
// ustar splits long names into prefix[155] + name[100] on a `/` boundary.
|
|
135
|
+
let namePart = name;
|
|
136
|
+
let prefix = '';
|
|
137
|
+
if (strToU8(name).length > 100) {
|
|
138
|
+
const cut = name.lastIndexOf('/', 154);
|
|
139
|
+
if (cut > 0 && strToU8(name.slice(cut + 1)).length <= 100) {
|
|
140
|
+
prefix = name.slice(0, cut);
|
|
141
|
+
namePart = name.slice(cut + 1);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
namePart = name.slice(0, 100); // PAX 'path' carries the real value
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
writeStr(block, 0, 100, namePart);
|
|
148
|
+
writeOctal(block, 100, 8, mode & 0o7777);
|
|
149
|
+
writeOctal(block, 108, 8, uid);
|
|
150
|
+
writeOctal(block, 116, 8, gid);
|
|
151
|
+
writeOctal(block, 124, 12, size);
|
|
152
|
+
writeOctal(block, 136, 12, mtime);
|
|
153
|
+
block[156] = type.charCodeAt(0);
|
|
154
|
+
writeStr(block, 157, 100, linkname);
|
|
155
|
+
writeStr(block, 257, 6, 'ustar');
|
|
156
|
+
block[263] = 0x30; // version "00"
|
|
157
|
+
block[264] = 0x30;
|
|
158
|
+
writeStr(block, 265, 32, uname);
|
|
159
|
+
writeStr(block, 297, 32, gname);
|
|
160
|
+
writeStr(block, 345, 155, prefix);
|
|
161
|
+
// Checksum: compute over the block with the field blanked, then write it
|
|
162
|
+
// back as six octal digits + NUL + space (the canonical encoding).
|
|
163
|
+
const sum = headerChecksum(block);
|
|
164
|
+
const cs = (sum & 0o777777).toString(8).padStart(6, '0');
|
|
165
|
+
for (let i = 0; i < 6; i++)
|
|
166
|
+
block[148 + i] = cs.charCodeAt(i);
|
|
167
|
+
block[154] = 0;
|
|
168
|
+
block[155] = 0x20;
|
|
169
|
+
return block;
|
|
170
|
+
}
|
|
171
|
+
/** Encode a single `key=value` PAX record (`"<len> key=value\n"`). */
|
|
172
|
+
function paxRecord(key, value) {
|
|
173
|
+
const body = ` ${key}=${value}\n`;
|
|
174
|
+
// The length prefix counts its own digits, so solve for the fixed point.
|
|
175
|
+
let len = strToU8(body).length;
|
|
176
|
+
let total = len + String(len).length;
|
|
177
|
+
while (String(total).length !== String(len).length) {
|
|
178
|
+
len = total;
|
|
179
|
+
total = strToU8(body).length + String(len).length;
|
|
180
|
+
}
|
|
181
|
+
return strToU8(`${total}${body}`);
|
|
182
|
+
}
|
|
183
|
+
/** Build the data block(s) of a PAX extended header from a record map. */
|
|
184
|
+
function paxExtended(records) {
|
|
185
|
+
const parts = [];
|
|
186
|
+
for (const [k, v] of Object.entries(records))
|
|
187
|
+
parts.push(paxRecord(k, v));
|
|
188
|
+
return concat(parts);
|
|
189
|
+
}
|
|
190
|
+
/** Concatenate byte chunks into one buffer. */
|
|
191
|
+
function concat(chunks) {
|
|
192
|
+
let total = 0;
|
|
193
|
+
for (const c of chunks)
|
|
194
|
+
total += c.length;
|
|
195
|
+
const out = new Uint8Array(total);
|
|
196
|
+
let off = 0;
|
|
197
|
+
for (const c of chunks) {
|
|
198
|
+
out.set(c, off);
|
|
199
|
+
off += c.length;
|
|
200
|
+
}
|
|
201
|
+
return out;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Create a tar archive from `entries`. Synchronous and engine-free. Emits PAX
|
|
205
|
+
* extended headers for paths over 100 bytes that don't fit the ustar
|
|
206
|
+
* prefix/name split, and for entries larger than 8 GB (ustar's octal size
|
|
207
|
+
* ceiling). The result ends with the two zero blocks `tar` expects.
|
|
208
|
+
*/
|
|
209
|
+
export function tar(entries) {
|
|
210
|
+
const blocks = [];
|
|
211
|
+
for (const input of entries) {
|
|
212
|
+
const type = resolveType(input);
|
|
213
|
+
const data = type === 'file' ? input.data ?? new Uint8Array(0) : new Uint8Array(0);
|
|
214
|
+
const name = normalizeName(input.name, type);
|
|
215
|
+
const linkname = input.linkname ?? '';
|
|
216
|
+
const mode = input.mode ?? defaultMode(type);
|
|
217
|
+
const mtime = toEpochSeconds(input.mtime);
|
|
218
|
+
const uid = input.uid ?? 0;
|
|
219
|
+
const gid = input.gid ?? 0;
|
|
220
|
+
const uname = input.uname ?? '';
|
|
221
|
+
const gname = input.gname ?? '';
|
|
222
|
+
// Decide whether ustar's fixed fields can hold name/linkname/size; if not,
|
|
223
|
+
// precede the entry with a PAX extended header carrying the real values.
|
|
224
|
+
const pax = {};
|
|
225
|
+
const nameBytes = strToU8(name).length;
|
|
226
|
+
const ustarNameOk = nameBytes <= 100 || (name.lastIndexOf('/', 154) > 0 && strToU8(name.slice(name.lastIndexOf('/', 154) + 1)).length <= 100);
|
|
227
|
+
if (!ustarNameOk)
|
|
228
|
+
pax.path = name;
|
|
229
|
+
if (strToU8(linkname).length > 100)
|
|
230
|
+
pax.linkpath = linkname;
|
|
231
|
+
if (data.length > 0o77777777777)
|
|
232
|
+
pax.size = String(data.length); // > 8 GB
|
|
233
|
+
if (Object.keys(pax).length > 0) {
|
|
234
|
+
const ext = paxExtended(pax);
|
|
235
|
+
blocks.push(buildHeader('PaxHeaders/' + (name.split('/').pop() || 'entry'), '', ext.length, 0o644, uid, gid, mtime, TYPE_PAX_NEXT, uname, gname));
|
|
236
|
+
blocks.push(ext);
|
|
237
|
+
const padN = pad512(ext.length) - ext.length;
|
|
238
|
+
if (padN)
|
|
239
|
+
blocks.push(new Uint8Array(padN));
|
|
240
|
+
}
|
|
241
|
+
blocks.push(buildHeader(name, linkname, data.length, mode, uid, gid, mtime, typeflagFor(type), uname, gname));
|
|
242
|
+
if (data.length > 0) {
|
|
243
|
+
blocks.push(data);
|
|
244
|
+
const padN = pad512(data.length) - data.length;
|
|
245
|
+
if (padN)
|
|
246
|
+
blocks.push(new Uint8Array(padN));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// Two trailing zero blocks mark end-of-archive.
|
|
250
|
+
blocks.push(new Uint8Array(BLOCK * 2));
|
|
251
|
+
return concat(blocks);
|
|
252
|
+
}
|
|
253
|
+
/** Parse the `key=value` records of a PAX extended header payload. */
|
|
254
|
+
function parsePax(payload) {
|
|
255
|
+
const records = {};
|
|
256
|
+
let i = 0;
|
|
257
|
+
while (i < payload.length) {
|
|
258
|
+
let j = i;
|
|
259
|
+
while (j < payload.length && payload[j] !== 0x20)
|
|
260
|
+
j++; // length prefix
|
|
261
|
+
const len = parseInt(strFromU8(payload.subarray(i, j)), 10);
|
|
262
|
+
if (!Number.isFinite(len) || len <= 0)
|
|
263
|
+
break;
|
|
264
|
+
const record = strFromU8(payload.subarray(i, i + len));
|
|
265
|
+
const eq = record.indexOf('=');
|
|
266
|
+
const space = record.indexOf(' ');
|
|
267
|
+
if (eq > space && space >= 0) {
|
|
268
|
+
records[record.slice(space + 1, eq)] = record.slice(eq + 1).replace(/\n$/, '');
|
|
269
|
+
}
|
|
270
|
+
i += len;
|
|
271
|
+
}
|
|
272
|
+
return records;
|
|
273
|
+
}
|
|
274
|
+
/** Map an on-disk typeflag to a normalized entry type. */
|
|
275
|
+
function typeFromFlag(flag, name) {
|
|
276
|
+
if (flag === TYPE_DIR || (flag === TYPE_FILE && name.endsWith('/')))
|
|
277
|
+
return 'directory';
|
|
278
|
+
if (flag === TYPE_SYMLINK)
|
|
279
|
+
return 'symlink';
|
|
280
|
+
return 'file';
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Read a tar archive into its entries. Synchronous and engine-free. Understands
|
|
284
|
+
* the ustar prefix/name split, GNU long-name/long-link records, and PAX
|
|
285
|
+
* extended headers (so it reads archives from the Unix `tar` CLI and Docker
|
|
286
|
+
* layers). Throws {@link ZipKitError} on a corrupt header checksum.
|
|
287
|
+
*/
|
|
288
|
+
export function untar(data) {
|
|
289
|
+
const entries = [];
|
|
290
|
+
let offset = 0;
|
|
291
|
+
// Overrides accumulated from preceding GNU/PAX meta headers.
|
|
292
|
+
let pendingPax = {};
|
|
293
|
+
let pendingName;
|
|
294
|
+
let pendingLink;
|
|
295
|
+
while (offset + BLOCK <= data.length) {
|
|
296
|
+
const header = data.subarray(offset, offset + BLOCK);
|
|
297
|
+
// A zero block signals (the first of two) end-of-archive markers.
|
|
298
|
+
if (isZeroBlock(header))
|
|
299
|
+
break;
|
|
300
|
+
const stored = readOctal(header, 148, 8);
|
|
301
|
+
if (stored !== (headerChecksum(header) & 0o777777) && stored !== headerChecksum(header)) {
|
|
302
|
+
throw new ZipKitError(`Corrupt tar header at offset ${offset} (checksum mismatch)`);
|
|
303
|
+
}
|
|
304
|
+
const flag = String.fromCharCode(header[156] || 0x30);
|
|
305
|
+
const size = pendingPax.size ? parseInt(pendingPax.size, 10) : readOctal(header, 124, 12);
|
|
306
|
+
const dataStart = offset + BLOCK;
|
|
307
|
+
const payload = data.subarray(dataStart, dataStart + size);
|
|
308
|
+
if (flag === TYPE_PAX_NEXT) {
|
|
309
|
+
pendingPax = { ...pendingPax, ...parsePax(payload) };
|
|
310
|
+
offset = dataStart + pad512(size);
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (flag === TYPE_PAX_GLOBAL) {
|
|
314
|
+
// Global headers apply to all following entries; merge but keep them.
|
|
315
|
+
pendingPax = { ...pendingPax, ...parsePax(payload) };
|
|
316
|
+
offset = dataStart + pad512(size);
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
if (flag === TYPE_GNU_LONGNAME) {
|
|
320
|
+
pendingName = strFromU8(payload).replace(/\0+$/, '');
|
|
321
|
+
offset = dataStart + pad512(size);
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
if (flag === TYPE_GNU_LONGLINK) {
|
|
325
|
+
pendingLink = strFromU8(payload).replace(/\0+$/, '');
|
|
326
|
+
offset = dataStart + pad512(size);
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
// A real entry: resolve name/linkname from any pending overrides.
|
|
330
|
+
const prefix = readStr(header, 345, 155);
|
|
331
|
+
const baseName = readStr(header, 0, 100);
|
|
332
|
+
let name = pendingPax.path ?? pendingName ?? (prefix ? `${prefix}/${baseName}` : baseName);
|
|
333
|
+
const type = typeFromFlag(flag, name);
|
|
334
|
+
if (type === 'directory' && !name.endsWith('/'))
|
|
335
|
+
name += '/';
|
|
336
|
+
entries.push({
|
|
337
|
+
name,
|
|
338
|
+
data: type === 'file' ? data.slice(dataStart, dataStart + size) : new Uint8Array(0),
|
|
339
|
+
type,
|
|
340
|
+
mode: readOctal(header, 100, 8) & 0o7777,
|
|
341
|
+
mtime: new Date((pendingPax.mtime ? parseFloat(pendingPax.mtime) : readOctal(header, 136, 12)) * 1000),
|
|
342
|
+
uid: pendingPax.uid ? parseInt(pendingPax.uid, 10) : readOctal(header, 108, 8),
|
|
343
|
+
gid: pendingPax.gid ? parseInt(pendingPax.gid, 10) : readOctal(header, 116, 8),
|
|
344
|
+
uname: pendingPax.uname ?? readStr(header, 265, 32),
|
|
345
|
+
gname: pendingPax.gname ?? readStr(header, 297, 32),
|
|
346
|
+
linkname: type === 'symlink' ? pendingPax.linkpath ?? pendingLink ?? readStr(header, 157, 100) : undefined,
|
|
347
|
+
size: type === 'file' ? size : 0
|
|
348
|
+
});
|
|
349
|
+
// Consume any pending overrides — they apply to one entry only.
|
|
350
|
+
pendingPax = {};
|
|
351
|
+
pendingName = undefined;
|
|
352
|
+
pendingLink = undefined;
|
|
353
|
+
offset = dataStart + (type === 'file' ? pad512(size) : 0);
|
|
354
|
+
}
|
|
355
|
+
return entries;
|
|
356
|
+
}
|
|
357
|
+
/** True when every byte in the block is zero. */
|
|
358
|
+
function isZeroBlock(block) {
|
|
359
|
+
for (let i = 0; i < block.length; i++)
|
|
360
|
+
if (block[i] !== 0)
|
|
361
|
+
return false;
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
/** Create a `.tar.gz` archive: {@link tar} then gzip. */
|
|
365
|
+
export async function tarGz(entries, opts) {
|
|
366
|
+
return gzip(tar(entries), opts);
|
|
367
|
+
}
|
|
368
|
+
/** Read a `.tar.gz` archive: gunzip then {@link untar}. */
|
|
369
|
+
export async function untarGz(data, opts) {
|
|
370
|
+
return untar(await gunzip(data, opts));
|
|
371
|
+
}
|
|
372
|
+
/** Create a `.tar.zst` archive: {@link tar} then zstd. */
|
|
373
|
+
export async function tarZstd(entries, opts) {
|
|
374
|
+
return zstd(tar(entries), opts);
|
|
375
|
+
}
|
|
376
|
+
/** Read a `.tar.zst` archive: unzstd then {@link untar}. */
|
|
377
|
+
export async function untarZstd(data, opts) {
|
|
378
|
+
return untar(await unzstd(data, opts));
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tar/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for ZipKit.
|
|
3
|
+
*
|
|
4
|
+
* Every public codec accepts and returns {@link Uint8Array}. String helpers
|
|
5
|
+
* live in `string.ts` (`strToU8` / `strFromU8`); they convert to/from bytes so
|
|
6
|
+
* the codec layer stays byte-only and predictable across runtimes.
|
|
7
|
+
*/
|
|
8
|
+
/** Bytes in, bytes out — the universal data shape for every codec. */
|
|
9
|
+
export type Bytes = Uint8Array;
|
|
10
|
+
/**
|
|
11
|
+
* Compression algorithms ZipKit can produce and consume. Each maps to a codec
|
|
12
|
+
* façade in `codecs/` and a method on {@link import('./zipkit.js').ZipKit}.
|
|
13
|
+
*/
|
|
14
|
+
export type Codec = 'gzip' | 'deflate' | 'zlib' | 'zstd' | 'lz4' | 'snappy' | 'brotli' | 'lzma' | 'bzip2';
|
|
15
|
+
/** A DEFLATE-family compression level, `0` (store) – `9` (max). */
|
|
16
|
+
export type DeflateLevel = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
|
|
17
|
+
/**
|
|
18
|
+
* High-level compression policy. `balanced` is the default: good speed, good
|
|
19
|
+
* ratio, standard output. `speed` favors latency/throughput; `ratio` favors
|
|
20
|
+
* smaller output.
|
|
21
|
+
*/
|
|
22
|
+
export type CompressionMode = 'speed' | 'balanced' | 'ratio';
|
|
23
|
+
/** Common options accepted by the high-level compress helpers. */
|
|
24
|
+
export interface CompressOptions {
|
|
25
|
+
/** Compression policy. Defaults to `'balanced'`. */
|
|
26
|
+
mode?: CompressionMode;
|
|
27
|
+
/**
|
|
28
|
+
* Compression level. Range depends on the codec — DEFLATE/gzip/zlib/lzma/
|
|
29
|
+
* bzip2 use 0–9, zstd uses 1–22, brotli uses 0–11. Out-of-range values are
|
|
30
|
+
* clamped to the codec's nearest supported level. When omitted, `mode`
|
|
31
|
+
* chooses a sensible codec-specific default.
|
|
32
|
+
*/
|
|
33
|
+
level?: number;
|
|
34
|
+
/** Abort an in-flight async operation. Honored by the async/worker APIs. */
|
|
35
|
+
signal?: AbortSignal;
|
|
36
|
+
/** Progress reporter, invoked as work proceeds (async/streaming paths). */
|
|
37
|
+
onProgress?: ProgressCallback;
|
|
38
|
+
}
|
|
39
|
+
/** Options accepted by the high-level decompress helpers. */
|
|
40
|
+
export interface DecompressOptions {
|
|
41
|
+
/** Abort an in-flight async operation. Honored by the async/worker APIs. */
|
|
42
|
+
signal?: AbortSignal;
|
|
43
|
+
/** Progress reporter, invoked as work proceeds (async/streaming paths). */
|
|
44
|
+
onProgress?: ProgressCallback;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Progress callback. `percent` is `0`–`1` where known (otherwise `-1`),
|
|
48
|
+
* `bytes` is the number of bytes processed so far.
|
|
49
|
+
*/
|
|
50
|
+
export type ProgressCallback = (percent: number, bytes: number) => void;
|
|
51
|
+
/** Thrown when an operation is aborted via an {@link AbortSignal}. */
|
|
52
|
+
export declare class AbortError extends Error {
|
|
53
|
+
constructor(message?: string);
|
|
54
|
+
}
|
|
55
|
+
/** Thrown when input bytes cannot be decoded by the requested/detected codec. */
|
|
56
|
+
export declare class ZipKitError extends Error {
|
|
57
|
+
constructor(message: string);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,sEAAsE;AACtE,MAAM,MAAM,KAAK,GAAG,UAAU,CAAC;AAE/B;;;GAGG;AACH,MAAM,MAAM,KAAK,GACd,MAAM,GACN,SAAS,GACT,MAAM,GACN,MAAM,GACN,KAAK,GACL,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,OAAO,CAAC;AAEX,mEAAmE;AACnE,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEjE;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AAE7D,kEAAkE;AAClE,MAAM,WAAW,eAAe;IAC/B,oDAAoD;IACpD,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IACjC,4EAA4E;IAC5E,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAExE,sEAAsE;AACtE,qBAAa,UAAW,SAAQ,KAAK;gBACxB,OAAO,SAA8B;CAIjD;AAED,iFAAiF;AACjF,qBAAa,WAAY,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI3B"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for ZipKit.
|
|
3
|
+
*
|
|
4
|
+
* Every public codec accepts and returns {@link Uint8Array}. String helpers
|
|
5
|
+
* live in `string.ts` (`strToU8` / `strFromU8`); they convert to/from bytes so
|
|
6
|
+
* the codec layer stays byte-only and predictable across runtimes.
|
|
7
|
+
*/
|
|
8
|
+
/** Thrown when an operation is aborted via an {@link AbortSignal}. */
|
|
9
|
+
export class AbortError extends Error {
|
|
10
|
+
constructor(message = 'The operation was aborted') {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'AbortError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** Thrown when input bytes cannot be decoded by the requested/detected codec. */
|
|
16
|
+
export class ZipKitError extends Error {
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = 'ZipKitError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA6DH,sEAAsE;AACtE,MAAM,OAAO,UAAW,SAAQ,KAAK;IACpC,YAAY,OAAO,GAAG,2BAA2B;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC1B,CAAC;CACD;AAED,iFAAiF;AACjF,MAAM,OAAO,WAAY,SAAQ,KAAK;IACrC,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC3B,CAAC;CACD"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A persistent, warm worker pool for non-blocking compression on Node and Bun.
|
|
3
|
+
*
|
|
4
|
+
* Spinning up a worker per call (and re-instantiating the 1.4 MB Wasm engine
|
|
5
|
+
* each time) is the cold-start tax fflate's async API pays. ZipKit keeps a
|
|
6
|
+
* fixed pool of workers, each with the engine already loaded, and round-robins
|
|
7
|
+
* jobs across them. Where workers aren't available (e.g. the browser without
|
|
8
|
+
* bundler support), it transparently falls back to running on the calling
|
|
9
|
+
* thread, so the API never breaks.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { WorkerPool } from '@myrialabs/zipkit/workers';
|
|
14
|
+
* const pool = new WorkerPool();
|
|
15
|
+
* const out = await pool.compress(bytes, 'zstd', { level: 19 });
|
|
16
|
+
* await pool.destroy();
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import type { Codec, CompressOptions, DecompressOptions } from '../types.js';
|
|
20
|
+
export interface WorkerPoolOptions {
|
|
21
|
+
/** Number of workers to spawn. Defaults to one per CPU core (max 8). */
|
|
22
|
+
size?: number;
|
|
23
|
+
}
|
|
24
|
+
export declare class WorkerPool {
|
|
25
|
+
private readonly size;
|
|
26
|
+
private workers;
|
|
27
|
+
private pending;
|
|
28
|
+
private next;
|
|
29
|
+
private seq;
|
|
30
|
+
private ready;
|
|
31
|
+
private usable;
|
|
32
|
+
/**
|
|
33
|
+
* Workers are `unref`'d at rest so an idle pool never blocks process exit.
|
|
34
|
+
* While any job is in flight we `ref` them, so a script whose last action is
|
|
35
|
+
* `await pool.compress(...)` doesn't exit before the result arrives.
|
|
36
|
+
*/
|
|
37
|
+
private refWhileBusy;
|
|
38
|
+
constructor(opts?: WorkerPoolOptions);
|
|
39
|
+
private ensure;
|
|
40
|
+
private settle;
|
|
41
|
+
private failAll;
|
|
42
|
+
private run;
|
|
43
|
+
/** Compress `data` with `codec` on a worker (or inline as a fallback). */
|
|
44
|
+
compress(data: Uint8Array, codec: Codec, opts?: CompressOptions): Promise<Uint8Array>;
|
|
45
|
+
/** Decompress `data` with `codec` on a worker (or inline as a fallback). */
|
|
46
|
+
decompress(data: Uint8Array, codec: Codec, opts?: DecompressOptions): Promise<Uint8Array>;
|
|
47
|
+
/**
|
|
48
|
+
* Compress a ZIP entry on a worker using the raw libdeflate / zstd engine —
|
|
49
|
+
* denser than the native path and byte-identical to the inline container
|
|
50
|
+
* code, so a parallel archive matches a single-threaded one exactly.
|
|
51
|
+
*/
|
|
52
|
+
zipCompress(data: Uint8Array, method: 'deflate' | 'zstd', level?: number): Promise<Uint8Array>;
|
|
53
|
+
/** Terminate all workers and reject any in-flight jobs. */
|
|
54
|
+
destroy(): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
/** A lazily-created, process-wide {@link WorkerPool}. */
|
|
57
|
+
export declare function sharedPool(): WorkerPool;
|
|
58
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAmB,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA6B9F,MAAM,WAAW,iBAAiB;IACjC,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,UAAU;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,MAAM,CAAQ;IAEtB;;;;OAIG;IACH,OAAO,CAAC,YAAY;gBAKR,IAAI,GAAE,iBAAsB;YAI1B,MAAM;IAoBpB,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,OAAO;YAMD,GAAG;IA4CjB,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAIrF,4EAA4E;IAC5E,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAIzF;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAI9F,2DAA2D;IACrD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAM9B;AAID,yDAAyD;AACzD,wBAAgB,UAAU,IAAI,UAAU,CAEvC"}
|