@wavehouse/chtypes 0.5.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/CHANGELOG.md +26 -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 +99 -0
  40. package/dist/abi1/loader.d.ts.map +1 -0
  41. package/dist/abi1/loader.js +261 -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 +94 -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 +37 -0
  148. package/dist/setup.d.ts.map +1 -0
  149. package/dist/setup.js +60 -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,549 @@
1
+ /**
2
+ * The v1 HTTP stack (`docs/guides/fetch-v1.md` §2, §7): one retry table, one
3
+ * redirect policy, the anonymous bearer-token flow (for mirrors), the system
4
+ * CA store, and `HTTPS_PROXY`/`NO_PROXY`.
5
+ *
6
+ * Deliberately **not** global `fetch`: Node's built-in `fetch` (undici) does
7
+ * not honor `HTTPS_PROXY` without a process-wide flag. `https.Agent({
8
+ * proxyEnv })` and `tls.getCACertificates` are both real APIs on the v1 Node
9
+ * floor (>=22.21) — measured on macOS (Node 22.23.2) during this lane's own
10
+ * work: `tls.getCACertificates('system')` returns the Keychain roots,
11
+ * `tls.getCACertificates('default')` returns Node's bundled Mozilla set, and
12
+ * an `https.Agent({ proxyEnv: process.env })` request to an `https:` origin
13
+ * issues a `CONNECT` to the host named by `HTTPS_PROXY` before anything else.
14
+ * The Linux leg of that measurement is `v1-network`'s to make (not yet wired
15
+ * — lane 0B).
16
+ */
17
+ import { readFileSync } from 'node:fs';
18
+ import { readFile } from 'node:fs/promises';
19
+ import * as http from 'node:http';
20
+ import * as https from 'node:https';
21
+ import * as tls from 'node:tls';
22
+ import { fileURLToPath } from 'node:url';
23
+ import { CONNECT_TIMEOUT_S, IDLE_READ_TIMEOUT_S, MAX_REDIRECTS, RETRY_AFTER_STATUSES, RETRY_ATTEMPTS, RETRY_FIRST_WAIT_S, RETRY_MULTIPLIER, RETRY_STATUSES, } from './constants.gen.js';
24
+ import { ArtifactCorruptError, SourceForbiddenError, SourceUnauthorizedError, SourceUnreachableError } from './errors.js';
25
+ /**
26
+ * The ceiling past which a `Retry-After` is refused rather than shortened
27
+ * (`docs/guides/fetch-v1.md` §7, A6). Not yet pinned by a fixture (lane 0B);
28
+ * `IDLE_READ_TIMEOUT_S` is this lane's own reasoned choice — the fetch layer
29
+ * declines to sit idle waiting longer than it would already time out a read
30
+ * for. **Flag for the merge/integration lane**: adjust this to match
31
+ * `retry-after-over-budget`'s actual fixture value once it exists.
32
+ */
33
+ export const RETRY_AFTER_BUDGET_S = IDLE_READ_TIMEOUT_S;
34
+ /**
35
+ * Runs `attempt` under the shared retry table (`docs/guides/fetch-v1.md`
36
+ * §7): 5 attempts, waits doubling from 4s, honoring `Retry-After` on 429/503
37
+ * and refusing one past `RETRY_AFTER_BUDGET_S`. `attempt` returns `{ok:
38
+ * true}` with its own value already produced as a side effect (buffering a
39
+ * body, or writing a file) — this loop only decides whether to retry.
40
+ * `attempt` throwing directly (rather than returning `{ok: false, ...}`)
41
+ * skips the retry loop entirely — used for a failure that is never
42
+ * transient, such as an oversize response (`CORRUPT`, never retried).
43
+ */
44
+ export async function withRetry(clock, attempt) {
45
+ let last;
46
+ for (let n = 1; n <= RETRY_ATTEMPTS; n++) {
47
+ const { outcome, value } = await attempt(n);
48
+ if (outcome.ok)
49
+ return value;
50
+ last = outcome;
51
+ const isLast = n === RETRY_ATTEMPTS;
52
+ if (!outcome.retryable || isLast)
53
+ break;
54
+ let waitSeconds = RETRY_FIRST_WAIT_S * RETRY_MULTIPLIER ** (n - 1);
55
+ if (outcome.retryAfterSeconds !== undefined) {
56
+ if (outcome.retryAfterSeconds > RETRY_AFTER_BUDGET_S) {
57
+ throw new SourceUnreachableError(`chtypes: Retry-After named ${outcome.retryAfterSeconds}s, past the ${RETRY_AFTER_BUDGET_S}s retry budget; refusing rather than sleeping it`, { retryAfterRefused: outcome.retryAfterSeconds });
58
+ }
59
+ waitSeconds = Math.max(0, outcome.retryAfterSeconds);
60
+ }
61
+ await clock.sleep(waitSeconds);
62
+ }
63
+ const statusPart = last?.status !== undefined ? `, last status ${last.status}` : '';
64
+ throw new SourceUnreachableError(`chtypes: ${last?.message ?? 'request failed'} (after ${RETRY_ATTEMPTS} attempts${statusPart})`);
65
+ }
66
+ /** Is this status one the retry table retries on 408/429/500/502/503/504? */
67
+ function isRetryableStatus(status) {
68
+ return RETRY_STATUSES.includes(status);
69
+ }
70
+ /**
71
+ * A connection-level failure meaning "nothing is answering here at all" —
72
+ * refused, no route, or DNS failed to resolve a name — as opposed to a
73
+ * timeout waiting for a slow or stalled peer. The retry table's backoff
74
+ * schedule is for a peer that IS there but answering badly (a status code,
75
+ * or a stall); a dead host gets **zero** sleep and fails this base
76
+ * immediately, so the caller's multi-base loop moves on at once
77
+ * (`connection-refused-then-next-base`: sleeps `[]`, not `[4]`). A timeout
78
+ * (this server's own `connect timeout` on a stalled socket, `ETIMEDOUT`,
79
+ * `ECONNRESET` mid-stream) stays in the normal backoff-and-retry path
80
+ * (`stall-timeout-retried`: sleeps `[4]`).
81
+ */
82
+ function isDeadHostError(err) {
83
+ const code = err?.code;
84
+ return code === 'ECONNREFUSED' || code === 'ENOTFOUND' || code === 'EAI_AGAIN' || code === 'EHOSTUNREACH' || code === 'ENETUNREACH';
85
+ }
86
+ /**
87
+ * `Retry-After`, in both forms (`docs/guides/fetch-v1.md` §7): a delta in
88
+ * seconds, or an HTTP-date, for which the delay is the date minus the
89
+ * response's own `Date` header (or `clock.now()` when absent).
90
+ */
91
+ export function parseRetryAfterSeconds(value, responseDateHeader, clock) {
92
+ const trimmed = value.trim();
93
+ if (/^\d+$/.test(trimmed))
94
+ return Number.parseInt(trimmed, 10);
95
+ const target = Date.parse(trimmed);
96
+ if (Number.isNaN(target))
97
+ return undefined;
98
+ const base = responseDateHeader !== undefined ? Date.parse(responseDateHeader) : Number.NaN;
99
+ const from = Number.isNaN(base) ? clock.now() : base;
100
+ return Math.max(0, (target - from) / 1000);
101
+ }
102
+ function flattenHeaders(raw) {
103
+ const out = {};
104
+ for (const [k, v] of Object.entries(raw)) {
105
+ if (v === undefined)
106
+ continue;
107
+ out[k.toLowerCase()] = Array.isArray(v) ? v.join(', ') : v;
108
+ }
109
+ return out;
110
+ }
111
+ /** The system + bundled CA roots, per `docs/guides/fetch-v1.md` §2. */
112
+ function systemAndDefaultCertificates() {
113
+ const out = [];
114
+ try {
115
+ out.push(...tls.getCACertificates('default'));
116
+ }
117
+ catch {
118
+ // Older runtime without this half of the API: fall back to the platform default.
119
+ }
120
+ try {
121
+ out.push(...tls.getCACertificates('system'));
122
+ }
123
+ catch {
124
+ // No system store reachable (e.g. a minimal container); default-only is still correct.
125
+ }
126
+ return out;
127
+ }
128
+ let cachedAgent;
129
+ function httpsAgent() {
130
+ cachedAgent ??= new https.Agent({
131
+ // A real, measured Node >=22.21 API — see this file's header comment.
132
+ proxyEnv: process.env,
133
+ ca: systemAndDefaultCertificates(),
134
+ });
135
+ return cachedAgent;
136
+ }
137
+ let cachedPlainAgent;
138
+ function httpAgent() {
139
+ cachedPlainAgent ??= new http.Agent({ proxyEnv: process.env });
140
+ return cachedPlainAgent;
141
+ }
142
+ function isSameOrigin(a, b) {
143
+ return a.protocol === b.protocol && a.hostname === b.hostname && (a.port || defaultPort(a)) === (b.port || defaultPort(b));
144
+ }
145
+ function defaultPort(u) {
146
+ return u.protocol === 'https:' ? '443' : '80';
147
+ }
148
+ const USER_AGENT_DEV_VERSION = '0.0.0-dev';
149
+ /** The package's own version, from its `package.json` (one level above `src/` and `dist/` alike). */
150
+ function readPackageVersion() {
151
+ try {
152
+ const raw = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8'));
153
+ const v = raw !== null && typeof raw === 'object' ? raw['version'] : undefined;
154
+ return typeof v === 'string' && /^[0-9A-Za-z.+-]+$/.test(v) ? v : USER_AGENT_DEV_VERSION;
155
+ }
156
+ catch {
157
+ return USER_AGENT_DEV_VERSION;
158
+ }
159
+ }
160
+ /**
161
+ * `chtypes-ts/<version>`, the User-Agent on every request this module makes
162
+ * (`docs/guides/fetch-v1.md` §2): delivery hosts may refuse a generic library
163
+ * agent. Never omitted; `0.0.0-dev` when the version cannot be read.
164
+ */
165
+ export const USER_AGENT = `chtypes-ts/${readPackageVersion()}`;
166
+ /** One connection attempt with no retry and no redirect following — the unit `requestBuffered`/`requestToSink` build on. */
167
+ function rawRequest(url, method, callerHeaders) {
168
+ // The one place a request is made: manifests, blobs, referrers, tag lists,
169
+ // token exchanges and every redirect hop come through here, so the agent is
170
+ // set here and nowhere else. It replaces any caller-supplied one.
171
+ const headers = {};
172
+ for (const [k, v] of Object.entries(callerHeaders))
173
+ if (k.toLowerCase() !== 'user-agent')
174
+ headers[k] = v;
175
+ headers['user-agent'] = USER_AGENT;
176
+ return new Promise((resolve, reject) => {
177
+ const mod = url.protocol === 'https:' ? https : http;
178
+ const agent = url.protocol === 'https:' ? httpsAgent() : httpAgent();
179
+ const req = mod.request(url, {
180
+ method,
181
+ agent,
182
+ headers,
183
+ timeout: CONNECT_TIMEOUT_S * 1000,
184
+ }, (res) => {
185
+ resolve({ status: res.statusCode ?? 0, headers: flattenHeaders(res.headers), stream: res });
186
+ });
187
+ req.once('timeout', () => req.destroy(new Error('connect timeout')));
188
+ req.once('error', reject);
189
+ req.end();
190
+ });
191
+ }
192
+ /**
193
+ * `anonBearerToken` (freshly obtained for this exact host via the mirror
194
+ * token flow) is always applied when present. `token` (the static
195
+ * `CHTYPES_DOWNLOAD_TOKEN`) is restricted to `tokenHosts` — an exact-host
196
+ * allowlist of the configured bases, never "whatever host we happen to be
197
+ * calling" (`docs/guides/fetch-v1.md` §2).
198
+ */
199
+ function buildHeaders(url, base, token, tokenHosts, anonBearerToken) {
200
+ const headers = { ...base };
201
+ if (anonBearerToken !== undefined) {
202
+ headers['authorization'] = `Bearer ${anonBearerToken}`;
203
+ }
204
+ else if (token !== undefined && tokenHosts !== undefined && tokenHosts.includes(url.host)) {
205
+ headers['authorization'] = `Bearer ${token}`;
206
+ }
207
+ return headers;
208
+ }
209
+ function parseBearerChallenge(headerValue) {
210
+ if (headerValue === undefined)
211
+ return undefined;
212
+ const m = /^\s*Bearer\s+(.*)$/i.exec(headerValue);
213
+ if (m?.[1] === undefined)
214
+ return undefined;
215
+ const params = {};
216
+ const re = /(\w+)="([^"]*)"/g;
217
+ let mm = re.exec(m[1]);
218
+ while (mm !== null) {
219
+ if (mm[1] !== undefined && mm[2] !== undefined)
220
+ params[mm[1]] = mm[2];
221
+ mm = re.exec(m[1]);
222
+ }
223
+ if (params['realm'] === undefined)
224
+ return undefined;
225
+ return { realm: params['realm'], service: params['service'], scope: params['scope'] };
226
+ }
227
+ /** Fetches an anonymous bearer token from a mirror's realm. `undefined` on any failure — the caller falls back to a plain 401. */
228
+ async function fetchAnonymousToken(challenge, clock) {
229
+ try {
230
+ const realm = new URL(challenge.realm);
231
+ if (challenge.service !== undefined)
232
+ realm.searchParams.set('service', challenge.service);
233
+ if (challenge.scope !== undefined)
234
+ realm.searchParams.set('scope', challenge.scope);
235
+ const res = await rawRequest(realm, 'GET', {});
236
+ const body = await drain(res.stream, 1 << 20).catch(() => undefined);
237
+ void clock;
238
+ if (body === undefined || res.status !== 200)
239
+ return undefined;
240
+ const parsed = JSON.parse(body.toString('utf8'));
241
+ if (parsed === null || typeof parsed !== 'object')
242
+ return undefined;
243
+ const token = parsed['token'] ?? parsed['access_token'];
244
+ return typeof token === 'string' ? token : undefined;
245
+ }
246
+ catch {
247
+ return undefined;
248
+ }
249
+ }
250
+ /** Drains a stream into a `Buffer`. Rejects with `ArtifactCorruptError` (never retryable) past `maxBytes`, or the stream's own error otherwise. */
251
+ function drain(stream, maxBytes) {
252
+ return new Promise((resolve, reject) => {
253
+ const chunks = [];
254
+ let total = 0;
255
+ stream.on('data', (chunk) => {
256
+ total += chunk.length;
257
+ if (total > maxBytes) {
258
+ stream.destroy();
259
+ reject(new ArtifactCorruptError(`chtypes: response exceeds the ${maxBytes}-byte limit`));
260
+ return;
261
+ }
262
+ chunks.push(chunk);
263
+ });
264
+ stream.on('end', () => resolve(Buffer.concat(chunks)));
265
+ stream.on('error', reject);
266
+ });
267
+ }
268
+ /**
269
+ * GET/HEAD a small, fully-buffered object (a manifest, a referrers listing,
270
+ * `tags/list`, a bundle) — redirects, retries, the anonymous token flow, the
271
+ * system CA store and the proxy all handled. Throws
272
+ * `SourceUnauthorizedError`/`SourceForbiddenError` on a 401/403 that survives
273
+ * (neither code is retryable) and `ArtifactCorruptError` on an oversize body
274
+ * (never retryable — an oversize response is a content problem, not a
275
+ * transient one). Any other non-2xx status is returned to the caller to
276
+ * interpret (404 in particular means different things to a tag and a digest
277
+ * GET, decided in `oci.ts`).
278
+ */
279
+ export async function requestBuffered(startUrl, options) {
280
+ const method = options.method ?? 'GET';
281
+ return withRetry(options.clock, async () => {
282
+ let url = new URL(startUrl);
283
+ const firstOrigin = url;
284
+ let redirects = 0;
285
+ let bearerToken;
286
+ let triedAnonToken = false;
287
+ let authDropped = false;
288
+ options.onRequest?.(url.toString());
289
+ for (;;) {
290
+ let res;
291
+ try {
292
+ const headers = buildHeaders(url, options.headers, authDropped ? undefined : options.token, options.tokenHosts, bearerToken);
293
+ res = await rawRequest(url, method, headers);
294
+ }
295
+ catch (err) {
296
+ return {
297
+ outcome: {
298
+ ok: false,
299
+ retryable: !isDeadHostError(err),
300
+ status: undefined,
301
+ retryAfterSeconds: undefined,
302
+ message: `${method} ${url.toString()} failed: ${err.message}`,
303
+ },
304
+ };
305
+ }
306
+ if (res.status >= 300 && res.status < 400 && res.headers['location'] !== undefined) {
307
+ res.stream.resume();
308
+ if (redirects >= MAX_REDIRECTS) {
309
+ return {
310
+ outcome: {
311
+ ok: false,
312
+ retryable: false,
313
+ status: res.status,
314
+ retryAfterSeconds: undefined,
315
+ message: `too many redirects (> ${MAX_REDIRECTS}) fetching ${startUrl}`,
316
+ },
317
+ };
318
+ }
319
+ const next = new URL(res.headers['location'], url);
320
+ redirects += 1;
321
+ const crossOrigin = !isSameOrigin(firstOrigin, next) || !isSameOrigin(url, next);
322
+ url = next;
323
+ if (crossOrigin) {
324
+ // Authorization (and our own Bearer token) never survive a cross-origin hop.
325
+ authDropped = true;
326
+ bearerToken = undefined;
327
+ }
328
+ continue;
329
+ }
330
+ if (res.status === 401) {
331
+ const challenge = parseBearerChallenge(res.headers['www-authenticate']);
332
+ res.stream.resume();
333
+ if (!triedAnonToken && challenge !== undefined) {
334
+ triedAnonToken = true;
335
+ const token = await fetchAnonymousToken(challenge, options.clock);
336
+ if (token !== undefined) {
337
+ bearerToken = token;
338
+ continue;
339
+ }
340
+ }
341
+ throw new SourceUnauthorizedError(`chtypes: ${method} ${startUrl}: 401 from ${url.host}`);
342
+ }
343
+ if (res.status === 403) {
344
+ res.stream.resume();
345
+ throw new SourceForbiddenError(`chtypes: ${method} ${startUrl}: 403 from ${url.host}`);
346
+ }
347
+ if (isRetryableStatus(res.status) || (res.status === 404 && options.retryOn404 === true)) {
348
+ let retryAfterSeconds;
349
+ if (RETRY_AFTER_STATUSES.includes(res.status) && res.headers['retry-after'] !== undefined) {
350
+ retryAfterSeconds = parseRetryAfterSeconds(res.headers['retry-after'], res.headers['date'], options.clock);
351
+ }
352
+ await drain(res.stream, options.maxBytes).catch(() => undefined);
353
+ return {
354
+ outcome: {
355
+ ok: false,
356
+ retryable: true,
357
+ status: res.status,
358
+ retryAfterSeconds,
359
+ message: `${method} ${url.toString()} returned ${res.status}`,
360
+ },
361
+ };
362
+ }
363
+ let body;
364
+ try {
365
+ body = await drain(res.stream, options.maxBytes);
366
+ }
367
+ catch (err) {
368
+ if (err instanceof ArtifactCorruptError)
369
+ throw err;
370
+ return {
371
+ outcome: {
372
+ ok: false,
373
+ retryable: true,
374
+ status: res.status,
375
+ retryAfterSeconds: undefined,
376
+ message: `${method} ${url.toString()}: ${err.message}`,
377
+ },
378
+ };
379
+ }
380
+ return {
381
+ outcome: { ok: true, retryable: false, status: res.status, retryAfterSeconds: undefined, message: '' },
382
+ value: { status: res.status, headers: res.headers, url: url.toString(), body },
383
+ };
384
+ }
385
+ });
386
+ }
387
+ /**
388
+ * GET a (potentially large) object straight to a sink — the layer blob.
389
+ * Every retry **restarts the sink from scratch**: a transient failure
390
+ * partway through a download cannot be resumed, so the caller's sink
391
+ * (`unpack.ts`'s temp file + hasher) must support `reset()`. `maxBytes`
392
+ * should be the exact size the manifest's layer descriptor declares —
393
+ * exceeding it is `ArtifactCorruptError`, never retried, exactly like an
394
+ * oversize manifest.
395
+ */
396
+ export async function requestToSink(startUrl, options, sink) {
397
+ return withRetry(options.clock, async () => {
398
+ let url = new URL(startUrl);
399
+ const firstOrigin = url;
400
+ let redirects = 0;
401
+ let bearerToken;
402
+ let triedAnonToken = false;
403
+ let authDropped = false;
404
+ options.onRequest?.(url.toString());
405
+ for (;;) {
406
+ let res;
407
+ try {
408
+ const headers = buildHeaders(url, options.headers, authDropped ? undefined : options.token, options.tokenHosts, bearerToken);
409
+ res = await rawRequest(url, 'GET', headers);
410
+ }
411
+ catch (err) {
412
+ return {
413
+ outcome: {
414
+ ok: false,
415
+ retryable: !isDeadHostError(err),
416
+ status: undefined,
417
+ retryAfterSeconds: undefined,
418
+ message: `GET ${url.toString()} failed: ${err.message}`,
419
+ },
420
+ };
421
+ }
422
+ if (res.status >= 300 && res.status < 400 && res.headers['location'] !== undefined) {
423
+ res.stream.resume();
424
+ if (redirects >= MAX_REDIRECTS) {
425
+ return {
426
+ outcome: {
427
+ ok: false,
428
+ retryable: false,
429
+ status: res.status,
430
+ retryAfterSeconds: undefined,
431
+ message: `too many redirects (> ${MAX_REDIRECTS}) fetching ${startUrl}`,
432
+ },
433
+ };
434
+ }
435
+ const next = new URL(res.headers['location'], url);
436
+ redirects += 1;
437
+ const crossOrigin = !isSameOrigin(firstOrigin, next) || !isSameOrigin(url, next);
438
+ url = next;
439
+ if (crossOrigin) {
440
+ authDropped = true;
441
+ bearerToken = undefined;
442
+ }
443
+ continue;
444
+ }
445
+ if (res.status === 401) {
446
+ const challenge = parseBearerChallenge(res.headers['www-authenticate']);
447
+ res.stream.resume();
448
+ if (!triedAnonToken && challenge !== undefined) {
449
+ triedAnonToken = true;
450
+ const token = await fetchAnonymousToken(challenge, options.clock);
451
+ if (token !== undefined) {
452
+ bearerToken = token;
453
+ continue;
454
+ }
455
+ }
456
+ throw new SourceUnauthorizedError(`chtypes: GET ${startUrl}: 401 from ${url.host}`);
457
+ }
458
+ if (res.status === 403) {
459
+ res.stream.resume();
460
+ throw new SourceForbiddenError(`chtypes: GET ${startUrl}: 403 from ${url.host}`);
461
+ }
462
+ if (isRetryableStatus(res.status) || (res.status === 404 && options.retryOn404 === true)) {
463
+ let retryAfterSeconds;
464
+ if (RETRY_AFTER_STATUSES.includes(res.status) && res.headers['retry-after'] !== undefined) {
465
+ retryAfterSeconds = parseRetryAfterSeconds(res.headers['retry-after'], res.headers['date'], options.clock);
466
+ }
467
+ res.stream.resume();
468
+ return {
469
+ outcome: {
470
+ ok: false,
471
+ retryable: true,
472
+ status: res.status,
473
+ retryAfterSeconds,
474
+ message: `GET ${url.toString()} returned ${res.status}`,
475
+ },
476
+ };
477
+ }
478
+ if (res.status !== 200 && res.status !== 206) {
479
+ res.stream.resume();
480
+ return {
481
+ outcome: { ok: true, retryable: false, status: res.status, retryAfterSeconds: undefined, message: '' },
482
+ value: { status: res.status, headers: res.headers, url: url.toString(), size: 0 },
483
+ };
484
+ }
485
+ sink.reset();
486
+ let size = 0;
487
+ let oversize = false;
488
+ try {
489
+ await new Promise((resolve, reject) => {
490
+ res.stream.on('data', (chunk) => {
491
+ size += chunk.length;
492
+ if (size > options.maxBytes) {
493
+ oversize = true;
494
+ res.stream.destroy();
495
+ reject(new ArtifactCorruptError(`chtypes: layer exceeds the ${options.maxBytes}-byte limit`));
496
+ return;
497
+ }
498
+ sink.write(chunk);
499
+ });
500
+ res.stream.on('end', resolve);
501
+ res.stream.on('error', reject);
502
+ });
503
+ }
504
+ catch (err) {
505
+ if (oversize)
506
+ throw err;
507
+ return {
508
+ outcome: {
509
+ ok: false,
510
+ retryable: true,
511
+ status: res.status,
512
+ retryAfterSeconds: undefined,
513
+ message: `GET ${url.toString()}: ${err.message}`,
514
+ },
515
+ };
516
+ }
517
+ return {
518
+ outcome: { ok: true, retryable: false, status: res.status, retryAfterSeconds: undefined, message: '' },
519
+ value: { status: res.status, headers: res.headers, url: url.toString(), size },
520
+ };
521
+ }
522
+ });
523
+ }
524
+ /**
525
+ * Reads a `file://` base directly — no retry, no redirect, no query string
526
+ * ever appended (a fixture rule: a route tree served from `file://` is a
527
+ * plain static tree). ENOENT reads as a 404 so callers share one not-found
528
+ * path across transports. An oversize file is `ArtifactCorruptError`, the
529
+ * same verdict a too-large network response gets.
530
+ */
531
+ export async function readFileUrl(url, maxBytes) {
532
+ const filePath = fileURLToPath(url);
533
+ try {
534
+ const body = await readFile(filePath);
535
+ if (body.length > maxBytes) {
536
+ throw new ArtifactCorruptError(`chtypes: ${filePath} exceeds the ${maxBytes}-byte limit`);
537
+ }
538
+ return { status: 200, headers: {}, url, body };
539
+ }
540
+ catch (err) {
541
+ if (err instanceof ArtifactCorruptError)
542
+ throw err;
543
+ if (err.code === 'ENOENT') {
544
+ return { status: 404, headers: {}, url, body: Buffer.alloc(0) };
545
+ }
546
+ throw err;
547
+ }
548
+ }
549
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/ocifetch/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The v1 fetch layer's public surface: the seam (`docs/guides/fetch-v1.md`
3
+ * §9) and the types a caller needs to use it. Nothing outside this module
4
+ * imports from `./oci.js`, `./dsse.js`, `./http.js`, `./unpack.js`,
5
+ * `./layout.js` or `./lock.js` directly — the FFI/loader lane (not yet
6
+ * built) wires `resolve_installed` and `ensure` in through here once it
7
+ * lands.
8
+ */
9
+ export { keyIdOfRawKey } from './dsse.js';
10
+ export { cacheRoot } from './layout.js';
11
+ export { ensure, fetchSigned, listInstalled, listTags, resolveInstalled, verifyInstalled } from './ensure.js';
12
+ export type { FetchSignedResult } from './ensure.js';
13
+ export { ArtifactCorruptError, ArtifactMissingError, ArtifactPinnedError, ArtifactUnpublishedError, ArtifactUntrustedError, FetchV1Error, SourceForbiddenError, SourceIncompatibleError, SourceUnauthorizedError, SourceUnreachableError, } from './errors.js';
14
+ export type { FetchV1ErrorCode } from './errors.js';
15
+ export type { ArtifactPredicate, Clock, FetchV1Options, PlatformKey, Resolved, ResolvedDigests, TrustedKey, VerifyResult, } from './types.js';
16
+ export { hostPlatformKey, isPlatformKey, realClock } from './types.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ocifetch/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9G,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,EACZ,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EACV,iBAAiB,EACjB,KAAK,EACL,cAAc,EACd,WAAW,EACX,QAAQ,EACR,eAAe,EACf,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The v1 fetch layer's public surface: the seam (`docs/guides/fetch-v1.md`
3
+ * §9) and the types a caller needs to use it. Nothing outside this module
4
+ * imports from `./oci.js`, `./dsse.js`, `./http.js`, `./unpack.js`,
5
+ * `./layout.js` or `./lock.js` directly — the FFI/loader lane (not yet
6
+ * built) wires `resolve_installed` and `ensure` in through here once it
7
+ * lands.
8
+ */
9
+ export { keyIdOfRawKey } from './dsse.js';
10
+ export { cacheRoot } from './layout.js';
11
+ export { ensure, fetchSigned, listInstalled, listTags, resolveInstalled, verifyInstalled } from './ensure.js';
12
+ export { ArtifactCorruptError, ArtifactMissingError, ArtifactPinnedError, ArtifactUnpublishedError, ArtifactUntrustedError, FetchV1Error, SourceForbiddenError, SourceIncompatibleError, SourceUnauthorizedError, SourceUnreachableError, } from './errors.js';
13
+ export { hostPlatformKey, isPlatformKey, realClock } from './types.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ocifetch/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9G,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,EACZ,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAYrB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}