@wavehouse/chtypes 2.0.0-dev.1 → 2.0.0-dev.11
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/CHANGELOG.md +97 -0
- package/README.md +5 -1
- package/dist/abi2/buildinfo.d.ts +1 -1
- package/dist/abi2/buildinfo.js +3 -3
- package/dist/abi2/buildinfo.js.map +1 -1
- package/dist/abi2/calls.gen.d.ts +5 -5
- package/dist/abi2/calls.gen.d.ts.map +1 -1
- package/dist/abi2/calls.gen.js +11 -11
- package/dist/abi2/calls.gen.js.map +1 -1
- package/dist/abi2/decls.gen.d.ts +2 -1
- package/dist/abi2/decls.gen.d.ts.map +1 -1
- package/dist/abi2/decls.gen.js +78 -20
- package/dist/abi2/decls.gen.js.map +1 -1
- package/dist/abi2/errmap.gen.js +1 -1
- package/dist/abi2/errors.d.ts +21 -40
- package/dist/abi2/errors.d.ts.map +1 -1
- package/dist/abi2/errors.js +20 -44
- package/dist/abi2/errors.js.map +1 -1
- package/dist/abi2/index.d.ts +2 -2
- package/dist/abi2/index.d.ts.map +1 -1
- package/dist/abi2/index.js +1 -1
- package/dist/abi2/index.js.map +1 -1
- package/dist/abi2/libc.gen.d.ts +2 -0
- package/dist/abi2/libc.gen.d.ts.map +1 -1
- package/dist/abi2/libc.gen.js +11 -1
- package/dist/abi2/libc.gen.js.map +1 -1
- package/dist/abi2/loader.d.ts +4 -2
- package/dist/abi2/loader.d.ts.map +1 -1
- package/dist/abi2/loader.js +2 -2
- package/dist/abi2/loader.js.map +1 -1
- package/dist/abi2/raw.d.ts.map +1 -1
- package/dist/abi2/raw.js +4 -1
- package/dist/abi2/raw.js.map +1 -1
- package/dist/abi2/vocab.gen.d.ts +90 -1
- package/dist/abi2/vocab.gen.d.ts.map +1 -1
- package/dist/abi2/vocab.gen.js +144 -4
- package/dist/abi2/vocab.gen.js.map +1 -1
- package/dist/cli.d.ts +11 -5
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +130 -20
- package/dist/cli.js.map +1 -1
- package/dist/documents.d.ts +100 -7
- package/dist/documents.d.ts.map +1 -1
- package/dist/documents.js +135 -8
- package/dist/documents.js.map +1 -1
- package/dist/env.d.ts +8 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +17 -8
- package/dist/env.js.map +1 -1
- package/dist/index.d.ts +10 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/dist/library.d.ts +13 -2
- package/dist/library.d.ts.map +1 -1
- package/dist/library.js +24 -5
- package/dist/library.js.map +1 -1
- package/dist/ocifetch/channel.d.ts +84 -0
- package/dist/ocifetch/channel.d.ts.map +1 -1
- package/dist/ocifetch/channel.js +157 -2
- package/dist/ocifetch/channel.js.map +1 -1
- package/dist/ocifetch/constants.gen.d.ts +28 -0
- package/dist/ocifetch/constants.gen.d.ts.map +1 -1
- package/dist/ocifetch/constants.gen.js +30 -1
- package/dist/ocifetch/constants.gen.js.map +1 -1
- package/dist/ocifetch/dsse.d.ts +5 -1
- package/dist/ocifetch/dsse.d.ts.map +1 -1
- package/dist/ocifetch/dsse.js +10 -3
- package/dist/ocifetch/dsse.js.map +1 -1
- package/dist/ocifetch/ensure.d.ts +68 -8
- package/dist/ocifetch/ensure.d.ts.map +1 -1
- package/dist/ocifetch/ensure.js +305 -66
- package/dist/ocifetch/ensure.js.map +1 -1
- package/dist/ocifetch/errors.d.ts +101 -25
- package/dist/ocifetch/errors.d.ts.map +1 -1
- package/dist/ocifetch/errors.js +74 -36
- package/dist/ocifetch/errors.js.map +1 -1
- package/dist/ocifetch/hold.d.ts +66 -0
- package/dist/ocifetch/hold.d.ts.map +1 -0
- package/dist/ocifetch/hold.js +150 -0
- package/dist/ocifetch/hold.js.map +1 -0
- package/dist/ocifetch/http.d.ts +10 -2
- package/dist/ocifetch/http.d.ts.map +1 -1
- package/dist/ocifetch/http.js +31 -12
- package/dist/ocifetch/http.js.map +1 -1
- package/dist/ocifetch/index.d.ts +10 -5
- package/dist/ocifetch/index.d.ts.map +1 -1
- package/dist/ocifetch/index.js +8 -3
- package/dist/ocifetch/index.js.map +1 -1
- package/dist/ocifetch/localverify.d.ts +3 -1
- package/dist/ocifetch/localverify.d.ts.map +1 -1
- package/dist/ocifetch/localverify.js +6 -1
- package/dist/ocifetch/localverify.js.map +1 -1
- package/dist/ocifetch/lock.d.ts +2 -1
- package/dist/ocifetch/lock.d.ts.map +1 -1
- package/dist/ocifetch/lock.js +7 -5
- package/dist/ocifetch/lock.js.map +1 -1
- package/dist/ocifetch/oci.d.ts +45 -3
- package/dist/ocifetch/oci.d.ts.map +1 -1
- package/dist/ocifetch/oci.js +125 -58
- package/dist/ocifetch/oci.js.map +1 -1
- package/dist/ocifetch/prune.d.ts +48 -0
- package/dist/ocifetch/prune.d.ts.map +1 -0
- package/dist/ocifetch/prune.js +383 -0
- package/dist/ocifetch/prune.js.map +1 -0
- package/dist/ocifetch/referrers.d.ts +24 -0
- package/dist/ocifetch/referrers.d.ts.map +1 -1
- package/dist/ocifetch/referrers.js +92 -5
- package/dist/ocifetch/referrers.js.map +1 -1
- package/dist/ocifetch/resolve.d.ts +37 -0
- package/dist/ocifetch/resolve.d.ts.map +1 -0
- package/dist/ocifetch/resolve.js +90 -0
- package/dist/ocifetch/resolve.js.map +1 -0
- package/dist/ocifetch/retired.d.ts +61 -0
- package/dist/ocifetch/retired.d.ts.map +1 -0
- package/dist/ocifetch/retired.js +236 -0
- package/dist/ocifetch/retired.js.map +1 -0
- package/dist/ocifetch/revocation.d.ts +151 -0
- package/dist/ocifetch/revocation.d.ts.map +1 -0
- package/dist/ocifetch/revocation.js +481 -0
- package/dist/ocifetch/revocation.js.map +1 -0
- package/dist/ocifetch/types.d.ts +18 -2
- package/dist/ocifetch/types.d.ts.map +1 -1
- package/dist/ocifetch/types.js.map +1 -1
- package/dist/registry.d.ts +80 -3
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +168 -9
- package/dist/registry.js.map +1 -1
- package/dist/schema.d.ts +52 -9
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +6 -6
- package/dist/schema.js.map +1 -1
- package/dist/server.d.ts +27 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +35 -0
- package/dist/server.js.map +1 -0
- package/dist/settings.d.ts +101 -9
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +201 -27
- package/dist/settings.js.map +1 -1
- package/dist/setup.d.ts +3 -2
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +2 -3
- package/dist/setup.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chtypes prune` (`docs/guides/fetch-v1.md` §1, "Pruning"; public issue
|
|
3
|
+
* #494): remove the installed builds of a line that newer installed builds of
|
|
4
|
+
* the same line and platform supersede, keeping the newest N, and never one a
|
|
5
|
+
* live process holds (`./hold.ts`). It reads and writes the cache only, never
|
|
6
|
+
* a system directory, and never another fingerprint's records (§3: the dev
|
|
7
|
+
* channel's own-fingerprint rule).
|
|
8
|
+
*/
|
|
9
|
+
import { randomBytes } from 'node:crypto';
|
|
10
|
+
import { mkdirSync, renameSync, rmdirSync } from 'node:fs';
|
|
11
|
+
import { lstat, readdir, readFile, rename, rm, unlink, writeFile } from 'node:fs/promises';
|
|
12
|
+
import path from 'node:path';
|
|
13
|
+
import { noteIgnoredOverrides, visibleToChannel } from './channel.js';
|
|
14
|
+
import { CACHE_UNPACKED_DIR, MANIFEST_MAX_BYTES, PLATFORMS } from './constants.gen.js';
|
|
15
|
+
import { probeRoots, strictMode, unwritable } from './faults.js';
|
|
16
|
+
import { claim } from './hold.js';
|
|
17
|
+
import { blobsDir, cacheRoot, listVerified } from './layout.js';
|
|
18
|
+
import { hexOfDigest } from './types.js';
|
|
19
|
+
/** A two-part line spelling, `26.8`. */
|
|
20
|
+
const LINE = /^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$/;
|
|
21
|
+
const HEX64 = /^[0-9a-f]{64}$/;
|
|
22
|
+
const DIGEST = /^sha256:[0-9a-f]{64}$/;
|
|
23
|
+
/** How many times a fresh aside directory, or an `index.json` rewrite, is tried before the failure stands. */
|
|
24
|
+
const ATTEMPTS = 8;
|
|
25
|
+
/** Whether `s` is a two-part line spelling, such as `26.8`. */
|
|
26
|
+
export function isLine(s) {
|
|
27
|
+
return LINE.test(s);
|
|
28
|
+
}
|
|
29
|
+
/** The two-part line of a version: `26.8` for `26.8.15.10`, or `''` for anything shorter. */
|
|
30
|
+
export function lineOf(version) {
|
|
31
|
+
const parts = version.split('.');
|
|
32
|
+
return parts.length < 2 ? '' : parts.slice(0, 2).join('.');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Removes, from the cache, every installed build that at least `keep` newer
|
|
36
|
+
* installed builds of its own line and platform supersede, oldest first.
|
|
37
|
+
* Builds are ordered by (version, build), then the manifest digest, and the
|
|
38
|
+
* report by platform (the constants' order), then oldest first. A superseded
|
|
39
|
+
* build a live process holds is reported `inUse` and kept. For each build it
|
|
40
|
+
* removes the unpacked entry with its record, then its `index.json` entries,
|
|
41
|
+
* then its blobs (the manifest, its config and layer, and every referrer
|
|
42
|
+
* manifest of it the layout holds, with that referrer's layers), never a blob
|
|
43
|
+
* a remaining build names. A `keep` below 1 or a `line` that is not a two-part
|
|
44
|
+
* line is the caller's misuse. A write that fails under the cache is a
|
|
45
|
+
* `CacheUnusableError` (reason `unwritable`).
|
|
46
|
+
*/
|
|
47
|
+
export async function prune(options, request) {
|
|
48
|
+
if (!Number.isInteger(request.keep) || request.keep < 1) {
|
|
49
|
+
throw new RangeError(`chtypes: --keep is at least 1 (the newest build of a line is never superseded), not ${request.keep}`);
|
|
50
|
+
}
|
|
51
|
+
const line = request.line ?? '';
|
|
52
|
+
if (line !== '' && !isLine(line)) {
|
|
53
|
+
throw new RangeError(`chtypes: --line takes a two-part line such as 26.8, not ${JSON.stringify(line)}`);
|
|
54
|
+
}
|
|
55
|
+
noteIgnoredOverrides(options);
|
|
56
|
+
const root = cacheRoot(options.cacheDir);
|
|
57
|
+
try {
|
|
58
|
+
return await pruneIn(root, options, line, request.keep, request.dryRun === true);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
throw await unwritable(err, root);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function pruneIn(root, options, line, keep, dryRun) {
|
|
65
|
+
// Only the cache is pruned: a system directory is read-only. An unreadable
|
|
66
|
+
// cache holds nothing this call can prune; the default mode's warning names
|
|
67
|
+
// it (`missingNotes`), and strict mode's `CacheUnusableError` is thrown here.
|
|
68
|
+
await probeRoots([root], strictMode(options.strictCache));
|
|
69
|
+
const groups = new Map();
|
|
70
|
+
for (const { dir, record } of await listVerified(root)) {
|
|
71
|
+
// Another fingerprint's build: its own SDK keeps or prunes it.
|
|
72
|
+
if (!visibleToChannel(record.predicate))
|
|
73
|
+
continue;
|
|
74
|
+
const entryLine = lineOf(record.version);
|
|
75
|
+
if (line !== '' && entryLine !== line)
|
|
76
|
+
continue;
|
|
77
|
+
const key = `${record.platform} ${entryLine}`;
|
|
78
|
+
const entry = { dir, record, manifest: entryManifest(dir) };
|
|
79
|
+
const group = groups.get(key);
|
|
80
|
+
if (group === undefined)
|
|
81
|
+
groups.set(key, [entry]);
|
|
82
|
+
else
|
|
83
|
+
group.push(entry);
|
|
84
|
+
}
|
|
85
|
+
const superseded = [];
|
|
86
|
+
for (const members of groups.values()) {
|
|
87
|
+
members.sort((a, b) => compareAge(b, a)); // newest first
|
|
88
|
+
superseded.push(...members.slice(keep));
|
|
89
|
+
}
|
|
90
|
+
superseded.sort((a, b) => platformRank(a.record.platform) - platformRank(b.record.platform) || compareAge(a, b));
|
|
91
|
+
const unpackedRoot = path.join(root, CACHE_UNPACKED_DIR);
|
|
92
|
+
const out = [];
|
|
93
|
+
const removed = [];
|
|
94
|
+
for (const e of superseded) {
|
|
95
|
+
const s = {
|
|
96
|
+
platform: e.record.platform,
|
|
97
|
+
version: e.record.version,
|
|
98
|
+
build: e.record.build,
|
|
99
|
+
manifest: e.manifest,
|
|
100
|
+
dir: e.dir,
|
|
101
|
+
};
|
|
102
|
+
const claimed = claim(e.dir);
|
|
103
|
+
if (claimed.state === 'gone')
|
|
104
|
+
continue; // another prune removed it, or an install replaced it
|
|
105
|
+
if (claimed.state === 'in-use') {
|
|
106
|
+
out.push({ ...s, inUse: true });
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (dryRun) {
|
|
110
|
+
claimed.release();
|
|
111
|
+
out.push({ ...s, inUse: false });
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
// Moved aside while the exclusive lock is held, synchronously, so nothing
|
|
115
|
+
// else in this process runs meanwhile: once the lock drops, no lookup
|
|
116
|
+
// lists the entry, and a hold taken on it finds it gone.
|
|
117
|
+
const aside = releasing(claimed.release, () => moveAside(unpackedRoot, e.dir));
|
|
118
|
+
removed.push({ entry: e, aside });
|
|
119
|
+
out.push({ ...s, inUse: false });
|
|
120
|
+
}
|
|
121
|
+
if (removed.length === 0)
|
|
122
|
+
return out;
|
|
123
|
+
const blobs = await blobsOf(root, new Set(removed.map((r) => r.entry.manifest)));
|
|
124
|
+
for (const { entry } of removed) {
|
|
125
|
+
for (const d of [entry.record.layerDigest, entry.record.bundleDigest, entry.record.bundleManifestDigest]) {
|
|
126
|
+
if (d !== null && DIGEST.test(d))
|
|
127
|
+
blobs.add(d);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Never a blob a remaining build names, whatever its fingerprint.
|
|
131
|
+
for (const { dir, record } of await listVerified(root)) {
|
|
132
|
+
const named = [...(await ownBlobs(root, entryManifest(dir))), record.manifestDigest, record.layerDigest, record.bundleDigest, record.bundleManifestDigest];
|
|
133
|
+
for (const d of named)
|
|
134
|
+
if (d !== null)
|
|
135
|
+
blobs.delete(d);
|
|
136
|
+
}
|
|
137
|
+
await removeIndexEntries(root, blobs);
|
|
138
|
+
for (const d of blobs) {
|
|
139
|
+
try {
|
|
140
|
+
await unlink(path.join(blobsDir(root), hexOfDigest(d)));
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
if (err.code !== 'ENOENT')
|
|
144
|
+
throw err;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
for (const { aside } of removed)
|
|
148
|
+
await rm(aside, { recursive: true, force: true });
|
|
149
|
+
return out;
|
|
150
|
+
}
|
|
151
|
+
/** `f()`, then `release()` however `f` ended. */
|
|
152
|
+
function releasing(release, f) {
|
|
153
|
+
try {
|
|
154
|
+
return f();
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
release();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/** Renames the entry `dir` into a fresh `unpacked/sha256/.prune-<random>` directory, as `entry`, and returns that directory. */
|
|
161
|
+
function moveAside(unpackedRoot, dir) {
|
|
162
|
+
const aside = freshPruneDir(unpackedRoot);
|
|
163
|
+
try {
|
|
164
|
+
renameSync(dir, path.join(aside, 'entry'));
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
try {
|
|
168
|
+
rmdirSync(aside);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// Left empty beside the entries; no lookup reads a `.prune-` name.
|
|
172
|
+
}
|
|
173
|
+
throw err;
|
|
174
|
+
}
|
|
175
|
+
return aside;
|
|
176
|
+
}
|
|
177
|
+
/** A fresh, empty `.prune-<random>` directory under `unpackedRoot` (mode 0777 less the umask), its random bits this process's own. */
|
|
178
|
+
function freshPruneDir(unpackedRoot) {
|
|
179
|
+
for (let attempt = 1;; attempt++) {
|
|
180
|
+
const dir = path.join(unpackedRoot, `.prune-${process.pid}-${randomBytes(6).toString('hex')}`);
|
|
181
|
+
try {
|
|
182
|
+
mkdirSync(dir, { mode: 0o777 });
|
|
183
|
+
return dir;
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
if (err.code !== 'EEXIST' || attempt >= ATTEMPTS)
|
|
187
|
+
throw err;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/** An installed entry's own manifest digest: its directory's name. */
|
|
192
|
+
function entryManifest(dir) {
|
|
193
|
+
return `sha256:${path.basename(dir)}`;
|
|
194
|
+
}
|
|
195
|
+
/** Orders installed builds by age: (version, numerically, part by part), then the build, then the manifest digest, so the order is total. */
|
|
196
|
+
function compareAge(a, b) {
|
|
197
|
+
if (a.record.version !== b.record.version) {
|
|
198
|
+
const av = a.record.version.split('.');
|
|
199
|
+
const bv = b.record.version.split('.');
|
|
200
|
+
for (let i = 0; i < Math.min(av.length, bv.length); i++) {
|
|
201
|
+
if (av[i] !== bv[i])
|
|
202
|
+
return Number(av[i]) - Number(bv[i]);
|
|
203
|
+
}
|
|
204
|
+
return av.length - bv.length;
|
|
205
|
+
}
|
|
206
|
+
if (a.record.build !== b.record.build)
|
|
207
|
+
return a.record.build < b.record.build ? -1 : 1;
|
|
208
|
+
if (a.manifest !== b.manifest)
|
|
209
|
+
return a.manifest < b.manifest ? -1 : 1;
|
|
210
|
+
return 0;
|
|
211
|
+
}
|
|
212
|
+
/** A platform key's place in the constants' platform list. */
|
|
213
|
+
function platformRank(key) {
|
|
214
|
+
const i = PLATFORMS.findIndex((p) => p.key === key);
|
|
215
|
+
return i < 0 ? PLATFORMS.length : i;
|
|
216
|
+
}
|
|
217
|
+
function isObject(v) {
|
|
218
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
219
|
+
}
|
|
220
|
+
/** A descriptor member's digest: `''` when absent or null, `undefined` when the member is not a descriptor. */
|
|
221
|
+
function descriptorDigest(v) {
|
|
222
|
+
if (v === undefined || v === null)
|
|
223
|
+
return '';
|
|
224
|
+
if (!isObject(v))
|
|
225
|
+
return undefined;
|
|
226
|
+
const digest = v['digest'];
|
|
227
|
+
if (digest === undefined || digest === null)
|
|
228
|
+
return '';
|
|
229
|
+
return typeof digest === 'string' ? digest : undefined;
|
|
230
|
+
}
|
|
231
|
+
/** A manifest blob's descriptors, or `undefined` for bytes that are not one (not JSON, not an object, or a descriptor member of the wrong shape). */
|
|
232
|
+
function manifestDoc(bytes) {
|
|
233
|
+
let doc;
|
|
234
|
+
try {
|
|
235
|
+
doc = JSON.parse(bytes.toString('utf8'));
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
return undefined;
|
|
239
|
+
}
|
|
240
|
+
if (!isObject(doc))
|
|
241
|
+
return undefined;
|
|
242
|
+
const config = descriptorDigest(doc['config']);
|
|
243
|
+
const subject = descriptorDigest(doc['subject']);
|
|
244
|
+
if (config === undefined || subject === undefined)
|
|
245
|
+
return undefined;
|
|
246
|
+
const rawLayers = doc['layers'];
|
|
247
|
+
const layers = [];
|
|
248
|
+
if (rawLayers !== undefined && rawLayers !== null) {
|
|
249
|
+
if (!Array.isArray(rawLayers))
|
|
250
|
+
return undefined;
|
|
251
|
+
for (const layer of rawLayers) {
|
|
252
|
+
const digest = descriptorDigest(layer);
|
|
253
|
+
if (digest === undefined)
|
|
254
|
+
return undefined;
|
|
255
|
+
if (DIGEST.test(digest))
|
|
256
|
+
layers.push(digest);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
config: DIGEST.test(config) ? config : undefined,
|
|
261
|
+
layers,
|
|
262
|
+
subject: subject === '' ? undefined : subject,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/** The blobs a manifest names itself: the manifest, its config and its layers (only the manifest when its blob is absent or unreadable). */
|
|
266
|
+
async function ownBlobs(root, manifest) {
|
|
267
|
+
const out = [manifest];
|
|
268
|
+
let bytes;
|
|
269
|
+
try {
|
|
270
|
+
bytes = await readFile(path.join(blobsDir(root), hexOfDigest(manifest)));
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
return out;
|
|
274
|
+
}
|
|
275
|
+
const doc = manifestDoc(bytes);
|
|
276
|
+
if (doc === undefined)
|
|
277
|
+
return out;
|
|
278
|
+
if (doc.config !== undefined)
|
|
279
|
+
out.push(doc.config);
|
|
280
|
+
out.push(...doc.layers);
|
|
281
|
+
return out;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* The blobs a prune removes with `manifests`: each one's own (`ownBlobs`), and
|
|
285
|
+
* every referrer manifest the layout holds whose subject is one of them (a
|
|
286
|
+
* signature, a goldens document), with that referrer's layers. A referrer's
|
|
287
|
+
* config, the empty `{}` every referrer shares, is never among them.
|
|
288
|
+
*/
|
|
289
|
+
async function blobsOf(root, manifests) {
|
|
290
|
+
const out = new Set();
|
|
291
|
+
for (const d of manifests)
|
|
292
|
+
for (const x of await ownBlobs(root, d))
|
|
293
|
+
out.add(x);
|
|
294
|
+
const dir = blobsDir(root);
|
|
295
|
+
const names = await readdir(dir, { withFileTypes: true }).catch(() => undefined);
|
|
296
|
+
if (names === undefined)
|
|
297
|
+
return out;
|
|
298
|
+
for (const e of names) {
|
|
299
|
+
if (e.isDirectory() || !HEX64.test(e.name))
|
|
300
|
+
continue;
|
|
301
|
+
const file = path.join(dir, e.name);
|
|
302
|
+
let bytes;
|
|
303
|
+
try {
|
|
304
|
+
if ((await lstat(file)).size > MANIFEST_MAX_BYTES)
|
|
305
|
+
continue;
|
|
306
|
+
bytes = await readFile(file);
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
const doc = manifestDoc(bytes);
|
|
312
|
+
if (doc === undefined || doc.subject === undefined || !manifests.has(doc.subject))
|
|
313
|
+
continue;
|
|
314
|
+
out.add(`sha256:${e.name}`);
|
|
315
|
+
for (const layer of doc.layers)
|
|
316
|
+
out.add(layer);
|
|
317
|
+
}
|
|
318
|
+
return out;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Drops every `index.json` entry whose digest is in `drop`, by the same
|
|
322
|
+
* read, write-temp, re-read, rename loop `upsertIndexEntry` uses, so an entry
|
|
323
|
+
* another process adds meanwhile survives; the other entries keep their order.
|
|
324
|
+
* An absent or unparsable `index.json` is left as it is.
|
|
325
|
+
*/
|
|
326
|
+
async function removeIndexEntries(root, drop) {
|
|
327
|
+
const indexPath = path.join(root, 'index.json');
|
|
328
|
+
for (let attempt = 0; attempt < ATTEMPTS; attempt++) {
|
|
329
|
+
let before;
|
|
330
|
+
try {
|
|
331
|
+
before = await readFile(indexPath, 'utf8');
|
|
332
|
+
}
|
|
333
|
+
catch (err) {
|
|
334
|
+
if (err.code === 'ENOENT')
|
|
335
|
+
return;
|
|
336
|
+
throw err;
|
|
337
|
+
}
|
|
338
|
+
let doc;
|
|
339
|
+
try {
|
|
340
|
+
doc = JSON.parse(before);
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
if (!isObject(doc))
|
|
346
|
+
return;
|
|
347
|
+
const manifests = doc['manifests'];
|
|
348
|
+
if (!Array.isArray(manifests))
|
|
349
|
+
return;
|
|
350
|
+
const kept = manifests.filter((m) => {
|
|
351
|
+
if (!isObject(m))
|
|
352
|
+
return true;
|
|
353
|
+
const digest = m['digest'];
|
|
354
|
+
return typeof digest !== 'string' || !drop.has(digest);
|
|
355
|
+
});
|
|
356
|
+
if (kept.length === manifests.length)
|
|
357
|
+
return;
|
|
358
|
+
const tmp = `${indexPath}.tmp-${process.pid}-${randomBytes(6).toString('hex')}`;
|
|
359
|
+
await writeFile(tmp, JSON.stringify({ ...doc, manifests: kept }));
|
|
360
|
+
let current;
|
|
361
|
+
try {
|
|
362
|
+
current = await readFile(indexPath, 'utf8');
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
current = undefined;
|
|
366
|
+
}
|
|
367
|
+
if (current !== before) {
|
|
368
|
+
// Another process wrote it meanwhile: drop from theirs.
|
|
369
|
+
await unlink(tmp).catch(() => { });
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
try {
|
|
373
|
+
await rename(tmp, indexPath);
|
|
374
|
+
}
|
|
375
|
+
catch (err) {
|
|
376
|
+
await unlink(tmp).catch(() => { });
|
|
377
|
+
throw err;
|
|
378
|
+
}
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
throw new Error(`chtypes: index.json at ${indexPath} would not settle after ${ATTEMPTS} attempts (sustained concurrent writers)`);
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=prune.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune.js","sourceRoot":"","sources":["../../src/ocifetch/prune.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,4 +52,28 @@ export declare function discoverFallbackTag(repositoryRoot: string, digest: stri
|
|
|
52
52
|
* Go, Python and Rust.
|
|
53
53
|
*/
|
|
54
54
|
export declare function discoverSignatureCandidates(repositoryRoot: string, digest: string, artifactType: string, options: RequestOptions): Promise<ReferrerDescriptor[]>;
|
|
55
|
+
/**
|
|
56
|
+
* One platform manifest's referrers listing (guide, "Build-level revocation",
|
|
57
|
+
* "The listing"): the first answer that names a signature referrer (the
|
|
58
|
+
* referrers API on the bases in order, then the fallback tag), its signature and
|
|
59
|
+
* revocation referrers, and, when no answer named a signature, the last failure
|
|
60
|
+
* that kept a base from answering (`undefined` when every base answered 404 or a
|
|
61
|
+
* listing without one).
|
|
62
|
+
*/
|
|
63
|
+
export interface ReferrerListing {
|
|
64
|
+
readonly found: boolean;
|
|
65
|
+
readonly signatures: readonly ReferrerDescriptor[];
|
|
66
|
+
readonly revocations: readonly ReferrerDescriptor[];
|
|
67
|
+
readonly failure: Error | undefined;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* `subject`'s listing exactly as the signature lookup reads it (guide §4): the
|
|
71
|
+
* referrers API, unfiltered (the artifactType filter is this function's own), on
|
|
72
|
+
* `bases` in order, and, when no answer of it names a signature referrer, the
|
|
73
|
+
* `sha256-<hex>` fallback tag on `bases` in order. The listing that names a
|
|
74
|
+
* signature referrer is the one read; one that names none is not a real listing
|
|
75
|
+
* of this manifest. `options.single` makes one attempt per request with no
|
|
76
|
+
* backoff: the installed-build check's budget. Its only error is a 410's.
|
|
77
|
+
*/
|
|
78
|
+
export declare function readListing(bases: readonly string[], subject: string, options: RequestOptions): Promise<ReferrerListing>;
|
|
55
79
|
//# sourceMappingURL=referrers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referrers.d.ts","sourceRoot":"","sources":["../../src/ocifetch/referrers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,EAAE,KAAK,cAAc,EAAgC,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"referrers.d.ts","sourceRoot":"","sources":["../../src/ocifetch/referrers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,EAAE,KAAK,cAAc,EAAgC,MAAM,WAAW,CAAC;AAI9E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,0FAA0F;AAC1F,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMrD;AAkDD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAkB/B;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAM/B;AAED;;;;;;;GAOG;AACH,wBAAsB,2BAA2B,CAC/C,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAI/B;AAID;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACnD,QAAQ,CAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,KAAK,GAAG,SAAS,CAAC;CACrC;AAMD;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CA+D9H"}
|
|
@@ -18,9 +18,10 @@
|
|
|
18
18
|
* `oci.ts`'s `retryOn404`).
|
|
19
19
|
*/
|
|
20
20
|
import { asString, field, items, parseJsonValue } from '../json.js';
|
|
21
|
-
import { MANIFEST_MAX_BYTES, MAX_REFERRERS } from './constants.gen.js';
|
|
22
|
-
import { ArtifactCorruptError } from './errors.js';
|
|
21
|
+
import { MANIFEST_MAX_BYTES, MAX_REFERRERS, MEDIA_TYPE_BUNDLE, REVOCATION_ARTIFACT_TYPE } from './constants.gen.js';
|
|
22
|
+
import { ArtifactCorruptError, SourceForbiddenError, SourceUnauthorizedError, SourceUnreachableError } from './errors.js';
|
|
23
23
|
import { readFileUrl, requestBuffered } from './http.js';
|
|
24
|
+
import { isGone } from './retired.js';
|
|
24
25
|
import { endpointUrl, MANIFEST_ACCEPT_HEADER } from './types.js';
|
|
25
26
|
/** The fallback tag schema name for a digest, e.g. `sha256:ab12..` -> `sha256-ab12..`. */
|
|
26
27
|
export function fallbackTagFor(digest) {
|
|
@@ -45,13 +46,13 @@ async function getJson(url, maxBytes, options, extraHeaders) {
|
|
|
45
46
|
throw new ArtifactCorruptError(`chtypes: ${url} did not return valid JSON`);
|
|
46
47
|
return { status: res.status, json };
|
|
47
48
|
}
|
|
48
|
-
function descriptorsFromIndex(json) {
|
|
49
|
+
function descriptorsFromIndex(json, cap = true) {
|
|
49
50
|
// A host may omit the index's own `mediaType`; the `manifests` array is
|
|
50
51
|
// read either way, so this is not itself a shape check (`oci.ts` checks
|
|
51
52
|
// media types where their presence is load-bearing).
|
|
52
53
|
const manifests = items(field(json, 'manifests'));
|
|
53
54
|
const out = [];
|
|
54
|
-
for (const m of manifests.slice(0, MAX_REFERRERS)) {
|
|
55
|
+
for (const m of cap ? manifests.slice(0, MAX_REFERRERS) : manifests) {
|
|
55
56
|
const digest = asString(field(m, 'digest'));
|
|
56
57
|
const descMediaType = asString(field(m, 'mediaType'));
|
|
57
58
|
const artifactTypeField = field(m, 'artifactType');
|
|
@@ -94,7 +95,11 @@ export async function discoverReferrers(repositoryRoot, digest, artifactType, op
|
|
|
94
95
|
}
|
|
95
96
|
}
|
|
96
97
|
}
|
|
97
|
-
catch {
|
|
98
|
+
catch (err) {
|
|
99
|
+
// A retired repository (a 410, guide §2) is permanent: never read as "no
|
|
100
|
+
// candidates here", and never a reason to try the fallback tag.
|
|
101
|
+
if (isGone(err))
|
|
102
|
+
throw err;
|
|
98
103
|
// The referrers API is not guaranteed on every host (mirrors) — read as
|
|
99
104
|
// "no candidates here", exactly as an empty or goldens-only answer would.
|
|
100
105
|
}
|
|
@@ -129,4 +134,86 @@ export async function discoverSignatureCandidates(repositoryRoot, digest, artifa
|
|
|
129
134
|
return fromApi;
|
|
130
135
|
return discoverFallbackTag(repositoryRoot, digest, artifactType, options);
|
|
131
136
|
}
|
|
137
|
+
function capReferrers(d) {
|
|
138
|
+
return d.length > MAX_REFERRERS ? d.slice(0, MAX_REFERRERS) : d;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* `subject`'s listing exactly as the signature lookup reads it (guide §4): the
|
|
142
|
+
* referrers API, unfiltered (the artifactType filter is this function's own), on
|
|
143
|
+
* `bases` in order, and, when no answer of it names a signature referrer, the
|
|
144
|
+
* `sha256-<hex>` fallback tag on `bases` in order. The listing that names a
|
|
145
|
+
* signature referrer is the one read; one that names none is not a real listing
|
|
146
|
+
* of this manifest. `options.single` makes one attempt per request with no
|
|
147
|
+
* backoff: the installed-build check's budget. Its only error is a 410's.
|
|
148
|
+
*/
|
|
149
|
+
export async function readListing(bases, subject, options) {
|
|
150
|
+
let failure;
|
|
151
|
+
const steps = [
|
|
152
|
+
// The referrers API is not a manifests/<ref> GET, so it sends no Accept.
|
|
153
|
+
{ suffix: `/referrers/${subject}`, accept: undefined },
|
|
154
|
+
{ suffix: `/manifests/${fallbackTagFor(subject)}`, accept: MANIFEST_ACCEPT_HEADER },
|
|
155
|
+
];
|
|
156
|
+
for (const step of steps) {
|
|
157
|
+
let json;
|
|
158
|
+
for (const base of bases) {
|
|
159
|
+
let url;
|
|
160
|
+
try {
|
|
161
|
+
url = endpointUrl(base, step.suffix);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
let res;
|
|
167
|
+
try {
|
|
168
|
+
res = url.startsWith('file:')
|
|
169
|
+
? await readFileUrl(url, MANIFEST_MAX_BYTES)
|
|
170
|
+
: await requestBuffered(url, {
|
|
171
|
+
...options,
|
|
172
|
+
maxBytes: MANIFEST_MAX_BYTES,
|
|
173
|
+
headers: { ...options.headers, ...(step.accept !== undefined ? { accept: step.accept } : {}) },
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
if (isGone(err))
|
|
178
|
+
throw err;
|
|
179
|
+
failure = err instanceof Error ? err : new SourceUnreachableError(`chtypes: ${url}: ${String(err)}`);
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (res.status === 404)
|
|
183
|
+
continue;
|
|
184
|
+
if (res.status === 401) {
|
|
185
|
+
failure = new SourceUnauthorizedError(`chtypes: ${url} returned 401`);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (res.status === 403) {
|
|
189
|
+
failure = new SourceForbiddenError(`chtypes: ${url} returned 403`);
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (res.status !== 200) {
|
|
193
|
+
failure = new SourceUnreachableError(`chtypes: ${url} returned unexpected status ${res.status}`);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
const parsed = parseJsonValue(res.body);
|
|
197
|
+
if (parsed === null) {
|
|
198
|
+
failure = new SourceUnreachableError(`chtypes: ${url} is not a referrers listing`);
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
json = parsed;
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
if (json === undefined)
|
|
205
|
+
continue;
|
|
206
|
+
const all = descriptorsFromIndex(json, false);
|
|
207
|
+
const signatures = all.filter((d) => d.artifactType === MEDIA_TYPE_BUNDLE);
|
|
208
|
+
if (signatures.length === 0)
|
|
209
|
+
continue; // not a listing of this manifest's signature: try the fallback tag
|
|
210
|
+
return {
|
|
211
|
+
found: true,
|
|
212
|
+
signatures: capReferrers(signatures),
|
|
213
|
+
revocations: capReferrers(all.filter((d) => d.artifactType === REVOCATION_ARTIFACT_TYPE)),
|
|
214
|
+
failure: undefined,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
return { found: false, signatures: [], revocations: [], failure };
|
|
218
|
+
}
|
|
132
219
|
//# sourceMappingURL=referrers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referrers.js","sourceRoot":"","sources":["../../src/ocifetch/referrers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAa,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"referrers.js","sourceRoot":"","sources":["../../src/ocifetch/referrers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chtypes resolve` (`docs/guides/fetch-v1.md` §3, "What a request resolves
|
|
3
|
+
* to"; public issue #493): what a line, a patch or an exact version resolves
|
|
4
|
+
* to on every platform the registry offers, each verified exactly as a fetch
|
|
5
|
+
* verifies it (§4), and never a layer downloaded. Offline it is the cache's
|
|
6
|
+
* answer instead, the lookup an open makes.
|
|
7
|
+
*/
|
|
8
|
+
import type { FetchV1Options, PlatformKey } from './types.js';
|
|
9
|
+
/** What a request resolves to on one platform. */
|
|
10
|
+
export interface Resolution {
|
|
11
|
+
readonly platform: PlatformKey;
|
|
12
|
+
/** The signed `clickhouse_version`. */
|
|
13
|
+
readonly version: string;
|
|
14
|
+
/** The signed build id. */
|
|
15
|
+
readonly build: string;
|
|
16
|
+
/** The platform manifest's digest, `sha256:<hex>`. */
|
|
17
|
+
readonly manifest: string;
|
|
18
|
+
}
|
|
19
|
+
/** `resolveBuilds`' answer: one resolution per platform, in the constants' platform order, and allow-unsigned's warnings. */
|
|
20
|
+
export interface ResolveBuildsResult {
|
|
21
|
+
readonly resolutions: readonly Resolution[];
|
|
22
|
+
readonly warnings: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* What `spelling` resolves to, one `Resolution` per platform, in the
|
|
26
|
+
* constants' platform order. Online it resolves the index (through the dev
|
|
27
|
+
* channel's alias first, §3), and for each platform the index offers it
|
|
28
|
+
* fetches the manifest by digest and verifies its signed statement against the
|
|
29
|
+
* request (§4), exactly as `ensure` does; no layer is requested and nothing is
|
|
30
|
+
* written. A platform the index does not offer is left out, and an index that
|
|
31
|
+
* offers none of them is `ArtifactUnpublishedError`. Offline it answers from
|
|
32
|
+
* the cache: each platform's `resolveInstalled`, and `ArtifactMissingError`
|
|
33
|
+
* when no platform has an installed build. A refused spelling is refused
|
|
34
|
+
* first, before anything is read (`SpellingRefusedError`).
|
|
35
|
+
*/
|
|
36
|
+
export declare function resolveBuilds(spelling: string, options?: FetchV1Options): Promise<ResolveBuildsResult>;
|
|
37
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/ocifetch/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,6HAA6H;AAC7H,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAShH"}
|