@substrat-run/control-plane-api 0.146.0 → 0.148.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 (69) hide show
  1. package/dist/api.d.ts +69 -1
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +986 -383
  4. package/dist/api.js.map +1 -1
  5. package/dist/browser.d.ts +1 -1
  6. package/dist/browser.d.ts.map +1 -1
  7. package/dist/browser.js.map +1 -1
  8. package/dist/deploy.d.ts +46 -0
  9. package/dist/deploy.d.ts.map +1 -1
  10. package/dist/deploy.js +53 -1
  11. package/dist/deploy.js.map +1 -1
  12. package/dist/errors.d.ts +19 -1
  13. package/dist/errors.d.ts.map +1 -1
  14. package/dist/errors.js +18 -4
  15. package/dist/errors.js.map +1 -1
  16. package/dist/index.d.ts +10 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +6 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/lake-gateway.d.ts +54 -0
  21. package/dist/lake-gateway.d.ts.map +1 -0
  22. package/dist/lake-gateway.js +158 -0
  23. package/dist/lake-gateway.js.map +1 -0
  24. package/dist/platform-entry.d.ts +23 -1
  25. package/dist/platform-entry.d.ts.map +1 -1
  26. package/dist/platform-entry.generated.d.ts +9 -1
  27. package/dist/platform-entry.generated.d.ts.map +1 -1
  28. package/dist/platform-entry.generated.js +10 -2
  29. package/dist/platform-entry.generated.js.map +1 -1
  30. package/dist/platform-entry.js +31 -1
  31. package/dist/platform-entry.js.map +1 -1
  32. package/dist/platform-scope-stores.d.ts +151 -0
  33. package/dist/platform-scope-stores.d.ts.map +1 -0
  34. package/dist/platform-scope-stores.js +241 -0
  35. package/dist/platform-scope-stores.js.map +1 -0
  36. package/dist/r2-sql-engine.d.ts +50 -0
  37. package/dist/r2-sql-engine.d.ts.map +1 -0
  38. package/dist/r2-sql-engine.js +126 -0
  39. package/dist/r2-sql-engine.js.map +1 -0
  40. package/dist/scope-copy-cleanup.d.ts +12 -0
  41. package/dist/scope-copy-cleanup.d.ts.map +1 -1
  42. package/dist/scope-copy-cleanup.js +14 -3
  43. package/dist/scope-copy-cleanup.js.map +1 -1
  44. package/dist/staff-client.d.ts +9 -1
  45. package/dist/staff-client.d.ts.map +1 -1
  46. package/dist/staff-client.js.map +1 -1
  47. package/dist/store-entry.d.ts +90 -0
  48. package/dist/store-entry.d.ts.map +1 -0
  49. package/dist/store-entry.generated.d.ts +60 -0
  50. package/dist/store-entry.generated.d.ts.map +1 -0
  51. package/dist/store-entry.generated.js +62 -0
  52. package/dist/store-entry.generated.js.map +1 -0
  53. package/dist/store-entry.js +178 -0
  54. package/dist/store-entry.js.map +1 -0
  55. package/dist/store-releases.d.ts +147 -0
  56. package/dist/store-releases.d.ts.map +1 -0
  57. package/dist/store-releases.js +298 -0
  58. package/dist/store-releases.js.map +1 -0
  59. package/dist/store-script.d.ts +80 -0
  60. package/dist/store-script.d.ts.map +1 -0
  61. package/dist/store-script.js +173 -0
  62. package/dist/store-script.js.map +1 -0
  63. package/dist/vertical-client.d.ts +19 -2
  64. package/dist/vertical-client.d.ts.map +1 -1
  65. package/dist/vertical-client.js +10 -1
  66. package/dist/vertical-client.js.map +1 -1
  67. package/dist/wfp.js +1 -1
  68. package/dist/wfp.js.map +1 -1
  69. package/package.json +7 -6
