@xemahq/biome-database-nest 0.6.4 → 0.7.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/README.md +17 -108
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/bootstrap.d.ts +20 -2
- package/dist/lib/bootstrap.d.ts.map +1 -1
- package/dist/lib/bootstrap.js +71 -15
- package/dist/lib/bootstrap.js.map +1 -1
- package/dist/lib/external-runtime-verifier.d.ts +3 -0
- package/dist/lib/external-runtime-verifier.d.ts.map +1 -0
- package/dist/lib/external-runtime-verifier.js +225 -0
- package/dist/lib/external-runtime-verifier.js.map +1 -0
- package/dist/lib/migration-mode.d.ts +58 -0
- package/dist/lib/migration-mode.d.ts.map +1 -0
- package/dist/lib/migration-mode.js +27 -0
- package/dist/lib/migration-mode.js.map +1 -0
- package/dist/lib/nest/biome-database.module.d.ts +13 -2
- package/dist/lib/nest/biome-database.module.d.ts.map +1 -1
- package/dist/lib/nest/biome-database.module.js +36 -12
- package/dist/lib/nest/biome-database.module.js.map +1 -1
- package/dist/lib/response-envelope.d.ts +1 -1
- package/dist/lib/response-envelope.d.ts.map +1 -1
- package/dist/lib/response-envelope.js +3 -23
- package/dist/lib/response-envelope.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<path d="M26 12 L41 21 L41 39 L26 48 L11 39 L11 21 Z" fill="#8B5CF6"/>
|
|
7
7
|
</g>
|
|
8
8
|
<text x="92" y="52" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="22" fill="#F8FAFC" font-weight="700">@xemahq/biome-database-nest</text>
|
|
9
|
-
<text x="92" y="80" font-family="ui-sans-serif,system-ui,sans-serif" font-size="15" fill="#94A3B8">
|
|
9
|
+
<text x="92" y="80" font-family="ui-sans-serif,system-ui,sans-serif" font-size="15" fill="#94A3B8">Explicit database ownership and runtime wiring for Xema biomes</text>
|
|
10
10
|
<text x="652" y="105" text-anchor="end" font-family="ui-sans-serif,system-ui,sans-serif" font-size="12" fill="#475569">xema.dev</text>
|
|
11
11
|
</svg>
|
|
12
12
|
</p>
|
|
@@ -24,106 +24,20 @@
|
|
|
24
24
|
|
|
25
25
|
# @xemahq/biome-database-nest
|
|
26
26
|
|
|
27
|
-
>
|
|
28
|
-
|
|
29
|
-
This package belongs to Layer 1 — it depends only on Layer 0 contracts and
|
|
30
|
-
other Layer 1 SDKs plus npm libraries, and carries zero domain knowledge.
|
|
27
|
+
> Explicit database ownership and runtime wiring for Xema biomes
|
|
31
28
|
|
|
32
29
|
## Overview
|
|
33
30
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
- **The schema-qualified driver-adapter.** `createBiomePrismaAdapter` (and its
|
|
40
|
-
`…FromEnv` sibling) build a `PrismaPg` pool that passes the schema as the
|
|
41
|
-
second constructor argument — the one thing that makes Prisma qualify
|
|
42
|
-
`biome_<id>.<table>` instead of `public.<table>`. Raw queries are covered
|
|
43
|
-
separately via the libpq `search_path` option.
|
|
44
|
-
- **The schema-naming convention.** `deriveBiomeSchemaName(biomeId, dbKey?)`
|
|
45
|
-
produces a deterministic, collision-resistant, 63-byte-safe schema name so
|
|
46
|
-
two biomes never collide.
|
|
47
|
-
- **Config resolution.** `resolveBiomeDatabaseConfigFromEnv` reads the standard
|
|
48
|
-
`DB_*` contract (with per-key suffixes); `fetchSystemDatabaseConfig` pulls a
|
|
49
|
-
fully-resolved config from the control plane.
|
|
50
|
-
- **Boot-time bootstrap.** `bootstrapBiomeDatabases` resolves config, writes an
|
|
51
|
-
inline CA cert if supplied, creates the schema under an advisory lock, runs
|
|
52
|
-
`prisma migrate deploy`, and exports the resolved connection into the env.
|
|
53
|
-
- **Systematic org-tenant isolation.** `createBiomePrismaService` detects
|
|
54
|
-
org-scoped models (any model with an `orgId` column) from the client's
|
|
55
|
-
runtime data model and scopes every query on them to the request's org via a
|
|
56
|
-
Prisma client extension — no hand-written `where: { orgId }` per service.
|
|
57
|
-
|
|
58
|
-
## Tenant isolation
|
|
59
|
-
|
|
60
|
-
Org-scoped access is pushed down into the client so it is systematic instead of
|
|
61
|
-
hand-written. Any model declaring the org column (default `orgId`; configurable
|
|
62
|
-
via `tenantIsolation.orgField`, opt-outs via `tenantIsolation.exemptModels`) is
|
|
63
|
-
detected at client construction and covered by the isolation extension.
|
|
64
|
-
|
|
65
|
-
### Modes
|
|
66
|
-
|
|
67
|
-
Resolution: `tenantIsolation.mode` option > `XEMA_TENANT_ISOLATION_MODE` env
|
|
68
|
-
var > default `observe`. An invalid env value fails the boot — it never
|
|
69
|
-
silently weakens the mode.
|
|
70
|
-
|
|
71
|
-
| Mode | Behavior of the default injected client |
|
|
72
|
-
| --- | --- |
|
|
73
|
-
| `observe` (default) | NO query is rewritten. Every violation `enforce` would reject (org mismatch in a write payload, org-model access with no org context) is logged as a structured warning. |
|
|
74
|
-
| `enforce` | `where` clauses are AND-ed with `{ orgId }` (unique wheres included — a cross-org `findUnique` returns `null`, a cross-org `update`/`delete` raises P2025); create payloads are stamped with the org; violations throw a typed `TenantIsolationError`. |
|
|
75
|
-
| `off` | Passthrough kill switch. `forOrg()` still enforces — explicit scoping is never silently degraded. |
|
|
76
|
-
|
|
77
|
-
The **rollout story** is deliberate: everything ships in `observe` (zero
|
|
78
|
-
behavior change across ~60 services), each service burns down its warnings,
|
|
79
|
-
then flips itself to `enforce` via `XEMA_TENANT_ISOLATION_MODE=enforce` (or the
|
|
80
|
-
module option). `enforce` is the target state; `off` exists only as an
|
|
81
|
-
emergency kill switch.
|
|
82
|
-
|
|
83
|
-
### Where the org comes from
|
|
84
|
-
|
|
85
|
-
Inside a request, the org is the `RequestContext.orgId` that
|
|
86
|
-
`RequestContextMiddleware` resolved. `AmbientOrgContextMiddleware`
|
|
87
|
-
(`@xemahq/platform-common`) runs right after it and lifts the org into the
|
|
88
|
-
ambient async scope the extension reads. Services wired through
|
|
89
|
-
`configureAuthMiddleware` / `applyXemaServiceMiddleware` get BOTH middlewares
|
|
90
|
-
automatically — no per-service wiring is needed.
|
|
91
|
-
|
|
92
|
-
### The boot-path rule
|
|
93
|
-
|
|
94
|
-
Outside a request (boot, migrations, seeding, contribution sync, Temporal
|
|
95
|
-
activities, background workers) there is NO ambient org. In `enforce` mode,
|
|
96
|
-
touching an org-scoped model there throws. Scope explicitly:
|
|
97
|
-
|
|
98
|
-
```ts
|
|
99
|
-
// Jobs/workers acting for one org — hard-bound, always enforced:
|
|
100
|
-
const scoped = prisma.forOrg(orgId);
|
|
101
|
-
await scoped.artifact.findMany(); // implicitly WHERE orgId = <orgId>
|
|
102
|
-
|
|
103
|
-
// Legitimate cross-org system paths (boot backfills, platform admin):
|
|
104
|
-
const system = prisma.asSystem(); // unscoped; debug-logged per call site
|
|
105
|
-
|
|
106
|
-
// Non-HTTP entrypoints that DO have an org (queue consumers, activities):
|
|
107
|
-
// runWithAmbientOrg comes from @xemahq/platform-common.
|
|
108
|
-
await runWithAmbientOrg(orgId, () => handler());
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
`forOrg(orgId)` always enforces, in every mode. `asSystem()` returns the raw
|
|
112
|
-
client and logs each distinct call site once at debug level.
|
|
113
|
-
|
|
114
|
-
### Conformance testing
|
|
115
|
-
|
|
116
|
-
`@xemahq/biome-test-utils` exports `assertTenantIsolation(client, { orgA,
|
|
117
|
-
orgB, models })` — given the wrapped client and a list of org-scoped model
|
|
118
|
-
probes, it verifies cross-org reads return empty/null, cross-org writes throw,
|
|
119
|
-
and `asSystem()` sees both orgs, cleaning up after itself.
|
|
31
|
+
This package centralizes schema-qualified Prisma construction and database
|
|
32
|
+
bootstrap for Xema biome services. Every consumer explicitly selects whether
|
|
33
|
+
the application or an external process owns migrations. Externally managed
|
|
34
|
+
services receive only a verified runtime connection and must prove target
|
|
35
|
+
identity, least privilege, required DML access, and migration compatibility.
|
|
120
36
|
|
|
121
37
|
## When to use it
|
|
122
38
|
|
|
123
|
-
- Use it
|
|
124
|
-
|
|
125
|
-
- Reach for `createBiomePrismaAdapterFromEnv` in a `PrismaService` constructor,
|
|
126
|
-
and `bootstrapBiomeDatabases` at service boot before Nest starts.
|
|
39
|
+
- Use it when a NestJS biome service needs a schema-qualified Prisma connection.
|
|
40
|
+
- Select externally managed migrations when deployment operations own all DDL.
|
|
127
41
|
|
|
128
42
|
## Installation
|
|
129
43
|
|
|
@@ -135,26 +49,21 @@ pnpm add @xemahq/biome-database-nest
|
|
|
135
49
|
|
|
136
50
|
```ts
|
|
137
51
|
import {
|
|
138
|
-
|
|
139
|
-
|
|
52
|
+
BiomeDatabaseMigrationMode,
|
|
53
|
+
BiomeDatabaseModule,
|
|
140
54
|
} from '@xemahq/biome-database-nest';
|
|
141
55
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
databases: [
|
|
146
|
-
registry,
|
|
147
|
-
serviceToken: () => identity.getAccessToken(),
|
|
56
|
+
BiomeDatabaseModule.forRoot({
|
|
57
|
+
biomeId: 'example',
|
|
58
|
+
migrationMode: BiomeDatabaseMigrationMode.ExternallyManaged,
|
|
59
|
+
databases: [externallyManagedDatabase],
|
|
148
60
|
});
|
|
149
|
-
|
|
150
|
-
// In PrismaService:
|
|
151
|
-
const adapter = createBiomePrismaAdapterFromEnv(process.env);
|
|
152
61
|
```
|
|
153
62
|
|
|
154
63
|
## Peer requirements
|
|
155
64
|
|
|
156
|
-
-
|
|
157
|
-
|
|
65
|
+
- NestJS 10 or 11 and Prisma 7.
|
|
66
|
+
- Compatible Xema identity, kernel-contract, service-registry, and decorator packages.
|
|
158
67
|
|
|
159
68
|
## License
|
|
160
69
|
|
package/dist/index.d.ts
CHANGED
|
@@ -6,8 +6,9 @@ export { resolveBiomeDatabaseConfigFromEnv, type BiomeDatabaseConfig, } from './
|
|
|
6
6
|
export { createBiomePrismaAdapter, createBiomePrismaAdapterFromEnv, } from './lib/adapter';
|
|
7
7
|
export { fetchSystemDatabaseConfig, type SystemDatabaseConfigRequest, } from './lib/control-plane-client';
|
|
8
8
|
export { resolveControlPlaneBaseUrl, ORG_DATABASE_POOL_SERVICE_NAME, type ControlPlaneDiscoveryOptions, } from './lib/control-plane-discovery';
|
|
9
|
-
export { bootstrapBiomeDatabases, type BiomeDatabaseDeclaration, type BootstrapBiomeDatabasesOptions, } from './lib/bootstrap';
|
|
10
|
-
export {
|
|
9
|
+
export { bootstrapBiomeDatabases, type BiomeDatabaseDeclaration, type ExternallyManagedBiomeDatabaseDeclaration, type ApplicationManagedBootstrapOptions, type ExternallyManagedBootstrapOptions, type BootstrapBiomeDatabasesOptions, } from './lib/bootstrap';
|
|
10
|
+
export { BiomeDatabaseMigrationMode, RuntimeDatabaseCredentialSource, RuntimeSequencePrivilege, RuntimeTablePrivilege, type AppliedPrismaMigration, type MigrationCompatibilityContext, type MigrationCompatibilityExpectation, type MigrationCompatibilityProof, type RuntimeDatabaseAccessExpectation, type RuntimeDatabaseTarget, } from './lib/migration-mode';
|
|
11
|
+
export { BiomeDatabaseModule, BIOME_DATABASE_READY, type ApplicationManagedBiomeDatabaseModuleOptions, type ExternallyManagedBiomeDatabaseModuleOptions, type BiomeDatabaseModuleOptions, } from './lib/nest/biome-database.module';
|
|
11
12
|
export { createBiomePrismaService, type BiomePrismaClient, type BiomePrismaClientCtor, type BiomePrismaServiceInstance, type CreateBiomePrismaServiceOptions, type TenantIsolationServiceOptions, type TenantScopedApi, } from './lib/nest/prisma-service-factory';
|
|
12
13
|
export { TenantIsolationMode, TENANT_ISOLATION_MODE_ENV_VAR, resolveTenantIsolationMode, } from './lib/tenant-isolation/tenant-isolation-mode';
|
|
13
14
|
export { TenantIsolationError, TenantIsolationViolationKind, formatTenantIsolationViolation, type TenantIsolationViolation, } from './lib/tenant-isolation/tenant-isolation-error';
|
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,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,sBAAsB,EACtB,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,2BAA2B,EAC3B,yBAAyB,EACzB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EACL,iCAAiC,EACjC,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,wBAAwB,EACxB,+BAA+B,GAChC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EACzB,KAAK,2BAA2B,GACjC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,KAAK,4BAA4B,GAClC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,uBAAuB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,GACpC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,0BAA0B,GAChC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,+BAA+B,EACpC,KAAK,6BAA6B,EAClC,KAAK,eAAe,GACrB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,mBAAmB,EACnB,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC5B,8BAA8B,EAC9B,KAAK,wBAAwB,GAC9B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,8BAA8B,EAC9B,iBAAiB,EACjB,KAAK,qCAAqC,EAC1C,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,kCAAkC,EACvC,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,GACjC,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACvB,yBAAyB,EACzB,kCAAkC,EAClC,6BAA6B,EAC7B,KAAK,2BAA2B,EAChC,KAAK,kCAAkC,EACvC,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,GAC/B,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,2BAA2B,EAC3B,sBAAsB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,GACtB,MAAM,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.OrgErasureController = exports.OrgErasureModule = exports.OrgErasureBlockedError = exports.eraseOrgData = exports.UndeclaredUnscopedModelsError = exports.normalizeUnscopedModelDeclarations = exports.formatUnscopedModelReport = exports.collectUnscopableModels = exports.assertUnscopedModelsDeclared = exports.readRuntimeModels = exports.createTenantIsolationExtension = exports.collectOrgScopedModels = exports.DEFAULT_ORG_FIELD = exports.scopeArgsToOrg = exports.PrismaModelOperation = exports.formatTenantIsolationViolation = exports.TenantIsolationViolationKind = exports.TenantIsolationError = exports.resolveTenantIsolationMode = exports.TENANT_ISOLATION_MODE_ENV_VAR = exports.TenantIsolationMode = exports.createBiomePrismaService = exports.BIOME_DATABASE_READY = exports.BiomeDatabaseModule = exports.RuntimeTablePrivilege = exports.RuntimeSequencePrivilege = exports.RuntimeDatabaseCredentialSource = exports.BiomeDatabaseMigrationMode = exports.bootstrapBiomeDatabases = exports.ORG_DATABASE_POOL_SERVICE_NAME = exports.resolveControlPlaneBaseUrl = exports.fetchSystemDatabaseConfig = exports.createBiomePrismaAdapterFromEnv = exports.createBiomePrismaAdapter = exports.resolveBiomeDatabaseConfigFromEnv = exports.unwrapPlatformResponseEnvelope = exports.SCHEMA_ROLE_SUFFIX_LENGTH = exports.SCHEMA_ROLE_BASE_MAX_LENGTH = exports.SchemaRoleKind = exports.schemaRoleName = exports.schemaRoleBase = exports.rolesForSchema = exports.sanitizeIdentifierSegment = exports.sanitizeIdentifierChars = exports.POSTGRES_MAX_IDENTIFIER_LENGTH = exports.IDENTIFIER_HASH_LENGTH = exports.fitIdentifier = exports.composeIdentifier = exports.deriveBiomeSchemaName = exports.DEFAULT_BIOME_DB_KEY = void 0;
|
|
4
|
+
exports.ORG_ERASURE_ROUTE_PATH = exports.ORG_DATA_ERASURE_CAPABILITY = exports.ORG_ERASURE_RUNNER = void 0;
|
|
4
5
|
var schema_name_1 = require("./lib/schema-name");
|
|
5
6
|
Object.defineProperty(exports, "DEFAULT_BIOME_DB_KEY", { enumerable: true, get: function () { return schema_name_1.DEFAULT_BIOME_DB_KEY; } });
|
|
6
7
|
Object.defineProperty(exports, "deriveBiomeSchemaName", { enumerable: true, get: function () { return schema_name_1.deriveBiomeSchemaName; } });
|
|
@@ -32,6 +33,11 @@ Object.defineProperty(exports, "resolveControlPlaneBaseUrl", { enumerable: true,
|
|
|
32
33
|
Object.defineProperty(exports, "ORG_DATABASE_POOL_SERVICE_NAME", { enumerable: true, get: function () { return control_plane_discovery_1.ORG_DATABASE_POOL_SERVICE_NAME; } });
|
|
33
34
|
var bootstrap_1 = require("./lib/bootstrap");
|
|
34
35
|
Object.defineProperty(exports, "bootstrapBiomeDatabases", { enumerable: true, get: function () { return bootstrap_1.bootstrapBiomeDatabases; } });
|
|
36
|
+
var migration_mode_1 = require("./lib/migration-mode");
|
|
37
|
+
Object.defineProperty(exports, "BiomeDatabaseMigrationMode", { enumerable: true, get: function () { return migration_mode_1.BiomeDatabaseMigrationMode; } });
|
|
38
|
+
Object.defineProperty(exports, "RuntimeDatabaseCredentialSource", { enumerable: true, get: function () { return migration_mode_1.RuntimeDatabaseCredentialSource; } });
|
|
39
|
+
Object.defineProperty(exports, "RuntimeSequencePrivilege", { enumerable: true, get: function () { return migration_mode_1.RuntimeSequencePrivilege; } });
|
|
40
|
+
Object.defineProperty(exports, "RuntimeTablePrivilege", { enumerable: true, get: function () { return migration_mode_1.RuntimeTablePrivilege; } });
|
|
35
41
|
var biome_database_module_1 = require("./lib/nest/biome-database.module");
|
|
36
42
|
Object.defineProperty(exports, "BiomeDatabaseModule", { enumerable: true, get: function () { return biome_database_module_1.BiomeDatabaseModule; } });
|
|
37
43
|
Object.defineProperty(exports, "BIOME_DATABASE_READY", { enumerable: true, get: function () { return biome_database_module_1.BIOME_DATABASE_READY; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,iDAAgF;AAAvE,mHAAA,oBAAoB,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AACpD,+CAS0B;AARxB,+GAAA,iBAAiB,OAAA;AACjB,2GAAA,aAAa,OAAA;AACb,oHAAA,sBAAsB,OAAA;AACtB,4HAAA,8BAA8B,OAAA;AAC9B,qHAAA,uBAAuB,OAAA;AACvB,uHAAA,yBAAyB,OAAA;AAI3B,+CAQ0B;AAPxB,4GAAA,cAAc,OAAA;AACd,4GAAA,cAAc,OAAA;AACd,4GAAA,cAAc,OAAA;AACd,4GAAA,cAAc,OAAA;AACd,yHAAA,2BAA2B,OAAA;AAC3B,uHAAA,yBAAyB,OAAA;AAG3B,6DAAyE;AAAhE,mIAAA,8BAA8B,OAAA;AACvC,uCAGsB;AAFpB,2HAAA,iCAAiC,OAAA;AAGnC,yCAGuB;AAFrB,mHAAA,wBAAwB,OAAA;AACxB,0HAAA,+BAA+B,OAAA;AAEjC,mEAGoC;AAFlC,iIAAA,yBAAyB,OAAA;AAG3B,yEAIuC;AAHrC,qIAAA,0BAA0B,OAAA;AAC1B,yIAAA,8BAA8B,OAAA;AAGhC,6CAOyB;AANvB,oHAAA,uBAAuB,OAAA;AAOzB,uDAW8B;AAV5B,4HAAA,0BAA0B,OAAA;AAC1B,iIAAA,+BAA+B,OAAA;AAC/B,0HAAA,wBAAwB,OAAA;AACxB,uHAAA,qBAAqB,OAAA;AAQvB,0EAM0C;AALxC,4HAAA,mBAAmB,OAAA;AACnB,6HAAA,oBAAoB,OAAA;AAKtB,4EAQ2C;AAPzC,kIAAA,wBAAwB,OAAA;AAQ1B,sFAIsD;AAHpD,4HAAA,mBAAmB,OAAA;AACnB,sIAAA,6BAA6B,OAAA;AAC7B,mIAAA,0BAA0B,OAAA;AAE5B,wFAKuD;AAJrD,8HAAA,oBAAoB,OAAA;AACpB,sIAAA,4BAA4B,OAAA;AAC5B,wIAAA,8BAA8B,OAAA;AAGhC,8DAK0C;AAJxC,iHAAA,oBAAoB,OAAA;AACpB,2GAAA,cAAc,OAAA;AAIhB,gGAW2D;AAVzD,+HAAA,iBAAiB,OAAA;AACjB,oIAAA,sBAAsB,OAAA;AACtB,4IAAA,8BAA8B,OAAA;AAC9B,+HAAA,iBAAiB,OAAA;AAQnB,0EAUgD;AAT9C,+HAAA,4BAA4B,OAAA;AAC5B,0HAAA,uBAAuB,OAAA;AACvB,4HAAA,yBAAyB,OAAA;AACzB,qIAAA,kCAAkC,OAAA;AAClC,gIAAA,6BAA6B,OAAA;AAM/B,kEAK4C;AAJ1C,2GAAA,YAAY,OAAA;AACZ,qHAAA,sBAAsB,OAAA;AAIxB,oEAQuC;AAPrC,sHAAA,gBAAgB,OAAA;AAChB,0HAAA,oBAAoB,OAAA;AACpB,wHAAA,kBAAkB,OAAA;AAClB,iIAAA,2BAA2B,OAAA;AAC3B,4HAAA,sBAAsB,OAAA"}
|
package/dist/lib/bootstrap.d.ts
CHANGED
|
@@ -1,16 +1,34 @@
|
|
|
1
1
|
import type { KernelState } from '@xemahq/kernel-contracts/kernel-state';
|
|
2
2
|
import { type ControlPlaneDiscoveryOptions } from './control-plane-discovery';
|
|
3
|
+
import { BiomeDatabaseMigrationMode, RuntimeDatabaseCredentialSource, type MigrationCompatibilityExpectation, type RuntimeDatabaseAccessExpectation, type RuntimeDatabaseTarget } from './migration-mode';
|
|
3
4
|
export interface BiomeDatabaseDeclaration {
|
|
4
5
|
readonly key?: string;
|
|
5
6
|
readonly workspaceDir: string;
|
|
6
7
|
}
|
|
7
|
-
export interface
|
|
8
|
+
export interface ExternallyManagedBiomeDatabaseDeclaration {
|
|
9
|
+
readonly key?: string;
|
|
10
|
+
readonly credentialSource: RuntimeDatabaseCredentialSource;
|
|
11
|
+
readonly expectedTarget: RuntimeDatabaseTarget;
|
|
12
|
+
readonly runtimeAccess: RuntimeDatabaseAccessExpectation;
|
|
13
|
+
readonly migrationCompatibility: MigrationCompatibilityExpectation;
|
|
14
|
+
}
|
|
15
|
+
interface BootstrapBiomeDatabasesCommonOptions {
|
|
8
16
|
readonly biomeId: string;
|
|
9
|
-
readonly databases: readonly BiomeDatabaseDeclaration[];
|
|
10
17
|
readonly serviceToken?: string | (() => Promise<string>);
|
|
11
18
|
readonly kernelState: KernelState;
|
|
12
19
|
readonly controlPlaneDiscovery?: ControlPlaneDiscoveryOptions;
|
|
20
|
+
}
|
|
21
|
+
export interface ApplicationManagedBootstrapOptions extends BootstrapBiomeDatabasesCommonOptions {
|
|
22
|
+
readonly migrationMode: BiomeDatabaseMigrationMode.ApplicationManaged;
|
|
23
|
+
readonly databases: readonly BiomeDatabaseDeclaration[];
|
|
13
24
|
readonly requiredExtensions?: readonly string[];
|
|
14
25
|
}
|
|
26
|
+
export interface ExternallyManagedBootstrapOptions extends BootstrapBiomeDatabasesCommonOptions {
|
|
27
|
+
readonly migrationMode: BiomeDatabaseMigrationMode.ExternallyManaged;
|
|
28
|
+
readonly databases: readonly ExternallyManagedBiomeDatabaseDeclaration[];
|
|
29
|
+
readonly requiredExtensions?: never;
|
|
30
|
+
}
|
|
31
|
+
export type BootstrapBiomeDatabasesOptions = ApplicationManagedBootstrapOptions | ExternallyManagedBootstrapOptions;
|
|
15
32
|
export declare function bootstrapBiomeDatabases(opts: BootstrapBiomeDatabasesOptions): Promise<void>;
|
|
33
|
+
export {};
|
|
16
34
|
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/lib/bootstrap.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAWzE,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/lib/bootstrap.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAWzE,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,0BAA0B,EAC1B,+BAA+B,EAC/B,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,EACrC,KAAK,qBAAqB,EAC3B,MAAM,kBAAkB,CAAC;AAI1B,MAAM,WAAW,wBAAwB;IAEvC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAGD,MAAM,WAAW,yCAAyC;IAExD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,gBAAgB,EAAE,+BAA+B,CAAC;IAE3D,QAAQ,CAAC,cAAc,EAAE,qBAAqB,CAAC;IAE/C,QAAQ,CAAC,aAAa,EAAE,gCAAgC,CAAC;IAEzD,QAAQ,CAAC,sBAAsB,EAAE,iCAAiC,CAAC;CACpE;AAED,UAAU,oCAAoC;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAMzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAOzD,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAElC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,4BAA4B,CAAC;CAC/D;AAED,MAAM,WAAW,kCACf,SAAQ,oCAAoC;IAC5C,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC,kBAAkB,CAAC;IACtE,QAAQ,CAAC,SAAS,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAWxD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,iCACf,SAAQ,oCAAoC;IAC5C,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC,iBAAiB,CAAC;IACrE,QAAQ,CAAC,SAAS,EAAE,SAAS,yCAAyC,EAAE,CAAC;IAEzE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC;CACrC;AAED,MAAM,MAAM,8BAA8B,GACtC,kCAAkC,GAClC,iCAAiC,CAAC;AA6VtC,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,8BAA8B,GACnC,OAAO,CAAC,IAAI,CAAC,CAiFf"}
|
package/dist/lib/bootstrap.js
CHANGED
|
@@ -12,6 +12,8 @@ const pg_1 = require("pg");
|
|
|
12
12
|
const config_1 = require("./config");
|
|
13
13
|
const control_plane_client_1 = require("./control-plane-client");
|
|
14
14
|
const control_plane_discovery_1 = require("./control-plane-discovery");
|
|
15
|
+
const external_runtime_verifier_1 = require("./external-runtime-verifier");
|
|
16
|
+
const migration_mode_1 = require("./migration-mode");
|
|
15
17
|
const schema_name_1 = require("./schema-name");
|
|
16
18
|
const LOG_PREFIX = '[biome-database]';
|
|
17
19
|
function upperKeySuffix(key) {
|
|
@@ -38,6 +40,26 @@ async function resolveDatabaseConfig(opts, key, getControlPlaneBaseUrl) {
|
|
|
38
40
|
...(key !== schema_name_1.DEFAULT_BIOME_DB_KEY ? { dbKey: key } : {}),
|
|
39
41
|
});
|
|
40
42
|
}
|
|
43
|
+
async function resolveExternalRuntimeConfig(opts, key, credentialSource, getControlPlaneBaseUrl) {
|
|
44
|
+
switch (credentialSource) {
|
|
45
|
+
case migration_mode_1.RuntimeDatabaseCredentialSource.Environment: {
|
|
46
|
+
const local = (0, config_1.resolveBiomeDatabaseConfigFromEnv)(process.env, key);
|
|
47
|
+
if (local === null) {
|
|
48
|
+
throw new Error(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: external runtime ` +
|
|
49
|
+
'credential source is environment, but no complete DB_* config exists.');
|
|
50
|
+
}
|
|
51
|
+
return local;
|
|
52
|
+
}
|
|
53
|
+
case migration_mode_1.RuntimeDatabaseCredentialSource.ControlPlane: {
|
|
54
|
+
const baseUrl = await getControlPlaneBaseUrl();
|
|
55
|
+
const token = await resolveServiceToken(opts.serviceToken);
|
|
56
|
+
return (0, control_plane_client_1.fetchSystemDatabaseConfig)(baseUrl, token, {
|
|
57
|
+
biomeId: opts.biomeId,
|
|
58
|
+
...(key !== schema_name_1.DEFAULT_BIOME_DB_KEY ? { dbKey: key } : {}),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
41
63
|
async function materializeInlineCaCert(biomeId, key, config) {
|
|
42
64
|
if (config.caCertPem === undefined || config.caCertPem === '') {
|
|
43
65
|
return config;
|
|
@@ -98,7 +120,9 @@ async function ensureSchemaExists(biomeId, key, config, requiredExtensions) {
|
|
|
98
120
|
}
|
|
99
121
|
if (hasSchema) {
|
|
100
122
|
await client.query('BEGIN');
|
|
101
|
-
await client.query('SELECT pg_advisory_xact_lock(hashtext($1))', [
|
|
123
|
+
await client.query('SELECT pg_advisory_xact_lock(hashtext($1))', [
|
|
124
|
+
schema,
|
|
125
|
+
]);
|
|
102
126
|
await client.query(`CREATE SCHEMA IF NOT EXISTS "${schema}"`);
|
|
103
127
|
await client.query('COMMIT');
|
|
104
128
|
console.log(`${LOG_PREFIX} biome=${biomeId} key=${key}: ensured schema "${schema}" exists`);
|
|
@@ -112,8 +136,8 @@ async function ensureSchemaExists(biomeId, key, config, requiredExtensions) {
|
|
|
112
136
|
await client.end();
|
|
113
137
|
}
|
|
114
138
|
}
|
|
115
|
-
|
|
116
|
-
const
|
|
139
|
+
function buildDirectConnectionUrl(biomeId, key, config) {
|
|
140
|
+
const directUrl = (0, platform_common_1.composeBiomeDatabaseUrl)({
|
|
117
141
|
user: config.username,
|
|
118
142
|
password: config.password,
|
|
119
143
|
host: config.host,
|
|
@@ -122,23 +146,25 @@ async function runMigrations(biomeId, key, workspaceDir, config) {
|
|
|
122
146
|
...(config.schema !== undefined ? { schema: config.schema } : {}),
|
|
123
147
|
...(config.sslParams !== undefined ? { sslParams: config.sslParams } : {}),
|
|
124
148
|
});
|
|
125
|
-
if (
|
|
126
|
-
throw new Error(`${LOG_PREFIX} biome=${biomeId} key=${key}: incomplete config — cannot form a
|
|
149
|
+
if (directUrl === null) {
|
|
150
|
+
throw new Error(`${LOG_PREFIX} biome=${biomeId} key=${key}: incomplete config — cannot form a database URL.`);
|
|
127
151
|
}
|
|
152
|
+
return (0, platform_common_1.ensureBiomeDbSearchPath)(directUrl);
|
|
153
|
+
}
|
|
154
|
+
async function runMigrations(biomeId, key, workspaceDir, migrateUrl) {
|
|
128
155
|
console.log(`${LOG_PREFIX} biome=${biomeId} key=${key}: running prisma migrate deploy (cwd=${workspaceDir})`);
|
|
129
156
|
const result = await new migration_runner_prisma_1.PrismaMigrationRunner().run({
|
|
130
157
|
workspaceDir,
|
|
131
|
-
connectionUrl:
|
|
158
|
+
connectionUrl: migrateUrl,
|
|
132
159
|
env: {},
|
|
133
160
|
});
|
|
134
161
|
if (result.exitCode !== 0) {
|
|
135
162
|
throw new Error(`${LOG_PREFIX} biome=${biomeId} key=${key}: migrations failed (exit ${result.exitCode}):\n${result.output}`);
|
|
136
163
|
}
|
|
137
|
-
return migrateUrl;
|
|
138
164
|
}
|
|
139
|
-
function buildRuntimeUrl(biomeId, key, config,
|
|
165
|
+
function buildRuntimeUrl(biomeId, key, config, directUrl) {
|
|
140
166
|
if (config.poolerHost === undefined || config.poolerHost === '') {
|
|
141
|
-
return (0, platform_common_1.ensureBiomeDbSearchPath)(
|
|
167
|
+
return (0, platform_common_1.ensureBiomeDbSearchPath)(directUrl);
|
|
142
168
|
}
|
|
143
169
|
const pooledUrl = (0, platform_common_1.composeBiomeDatabaseUrl)({
|
|
144
170
|
user: config.username,
|
|
@@ -152,9 +178,23 @@ function buildRuntimeUrl(biomeId, key, config, directMigrateUrl) {
|
|
|
152
178
|
if (pooledUrl === null) {
|
|
153
179
|
throw new Error(`${LOG_PREFIX} biome=${biomeId} key=${key}: incomplete config — cannot form a pooled runtime URL.`);
|
|
154
180
|
}
|
|
155
|
-
console.log(`${LOG_PREFIX} biome=${biomeId} key=${key}: runtime routed through pooler ${config.poolerHost}:${config.poolerPort ?? config.port}
|
|
181
|
+
console.log(`${LOG_PREFIX} biome=${biomeId} key=${key}: runtime routed through pooler ${config.poolerHost}:${config.poolerPort ?? config.port}`);
|
|
156
182
|
return (0, platform_common_1.ensureBiomeDbSearchPath)(pooledUrl);
|
|
157
183
|
}
|
|
184
|
+
function withApplicationName(url, applicationName) {
|
|
185
|
+
const parsed = new URL(url);
|
|
186
|
+
parsed.searchParams.set('application_name', applicationName);
|
|
187
|
+
return parsed.toString();
|
|
188
|
+
}
|
|
189
|
+
function assertExternalTargetMatchesConfig(biomeId, key, config, target) {
|
|
190
|
+
const configuredSchema = config.schema ?? 'public';
|
|
191
|
+
if (config.database !== target.database ||
|
|
192
|
+
configuredSchema !== target.schema) {
|
|
193
|
+
throw new Error(`${LOG_PREFIX} biome=${biomeId} key=${key}: resolved runtime target ` +
|
|
194
|
+
`${config.database}/${configuredSchema} does not match expected ` +
|
|
195
|
+
`${target.database}/${target.schema}.`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
158
198
|
function exportResolvedEnv(key, config, runtimeUrl) {
|
|
159
199
|
const suffix = upperKeySuffix(key);
|
|
160
200
|
process.env[`DATABASE_URL${suffix}`] = runtimeUrl;
|
|
@@ -170,14 +210,30 @@ async function bootstrapBiomeDatabases(opts) {
|
|
|
170
210
|
}
|
|
171
211
|
return cachedBaseUrl;
|
|
172
212
|
};
|
|
213
|
+
if (opts.migrationMode === migration_mode_1.BiomeDatabaseMigrationMode.ApplicationManaged) {
|
|
214
|
+
for (const decl of opts.databases) {
|
|
215
|
+
const key = decl.key ?? schema_name_1.DEFAULT_BIOME_DB_KEY;
|
|
216
|
+
console.log(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: resolving config for mode=${opts.migrationMode}`);
|
|
217
|
+
const rawConfig = await resolveDatabaseConfig(opts, key, getControlPlaneBaseUrl);
|
|
218
|
+
const config = await materializeInlineCaCert(opts.biomeId, key, rawConfig);
|
|
219
|
+
const directUrl = buildDirectConnectionUrl(opts.biomeId, key, config);
|
|
220
|
+
await ensureSchemaExists(opts.biomeId, key, config, opts.requiredExtensions ?? []);
|
|
221
|
+
await runMigrations(opts.biomeId, key, decl.workspaceDir, directUrl);
|
|
222
|
+
const runtimeUrl = buildRuntimeUrl(opts.biomeId, key, config, directUrl);
|
|
223
|
+
exportResolvedEnv(key, config, runtimeUrl);
|
|
224
|
+
console.log(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: bootstrap complete`);
|
|
225
|
+
}
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
173
228
|
for (const decl of opts.databases) {
|
|
174
229
|
const key = decl.key ?? schema_name_1.DEFAULT_BIOME_DB_KEY;
|
|
175
|
-
console.log(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: resolving config`);
|
|
176
|
-
const rawConfig = await
|
|
230
|
+
console.log(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: resolving config for mode=${opts.migrationMode}`);
|
|
231
|
+
const rawConfig = await resolveExternalRuntimeConfig(opts, key, decl.credentialSource, getControlPlaneBaseUrl);
|
|
177
232
|
const config = await materializeInlineCaCert(opts.biomeId, key, rawConfig);
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
const runtimeUrl = buildRuntimeUrl(opts.biomeId, key, config,
|
|
233
|
+
const directUrl = buildDirectConnectionUrl(opts.biomeId, key, config);
|
|
234
|
+
assertExternalTargetMatchesConfig(opts.biomeId, key, config, decl.expectedTarget);
|
|
235
|
+
const runtimeUrl = withApplicationName(buildRuntimeUrl(opts.biomeId, key, config, directUrl), decl.expectedTarget.applicationName);
|
|
236
|
+
await (0, external_runtime_verifier_1.verifyExternallyManagedRuntime)(runtimeUrl, decl.expectedTarget, decl.runtimeAccess, decl.migrationCompatibility);
|
|
181
237
|
exportResolvedEnv(key, config, runtimeUrl);
|
|
182
238
|
console.log(`${LOG_PREFIX} biome=${opts.biomeId} key=${key}: bootstrap complete`);
|
|
183
239
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/lib/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/lib/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { MigrationCompatibilityContext, MigrationCompatibilityExpectation, RuntimeDatabaseAccessExpectation, RuntimeDatabaseTarget } from './migration-mode';
|
|
2
|
+
export declare function verifyExternallyManagedRuntime(runtimeUrl: string, target: RuntimeDatabaseTarget, access: RuntimeDatabaseAccessExpectation, compatibility: MigrationCompatibilityExpectation): Promise<MigrationCompatibilityContext>;
|
|
3
|
+
//# sourceMappingURL=external-runtime-verifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-runtime-verifier.d.ts","sourceRoot":"","sources":["../../src/lib/external-runtime-verifier.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,6BAA6B,EAC7B,iCAAiC,EACjC,gCAAgC,EAChC,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AA4K1B,wBAAsB,8BAA8B,CAClD,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,qBAAqB,EAC7B,MAAM,EAAE,gCAAgC,EACxC,aAAa,EAAE,iCAAiC,GAC/C,OAAO,CAAC,6BAA6B,CAAC,CA6NxC"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyExternallyManagedRuntime = verifyExternallyManagedRuntime;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const pg_1 = require("pg");
|
|
6
|
+
const LOG_PREFIX = '[biome-database]';
|
|
7
|
+
function quoteIdentifier(identifier) {
|
|
8
|
+
return `"${identifier.replaceAll('"', '""')}"`;
|
|
9
|
+
}
|
|
10
|
+
function requireSingleRow(rows, description) {
|
|
11
|
+
if (rows.length !== 1) {
|
|
12
|
+
throw new Error(`${LOG_PREFIX} expected exactly one ${description} row, received ${rows.length}.`);
|
|
13
|
+
}
|
|
14
|
+
return rows[0];
|
|
15
|
+
}
|
|
16
|
+
function assertNonEmpty(value, field) {
|
|
17
|
+
if (value.trim() === '') {
|
|
18
|
+
throw new Error(`${LOG_PREFIX} ${field} must be a non-empty string.`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function assertExpectation(expectation) {
|
|
22
|
+
if (expectation.tablePrivileges.length === 0) {
|
|
23
|
+
throw new Error(`${LOG_PREFIX} externally-managed runtime access must require at least one table privilege.`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function buildMissingTablePrivilegeQuery(privileges) {
|
|
27
|
+
const projections = privileges
|
|
28
|
+
.map((privilege) => `CASE WHEN NOT has_table_privilege(current_user, ` +
|
|
29
|
+
`format('%I.%I', table_schema, table_name), '${privilege}') ` +
|
|
30
|
+
`THEN '${privilege}' END`)
|
|
31
|
+
.join(', ');
|
|
32
|
+
return `
|
|
33
|
+
SELECT table_name AS object_name,
|
|
34
|
+
array_remove(ARRAY[${projections}], NULL) AS missing_privileges
|
|
35
|
+
FROM information_schema.tables
|
|
36
|
+
WHERE table_schema = $1
|
|
37
|
+
AND table_type = 'BASE TABLE'
|
|
38
|
+
AND table_name <> '_prisma_migrations'
|
|
39
|
+
AND NOT (
|
|
40
|
+
${privileges
|
|
41
|
+
.map((privilege) => `has_table_privilege(current_user, ` +
|
|
42
|
+
`format('%I.%I', table_schema, table_name), '${privilege}')`)
|
|
43
|
+
.join(' AND ')}
|
|
44
|
+
)
|
|
45
|
+
ORDER BY table_name
|
|
46
|
+
`;
|
|
47
|
+
}
|
|
48
|
+
function buildMissingSequencePrivilegeQuery(privileges) {
|
|
49
|
+
if (privileges.length === 0) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const projections = privileges
|
|
53
|
+
.map((privilege) => `CASE WHEN NOT has_sequence_privilege(current_user, ` +
|
|
54
|
+
`format('%I.%I', sequence_schema, sequence_name), '${privilege}') ` +
|
|
55
|
+
`THEN '${privilege}' END`)
|
|
56
|
+
.join(', ');
|
|
57
|
+
return `
|
|
58
|
+
SELECT sequence_name AS object_name,
|
|
59
|
+
array_remove(ARRAY[${projections}], NULL) AS missing_privileges
|
|
60
|
+
FROM information_schema.sequences
|
|
61
|
+
WHERE sequence_schema = $1
|
|
62
|
+
AND NOT (
|
|
63
|
+
${privileges
|
|
64
|
+
.map((privilege) => `has_sequence_privilege(current_user, ` +
|
|
65
|
+
`format('%I.%I', sequence_schema, sequence_name), '${privilege}')`)
|
|
66
|
+
.join(' AND ')}
|
|
67
|
+
)
|
|
68
|
+
ORDER BY sequence_name
|
|
69
|
+
`;
|
|
70
|
+
}
|
|
71
|
+
function formatMissingPrivileges(kind, rows) {
|
|
72
|
+
return rows
|
|
73
|
+
.map((row) => `${kind} ${row.object_name} missing ${row.missing_privileges.join('/')}`)
|
|
74
|
+
.join(', ');
|
|
75
|
+
}
|
|
76
|
+
function digestLedger(appliedMigrations) {
|
|
77
|
+
return (0, node_crypto_1.createHash)('sha256')
|
|
78
|
+
.update(JSON.stringify(appliedMigrations))
|
|
79
|
+
.digest('hex');
|
|
80
|
+
}
|
|
81
|
+
function assertTarget(target) {
|
|
82
|
+
assertNonEmpty(target.database, 'expected target database');
|
|
83
|
+
assertNonEmpty(target.schema, 'expected target schema');
|
|
84
|
+
assertNonEmpty(target.applicationName, 'expected application_name');
|
|
85
|
+
}
|
|
86
|
+
async function verifyExternallyManagedRuntime(runtimeUrl, target, access, compatibility) {
|
|
87
|
+
assertTarget(target);
|
|
88
|
+
assertExpectation(access);
|
|
89
|
+
if (compatibility === undefined ||
|
|
90
|
+
typeof compatibility.verify !== 'function') {
|
|
91
|
+
throw new Error(`${LOG_PREFIX} externally-managed mode requires a migration compatibility verifier.`);
|
|
92
|
+
}
|
|
93
|
+
assertNonEmpty(compatibility.verifierId, 'migration verifierId');
|
|
94
|
+
const client = new pg_1.Client({ connectionString: runtimeUrl });
|
|
95
|
+
await client.connect();
|
|
96
|
+
try {
|
|
97
|
+
const identity = requireSingleRow((await client.query(`
|
|
98
|
+
SELECT current_database() AS database_name,
|
|
99
|
+
current_schema() AS schema_name,
|
|
100
|
+
current_setting('application_name') AS application_name,
|
|
101
|
+
current_user AS role_name
|
|
102
|
+
`)).rows, 'connection identity');
|
|
103
|
+
if (identity.database_name !== target.database ||
|
|
104
|
+
identity.schema_name !== target.schema ||
|
|
105
|
+
identity.application_name !== target.applicationName) {
|
|
106
|
+
throw new Error(`${LOG_PREFIX} runtime target mismatch: expected ` +
|
|
107
|
+
`${target.database}/${target.schema}/${target.applicationName}, observed ` +
|
|
108
|
+
`${identity.database_name}/${identity.schema_name ?? '<none>'}/${identity.application_name}.`);
|
|
109
|
+
}
|
|
110
|
+
const role = requireSingleRow((await client.query(`
|
|
111
|
+
SELECT rolsuper, rolcreatedb, rolcreaterole, rolbypassrls
|
|
112
|
+
FROM pg_roles
|
|
113
|
+
WHERE rolname = current_user
|
|
114
|
+
`)).rows, 'runtime role');
|
|
115
|
+
const forbiddenRoleAttributes = [
|
|
116
|
+
role.rolsuper ? 'SUPERUSER' : null,
|
|
117
|
+
role.rolcreatedb ? 'CREATEDB' : null,
|
|
118
|
+
role.rolcreaterole ? 'CREATEROLE' : null,
|
|
119
|
+
role.rolbypassrls ? 'BYPASSRLS' : null,
|
|
120
|
+
].filter((value) => value !== null);
|
|
121
|
+
if (forbiddenRoleAttributes.length > 0) {
|
|
122
|
+
throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} has forbidden attribute(s): ` +
|
|
123
|
+
forbiddenRoleAttributes.join(', '));
|
|
124
|
+
}
|
|
125
|
+
const databasePrivileges = requireSingleRow((await client.query(`
|
|
126
|
+
SELECT has_database_privilege(current_user, current_database(), 'CONNECT') AS can_connect,
|
|
127
|
+
has_database_privilege(current_user, current_database(), 'CREATE') AS can_create,
|
|
128
|
+
pg_has_role(current_user, datdba, 'USAGE') AS owns_database
|
|
129
|
+
FROM pg_database
|
|
130
|
+
WHERE datname = current_database()
|
|
131
|
+
`)).rows, 'database privilege');
|
|
132
|
+
if (!databasePrivileges.can_connect) {
|
|
133
|
+
throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} lacks database CONNECT.`);
|
|
134
|
+
}
|
|
135
|
+
if (databasePrivileges.can_create || databasePrivileges.owns_database) {
|
|
136
|
+
throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} has forbidden database ` +
|
|
137
|
+
`${databasePrivileges.owns_database ? 'ownership' : 'CREATE privilege'}.`);
|
|
138
|
+
}
|
|
139
|
+
const schemaPrivileges = requireSingleRow((await client.query(`
|
|
140
|
+
SELECT has_schema_privilege(current_user, oid, 'USAGE') AS can_use,
|
|
141
|
+
has_schema_privilege(current_user, oid, 'CREATE') AS can_create,
|
|
142
|
+
pg_has_role(current_user, nspowner, 'USAGE') AS owns_schema
|
|
143
|
+
FROM pg_namespace
|
|
144
|
+
WHERE nspname = $1
|
|
145
|
+
`, [target.schema])).rows, 'target schema privilege');
|
|
146
|
+
if (!schemaPrivileges.can_use) {
|
|
147
|
+
throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} lacks USAGE on schema ${target.schema}.`);
|
|
148
|
+
}
|
|
149
|
+
if (schemaPrivileges.can_create || schemaPrivileges.owns_schema) {
|
|
150
|
+
throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} has forbidden CREATE/ownership ` +
|
|
151
|
+
`on schema ${target.schema}.`);
|
|
152
|
+
}
|
|
153
|
+
const persistentDdlSchemas = (await client.query(`
|
|
154
|
+
SELECT nspname AS schema_name
|
|
155
|
+
FROM pg_namespace
|
|
156
|
+
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
|
|
157
|
+
AND nspname NOT LIKE 'pg_toast%'
|
|
158
|
+
AND nspname NOT LIKE 'pg_temp_%'
|
|
159
|
+
AND (
|
|
160
|
+
has_schema_privilege(current_user, oid, 'CREATE')
|
|
161
|
+
OR pg_has_role(current_user, nspowner, 'USAGE')
|
|
162
|
+
)
|
|
163
|
+
ORDER BY nspname
|
|
164
|
+
`)).rows;
|
|
165
|
+
if (persistentDdlSchemas.length > 0) {
|
|
166
|
+
throw new Error(`${LOG_PREFIX} runtime role ${identity.role_name} has forbidden persistent ` +
|
|
167
|
+
`schema CREATE/ownership on: ${persistentDdlSchemas
|
|
168
|
+
.map((row) => row.schema_name)
|
|
169
|
+
.join(', ')}.`);
|
|
170
|
+
}
|
|
171
|
+
const missingTablePrivileges = (await client.query(buildMissingTablePrivilegeQuery(access.tablePrivileges), [target.schema])).rows;
|
|
172
|
+
if (missingTablePrivileges.length > 0) {
|
|
173
|
+
throw new Error(`${LOG_PREFIX} runtime DML contract failed: ${formatMissingPrivileges('table', missingTablePrivileges)}.`);
|
|
174
|
+
}
|
|
175
|
+
const sequenceQuery = buildMissingSequencePrivilegeQuery(access.sequencePrivileges);
|
|
176
|
+
if (sequenceQuery !== null) {
|
|
177
|
+
const missingSequencePrivileges = (await client.query(sequenceQuery, [target.schema])).rows;
|
|
178
|
+
if (missingSequencePrivileges.length > 0) {
|
|
179
|
+
throw new Error(`${LOG_PREFIX} runtime DML contract failed: ${formatMissingPrivileges('sequence', missingSequencePrivileges)}.`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const migrationRows = (await client.query(`
|
|
183
|
+
SELECT id::text,
|
|
184
|
+
migration_name,
|
|
185
|
+
checksum,
|
|
186
|
+
started_at::text,
|
|
187
|
+
finished_at::text,
|
|
188
|
+
applied_steps_count
|
|
189
|
+
FROM ${quoteIdentifier(target.schema)}."_prisma_migrations"
|
|
190
|
+
WHERE finished_at IS NOT NULL
|
|
191
|
+
AND rolled_back_at IS NULL
|
|
192
|
+
ORDER BY finished_at, id
|
|
193
|
+
`)).rows;
|
|
194
|
+
const appliedMigrations = migrationRows.map((row) => ({
|
|
195
|
+
id: row.id,
|
|
196
|
+
name: row.migration_name,
|
|
197
|
+
checksum: row.checksum,
|
|
198
|
+
startedAt: row.started_at,
|
|
199
|
+
finishedAt: row.finished_at,
|
|
200
|
+
appliedStepsCount: row.applied_steps_count,
|
|
201
|
+
}));
|
|
202
|
+
const observedLedgerDigest = digestLedger(appliedMigrations);
|
|
203
|
+
const context = Object.freeze({
|
|
204
|
+
target: Object.freeze({ ...target }),
|
|
205
|
+
currentRole: identity.role_name,
|
|
206
|
+
appliedMigrations: Object.freeze(appliedMigrations.map((migration) => Object.freeze(migration))),
|
|
207
|
+
observedLedgerDigest,
|
|
208
|
+
});
|
|
209
|
+
const proof = await compatibility.verify(context);
|
|
210
|
+
if (proof.verifierId !== compatibility.verifierId ||
|
|
211
|
+
proof.observedLedgerDigest !== observedLedgerDigest) {
|
|
212
|
+
throw new Error(`${LOG_PREFIX} migration compatibility proof does not match verifier ` +
|
|
213
|
+
`${compatibility.verifierId} and observed ledger ${observedLedgerDigest}.`);
|
|
214
|
+
}
|
|
215
|
+
if (!proof.compatible) {
|
|
216
|
+
throw new Error(`${LOG_PREFIX} migration compatibility rejected by ${proof.verifierId}: ${proof.reason}`);
|
|
217
|
+
}
|
|
218
|
+
assertNonEmpty(proof.expectedState, 'migration proof expectedState');
|
|
219
|
+
return context;
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
await client.end();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=external-runtime-verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-runtime-verifier.js","sourceRoot":"","sources":["../../src/lib/external-runtime-verifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export declare enum BiomeDatabaseMigrationMode {
|
|
2
|
+
ApplicationManaged = "application-managed",
|
|
3
|
+
ExternallyManaged = "externally-managed"
|
|
4
|
+
}
|
|
5
|
+
export declare enum RuntimeDatabaseCredentialSource {
|
|
6
|
+
ControlPlane = "control-plane",
|
|
7
|
+
Environment = "environment"
|
|
8
|
+
}
|
|
9
|
+
export declare enum RuntimeTablePrivilege {
|
|
10
|
+
Select = "SELECT",
|
|
11
|
+
Insert = "INSERT",
|
|
12
|
+
Update = "UPDATE",
|
|
13
|
+
Delete = "DELETE"
|
|
14
|
+
}
|
|
15
|
+
export declare enum RuntimeSequencePrivilege {
|
|
16
|
+
Usage = "USAGE",
|
|
17
|
+
Select = "SELECT",
|
|
18
|
+
Update = "UPDATE"
|
|
19
|
+
}
|
|
20
|
+
export interface RuntimeDatabaseAccessExpectation {
|
|
21
|
+
readonly tablePrivileges: readonly RuntimeTablePrivilege[];
|
|
22
|
+
readonly sequencePrivileges: readonly RuntimeSequencePrivilege[];
|
|
23
|
+
}
|
|
24
|
+
export interface RuntimeDatabaseTarget {
|
|
25
|
+
readonly database: string;
|
|
26
|
+
readonly schema: string;
|
|
27
|
+
readonly applicationName: string;
|
|
28
|
+
}
|
|
29
|
+
export interface AppliedPrismaMigration {
|
|
30
|
+
readonly id: string;
|
|
31
|
+
readonly name: string;
|
|
32
|
+
readonly checksum: string;
|
|
33
|
+
readonly startedAt: string;
|
|
34
|
+
readonly finishedAt: string;
|
|
35
|
+
readonly appliedStepsCount: number;
|
|
36
|
+
}
|
|
37
|
+
export interface MigrationCompatibilityContext {
|
|
38
|
+
readonly target: RuntimeDatabaseTarget;
|
|
39
|
+
readonly currentRole: string;
|
|
40
|
+
readonly appliedMigrations: readonly AppliedPrismaMigration[];
|
|
41
|
+
readonly observedLedgerDigest: string;
|
|
42
|
+
}
|
|
43
|
+
export type MigrationCompatibilityProof = {
|
|
44
|
+
readonly compatible: true;
|
|
45
|
+
readonly verifierId: string;
|
|
46
|
+
readonly expectedState: string;
|
|
47
|
+
readonly observedLedgerDigest: string;
|
|
48
|
+
} | {
|
|
49
|
+
readonly compatible: false;
|
|
50
|
+
readonly verifierId: string;
|
|
51
|
+
readonly reason: string;
|
|
52
|
+
readonly observedLedgerDigest: string;
|
|
53
|
+
};
|
|
54
|
+
export interface MigrationCompatibilityExpectation {
|
|
55
|
+
readonly verifierId: string;
|
|
56
|
+
readonly verify: (context: MigrationCompatibilityContext) => MigrationCompatibilityProof | Promise<MigrationCompatibilityProof>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=migration-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-mode.d.ts","sourceRoot":"","sources":["../../src/lib/migration-mode.ts"],"names":[],"mappings":"AAOA,oBAAY,0BAA0B;IACpC,kBAAkB,wBAAwB;IAC1C,iBAAiB,uBAAuB;CACzC;AAQD,oBAAY,+BAA+B;IACzC,YAAY,kBAAkB;IAC9B,WAAW,gBAAgB;CAC5B;AAGD,oBAAY,qBAAqB;IAC/B,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,MAAM,WAAW;CAClB;AAGD,oBAAY,wBAAwB;IAClC,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,MAAM,WAAW;CAClB;AAUD,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,eAAe,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC3D,QAAQ,CAAC,kBAAkB,EAAE,SAAS,wBAAwB,EAAE,CAAC;CAClE;AAGD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAGD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAGD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC9D,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC;AAGD,MAAM,MAAM,2BAA2B,GACnC;IACE,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC,GACD;IACE,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC,CAAC;AASN,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,CACf,OAAO,EAAE,6BAA6B,KACnC,2BAA2B,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;CACzE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RuntimeSequencePrivilege = exports.RuntimeTablePrivilege = exports.RuntimeDatabaseCredentialSource = exports.BiomeDatabaseMigrationMode = void 0;
|
|
4
|
+
var BiomeDatabaseMigrationMode;
|
|
5
|
+
(function (BiomeDatabaseMigrationMode) {
|
|
6
|
+
BiomeDatabaseMigrationMode["ApplicationManaged"] = "application-managed";
|
|
7
|
+
BiomeDatabaseMigrationMode["ExternallyManaged"] = "externally-managed";
|
|
8
|
+
})(BiomeDatabaseMigrationMode || (exports.BiomeDatabaseMigrationMode = BiomeDatabaseMigrationMode = {}));
|
|
9
|
+
var RuntimeDatabaseCredentialSource;
|
|
10
|
+
(function (RuntimeDatabaseCredentialSource) {
|
|
11
|
+
RuntimeDatabaseCredentialSource["ControlPlane"] = "control-plane";
|
|
12
|
+
RuntimeDatabaseCredentialSource["Environment"] = "environment";
|
|
13
|
+
})(RuntimeDatabaseCredentialSource || (exports.RuntimeDatabaseCredentialSource = RuntimeDatabaseCredentialSource = {}));
|
|
14
|
+
var RuntimeTablePrivilege;
|
|
15
|
+
(function (RuntimeTablePrivilege) {
|
|
16
|
+
RuntimeTablePrivilege["Select"] = "SELECT";
|
|
17
|
+
RuntimeTablePrivilege["Insert"] = "INSERT";
|
|
18
|
+
RuntimeTablePrivilege["Update"] = "UPDATE";
|
|
19
|
+
RuntimeTablePrivilege["Delete"] = "DELETE";
|
|
20
|
+
})(RuntimeTablePrivilege || (exports.RuntimeTablePrivilege = RuntimeTablePrivilege = {}));
|
|
21
|
+
var RuntimeSequencePrivilege;
|
|
22
|
+
(function (RuntimeSequencePrivilege) {
|
|
23
|
+
RuntimeSequencePrivilege["Usage"] = "USAGE";
|
|
24
|
+
RuntimeSequencePrivilege["Select"] = "SELECT";
|
|
25
|
+
RuntimeSequencePrivilege["Update"] = "UPDATE";
|
|
26
|
+
})(RuntimeSequencePrivilege || (exports.RuntimeSequencePrivilege = RuntimeSequencePrivilege = {}));
|
|
27
|
+
//# sourceMappingURL=migration-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-mode.js","sourceRoot":"","sources":["../../src/lib/migration-mode.ts"],"names":[],"mappings":";;;AAOA,IAAY,0BAGX;AAHD,WAAY,0BAA0B;IACpC,wEAA0C,CAAA;IAC1C,sEAAwC,CAAA;AAC1C,CAAC,EAHW,0BAA0B,0CAA1B,0BAA0B,QAGrC;AAQD,IAAY,+BAGX;AAHD,WAAY,+BAA+B;IACzC,iEAA8B,CAAA;IAC9B,8DAA2B,CAAA;AAC7B,CAAC,EAHW,+BAA+B,+CAA/B,+BAA+B,QAG1C;AAGD,IAAY,qBAKX;AALD,WAAY,qBAAqB;IAC/B,0CAAiB,CAAA;IACjB,0CAAiB,CAAA;IACjB,0CAAiB,CAAA;IACjB,0CAAiB,CAAA;AACnB,CAAC,EALW,qBAAqB,qCAArB,qBAAqB,QAKhC;AAGD,IAAY,wBAIX;AAJD,WAAY,wBAAwB;IAClC,2CAAe,CAAA;IACf,6CAAiB,CAAA;IACjB,6CAAiB,CAAA;AACnB,CAAC,EAJW,wBAAwB,wCAAxB,wBAAwB,QAInC"}
|
|
@@ -1,12 +1,23 @@
|
|
|
1
1
|
import type { DynamicModule } from '@nestjs/common';
|
|
2
|
-
import type { BiomeDatabaseDeclaration } from '../bootstrap';
|
|
2
|
+
import type { BiomeDatabaseDeclaration, ExternallyManagedBiomeDatabaseDeclaration } from '../bootstrap';
|
|
3
|
+
import { BiomeDatabaseMigrationMode } from '../migration-mode';
|
|
3
4
|
export declare const BIOME_DATABASE_READY: unique symbol;
|
|
4
|
-
|
|
5
|
+
interface BiomeDatabaseModuleCommonOptions {
|
|
5
6
|
readonly biomeId: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ApplicationManagedBiomeDatabaseModuleOptions extends BiomeDatabaseModuleCommonOptions {
|
|
9
|
+
readonly migrationMode: BiomeDatabaseMigrationMode.ApplicationManaged;
|
|
6
10
|
readonly databases?: readonly BiomeDatabaseDeclaration[];
|
|
7
11
|
readonly requiredExtensions?: readonly string[];
|
|
8
12
|
}
|
|
13
|
+
export interface ExternallyManagedBiomeDatabaseModuleOptions extends BiomeDatabaseModuleCommonOptions {
|
|
14
|
+
readonly migrationMode: BiomeDatabaseMigrationMode.ExternallyManaged;
|
|
15
|
+
readonly databases: readonly ExternallyManagedBiomeDatabaseDeclaration[];
|
|
16
|
+
readonly requiredExtensions?: never;
|
|
17
|
+
}
|
|
18
|
+
export type BiomeDatabaseModuleOptions = ApplicationManagedBiomeDatabaseModuleOptions | ExternallyManagedBiomeDatabaseModuleOptions;
|
|
9
19
|
export declare class BiomeDatabaseModule {
|
|
10
20
|
static forRoot(opts: BiomeDatabaseModuleOptions): DynamicModule;
|
|
11
21
|
}
|
|
22
|
+
export {};
|
|
12
23
|
//# sourceMappingURL=biome-database.module.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"biome-database.module.d.ts","sourceRoot":"","sources":["../../../src/lib/nest/biome-database.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAUpD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"biome-database.module.d.ts","sourceRoot":"","sources":["../../../src/lib/nest/biome-database.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAUpD,OAAO,KAAK,EACV,wBAAwB,EACxB,yCAAyC,EAC1C,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAY/D,eAAO,MAAM,oBAAoB,eAEhC,CAAC;AAEF,UAAU,gCAAgC;IAExC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,4CACf,SAAQ,gCAAgC;IACxC,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC,kBAAkB,CAAC;IAKtE,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAMzD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,2CACf,SAAQ,gCAAgC;IACxC,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC,iBAAiB,CAAC;IAKrE,QAAQ,CAAC,SAAS,EAAE,SAAS,yCAAyC,EAAE,CAAC;IACzE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC;CACrC;AAGD,MAAM,MAAM,0BAA0B,GAClC,4CAA4C,GAC5C,2CAA2C,CAAC;AA+ChD,qBACa,mBAAmB;IAC9B,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,0BAA0B,GAAG,aAAa;CAmFhE"}
|
|
@@ -12,13 +12,24 @@ const common_1 = require("@nestjs/common");
|
|
|
12
12
|
const identity_client_1 = require("@xemahq/identity-client");
|
|
13
13
|
const service_registry_nest_1 = require("@xemahq/service-registry-nest");
|
|
14
14
|
const bootstrap_1 = require("../bootstrap");
|
|
15
|
+
const migration_mode_1 = require("../migration-mode");
|
|
15
16
|
const schema_name_1 = require("../schema-name");
|
|
16
17
|
exports.BIOME_DATABASE_READY = Symbol.for('@xemahq/biome-database-nest:ready');
|
|
17
18
|
let BiomeDatabaseModule = BiomeDatabaseModule_1 = class BiomeDatabaseModule {
|
|
18
19
|
static forRoot(opts) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
if (opts.migrationMode !== migration_mode_1.BiomeDatabaseMigrationMode.ApplicationManaged &&
|
|
21
|
+
opts.migrationMode !== migration_mode_1.BiomeDatabaseMigrationMode.ExternallyManaged) {
|
|
22
|
+
throw new Error('[biome-database] migrationMode is required and must be a BiomeDatabaseMigrationMode.');
|
|
23
|
+
}
|
|
24
|
+
if (opts.migrationMode === migration_mode_1.BiomeDatabaseMigrationMode.ExternallyManaged &&
|
|
25
|
+
opts.databases.length === 0) {
|
|
26
|
+
throw new Error('[biome-database] externally-managed mode requires at least one explicit database declaration.');
|
|
27
|
+
}
|
|
28
|
+
const databases = opts.migrationMode === migration_mode_1.BiomeDatabaseMigrationMode.ApplicationManaged
|
|
29
|
+
? (opts.databases ?? [
|
|
30
|
+
{ key: schema_name_1.DEFAULT_BIOME_DB_KEY, workspaceDir: process.cwd() },
|
|
31
|
+
])
|
|
32
|
+
: opts.databases;
|
|
22
33
|
if ((0, service_registry_nest_1.isOpenApiExtraction)()) {
|
|
23
34
|
return {
|
|
24
35
|
module: BiomeDatabaseModule_1,
|
|
@@ -34,15 +45,28 @@ let BiomeDatabaseModule = BiomeDatabaseModule_1 = class BiomeDatabaseModule {
|
|
|
34
45
|
{
|
|
35
46
|
provide: exports.BIOME_DATABASE_READY,
|
|
36
47
|
useFactory: async (identityBootstrap, kernelState) => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
:
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
48
|
+
if (opts.migrationMode ===
|
|
49
|
+
migration_mode_1.BiomeDatabaseMigrationMode.ApplicationManaged) {
|
|
50
|
+
await (0, bootstrap_1.bootstrapBiomeDatabases)({
|
|
51
|
+
biomeId: opts.biomeId,
|
|
52
|
+
migrationMode: opts.migrationMode,
|
|
53
|
+
databases: databases,
|
|
54
|
+
...(opts.requiredExtensions !== undefined
|
|
55
|
+
? { requiredExtensions: opts.requiredExtensions }
|
|
56
|
+
: {}),
|
|
57
|
+
serviceToken: () => identityBootstrap.getAccessToken(),
|
|
58
|
+
kernelState,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
await (0, bootstrap_1.bootstrapBiomeDatabases)({
|
|
63
|
+
biomeId: opts.biomeId,
|
|
64
|
+
migrationMode: opts.migrationMode,
|
|
65
|
+
databases: databases,
|
|
66
|
+
serviceToken: () => identityBootstrap.getAccessToken(),
|
|
67
|
+
kernelState,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
46
70
|
return true;
|
|
47
71
|
},
|
|
48
72
|
inject: [identity_client_1.IdentityBootstrapService, service_registry_nest_1.KERNEL_STATE_TOKEN],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"biome-database.module.js","sourceRoot":"","sources":["../../../src/lib/nest/biome-database.module.ts"],"names":[],"mappings":";;;;;;;;;;AACA,2CAAwC;AACxC,6DAAmE;AAEnE,yEAGuC;AAEvC,4CAAuD;
|
|
1
|
+
{"version":3,"file":"biome-database.module.js","sourceRoot":"","sources":["../../../src/lib/nest/biome-database.module.ts"],"names":[],"mappings":";;;;;;;;;;AACA,2CAAwC;AACxC,6DAAmE;AAEnE,yEAGuC;AAEvC,4CAAuD;AAKvD,sDAA+D;AAC/D,gDAAsD;AAWzC,QAAA,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAC5C,mCAAmC,CACpC,CAAC;AAqFK,IAAM,mBAAmB,2BAAzB,MAAM,mBAAmB;IAC9B,MAAM,CAAC,OAAO,CAAC,IAAgC;QAC7C,IACE,IAAI,CAAC,aAAa,KAAK,2CAA0B,CAAC,kBAAkB;YACpE,IAAI,CAAC,aAAa,KAAK,2CAA0B,CAAC,iBAAiB,EACnE,CAAC;YACD,MAAM,IAAI,KAAK,CACb,sFAAsF,CACvF,CAAC;QACJ,CAAC;QACD,IACE,IAAI,CAAC,aAAa,KAAK,2CAA0B,CAAC,iBAAiB;YACnE,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAC3B,CAAC;YACD,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAGb,IAAI,CAAC,aAAa,KAAK,2CAA0B,CAAC,kBAAkB;YAClE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI;gBACjB,EAAE,GAAG,EAAE,kCAAoB,EAAE,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE;aAC3D,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;QAQrB,IAAI,IAAA,2CAAmB,GAAE,EAAE,CAAC;YAC1B,OAAO;gBACL,MAAM,EAAE,qBAAmB;gBAC3B,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,4BAAoB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;gBAC9D,OAAO,EAAE,CAAC,4BAAoB,CAAC;aAChC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,qBAAmB;YAC3B,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,4BAAoB;oBAC7B,UAAU,EAAE,KAAK,EACf,iBAA2C,EAC3C,WAAwB,EACT,EAAE;wBACjB,IACE,IAAI,CAAC,aAAa;4BAClB,2CAA0B,CAAC,kBAAkB,EAC7C,CAAC;4BACD,MAAM,IAAA,mCAAuB,EAAC;gCAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;gCACrB,aAAa,EAAE,IAAI,CAAC,aAAa;gCACjC,SAAS,EAAE,SAAgD;gCAC3D,GAAG,CAAC,IAAI,CAAC,kBAAkB,KAAK,SAAS;oCACvC,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE;oCACjD,CAAC,CAAC,EAAE,CAAC;gCACP,YAAY,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,cAAc,EAAE;gCACtD,WAAW;6BACZ,CAAC,CAAC;wBACL,CAAC;6BAAM,CAAC;4BACN,MAAM,IAAA,mCAAuB,EAAC;gCAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;gCACrB,aAAa,EAAE,IAAI,CAAC,aAAa;gCACjC,SAAS,EACP,SAAiE;gCACnE,YAAY,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,cAAc,EAAE;gCACtD,WAAW;6BACZ,CAAC,CAAC;wBACL,CAAC;wBACD,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,MAAM,EAAE,CAAC,0CAAwB,EAAE,0CAAkB,CAAC;iBACvD;aACF;YACD,OAAO,EAAE,CAAC,4BAAoB,CAAC;SAChC,CAAC;IACJ,CAAC;CACF,CAAA;AApFY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,mBAAmB,CAoF/B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { unwrapPlatformResponseEnvelope } from '@xemahq/platform-common';
|
|
2
2
|
//# sourceMappingURL=response-envelope.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-envelope.d.ts","sourceRoot":"","sources":["../../src/lib/response-envelope.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"response-envelope.d.ts","sourceRoot":"","sources":["../../src/lib/response-envelope.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -1,26 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.unwrapPlatformResponseEnvelope =
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
return 'null';
|
|
7
|
-
}
|
|
8
|
-
if (Array.isArray(payload)) {
|
|
9
|
-
return 'a bare array';
|
|
10
|
-
}
|
|
11
|
-
if (typeof payload === 'object') {
|
|
12
|
-
return `an object with keys [${Object.keys(payload).join(', ')}]`;
|
|
13
|
-
}
|
|
14
|
-
return `a bare ${typeof payload}`;
|
|
15
|
-
}
|
|
16
|
-
function unwrapPlatformResponseEnvelope(payload, context) {
|
|
17
|
-
if (payload === null ||
|
|
18
|
-
typeof payload !== 'object' ||
|
|
19
|
-
!('data' in payload)) {
|
|
20
|
-
throw new Error(`${context}: response is not a platform envelope — expected an object with a 'data' property, ` +
|
|
21
|
-
`received ${describePayload(payload)}. The peer either is not a Xema platform service or is ` +
|
|
22
|
-
`missing the global ResponseEnvelopeInterceptor.`);
|
|
23
|
-
}
|
|
24
|
-
return payload.data;
|
|
25
|
-
}
|
|
3
|
+
exports.unwrapPlatformResponseEnvelope = void 0;
|
|
4
|
+
var platform_common_1 = require("@xemahq/platform-common");
|
|
5
|
+
Object.defineProperty(exports, "unwrapPlatformResponseEnvelope", { enumerable: true, get: function () { return platform_common_1.unwrapPlatformResponseEnvelope; } });
|
|
26
6
|
//# sourceMappingURL=response-envelope.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-envelope.js","sourceRoot":"","sources":["../../src/lib/response-envelope.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"response-envelope.js","sourceRoot":"","sources":["../../src/lib/response-envelope.ts"],"names":[],"mappings":";;;AAcA,2DAAyE;AAAhE,iIAAA,8BAA8B,OAAA"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xemahq/biome-database-nest",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.7.0",
|
|
4
|
+
"description": "Explicit database migration ownership, least-privilege runtime verification, and schema-qualified Prisma wiring for Xema biome services.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Neuralchowder Inc. <developer@xema.dev> (https://xema.dev)",
|
|
7
7
|
"homepage": "https://xema.dev",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"@types/node": "25.2.3",
|
|
29
29
|
"@types/pg": "^8.16.0",
|
|
30
30
|
"@xemahq/identity-client": "^0.3.5",
|
|
31
|
-
"@xemahq/kernel-contracts": "^0.
|
|
31
|
+
"@xemahq/kernel-contracts": "^0.60.0",
|
|
32
32
|
"@xemahq/xema-decorators": "^0.5.0",
|
|
33
33
|
"jest": "^30.3.0",
|
|
34
34
|
"prettier": "3.6.2",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@xemahq/migration-runner-prisma": "^0.1.2",
|
|
52
|
-
"@xemahq/platform-common": "^0.5.
|
|
52
|
+
"@xemahq/platform-common": "^0.5.9",
|
|
53
53
|
"pg": "8.16.3"
|
|
54
54
|
},
|
|
55
55
|
"exports": {
|