@substrat-run/control-plane-api 0.33.0 → 0.35.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.
- package/dist/api.d.ts +9 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +22 -1
- package/dist/api.js.map +1 -1
- package/dist/custom-hostnames.d.ts +5 -4
- package/dist/custom-hostnames.d.ts.map +1 -1
- package/dist/custom-hostnames.js +18 -5
- package/dist/custom-hostnames.js.map +1 -1
- package/dist/deploy.d.ts +2 -2
- package/dist/deploy.js +2 -2
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/platform-drain.d.ts +62 -0
- package/dist/platform-drain.d.ts.map +1 -1
- package/dist/platform-drain.js +197 -1
- package/dist/platform-drain.js.map +1 -1
- package/dist/tenant-stores.d.ts +29 -0
- package/dist/tenant-stores.d.ts.map +1 -0
- package/dist/tenant-stores.js +68 -0
- package/dist/tenant-stores.js.map +1 -0
- package/dist/wfp.d.ts +24 -0
- package/dist/wfp.d.ts.map +1 -1
- package/dist/wfp.js +42 -0
- package/dist/wfp.js.map +1 -1
- package/package.json +4 -4
package/dist/custom-hostnames.js
CHANGED
|
@@ -101,7 +101,14 @@ export function createCustomHostnameProvisioner(opts) {
|
|
|
101
101
|
}
|
|
102
102
|
if (!res.ok || !env?.success || !env.result) {
|
|
103
103
|
const msg = env?.errors?.map((e) => e.message).filter(Boolean).join('; ') || clip(text);
|
|
104
|
-
|
|
104
|
+
// An auth failure here is a PLATFORM misconfiguration, not the tenant's DNS: the
|
|
105
|
+
// token works for other CF APIs but lacks the custom-hostname permission. Say so —
|
|
106
|
+
// "Authentication error" alone reads as the tenant's problem and sends them to
|
|
107
|
+
// their DNS provider instead of the operator to the token settings.
|
|
108
|
+
const hint = res.status === 401 || res.status === 403
|
|
109
|
+
? " — the platform's Cloudflare API token lacks 'SSL and Certificates: Edit' on the SaaS zone (secrets/platform.<env>.env CF_API_TOKEN; a just-edited token can take a few minutes to propagate); not a DNS problem on the domain"
|
|
110
|
+
: '';
|
|
111
|
+
throw new Error(`Cloudflare ${what} failed (${res.status}): ${msg || 'unknown error'}${hint}`);
|
|
105
112
|
}
|
|
106
113
|
return env.result;
|
|
107
114
|
};
|
|
@@ -139,9 +146,10 @@ export function createCustomHostnameProvisioner(opts) {
|
|
|
139
146
|
*
|
|
140
147
|
* - `verifying` with a CF id — poll Cloudflare and persist the new status/records; a
|
|
141
148
|
* `verifying → active` here is the automated flip that replaces the old manual one.
|
|
142
|
-
* - `pending` with NO CF id but a custom hostname — a create that never
|
|
143
|
-
* bind route failed transiently,
|
|
144
|
-
*
|
|
149
|
+
* - `pending` OR `failed` with NO CF id but a custom hostname — a create that never
|
|
150
|
+
* landed (the bind route failed transiently, ran before a provisioner was configured,
|
|
151
|
+
* or hit a misconfigured credential and was recorded `failed`). Retry the create so
|
|
152
|
+
* the row self-heals once the cause is fixed, instead of waiting on a human click.
|
|
145
153
|
*
|
|
146
154
|
* `isCustom` decides which `pending` rows are ours to issue for — a platform hostname
|
|
147
155
|
* (rides the wildcard, no CF object) is never touched here. Per-row failures are caught
|
|
@@ -170,8 +178,13 @@ export async function reconcilePendingHostnames(deps) {
|
|
|
170
178
|
out.errors.push({ hostname: h.hostname, error: err instanceof Error ? err.message : String(err) });
|
|
171
179
|
}
|
|
172
180
|
}
|
|
181
|
+
// `failed` rows WITHOUT a CF id are creates that never landed (e.g. a token without
|
|
182
|
+
// the custom-hostname permission) — retriable exactly like a stuck `pending`, so a
|
|
183
|
+
// fixed credential heals them on the next sweep. `failed` WITH an id stays terminal
|
|
184
|
+
// here: that is a real validation verdict, re-checked only by an explicit verify.
|
|
185
|
+
const failed = (await deps.admin.listHostnames(deps.actor, { status: 'failed' })).filter((h) => !h.customHostnameId);
|
|
173
186
|
const pending = await deps.admin.listHostnames(deps.actor, { status: 'pending' });
|
|
174
|
-
for (const h of pending) {
|
|
187
|
+
for (const h of [...pending, ...failed]) {
|
|
175
188
|
if (h.customHostnameId || !deps.isCustom(h.hostname))
|
|
176
189
|
continue; // already created, or a platform mint
|
|
177
190
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-hostnames.js","sourceRoot":"","sources":["../src/custom-hostnames.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAuExF;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,mBAA6B;IAC9E,MAAM,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAClC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACxC,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IACvD,MAAM,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,QAAQ,mCAAmC,CAAC;IACnF,IAAI,cAAc,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,QAAQ,0DAA0D,CAAC;IACrG,IAAI,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,QAAQ,6BAA6B,CAAC;IACvF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wFAAwF;AACxF,SAAS,IAAI,CAAC,IAAY,EAAE,GAAG,GAAG,IAAI;IACpC,OAAO,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,kBAAkB,IAAI,CAAC,MAAM,GAAG,GAAG,iBAAiB,CAAC;AAC/G,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,EAAoB;IAI9C,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG;QACb,GAAG,CAAC,EAAE,CAAC,mBAAmB,IAAI,EAAE,CAAC;QACjC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5F,CAAC;IAEF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,sBAAsB,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;IAC3F,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,qBAAqB,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,EAAE,CAAC;IAC3G,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnF,iFAAiF;IACjF,sDAAsD;IACtD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;AAClE,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,cAAc,CAAC,EAAoB,EAAE,aAAqB;IACxE,MAAM,OAAO,GAAgB;QAC3B,6EAA6E;QAC7E,kFAAkF;QAClF,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,IAAI,IAAI,EAAE;KACzF,CAAC;IACF,4EAA4E;IAC5E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,kBAAkB,IAAI,EAAE,EAAE,CAAC;QACjD,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IACD,MAAM,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC;IACrC,IAAI,EAAE,EAAE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,IAAsC;IAEtC,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,IAAK,UAAU,CAAC,KAAiB,CAAC;IACrE,MAAM,IAAI,GAAG,8CAA8C,IAAI,CAAC,MAAM,mBAAmB,CAAC;IAC1F,MAAM,IAAI,GAAG,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;IAE1D,MAAM,UAAU,GAAG,CAAC,EAAoB,EAA0B,EAAE;QAClE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QACzC,OAAO,EAAE,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;IACpG,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,GAAa,EAAE,IAAY,EAA6B,EAAE;QACpF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,GAA6C,CAAC;QAClD,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9E,CAAC;QAAC,MAAM,CAAC;YACP,yEAAyE;QAC3E,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;YACxF,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,YAAY,GAAG,CAAC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"custom-hostnames.js","sourceRoot":"","sources":["../src/custom-hostnames.ts"],"names":[],"mappings":"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"}
|
package/dist/deploy.d.ts
CHANGED
|
@@ -100,8 +100,8 @@ export type FetchVerticalModulesFn = (deploymentRef: string) => Promise<Vertical
|
|
|
100
100
|
* #301), so it is a `runtimeNeeds` need rather than a `declaredBinding` and never rides this
|
|
101
101
|
* allowlist at all — there is no bundle-chosen id left to trust. A vertical migrating from a
|
|
102
102
|
* single shared D1 to platform-provisioned per-tenant stores is how the ownership question
|
|
103
|
-
* stops applying. (The kernel seam
|
|
104
|
-
*
|
|
103
|
+
* stops applying. (The kernel seam is `provisionTenantStore`/`openTenantStore`; on Cloudflare
|
|
104
|
+
* the platform mints a live D1 per tenant and attaches it to the serving script — #301 PR-2.)
|
|
105
105
|
*/
|
|
106
106
|
export declare function assertSandboxContract(m: DeployManifest): void;
|
|
107
107
|
/**
|
package/dist/deploy.js
CHANGED
|
@@ -76,8 +76,8 @@ const NAMED_REFUSALS = {
|
|
|
76
76
|
* #301), so it is a `runtimeNeeds` need rather than a `declaredBinding` and never rides this
|
|
77
77
|
* allowlist at all — there is no bundle-chosen id left to trust. A vertical migrating from a
|
|
78
78
|
* single shared D1 to platform-provisioned per-tenant stores is how the ownership question
|
|
79
|
-
* stops applying. (The kernel seam
|
|
80
|
-
*
|
|
79
|
+
* stops applying. (The kernel seam is `provisionTenantStore`/`openTenantStore`; on Cloudflare
|
|
80
|
+
* the platform mints a live D1 per tenant and attaches it to the serving script — #301 PR-2.)
|
|
81
81
|
*/
|
|
82
82
|
export function assertSandboxContract(m) {
|
|
83
83
|
const own = new Set(m.doClasses);
|
package/dist/index.d.ts
CHANGED
|
@@ -6,12 +6,13 @@ export type { PlatformActorAuth, StaffIdentity, StaffSessionReader, StaffActorRe
|
|
|
6
6
|
export { ControlPlaneClient, ControlPlaneError } from './client.js';
|
|
7
7
|
export type { ControlPlaneClientOptions, ClientProvisionScopeInput } from './client.js';
|
|
8
8
|
export { VerticalClient } from './vertical-client.js';
|
|
9
|
-
export { drainScopePlatformRequests, provisionSiblingScope, provisionSiblingHandler, archiveScopeHandler, type ArchiveScopeDeps, type PlatformRequestHandler, type PlatformRequestContext, type PlatformRequestOutcome, type PlatformDrainReport, type ProvisionSiblingDeps, type ProvisionSiblingInput, type ProvisionSiblingResult, } from './platform-drain.js';
|
|
9
|
+
export { drainScopePlatformRequests, provisionSiblingScope, provisionSiblingHandler, archiveScopeHandler, provisionTenantHandler, setEntitlementsHandler, type ManagedTenantDeps, type ArchiveScopeDeps, type PlatformRequestHandler, type PlatformRequestContext, type PlatformRequestOutcome, type PlatformDrainReport, type ProvisionSiblingDeps, type ProvisionSiblingInput, type ProvisionSiblingResult, } from './platform-drain.js';
|
|
10
10
|
export type { VerticalClientOptions, ProvisionInstanceInput, ProvisionedInstance, ConfigureInstanceInput, } from './vertical-client.js';
|
|
11
11
|
export { assertSandboxContract, deployManifest, deploymentRefFor, stableDeploymentRefFor, nextMigrationTag, DeployUploadError, upstreamStatusOf, } from './deploy.js';
|
|
12
12
|
export type { DeployVerticalFn, VerticalBundle, DeclaredBinding, DeployManifest } from './deploy.js';
|
|
13
|
-
export { createWfpUploader, createWfpModulesFetcher } from './wfp.js';
|
|
14
|
-
export type { WfpUploaderOptions } from './wfp.js';
|
|
13
|
+
export { createWfpUploader, createWfpModulesFetcher, createWfpBindingsPatcher } from './wfp.js';
|
|
14
|
+
export type { WfpUploaderOptions, PatchScriptBindingsFn, D1BindingSpec } from './wfp.js';
|
|
15
|
+
export { collectTenantStoreHandles, tenantStoreBindings } from './tenant-stores.js';
|
|
15
16
|
export { createCustomHostnameProvisioner, mapCfStatus, extractRecords, reconcilePendingHostnames, isCustomHostname, validateBindableHostname, } from './custom-hostnames.js';
|
|
16
17
|
export type { CustomHostnameProvisioner, CustomHostnameProvisionerOptions, CustomHostnameIssuance, ReconcileHostnamesResult, } from './custom-hostnames.js';
|
|
17
18
|
export type { ObservabilityReader, ServiceMetricsRow, RecentLogEvent } from './observability.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrG,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,SAAS,GACV,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACpE,YAAY,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrG,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,SAAS,GACV,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACpE,YAAY,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAChG,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EACL,+BAA+B,EAC/B,WAAW,EACX,cAAc,EACd,yBAAyB,EACzB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,yBAAyB,EACzB,gCAAgC,EAChC,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACjG,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,9 +3,10 @@ export { DEV_ACTOR_HEADER, SERVICE_TOKEN_HEADER, UNSAFE_devPlatformActorAuth, se
|
|
|
3
3
|
export { mintPushToken, verifyPushToken, pushTokenBuilderAuth, pushActorFor } from './push-token.js';
|
|
4
4
|
export { ControlPlaneClient, ControlPlaneError } from './client.js';
|
|
5
5
|
export { VerticalClient } from './vertical-client.js';
|
|
6
|
-
export { drainScopePlatformRequests, provisionSiblingScope, provisionSiblingHandler, archiveScopeHandler, } from './platform-drain.js';
|
|
6
|
+
export { drainScopePlatformRequests, provisionSiblingScope, provisionSiblingHandler, archiveScopeHandler, provisionTenantHandler, setEntitlementsHandler, } from './platform-drain.js';
|
|
7
7
|
export { assertSandboxContract, deployManifest, deploymentRefFor, stableDeploymentRefFor, nextMigrationTag, DeployUploadError, upstreamStatusOf, } from './deploy.js';
|
|
8
|
-
export { createWfpUploader, createWfpModulesFetcher } from './wfp.js';
|
|
8
|
+
export { createWfpUploader, createWfpModulesFetcher, createWfpBindingsPatcher } from './wfp.js';
|
|
9
|
+
export { collectTenantStoreHandles, tenantStoreBindings } from './tenant-stores.js';
|
|
9
10
|
export { createCustomHostnameProvisioner, mapCfStatus, extractRecords, reconcilePendingHostnames, isCustomHostname, validateBindableHostname, } from './custom-hostnames.js';
|
|
10
11
|
export { createCfObservabilityReader } from './cf-observability.js';
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEjD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAUrG,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEjD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAUrG,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,GAUvB,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAEhG,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EACL,+BAA+B,EAC/B,WAAW,EACX,cAAc,EACd,yBAAyB,EACzB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/platform-drain.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type ScopeHost } from '@substrat-run/kernel';
|
|
2
2
|
import { type PlatformActorId, type PlatformRequest, type ScopeId, type TenantId } from '@substrat-run/contracts';
|
|
3
3
|
import type { VerticalClient } from './vertical-client.js';
|
|
4
|
+
import type { PatchScriptBindingsFn } from './wfp.js';
|
|
4
5
|
/**
|
|
5
6
|
* The platform-intent drain engine (Phase B2 of docs/design/platform-intents.md). A vertical
|
|
6
7
|
* enqueues typed intents in its own scope DO (`ctx.requestPlatform`, Phase A); because those rows
|
|
@@ -45,6 +46,13 @@ export interface ProvisionSiblingDeps {
|
|
|
45
46
|
verticalVersionId: string | null;
|
|
46
47
|
servingRef?: string | null;
|
|
47
48
|
}) => Promise<VerticalClient | undefined>;
|
|
49
|
+
/**
|
|
50
|
+
* Attach per-tenant store D1 bindings on the dispatch script (#301) — threaded through
|
|
51
|
+
* to `collectTenantStoreHandles` so a sibling provision heals a missing attach exactly
|
|
52
|
+
* as a first install would. A sibling shares its tenant's stores (they are per TENANT,
|
|
53
|
+
* not per scope), so this usually resolves existing handles and no-ops the patch.
|
|
54
|
+
*/
|
|
55
|
+
patchScriptBindings?: PatchScriptBindingsFn;
|
|
48
56
|
}
|
|
49
57
|
export interface ProvisionSiblingInput {
|
|
50
58
|
tenantId: TenantId;
|
|
@@ -91,4 +99,58 @@ export interface ArchiveScopeDeps {
|
|
|
91
99
|
* retry never wedges.
|
|
92
100
|
*/
|
|
93
101
|
export declare function archiveScopeHandler(deps: ArchiveScopeDeps): PlatformRequestHandler;
|
|
102
|
+
/**
|
|
103
|
+
* Deps for the MANAGED-TENANT handlers (#412) — `provision-tenant` / `set-entitlements`,
|
|
104
|
+
* the capability that makes a vertical a manager (a console whose job is to add tenants).
|
|
105
|
+
* Unlike `provision-sibling`, the target tenant is NOT proven by the drained scope (it may
|
|
106
|
+
* not exist yet), so admissibility is bounded on the manager instead:
|
|
107
|
+
*
|
|
108
|
+
* 1. `provisioners` — the staff-granted provisioner capability. Deployment config today
|
|
109
|
+
* (the only manager is first-party); a directory-backed grant when third-party managers
|
|
110
|
+
* arrive. A vertical not listed settles `failed`.
|
|
111
|
+
* 2. SKU bound — every entitlement key a payload names must be in the manager's
|
|
112
|
+
* registry-declared `entitlements` (its manifest's, carried on push), read at drain time.
|
|
113
|
+
*
|
|
114
|
+
* Still phased (#412 invariants 2/4, before any third-party manager): `tenants.provisionedBy`
|
|
115
|
+
* ownership — until it exists, a listed manager can `set-entitlements` on any tenant — and
|
|
116
|
+
* a declared-target-verticals bound (`manifest.provisions`).
|
|
117
|
+
*/
|
|
118
|
+
export interface ManagedTenantDeps {
|
|
119
|
+
host: ScopeHost;
|
|
120
|
+
actor: PlatformActorId;
|
|
121
|
+
/** Manager verticals (registry slugs) holding the provisioner capability. */
|
|
122
|
+
provisioners: readonly string[];
|
|
123
|
+
/** Resolve the `VerticalClient` serving a scope — same ladder as `ProvisionSiblingDeps`. */
|
|
124
|
+
resolveVerticalForScope: (scope: {
|
|
125
|
+
vertical: string | null;
|
|
126
|
+
verticalVersionId: string | null;
|
|
127
|
+
servingRef?: string | null;
|
|
128
|
+
}) => Promise<VerticalClient | undefined>;
|
|
129
|
+
/** Attach per-tenant store D1 bindings (#301); a NEW tenant's first install mints here. */
|
|
130
|
+
patchScriptBindings?: PatchScriptBindingsFn;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* The `provision-tenant` platform-request handler (#412): create a NEW customer tenant, its
|
|
134
|
+
* first scope running the PAYLOAD's vertical (never inherited — the manager and the managed
|
|
135
|
+
* product are different verticals), grant its entitlements, then the same materialization a
|
|
136
|
+
* first install runs: resolve the serving deployment, mint/collect the tenant's stores
|
|
137
|
+
* (#301), `provisionInstance` (which projects the entitlements, #310), deliver `config`,
|
|
138
|
+
* activate. Every id is proposed in the payload (idempotent join keys), so an at-least-once
|
|
139
|
+
* drain converges without minting anything on retry: `createTenant`/`provisionScope`/
|
|
140
|
+
* `provisionInstance` are all idempotent no-ops the second time. A `ControlPlaneError` from
|
|
141
|
+
* the vertical is transient (`pending`); a structural refusal (capability, SKU bound, slug
|
|
142
|
+
* taken by a different tenant, unbound deployment) is terminal (`failed`).
|
|
143
|
+
*/
|
|
144
|
+
export declare function provisionTenantHandler(deps: ManagedTenantDeps): PlatformRequestHandler;
|
|
145
|
+
/**
|
|
146
|
+
* The `set-entitlements` platform-request handler (#412): reconcile a managed tenant's
|
|
147
|
+
* grants to the payload's TARGET set, bounded both ways by the manager's declared SKU
|
|
148
|
+
* universe — grant what the target names, revoke any declared key absent from it — then
|
|
149
|
+
* re-project into the tenant's auth scope via the vertical's idempotent reconcile
|
|
150
|
+
* (entitlements re-gathered authoritative + identity links, exactly as the repair route,
|
|
151
|
+
* #310/#406; the vertical-side projection is a full replace, so a downgrade revokes
|
|
152
|
+
* cleanly). Keys OUTSIDE the declared universe are never touched, so a platform-granted
|
|
153
|
+
* entitlement (e.g. the tenant's own product SKU) survives any manager reconcile.
|
|
154
|
+
*/
|
|
155
|
+
export declare function setEntitlementsHandler(deps: ManagedTenantDeps): PlatformRequestHandler;
|
|
94
156
|
//# sourceMappingURL=platform-drain.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-drain.d.ts","sourceRoot":"","sources":["../src/platform-drain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"platform-drain.d.ts","sourceRoot":"","sources":["../src/platform-drain.ts"],"names":[],"mappings":"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"}
|
package/dist/platform-drain.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ulid } from '@substrat-run/kernel';
|
|
2
|
-
import { principalId as principalIdSchema, scopeId as scopeIdSchema, provisionSiblingPayload, archiveScopePayload, } from '@substrat-run/contracts';
|
|
2
|
+
import { principalId as principalIdSchema, scopeId as scopeIdSchema, tenantId as tenantIdSchema, provisionSiblingPayload, archiveScopePayload, provisionTenantPayload, setEntitlementsPayload, } from '@substrat-run/contracts';
|
|
3
3
|
import { ControlPlaneError } from './client.js';
|
|
4
|
+
import { collectTenantStoreHandles } from './tenant-stores.js';
|
|
4
5
|
/**
|
|
5
6
|
* Drain one scope's pending platform intents: list them from the vertical, dispatch each to the
|
|
6
7
|
* handler for its `kind`, and settle the outcome back in the vertical. An unknown kind settles
|
|
@@ -63,6 +64,16 @@ export async function provisionSiblingScope(deps, input) {
|
|
|
63
64
|
return { ok: false, status: 501, error: `no deployment is bound for vertical '${parent.vertical}'` };
|
|
64
65
|
}
|
|
65
66
|
const entitlements = await admin.listEntitlements(actor, input.tenantId);
|
|
67
|
+
// #301: a sibling's provision callback carries the tenant's store handles like a first
|
|
68
|
+
// install's does — the stores are per (tenant, vertical), so this re-resolves what the
|
|
69
|
+
// first install minted rather than minting anything new.
|
|
70
|
+
const tenantStores = await collectTenantStoreHandles({
|
|
71
|
+
host,
|
|
72
|
+
actor,
|
|
73
|
+
slug: parent.vertical,
|
|
74
|
+
tenantId: input.tenantId,
|
|
75
|
+
patchBindings: deps.patchScriptBindings,
|
|
76
|
+
});
|
|
66
77
|
await vertical.provisionInstance({
|
|
67
78
|
tenantId: input.tenantId,
|
|
68
79
|
scopeId: input.scopeId,
|
|
@@ -70,6 +81,7 @@ export async function provisionSiblingScope(deps, input) {
|
|
|
70
81
|
slug: input.slug,
|
|
71
82
|
name: input.name,
|
|
72
83
|
entitlements,
|
|
84
|
+
...(tenantStores.length ? { tenantStores } : {}),
|
|
73
85
|
});
|
|
74
86
|
await admin.activateScope(actor, input.tenantId, input.scopeId);
|
|
75
87
|
return { ok: true, scopeId: input.scopeId };
|
|
@@ -130,4 +142,188 @@ export function archiveScopeHandler(deps) {
|
|
|
130
142
|
return { status: 'done', result: { archived: payload.scopeId } };
|
|
131
143
|
};
|
|
132
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* Enforce the manager bound: provisioner capability + declared-SKU universe. Returns the
|
|
147
|
+
* declared SKU list on admission (the reconcile in `set-entitlements` needs it — it bounds
|
|
148
|
+
* the revoke side too), or the `failed` outcome to settle.
|
|
149
|
+
*/
|
|
150
|
+
async function admitManager(deps, ctx, requestedKeys) {
|
|
151
|
+
if (!deps.provisioners.includes(ctx.vertical)) {
|
|
152
|
+
return {
|
|
153
|
+
refusal: {
|
|
154
|
+
status: 'failed',
|
|
155
|
+
error: `vertical '${ctx.vertical}' does not hold the tenant-provisioner capability`,
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const registered = (await deps.host.admin.listVerticals(deps.actor)).find((v) => v.slug === ctx.vertical);
|
|
160
|
+
const declared = registered?.entitlements ?? [];
|
|
161
|
+
for (const key of requestedKeys) {
|
|
162
|
+
if (!declared.includes(key)) {
|
|
163
|
+
return {
|
|
164
|
+
refusal: {
|
|
165
|
+
status: 'failed',
|
|
166
|
+
error: `entitlement '${key}' is not among the SKUs '${ctx.vertical}' declares`,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return { declared };
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* The `provision-tenant` platform-request handler (#412): create a NEW customer tenant, its
|
|
175
|
+
* first scope running the PAYLOAD's vertical (never inherited — the manager and the managed
|
|
176
|
+
* product are different verticals), grant its entitlements, then the same materialization a
|
|
177
|
+
* first install runs: resolve the serving deployment, mint/collect the tenant's stores
|
|
178
|
+
* (#301), `provisionInstance` (which projects the entitlements, #310), deliver `config`,
|
|
179
|
+
* activate. Every id is proposed in the payload (idempotent join keys), so an at-least-once
|
|
180
|
+
* drain converges without minting anything on retry: `createTenant`/`provisionScope`/
|
|
181
|
+
* `provisionInstance` are all idempotent no-ops the second time. A `ControlPlaneError` from
|
|
182
|
+
* the vertical is transient (`pending`); a structural refusal (capability, SKU bound, slug
|
|
183
|
+
* taken by a different tenant, unbound deployment) is terminal (`failed`).
|
|
184
|
+
*/
|
|
185
|
+
export function provisionTenantHandler(deps) {
|
|
186
|
+
return async (ctx, request) => {
|
|
187
|
+
const payload = provisionTenantPayload.parse(request.payload);
|
|
188
|
+
const admitted = await admitManager(deps, ctx, payload.entitlements.map((e) => e.key));
|
|
189
|
+
if ('refusal' in admitted)
|
|
190
|
+
return admitted.refusal;
|
|
191
|
+
const { host, actor } = deps;
|
|
192
|
+
const admin = host.admin;
|
|
193
|
+
const tenantId = tenantIdSchema.parse(payload.tenant.id);
|
|
194
|
+
const scopeId = scopeIdSchema.parse(payload.instance.scopeId);
|
|
195
|
+
try {
|
|
196
|
+
await admin.createTenant(actor, {
|
|
197
|
+
id: tenantId,
|
|
198
|
+
slug: payload.tenant.slug,
|
|
199
|
+
name: payload.tenant.name,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
204
|
+
// Both adapters fail closed on a slug owned by a DIFFERENT tenant id with this
|
|
205
|
+
// phrasing — a retry can never converge, so settle terminal instead of pending.
|
|
206
|
+
if (message.includes('slugs are unique'))
|
|
207
|
+
return { status: 'failed', error: message };
|
|
208
|
+
throw e;
|
|
209
|
+
}
|
|
210
|
+
// Granted BEFORE provisionInstance so the #310 projection carries them on day one.
|
|
211
|
+
for (const grant of payload.entitlements) {
|
|
212
|
+
await admin.grantEntitlement(actor, tenantId, grant.key, { plan: grant.plan });
|
|
213
|
+
}
|
|
214
|
+
await host.provisionScope(actor, {
|
|
215
|
+
tenantId,
|
|
216
|
+
scopeId,
|
|
217
|
+
slug: payload.instance.slug,
|
|
218
|
+
name: payload.instance.name,
|
|
219
|
+
vertical: payload.instance.vertical,
|
|
220
|
+
});
|
|
221
|
+
const created = await admin.getScopeRecord(actor, tenantId, scopeId);
|
|
222
|
+
const vertical = created ? await deps.resolveVerticalForScope(created) : undefined;
|
|
223
|
+
if (!vertical) {
|
|
224
|
+
return {
|
|
225
|
+
status: 'failed',
|
|
226
|
+
result: { tenantId, scopeId },
|
|
227
|
+
error: `no deployment is bound for vertical '${payload.instance.vertical}'`,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
const entitlements = await admin.listEntitlements(actor, tenantId);
|
|
231
|
+
// #301: a NEW tenant's first install is exactly the minting path — the stores are
|
|
232
|
+
// per (tenant, target vertical), keyed by the PAYLOAD's vertical, not the manager's.
|
|
233
|
+
const tenantStores = await collectTenantStoreHandles({
|
|
234
|
+
host,
|
|
235
|
+
actor,
|
|
236
|
+
slug: payload.instance.vertical,
|
|
237
|
+
tenantId,
|
|
238
|
+
patchBindings: deps.patchScriptBindings,
|
|
239
|
+
});
|
|
240
|
+
try {
|
|
241
|
+
await vertical.provisionInstance({
|
|
242
|
+
tenantId,
|
|
243
|
+
scopeId,
|
|
244
|
+
owner: principalIdSchema.parse(payload.instance.owner),
|
|
245
|
+
slug: payload.instance.slug,
|
|
246
|
+
name: payload.instance.name,
|
|
247
|
+
entitlements,
|
|
248
|
+
...(tenantStores.length ? { tenantStores } : {}),
|
|
249
|
+
});
|
|
250
|
+
if (payload.config && Object.keys(payload.config).length) {
|
|
251
|
+
try {
|
|
252
|
+
await vertical.configureInstance({
|
|
253
|
+
tenantId,
|
|
254
|
+
scopeId,
|
|
255
|
+
entries: Object.entries(payload.config).map(([key, value]) => ({ key, value })),
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
catch (e) {
|
|
259
|
+
// 501 = the vertical has no live-config support — authored but not delivered,
|
|
260
|
+
// the same tolerance the settings route extends. Anything else is transient.
|
|
261
|
+
if (!(e instanceof ControlPlaneError && e.status === 501))
|
|
262
|
+
throw e;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch (e) {
|
|
267
|
+
if (e instanceof ControlPlaneError) {
|
|
268
|
+
return { status: 'pending', result: { tenantId, scopeId }, error: e.message };
|
|
269
|
+
}
|
|
270
|
+
throw e;
|
|
271
|
+
}
|
|
272
|
+
await admin.activateScope(actor, tenantId, scopeId);
|
|
273
|
+
return { status: 'done', result: { tenantId, scopeId } };
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* The `set-entitlements` platform-request handler (#412): reconcile a managed tenant's
|
|
278
|
+
* grants to the payload's TARGET set, bounded both ways by the manager's declared SKU
|
|
279
|
+
* universe — grant what the target names, revoke any declared key absent from it — then
|
|
280
|
+
* re-project into the tenant's auth scope via the vertical's idempotent reconcile
|
|
281
|
+
* (entitlements re-gathered authoritative + identity links, exactly as the repair route,
|
|
282
|
+
* #310/#406; the vertical-side projection is a full replace, so a downgrade revokes
|
|
283
|
+
* cleanly). Keys OUTSIDE the declared universe are never touched, so a platform-granted
|
|
284
|
+
* entitlement (e.g. the tenant's own product SKU) survives any manager reconcile.
|
|
285
|
+
*/
|
|
286
|
+
export function setEntitlementsHandler(deps) {
|
|
287
|
+
return async (ctx, request) => {
|
|
288
|
+
const payload = setEntitlementsPayload.parse(request.payload);
|
|
289
|
+
const admitted = await admitManager(deps, ctx, payload.entitlements.map((e) => e.key));
|
|
290
|
+
if ('refusal' in admitted)
|
|
291
|
+
return admitted.refusal;
|
|
292
|
+
const { actor } = deps;
|
|
293
|
+
const admin = deps.host.admin;
|
|
294
|
+
const tenantId = tenantIdSchema.parse(payload.tenantId);
|
|
295
|
+
const scopeId = scopeIdSchema.parse(payload.authScopeId);
|
|
296
|
+
const scope = await admin.getScopeRecord(actor, tenantId, scopeId);
|
|
297
|
+
if (!scope) {
|
|
298
|
+
return { status: 'failed', error: `unknown scope for tenant: (${tenantId}, ${scopeId})` };
|
|
299
|
+
}
|
|
300
|
+
const target = new Map(payload.entitlements.map((e) => [e.key, e.plan]));
|
|
301
|
+
for (const key of admitted.declared) {
|
|
302
|
+
if (target.has(key)) {
|
|
303
|
+
await admin.grantEntitlement(actor, tenantId, key, { plan: target.get(key) });
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
await admin.revokeEntitlement(actor, tenantId, key);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
const vertical = await deps.resolveVerticalForScope(scope);
|
|
310
|
+
if (!vertical) {
|
|
311
|
+
return {
|
|
312
|
+
status: 'failed',
|
|
313
|
+
error: `no deployment is bound for vertical '${scope.vertical ?? 'none'}'`,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
const entitlements = await admin.listEntitlements(actor, tenantId);
|
|
317
|
+
const identityLinks = (await admin.listIdentityLinks(actor, tenantId)).map(({ tenantId: _tenantId, ...link }) => link);
|
|
318
|
+
try {
|
|
319
|
+
await vertical.reconcileInstance({ tenantId, scopeId, entitlements, identityLinks });
|
|
320
|
+
}
|
|
321
|
+
catch (e) {
|
|
322
|
+
if (e instanceof ControlPlaneError)
|
|
323
|
+
return { status: 'pending', error: e.message };
|
|
324
|
+
throw e;
|
|
325
|
+
}
|
|
326
|
+
return { status: 'done', result: { tenantId, plan: payload.plan } };
|
|
327
|
+
};
|
|
328
|
+
}
|
|
133
329
|
//# sourceMappingURL=platform-drain.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-drain.js","sourceRoot":"","sources":["../src/platform-drain.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"platform-drain.js","sourceRoot":"","sources":["../src/platform-drain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type PlatformActorId, type TenantId, type TenantStoreHandle } from '@substrat-run/contracts';
|
|
2
|
+
import type { ScopeHost, TenantStoreRecord } from '@substrat-run/kernel';
|
|
3
|
+
import type { D1BindingSpec, PatchScriptBindingsFn } from './wfp.js';
|
|
4
|
+
/**
|
|
5
|
+
* The provision-time half of per-tenant relational stores (#301, PR-2): resolve what a
|
|
6
|
+
* vertical DECLARED (its bound version's stored manifest, `tenantStores`), have the host
|
|
7
|
+
* MINT each store for this tenant (idempotent — a retried provision re-resolves the same
|
|
8
|
+
* handles), make the stores REACHABLE at request time (attach the D1 bindings to the
|
|
9
|
+
* script that serves this vertical), and return the handles the K-31 provision callback
|
|
10
|
+
* hands over so the vertical runs its own migrations inside the existing fail-closed /
|
|
11
|
+
* retryable ready-gate.
|
|
12
|
+
*
|
|
13
|
+
* Substrate-agnostic by construction: a vertical with no retained manifest or no declared
|
|
14
|
+
* `tenantStores` yields `[]` (nothing changes for every existing vertical), and the
|
|
15
|
+
* binding attach only runs where a patcher is configured (Cloudflare) — the pure adapter
|
|
16
|
+
* has no script to patch and needs none, its handle refs open directly.
|
|
17
|
+
*/
|
|
18
|
+
export declare function collectTenantStoreHandles(opts: {
|
|
19
|
+
host: ScopeHost;
|
|
20
|
+
actor: PlatformActorId;
|
|
21
|
+
/** The vertical's registry slug — the id its ledger rows and manifest live under. */
|
|
22
|
+
slug: string;
|
|
23
|
+
tenantId: TenantId;
|
|
24
|
+
/** Attach bindings on the dispatch script (Cloudflare); absent = no attach step. */
|
|
25
|
+
patchBindings?: PatchScriptBindingsFn;
|
|
26
|
+
}): Promise<TenantStoreHandle[]>;
|
|
27
|
+
/** Ledger rows → the D1 bindings a script serving this vertical must carry (#301). */
|
|
28
|
+
export declare function tenantStoreBindings(ledger: TenantStoreRecord[]): D1BindingSpec[];
|
|
29
|
+
//# sourceMappingURL=tenant-stores.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-stores.d.ts","sourceRoot":"","sources":["../src/tenant-stores.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAErE;;;;;;;;;;;;;GAaG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,eAAe,CAAC;IACvB,qFAAqF;IACrF,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,oFAAoF;IACpF,aAAa,CAAC,EAAE,qBAAqB,CAAC;CACvC,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAmD/B;AAED,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,aAAa,EAAE,CAEhF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { storedDeployManifest, tenantStoreBindingName, } from '@substrat-run/contracts';
|
|
2
|
+
/**
|
|
3
|
+
* The provision-time half of per-tenant relational stores (#301, PR-2): resolve what a
|
|
4
|
+
* vertical DECLARED (its bound version's stored manifest, `tenantStores`), have the host
|
|
5
|
+
* MINT each store for this tenant (idempotent — a retried provision re-resolves the same
|
|
6
|
+
* handles), make the stores REACHABLE at request time (attach the D1 bindings to the
|
|
7
|
+
* script that serves this vertical), and return the handles the K-31 provision callback
|
|
8
|
+
* hands over so the vertical runs its own migrations inside the existing fail-closed /
|
|
9
|
+
* retryable ready-gate.
|
|
10
|
+
*
|
|
11
|
+
* Substrate-agnostic by construction: a vertical with no retained manifest or no declared
|
|
12
|
+
* `tenantStores` yields `[]` (nothing changes for every existing vertical), and the
|
|
13
|
+
* binding attach only runs where a patcher is configured (Cloudflare) — the pure adapter
|
|
14
|
+
* has no script to patch and needs none, its handle refs open directly.
|
|
15
|
+
*/
|
|
16
|
+
export async function collectTenantStoreHandles(opts) {
|
|
17
|
+
const admin = opts.host.admin;
|
|
18
|
+
// The version whose declaration governs is the one that will SERVE the provisioned
|
|
19
|
+
// scope: the serving script's version (#286) when one exists, else the prod channel —
|
|
20
|
+
// the same ladder provisioning itself resolves the VerticalClient through.
|
|
21
|
+
const serving = await admin.verticalServing(opts.actor, opts.slug).catch(() => null);
|
|
22
|
+
let versionId = serving?.versionId ?? null;
|
|
23
|
+
if (!versionId) {
|
|
24
|
+
const prod = (await admin.listChannels(opts.actor, opts.slug).catch(() => [])).find((c) => c.channel === 'prod');
|
|
25
|
+
versionId = prod?.versionId ?? null;
|
|
26
|
+
}
|
|
27
|
+
if (!versionId)
|
|
28
|
+
return [];
|
|
29
|
+
const manifestJson = await admin
|
|
30
|
+
.versionManifest(opts.actor, opts.slug, versionId)
|
|
31
|
+
.catch(() => null);
|
|
32
|
+
if (!manifestJson)
|
|
33
|
+
return []; // pre-#286 push or a statically-bound vertical: declares nothing
|
|
34
|
+
const needs = storedDeployManifest.parse(JSON.parse(manifestJson)).tenantStores;
|
|
35
|
+
if (needs.length === 0)
|
|
36
|
+
return [];
|
|
37
|
+
const handles = [];
|
|
38
|
+
for (const need of needs) {
|
|
39
|
+
handles.push(await opts.host.provisionTenantStore(opts.actor, {
|
|
40
|
+
tenantId: opts.tenantId,
|
|
41
|
+
vertical: opts.slug,
|
|
42
|
+
binding: need.binding,
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
// Attach the bindings where the worker will look them up
|
|
46
|
+
// (`env[tenantStoreBindingName(binding, tenantId)]`). Derived from the LEDGER, not the
|
|
47
|
+
// handles just minted, and re-run even on an idempotent re-provision — so a provision
|
|
48
|
+
// that crashed between the ledger write and the attach heals here, and the serving
|
|
49
|
+
// upload's own ledger-derived injection (serveVersionInPlace) keeps re-deploys honest.
|
|
50
|
+
// The target is the script provisioning dispatches to: the serving script, or the
|
|
51
|
+
// resolved version's own script for a vertical not yet serving in place.
|
|
52
|
+
if (opts.patchBindings) {
|
|
53
|
+
const scriptRef = serving?.ref ??
|
|
54
|
+
(await admin.listVersions(opts.actor, opts.slug)).find((v) => v.id === versionId)
|
|
55
|
+
?.deploymentRef ??
|
|
56
|
+
null;
|
|
57
|
+
if (scriptRef) {
|
|
58
|
+
const ledger = await admin.listTenantStores(opts.actor, { vertical: opts.slug });
|
|
59
|
+
await opts.patchBindings(scriptRef, tenantStoreBindings(ledger));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return handles;
|
|
63
|
+
}
|
|
64
|
+
/** Ledger rows → the D1 bindings a script serving this vertical must carry (#301). */
|
|
65
|
+
export function tenantStoreBindings(ledger) {
|
|
66
|
+
return ledger.map((r) => ({ name: tenantStoreBindingName(r.binding, r.tenantId), id: r.ref }));
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=tenant-stores.js.map
|