@polardbx/pxbaas-client 0.1.0-beta.1 → 0.1.0-beta.2
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 +52 -0
- package/dist/drivers/apps.driver.d.ts +26 -0
- package/dist/drivers/apps.driver.d.ts.map +1 -1
- package/dist/drivers/apps.driver.js +8 -0
- package/dist/drivers/apps.driver.js.map +1 -1
- package/dist/drivers/tenant-ddl.driver.d.ts +106 -0
- package/dist/drivers/tenant-ddl.driver.d.ts.map +1 -0
- package/dist/drivers/tenant-ddl.driver.js +131 -0
- package/dist/drivers/tenant-ddl.driver.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# @polardbx/pxbaas-client
|
|
2
|
+
|
|
3
|
+
Shared HTTP client SDK for [PolarDB-X BaaS](https://github.com/polardbx/mysql-supabase) (MySQL-Supabase) data plane APIs. This is the transport layer used by the [`@polardbx/pxbaas`](https://www.npmjs.com/package/@polardbx/pxbaas) CLI; you can also depend on it directly to script BaaS operations from Node.js.
|
|
4
|
+
|
|
5
|
+
Covered API surfaces:
|
|
6
|
+
|
|
7
|
+
- Meta API (`/pg/*`) — tables, schema, SQL query
|
|
8
|
+
- Functions Management API (`/v1/projects/*`) — Edge Function deploy/list/delete
|
|
9
|
+
- Apps & share-links drivers — webapp mounts and secure sharing
|
|
10
|
+
- Storage API (`/storage/v1/*`) — objects and buckets
|
|
11
|
+
- Auth Admin API (`/auth/v1/admin/*`) — user administration
|
|
12
|
+
- Tenant self-service DDL / RLS driver (multi-tenant, per-tenant `service_role`)
|
|
13
|
+
- Zero provisioning driver (PolarDB-X Zero PXBaas)
|
|
14
|
+
|
|
15
|
+
## Requirements
|
|
16
|
+
|
|
17
|
+
- Node.js >= 20
|
|
18
|
+
- ESM (`"type": "module"`); types ship in `dist/index.d.ts`
|
|
19
|
+
|
|
20
|
+
## Installation
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install @polardbx/pxbaas-client
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Usage
|
|
27
|
+
|
|
28
|
+
Drivers are constructed per endpoint with your tenant keys; keys are passed by the caller (the CLI sources them from its keyring-backed profile store).
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
import { MetaDriver } from "@polardbx/pxbaas-client";
|
|
32
|
+
|
|
33
|
+
const meta = new MetaDriver({
|
|
34
|
+
endpoint: "https://your-baas-endpoint",
|
|
35
|
+
anonKey: process.env.BAAS_ANON_KEY!,
|
|
36
|
+
serviceRoleKey: process.env.BAAS_SERVICE_ROLE_KEY, // admin operations
|
|
37
|
+
tenantId: process.env.BAAS_TENANT_ID, // multi-tenant deployments
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const tables = await meta.listTables();
|
|
41
|
+
const rows = await meta.query("select 1");
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Other drivers (`FunctionsDriver`, `AppsDriver`, `ShareLinksDriver`, `StorageDriver`, `AuthAdminDriver`, `TenantDdlDriver`, `ZeroDriver`) follow the same options-object pattern; see `dist/index.d.ts` for the full typed surface.
|
|
45
|
+
|
|
46
|
+
## Versioning
|
|
47
|
+
|
|
48
|
+
Versioned in lockstep with `@polardbx/pxbaas` (the CLI depends on this package via `workspace:*` in the monorepo, rewritten to the real version at publish time). Always upgrade both together.
|
|
49
|
+
|
|
50
|
+
## License
|
|
51
|
+
|
|
52
|
+
MIT
|
|
@@ -65,6 +65,26 @@ export interface ChangeAppGenerationOptions {
|
|
|
65
65
|
expectedGeneration: number;
|
|
66
66
|
tenantId?: string;
|
|
67
67
|
}
|
|
68
|
+
export interface DestroyAppOptions {
|
|
69
|
+
/** Reclaim an orphan candidate the caller uploaded but never published. */
|
|
70
|
+
candidateFunctionSlug?: string;
|
|
71
|
+
/** Opt-in CAS guard; omit to destroy unconditionally. */
|
|
72
|
+
expectedGeneration?: number;
|
|
73
|
+
tenantId?: string;
|
|
74
|
+
}
|
|
75
|
+
export interface AppDestroyFunctionResult {
|
|
76
|
+
slug: string;
|
|
77
|
+
deleted: boolean;
|
|
78
|
+
error?: string;
|
|
79
|
+
}
|
|
80
|
+
export interface AppDestroyResult {
|
|
81
|
+
destroyed: boolean;
|
|
82
|
+
mountId: string;
|
|
83
|
+
appName: string;
|
|
84
|
+
tenantId: string;
|
|
85
|
+
alreadyGone?: boolean;
|
|
86
|
+
deletedFunctions: AppDestroyFunctionResult[];
|
|
87
|
+
}
|
|
68
88
|
export interface AppsDriverOptions {
|
|
69
89
|
endpoint: string;
|
|
70
90
|
serviceRoleKey: string;
|
|
@@ -89,6 +109,12 @@ export declare class AppsDriver {
|
|
|
89
109
|
publish(mountId: string, options: PublishAppOptions): Promise<AppMount>;
|
|
90
110
|
rollback(mountId: string, options: ChangeAppGenerationOptions): Promise<AppMount>;
|
|
91
111
|
unpublish(mountId: string, options: ChangeAppGenerationOptions): Promise<AppMount>;
|
|
112
|
+
/**
|
|
113
|
+
* Permanently tear down a Webapp: reclaim its edge-func candidates and delete
|
|
114
|
+
* the mount-id record. Idempotent (an already-gone mount returns destroyed).
|
|
115
|
+
* DB business tables are NOT touched.
|
|
116
|
+
*/
|
|
117
|
+
destroy(mountId: string, options?: DestroyAppOptions): Promise<AppDestroyResult>;
|
|
92
118
|
private request;
|
|
93
119
|
}
|
|
94
120
|
export declare function normalizeAppsError(error: unknown): AppsApiError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apps.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/apps.driver.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"apps.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/apps.driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,14 @@ export class AppsDriver {
|
|
|
39
39
|
async unpublish(mountId, options) {
|
|
40
40
|
return this.request(() => this.client.post(`/${encodeURIComponent(mountId)}/unpublish`, compact(options)));
|
|
41
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Permanently tear down a Webapp: reclaim its edge-func candidates and delete
|
|
44
|
+
* the mount-id record. Idempotent (an already-gone mount returns destroyed).
|
|
45
|
+
* DB business tables are NOT touched.
|
|
46
|
+
*/
|
|
47
|
+
async destroy(mountId, options = {}) {
|
|
48
|
+
return this.request(() => this.client.post(`/${encodeURIComponent(mountId)}/destroy`, compact(options)));
|
|
49
|
+
}
|
|
42
50
|
async request(operation) {
|
|
43
51
|
try {
|
|
44
52
|
const response = await operation();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apps.driver.js","sourceRoot":"","sources":["../../src/drivers/apps.driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAA8C,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"apps.driver.js","sourceRoot":"","sources":["../../src/drivers/apps.driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant DDL Driver — 多租户「普通租户」自助 DDL / RLS 注册客户端。
|
|
3
|
+
*
|
|
4
|
+
* 对接 Studio BFF 的租户自助端点(Aone #87795993):
|
|
5
|
+
* - POST /api/tenant-ddl/query 在租户自有库执行 DDL/DML
|
|
6
|
+
* - POST /api/tenant-ddl/rls/tables 开/关表级 RLS
|
|
7
|
+
* - GET /api/tenant-ddl/rls/tables 列出本租户已注册 RLS 的表
|
|
8
|
+
* - DELETE /api/tenant-ddl/rls/tables 移除一张表的 RLS 注册(开关行)
|
|
9
|
+
* - POST /api/tenant-ddl/rls/policies 增/改一条 RLS 策略
|
|
10
|
+
* - GET /api/tenant-ddl/rls/policies 列出本租户策略(可按 table 过滤)
|
|
11
|
+
* - DELETE /api/tenant-ddl/rls/policies 删除一条策略
|
|
12
|
+
*
|
|
13
|
+
* 认证模型(务必遵守,见方案文档「三、认证与信任链」):
|
|
14
|
+
* 只发送 `Authorization: Bearer <per-tenant service_role key>`。**绝不**自行拼
|
|
15
|
+
* `X-Tenant-Id`——Kong 入口会剥离客户端伪造的该头、验签 per-tenant JWT 后注入
|
|
16
|
+
* 可信 X-Tenant-Id,并把下游 Authorization 替换为全局 key。租户身份完全由网关推导。
|
|
17
|
+
*
|
|
18
|
+
* 成功响应统一为 `{ data: ... }`,失败为 `{ code, message }`;本 driver 解包 data、
|
|
19
|
+
* 并把失败规范化为 TenantDdlError(携带 code/message/status)。
|
|
20
|
+
*/
|
|
21
|
+
/** RLS 命令行枚举(与服务端 resolver 白名单一致)。 */
|
|
22
|
+
export type RlsCommand = "ALL" | "SELECT" | "INSERT" | "UPDATE" | "DELETE";
|
|
23
|
+
export interface TenantDdlDriverOptions {
|
|
24
|
+
endpoint: string;
|
|
25
|
+
/** per-tenant service_role key(带 tenant_id claim)。不可用全局 key。 */
|
|
26
|
+
serviceRoleKey: string;
|
|
27
|
+
timeout?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface RlsTableInput {
|
|
30
|
+
table_name: string;
|
|
31
|
+
/** 默认 true(启用 RLS)。 */
|
|
32
|
+
rls_enabled?: boolean;
|
|
33
|
+
/** 默认 false。 */
|
|
34
|
+
rls_forced?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface RlsPolicyInput {
|
|
37
|
+
table_name: string;
|
|
38
|
+
policy_name: string;
|
|
39
|
+
/** `*` 或 `[a-zA-Z0-9_]`;缺省服务端按 `*` 处理。 */
|
|
40
|
+
role_name?: string;
|
|
41
|
+
command?: RlsCommand | string;
|
|
42
|
+
using_expr?: string | null;
|
|
43
|
+
check_expr?: string | null;
|
|
44
|
+
permissive?: boolean;
|
|
45
|
+
}
|
|
46
|
+
/** GET /rls/tables 的一行(rls_* 以 tinyint 0/1 返回)。 */
|
|
47
|
+
export interface RlsTableRow {
|
|
48
|
+
table_schema: string;
|
|
49
|
+
table_name: string;
|
|
50
|
+
rls_enabled: number | boolean;
|
|
51
|
+
rls_forced: number | boolean;
|
|
52
|
+
}
|
|
53
|
+
/** GET /rls/policies 的一行。 */
|
|
54
|
+
export interface RlsPolicyRow {
|
|
55
|
+
table_schema: string;
|
|
56
|
+
table_name: string;
|
|
57
|
+
policy_name: string;
|
|
58
|
+
role_name: string;
|
|
59
|
+
command: string;
|
|
60
|
+
using_expr: string | null;
|
|
61
|
+
check_expr: string | null;
|
|
62
|
+
permissive: number | boolean;
|
|
63
|
+
}
|
|
64
|
+
/** 租户自助 DDL/RLS 调用的统一错误(携带机器码 + HTTP 状态)。 */
|
|
65
|
+
export declare class TenantDdlError extends Error {
|
|
66
|
+
readonly code: string;
|
|
67
|
+
readonly status?: number;
|
|
68
|
+
constructor(code: string, message: string, status?: number);
|
|
69
|
+
}
|
|
70
|
+
export declare class TenantDdlDriver {
|
|
71
|
+
private readonly client;
|
|
72
|
+
constructor(options: TenantDdlDriverOptions);
|
|
73
|
+
/**
|
|
74
|
+
* Execute a DDL/DML statement on the tenant's OWN database. The tenant MySQL
|
|
75
|
+
* account (GRANT ALL ON own_db.* only) is the hard isolation boundary; the
|
|
76
|
+
* server additionally pre-checks and rejects privilege/instance-level statements.
|
|
77
|
+
* Returns the raw pg-meta rows (`data`), or `[]` for statements with no result set.
|
|
78
|
+
*/
|
|
79
|
+
query(sql: string): Promise<unknown[]>;
|
|
80
|
+
/** Enable/force RLS on one of the tenant's tables (central registry, schema server-bound). */
|
|
81
|
+
upsertRlsTable(input: RlsTableInput): Promise<void>;
|
|
82
|
+
/** List the tenant's own RLS-registered tables. */
|
|
83
|
+
listRlsTables(): Promise<RlsTableRow[]>;
|
|
84
|
+
/**
|
|
85
|
+
* Remove a table's RLS registration (the central enable/force toggle row),
|
|
86
|
+
* symmetric to {@link deleteRlsPolicy}. The server binds table_schema to the
|
|
87
|
+
* tenant db and does NOT require the table to still exist, so this is safe to
|
|
88
|
+
* call after a DROP (idempotent cleanup).
|
|
89
|
+
*/
|
|
90
|
+
deleteRlsTable(tableName: string): Promise<void>;
|
|
91
|
+
/** Insert/update one RLS policy for the tenant (schema server-bound). */
|
|
92
|
+
upsertRlsPolicy(input: RlsPolicyInput): Promise<void>;
|
|
93
|
+
/** List the tenant's own policies, optionally filtered by table name. */
|
|
94
|
+
listRlsPolicies(tableName?: string): Promise<RlsPolicyRow[]>;
|
|
95
|
+
/** Delete one of the tenant's policies (scoped by table + policy name). */
|
|
96
|
+
deleteRlsPolicy(tableName: string, policyName: string): Promise<void>;
|
|
97
|
+
private request;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Map any failure to a TenantDdlError. Server errors carry `{ code, message }`
|
|
101
|
+
* (e.g. PERMISSION_DENIED / GLOBAL_KEY_NOT_ALLOWED / ROLE_NOT_ALLOWED /
|
|
102
|
+
* TENANT_NOT_ACTIVE / STATEMENT_NOT_ALLOWED); fall back to an HTTP-status code
|
|
103
|
+
* or a network code when the body is absent.
|
|
104
|
+
*/
|
|
105
|
+
export declare function normalizeTenantDdlError(error: unknown): TenantDdlError;
|
|
106
|
+
//# sourceMappingURL=tenant-ddl.driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-ddl.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/tenant-ddl.driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,sCAAsC;AACtC,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B;AAED,6BAA6B;AAC7B,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B;AAED,6CAA6C;AAC7C,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEb,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAM3D;AAQD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,OAAO,EAAE,sBAAsB;IAW3C;;;;;OAKG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAO5C,8FAA8F;IACxF,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzD,mDAAmD;IAC7C,aAAa,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAO7C;;;;;OAKG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtD,yEAAyE;IACnE,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D,yEAAyE;IACnE,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IASlE,2EAA2E;IACrE,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAQ7D,OAAO;CAUtB;AAQD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAwBtE"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant DDL Driver — 多租户「普通租户」自助 DDL / RLS 注册客户端。
|
|
3
|
+
*
|
|
4
|
+
* 对接 Studio BFF 的租户自助端点(Aone #87795993):
|
|
5
|
+
* - POST /api/tenant-ddl/query 在租户自有库执行 DDL/DML
|
|
6
|
+
* - POST /api/tenant-ddl/rls/tables 开/关表级 RLS
|
|
7
|
+
* - GET /api/tenant-ddl/rls/tables 列出本租户已注册 RLS 的表
|
|
8
|
+
* - DELETE /api/tenant-ddl/rls/tables 移除一张表的 RLS 注册(开关行)
|
|
9
|
+
* - POST /api/tenant-ddl/rls/policies 增/改一条 RLS 策略
|
|
10
|
+
* - GET /api/tenant-ddl/rls/policies 列出本租户策略(可按 table 过滤)
|
|
11
|
+
* - DELETE /api/tenant-ddl/rls/policies 删除一条策略
|
|
12
|
+
*
|
|
13
|
+
* 认证模型(务必遵守,见方案文档「三、认证与信任链」):
|
|
14
|
+
* 只发送 `Authorization: Bearer <per-tenant service_role key>`。**绝不**自行拼
|
|
15
|
+
* `X-Tenant-Id`——Kong 入口会剥离客户端伪造的该头、验签 per-tenant JWT 后注入
|
|
16
|
+
* 可信 X-Tenant-Id,并把下游 Authorization 替换为全局 key。租户身份完全由网关推导。
|
|
17
|
+
*
|
|
18
|
+
* 成功响应统一为 `{ data: ... }`,失败为 `{ code, message }`;本 driver 解包 data、
|
|
19
|
+
* 并把失败规范化为 TenantDdlError(携带 code/message/status)。
|
|
20
|
+
*/
|
|
21
|
+
import axios from "axios";
|
|
22
|
+
/** 租户自助 DDL/RLS 调用的统一错误(携带机器码 + HTTP 状态)。 */
|
|
23
|
+
export class TenantDdlError extends Error {
|
|
24
|
+
code;
|
|
25
|
+
status;
|
|
26
|
+
constructor(code, message, status) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = "TenantDdlError";
|
|
29
|
+
this.code = code;
|
|
30
|
+
this.status = status;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class TenantDdlDriver {
|
|
34
|
+
client;
|
|
35
|
+
constructor(options) {
|
|
36
|
+
const endpoint = options.endpoint.replace(/\/$/, "");
|
|
37
|
+
this.client = axios.create({
|
|
38
|
+
baseURL: `${endpoint}/api/tenant-ddl`,
|
|
39
|
+
timeout: options.timeout ?? 60_000,
|
|
40
|
+
// Only the per-tenant service_role bearer. Never send X-Tenant-Id here —
|
|
41
|
+
// Kong strips any client-supplied value and injects the trusted one.
|
|
42
|
+
headers: { Authorization: `Bearer ${options.serviceRoleKey}` },
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Execute a DDL/DML statement on the tenant's OWN database. The tenant MySQL
|
|
47
|
+
* account (GRANT ALL ON own_db.* only) is the hard isolation boundary; the
|
|
48
|
+
* server additionally pre-checks and rejects privilege/instance-level statements.
|
|
49
|
+
* Returns the raw pg-meta rows (`data`), or `[]` for statements with no result set.
|
|
50
|
+
*/
|
|
51
|
+
async query(sql) {
|
|
52
|
+
const data = await this.request(() => this.client.post("/query", { sql }));
|
|
53
|
+
return data ?? [];
|
|
54
|
+
}
|
|
55
|
+
/** Enable/force RLS on one of the tenant's tables (central registry, schema server-bound). */
|
|
56
|
+
async upsertRlsTable(input) {
|
|
57
|
+
await this.request(() => this.client.post("/rls/tables", compact(input)));
|
|
58
|
+
}
|
|
59
|
+
/** List the tenant's own RLS-registered tables. */
|
|
60
|
+
async listRlsTables() {
|
|
61
|
+
const data = await this.request(() => this.client.get("/rls/tables"));
|
|
62
|
+
return data ?? [];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Remove a table's RLS registration (the central enable/force toggle row),
|
|
66
|
+
* symmetric to {@link deleteRlsPolicy}. The server binds table_schema to the
|
|
67
|
+
* tenant db and does NOT require the table to still exist, so this is safe to
|
|
68
|
+
* call after a DROP (idempotent cleanup).
|
|
69
|
+
*/
|
|
70
|
+
async deleteRlsTable(tableName) {
|
|
71
|
+
await this.request(() => this.client.delete("/rls/tables", {
|
|
72
|
+
params: { table_name: tableName },
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
/** Insert/update one RLS policy for the tenant (schema server-bound). */
|
|
76
|
+
async upsertRlsPolicy(input) {
|
|
77
|
+
await this.request(() => this.client.post("/rls/policies", compact(input)));
|
|
78
|
+
}
|
|
79
|
+
/** List the tenant's own policies, optionally filtered by table name. */
|
|
80
|
+
async listRlsPolicies(tableName) {
|
|
81
|
+
const data = await this.request(() => this.client.get("/rls/policies", {
|
|
82
|
+
params: tableName ? { table_name: tableName } : undefined,
|
|
83
|
+
}));
|
|
84
|
+
return data ?? [];
|
|
85
|
+
}
|
|
86
|
+
/** Delete one of the tenant's policies (scoped by table + policy name). */
|
|
87
|
+
async deleteRlsPolicy(tableName, policyName) {
|
|
88
|
+
await this.request(() => this.client.delete("/rls/policies", {
|
|
89
|
+
params: { table_name: tableName, policy_name: policyName },
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
async request(operation) {
|
|
93
|
+
try {
|
|
94
|
+
const response = await operation();
|
|
95
|
+
return response.data?.data;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
throw normalizeTenantDdlError(error);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function compact(value) {
|
|
103
|
+
return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Map any failure to a TenantDdlError. Server errors carry `{ code, message }`
|
|
107
|
+
* (e.g. PERMISSION_DENIED / GLOBAL_KEY_NOT_ALLOWED / ROLE_NOT_ALLOWED /
|
|
108
|
+
* TENANT_NOT_ACTIVE / STATEMENT_NOT_ALLOWED); fall back to an HTTP-status code
|
|
109
|
+
* or a network code when the body is absent.
|
|
110
|
+
*/
|
|
111
|
+
export function normalizeTenantDdlError(error) {
|
|
112
|
+
if (!axios.isAxiosError(error)) {
|
|
113
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
114
|
+
return new TenantDdlError("TENANT_DDL_UNKNOWN_ERROR", message);
|
|
115
|
+
}
|
|
116
|
+
const axiosError = error;
|
|
117
|
+
const status = axiosError.response?.status;
|
|
118
|
+
const body = axiosError.response?.data;
|
|
119
|
+
const code = typeof body?.code === "string"
|
|
120
|
+
? body.code
|
|
121
|
+
: status
|
|
122
|
+
? `TENANT_DDL_HTTP_${status}`
|
|
123
|
+
: "TENANT_DDL_NETWORK_ERROR";
|
|
124
|
+
const message = typeof body?.message === "string"
|
|
125
|
+
? body.message
|
|
126
|
+
: status
|
|
127
|
+
? `Tenant DDL request failed (HTTP ${status})`
|
|
128
|
+
: axiosError.message || "Tenant DDL network request failed";
|
|
129
|
+
return new TenantDdlError(code, message, status);
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=tenant-ddl.driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-ddl.driver.js","sourceRoot":"","sources":["../../src/drivers/tenant-ddl.driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAA8C,MAAM,OAAO,CAAC;AAmDnE,6CAA6C;AAC7C,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,CAAS;IACb,MAAM,CAAU;IAEzB,YAAY,IAAY,EAAE,OAAe,EAAE,MAAe;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAQD,MAAM,OAAO,eAAe;IACT,MAAM,CAAgB;IAEvC,YAAY,OAA+B;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,GAAG,QAAQ,iBAAiB;YACrC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,MAAM;YAClC,yEAAyE;YACzE,qEAAqE;YACrE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,cAAc,EAAE,EAAE;SAC/D,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAY,GAAG,EAAE,CAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAA+B,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,CAClE,CAAC;QACF,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,8FAA8F;IAC9F,KAAK,CAAC,cAAc,CAAC,KAAoB;QACvC,MAAM,IAAI,CAAC,OAAO,CAAU,GAAG,EAAE,CAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAA6B,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAC5E,CAAC;IACJ,CAAC;IAED,mDAAmD;IACnD,KAAK,CAAC,aAAa;QACjB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAgB,GAAG,EAAE,CAClD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAmC,aAAa,CAAC,CACjE,CAAC;QACF,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAAC,SAAiB;QACpC,MAAM,IAAI,CAAC,OAAO,CAAU,GAAG,EAAE,CAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,CAA6B,aAAa,EAAE;YAC5D,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;SAClC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,eAAe,CAAC,KAAqB;QACzC,MAAM,IAAI,CAAC,OAAO,CAAU,GAAG,EAAE,CAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAA6B,eAAe,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAC9E,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,eAAe,CAAC,SAAkB;QACtC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAiB,GAAG,EAAE,CACnD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAoC,eAAe,EAAE;YAClE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;SAC1D,CAAC,CACH,CAAC;QACF,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,eAAe,CAAC,SAAiB,EAAE,UAAkB;QACzD,MAAM,IAAI,CAAC,OAAO,CAAU,GAAG,EAAE,CAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,CAA6B,eAAe,EAAE;YAC9D,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE;SAC3D,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,SAAwD;QAExD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,EAAE,CAAC;YACnC,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,uBAAuB,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;CACF;AAED,SAAS,OAAO,CAAmB,KAAQ;IACzC,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAC5D,CAAC;AACT,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,IAAI,cAAc,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,UAAU,GAAG,KAA4B,CAAC;IAChD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,IAErB,CAAC;IACd,MAAM,IAAI,GACR,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ;QAC5B,CAAC,CAAC,IAAI,CAAC,IAAI;QACX,CAAC,CAAC,MAAM;YACN,CAAC,CAAC,mBAAmB,MAAM,EAAE;YAC7B,CAAC,CAAC,0BAA0B,CAAC;IACnC,MAAM,OAAO,GACX,OAAO,IAAI,EAAE,OAAO,KAAK,QAAQ;QAC/B,CAAC,CAAC,IAAI,CAAC,OAAO;QACd,CAAC,CAAC,MAAM;YACN,CAAC,CAAC,mCAAmC,MAAM,GAAG;YAC9C,CAAC,CAAC,UAAU,CAAC,OAAO,IAAI,mCAAmC,CAAC;IAClE,OAAO,IAAI,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AACnD,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -20,5 +20,6 @@ export * from "./drivers/apps.driver.js";
|
|
|
20
20
|
export * from "./drivers/share-links.driver.js";
|
|
21
21
|
export * from "./drivers/storage.driver.js";
|
|
22
22
|
export * from "./drivers/auth-admin.driver.js";
|
|
23
|
+
export * from "./drivers/tenant-ddl.driver.js";
|
|
23
24
|
export * from "./drivers/zero.driver.js";
|
|
24
25
|
//# 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;;;;;;;;;;;;;;GAcG;AAEH,cAAc,YAAY,CAAC;AAM3B,cAAc,0BAA0B,CAAC;AAGzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAG5C,cAAc,gCAAgC,CAAC;AAG/C,cAAc,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,cAAc,YAAY,CAAC;AAM3B,cAAc,0BAA0B,CAAC;AAGzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAG5C,cAAc,gCAAgC,CAAC;AAG/C,cAAc,gCAAgC,CAAC;AAG/C,cAAc,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -25,6 +25,8 @@ export * from "./drivers/share-links.driver.js";
|
|
|
25
25
|
export * from "./drivers/storage.driver.js";
|
|
26
26
|
// M5 - Auth Admin driver
|
|
27
27
|
export * from "./drivers/auth-admin.driver.js";
|
|
28
|
+
// Tenant self-service DDL / RLS driver (multi-tenant, per-tenant service_role)
|
|
29
|
+
export * from "./drivers/tenant-ddl.driver.js";
|
|
28
30
|
// Zero provisioning driver (PolarDB-X Zero PXBaas)
|
|
29
31
|
export * from "./drivers/zero.driver.js";
|
|
30
32
|
// TODO: M5 - Add REST driver
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,cAAc,YAAY,CAAC;AAE3B,6BAA6B;AAC7B,6BAA6B;AAE7B,uBAAuB;AACvB,cAAc,0BAA0B,CAAC;AAEzC,4CAA4C;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAE5C,yBAAyB;AACzB,cAAc,gCAAgC,CAAC;AAE/C,mDAAmD;AACnD,cAAc,0BAA0B,CAAC;AAEzC,6BAA6B;AAC7B,4CAA4C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,cAAc,YAAY,CAAC;AAE3B,6BAA6B;AAC7B,6BAA6B;AAE7B,uBAAuB;AACvB,cAAc,0BAA0B,CAAC;AAEzC,4CAA4C;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAE5C,yBAAyB;AACzB,cAAc,gCAAgC,CAAC;AAE/C,+EAA+E;AAC/E,cAAc,gCAAgC,CAAC;AAE/C,mDAAmD;AACnD,cAAc,0BAA0B,CAAC;AAEzC,6BAA6B;AAC7B,4CAA4C"}
|