@wavehouse/chtypes 0.5.2 → 1.0.2

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.
Files changed (195) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +34 -38
  3. package/dist/abi1/buildinfo.d.ts +40 -0
  4. package/dist/abi1/buildinfo.d.ts.map +1 -0
  5. package/dist/abi1/buildinfo.js +83 -0
  6. package/dist/abi1/buildinfo.js.map +1 -0
  7. package/dist/abi1/calls.gen.d.ts +55 -0
  8. package/dist/abi1/calls.gen.d.ts.map +1 -0
  9. package/dist/abi1/calls.gen.js +110 -0
  10. package/dist/abi1/calls.gen.js.map +1 -0
  11. package/dist/abi1/decls.gen.d.ts +115 -0
  12. package/dist/abi1/decls.gen.d.ts.map +1 -0
  13. package/dist/abi1/decls.gen.js +1613 -0
  14. package/dist/abi1/decls.gen.js.map +1 -0
  15. package/dist/abi1/errmap.gen.d.ts +18 -0
  16. package/dist/abi1/errmap.gen.d.ts.map +1 -0
  17. package/dist/abi1/errmap.gen.js +66 -0
  18. package/dist/abi1/errmap.gen.js.map +1 -0
  19. package/dist/abi1/errors.d.ts +107 -0
  20. package/dist/abi1/errors.d.ts.map +1 -0
  21. package/dist/abi1/errors.js +134 -0
  22. package/dist/abi1/errors.js.map +1 -0
  23. package/dist/abi1/handles.d.ts +31 -0
  24. package/dist/abi1/handles.d.ts.map +1 -0
  25. package/dist/abi1/handles.js +76 -0
  26. package/dist/abi1/handles.js.map +1 -0
  27. package/dist/abi1/index.d.ts +17 -0
  28. package/dist/abi1/index.d.ts.map +1 -0
  29. package/dist/abi1/index.js +17 -0
  30. package/dist/abi1/index.js.map +1 -0
  31. package/dist/abi1/libc.d.ts +54 -0
  32. package/dist/abi1/libc.d.ts.map +1 -0
  33. package/dist/abi1/libc.gen.d.ts +12 -0
  34. package/dist/abi1/libc.gen.d.ts.map +1 -0
  35. package/dist/abi1/libc.gen.js +75 -0
  36. package/dist/abi1/libc.gen.js.map +1 -0
  37. package/dist/abi1/libc.js +109 -0
  38. package/dist/abi1/libc.js.map +1 -0
  39. package/dist/abi1/loader.d.ts +101 -0
  40. package/dist/abi1/loader.d.ts.map +1 -0
  41. package/dist/abi1/loader.js +274 -0
  42. package/dist/abi1/loader.js.map +1 -0
  43. package/dist/abi1/raw.d.ts +104 -0
  44. package/dist/abi1/raw.d.ts.map +1 -0
  45. package/dist/abi1/raw.js +296 -0
  46. package/dist/abi1/raw.js.map +1 -0
  47. package/dist/abi1/strictjson.d.ts +19 -0
  48. package/dist/abi1/strictjson.d.ts.map +1 -0
  49. package/dist/abi1/strictjson.js +78 -0
  50. package/dist/abi1/strictjson.js.map +1 -0
  51. package/dist/abi1/vocab.gen.d.ts +169 -0
  52. package/dist/abi1/vocab.gen.d.ts.map +1 -0
  53. package/dist/abi1/vocab.gen.js +306 -0
  54. package/dist/abi1/vocab.gen.js.map +1 -0
  55. package/dist/cli.d.ts +25 -26
  56. package/dist/cli.d.ts.map +1 -1
  57. package/dist/cli.js +206 -218
  58. package/dist/cli.js.map +1 -1
  59. package/dist/documents.d.ts +195 -0
  60. package/dist/documents.d.ts.map +1 -0
  61. package/dist/documents.js +389 -0
  62. package/dist/documents.js.map +1 -0
  63. package/dist/env.d.ts +16 -0
  64. package/dist/env.d.ts.map +1 -0
  65. package/dist/env.js +57 -0
  66. package/dist/env.js.map +1 -0
  67. package/dist/index.d.ts +19 -24
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +17 -23
  70. package/dist/index.js.map +1 -1
  71. package/dist/json.d.ts +11 -89
  72. package/dist/json.d.ts.map +1 -1
  73. package/dist/json.js +16 -180
  74. package/dist/json.js.map +1 -1
  75. package/dist/library.d.ts +53 -309
  76. package/dist/library.d.ts.map +1 -1
  77. package/dist/library.js +77 -315
  78. package/dist/library.js.map +1 -1
  79. package/dist/ocifetch/constants.gen.d.ts +84 -0
  80. package/dist/ocifetch/constants.gen.d.ts.map +1 -0
  81. package/dist/ocifetch/constants.gen.js +92 -0
  82. package/dist/ocifetch/constants.gen.js.map +1 -0
  83. package/dist/ocifetch/dsse.d.ts +114 -0
  84. package/dist/ocifetch/dsse.d.ts.map +1 -0
  85. package/dist/ocifetch/dsse.js +331 -0
  86. package/dist/ocifetch/dsse.js.map +1 -0
  87. package/dist/ocifetch/ensure.d.ts +65 -0
  88. package/dist/ocifetch/ensure.d.ts.map +1 -0
  89. package/dist/ocifetch/ensure.js +775 -0
  90. package/dist/ocifetch/ensure.js.map +1 -0
  91. package/dist/ocifetch/errors.d.ts +92 -0
  92. package/dist/ocifetch/errors.d.ts.map +1 -0
  93. package/dist/ocifetch/errors.js +101 -0
  94. package/dist/ocifetch/errors.js.map +1 -0
  95. package/dist/ocifetch/goldens.d.ts +44 -0
  96. package/dist/ocifetch/goldens.d.ts.map +1 -0
  97. package/dist/ocifetch/goldens.js +62 -0
  98. package/dist/ocifetch/goldens.js.map +1 -0
  99. package/dist/ocifetch/http.d.ts +124 -0
  100. package/dist/ocifetch/http.d.ts.map +1 -0
  101. package/dist/ocifetch/http.js +549 -0
  102. package/dist/ocifetch/http.js.map +1 -0
  103. package/dist/ocifetch/index.d.ts +17 -0
  104. package/dist/ocifetch/index.d.ts.map +1 -0
  105. package/dist/ocifetch/index.js +14 -0
  106. package/dist/ocifetch/index.js.map +1 -0
  107. package/dist/ocifetch/layout.d.ts +126 -0
  108. package/dist/ocifetch/layout.d.ts.map +1 -0
  109. package/dist/ocifetch/layout.js +375 -0
  110. package/dist/ocifetch/layout.js.map +1 -0
  111. package/dist/ocifetch/localverify.d.ts +43 -0
  112. package/dist/ocifetch/localverify.d.ts.map +1 -0
  113. package/dist/ocifetch/localverify.js +164 -0
  114. package/dist/ocifetch/localverify.js.map +1 -0
  115. package/dist/ocifetch/lock.d.ts +39 -0
  116. package/dist/ocifetch/lock.d.ts.map +1 -0
  117. package/dist/ocifetch/lock.js +140 -0
  118. package/dist/ocifetch/lock.js.map +1 -0
  119. package/dist/ocifetch/oci.d.ts +100 -0
  120. package/dist/ocifetch/oci.d.ts.map +1 -0
  121. package/dist/ocifetch/oci.js +323 -0
  122. package/dist/ocifetch/oci.js.map +1 -0
  123. package/dist/ocifetch/referrers.d.ts +55 -0
  124. package/dist/ocifetch/referrers.d.ts.map +1 -0
  125. package/dist/ocifetch/referrers.js +132 -0
  126. package/dist/ocifetch/referrers.js.map +1 -0
  127. package/dist/ocifetch/types.d.ts +167 -0
  128. package/dist/ocifetch/types.d.ts.map +1 -0
  129. package/dist/ocifetch/types.js +88 -0
  130. package/dist/ocifetch/types.js.map +1 -0
  131. package/dist/ocifetch/unpack.d.ts +55 -0
  132. package/dist/ocifetch/unpack.d.ts.map +1 -0
  133. package/dist/ocifetch/unpack.js +205 -0
  134. package/dist/ocifetch/unpack.js.map +1 -0
  135. package/dist/registry.d.ts +38 -387
  136. package/dist/registry.d.ts.map +1 -1
  137. package/dist/registry.js +95 -819
  138. package/dist/registry.js.map +1 -1
  139. package/dist/schema.d.ts +77 -588
  140. package/dist/schema.d.ts.map +1 -1
  141. package/dist/schema.js +87 -549
  142. package/dist/schema.js.map +1 -1
  143. package/dist/settings.d.ts +27 -36
  144. package/dist/settings.d.ts.map +1 -1
  145. package/dist/settings.js +75 -25
  146. package/dist/settings.js.map +1 -1
  147. package/dist/setup.d.ts +46 -0
  148. package/dist/setup.d.ts.map +1 -0
  149. package/dist/setup.js +79 -0
  150. package/dist/setup.js.map +1 -0
  151. package/dist/tar.d.ts +27 -11
  152. package/dist/tar.d.ts.map +1 -1
  153. package/dist/tar.js +54 -32
  154. package/dist/tar.js.map +1 -1
  155. package/package.json +2 -2
  156. package/dist/discover.d.ts +0 -142
  157. package/dist/discover.d.ts.map +0 -1
  158. package/dist/discover.js +0 -288
  159. package/dist/discover.js.map +0 -1
  160. package/dist/error-codes.d.ts +0 -80
  161. package/dist/error-codes.d.ts.map +0 -1
  162. package/dist/error-codes.js +0 -139
  163. package/dist/error-codes.js.map +0 -1
  164. package/dist/errors.d.ts +0 -284
  165. package/dist/errors.d.ts.map +0 -1
  166. package/dist/errors.js +0 -321
  167. package/dist/errors.js.map +0 -1
  168. package/dist/fetch.d.ts +0 -382
  169. package/dist/fetch.d.ts.map +0 -1
  170. package/dist/fetch.js +0 -1498
  171. package/dist/fetch.js.map +0 -1
  172. package/dist/ffi.d.ts +0 -410
  173. package/dist/ffi.d.ts.map +0 -1
  174. package/dist/ffi.js +0 -1154
  175. package/dist/ffi.js.map +0 -1
  176. package/dist/format.d.ts +0 -128
  177. package/dist/format.d.ts.map +0 -1
  178. package/dist/format.js +0 -132
  179. package/dist/format.js.map +0 -1
  180. package/dist/numeric.d.ts +0 -20
  181. package/dist/numeric.d.ts.map +0 -1
  182. package/dist/numeric.js +0 -107
  183. package/dist/numeric.js.map +0 -1
  184. package/dist/paths.d.ts +0 -55
  185. package/dist/paths.d.ts.map +0 -1
  186. package/dist/paths.js +0 -87
  187. package/dist/paths.js.map +0 -1
  188. package/dist/results.d.ts +0 -495
  189. package/dist/results.d.ts.map +0 -1
  190. package/dist/results.js +0 -406
  191. package/dist/results.js.map +0 -1
  192. package/dist/transform.d.ts +0 -73
  193. package/dist/transform.d.ts.map +0 -1
  194. package/dist/transform.js +0 -533
  195. package/dist/transform.js.map +0 -1