@@ -0,0 +1,241 @@
1
+ import { LIST_PAGE_MAX, mayHoldScopeStores, scopeStoresDeclaredIn, STORE_KINDS, issueScopeStoreEnvelope, SCOPE_STORE_ENVELOPE_HEADER, SCOPE_STORE_SIGNATURE_HEADER, ScopeStoreKeyError, scopeStoreObjectName, scopeStoreScriptName, storeEraseResult, storeExportResult, storeSizeResult, StoreError, } from '@substrat-run/contracts';
2
+ import { callReservedStoreOperation } from '@substrat-run/kernel';
3
+ import { ControlPlaneError } from '@substrat-run/control-plane-client';
4
+ import { storedDeployManifest } from './deploy.js';
5
+ /** Bindings a version manifest declares. Missing JSON is none. Unreadable JSON fails closed. */
6
+ export function declaredStoresOf(manifestJson) {
7
+ if (!manifestJson)
8
+ return [];
9
+ let raw;
10
+ try {
11
+ raw = JSON.parse(manifestJson);
12
+ }
13
+ catch {
14
+ throw new ControlPlaneError(503, 'scope store declarations could not be read');
15
+ }
16
+ const parsed = storedDeployManifest.safeParse(raw);
17
+ if (!parsed.success) {
18
+ throw new ControlPlaneError(503, 'scope store declarations could not be read');
19
+ }
20
+ return parsed.data.scopeStores;
21
+ }
22
+ export async function runningVersionOf(admin, actor, scope) {
23
+ if (!scope.vertical || !scope.servingRef)
24
+ return { versionId: scope.verticalVersionId };
25
+ let pointer;
26
+ try {
27
+ pointer = await admin.verticalServing(actor, scope.vertical);
28
+ }
29
+ catch {
30
+ throw new ControlPlaneError(503, `the serving pointer of '${scope.vertical}' could not be read`);
31
+ }
32
+ const servingPointer = pointer ? { ref: pointer.ref, versionId: pointer.versionId } : null;
33
+ return { versionId: servingPointer?.ref === scope.servingRef ? servingPointer.versionId : null, servingPointer };
34
+ }
35
+ /**
36
+ * Stop the router serving a scope, before its stores are wiped (#2285, L6). The router admits a
37
+ * scope only while one of its hostnames is `active`, and it reads that row on every request, so
38
+ * unbinding is immediate. Unbind is idempotent: a retry after a failed wipe finds nothing left
39
+ * to remove. A hostname set merely non-active would not hold — the issuance reconcile heals a
40
+ * platform hostname back to `active`.
41
+ */
42
+ export async function unrouteScope(admin, actor, scope) {
43
+ // Every page: an unbind deletes the row, so each read starts again from the first hostname left.
44
+ // A row still listed after its unbind would loop forever, so it refuses instead.
45
+ const unbound = new Set();
46
+ for (;;) {
47
+ const page = await admin.listHostnames(actor, { tenantId: scope.tenantId, scopeId: scope.id, limit: LIST_PAGE_MAX });
48
+ if (page.length === 0)
49
+ return;
50
+ for (const { hostname } of page) {
51
+ if (unbound.has(hostname))
52
+ throw new Error(`hostname '${hostname}' is still bound after its unbind`);
53
+ // Only while the row still names this scope: a name rebound elsewhere since the list stays bound.
54
+ await admin.unbindHostname(actor, hostname, { tenantId: scope.tenantId, scopeId: scope.id });
55
+ unbound.add(hostname);
56
+ }
57
+ }
58
+ }
59
+ /**
60
+ * The scope stores of the version a scope's deployment runs (#2207). A scope on its vertical's
61
+ * serving pin runs the serving pointer's version, and any other scope its bound version; this
62
+ * is the version the router reads a scope's stores from (`READ_ROUTE_SQL`), and the one a restore
63
+ * may import into (L8). The lifecycle reaches more: `scopeStoresOf`. Provisioning sets the
64
+ * serving pin and no bound version, so reading the bound version alone answers "no store" for an
65
+ * ordinary install whose store the router serves. A pin that names another script than the
66
+ * pointer's is unknown, as #2242's erasure gate has it.
67
+ *
68
+ * The gate is `mayHoldScopeStores`: with no kind registered nothing can hold a store, and the
69
+ * answer is none. Otherwise a version that cannot be named, a manifest that cannot be read, or one
70
+ * the gate says may hold a store without naming it refuses (503), rather than let a backup, a
71
+ * wipe, a replay or an erasure skip a store that may hold data.
72
+ *
73
+ * `running` is a resolution the caller already holds (`runningVersionOf`), so a caller that fences
74
+ * on the version reads it once and judges the stores against the same read.
75
+ */
76
+ export async function runningVersionStoresOf(admin, actor, scope, kinds = STORE_KINDS, running) {
77
+ if (!scope.vertical || !mayHoldScopeStores(undefined, kinds))
78
+ return [];
79
+ const { versionId } = running ?? await runningVersionOf(admin, actor, scope);
80
+ const manifestJson = versionId
81
+ ? await admin.versionManifest(actor, scope.vertical, versionId).catch(() => undefined)
82
+ : undefined;
83
+ if (!mayHoldScopeStores(manifestJson, kinds))
84
+ return [];
85
+ const declared = typeof manifestJson === 'string' && scopeStoresDeclaredIn(manifestJson) ? declaredStoresOf(manifestJson) : [];
86
+ if (declared.length > 0)
87
+ return declared;
88
+ throw new ControlPlaneError(503, `scope ${scope.id} may hold scope stores, and the version it runs cannot say which`);
89
+ }
90
+ /**
91
+ * What the lifecycle reaches for a scope (#2286, L17): the running version's stores
92
+ * (`runningVersionStoresOf`, which still fails closed first), and every binding any version of its
93
+ * vertical has declared (`HostAdmin.verticalScopeStores`, read by its keys). Export, wipe, erasure
94
+ * and the meter reach `all`, so an object under a binding a later version dropped is still
95
+ * reached. A restore imports only into `running` (L8).
96
+ *
97
+ * A binding keeps its kind for the life of the vertical, since publish refuses a re-kind; a
98
+ * running version whose kind disagrees with the record, or a record that cannot be read,
99
+ * refuses (503).
100
+ */
101
+ export async function scopeStoreReachOf(admin, actor, scope, kinds = STORE_KINDS, running) {
102
+ const current = await runningVersionStoresOf(admin, actor, scope, kinds, running);
103
+ if (!scope.vertical || !mayHoldScopeStores(undefined, kinds))
104
+ return { running: current, all: current };
105
+ let declared;
106
+ try {
107
+ declared = await admin.verticalScopeStores(actor, scope.vertical);
108
+ }
109
+ catch {
110
+ throw new ControlPlaneError(503, `the scope stores '${scope.vertical}' has declared could not be read`);
111
+ }
112
+ const all = new Map(declared.map((store) => [store.binding, store.kind]));
113
+ for (const store of current) {
114
+ const kind = all.get(store.binding);
115
+ if (kind !== undefined && kind !== store.kind) {
116
+ throw new ControlPlaneError(503, `scope store '${store.binding}' is declared as both '${kind}' and '${store.kind}'`);
117
+ }
118
+ all.set(store.binding, store.kind);
119
+ }
120
+ return { running: current, all: [...all].map(([binding, kind]) => ({ binding, kind })) };
121
+ }
122
+ /** `scopeStoreReachOf`'s `all`: every store the lifecycle reaches for a scope (#2286). */
123
+ export async function scopeStoresOf(admin, actor, scope, kinds = STORE_KINDS, running) {
124
+ return (await scopeStoreReachOf(admin, actor, scope, kinds, running)).all;
125
+ }
126
+ function asControlPlane(error) {
127
+ if (error instanceof StoreError) {
128
+ throw new ControlPlaneError(error.storeStatus, error.message);
129
+ }
130
+ throw error;
131
+ }
132
+ /** Sign the envelope and POST the reserved operation at that kind's script. */
133
+ export async function callPlatformScopeStore(dispatch, target, operation, input) {
134
+ return callPlatformScopeStoreAt(dispatch, {
135
+ scriptName: scopeStoreScriptName(target.vertical, target.kind),
136
+ objectName: scopeStoreObjectName(target.tenantId, target.vertical, target.scopeId, target.binding),
137
+ }, operation, input);
138
+ }
139
+ /**
140
+ * The same call at a named script and object: the platform's canary (#2300), which no
141
+ * (vertical, scope) names. Its answer is parsed as every reserved answer is.
142
+ */
143
+ export async function callPlatformScopeStoreAt(dispatch, target, operation, input) {
144
+ if (!dispatch.platformKey) {
145
+ throw new ControlPlaneError(503, 'this control plane holds no scope-store key');
146
+ }
147
+ const { scriptName, objectName } = target;
148
+ try {
149
+ return await callReservedStoreOperation(async (request) => {
150
+ const body = JSON.stringify({ ...request, objectName });
151
+ let issued;
152
+ try {
153
+ issued = await issueScopeStoreEnvelope({
154
+ privateKey: dispatch.platformKey,
155
+ aud: 'platform',
156
+ script: scriptName,
157
+ name: objectName,
158
+ op: request.operation,
159
+ body,
160
+ });
161
+ }
162
+ catch (error) {
163
+ if (!(error instanceof ScopeStoreKeyError))
164
+ throw error;
165
+ // Set but unusable, e.g. a raw key where PKCS8 belongs. The message never carries the key.
166
+ console.warn(`scope store call refused: STORE_PLATFORM_KEY is set but unusable (${error.message})`);
167
+ throw new ControlPlaneError(503, 'this control plane holds no usable scope-store key');
168
+ }
169
+ const response = await dispatch.fetch(scriptName, new Request('https://scope-store/invoke', {
170
+ method: 'POST',
171
+ headers: {
172
+ 'content-type': 'application/json',
173
+ [SCOPE_STORE_ENVELOPE_HEADER]: issued.header,
174
+ [SCOPE_STORE_SIGNATURE_HEADER]: issued.signature,
175
+ },
176
+ body,
177
+ }));
178
+ try {
179
+ return await response.json();
180
+ }
181
+ catch {
182
+ return null;
183
+ }
184
+ }, operation, input);
185
+ }
186
+ catch (error) {
187
+ asControlPlane(error);
188
+ }
189
+ }
190
+ /** The five reserved operations, one call per declared binding. */
191
+ export function platformScopeStoresFor(dispatch) {
192
+ const call = (target, operation, input) => callPlatformScopeStore(dispatch, target, operation, input);
193
+ return {
194
+ async exportStores({ tenantId, scopeId, vertical, stores }) {
195
+ const exported = [];
196
+ for (const store of stores) {
197
+ const { tables } = storeExportResult.parse(await call({ ...store, tenantId, scopeId, vertical }, 'substrat.export'));
198
+ exported.push({ binding: store.binding, kind: store.kind, tables });
199
+ }
200
+ return exported;
201
+ },
202
+ async importStores({ tenantId, scopeId, vertical, stores }) {
203
+ for (const store of stores) {
204
+ await call({ ...store, tenantId, scopeId, vertical }, 'substrat.import', { tables: store.tables });
205
+ }
206
+ },
207
+ async eraseSubject({ tenantId, scopeId, vertical, subjectId, stores }) {
208
+ const erased = [];
209
+ for (const store of stores) {
210
+ const { erased: count } = storeEraseResult.parse(await call({ ...store, tenantId, scopeId, vertical }, 'substrat.erase', { subjectId }));
211
+ erased.push({ binding: store.binding, erased: count });
212
+ }
213
+ return erased;
214
+ },
215
+ async wipeStores({ tenantId, scopeId, vertical, stores }) {
216
+ for (const store of stores) {
217
+ await call({ ...store, tenantId, scopeId, vertical }, 'substrat.wipe');
218
+ }
219
+ },
220
+ async sizeStores({ tenantId, scopeId, vertical, stores }) {
221
+ const sizes = [];
222
+ for (const store of stores) {
223
+ const { bytes } = storeSizeResult.parse(await call({ ...store, tenantId, scopeId, vertical }, 'substrat.size'));
224
+ sizes.push({ binding: store.binding, bytes });
225
+ }
226
+ return sizes;
227
+ },
228
+ };
229
+ }
230
+ /**
231
+ * The caller of a hosted control plane that has no route to the store scripts (#2207): every
232
+ * call is refused (503). A hosted control plane always passes a caller, this one included, so
233
+ * a missing route refuses the backup, wipe or erasure that needs a store instead of skipping it.
234
+ */
235
+ export function unreachablePlatformScopeStores() {
236
+ const refuse = async () => {
237
+ throw new ControlPlaneError(503, 'this control plane cannot reach scope stores');
238
+ };
239
+ return { exportStores: refuse, importStores: refuse, eraseSubject: refuse, wipeStores: refuse, sizeStores: refuse };
240
+ }
241
+ //# sourceMappingURL=platform-scope-stores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-scope-stores.js","sourceRoot":"","sources":["../src/platform-scope-stores.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { LakeQueryEngine } from './lake-gateway.js';
2
+ export interface R2SqlEngineOptions {
3
+ accountId: string;
4
+ /** The lake's bucket — `LAKE.bucket` in `scripts/lake-provision.mjs`. */
5
+ bucket: string;
6
+ /** The query token the secrets tooling pushes as `R2_SQL_TOKEN` (`secrets/README.md`). */
7
+ token: string;
8
+ /** Injected for tests. */
9
+ fetchImpl?: typeof fetch;
10
+ /** Injected for tests; `LAKE_QUERY_TIMEOUT_MS` otherwise. */
11
+ timeoutMs?: number;
12
+ /** Injected for tests; `LAKE_RESPONSE_MAX_BYTES` otherwise. */
13
+ maxResponseBytes?: number;
14
+ }
15
+ /**
16
+ * How long one lake query may take, request and body together. R2 SQL is open beta and
17
+ * names heavy queries as a timeout risk; without a bound, a stalled answer holds the
18
+ * control-plane request open until the platform cuts it, and the caller gets a generic
19
+ * failure instead of the gateway's 502.
20
+ */
21
+ export declare const LAKE_QUERY_TIMEOUT_MS = 30000;
22
+ /**
23
+ * The largest answer the engine will read. A page is at most `LAKE_EVENTS_LIMIT_MAX` + 1
24
+ * envelope rows, around a kilobyte each, so 4 MiB is far above any honest answer. Anything
25
+ * bigger is refused before it is parsed, never parsed and then trimmed.
26
+ */
27
+ export declare const LAKE_RESPONSE_MAX_BYTES: number;
28
+ /** A query R2 SQL refused or could not run. The message is Cloudflare's, never a row. */
29
+ export declare class LakeQueryError extends Error {
30
+ constructor(message: string);
31
+ }
32
+ /**
33
+ * The R2 SQL implementation of `LakeQueryEngine` — the Cloudflare row of kernel-design's
34
+ * adapter table ("Query gateway engine | R2 SQL").
35
+ *
36
+ * **Unverified against the real lake.** The endpoint and the response envelope below are
37
+ * written from Cloudflare's documented shape (`POST …/r2-sql/query/<bucket>` with
38
+ * `{ query }`, answering `{ success, errors, result: { rows } }`), and no run in this repo
39
+ * has exercised them. Until a human has, the control plane is deployed without the bucket
40
+ * var that turns this on, and the gateway's route answers 501.
41
+ *
42
+ * **Which permissions the token needs is unverified too.** It is provisioned today as an R2
43
+ * "Admin Read only" token scoped to the lake bucket. Cloudflare's R2 SQL docs list catalog,
44
+ * storage and R2 SQL permissions for a query token, and their example grants storage read
45
+ * and write, so whether read-only is enough has not been checked. The smoke test that turns
46
+ * this engine on establishes the smallest set that works. This client never writes; the
47
+ * gateway only ever sends the SELECT it compiled.
48
+ */
49
+ export declare function createR2SqlEngine(opts: R2SqlEngineOptions): LakeQueryEngine;
50
+ //# sourceMappingURL=r2-sql-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"r2-sql-engine.d.ts","sourceRoot":"","sources":["../src/r2-sql-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,QAAkB,CAAC;AAEvD,yFAAyF;AACzF,qBAAa,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAqCD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,eAAe,CAiD3E"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * How long one lake query may take, request and body together. R2 SQL is open beta and
3
+ * names heavy queries as a timeout risk; without a bound, a stalled answer holds the
4
+ * control-plane request open until the platform cuts it, and the caller gets a generic
5
+ * failure instead of the gateway's 502.
6
+ */
7
+ export const LAKE_QUERY_TIMEOUT_MS = 30_000;
8
+ /**
9
+ * The largest answer the engine will read. A page is at most `LAKE_EVENTS_LIMIT_MAX` + 1
10
+ * envelope rows, around a kilobyte each, so 4 MiB is far above any honest answer. Anything
11
+ * bigger is refused before it is parsed, never parsed and then trimmed.
12
+ */
13
+ export const LAKE_RESPONSE_MAX_BYTES = 4 * 1024 * 1024;
14
+ /** A query R2 SQL refused or could not run. The message is Cloudflare's, never a row. */
15
+ export class LakeQueryError extends Error {
16
+ constructor(message) {
17
+ super(message);
18
+ this.name = 'LakeQueryError';
19
+ }
20
+ }
21
+ /**
22
+ * The response body as text, refused once it passes `maxBytes`: up front when the
23
+ * `content-length` says so, and while streaming when it does not (a chunked answer has none),
24
+ * cancelling the rest rather than reading it.
25
+ */
26
+ async function readCapped(res, maxBytes) {
27
+ const tooLarge = () => new LakeQueryError(`R2 SQL answer exceeds ${maxBytes} bytes; refused before parsing`);
28
+ const declared = Number(res.headers.get('content-length'));
29
+ if (Number.isFinite(declared) && declared > maxBytes) {
30
+ await res.body?.cancel();
31
+ throw tooLarge();
32
+ }
33
+ if (!res.body)
34
+ return '';
35
+ const reader = res.body.getReader();
36
+ const chunks = [];
37
+ let total = 0;
38
+ for (;;) {
39
+ const { done, value } = await reader.read();
40
+ if (done)
41
+ break;
42
+ total += value.byteLength;
43
+ if (total > maxBytes) {
44
+ await reader.cancel();
45
+ throw tooLarge();
46
+ }
47
+ chunks.push(value);
48
+ }
49
+ const all = new Uint8Array(total);
50
+ let at = 0;
51
+ for (const c of chunks) {
52
+ all.set(c, at);
53
+ at += c.byteLength;
54
+ }
55
+ return new TextDecoder().decode(all);
56
+ }
57
+ /**
58
+ * The R2 SQL implementation of `LakeQueryEngine` — the Cloudflare row of kernel-design's
59
+ * adapter table ("Query gateway engine | R2 SQL").
60
+ *
61
+ * **Unverified against the real lake.** The endpoint and the response envelope below are
62
+ * written from Cloudflare's documented shape (`POST …/r2-sql/query/<bucket>` with
63
+ * `{ query }`, answering `{ success, errors, result: { rows } }`), and no run in this repo
64
+ * has exercised them. Until a human has, the control plane is deployed without the bucket
65
+ * var that turns this on, and the gateway's route answers 501.
66
+ *
67
+ * **Which permissions the token needs is unverified too.** It is provisioned today as an R2
68
+ * "Admin Read only" token scoped to the lake bucket. Cloudflare's R2 SQL docs list catalog,
69
+ * storage and R2 SQL permissions for a query token, and their example grants storage read
70
+ * and write, so whether read-only is enough has not been checked. The smoke test that turns
71
+ * this engine on establishes the smallest set that works. This client never writes; the
72
+ * gateway only ever sends the SELECT it compiled.
73
+ */
74
+ export function createR2SqlEngine(opts) {
75
+ const fetchImpl = opts.fetchImpl ?? fetch;
76
+ const timeoutMs = opts.timeoutMs ?? LAKE_QUERY_TIMEOUT_MS;
77
+ const maxBytes = opts.maxResponseBytes ?? LAKE_RESPONSE_MAX_BYTES;
78
+ const url = `https://api.sql.cloudflarestorage.com/api/v1/accounts/${encodeURIComponent(opts.accountId)}` +
79
+ `/r2-sql/query/${encodeURIComponent(opts.bucket)}`;
80
+ return {
81
+ async query(sql) {
82
+ let res;
83
+ let text;
84
+ try {
85
+ // One signal for the request AND the body read: a server that answers its headers
86
+ // promptly and then stalls the body is the same stall.
87
+ res = await fetchImpl(url, {
88
+ method: 'POST',
89
+ headers: { authorization: `Bearer ${opts.token}`, 'content-type': 'application/json' },
90
+ body: JSON.stringify({ query: sql }),
91
+ signal: AbortSignal.timeout(timeoutMs),
92
+ });
93
+ text = await readCapped(res, maxBytes);
94
+ }
95
+ catch (err) {
96
+ if (err instanceof LakeQueryError)
97
+ throw err;
98
+ const name = err?.name;
99
+ if (name === 'TimeoutError' || name === 'AbortError') {
100
+ throw new LakeQueryError(`R2 SQL query timed out after ${timeoutMs} ms`);
101
+ }
102
+ throw new LakeQueryError(`R2 SQL request failed: ${err?.message ?? String(err)}`);
103
+ }
104
+ let body;
105
+ try {
106
+ body = JSON.parse(text);
107
+ }
108
+ catch {
109
+ body = null;
110
+ }
111
+ if (!res.ok || !body || body.success === false) {
112
+ const reason = body?.errors?.map((e) => e.message).filter(Boolean).join('; ') || 'no error detail';
113
+ throw new LakeQueryError(`R2 SQL query failed (${res.status}): ${reason}`);
114
+ }
115
+ const rows = body.result?.rows;
116
+ if (!Array.isArray(rows) || !rows.every((r) => typeof r === 'object' && r !== null && !Array.isArray(r))) {
117
+ // A shape this client does not know is refused, not guessed at: the gateway's
118
+ // tenant check reads `tenant_id` off each row, and a row it cannot read is not one
119
+ // it can vouch for.
120
+ throw new LakeQueryError('R2 SQL answered without a rows array of objects');
121
+ }
122
+ return rows;
123
+ },
124
+ };
125
+ }
126
+ //# sourceMappingURL=r2-sql-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"r2-sql-engine.js","sourceRoot":"","sources":["../src/r2-sql-engine.ts"],"names":[],"mappings":"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"}
@@ -83,4 +83,16 @@ export declare function recordStrandedStorage(admin: HostAdmin, actor: PlatformA
83
83
  export declare function reapScopeScriptCopies(input: ScopeCopyCleanup, tenantId: TenantId, scopeId: ScopeId): Promise<{
84
84
  storageStranded: boolean;
85
85
  }>;
86
+ /**
87
+ * The reap claim. The directory claim and new move records serialize on one store. A carry that
88
+ * already began refuses the reap (412) and keeps it retryable; one starting later cannot restore
89
+ * bytes after the scripts have been drained and the row removed. A reap that unroutes the scope
90
+ * takes this before it destroys anything (#2285), so a refusal leaves the scope routed and whole.
91
+ * Taking a claim already held resumes it.
92
+ */
93
+ export declare function claimScopeScriptReap(input: Pick<ScopeCopyCleanup, 'admin' | 'actor'>, tenantId: TenantId, scopeId: ScopeId): Promise<void>;
94
+ /** `reapScopeScriptCopies` past its claim: delete through every named script, then settle the ledger. */
95
+ export declare function drainScopeScriptCopies(input: ScopeCopyCleanup, tenantId: TenantId, scopeId: ScopeId): Promise<{
96
+ storageStranded: boolean;
97
+ }>;
86
98
  //# sourceMappingURL=scope-copy-cleanup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scope-copy-cleanup.d.ts","sourceRoot":"","sources":["../src/scope-copy-cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,eAAe,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEzG,OAAO,EAA+D,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACzI,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,eAAe,CAAC;IACvB,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;CACxE;AAED,0FAA0F;AAC1F,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAC7E,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;+EAC+E;AAC/E,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAC7E,OAAO,CAAC,eAAe,EAAE,CAAC,CAU5B;AAQD,oGAAoG;AACpG,wBAAsB,YAAY,CAChC,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAClG,SAAS,GAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,CAC5B,GACpE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAIxB;AAED,sGAAsG;AACtG,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAIxG;AAED,2FAA2F;AAC3F,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CA6B/H;AAED,uFAAuF;AACvF,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAa3I;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,gBAAgB,EAAE,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACjE,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAqB/D;AAuBD,iGAAiG;AACjG,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAInI;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAC5F,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAC5D,OAAO,CAAC;IAAE,eAAe,EAAE,OAAO,CAAA;CAAE,CAAC,CAgCvC"}
1
+ {"version":3,"file":"scope-copy-cleanup.d.ts","sourceRoot":"","sources":["../src/scope-copy-cleanup.ts"],"names":[],"mappings":"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"}
@@ -195,15 +195,26 @@ export async function recordStrandedStorage(admin, actor, tenantId, scopeId, whe
195
195
  * reap routes' slug fallback (`reapScopeStorage`) records what it strands the same way.
196
196
  */
197
197
  export async function reapScopeScriptCopies(input, tenantId, scopeId) {
198
- // The directory claim and new move records serialize on one store. A carry that
199
- // already began keeps this reap retryable; one starting later cannot restore bytes
200
- // after the scripts have been drained and the row removed.
198
+ await claimScopeScriptReap(input, tenantId, scopeId);
199
+ return drainScopeScriptCopies(input, tenantId, scopeId);
200
+ }
201
+ /**
202
+ * The reap claim. The directory claim and new move records serialize on one store. A carry that
203
+ * already began refuses the reap (412) and keeps it retryable; one starting later cannot restore
204
+ * bytes after the scripts have been drained and the row removed. A reap that unroutes the scope
205
+ * takes this before it destroys anything (#2285), so a refusal leaves the scope routed and whole.
206
+ * Taking a claim already held resumes it.
207
+ */
208
+ export async function claimScopeScriptReap(input, tenantId, scopeId) {
201
209
  await input.admin.beginScopeScriptReap(input.actor, tenantId, scopeId).catch((error) => {
202
210
  if (errorCodeOf(error) === 'precondition_failed') {
203
211
  throw new ControlPlaneError(412, error instanceof Error ? error.message : String(error));
204
212
  }
205
213
  throw error;
206
214
  });
215
+ }
216
+ /** `reapScopeScriptCopies` past its claim: delete through every named script, then settle the ledger. */
217
+ export async function drainScopeScriptCopies(input, tenantId, scopeId) {
207
218
  const copies = await listAllScopeScriptCopies(input.admin, input.actor, tenantId, scopeId);
208
219
  const current = await routeOf(input, tenantId, scopeId);
209
220
  const refs = new Set(copies.filter((c) => c.state !== 'done').map((c) => c.scriptRef));
@@ -1 +1 @@
1
- {"version":3,"file":"scope-copy-cleanup.js","sourceRoot":"","sources":["../src/scope-copy-cleanup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scope-copy-cleanup.js","sourceRoot":"","sources":["../src/scope-copy-cleanup.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,14 @@ import { ControlPlaneTransport } from '@substrat-run/control-plane-client';
24
24
  *
25
25
  * Answers are typed, not parsed — the same trust the console's hand-rolled client had.
26
26
  */
27
+ /** What a re-run provision answers (`POST …/provision`): the vertical's reconcile answer. `owner`
28
+ * is `null` (#2263) for the ownerless reconcile of a vertical that keeps no owner of record. */
29
+ export interface ReprovisionedScope {
30
+ tenantId: TenantId;
31
+ scopeId: ScopeId;
32
+ owner: string | null;
33
+ storeError?: string;
34
+ }
27
35
  /** One service's invocation aggregates — the control plane's observability proxy
28
36
  * (provider-neutral seam; Cloudflare analytics is the current backend). */
29
37
  export interface ServiceMetricsRow {
@@ -274,7 +282,7 @@ export declare class ControlPlaneStaffClient extends ControlPlaneTransport {
274
282
  * for itself at provision — a new service principal, say — which no other path can
275
283
  * ever deliver, because provision runs at install and never again.
276
284
  */
277
- reprovisionScope: (t: TenantId, s: ScopeId) => Promise<Scope>;
285
+ reprovisionScope: (t: TenantId, s: ScopeId) => Promise<ReprovisionedScope>;
278
286
  archiveScope: (t: TenantId, s: ScopeId) => Promise<Scope>;
279
287
  unarchiveScope: (t: TenantId, s: ScopeId) => Promise<Scope>;
280
288
  reapScope: (t: TenantId, s: ScopeId, opts?: {