@namzu/sandbox 13.0.0 → 14.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 (67) hide show
  1. package/CHANGELOG.md +309 -0
  2. package/README.md +151 -0
  3. package/dist/backends/firecracker/protocol.d.ts +22 -0
  4. package/dist/backends/firecracker/protocol.d.ts.map +1 -1
  5. package/dist/backends/firecracker/protocol.js.map +1 -1
  6. package/dist/backends/firecracker/transport.d.ts +104 -9
  7. package/dist/backends/firecracker/transport.d.ts.map +1 -1
  8. package/dist/backends/firecracker/transport.js +139 -13
  9. package/dist/backends/firecracker/transport.js.map +1 -1
  10. package/dist/backends/kubernetes/egress-policy.d.ts +219 -0
  11. package/dist/backends/kubernetes/egress-policy.d.ts.map +1 -0
  12. package/dist/backends/kubernetes/egress-policy.js +314 -0
  13. package/dist/backends/kubernetes/egress-policy.js.map +1 -0
  14. package/dist/backends/kubernetes/index.d.ts +374 -0
  15. package/dist/backends/kubernetes/index.d.ts.map +1 -0
  16. package/dist/backends/kubernetes/index.js +671 -0
  17. package/dist/backends/kubernetes/index.js.map +1 -0
  18. package/dist/backends/kubernetes/k8s-client.d.ts +125 -0
  19. package/dist/backends/kubernetes/k8s-client.d.ts.map +1 -0
  20. package/dist/backends/kubernetes/k8s-client.js +246 -0
  21. package/dist/backends/kubernetes/k8s-client.js.map +1 -0
  22. package/dist/backends/kubernetes/lease.d.ts +119 -0
  23. package/dist/backends/kubernetes/lease.d.ts.map +1 -0
  24. package/dist/backends/kubernetes/lease.js +151 -0
  25. package/dist/backends/kubernetes/lease.js.map +1 -0
  26. package/dist/backends/kubernetes/objects.d.ts +282 -0
  27. package/dist/backends/kubernetes/objects.d.ts.map +1 -0
  28. package/dist/backends/kubernetes/objects.js +156 -0
  29. package/dist/backends/kubernetes/objects.js.map +1 -0
  30. package/dist/backends/kubernetes/privilege-probe.d.ts +136 -0
  31. package/dist/backends/kubernetes/privilege-probe.d.ts.map +1 -0
  32. package/dist/backends/kubernetes/privilege-probe.js +185 -0
  33. package/dist/backends/kubernetes/privilege-probe.js.map +1 -0
  34. package/dist/backends/kubernetes/sandbox.d.ts +123 -0
  35. package/dist/backends/kubernetes/sandbox.d.ts.map +1 -0
  36. package/dist/backends/kubernetes/sandbox.js +299 -0
  37. package/dist/backends/kubernetes/sandbox.js.map +1 -0
  38. package/dist/backends/kubernetes/transport.d.ts +122 -0
  39. package/dist/backends/kubernetes/transport.d.ts.map +1 -0
  40. package/dist/backends/kubernetes/transport.js +197 -0
  41. package/dist/backends/kubernetes/transport.js.map +1 -0
  42. package/dist/backends/kubernetes/workspace.d.ts +381 -0
  43. package/dist/backends/kubernetes/workspace.d.ts.map +1 -0
  44. package/dist/backends/kubernetes/workspace.js +1064 -0
  45. package/dist/backends/kubernetes/workspace.js.map +1 -0
  46. package/dist/index.d.ts +132 -2
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +102 -34
  49. package/dist/index.js.map +1 -1
  50. package/dist/testing/sandbox-conformance.d.ts +193 -0
  51. package/dist/testing/sandbox-conformance.d.ts.map +1 -0
  52. package/dist/testing/sandbox-conformance.js +465 -0
  53. package/dist/testing/sandbox-conformance.js.map +1 -0
  54. package/package.json +5 -4
  55. package/src/backends/firecracker/protocol.ts +27 -0
  56. package/src/backends/firecracker/transport.ts +199 -28
  57. package/src/backends/kubernetes/egress-policy.ts +437 -0
  58. package/src/backends/kubernetes/index.ts +1012 -0
  59. package/src/backends/kubernetes/k8s-client.ts +352 -0
  60. package/src/backends/kubernetes/lease.ts +198 -0
  61. package/src/backends/kubernetes/objects.ts +363 -0
  62. package/src/backends/kubernetes/privilege-probe.ts +261 -0
  63. package/src/backends/kubernetes/sandbox.ts +395 -0
  64. package/src/backends/kubernetes/transport.ts +286 -0
  65. package/src/backends/kubernetes/workspace.ts +1386 -0
  66. package/src/index.ts +257 -35
  67. package/src/testing/sandbox-conformance.ts +667 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/backends/kubernetes/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Minimal Kubernetes API client: bare fetch/https transport plus in-cluster