@@ -0,0 +1,126 @@
1
+ /**
2
+ * The cache (`docs/guides/fetch-v1.md` §1): a standard OCI image layout
3
+ * rooted at `CHTYPES_CACHE` or `${XDG_CACHE_HOME:-~/.cache}/chtypes/v1/`,
4
+ * `unpacked/sha256/<manifest-hex>/` beside it, each carrying its own
5
+ * `verified.json` — the durable, **immutable once written** proof a
6
+ * directory was verified, which `resolve_installed`/`--offline` trust
7
+ * instead of `index.json` (guide §6). Read-only system directories are
8
+ * searched after the cache, never written to.
9
+ *
10
+ * `index.json` is written by temp-file-then-atomic-rename and **never
11
+ * edited in place**; a concurrent writer's entry must survive (the
12
+ * `index-race-reapply` case), so every write re-reads the file immediately
13
+ * before renaming and, if it changed since this write started, discards its
14
+ * temp file and retries from the fresh content — an optimistic-concurrency
15
+ * loop, not a lock, because nothing here may block on another process.
16
+ */
17
+ import type { ArtifactPredicate } from './types.js';
18
+ /** `CHTYPES_CACHE`, else `${XDG_CACHE_HOME:-~/.cache}/chtypes/v1` — the layout root itself, not a parent of it. */
19
+ export declare function cacheRoot(explicitCacheDir?: string): string;
20
+ export declare function systemDirs(override?: readonly string[]): readonly string[];
21
+ export declare function blobsDir(root: string): string;
22
+ /** Reads a local blob by its hex digest, `undefined` when it is not there — never throws on ENOENT. */
23
+ export declare function readLocalBlob(root: string, hex: string): Promise<Buffer | undefined>;
24
+ /** Every blob hex name present under `blobs/sha256/` — `[]` when the directory does not exist. */
25
+ export declare function listLocalBlobHexes(root: string): Promise<readonly string[]>;
26
+ export declare function unpackedDir(root: string, manifestDigestHex: string): string;
27
+ /** Creates the layout root (and `oci-layout`) if it does not exist yet. Safe to call every time — idempotent. */
28
+ export declare function ensureLayout(root: string): Promise<void>;
29
+ /** Installs one verified blob into `blobs/sha256/<hex>` by temp-then-rename. A no-op if it is already there (content-addressed). */
30
+ export declare function installBlob(root: string, digestHex: string, bytes: Buffer): Promise<string>;
31
+ export interface IndexDescriptor {
32
+ readonly mediaType: string;
33
+ readonly digest: string;
34
+ readonly size: number;
35
+ readonly artifactType?: string;
36
+ readonly platform?: {
37
+ readonly os: string;
38
+ readonly architecture: string;
39
+ };
40
+ readonly annotations?: Readonly<Record<string, string>>;
41
+ }
42
+ /**
43
+ * Upserts one descriptor (by digest) into `index.json`, surviving a
44
+ * concurrent writer: re-reads the file immediately before the atomic rename
45
+ * and, if it changed since this call started, re-merges onto the fresh
46
+ * content and tries again (bounded — a layout should never see sustained
47
+ * contention). `beforeRename` is a test-only hook (`index-race-reapply`)
48
+ * that runs after the temp file is written and before the race check.
49
+ */
50
+ export declare function upsertIndexEntry(root: string, descriptor: IndexDescriptor, beforeRename?: () => Promise<void> | void): Promise<void>;
51
+ /** Every descriptor `index.json` currently lists, `[]` if the file is absent or unreadable. */
52
+ export declare function readIndexEntries(root: string): Promise<readonly IndexDescriptor[]>;
53
+ /**
54
+ * One `unpacked/sha256/<hex>/verified.json`, in memory. Its on-disk form is
55
+ * the one canonical record every binding reads and writes
56
+ * (`spec/fetch-v1/schema/verified.schema.json`, guide §1): see
57
+ * `encodeRecord` and `decodeRecord`. Optional members are `null` here and
58
+ * on disk.
59
+ */
60
+ export interface VerifiedRecord {
61
+ readonly platform: string;
62
+ readonly version: string;
63
+ readonly channel: string | null;
64
+ readonly build: string;
65
+ /** The library's file name, relative to the unpacked directory. */
66
+ readonly library: string;
67
+ readonly librarySha256: string;
68
+ readonly libraryBytes: number;
69
+ readonly indexDigest: string | null;
70
+ readonly manifestDigest: string;
71
+ readonly layerDigest: string;
72
+ readonly bundleDigest: string | null;
73
+ readonly bundleManifestDigest: string | null;
74
+ /** `null` only under allow-unsigned. */
75
+ readonly signedBy: string | null;
76
+ readonly predicate: ArtifactPredicate;
77
+ }
78
+ export interface RecordSource {
79
+ readonly platform: string;
80
+ readonly predicate: ArtifactPredicate;
81
+ /** The unpacked library as measured on disk (`measureLibrary`), never copied from an unsigned config. */
82
+ readonly library: {
83
+ readonly sha256: string;
84
+ readonly bytes: number;
85
+ };
86
+ readonly indexDigest: string | null;
87
+ readonly manifestDigest: string;
88
+ readonly layerDigest: string;
89
+ readonly bundleDigest: string | null;
90
+ readonly bundleManifestDigest: string | null;
91
+ readonly signedBy: string | null;
92
+ }
93
+ /** Builds the canonical record for one verified install from what the install itself established. */
94
+ export declare function buildRecord(src: RecordSource): VerifiedRecord;
95
+ /** The canonical `verified.json` text: every member present, `null` where the schema allows it. */
96
+ export declare function encodeRecord(record: VerifiedRecord): string;
97
+ /**
98
+ * Accepts exactly the canonical schema-1 record. Anything else (not JSON,
99
+ * another schema, a missing member, a member of the wrong type, a broken
100
+ * rule) is `undefined`, which every caller treats as an ABSENT record —
101
+ * never fatal by itself and never trusted.
102
+ */
103
+ export declare function decodeRecord(raw: string): VerifiedRecord | undefined;
104
+ /**
105
+ * Writes the directory's own durable proof of verification — **the source
106
+ * of truth for `--offline` and `resolve_installed`** (guide §6), never
107
+ * `index.json`. Written once, by temp-then-rename, immediately after a
108
+ * successful unpack; a directory with no acceptable `verified.json` is
109
+ * treated as unverified regardless of what `index.json` claims about it.
110
+ * A record that would not read back (it breaks the schema) is refused here
111
+ * rather than left behind as a directory no reader will trust.
112
+ */
113
+ export declare function writeVerifiedRecord(dir: string, record: VerifiedRecord): Promise<void>;
114
+ /** `undefined` when the directory has no acceptable `verified.json` (missing, unparsable, another schema, or a broken rule) — never partially trusted. */
115
+ export declare function readVerifiedRecord(dir: string): Promise<VerifiedRecord | undefined>;
116
+ /** Every `unpacked/sha256/*` directory that carries a `verified.json` — `list_installed`'s and monotonicity's source. */
117
+ export declare function listVerified(root: string): Promise<readonly {
118
+ readonly dir: string;
119
+ readonly record: VerifiedRecord;
120
+ }[]>;
121
+ /** A fresh, empty staging directory beside `unpacked/`, for temp-then-rename of a whole unpacked tree. */
122
+ export declare function freshStagingDir(root: string): Promise<string>;
123
+ /** Renames a staged, fully-verified unpack into its final content-addressed home; removes the staging dir on any failure. */
124
+ export declare function commitStaging(stagingDir: string, finalDir: string): Promise<void>;
125
+ export declare function removeStaging(stagingDir: string): Promise<void>;
126
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/ocifetch/layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,375 @@
1
+ /**
2
+ * The cache (`docs/guides/fetch-v1.md` §1): a standard OCI image layout
3
+ * rooted at `CHTYPES_CACHE` or `${XDG_CACHE_HOME:-~/.cache}/chtypes/v1/`,
4
+ * `unpacked/sha256/<manifest-hex>/` beside it, each carrying its own
5
+ * `verified.json` — the durable, **immutable once written** proof a
6
+ * directory was verified, which `resolve_installed`/`--offline` trust
7
+ * instead of `index.json` (guide §6). Read-only system directories are
8
+ * searched after the cache, never written to.
9
+ *
10
+ * `index.json` is written by temp-file-then-atomic-rename and **never
11
+ * edited in place**; a concurrent writer's entry must survive (the
12
+ * `index-race-reapply` case), so every write re-reads the file immediately
13
+ * before renaming and, if it changed since this write started, discards its
14
+ * temp file and retries from the fresh content — an optimistic-concurrency
15
+ * loop, not a lock, because nothing here may block on another process.
16
+ */
17
+ import { randomBytes } from 'node:crypto';
18
+ import { mkdir, readdir, readFile, rename, rm, unlink, writeFile } from 'node:fs/promises';
19
+ import os from 'node:os';
20
+ import path from 'node:path';
21
+ import { CACHE_UNPACKED_DIR, CACHE_VERIFIED_RECORD, ENV_CACHE_NAME, PLATFORMS, SYSTEM_CACHE_DIRS } from './constants.gen.js';
22
+ import { ArtifactCorruptError } from './errors.js';
23
+ /** `CHTYPES_CACHE`, else `${XDG_CACHE_HOME:-~/.cache}/chtypes/v1` — the layout root itself, not a parent of it. */
24
+ export function cacheRoot(explicitCacheDir) {
25
+ if (explicitCacheDir !== undefined && explicitCacheDir !== '')
26
+ return path.resolve(explicitCacheDir);
27
+ const env = process.env[ENV_CACHE_NAME];
28
+ if (env !== undefined && env !== '')
29
+ return path.resolve(env);
30
+ const xdg = process.env['XDG_CACHE_HOME'];
31
+ const base = xdg !== undefined && xdg !== '' ? xdg : path.join(os.homedir(), '.cache');
32
+ return path.join(base, 'chtypes', 'v1');
33
+ }
34
+ export function systemDirs(override) {
35
+ return override ?? SYSTEM_CACHE_DIRS;
36
+ }
37
+ export function blobsDir(root) {
38
+ return path.join(root, 'blobs', 'sha256');
39
+ }
40
+ /** Reads a local blob by its hex digest, `undefined` when it is not there — never throws on ENOENT. */
41
+ export async function readLocalBlob(root, hex) {
42
+ try {
43
+ return await readFile(path.join(blobsDir(root), hex));
44
+ }
45
+ catch (err) {
46
+ if (err.code === 'ENOENT')
47
+ return undefined;
48
+ throw err;
49
+ }
50
+ }
51
+ /** Every blob hex name present under `blobs/sha256/` — `[]` when the directory does not exist. */
52
+ export async function listLocalBlobHexes(root) {
53
+ try {
54
+ return await readdir(blobsDir(root));
55
+ }
56
+ catch {
57
+ return [];
58
+ }
59
+ }
60
+ export function unpackedDir(root, manifestDigestHex) {
61
+ return path.join(root, CACHE_UNPACKED_DIR, manifestDigestHex);
62
+ }
63
+ function indexJsonPath(root) {
64
+ return path.join(root, 'index.json');
65
+ }
66
+ async function tempPathNear(target) {
67
+ const rand = randomBytes(6).toString('hex');
68
+ return `${target}.tmp-${process.pid}-${rand}`;
69
+ }
70
+ /** Creates the layout root (and `oci-layout`) if it does not exist yet. Safe to call every time — idempotent. */
71
+ export async function ensureLayout(root) {
72
+ await mkdir(root, { recursive: true });
73
+ await mkdir(blobsDir(root), { recursive: true });
74
+ await mkdir(path.join(root, CACHE_UNPACKED_DIR), { recursive: true });
75
+ const marker = path.join(root, 'oci-layout');
76
+ try {
77
+ await readFile(marker);
78
+ }
79
+ catch {
80
+ const tmp = await tempPathNear(marker);
81
+ await writeFile(tmp, `${JSON.stringify({ imageLayoutVersion: '1.0.0' })}\n`);
82
+ await rename(tmp, marker);
83
+ }
84
+ }
85
+ /** Installs one verified blob into `blobs/sha256/<hex>` by temp-then-rename. A no-op if it is already there (content-addressed). */
86
+ export async function installBlob(root, digestHex, bytes) {
87
+ const dest = path.join(blobsDir(root), digestHex);
88
+ try {
89
+ await readFile(dest);
90
+ return dest;
91
+ }
92
+ catch {
93
+ // Not present yet — fall through and install it.
94
+ }
95
+ const tmp = await tempPathNear(dest);
96
+ await writeFile(tmp, bytes);
97
+ try {
98
+ await rename(tmp, dest);
99
+ }
100
+ catch (err) {
101
+ await unlink(tmp).catch(() => { });
102
+ throw err;
103
+ }
104
+ return dest;
105
+ }
106
+ const EMPTY_INDEX = { schemaVersion: 2, manifests: [] };
107
+ async function readRawIndex(root) {
108
+ try {
109
+ return await readFile(indexJsonPath(root), 'utf8');
110
+ }
111
+ catch (err) {
112
+ if (err.code === 'ENOENT')
113
+ return undefined;
114
+ throw err;
115
+ }
116
+ }
117
+ /**
118
+ * `index.json` is our own durable bookkeeping (plus whatever `oras copy
119
+ * --to-oci-layout` pre-seeded) — parsed with plain `JSON.parse` here rather
120
+ * than `../json.ts`'s duplicate-key-aware reader, which is reserved for
121
+ * untrusted, attacker-reachable bytes (DSSE statements, referrer listings).
122
+ * This file is local and either ours or a trusted tool's.
123
+ */
124
+ function parseIndex(raw) {
125
+ if (raw === undefined)
126
+ return EMPTY_INDEX;
127
+ try {
128
+ const parsed = JSON.parse(raw);
129
+ if (!Array.isArray(parsed.manifests))
130
+ return EMPTY_INDEX;
131
+ return { schemaVersion: 2, manifests: parsed.manifests };
132
+ }
133
+ catch {
134
+ return EMPTY_INDEX;
135
+ }
136
+ }
137
+ /**
138
+ * Upserts one descriptor (by digest) into `index.json`, surviving a
139
+ * concurrent writer: re-reads the file immediately before the atomic rename
140
+ * and, if it changed since this call started, re-merges onto the fresh
141
+ * content and tries again (bounded — a layout should never see sustained
142
+ * contention). `beforeRename` is a test-only hook (`index-race-reapply`)
143
+ * that runs after the temp file is written and before the race check.
144
+ */
145
+ export async function upsertIndexEntry(root, descriptor, beforeRename) {
146
+ const indexPath = indexJsonPath(root);
147
+ for (let attempt = 0; attempt < 8; attempt++) {
148
+ const before = await readRawIndex(root);
149
+ const current = parseIndex(before);
150
+ const withoutExisting = current.manifests.filter((m) => m.digest !== descriptor.digest);
151
+ const merged = { schemaVersion: 2, manifests: [...withoutExisting, descriptor] };
152
+ const tmp = await tempPathNear(indexPath);
153
+ await writeFile(tmp, JSON.stringify(merged));
154
+ if (beforeRename)
155
+ await beforeRename();
156
+ const after = await readRawIndex(root);
157
+ if (after !== before) {
158
+ // Lost the race: someone else wrote in between. Discard this attempt
159
+ // and re-merge onto what is actually there now.
160
+ await unlink(tmp).catch(() => { });
161
+ continue;
162
+ }
163
+ await rename(tmp, indexPath);
164
+ return;
165
+ }
166
+ throw new Error(`chtypes: index.json at ${indexPath} would not settle after 8 attempts (sustained concurrent writers)`);
167
+ }
168
+ /** Every descriptor `index.json` currently lists, `[]` if the file is absent or unreadable. */
169
+ export async function readIndexEntries(root) {
170
+ return parseIndex(await readRawIndex(root)).manifests;
171
+ }
172
+ /** Builds the canonical record for one verified install from what the install itself established. */
173
+ export function buildRecord(src) {
174
+ const channel = src.predicate.channel;
175
+ return {
176
+ platform: src.platform,
177
+ version: src.predicate.clickhouse_version,
178
+ channel: typeof channel === 'string' && channel !== '' ? channel : null,
179
+ build: src.predicate.build,
180
+ library: src.predicate.library,
181
+ librarySha256: src.library.sha256,
182
+ libraryBytes: src.library.bytes,
183
+ indexDigest: src.indexDigest,
184
+ manifestDigest: src.manifestDigest,
185
+ layerDigest: src.layerDigest,
186
+ bundleDigest: src.bundleDigest,
187
+ bundleManifestDigest: src.bundleManifestDigest,
188
+ signedBy: src.signedBy,
189
+ predicate: src.predicate,
190
+ };
191
+ }
192
+ const HEX64 = /^[0-9a-f]{64}$/;
193
+ const DIGEST = /^sha256:[0-9a-f]{64}$/;
194
+ const VERSION4 = /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/;
195
+ /** The canonical `verified.json` text: every member present, `null` where the schema allows it. */
196
+ export function encodeRecord(record) {
197
+ return JSON.stringify({
198
+ schema: 1,
199
+ platform: record.platform,
200
+ version: record.version,
201
+ channel: record.channel,
202
+ build: record.build,
203
+ library: record.library,
204
+ library_sha256: record.librarySha256,
205
+ library_bytes: record.libraryBytes,
206
+ digests: {
207
+ index: record.indexDigest,
208
+ manifest: record.manifestDigest,
209
+ layer: record.layerDigest,
210
+ bundle: record.bundleDigest,
211
+ bundle_manifest: record.bundleManifestDigest,
212
+ },
213
+ signed_by: record.signedBy,
214
+ predicate: record.predicate,
215
+ });
216
+ }
217
+ function isObject(v) {
218
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
219
+ }
220
+ function nullableString(v) {
221
+ if (v === null)
222
+ return null;
223
+ return typeof v === 'string' ? v : undefined;
224
+ }
225
+ /**
226
+ * Accepts exactly the canonical schema-1 record. Anything else (not JSON,
227
+ * another schema, a missing member, a member of the wrong type, a broken
228
+ * rule) is `undefined`, which every caller treats as an ABSENT record —
229
+ * never fatal by itself and never trusted.
230
+ */
231
+ export function decodeRecord(raw) {
232
+ let doc;
233
+ try {
234
+ doc = JSON.parse(raw);
235
+ }
236
+ catch {
237
+ return undefined;
238
+ }
239
+ if (!isObject(doc))
240
+ return undefined;
241
+ for (const key of ['schema', 'platform', 'version', 'channel', 'build', 'library', 'library_sha256', 'library_bytes', 'digests', 'signed_by', 'predicate']) {
242
+ if (!(key in doc))
243
+ return undefined;
244
+ }
245
+ const digests = doc['digests'];
246
+ if (!isObject(digests))
247
+ return undefined;
248
+ for (const key of ['index', 'manifest', 'layer', 'bundle', 'bundle_manifest']) {
249
+ if (!(key in digests))
250
+ return undefined;
251
+ }
252
+ if (doc['schema'] !== 1)
253
+ return undefined;
254
+ const platform = doc['platform'];
255
+ const version = doc['version'];
256
+ const build = doc['build'];
257
+ const library = doc['library'];
258
+ const sha = doc['library_sha256'];
259
+ const bytes = doc['library_bytes'];
260
+ if (typeof platform !== 'string' || !PLATFORMS.some((p) => p.key === platform))
261
+ return undefined;
262
+ if (typeof version !== 'string' || !VERSION4.test(version))
263
+ return undefined;
264
+ if (typeof build !== 'string' || build === '')
265
+ return undefined;
266
+ if (typeof library !== 'string' || library === '' || library === '.' || library === '..' || library.includes('/') || library.includes('\\'))
267
+ return undefined;
268
+ if (typeof sha !== 'string' || !HEX64.test(sha))
269
+ return undefined;
270
+ if (typeof bytes !== 'number' || !Number.isInteger(bytes) || bytes < 0)
271
+ return undefined;
272
+ if (!isObject(doc['predicate']))
273
+ return undefined;
274
+ const channel = nullableString(doc['channel']);
275
+ const signedBy = nullableString(doc['signed_by']);
276
+ const index = nullableString(digests['index']);
277
+ const manifest = digests['manifest'];
278
+ const layer = digests['layer'];
279
+ const bundle = nullableString(digests['bundle']);
280
+ const bundleManifest = nullableString(digests['bundle_manifest']);
281
+ if (channel === undefined || signedBy === undefined || index === undefined || bundle === undefined || bundleManifest === undefined)
282
+ return undefined;
283
+ if (typeof manifest !== 'string' || !DIGEST.test(manifest) || typeof layer !== 'string' || !DIGEST.test(layer))
284
+ return undefined;
285
+ for (const d of [index, bundle, bundleManifest]) {
286
+ if (d !== null && !DIGEST.test(d))
287
+ return undefined;
288
+ }
289
+ return {
290
+ platform,
291
+ version,
292
+ channel,
293
+ build,
294
+ library,
295
+ librarySha256: sha,
296
+ libraryBytes: bytes,
297
+ indexDigest: index,
298
+ manifestDigest: manifest,
299
+ layerDigest: layer,
300
+ bundleDigest: bundle,
301
+ bundleManifestDigest: bundleManifest,
302
+ signedBy,
303
+ predicate: doc['predicate'],
304
+ };
305
+ }
306
+ /**
307
+ * Writes the directory's own durable proof of verification — **the source
308
+ * of truth for `--offline` and `resolve_installed`** (guide §6), never
309
+ * `index.json`. Written once, by temp-then-rename, immediately after a
310
+ * successful unpack; a directory with no acceptable `verified.json` is
311
+ * treated as unverified regardless of what `index.json` claims about it.
312
+ * A record that would not read back (it breaks the schema) is refused here
313
+ * rather than left behind as a directory no reader will trust.
314
+ */
315
+ export async function writeVerifiedRecord(dir, record) {
316
+ const text = encodeRecord(record);
317
+ if (decodeRecord(text) === undefined) {
318
+ throw new ArtifactCorruptError(`chtypes: refusing to write a verified.json that breaks its own schema (version ${JSON.stringify(record.version)}, build ${JSON.stringify(record.build)})`);
319
+ }
320
+ const dest = path.join(dir, CACHE_VERIFIED_RECORD);
321
+ const tmp = await tempPathNear(dest);
322
+ await writeFile(tmp, text);
323
+ await rename(tmp, dest);
324
+ }
325
+ /** `undefined` when the directory has no acceptable `verified.json` (missing, unparsable, another schema, or a broken rule) — never partially trusted. */
326
+ export async function readVerifiedRecord(dir) {
327
+ try {
328
+ return decodeRecord(await readFile(path.join(dir, CACHE_VERIFIED_RECORD), 'utf8'));
329
+ }
330
+ catch {
331
+ return undefined;
332
+ }
333
+ }
334
+ /** Every `unpacked/sha256/*` directory that carries a `verified.json` — `list_installed`'s and monotonicity's source. */
335
+ export async function listVerified(root) {
336
+ const base = path.join(root, CACHE_UNPACKED_DIR);
337
+ let names;
338
+ try {
339
+ names = await readdir(base);
340
+ }
341
+ catch {
342
+ return [];
343
+ }
344
+ const out = [];
345
+ for (const name of names) {
346
+ const dir = path.join(base, name);
347
+ const record = await readVerifiedRecord(dir);
348
+ if (record !== undefined)
349
+ out.push({ dir, record });
350
+ }
351
+ return out;
352
+ }
353
+ /** A fresh, empty staging directory beside `unpacked/`, for temp-then-rename of a whole unpacked tree. */
354
+ export async function freshStagingDir(root) {
355
+ const base = path.join(root, CACHE_UNPACKED_DIR);
356
+ await mkdir(base, { recursive: true });
357
+ const dir = path.join(base, `.staging-${process.pid}-${randomBytes(6).toString('hex')}`);
358
+ await mkdir(dir, { recursive: true });
359
+ return dir;
360
+ }
361
+ /** Renames a staged, fully-verified unpack into its final content-addressed home; removes the staging dir on any failure. */
362
+ export async function commitStaging(stagingDir, finalDir) {
363
+ try {
364
+ await rm(finalDir, { recursive: true, force: true });
365
+ await rename(stagingDir, finalDir);
366
+ }
367
+ catch (err) {
368
+ await rm(stagingDir, { recursive: true, force: true }).catch(() => { });
369
+ throw err;
370
+ }
371
+ }
372
+ export async function removeStaging(stagingDir) {
373
+ await rm(stagingDir, { recursive: true, force: true }).catch(() => { });
374
+ }
375
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/ocifetch/layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Verifying a pre-seeded cache entry from local blobs alone, zero network
3
+ * (`docs/guides/fetch-v1.md` §1, §6): "a pre-seeded layout has entries in
4
+ * `index.json` with no corresponding `unpacked/` directory yet; the first
5
+ * request for one verifies it against its signature exactly as a freshly
6
+ * downloaded layer would, then unpacks it." `--offline`/`resolve_installed`
7
+ * are the only callers — never `ensure`'s normal online path, which always
8
+ * has a live referrers API to ask.
9
+ *
10
+ * There is no referrers API to query here, so trust discovery is a local
11
+ * scan: every blob under `blobs/sha256/` that parses as an OCI manifest
12
+ * with the signature bundle's own `artifactType` is a *candidate* referrer
13
+ * of the platform manifest, tried the same way `dsse.ts`'s
14
+ * `verifyAnyReferrerBundle` tries referrers fetched over the network —
15
+ * stopping at the first whose signature verifies AND whose statement names
16
+ * this exact platform manifest's layer as its subject. `oras copy -r
17
+ * --to-oci-layout` is what populates these blobs when pulling from a real
18
+ * registry (guide §1); `index.json` itself carries no referrers listing (no
19
+ * such thing exists in the OCI image-layout spec), which is exactly why
20
+ * this is a scan rather than a lookup.
21
+ */
22
+ import { type VerifiedRecord } from './layout.js';
23
+ import type { PlatformKey, TrustedKey } from './types.js';
24
+ /**
25
+ * Verifies and installs the platform manifest named by `manifestDigest`,
26
+ * reading every blob it needs from `blobsSourceDir`'s `blobs/sha256/` but
27
+ * always **writing** the result (the unpacked library and its
28
+ * `verified.json`) under `writeRoot` — the two differ for a read-only
29
+ * system directory (guide §1: "never written to"), where `blobsSourceDir`
30
+ * is that system dir and `writeRoot` is the user's own cache.
31
+ *
32
+ * Idempotent and cheap on a repeat call: if `writeRoot` already has a
33
+ * `verified.json` for this digest, returns it without touching
34
+ * `blobsSourceDir` again. Returns `undefined` (never throws) when this
35
+ * specific entry cannot be locally verified — a bad or incomplete
36
+ * pre-seeded blob is "not usable", not a hard failure for whatever broader
37
+ * scan is trying several candidates. The caller decides whether the
38
+ * resulting predicate's own `clickhouse_version` fits whatever request
39
+ * prompted the scan — this function verifies the entry on its own terms,
40
+ * not against any one request.
41
+ */
42
+ export declare function verifyAndInstallFromLocalBlobs(blobsSourceDir: string, writeRoot: string, manifestDigest: string, platform: PlatformKey, trustedKeys: readonly TrustedKey[]): Promise<VerifiedRecord | undefined>;
43
+ //# sourceMappingURL=localverify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localverify.d.ts","sourceRoot":"","sources":["../../src/ocifetch/localverify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,OAAO,EAQL,KAAK,cAAc,EAEpB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAqB,WAAW,EAAa,UAAU,EAAE,MAAM,YAAY,CAAC;AAIxF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,8BAA8B,CAClD,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,WAAW,EACrB,WAAW,EAAE,SAAS,UAAU,EAAE,GACjC,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CA2DrC"}