@venturekit/data 0.0.0-dev.20260905235820 → 0.0.0-dev.20260906223830
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/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/query/index.d.ts +1 -1
- package/dist/query/index.d.ts.map +1 -1
- package/dist/query/index.js +1 -1
- package/dist/query/index.js.map +1 -1
- package/dist/query/tenant.d.ts +35 -4
- package/dist/query/tenant.d.ts.map +1 -1
- package/dist/query/tenant.js +94 -12
- package/dist/query/tenant.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,6 @@ export { createRdsConfig, DEFAULT_RDS_CONFIG, buildRdsConfig, } from './rds/inde
|
|
|
8
8
|
export type { RdsOutputs, RdsInfraConfig } from './rds/index.js';
|
|
9
9
|
export { createMigrationConfig, DEFAULT_MIGRATION_CONFIG, getFlywayEnv, runMigrations, getMigrationStatus, runSeeds, getSeedStatus, MIGRATIONS_TRACKING_TABLE, SEEDS_TRACKING_TABLE, MigrationToolNotImplementedError, MigrationHashMismatchError, MigrationCollisionError, applyDatabaseUrlToEnv, } from './migrations/index.js';
|
|
10
10
|
export type { RunResult, StatusEntry, RunOptions, SeedRunOptions, } from './migrations/index.js';
|
|
11
|
-
export { query, getPool, mapResults, mapRow, configureMapper, getMapperConfig, beginTransaction, withTransaction, buildTransaction, applyDbSecretToEnv, TENANT_GUC, TENANT_SCOPE_GUC, runWithTenant, runWithTenantScope, runWithoutTenant, getCurrentTenantId, getCurrentTenantScope, isTenancyEngaged, } from './query/index.js';
|
|
11
|
+
export { query, getPool, mapResults, mapRow, configureMapper, getMapperConfig, beginTransaction, withTransaction, buildTransaction, applyDbSecretToEnv, TENANT_GUC, TENANT_SCOPE_GUC, TENANT_ROLE_ENV, tenantRole, runWithTenant, runWithTenantScope, runWithoutTenant, getCurrentTenantId, getCurrentTenantScope, isTenancyEngaged, } from './query/index.js';
|
|
12
12
|
export type { Transaction, ResultsMapper, Querier, MapperOptions, } from './query/index.js';
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKjE,OAAO,EAEL,qBAAqB,EACrB,wBAAwB,EACxB,YAAY,EAEZ,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACb,yBAAyB,EACzB,oBAAoB,EAEpB,gCAAgC,EAChC,0BAA0B,EAC1B,uBAAuB,EAGvB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,GACf,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,KAAK,EACL,OAAO,EACP,UAAU,EACV,MAAM,EACN,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAKhB,kBAAkB,EAUlB,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,WAAW,EACX,aAAa,EACb,OAAO,EACP,aAAa,GACd,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKjE,OAAO,EAEL,qBAAqB,EACrB,wBAAwB,EACxB,YAAY,EAEZ,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACb,yBAAyB,EACzB,oBAAoB,EAEpB,gCAAgC,EAChC,0BAA0B,EAC1B,uBAAuB,EAGvB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,GACf,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,KAAK,EACL,OAAO,EACP,UAAU,EACV,MAAM,EACN,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAKhB,kBAAkB,EAUlB,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,WAAW,EACX,aAAa,EACb,OAAO,EACP,aAAa,GACd,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -36,5 +36,5 @@ applyDbSecretToEnv,
|
|
|
36
36
|
// read several tenants.
|
|
37
37
|
// See ./query/tenant.ts for the required policy shape and the
|
|
38
38
|
// database-role split RLS depends on.
|
|
39
|
-
TENANT_GUC, TENANT_SCOPE_GUC, runWithTenant, runWithTenantScope, runWithoutTenant, getCurrentTenantId, getCurrentTenantScope, isTenancyEngaged, } from './query/index.js';
|
|
39
|
+
TENANT_GUC, TENANT_SCOPE_GUC, TENANT_ROLE_ENV, tenantRole, runWithTenant, runWithTenantScope, runWithoutTenant, getCurrentTenantId, getCurrentTenantScope, isTenancyEngaged, } from './query/index.js';
|
|
40
40
|
//# 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;;;;GAIG;AAEH,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,MAAM;AACN,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,GACf,MAAM,gBAAgB,CAAC;AAGxB,uEAAuE;AACvE,iEAAiE;AACjE,gDAAgD;AAChD,OAAO;AACL,4BAA4B;AAC5B,qBAAqB,EACrB,wBAAwB,EACxB,YAAY;AACZ,sEAAsE;AACtE,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACb,yBAAyB,EACzB,oBAAoB;AACpB,SAAS;AACT,gCAAgC,EAChC,0BAA0B,EAC1B,uBAAuB;AACvB,uEAAuE;AACvE,qEAAqE;AACrE,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAQ/B,kDAAkD;AAClD,OAAO,EACL,KAAK,EACL,OAAO,EACP,UAAU,EACV,MAAM,EACN,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB;AAChB,0DAA0D;AAC1D,mEAAmE;AACnE,iEAAiE;AACjE,gCAAgC;AAChC,kBAAkB;AAClB,2DAA2D;AAC3D,gEAAgE;AAChE,mEAAmE;AACnE,4DAA4D;AAC5D,+DAA+D;AAC/D,mEAAmE;AACnE,wBAAwB;AACxB,8DAA8D;AAC9D,sCAAsC;AACtC,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,MAAM;AACN,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,GACf,MAAM,gBAAgB,CAAC;AAGxB,uEAAuE;AACvE,iEAAiE;AACjE,gDAAgD;AAChD,OAAO;AACL,4BAA4B;AAC5B,qBAAqB,EACrB,wBAAwB,EACxB,YAAY;AACZ,sEAAsE;AACtE,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACb,yBAAyB,EACzB,oBAAoB;AACpB,SAAS;AACT,gCAAgC,EAChC,0BAA0B,EAC1B,uBAAuB;AACvB,uEAAuE;AACvE,qEAAqE;AACrE,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAQ/B,kDAAkD;AAClD,OAAO,EACL,KAAK,EACL,OAAO,EACP,UAAU,EACV,MAAM,EACN,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB;AAChB,0DAA0D;AAC1D,mEAAmE;AACnE,iEAAiE;AACjE,gCAAgC;AAChC,kBAAkB;AAClB,2DAA2D;AAC3D,gEAAgE;AAChE,mEAAmE;AACnE,4DAA4D;AAC5D,+DAA+D;AAC/D,mEAAmE;AACnE,wBAAwB;AACxB,8DAA8D;AAC9D,sCAAsC;AACtC,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC"}
|
package/dist/query/index.d.ts
CHANGED
|
@@ -56,7 +56,7 @@ import type { ResultsMapper } from './transaction.js';
|
|
|
56
56
|
export declare const DEFAULT_SLOW_QUERY_THRESHOLD_MS = 1000;
|
|
57
57
|
export { getPool, applyDatabaseUrlToEnv } from './pool.js';
|
|
58
58
|
export { applyDbSecretToEnv } from './secret.js';
|
|
59
|
-
export { TENANT_GUC, TENANT_SCOPE_GUC, runWithTenant, runWithTenantScope, runWithoutTenant, getCurrentTenantId, getCurrentTenantScope, isTenancyEngaged, } from './tenant.js';
|
|
59
|
+
export { TENANT_GUC, TENANT_SCOPE_GUC, TENANT_ROLE_ENV, tenantRole, runWithTenant, runWithTenantScope, runWithoutTenant, getCurrentTenantId, getCurrentTenantScope, isTenancyEngaged, } from './tenant.js';
|
|
60
60
|
export { mapResults, mapRow, configureMapper, getMapperConfig, } from './mapper.js';
|
|
61
61
|
export type { MapperOptions } from './mapper.js';
|
|
62
62
|
export { beginTransaction, withTransaction, buildTransaction, } from './transaction.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAIH,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKtD;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,OAAQ,CAAC;AAqBrD,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,UAAU,EACV,MAAM,EACN,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AA+B5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACvD,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,OAAO,EAAE,EACvB,aAAa,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EAChC,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,CAAC,CAAC,CA6CZ"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAIH,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKtD;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,OAAQ,CAAC;AAqBrD,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,UAAU,EACV,MAAM,EACN,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AA+B5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACvD,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,OAAO,EAAE,EACvB,aAAa,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EAChC,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,CAAC,CAAC,CA6CZ"}
|
package/dist/query/index.js
CHANGED
|
@@ -77,7 +77,7 @@ function previewSql(sql) {
|
|
|
77
77
|
}
|
|
78
78
|
export { getPool, applyDatabaseUrlToEnv } from './pool.js';
|
|
79
79
|
export { applyDbSecretToEnv } from './secret.js';
|
|
80
|
-
export { TENANT_GUC, TENANT_SCOPE_GUC, runWithTenant, runWithTenantScope, runWithoutTenant, getCurrentTenantId, getCurrentTenantScope, isTenancyEngaged, } from './tenant.js';
|
|
80
|
+
export { TENANT_GUC, TENANT_SCOPE_GUC, TENANT_ROLE_ENV, tenantRole, runWithTenant, runWithTenantScope, runWithoutTenant, getCurrentTenantId, getCurrentTenantScope, isTenancyEngaged, } from './tenant.js';
|
|
81
81
|
export { mapResults, mapRow, configureMapper, getMapperConfig, } from './mapper.js';
|
|
82
82
|
export { beginTransaction, withTransaction, buildTransaction, } from './transaction.js';
|
|
83
83
|
/**
|
package/dist/query/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"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"}
|
package/dist/query/tenant.d.ts
CHANGED
|
@@ -68,6 +68,26 @@
|
|
|
68
68
|
* privileged role. Enabling RLS without that split gives you the
|
|
69
69
|
* overhead and none of the protection.
|
|
70
70
|
*
|
|
71
|
+
* # One connection, two privilege levels: `DB_TENANT_ROLE`
|
|
72
|
+
*
|
|
73
|
+
* The split above is a provisioning matter, and the one place it is
|
|
74
|
+
* routinely missed: `vk dev` connects as `postgres` (SUPERUSER, hence
|
|
75
|
+
* BYPASSRLS), and a deployment that connects as the owner passes every
|
|
76
|
+
* test while isolating nothing. `DB_TENANT_ROLE` closes that gap from
|
|
77
|
+
* inside the process. When it names a role — a `NOLOGIN` group that owns
|
|
78
|
+
* nothing and is granted DML, e.g. `app_user` — every tenant-scoped
|
|
79
|
+
* statement runs under `SET ROLE` to it, so RLS applies exactly as it
|
|
80
|
+
* would for a non-owner login, while work outside a tenant scope
|
|
81
|
+
* (event consumers, migrations, the sweep that lists tenants) keeps the
|
|
82
|
+
* connection's own privileges. Set it through `databases[].tenantRole`
|
|
83
|
+
* in `vk.config.ts`; `vk dev` and the deploy pipeline inject it. Unset,
|
|
84
|
+
* nothing about roles is ever issued.
|
|
85
|
+
*
|
|
86
|
+
* `SET ROLE` is permitted to the session user's memberships and, for a
|
|
87
|
+
* superuser, to any role; the connection's login must therefore be
|
|
88
|
+
* either a member of the tenant role or a superuser/owner, which is the
|
|
89
|
+
* case this feature exists for.
|
|
90
|
+
*
|
|
71
91
|
* # Why the GUC is set per connection, not per query
|
|
72
92
|
*
|
|
73
93
|
* `query()` borrows a connection from the pool for the duration of one
|
|
@@ -167,13 +187,23 @@ export declare function runWithTenantScope<T>(tenantIds: string[], fn: () => Pro
|
|
|
167
187
|
* review.
|
|
168
188
|
*/
|
|
169
189
|
export declare function runWithoutTenant<T>(fn: () => Promise<T>): Promise<T>;
|
|
190
|
+
/** The env var naming the role tenant-scoped statements run as. */
|
|
191
|
+
export declare const TENANT_ROLE_ENV = "DB_TENANT_ROLE";
|
|
192
|
+
/**
|
|
193
|
+
* The tenant role in effect, or `null` when `DB_TENANT_ROLE` is unset
|
|
194
|
+
* (the default: no role statements at all). Read per call so a test or
|
|
195
|
+
* a reconfigured process is honoured without a restart.
|
|
196
|
+
*/
|
|
197
|
+
export declare function tenantRole(env?: NodeJS.ProcessEnv | Record<string, string | undefined>): string | null;
|
|
170
198
|
/**
|
|
171
|
-
* Ensure `client`'s session
|
|
172
|
-
* `
|
|
199
|
+
* Ensure `client`'s session state matches the current scope — the two
|
|
200
|
+
* GUCs and, under `DB_TENANT_ROLE`, the role — issuing statements only
|
|
201
|
+
* when it differs.
|
|
173
202
|
*
|
|
174
203
|
* Uses a bound parameter — GUC values are user-controlled tenant ids
|
|
175
204
|
* and `SET` does not accept placeholders, so `set_config()` is the
|
|
176
|
-
* only injection-safe way to write one.
|
|
205
|
+
* only injection-safe way to write one. The role is an identifier from
|
|
206
|
+
* configuration, validated by {@link tenantRole}.
|
|
177
207
|
*/
|
|
178
208
|
export declare function applyTenantToClient(client: PoolClient): Promise<void>;
|
|
179
209
|
/**
|
|
@@ -181,7 +211,8 @@ export declare function applyTenantToClient(client: PoolClient): Promise<void>;
|
|
|
181
211
|
*
|
|
182
212
|
* `is_local => true` scopes the value to the transaction, so it
|
|
183
213
|
* reverts on COMMIT/ROLLBACK and leaves the connection's session
|
|
184
|
-
* value — and therefore {@link appliedByClient} — untouched.
|
|
214
|
+
* value — and therefore {@link appliedByClient} — untouched. The role,
|
|
215
|
+
* when `DB_TENANT_ROLE` is set, is likewise `SET LOCAL`.
|
|
185
216
|
*
|
|
186
217
|
* No-op until tenancy is engaged, so existing transactional consumers
|
|
187
218
|
* are unaffected.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../src/query/tenant.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../src/query/tenant.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4GG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAErC;;;;GAIG;AACH,eAAO,MAAM,UAAU,kBAAkB,CAAC;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AA6CjD,6DAA6D;AAC7D,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAElD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CASnF;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA2B3F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAGpE;AAcD,mEAAmE;AACnE,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAWhD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,MAAM,GAAG,IAAI,CAUnH;AA8CD;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB3E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
|
package/dist/query/tenant.js
CHANGED
|
@@ -68,6 +68,26 @@
|
|
|
68
68
|
* privileged role. Enabling RLS without that split gives you the
|
|
69
69
|
* overhead and none of the protection.
|
|
70
70
|
*
|
|
71
|
+
* # One connection, two privilege levels: `DB_TENANT_ROLE`
|
|
72
|
+
*
|
|
73
|
+
* The split above is a provisioning matter, and the one place it is
|
|
74
|
+
* routinely missed: `vk dev` connects as `postgres` (SUPERUSER, hence
|
|
75
|
+
* BYPASSRLS), and a deployment that connects as the owner passes every
|
|
76
|
+
* test while isolating nothing. `DB_TENANT_ROLE` closes that gap from
|
|
77
|
+
* inside the process. When it names a role — a `NOLOGIN` group that owns
|
|
78
|
+
* nothing and is granted DML, e.g. `app_user` — every tenant-scoped
|
|
79
|
+
* statement runs under `SET ROLE` to it, so RLS applies exactly as it
|
|
80
|
+
* would for a non-owner login, while work outside a tenant scope
|
|
81
|
+
* (event consumers, migrations, the sweep that lists tenants) keeps the
|
|
82
|
+
* connection's own privileges. Set it through `databases[].tenantRole`
|
|
83
|
+
* in `vk.config.ts`; `vk dev` and the deploy pipeline inject it. Unset,
|
|
84
|
+
* nothing about roles is ever issued.
|
|
85
|
+
*
|
|
86
|
+
* `SET ROLE` is permitted to the session user's memberships and, for a
|
|
87
|
+
* superuser, to any role; the connection's login must therefore be
|
|
88
|
+
* either a member of the tenant role or a superuser/owner, which is the
|
|
89
|
+
* case this feature exists for.
|
|
90
|
+
*
|
|
71
91
|
* # Why the GUC is set per connection, not per query
|
|
72
92
|
*
|
|
73
93
|
* `query()` borrows a connection from the pool for the duration of one
|
|
@@ -244,6 +264,54 @@ function currentGucValues() {
|
|
|
244
264
|
scope: getCurrentTenantScope().join(SCOPE_SEPARATOR),
|
|
245
265
|
};
|
|
246
266
|
}
|
|
267
|
+
/** The env var naming the role tenant-scoped statements run as. */
|
|
268
|
+
export const TENANT_ROLE_ENV = 'DB_TENANT_ROLE';
|
|
269
|
+
/**
|
|
270
|
+
* A role name is an identifier, and `SET ROLE` takes no bound
|
|
271
|
+
* parameters, so it is interpolated — after being held to the shape of
|
|
272
|
+
* an unquoted Postgres identifier. Anything else is refused outright:
|
|
273
|
+
* the value comes from deployment configuration, not from a request,
|
|
274
|
+
* and a typo must fail loudly rather than be quoted into something.
|
|
275
|
+
*/
|
|
276
|
+
const ROLE_NAME = /^[a-z_][a-z0-9_]{0,62}$/;
|
|
277
|
+
/**
|
|
278
|
+
* The tenant role in effect, or `null` when `DB_TENANT_ROLE` is unset
|
|
279
|
+
* (the default: no role statements at all). Read per call so a test or
|
|
280
|
+
* a reconfigured process is honoured without a restart.
|
|
281
|
+
*/
|
|
282
|
+
export function tenantRole(env = process.env) {
|
|
283
|
+
const raw = env[TENANT_ROLE_ENV]?.trim();
|
|
284
|
+
if (!raw)
|
|
285
|
+
return null;
|
|
286
|
+
if (!ROLE_NAME.test(raw)) {
|
|
287
|
+
throw new Error(`[@venturekit/data] ${TENANT_ROLE_ENV}=${JSON.stringify(raw)} is not a plain Postgres role name ` +
|
|
288
|
+
`(lowercase letters, digits and underscores, not starting with a digit).`);
|
|
289
|
+
}
|
|
290
|
+
return raw;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Which role the current scope runs as: the tenant role inside a tenant
|
|
294
|
+
* scope ({@link runWithTenant} / {@link runWithTenantScope}); the
|
|
295
|
+
* connection's own role otherwise — inside {@link runWithoutTenant} and
|
|
296
|
+
* outside any scope alike, where the work is platform-level by
|
|
297
|
+
* definition (listing tenants for a sweep, consuming events into the
|
|
298
|
+
* tables only the owner may write) and the GUC is empty anyway. `null`
|
|
299
|
+
* when the feature is off.
|
|
300
|
+
*/
|
|
301
|
+
function currentRole() {
|
|
302
|
+
const role = tenantRole();
|
|
303
|
+
if (!role)
|
|
304
|
+
return null;
|
|
305
|
+
return { role, assume: getCurrentTenantId() !== null };
|
|
306
|
+
}
|
|
307
|
+
/** `SET [LOCAL] ROLE …` / `… ROLE NONE` for the current scope, or `null` when roles are not in play. */
|
|
308
|
+
function roleStatement(local) {
|
|
309
|
+
const current = currentRole();
|
|
310
|
+
if (!current)
|
|
311
|
+
return null;
|
|
312
|
+
const kw = local ? 'SET LOCAL ROLE' : 'SET ROLE';
|
|
313
|
+
return current.assume ? `${kw} "${current.role}"` : `${kw} NONE`;
|
|
314
|
+
}
|
|
247
315
|
/**
|
|
248
316
|
* Last value applied to each physical connection.
|
|
249
317
|
*
|
|
@@ -255,28 +323,32 @@ function currentGucValues() {
|
|
|
255
323
|
*/
|
|
256
324
|
const appliedByClient = new WeakMap();
|
|
257
325
|
/**
|
|
258
|
-
* Memo key for the applied
|
|
259
|
-
*
|
|
260
|
-
*
|
|
326
|
+
* Memo key for the applied state: the GUC pair plus the role statement
|
|
327
|
+
* in effect. `\u0000` cannot appear in any part (Postgres rejects NUL in
|
|
328
|
+
* text, the scope separator is a comma, a role name is an identifier),
|
|
329
|
+
* so distinct states cannot collide onto one key.
|
|
261
330
|
*/
|
|
262
|
-
function memoKey(tenant, scope) {
|
|
263
|
-
return `${tenant}\u0000${scope}`;
|
|
331
|
+
function memoKey(tenant, scope, role) {
|
|
332
|
+
return `${tenant}\u0000${scope}\u0000${role ?? ''}`;
|
|
264
333
|
}
|
|
265
334
|
/**
|
|
266
|
-
* Ensure `client`'s session
|
|
267
|
-
* `
|
|
335
|
+
* Ensure `client`'s session state matches the current scope — the two
|
|
336
|
+
* GUCs and, under `DB_TENANT_ROLE`, the role — issuing statements only
|
|
337
|
+
* when it differs.
|
|
268
338
|
*
|
|
269
339
|
* Uses a bound parameter — GUC values are user-controlled tenant ids
|
|
270
340
|
* and `SET` does not accept placeholders, so `set_config()` is the
|
|
271
|
-
* only injection-safe way to write one.
|
|
341
|
+
* only injection-safe way to write one. The role is an identifier from
|
|
342
|
+
* configuration, validated by {@link tenantRole}.
|
|
272
343
|
*/
|
|
273
344
|
export async function applyTenantToClient(client) {
|
|
274
345
|
const { tenant, scope } = currentGucValues();
|
|
275
|
-
const
|
|
346
|
+
const role = roleStatement(false);
|
|
347
|
+
const want = memoKey(tenant, scope, role);
|
|
276
348
|
if (appliedByClient.get(client) === want)
|
|
277
349
|
return;
|
|
278
|
-
// Record BEFORE awaiting: a rejected
|
|
279
|
-
// memo claiming a
|
|
350
|
+
// Record BEFORE awaiting: a rejected statement must not leave the
|
|
351
|
+
// memo claiming a state the server never accepted.
|
|
280
352
|
appliedByClient.delete(client);
|
|
281
353
|
// One statement, so the acting tenant and the readable set can never
|
|
282
354
|
// be left half-applied by a connection dropped between two queries.
|
|
@@ -286,6 +358,12 @@ export async function applyTenantToClient(client) {
|
|
|
286
358
|
TENANT_SCOPE_GUC,
|
|
287
359
|
scope,
|
|
288
360
|
]);
|
|
361
|
+
// The role is a utility command and cannot share the statement above;
|
|
362
|
+
// it comes second so a connection that drops between the two is left
|
|
363
|
+
// with the GUCs set and the OLD role — a stricter state, never a laxer
|
|
364
|
+
// one, since the memo is not recorded until both have succeeded.
|
|
365
|
+
if (role)
|
|
366
|
+
await client.query(role);
|
|
289
367
|
appliedByClient.set(client, want);
|
|
290
368
|
}
|
|
291
369
|
/**
|
|
@@ -293,7 +371,8 @@ export async function applyTenantToClient(client) {
|
|
|
293
371
|
*
|
|
294
372
|
* `is_local => true` scopes the value to the transaction, so it
|
|
295
373
|
* reverts on COMMIT/ROLLBACK and leaves the connection's session
|
|
296
|
-
* value — and therefore {@link appliedByClient} — untouched.
|
|
374
|
+
* value — and therefore {@link appliedByClient} — untouched. The role,
|
|
375
|
+
* when `DB_TENANT_ROLE` is set, is likewise `SET LOCAL`.
|
|
297
376
|
*
|
|
298
377
|
* No-op until tenancy is engaged, so existing transactional consumers
|
|
299
378
|
* are unaffected.
|
|
@@ -308,6 +387,9 @@ export async function applyTenantToTransaction(client) {
|
|
|
308
387
|
TENANT_SCOPE_GUC,
|
|
309
388
|
scope,
|
|
310
389
|
]);
|
|
390
|
+
const role = roleStatement(true);
|
|
391
|
+
if (role)
|
|
392
|
+
await client.query(role);
|
|
311
393
|
}
|
|
312
394
|
/**
|
|
313
395
|
* Reset module state. Test-only — production code has no reason to
|
package/dist/query/tenant.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant.js","sourceRoot":"","sources":["../../src/query/tenant.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tenant.js","sourceRoot":"","sources":["../../src/query/tenant.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@venturekit/data",
|
|
3
|
-
"version": "0.0.0-dev.
|
|
3
|
+
"version": "0.0.0-dev.20260906223830",
|
|
4
4
|
"description": "Database and data layer for VentureKit",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@aws-sdk/client-secrets-manager": "^3.1091.0",
|
|
33
|
-
"@venturekit/core": "0.0.0-dev.
|
|
33
|
+
"@venturekit/core": "0.0.0-dev.20260906223830",
|
|
34
34
|
"pg": "^8.12.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|