3
+ * ServiceAccount bootstrap.
4
+ *
5
+ * Sibling of the ACI and Firecracker control-plane clients: same
6
+ * dependency-free shape, different API. No `@kubernetes/client-node`, no
7
+ * kubeconfig parsing, no exec-credential-plugin invocation, no YAML anywhere
8
+ * — `@namzu/sandbox` still declares zero runtime `dependencies` after this
9
+ * module.
10
+ *
11
+ * ## Auth / SDK-dependency boundary
12
+ * Two access sources, neither needing a YAML parser:
13
+ * - `{ inCluster: true }` reads the projected ServiceAccount volume
14
+ * (`token`, `ca.crt`, `namespace`) plus `KUBERNETES_SERVICE_HOST` /
15
+ * `KUBERNETES_SERVICE_PORT` — pure file + env reads, the same boundary
16
+ * `kubectl` itself uses inside a pod. The token file is re-read on EVERY
17
+ * request because kubelet rotates projected tokens under the pod; caching
18
+ * it would produce an intermittent 401 hours into a long-lived host
19
+ * process.
20
+ * - `{ server, ca?, getToken }` supplied by the caller mirrors ACI's
21
+ * `ArmTokenProvider` and Firecracker's `OrchestratorTokenProvider`
22
+ * (`../aci-standby-pool/index.ts`, `../firecracker/index.ts`). Kubeconfig
23
+ * parsing, context merging and exec-credential-plugin invocation
24
+ * (kubelogin, gcloud, aws-iam-authenticator, ...) all stay OUTSIDE this
25
+ * package; the caller resolves a bearer token however it likes.
26
+ *
27
+ * ## Transport
28
+ * Default path is bare global `fetch`. When a custom CA is present — always
29
+ * true in-cluster, since the cluster CA is never in the process's system
30
+ * trust store — the call goes through `node:https.request` with that `ca`
31
+ * and `rejectUnauthorized: true` instead, exactly as
32
+ * `../firecracker/index.ts` splits `fetchOrchestratorRequest` from
33
+ * `httpsOrchestratorRequest` ("the package declares no undici dependency").
34
+ *
35
+ * ## Status mapping
36
+ * 404/410 become an `AlreadyGoneError` sentinel a teardown path can treat as
37
+ * success (ACI's `armCall(..., [404, 410])` accepts the same pair for
38
+ * exactly that reason — see `../aci-standby-pool/index.ts`). 409 becomes a
39
+ * `ConflictError` an adoption/retry path can catch. 401/403 become a
40
+ * `CredentialError` naming the attempted verb and resource — never the
41
+ * token, which this module never logs or embeds in any thrown message.
42
+ *
43
+ * ## Not in v1
44
+ * No watch, no informers, no resourceVersion/bookmark tracking. Readiness is
45
+ * polled by the caller with `../readiness.js`'s `OperationDeadline`, exactly
46
+ * as ACI polls `provisioningState`.
47
+ */
48
+ /** The only verbs anything in this backend needs to send. */
49
+ export type KubernetesHttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';
50
+ /**
51
+ * Authentication callback. Caller returns a fresh bearer token. Invoked on
52
+ * every request so a long-running host survives token rotation — the same
53
+ * contract as ACI's `ArmTokenProvider` and Firecracker's
54
+ * `OrchestratorTokenProvider`.
55
+ */
56
+ export type KubernetesTokenProvider = () => Promise<string>;
57
+ /**
58
+ * In-cluster bootstrap. The token, CA and namespace come off the projected
59
+ * ServiceAccount volume; the API server address comes off the env vars the
60
+ * kubelet always sets for the pod's default-namespace Service.
61
+ */
62
+ export interface InClusterKubernetesAccess {
63
+ readonly inCluster: true;
64
+ /**
65
+ * Overridable so tests never touch the real projected-volume path.
66
+ * Defaults to `/var/run/secrets/kubernetes.io/serviceaccount`.
67
+ */
68
+ readonly serviceAccountDir?: string;
69
+ }
70
+ /**
71
+ * Caller-supplied server + credential (see {@link KubernetesTokenProvider}).
72
+ * `namespace` is required here because, unlike the in-cluster path, there is
73
+ * no ServiceAccount file to read it from — the caller must say which
74
+ * namespace this client operates in.
75
+ */
76
+ export interface ExplicitKubernetesAccess {
77
+ readonly inCluster?: false;
78
+ readonly server: string;
79
+ readonly namespace: string;
80
+ /** Custom cluster CA. Present → the client dials over `node:https`. */
81
+ readonly ca?: string | Buffer;
82
+ readonly getToken: KubernetesTokenProvider;
83
+ }
84
+ export type KubernetesAccess = InClusterKubernetesAccess | ExplicitKubernetesAccess;
85
+ export interface KubernetesClient {
86
+ /**
87
+ * `path` is the API-server path (e.g.
88
+ * `/apis/agents.x-k8s.io/v1/namespaces/ns/sandboxclaims/id`), not a full
89
+ * URL. Returns the parsed JSON body, or `undefined` for a 204 or an empty
90
+ * body. Rejects with {@link KubernetesAlreadyGoneError},
91
+ * {@link KubernetesConflictError} or {@link KubernetesCredentialError} for
92
+ * the status codes each names; any other non-2xx status rejects with a
93
+ * plain `Error`.
94
+ */
95
+ request<T>(method: KubernetesHttpMethod, path: string, body?: unknown, signal?: AbortSignal): Promise<T | undefined>;
96
+ /** From the ServiceAccount file in-cluster, from config otherwise. */
97
+ namespace(): string;
98
+ }
99
+ /** 404/410 → this. A teardown path treats it as "already achieved". */
100
+ export declare class KubernetesAlreadyGoneError extends Error {
101
+ readonly method: KubernetesHttpMethod;
102
+ readonly resource: string;
103
+ readonly status: number;
104
+ constructor(method: KubernetesHttpMethod, resource: string, status: number);
105
+ }
106
+ /** 409 → this. An adoption/retry path can catch it and re-read + retry. */
107
+ export declare class KubernetesConflictError extends Error {
108
+ readonly method: KubernetesHttpMethod;
109
+ readonly resource: string;
110
+ constructor(method: KubernetesHttpMethod, resource: string);
111
+ }
112
+ /**
113
+ * 401/403 → this. Names the attempted verb and resource only — never the
114
+ * token, and never the response body (the API server does not echo the
115
+ * token back, but the body is untrusted content this module has no reason
116
+ * to repeat into a thrown message).
117
+ */
118
+ export declare class KubernetesCredentialError extends Error {
119
+ readonly verb: KubernetesHttpMethod;
120
+ readonly resource: string;
121
+ readonly status: number;
122
+ constructor(verb: KubernetesHttpMethod, resource: string, status: number);
123
+ }
124
+ export declare function createKubernetesClient(access: KubernetesAccess): KubernetesClient;
125
+ //# sourceMappingURL=k8s-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"k8s-client.d.ts","sourceRoot":"","sources":["../../../src/backends/kubernetes/k8s-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAKH,6DAA6D;AAC7D,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEtE;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;AAE3D;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;IACxB;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CACnC;AAED;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAA;CAC1C;AAED,MAAM,MAAM,gBAAgB,GAAG,yBAAyB,GAAG,wBAAwB,CAAA;AAEnF,MAAM,WAAW,gBAAgB;IAChC;;;;;;;;OAQG;IACH,OAAO,CAAC,CAAC,EACR,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;IACzB,sEAAsE;IACtE,SAAS,IAAI,MAAM,CAAA;CACnB;AAID,uEAAuE;AACvE,qBAAa,0BAA2B,SAAQ,KAAK;IAEnD,QAAQ,CAAC,MAAM,EAAE,oBAAoB;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAFd,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;CAKxB;AAED,2EAA2E;AAC3E,qBAAa,uBAAwB,SAAQ,KAAK;IAEhD,QAAQ,CAAC,MAAM,EAAE,oBAAoB;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM;gBADhB,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,EAAE,MAAM;CAK1B;AAED;;;;;GAKG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;IAElD,QAAQ,CAAC,IAAI,EAAE,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAFd,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;CAKxB;AAoID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAkEjF"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Minimal Kubernetes API client: bare fetch/https transport plus in-cluster
3
+ * ServiceAccount bootstrap.
4
+ *
5
+ * Sibling of the ACI and Firecracker control-plane clients: same
6
+ * dependency-free shape, different API. No `@kubernetes/client-node`, no
7
+ * kubeconfig parsing, no exec-credential-plugin invocation, no YAML anywhere
8
+ * — `@namzu/sandbox` still declares zero runtime `dependencies` after this
9
+ * module.
10
+ *
11
+ * ## Auth / SDK-dependency boundary
12
+ * Two access sources, neither needing a YAML parser:
13
+ * - `{ inCluster: true }` reads the projected ServiceAccount volume
14
+ * (`token`, `ca.crt`, `namespace`) plus `KUBERNETES_SERVICE_HOST` /
15
+ * `KUBERNETES_SERVICE_PORT` — pure file + env reads, the same boundary
16
+ * `kubectl` itself uses inside a pod. The token file is re-read on EVERY
17
+ * request because kubelet rotates projected tokens under the pod; caching
18
+ * it would produce an intermittent 401 hours into a long-lived host
19
+ * process.
20
+ * - `{ server, ca?, getToken }` supplied by the caller mirrors ACI's
21
+ * `ArmTokenProvider` and Firecracker's `OrchestratorTokenProvider`
22
+ * (`../aci-standby-pool/index.ts`, `../firecracker/index.ts`). Kubeconfig
23
+ * parsing, context merging and exec-credential-plugin invocation
24
+ * (kubelogin, gcloud, aws-iam-authenticator, ...) all stay OUTSIDE this
25
+ * package; the caller resolves a bearer token however it likes.
26
+ *
27
+ * ## Transport
28
+ * Default path is bare global `fetch`. When a custom CA is present — always
29
+ * true in-cluster, since the cluster CA is never in the process's system
30
+ * trust store — the call goes through `node:https.request` with that `ca`
31
+ * and `rejectUnauthorized: true` instead, exactly as
32
+ * `../firecracker/index.ts` splits `fetchOrchestratorRequest` from
33
+ * `httpsOrchestratorRequest` ("the package declares no undici dependency").
34
+ *
35
+ * ## Status mapping
36
+ * 404/410 become an `AlreadyGoneError` sentinel a teardown path can treat as
37
+ * success (ACI's `armCall(..., [404, 410])` accepts the same pair for
38
+ * exactly that reason — see `../aci-standby-pool/index.ts`). 409 becomes a
39
+ * `ConflictError` an adoption/retry path can catch. 401/403 become a
40
+ * `CredentialError` naming the attempted verb and resource — never the
41
+ * token, which this module never logs or embeds in any thrown message.
42
+ *
43
+ * ## Not in v1
44
+ * No watch, no informers, no resourceVersion/bookmark tracking. Readiness is
45
+ * polled by the caller with `../readiness.js`'s `OperationDeadline`, exactly
46
+ * as ACI polls `provisioningState`.
47
+ */
48
+ import { readFileSync } from 'node:fs';
49
+ import https from 'node:https';
50
+ const DEFAULT_SERVICE_ACCOUNT_DIR = '/var/run/secrets/kubernetes.io/serviceaccount';
51
+ /** 404/410 → this. A teardown path treats it as "already achieved". */
52
+ export class KubernetesAlreadyGoneError extends Error {
53
+ method;
54
+ resource;
55
+ status;
56
+ constructor(method, resource, status) {
57
+ super(`kubernetes ${method} ${resource} -> ${status}: already gone`);
58
+ this.method = method;
59
+ this.resource = resource;
60
+ this.status = status;
61
+ this.name = 'KubernetesAlreadyGoneError';
62
+ }
63
+ }
64
+ /** 409 → this. An adoption/retry path can catch it and re-read + retry. */
65
+ export class KubernetesConflictError extends Error {
66
+ method;
67
+ resource;
68
+ constructor(method, resource) {
69
+ super(`kubernetes ${method} ${resource} -> 409: conflict`);
70
+ this.method = method;
71
+ this.resource = resource;
72
+ this.name = 'KubernetesConflictError';
73
+ }
74
+ }
75
+ /**
76
+ * 401/403 → this. Names the attempted verb and resource only — never the
77
+ * token, and never the response body (the API server does not echo the
78
+ * token back, but the body is untrusted content this module has no reason
79
+ * to repeat into a thrown message).
80
+ */
81
+ export class KubernetesCredentialError extends Error {
82
+ verb;
83
+ resource;
84
+ status;
85
+ constructor(verb, resource, status) {
86
+ super(`kubernetes API refused ${verb} ${resource}: ${status}`);
87
+ this.verb = verb;
88
+ this.resource = resource;
89
+ this.status = status;
90
+ this.name = 'KubernetesCredentialError';
91
+ }
92
+ }
93
+ function stripTrailingSlash(url) {
94
+ return url.endsWith('/') ? url.slice(0, -1) : url;
95
+ }
96
+ /**
97
+ * Reads `ca.crt` and `namespace` once (they do not rotate for the pod's
98
+ * lifetime); returns a `getToken` closure that re-reads `token` on every
99
+ * call, because kubelet DOES rotate the projected token under a live pod.
100
+ */
101
+ function resolveInCluster(access) {
102
+ const dir = access.serviceAccountDir ?? DEFAULT_SERVICE_ACCOUNT_DIR;
103
+ const host = process.env.KUBERNETES_SERVICE_HOST;
104
+ const port = process.env.KUBERNETES_SERVICE_PORT;
105
+ if (host === undefined || host === '' || port === undefined || port === '') {
106
+ throw new Error('kubernetes: in-cluster access requires KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT');
107
+ }
108
+ const ca = readFileSync(`${dir}/ca.crt`);
109
+ const namespace = readFileSync(`${dir}/namespace`, 'utf8').trim();
110
+ return {
111
+ baseUrl: `https://${host}:${port}`,
112
+ ca,
113
+ namespace,
114
+ getToken: async () => readFileSync(`${dir}/token`, 'utf8').trim(),
115
+ };
116
+ }
117
+ function resolveExplicit(access) {
118
+ return {
119
+ baseUrl: stripTrailingSlash(access.server),
120
+ ca: access.ca,
121
+ namespace: access.namespace,
122
+ getToken: access.getToken,
123
+ };
124
+ }
125
+ /** The plain-`fetch` path — the DEFAULT, used whenever no custom CA is set. */
126
+ async function fetchRequest(url, method, headers, payload, signal) {
127
+ const init = { method, headers };
128
+ if (payload !== undefined)
129
+ init.body = payload;
130
+ if (signal !== undefined)
131
+ init.signal = signal;
132
+ const res = await fetch(url, init);
133
+ return {
134
+ status: res.status,
135
+ contentType: res.headers.get('content-type') ?? '',
136
+ text: () => res.text(),
137
+ };
138
+ }
139
+ /**
140
+ * The custom-CA path: a `node:https` request presenting the injected `ca`
141
+ * and verifying the API server's cert against it (`rejectUnauthorized:
142
+ * true`). `node:https` is used rather than fetch+a custom dispatcher because
143
+ * the package declares no undici dependency — `node:https` is always
144
+ * importable and needs nothing added (mirrors
145
+ * `../firecracker/index.ts`'s `httpsOrchestratorRequest`).
146
+ */
147
+ function httpsRequest(url, method, headers, payload, ca, signal) {
148
+ const target = new URL(url);
149
+ return new Promise((resolve, reject) => {
150
+ const req = https.request({
151
+ protocol: target.protocol,
152
+ hostname: target.hostname,
153
+ port: target.port !== '' ? Number(target.port) : 443,
154
+ path: `${target.pathname}${target.search}`,
155
+ method,
156
+ headers,
157
+ ca,
158
+ rejectUnauthorized: true,
159
+ ...(signal !== undefined ? { signal } : {}),
160
+ }, (res) => {
161
+ const chunks = [];
162
+ res.on('data', (chunk) => chunks.push(chunk));
163
+ res.on('end', () => {
164
+ const ct = res.headers['content-type'];
165
+ resolve({
166
+ status: res.statusCode ?? 0,
167
+ contentType: Array.isArray(ct) ? (ct[0] ?? '') : (ct ?? ''),
168
+ text: async () => Buffer.concat(chunks).toString('utf8'),
169
+ });
170
+ });
171
+ res.on('error', reject);
172
+ });
173
+ req.on('error', reject);
174
+ if (payload !== undefined)
175
+ req.write(payload);
176
+ req.end();
177
+ });
178
+ }
179
+ /**
180
+ * `PATCH` always carries a JSON MERGE patch body (RFC 7386) — never
181
+ * server-side apply, never YAML. `POST` carries a plain JSON create body.
182
+ * `GET`/`DELETE` normally carry no body; if a caller ever does pass one to
183
+ * `DELETE` it is sent as plain JSON.
184
+ */
185
+ function contentTypeFor(method) {
186
+ return method === 'PATCH' ? 'application/merge-patch+json' : 'application/json';
187
+ }
188
+ export function createKubernetesClient(access) {
189
+ const resolved = access.inCluster === true ? resolveInCluster(access) : resolveExplicit(access);
190
+ async function request(method, path, body, signal) {
191
+ signal?.throwIfAborted();
192
+ const token = await resolved.getToken();
193
+ signal?.throwIfAborted();
194
+ const url = `${resolved.baseUrl}${path}`;
195
+ const payload = body !== undefined ? JSON.stringify(body) : undefined;
196
+ const headers = {
197
+ Authorization: `Bearer ${token}`,
198
+ Accept: 'application/json',
199
+ };
200
+ if (payload !== undefined)
201
+ headers['content-type'] = contentTypeFor(method);
202
+ let res;
203
+ try {
204
+ res =
205
+ resolved.ca !== undefined
206
+ ? await httpsRequest(url, method, headers, payload, resolved.ca, signal)
207
+ : await fetchRequest(url, method, headers, payload, signal);
208
+ }
209
+ catch (err) {
210
+ throw new Error(`kubernetes ${method} ${path} failed: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
211
+ }
212
+ if (res.status === 401 || res.status === 403) {
213
+ await res.text();
214
+ signal?.throwIfAborted();
215
+ throw new KubernetesCredentialError(method, path, res.status);
216
+ }
217
+ if (res.status === 404 || res.status === 410) {
218
+ await res.text();
219
+ signal?.throwIfAborted();
220
+ throw new KubernetesAlreadyGoneError(method, path, res.status);
221
+ }
222
+ if (res.status === 409) {
223
+ await res.text();
224
+ signal?.throwIfAborted();
225
+ throw new KubernetesConflictError(method, path);
226
+ }
227
+ if (res.status < 200 || res.status >= 300) {
228
+ const text = await res.text();
229
+ signal?.throwIfAborted();
230
+ throw new Error(`kubernetes ${method} ${path} -> ${res.status}: ${text}`);
231
+ }
232
+ if (res.status === 204)
233
+ return undefined;
234
+ if (res.contentType.includes('application/json')) {
235
+ const text = await res.text();
236
+ signal?.throwIfAborted();
237
+ return text.length > 0 ? JSON.parse(text) : undefined;
238
+ }
239
+ return undefined;
240
+ }
241
+ return {
242
+ request,
243
+ namespace: () => resolved.namespace,
244
+ };
245
+ }
246
+ //# sourceMappingURL=k8s-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"k8s-client.js","sourceRoot":"","sources":["../../../src/backends/kubernetes/k8s-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Lease renewal for an acquired kubernetes sandbox.
3
+ *
4
+ * Acquire stamps an ABSOLUTE `shutdownTime` (now + `claimTtlSeconds`) plus
5
+ * `shutdownPolicy: Delete` onto every object it creates. That is the leak
6
+ * guard: a host that dies mid-run costs the cluster one expiry rather than a
7
+ * sandbox that lives forever. It is also, unrenewed, a deadline on the RUN —
8
+ * a session that outlives the TTL has its pod deleted underneath it, mid
9
+ * command, with no error the host can attribute to anything.
10
+ *
11
+ * The two requirements are not in tension, they just need a second half:
12
+ * a live handle renews its own lease, and a dead host stops renewing. So
13
+ * this timer is owned by the Sandbox handle, and `destroy()` stops it.
14
+ *
15
+ * ## The shape of the timer
16
+ *
17
+ * One `setTimeout` chained per tick, never `setInterval`: a renewal PATCH
18
+ * that takes longer than the interval must not queue a second one behind
19
+ * it. The interval is HALF the TTL, so a single failed tick still leaves a
20
+ * whole half-TTL of headroom for the next one to succeed, and it is
21
+ * jittered ±10% so a hundred handles acquired in the same second do not
22
+ * PATCH the API server in the same millisecond forever after.
23
+ *
24
+ * The timer is `unref`'d: a host process that has finished its work should
25
+ * exit, not linger because a sandbox handle is still counting. A handle
26
+ * nobody destroyed then expires on the cluster's clock exactly as an
27
+ * abandoned one does, which is the behaviour the TTL exists for.
28
+ *
29
+ * ## Every tick is bounded
30
+ *
31
+ * A renewal that FAILS is survivable — it is reported and retried with half
32
+ * a TTL of headroom. A renewal that HANGS is not: the next tick is scheduled
33
+ * only after the current one settles, so a PATCH that never answers parks
34
+ * the loop forever, reports nothing, and lets the lease expire in silence —
35
+ * precisely the defect this file exists to close, moved onto the failure
36
+ * path. An API server that accepts a connection and then never responds is
37
+ * an ordinary cluster event, so each PATCH runs under its own deadline: it
38
+ * aborts the request through the signal the client already takes, and an
39
+ * expiry is then just another reported failure that retries on the next
40
+ * tick.
41
+ *
42
+ * ## What each outcome means
43
+ *
44
+ * - Success → the object's expiry moves a full TTL into the future.
45
+ * - Any error, a tick that ran out of time included → reported to
46
+ * `onRenewalError` and RETRIED on the next tick. A transient API blip
47
+ * must not tear down a working sandbox, and there is still half a TTL of
48
+ * headroom.
49
+ * - Already gone (404/410) → the object this handle owns no longer exists.
50
+ * Nothing will bring it back, so the loop stops and the handle is marked
51
+ * gone; every later call fails with a named error instead of dialing an
52
+ * address whose pod the controller has already deleted.
53
+ */
54
+ /** How far each tick pushes the expiry, and how often ticks happen. */
55
+ export interface LeaseRenewalOptions {
56
+ /** The same TTL acquire stamped. Each tick sets `now + ttlSeconds`. */
57
+ readonly ttlSeconds: number;
58
+ /**
59
+ * Send the merge patch. Rejects with whatever the client rejects with.
60
+ *
61
+ * The `signal` is the tick's own deadline and IS passed on every call —
62
+ * an implementation that drops it still gets abandoned on time, but its
63
+ * socket then stays open until the peer or the OS closes it.
64
+ */
65
+ readonly renew: (shutdownTime: string, signal?: AbortSignal) => Promise<void>;
66
+ /** Called once, when the renewed object turns out to be gone. */
67
+ readonly onGone: () => void;
68
+ /**
69
+ * Every renewal failure that is not "already gone". `@namzu/sandbox` has
70
+ * no logger of its own and reads none from module scope, so a diagnostic
71
+ * this package cannot print is handed to the caller that can.
72
+ */
73
+ readonly onRenewalError?: (error: unknown) => void;
74
+ /**
75
+ * Base interval between ticks. Defaults to half the TTL. Present so a
76
+ * test can drive many ticks in a few milliseconds without pretending a
77
+ * sub-second TTL is a realistic configuration.
78
+ */
79
+ readonly intervalMs?: number;
80
+ /**
81
+ * How long ONE renewal PATCH may take before it is abandoned and retried.
82
+ * Defaults to a quarter of the interval, capped at
83
+ * {@link MAX_RENEWAL_TIMEOUT_MS} — a fraction rather than the whole
84
+ * interval so that a stalled API server still leaves the loop several
85
+ * attempts inside the half-TTL of headroom.
86
+ */
87
+ readonly patchTimeoutMs?: number;
88
+ /** Deterministic jitter for tests. Defaults to `Math.random`. */
89
+ readonly random?: () => number;
90
+ }
91
+ export declare function jitteredInterval(baseMs: number, random: () => number): number;
92
+ /**
93
+ * The renewal loop. Start it when the handle is handed out, stop it on
94
+ * `destroy()`. Both are idempotent.
95
+ */
96
+ export declare class KubernetesLeaseRenewal {
97
+ private readonly options;
98
+ private timer;
99
+ private stopped;
100
+ private started;
101
+ private readonly baseIntervalMs;
102
+ private readonly patchTimeoutMs;
103
+ private readonly random;
104
+ constructor(options: LeaseRenewalOptions);
105
+ /**
106
+ * The loop is alive: it has been started and not stopped. Deliberately
107
+ * NOT "a timer is pending" — `tick()` clears the timer before it awaits,
108
+ * so a liveness check written that way reads false for the whole duration
109
+ * of an in-flight renewal and would quietly pass against a loop that had
110
+ * parked forever inside one.
111
+ */
112
+ get active(): boolean;
113
+ start(): void;
114
+ stop(): void;
115
+ private schedule;
116
+ /** Exposed for tests: one renewal attempt plus its scheduling decision. */
117
+ tick(): Promise<void>;
118
+ }
119
+ //# sourceMappingURL=lease.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lease.d.ts","sourceRoot":"","sources":["../../../src/backends/kubernetes/lease.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAKH,uEAAuE;AACvE,MAAM,WAAW,mBAAmB;IACnC,uEAAuE;IACvE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7E,iEAAiE;IACjE,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAA;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClD;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,iEAAiE;IACjE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAA;CAC9B;AAaD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,MAAM,GAAG,MAAM,CAI7E;AAED;;;GAGG;AACH,qBAAa,sBAAsB;IAQtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpC,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAER,OAAO,EAAE,mBAAmB;IAQzD;;;;;;OAMG;IACH,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI;IAQZ,OAAO,CAAC,QAAQ;IAahB,2EAA2E;IACrE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA0B3B"}