@xemahq/biome-database-nest 0.16.12 → 0.16.14
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 +9 -57
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/operator-migration.d.ts +39 -0
- package/dist/lib/operator-migration.d.ts.map +1 -0
- package/dist/lib/operator-migration.js +148 -0
- package/dist/lib/operator-migration.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -28,37 +28,18 @@
|
|
|
28
28
|
|
|
29
29
|
## Overview
|
|
30
30
|
|
|
31
|
-
Gives a Xema biome service
|
|
32
|
-
deployment environment. It
|
|
33
|
-
schema
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
A biome carries **no** database location or connection configuration. Those are
|
|
37
|
-
deployment facts the platform owns, so changing infrastructure does not require
|
|
38
|
-
changing biome code.
|
|
39
|
-
|
|
40
|
-
## What a biome gets
|
|
41
|
-
|
|
42
|
-
- **A database of its own, on first boot.** The pool binds the service to it and
|
|
43
|
-
holds it there, so the name can never silently move to an empty schema.
|
|
44
|
-
- **A schema-qualified Prisma client**, already pointed at that database.
|
|
45
|
-
- **Migrations applied at boot** — `prisma migrate deploy`, which THROWS on
|
|
46
|
-
failure, so a bad migration stops the pod becoming ready instead of half-
|
|
47
|
-
applying under live traffic.
|
|
48
|
-
- **Image/schema compatibility before Ready.** A service refuses to start when
|
|
49
|
-
the database contains a successful migration absent from the image, or when a
|
|
50
|
-
shipped migration remains unapplied. Deliberate history compaction uses an
|
|
51
|
-
explicit list of superseded migration names after the replacement baseline is
|
|
52
|
-
established.
|
|
53
|
-
- **More than one database when it needs one.** A biome that ships several API
|
|
54
|
-
services gives each its own; a single service that needs a second declares a
|
|
55
|
-
`dbKey`. Physically these are schemas in the shared `xema_biomes` database —
|
|
56
|
-
`biome_<biomeId>` for the primary, `biome_<biomeId>__<dbKey>` for the rest.
|
|
31
|
+
Gives a Xema biome service explicit database ownership without coupling it to a
|
|
32
|
+
deployment environment. It supplies schema-qualified Prisma wiring, validates
|
|
33
|
+
image/schema compatibility, and provides a governed lifecycle for data
|
|
34
|
+
cutovers that require an operator between expansion and contraction.
|
|
57
35
|
|
|
58
36
|
## When to use it
|
|
59
37
|
|
|
60
|
-
Use it
|
|
61
|
-
|
|
38
|
+
- Use it when a NestJS biome service stores data or owns database migrations.
|
|
39
|
+
- Use its operator lifecycle when a destructive contraction must wait for a
|
|
40
|
+
verified backfill instead of running automatically at application startup.
|
|
41
|
+
- Wrap the complete operator command with `withOperatorMigrationLock` so apply,
|
|
42
|
+
verification, and contraction cannot overlap across replicas.
|
|
62
43
|
|
|
63
44
|
## Installation
|
|
64
45
|
|
|
@@ -68,8 +49,6 @@ pnpm add @xemahq/biome-database-nest
|
|
|
68
49
|
|
|
69
50
|
## Usage
|
|
70
51
|
|
|
71
|
-
The whole integration:
|
|
72
|
-
|
|
73
52
|
```ts
|
|
74
53
|
import {
|
|
75
54
|
BiomeDatabaseMigrationMode,
|
|
@@ -83,33 +62,6 @@ BiomeDatabaseModule.forRoot({
|
|
|
83
62
|
});
|
|
84
63
|
```
|
|
85
64
|
|
|
86
|
-
`biomeId` names the database this service owns; it is pinned by the pool on
|
|
87
|
-
first resolve, so changing it later is refused rather than silently pointing the
|
|
88
|
-
service at a fresh empty schema. `workspaceDir` is where the Prisma schema and
|
|
89
|
-
`migrations/` live.
|
|
90
|
-
|
|
91
|
-
Normal additive migration histories require no extra configuration. After an
|
|
92
|
-
intentional Prisma history squash and baseline, declare the exact removed
|
|
93
|
-
directory names on that database:
|
|
94
|
-
|
|
95
|
-
```ts
|
|
96
|
-
databases: [{
|
|
97
|
-
workspaceDir: process.cwd(),
|
|
98
|
-
historyPolicy: {
|
|
99
|
-
supersededMigrationNames: ['20250101000000_initial'],
|
|
100
|
-
},
|
|
101
|
-
}],
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
A second database for the same service:
|
|
105
|
-
|
|
106
|
-
```ts
|
|
107
|
-
databases: [
|
|
108
|
-
{ workspaceDir: process.cwd() },
|
|
109
|
-
{ key: 'analytics', workspaceDir: `${process.cwd()}/analytics` },
|
|
110
|
-
],
|
|
111
|
-
```
|
|
112
|
-
|
|
113
65
|
## Peer requirements
|
|
114
66
|
|
|
115
67
|
- NestJS 10 or 11 and Prisma 7.
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export { resolveControlPlaneBaseUrl, ORG_DATABASE_POOL_SERVICE_NAME, type Contro
|
|
|
8
8
|
export { bootstrapBiomeDatabases, type BiomeDatabaseDeclaration, type BootstrapBiomeDatabasesOptions, } from './lib/bootstrap';
|
|
9
9
|
export type { PrismaMigrationHistoryPolicy } from './lib/migration-history';
|
|
10
10
|
export { BiomeDatabaseMigrationMode } from './lib/migration-mode';
|
|
11
|
+
export { contractOperatorMigration, OperatorMigrationMode, OperatorMigrationPhase, parseOperatorMigrationMode, verifyOperatorMigration, withOperatorMigrationLock, type ContractOperatorMigrationOptions, type OperatorMigrationDatabase, type VerifyOperatorMigrationOptions, type WithOperatorMigrationLockOptions, } from './lib/operator-migration';
|
|
11
12
|
export { BiomeDatabaseModule, BIOME_DATABASE_READY, type ApplicationManagedBiomeDatabaseModuleOptions, type BiomeDatabaseModuleOptions, } from './lib/nest/biome-database.module';
|
|
12
13
|
export { createBiomePrismaService, type BiomePrismaClient, type BiomePrismaClientCtor, type BiomePrismaServiceInstance, type CreateBiomePrismaServiceOptions, type TenantIsolationServiceOptions, type TenantScopedApi, } from './lib/nest/prisma-service-factory';
|
|
13
14
|
export { TenantIsolationMode, TENANT_ISOLATION_MODE_ENV_VAR, resolveTenantIsolationMode, } from './lib/tenant-isolation/tenant-isolation-mode';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.ORG_ERASURE_ROUTE_PATH = exports.ORG_DATA_ERASURE_CAPABILITY = exports.ORG_ERASURE_RUNNER = exports.OrgErasureController = exports.OrgErasureModule = exports.ORGANIZATION_PROTECTED_ERROR_CODE = exports.IDENTITY_SERVICE_NAME = exports.ProtectedOrgErasureRefusedError = exports.OrgProtectionUnavailableError = void 0;
|
|
3
|
+
exports.eraseOrgData = exports.assertOrgErasureMatchesModels = 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.withOperatorMigrationLock = exports.verifyOperatorMigration = exports.parseOperatorMigrationMode = exports.OperatorMigrationPhase = exports.OperatorMigrationMode = exports.contractOperatorMigration = exports.BiomeDatabaseMigrationMode = exports.bootstrapBiomeDatabases = exports.ORG_DATABASE_POOL_SERVICE_NAME = exports.resolveControlPlaneBaseUrl = exports.fetchSystemDatabaseConfig = exports.createBiomePrismaAdapterFromEnv = exports.createBiomePrismaAdapter = exports.resolveBiomeDatabaseConfigFromEnv = 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 = exports.OrgErasureController = exports.OrgErasureModule = exports.ORGANIZATION_PROTECTED_ERROR_CODE = exports.IDENTITY_SERVICE_NAME = exports.ProtectedOrgErasureRefusedError = exports.OrgProtectionUnavailableError = exports.OrgProtectionGuard = exports.IdentityOrgProtectionProbe = exports.assertOrgNotProtected = exports.eraseOwnedAuthoredResourceGraph = exports.OrgErasureMatchesNothingError = exports.OrgErasureBlockedError = void 0;
|
|
5
5
|
var schema_name_1 = require("./lib/schema-name");
|
|
6
6
|
Object.defineProperty(exports, "DEFAULT_BIOME_DB_KEY", { enumerable: true, get: function () { return schema_name_1.DEFAULT_BIOME_DB_KEY; } });
|
|
7
7
|
Object.defineProperty(exports, "deriveBiomeSchemaName", { enumerable: true, get: function () { return schema_name_1.deriveBiomeSchemaName; } });
|
|
@@ -33,6 +33,13 @@ var bootstrap_1 = require("./lib/bootstrap");
|
|
|
33
33
|
Object.defineProperty(exports, "bootstrapBiomeDatabases", { enumerable: true, get: function () { return bootstrap_1.bootstrapBiomeDatabases; } });
|
|
34
34
|
var migration_mode_1 = require("./lib/migration-mode");
|
|
35
35
|
Object.defineProperty(exports, "BiomeDatabaseMigrationMode", { enumerable: true, get: function () { return migration_mode_1.BiomeDatabaseMigrationMode; } });
|
|
36
|
+
var operator_migration_1 = require("./lib/operator-migration");
|
|
37
|
+
Object.defineProperty(exports, "contractOperatorMigration", { enumerable: true, get: function () { return operator_migration_1.contractOperatorMigration; } });
|
|
38
|
+
Object.defineProperty(exports, "OperatorMigrationMode", { enumerable: true, get: function () { return operator_migration_1.OperatorMigrationMode; } });
|
|
39
|
+
Object.defineProperty(exports, "OperatorMigrationPhase", { enumerable: true, get: function () { return operator_migration_1.OperatorMigrationPhase; } });
|
|
40
|
+
Object.defineProperty(exports, "parseOperatorMigrationMode", { enumerable: true, get: function () { return operator_migration_1.parseOperatorMigrationMode; } });
|
|
41
|
+
Object.defineProperty(exports, "verifyOperatorMigration", { enumerable: true, get: function () { return operator_migration_1.verifyOperatorMigration; } });
|
|
42
|
+
Object.defineProperty(exports, "withOperatorMigrationLock", { enumerable: true, get: function () { return operator_migration_1.withOperatorMigrationLock; } });
|
|
36
43
|
var biome_database_module_1 = require("./lib/nest/biome-database.module");
|
|
37
44
|
Object.defineProperty(exports, "BiomeDatabaseModule", { enumerable: true, get: function () { return biome_database_module_1.BiomeDatabaseModule; } });
|
|
38
45
|
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":";;;;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,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,6CAIyB;AAHvB,oHAAA,uBAAuB,OAAA;AAKzB,uDAAkE;AAAzD,4HAAA,0BAA0B,OAAA;AACnC,0EAK0C;AAJxC,4HAAA,mBAAmB,OAAA;AACnB,6HAAA,oBAAoB,OAAA;AAItB,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,kEAO4C;AAN1C,4HAAA,6BAA6B,OAAA;AAC7B,2GAAA,YAAY,OAAA;AACZ,qHAAA,sBAAsB,OAAA;AACtB,4HAAA,6BAA6B,OAAA;AAI/B,sGAI8D;AAH5D,gJAAA,+BAA+B,OAAA;AAIjC,4DASmC;AARjC,uHAAA,qBAAqB,OAAA;AACrB,4HAAA,0BAA0B,OAAA;AAC1B,oHAAA,kBAAkB,OAAA;AAClB,+HAAA,6BAA6B,OAAA;AAC7B,iIAAA,+BAA+B,OAAA;AAC/B,uHAAA,qBAAqB,OAAA;AACrB,mIAAA,iCAAiC,OAAA;AAGnC,oEAQuC;AAPrC,sHAAA,gBAAgB,OAAA;AAChB,0HAAA,oBAAoB,OAAA;AACpB,wHAAA,kBAAkB,OAAA;AAClB,iIAAA,2BAA2B,OAAA;AAC3B,4HAAA,sBAAsB,OAAA"}
|
|
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,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,6CAIyB;AAHvB,oHAAA,uBAAuB,OAAA;AAKzB,uDAAkE;AAAzD,4HAAA,0BAA0B,OAAA;AACnC,+DAWkC;AAVhC,+HAAA,yBAAyB,OAAA;AACzB,2HAAA,qBAAqB,OAAA;AACrB,4HAAA,sBAAsB,OAAA;AACtB,gIAAA,0BAA0B,OAAA;AAC1B,6HAAA,uBAAuB,OAAA;AACvB,+HAAA,yBAAyB,OAAA;AAM3B,0EAK0C;AAJxC,4HAAA,mBAAmB,OAAA;AACnB,6HAAA,oBAAoB,OAAA;AAItB,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,kEAO4C;AAN1C,4HAAA,6BAA6B,OAAA;AAC7B,2GAAA,YAAY,OAAA;AACZ,qHAAA,sBAAsB,OAAA;AACtB,4HAAA,6BAA6B,OAAA;AAI/B,sGAI8D;AAH5D,gJAAA,+BAA+B,OAAA;AAIjC,4DASmC;AARjC,uHAAA,qBAAqB,OAAA;AACrB,4HAAA,0BAA0B,OAAA;AAC1B,oHAAA,kBAAkB,OAAA;AAClB,+HAAA,6BAA6B,OAAA;AAC7B,iIAAA,+BAA+B,OAAA;AAC/B,uHAAA,qBAAqB,OAAA;AACrB,mIAAA,iCAAiC,OAAA;AAGnC,oEAQuC;AAPrC,sHAAA,gBAAgB,OAAA;AAChB,0HAAA,oBAAoB,OAAA;AACpB,wHAAA,kBAAkB,OAAA;AAClB,iIAAA,2BAA2B,OAAA;AAC3B,4HAAA,sBAAsB,OAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { QueryResult, QueryResultRow } from 'pg';
|
|
2
|
+
export declare enum OperatorMigrationMode {
|
|
3
|
+
DryRun = "dry-run",
|
|
4
|
+
Apply = "apply",
|
|
5
|
+
Verify = "verify",
|
|
6
|
+
Contract = "contract"
|
|
7
|
+
}
|
|
8
|
+
export declare enum OperatorMigrationPhase {
|
|
9
|
+
Verified = "verified",
|
|
10
|
+
Contracted = "contracted"
|
|
11
|
+
}
|
|
12
|
+
export interface OperatorMigrationDatabase {
|
|
13
|
+
query<R extends QueryResultRow = QueryResultRow>(queryText: string, values?: unknown[]): Promise<QueryResult<R>>;
|
|
14
|
+
}
|
|
15
|
+
export interface VerifyOperatorMigrationOptions {
|
|
16
|
+
readonly database: OperatorMigrationDatabase;
|
|
17
|
+
readonly migrationId: string;
|
|
18
|
+
readonly verificationArtifact: string;
|
|
19
|
+
readonly verify: (database: OperatorMigrationDatabase) => Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export interface ContractOperatorMigrationOptions {
|
|
22
|
+
readonly database: OperatorMigrationDatabase;
|
|
23
|
+
readonly migrationId: string;
|
|
24
|
+
readonly contractionSql: string;
|
|
25
|
+
}
|
|
26
|
+
export interface WithOperatorMigrationLockOptions<T> {
|
|
27
|
+
readonly database: OperatorMigrationDatabase;
|
|
28
|
+
readonly migrationId: string;
|
|
29
|
+
readonly run: (database: OperatorMigrationDatabase) => Promise<T>;
|
|
30
|
+
}
|
|
31
|
+
export declare function parseOperatorMigrationMode(argv: readonly string[]): OperatorMigrationMode;
|
|
32
|
+
export declare function withOperatorMigrationLock<T>(options: WithOperatorMigrationLockOptions<T>): Promise<T>;
|
|
33
|
+
export declare function verifyOperatorMigration(options: VerifyOperatorMigrationOptions): Promise<{
|
|
34
|
+
readonly artifactSha256: string;
|
|
35
|
+
}>;
|
|
36
|
+
export declare function contractOperatorMigration(options: ContractOperatorMigrationOptions): Promise<{
|
|
37
|
+
readonly artifactSha256: string;
|
|
38
|
+
}>;
|
|
39
|
+
//# sourceMappingURL=operator-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator-migration.d.ts","sourceRoot":"","sources":["../../src/lib/operator-migration.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAEtD,oBAAY,qBAAqB;IAC/B,MAAM,YAAY;IAClB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,QAAQ,aAAa;CACtB;AAED,oBAAY,sBAAsB;IAChC,QAAQ,aAAa;IACrB,UAAU,eAAe;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAC7C,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,yBAAyB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,gCAAgC,CAAC,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,yBAAyB,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CACnE;AAKD,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,qBAAqB,CAgBvB;AAUD,wBAAsB,yBAAyB,CAAC,CAAC,EAC/C,OAAO,EAAE,gCAAgC,CAAC,CAAC,CAAC,GAC3C,OAAO,CAAC,CAAC,CAAC,CAsBZ;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC;IAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB9C;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,gCAAgC,GACxC,OAAO,CAAC;IAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAmC9C"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OperatorMigrationPhase = exports.OperatorMigrationMode = void 0;
|
|
4
|
+
exports.parseOperatorMigrationMode = parseOperatorMigrationMode;
|
|
5
|
+
exports.withOperatorMigrationLock = withOperatorMigrationLock;
|
|
6
|
+
exports.verifyOperatorMigration = verifyOperatorMigration;
|
|
7
|
+
exports.contractOperatorMigration = contractOperatorMigration;
|
|
8
|
+
const node_crypto_1 = require("node:crypto");
|
|
9
|
+
var OperatorMigrationMode;
|
|
10
|
+
(function (OperatorMigrationMode) {
|
|
11
|
+
OperatorMigrationMode["DryRun"] = "dry-run";
|
|
12
|
+
OperatorMigrationMode["Apply"] = "apply";
|
|
13
|
+
OperatorMigrationMode["Verify"] = "verify";
|
|
14
|
+
OperatorMigrationMode["Contract"] = "contract";
|
|
15
|
+
})(OperatorMigrationMode || (exports.OperatorMigrationMode = OperatorMigrationMode = {}));
|
|
16
|
+
var OperatorMigrationPhase;
|
|
17
|
+
(function (OperatorMigrationPhase) {
|
|
18
|
+
OperatorMigrationPhase["Verified"] = "verified";
|
|
19
|
+
OperatorMigrationPhase["Contracted"] = "contracted";
|
|
20
|
+
})(OperatorMigrationPhase || (exports.OperatorMigrationPhase = OperatorMigrationPhase = {}));
|
|
21
|
+
const MIGRATION_ID_PATTERN = /^[a-z][a-z0-9-]{0,126}$/u;
|
|
22
|
+
const SHA256_PATTERN = /^[a-f0-9]{64}$/u;
|
|
23
|
+
function parseOperatorMigrationMode(argv) {
|
|
24
|
+
const modeArguments = argv.filter((value) => value.startsWith('--mode='));
|
|
25
|
+
if (modeArguments.length !== 1) {
|
|
26
|
+
throw new Error(`Exactly one operator migration mode is required: --mode=${Object.values(OperatorMigrationMode).join('|')}.`);
|
|
27
|
+
}
|
|
28
|
+
const value = modeArguments[0]?.slice('--mode='.length) ?? '';
|
|
29
|
+
if (!Object.values(OperatorMigrationMode).includes(value)) {
|
|
30
|
+
throw new Error(`Unsupported operator migration mode: ${value}.`);
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
async function withOperatorMigrationLock(options) {
|
|
35
|
+
assertMigrationId(options.migrationId);
|
|
36
|
+
const lockKey = migrationLockKey(options.migrationId);
|
|
37
|
+
const acquired = await options.database.query('SELECT pg_try_advisory_lock(hashtextextended($1, 0)) AS acquired', [lockKey]);
|
|
38
|
+
if (acquired.rows[0]?.acquired !== true) {
|
|
39
|
+
throw new Error(`Operator migration ${options.migrationId} is already running.`);
|
|
40
|
+
}
|
|
41
|
+
let result;
|
|
42
|
+
try {
|
|
43
|
+
result = await options.run(options.database);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
await releaseSessionLock(options.database, lockKey, error);
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
await releaseSessionLock(options.database, lockKey);
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
async function verifyOperatorMigration(options) {
|
|
53
|
+
const artifactSha256 = sha256(options.verificationArtifact);
|
|
54
|
+
await inMigrationTransaction(options.database, options.migrationId, async (database) => {
|
|
55
|
+
await options.verify(database);
|
|
56
|
+
await recordPhase(database, options.migrationId, OperatorMigrationPhase.Verified, artifactSha256);
|
|
57
|
+
});
|
|
58
|
+
return { artifactSha256 };
|
|
59
|
+
}
|
|
60
|
+
async function contractOperatorMigration(options) {
|
|
61
|
+
const artifactSha256 = sha256(options.contractionSql);
|
|
62
|
+
await inMigrationTransaction(options.database, options.migrationId, async (database) => {
|
|
63
|
+
await requirePhase(database, options.migrationId, OperatorMigrationPhase.Verified);
|
|
64
|
+
const existing = await readPhase(database, options.migrationId, OperatorMigrationPhase.Contracted);
|
|
65
|
+
if (existing !== null) {
|
|
66
|
+
assertArtifactMatches(options.migrationId, OperatorMigrationPhase.Contracted, existing, artifactSha256);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
await database.query(options.contractionSql);
|
|
70
|
+
await recordPhase(database, options.migrationId, OperatorMigrationPhase.Contracted, artifactSha256);
|
|
71
|
+
});
|
|
72
|
+
return { artifactSha256 };
|
|
73
|
+
}
|
|
74
|
+
async function inMigrationTransaction(database, migrationId, work) {
|
|
75
|
+
assertMigrationId(migrationId);
|
|
76
|
+
await database.query('BEGIN');
|
|
77
|
+
try {
|
|
78
|
+
await database.query('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE');
|
|
79
|
+
await database.query(`SELECT pg_advisory_xact_lock(hashtextextended($1, 0))`, [migrationLockKey(migrationId)]);
|
|
80
|
+
await work(database);
|
|
81
|
+
await database.query('COMMIT');
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
try {
|
|
85
|
+
await database.query('ROLLBACK');
|
|
86
|
+
}
|
|
87
|
+
catch (rollbackError) {
|
|
88
|
+
throw new AggregateError([error, rollbackError], `Operator migration ${migrationId} failed and its transaction could not be rolled back.`);
|
|
89
|
+
}
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function releaseSessionLock(database, lockKey, workError) {
|
|
94
|
+
try {
|
|
95
|
+
const released = await database.query('SELECT pg_advisory_unlock(hashtextextended($1, 0)) AS released', [lockKey]);
|
|
96
|
+
if (released.rows[0]?.released !== true) {
|
|
97
|
+
throw new Error('Database reported that the operator lock was not held.');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (unlockError) {
|
|
101
|
+
if (workError !== undefined) {
|
|
102
|
+
throw new AggregateError([workError, unlockError], 'Operator migration failed and its session lock could not be released.');
|
|
103
|
+
}
|
|
104
|
+
throw unlockError;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async function recordPhase(database, migrationId, phase, artifactSha256) {
|
|
108
|
+
const existing = await readPhase(database, migrationId, phase);
|
|
109
|
+
if (existing !== null) {
|
|
110
|
+
assertArtifactMatches(migrationId, phase, existing, artifactSha256);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
await database.query(`INSERT INTO xema_operator_migrations
|
|
114
|
+
(migration_id, phase, artifact_sha256)
|
|
115
|
+
VALUES ($1, $2, $3)`, [migrationId, phase, artifactSha256]);
|
|
116
|
+
}
|
|
117
|
+
async function requirePhase(database, migrationId, phase) {
|
|
118
|
+
if ((await readPhase(database, migrationId, phase)) === null) {
|
|
119
|
+
throw new Error(`Operator migration ${migrationId} has not completed phase ${phase}.`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async function readPhase(database, migrationId, phase) {
|
|
123
|
+
const result = await database.query(`SELECT artifact_sha256
|
|
124
|
+
FROM xema_operator_migrations
|
|
125
|
+
WHERE migration_id = $1 AND phase = $2`, [migrationId, phase]);
|
|
126
|
+
const value = result.rows[0]?.artifact_sha256 ?? null;
|
|
127
|
+
if (value !== null && !SHA256_PATTERN.test(value)) {
|
|
128
|
+
throw new Error(`Operator migration ledger contains an invalid artifact hash for ${migrationId}/${phase}.`);
|
|
129
|
+
}
|
|
130
|
+
return value;
|
|
131
|
+
}
|
|
132
|
+
function assertArtifactMatches(migrationId, phase, recorded, expected) {
|
|
133
|
+
if (recorded !== expected) {
|
|
134
|
+
throw new Error(`Operator migration ${migrationId}/${phase} is already recorded for a different artifact.`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function assertMigrationId(migrationId) {
|
|
138
|
+
if (!MIGRATION_ID_PATTERN.test(migrationId)) {
|
|
139
|
+
throw new Error(`Invalid operator migration id: ${migrationId}.`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function migrationLockKey(migrationId) {
|
|
143
|
+
return `xema:operator-migration:${migrationId}`;
|
|
144
|
+
}
|
|
145
|
+
function sha256(value) {
|
|
146
|
+
return (0, node_crypto_1.createHash)('sha256').update(value).digest('hex');
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=operator-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator-migration.js","sourceRoot":"","sources":["../../src/lib/operator-migration.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xemahq/biome-database-nest",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.14",
|
|
4
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)",
|