@polardbx/pxbaas-client 0.1.0-beta.3 → 0.1.0-beta.4
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 +6 -1
- package/dist/drivers/meta.driver.d.ts +3 -0
- package/dist/drivers/meta.driver.d.ts.map +1 -1
- package/dist/drivers/meta.driver.js +22 -15
- package/dist/drivers/meta.driver.js.map +1 -1
- package/dist/drivers/share-links.driver.d.ts.map +1 -1
- package/dist/drivers/share-links.driver.js +7 -5
- package/dist/drivers/share-links.driver.js.map +1 -1
- package/dist/drivers/storage.driver.d.ts +21 -6
- package/dist/drivers/storage.driver.d.ts.map +1 -1
- package/dist/drivers/storage.driver.js +44 -33
- package/dist/drivers/storage.driver.js.map +1 -1
- package/dist/drivers/tenant-admin.driver.d.ts +130 -0
- package/dist/drivers/tenant-admin.driver.d.ts.map +1 -0
- package/dist/drivers/tenant-admin.driver.js +222 -0
- package/dist/drivers/tenant-admin.driver.js.map +1 -0
- package/dist/errors.d.ts +37 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +64 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,6 +10,7 @@ Covered API surfaces:
|
|
|
10
10
|
- Storage API (`/storage/v1/*`) — objects and buckets
|
|
11
11
|
- Auth Admin API (`/auth/v1/admin/*`) — user administration
|
|
12
12
|
- Tenant self-service DDL / RLS driver (multi-tenant, per-tenant `service_role`)
|
|
13
|
+
- Tenant admin driver (`/api/platform/tenants/*`, instance dashboard Basic auth, operator surface)
|
|
13
14
|
- Zero provisioning driver (PolarDB-X Zero PXBaas)
|
|
14
15
|
|
|
15
16
|
## Requirements
|
|
@@ -41,7 +42,11 @@ const tables = await meta.listTables();
|
|
|
41
42
|
const rows = await meta.query("select 1");
|
|
42
43
|
```
|
|
43
44
|
|
|
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
|
+
Other drivers (`FunctionsDriver`, `AppsDriver`, `ShareLinksDriver`, `StorageDriver`, `AuthAdminDriver`, `TenantDdlDriver`, `TenantAdminDriver`, `ZeroDriver`) follow the same options-object pattern; see `dist/index.d.ts` for the full typed surface.
|
|
46
|
+
|
|
47
|
+
### Secret handling in `TenantAdminDriver`
|
|
48
|
+
|
|
49
|
+
The upstream tenant endpoints return the tenant's `jwt_secret` (its signing master key) and both API keys in plaintext. The driver strips `jwt_secret` at parse time, so no method can hand it back, and normal reads (`list`, `get`) return redacted rows with key-presence booleans only. Tenant key material is reachable solely through `getKeys()` and `create()`, which return it in a dedicated `TenantKeyBundle` — never log or serialize that object; pass it to a keyring or a `0600` file. Keys issued by the platform are long-lived (~10 years) and currently cannot be revoked.
|
|
45
50
|
|
|
46
51
|
## Versioning
|
|
47
52
|
|
|
@@ -44,12 +44,15 @@ export interface MetaDriverOptions {
|
|
|
44
44
|
serviceRoleKey?: string;
|
|
45
45
|
tenantId?: string;
|
|
46
46
|
timeout?: number;
|
|
47
|
+
/** Append method/url/status/response-body to thrown errors (CLI `--debug`). */
|
|
48
|
+
debug?: boolean;
|
|
47
49
|
}
|
|
48
50
|
export declare class MetaDriver {
|
|
49
51
|
private client;
|
|
50
52
|
private anonKey;
|
|
51
53
|
private serviceRoleKey?;
|
|
52
54
|
private tenantId?;
|
|
55
|
+
private debug;
|
|
53
56
|
constructor(options: MetaDriverOptions);
|
|
54
57
|
private getHeaders;
|
|
55
58
|
private handleError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/meta.driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"meta.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/meta.driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAiCD,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAU;gBAEX,OAAO,EAAE,iBAAiB;IAetC,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,WAAW;IA6BnB;;OAEG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,GAAE,OAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAa/E;;OAEG;IACG,UAAU,CAAC,cAAc,GAAE,OAAc,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAoBvF;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAiB,EAAE,cAAc,GAAE,OAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAuB3H;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAiB,EAAE,cAAc,GAAE,OAAc,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAmB1H;;OAEG;IACG,QAAQ,CAAC,cAAc,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAgBjF"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* - GET /pg/types - Get data types
|
|
10
10
|
*/
|
|
11
11
|
import axios from 'axios';
|
|
12
|
+
import { formatApiError } from '../errors.js';
|
|
12
13
|
/**
|
|
13
14
|
* PG-Meta returns BARE JSON arrays (pg-meta style), not a {data,error} envelope.
|
|
14
15
|
* Normalize either shape into a QueryResult.
|
|
@@ -47,10 +48,12 @@ export class MetaDriver {
|
|
|
47
48
|
anonKey;
|
|
48
49
|
serviceRoleKey;
|
|
49
50
|
tenantId;
|
|
51
|
+
debug;
|
|
50
52
|
constructor(options) {
|
|
51
53
|
this.anonKey = options.anonKey;
|
|
52
54
|
this.serviceRoleKey = options.serviceRoleKey;
|
|
53
55
|
this.tenantId = options.tenantId;
|
|
56
|
+
this.debug = options.debug ?? false;
|
|
54
57
|
this.client = axios.create({
|
|
55
58
|
baseURL: `${options.endpoint}/pg`,
|
|
56
59
|
timeout: options.timeout ?? 30000,
|
|
@@ -77,22 +80,26 @@ export class MetaDriver {
|
|
|
77
80
|
handleError(error) {
|
|
78
81
|
if (axios.isAxiosError(error)) {
|
|
79
82
|
const axiosError = error;
|
|
80
|
-
const
|
|
83
|
+
const config = axiosError.config;
|
|
81
84
|
const data = axiosError.response?.data;
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
85
|
+
formatApiError('Meta', {
|
|
86
|
+
status: axiosError.response?.status,
|
|
87
|
+
data,
|
|
88
|
+
fallbackMessage: axiosError.message,
|
|
89
|
+
debug: this.debug
|
|
90
|
+
? {
|
|
91
|
+
method: config?.method,
|
|
92
|
+
url: `${config?.baseURL ?? ''}${config?.url ?? ''}`,
|
|
93
|
+
responseBody: data === undefined ? undefined : JSON.stringify(data),
|
|
94
|
+
}
|
|
95
|
+
: undefined,
|
|
96
|
+
}, {
|
|
97
|
+
statusTexts: {
|
|
98
|
+
401: 'Authentication failed. Please check your API keys and run "pxbaas login" again.',
|
|
99
|
+
403: 'Permission denied. You may need service_role key for this operation.',
|
|
100
|
+
404: 'Resource not found. Please check the table name and try again.',
|
|
101
|
+
},
|
|
102
|
+
});
|
|
96
103
|
}
|
|
97
104
|
throw error;
|
|
98
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.driver.js","sourceRoot":"","sources":["../../src/drivers/meta.driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAoC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"meta.driver.js","sourceRoot":"","sources":["../../src/drivers/meta.driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share-links.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/share-links.driver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"share-links.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/share-links.driver.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;AAE9D,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,eAAe,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,iFAAiF;AACjF,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,OAAO,EAAE,uBAAuB;IAQtC,MAAM,CACV,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,GACA,OAAO,CAAC,gBAAgB,CAAC;IActB,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IASnE,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAUjF,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;YAU5E,OAAO;CAgBtB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
|
+
import { formatApiError } from '../errors.js';
|
|
2
3
|
export class ShareLinksDriver {
|
|
3
4
|
client;
|
|
4
5
|
constructor(options) {
|
|
@@ -40,11 +41,12 @@ export class ShareLinksDriver {
|
|
|
40
41
|
catch (error) {
|
|
41
42
|
if (axios.isAxiosError(error)) {
|
|
42
43
|
const axiosError = error;
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
axiosError.response?.
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
const data = axiosError.response?.data;
|
|
45
|
+
formatApiError('Share', {
|
|
46
|
+
status: axiosError.response?.status,
|
|
47
|
+
data,
|
|
48
|
+
fallbackMessage: axiosError.message,
|
|
49
|
+
});
|
|
48
50
|
}
|
|
49
51
|
throw error;
|
|
50
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share-links.driver.js","sourceRoot":"","sources":["../../src/drivers/share-links.driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAA8C,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"share-links.driver.js","sourceRoot":"","sources":["../../src/drivers/share-links.driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAA8C,MAAM,OAAO,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAiC7C,MAAM,OAAO,gBAAgB;IACV,MAAM,CAAe;IAEtC,YAAY,OAAgC;QAC1C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,OAAO,CAAC,UAAU,IAAI,SAAS,EAAE;YAChG,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,MAAM;YAClC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,cAAc,EAAE,EAAE;SAC/D,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CACV,YAAoB,EACpB,OAKC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAmB,GAAG,EAAE,CACzD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,kBAAkB,CAAC,YAAY,CAAC,SAAS,EAAE;YACxE,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,OAAO,CAAC,gBAAgB,KAAK,SAAS;gBACxC,CAAC,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,gBAAgB,EAAE;gBAClD,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7D,CAAC,CACH,CAAA;QACD,OAAO,QAAQ,CAAC,IAAI,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,YAAoB,EAAE,QAAiB;QAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAA0B,GAAG,EAAE,CAChE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,kBAAkB,CAAC,YAAY,CAAC,SAAS,EAAE;YACvE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;SACvD,CAAC,CACH,CAAA;QACD,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,YAAoB,EAAE,OAAe,EAAE,QAAiB;QAChE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAY,GAAG,EAAE,CAClD,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,cAAc,kBAAkB,CAAC,YAAY,CAAC,WAAW,kBAAkB,CAAC,OAAO,CAAC,EAAE,EACtF,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAC3D,CACF,CAAA;QACD,OAAO,QAAQ,CAAC,IAAI,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,YAAoB,EAAE,OAAe,EAAE,QAAiB;QACnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAY,GAAG,EAAE,CAClD,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,cAAc,kBAAkB,CAAC,YAAY,CAAC,WAAW,kBAAkB,CAAC,OAAO,CAAC,SAAS,EAC7F,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CACxC,CACF,CAAA;QACD,OAAO,QAAQ,CAAC,IAAI,CAAA;IACtB,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,SAAqC;QAC5D,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,EAAE,CAAA;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,MAAM,UAAU,GAAG,KAAmB,CAAA;gBACtC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAA;gBACtC,cAAc,CAAC,OAAO,EAAE;oBACtB,MAAM,EAAE,UAAU,CAAC,QAAQ,EAAE,MAAM;oBACnC,IAAI;oBACJ,eAAe,EAAE,UAAU,CAAC,OAAO;iBACpC,CAAC,CAAA;YACJ,CAAC;YACD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;CACF"}
|
|
@@ -27,16 +27,24 @@ export interface StorageObject {
|
|
|
27
27
|
last_accessed_at: string;
|
|
28
28
|
metadata: Record<string, unknown>;
|
|
29
29
|
}
|
|
30
|
+
/** Server response of POST /object/{bucket}/{path} (multi-tenant keys carry a `<tenantId>/` prefix). */
|
|
31
|
+
export interface UploadResult {
|
|
32
|
+
Key?: string;
|
|
33
|
+
Id?: string;
|
|
34
|
+
}
|
|
30
35
|
export interface StorageDriverOptions {
|
|
31
36
|
endpoint: string;
|
|
32
37
|
serviceRoleKey: string;
|
|
33
38
|
tenantId?: string;
|
|
34
39
|
timeout?: number;
|
|
40
|
+
/** Append method/url/status/response-body to thrown errors (CLI `--debug`). */
|
|
41
|
+
debug?: boolean;
|
|
35
42
|
}
|
|
36
43
|
export declare class StorageDriver {
|
|
37
44
|
private client;
|
|
38
45
|
private serviceRoleKey;
|
|
39
46
|
private tenantId?;
|
|
47
|
+
private debug;
|
|
40
48
|
constructor(options: StorageDriverOptions);
|
|
41
49
|
private getHeaders;
|
|
42
50
|
private handleError;
|
|
@@ -45,17 +53,24 @@ export declare class StorageDriver {
|
|
|
45
53
|
*/
|
|
46
54
|
listBuckets(): Promise<Bucket[]>;
|
|
47
55
|
/**
|
|
48
|
-
* List objects in a bucket
|
|
56
|
+
* List objects in a bucket.
|
|
57
|
+
*
|
|
58
|
+
* The server schema requires `prefix`, so it always defaults to '' and the
|
|
59
|
+
* key is always present in the request body — an omitted/undefined prefix
|
|
60
|
+
* used to make every root listing fail with 400.
|
|
49
61
|
*/
|
|
50
|
-
listObjects(bucket: string, prefix?: string): Promise<StorageObject[]>;
|
|
62
|
+
listObjects(bucket: string, prefix?: string, limit?: number): Promise<StorageObject[]>;
|
|
51
63
|
/**
|
|
52
|
-
* Upload a file to storage
|
|
64
|
+
* Upload a file to storage. Returns the server-assigned object key.
|
|
65
|
+
*
|
|
66
|
+
* Multi-tenant note: the server prefixes the stored key with `<tenantId>/`
|
|
67
|
+
* on its own — never prepend the tenant id client-side.
|
|
53
68
|
*/
|
|
54
|
-
upload(bucket: string, remotePath: string, localPath: string): Promise<
|
|
69
|
+
upload(bucket: string, remotePath: string, localPath: string, contentType?: string): Promise<UploadResult>;
|
|
55
70
|
/**
|
|
56
|
-
* Download a file from storage
|
|
71
|
+
* Download a file from storage. Returns the number of bytes written.
|
|
57
72
|
*/
|
|
58
|
-
download(bucket: string, remotePath: string, localPath: string): Promise<
|
|
73
|
+
download(bucket: string, remotePath: string, localPath: string): Promise<number>;
|
|
59
74
|
/**
|
|
60
75
|
* Delete an object from storage
|
|
61
76
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/storage.driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"storage.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/storage.driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,wGAAwG;AACxG,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAU;gBAEX,OAAO,EAAE,oBAAoB;IAezC,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,WAAW;IA8BnB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAatC;;;;;;OAMG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,EAAE,KAAK,GAAE,MAAa,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IActG;;;;;OAKG;IACG,MAAM,CACV,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC;IAsBxB;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBtF;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/D;;OAEG;IACG,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBzG;;OAEG;IACG,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAgB1G"}
|
|
@@ -11,16 +11,17 @@
|
|
|
11
11
|
* - POST /storage/v1/object/copy - Copy object
|
|
12
12
|
*/
|
|
13
13
|
import axios from 'axios';
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { createReadStream } from 'node:fs';
|
|
14
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
15
|
+
import { formatApiError } from '../errors.js';
|
|
17
16
|
export class StorageDriver {
|
|
18
17
|
client;
|
|
19
18
|
serviceRoleKey;
|
|
20
19
|
tenantId;
|
|
20
|
+
debug;
|
|
21
21
|
constructor(options) {
|
|
22
22
|
this.serviceRoleKey = options.serviceRoleKey;
|
|
23
23
|
this.tenantId = options.tenantId;
|
|
24
|
+
this.debug = options.debug ?? false;
|
|
24
25
|
this.client = axios.create({
|
|
25
26
|
baseURL: `${options.endpoint}/storage/v1`,
|
|
26
27
|
timeout: options.timeout ?? 60000,
|
|
@@ -45,23 +46,25 @@ export class StorageDriver {
|
|
|
45
46
|
const axiosError = error;
|
|
46
47
|
const status = axiosError.response?.status;
|
|
47
48
|
const data = axiosError.response?.data;
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
49
|
+
const config = axiosError.config;
|
|
50
|
+
formatApiError('Storage', {
|
|
51
|
+
status,
|
|
52
|
+
data,
|
|
53
|
+
fallbackMessage: axiosError.message,
|
|
54
|
+
debug: this.debug
|
|
55
|
+
? {
|
|
56
|
+
method: config?.method,
|
|
57
|
+
url: `${config?.baseURL ?? ''}${config?.url ?? ''}`,
|
|
58
|
+
responseBody: data === undefined ? undefined : JSON.stringify(data),
|
|
59
|
+
}
|
|
60
|
+
: undefined,
|
|
61
|
+
}, {
|
|
62
|
+
statusTexts: {
|
|
63
|
+
401: 'Authentication failed. Please check your service_role key and run "pxbaas login" again.',
|
|
64
|
+
403: 'Permission denied. Storage operations require service_role key.',
|
|
65
|
+
404: 'Object or bucket not found. Please check the path and try again.',
|
|
66
|
+
},
|
|
67
|
+
});
|
|
65
68
|
}
|
|
66
69
|
throw error;
|
|
67
70
|
}
|
|
@@ -78,11 +81,15 @@ export class StorageDriver {
|
|
|
78
81
|
}
|
|
79
82
|
}
|
|
80
83
|
/**
|
|
81
|
-
* List objects in a bucket
|
|
84
|
+
* List objects in a bucket.
|
|
85
|
+
*
|
|
86
|
+
* The server schema requires `prefix`, so it always defaults to '' and the
|
|
87
|
+
* key is always present in the request body — an omitted/undefined prefix
|
|
88
|
+
* used to make every root listing fail with 400.
|
|
82
89
|
*/
|
|
83
|
-
async listObjects(bucket, prefix) {
|
|
90
|
+
async listObjects(bucket, prefix = '', limit = 1000) {
|
|
84
91
|
try {
|
|
85
|
-
const response = await this.client.post(`/object/list/${bucket}`, { prefix, limit
|
|
92
|
+
const response = await this.client.post(`/object/list/${bucket}`, { prefix: prefix ?? '', limit }, { headers: this.getHeaders() });
|
|
86
93
|
return response.data ?? [];
|
|
87
94
|
}
|
|
88
95
|
catch (error) {
|
|
@@ -90,27 +97,29 @@ export class StorageDriver {
|
|
|
90
97
|
}
|
|
91
98
|
}
|
|
92
99
|
/**
|
|
93
|
-
* Upload a file to storage
|
|
100
|
+
* Upload a file to storage. Returns the server-assigned object key.
|
|
101
|
+
*
|
|
102
|
+
* Multi-tenant note: the server prefixes the stored key with `<tenantId>/`
|
|
103
|
+
* on its own — never prepend the tenant id client-side.
|
|
94
104
|
*/
|
|
95
|
-
async upload(bucket, remotePath, localPath) {
|
|
105
|
+
async upload(bucket, remotePath, localPath, contentType) {
|
|
96
106
|
try {
|
|
97
|
-
const
|
|
98
|
-
const
|
|
99
|
-
const filename = basename(localPath);
|
|
100
|
-
await this.client.post(`/object/${bucket}/${remotePath}`, fileStream, {
|
|
107
|
+
const body = await readFile(localPath);
|
|
108
|
+
const response = await this.client.post(`/object/${bucket}/${remotePath}`, body, {
|
|
101
109
|
headers: {
|
|
102
110
|
...this.getHeaders(),
|
|
103
|
-
'Content-Type': 'application/octet-stream',
|
|
104
|
-
'Content-Length':
|
|
111
|
+
'Content-Type': contentType ?? 'application/octet-stream',
|
|
112
|
+
'Content-Length': String(body.byteLength),
|
|
105
113
|
},
|
|
106
114
|
});
|
|
115
|
+
return response.data ?? {};
|
|
107
116
|
}
|
|
108
117
|
catch (error) {
|
|
109
118
|
this.handleError(error);
|
|
110
119
|
}
|
|
111
120
|
}
|
|
112
121
|
/**
|
|
113
|
-
* Download a file from storage
|
|
122
|
+
* Download a file from storage. Returns the number of bytes written.
|
|
114
123
|
*/
|
|
115
124
|
async download(bucket, remotePath, localPath) {
|
|
116
125
|
try {
|
|
@@ -118,7 +127,9 @@ export class StorageDriver {
|
|
|
118
127
|
headers: this.getHeaders(),
|
|
119
128
|
responseType: 'arraybuffer',
|
|
120
129
|
});
|
|
121
|
-
|
|
130
|
+
const data = Buffer.from(response.data);
|
|
131
|
+
await writeFile(localPath, data);
|
|
132
|
+
return data.byteLength;
|
|
122
133
|
}
|
|
123
134
|
catch (error) {
|
|
124
135
|
this.handleError(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.driver.js","sourceRoot":"","sources":["../../src/drivers/storage.driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAoC,MAAM,OAAO,CAAC;AACzD,OAAO,
|
|
1
|
+
{"version":3,"file":"storage.driver.js","sourceRoot":"","sources":["../../src/drivers/storage.driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant Admin Driver — 多租户实例的「平台管理员」侧客户端。
|
|
3
|
+
*
|
|
4
|
+
* 对接 Studio BFF 的平台管理端点(经 Kong `dashboard` catch-all + basic-auth 保护,
|
|
5
|
+
* 见 kong/mysql/kong.yml 的 dashboard 服务与 DASHBOARD consumer):
|
|
6
|
+
* - GET /api/platform/tenants 列租户(`{ tenants, multiTenantMode }`)
|
|
7
|
+
* - GET /api/platform/tenants/{id} 单租户(响应即租户行,顶层展开)
|
|
8
|
+
* - POST /api/platform/tenants 建/复活租户(201,响应为租户行 + `realtime_provisioned`)
|
|
9
|
+
* - PATCH /api/platform/tenants/{id} 改属性/改键(白名单字段,不含 jwt_secret)
|
|
10
|
+
* - PATCH /api/platform/tenants 补空密钥(仅 anon_key/service_role_key 为 NULL 的行)
|
|
11
|
+
* - DELETE /api/platform/tenants/{id} 删除(软删)
|
|
12
|
+
*
|
|
13
|
+
* 认证模型:HTTP Basic(DASHBOARD_USERNAME / DASHBOARD_PASSWORD)。数据面的 anon /
|
|
14
|
+
* service_role key 在这里一律不适用——全局密钥访问租户管理面会被网关挡掉。
|
|
15
|
+
*
|
|
16
|
+
* ── 脱敏纪律(务必遵守)──────────────────────────────────────────────
|
|
17
|
+
* 这些端点的响应体**同时包含 `jwt_secret`(租户签名母密钥)与两把明文密钥**。母密钥
|
|
18
|
+
* 一旦外泄,持有者可自签任意 role / tenant_id / 期限的 token,危害高于 service_role。
|
|
19
|
+
* 因此本 driver 在**解析层**就把 `jwt_secret` 从所有返回类型里剥离,密钥值只在调用方
|
|
20
|
+
* 显式要求({@link TenantAdminDriver.getKeys} / {@link TenantAdminDriver.create})时以
|
|
21
|
+
* `TenantKeyBundle` 单独返回,其余任何路径都拿不到密钥明文。脱敏不依赖调用方自觉。
|
|
22
|
+
*/
|
|
23
|
+
export interface TenantAdminDriverOptions {
|
|
24
|
+
/** Kong 网关地址(必须是网关,不能是 Studio 端口,否则绕过 basic-auth)。 */
|
|
25
|
+
endpoint: string;
|
|
26
|
+
username: string;
|
|
27
|
+
password: string;
|
|
28
|
+
timeout?: number;
|
|
29
|
+
}
|
|
30
|
+
/** 平台侧租户行中可安全外传的部分(无任何密钥材料)。 */
|
|
31
|
+
export interface RedactedTenant {
|
|
32
|
+
tenantId: string;
|
|
33
|
+
tenantCode?: string;
|
|
34
|
+
displayName?: string;
|
|
35
|
+
status: string;
|
|
36
|
+
plan?: string;
|
|
37
|
+
dbName?: string;
|
|
38
|
+
dbUser?: string;
|
|
39
|
+
ossPrefix?: string;
|
|
40
|
+
retentionDays?: number | string | null;
|
|
41
|
+
createdAt?: string;
|
|
42
|
+
updatedAt?: string;
|
|
43
|
+
deletedAt?: string | null;
|
|
44
|
+
/** `anon_key` 是否已签发(NULL 表示存量租户缺密钥,需要 repair-keys)。 */
|
|
45
|
+
hasAnonKey: boolean;
|
|
46
|
+
hasServiceRoleKey: boolean;
|
|
47
|
+
/** 是否处于软删除态:同名 create 会走「复活并重置密钥」分支,属破坏性动作。 */
|
|
48
|
+
softDeleted: boolean;
|
|
49
|
+
}
|
|
50
|
+
/** 仅由显式取键路径返回;调用方只能把它写进钥匙串或 0600 交付包,绝不打印。 */
|
|
51
|
+
export interface TenantKeyBundle {
|
|
52
|
+
anonKey: string | null;
|
|
53
|
+
serviceRoleKey: string | null;
|
|
54
|
+
}
|
|
55
|
+
export interface TenantListResult {
|
|
56
|
+
multiTenantMode: boolean;
|
|
57
|
+
tenants: RedactedTenant[];
|
|
58
|
+
}
|
|
59
|
+
export interface TenantCreateInput {
|
|
60
|
+
tenantId: string;
|
|
61
|
+
plan?: string;
|
|
62
|
+
ossPrefix?: string;
|
|
63
|
+
retentionDays?: number;
|
|
64
|
+
tenantCode?: string;
|
|
65
|
+
displayName?: string;
|
|
66
|
+
dbName?: string;
|
|
67
|
+
dbUser?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface TenantCreateResult {
|
|
70
|
+
tenant: RedactedTenant;
|
|
71
|
+
keys: TenantKeyBundle;
|
|
72
|
+
/** 平台是否在创建时成功把租户注册进 Realtime(false 时该租户的 WS 握手会 403)。 */
|
|
73
|
+
realtimeProvisioned?: boolean;
|
|
74
|
+
}
|
|
75
|
+
/** 补空密钥的结果(`PATCH /api/platform/tenants`)。 */
|
|
76
|
+
export interface TenantRepairKeysResult {
|
|
77
|
+
message: string;
|
|
78
|
+
updated: number;
|
|
79
|
+
}
|
|
80
|
+
/** 平台管理面调用的统一错误(携带机器码 + HTTP 状态)。 */
|
|
81
|
+
export declare class TenantAdminError extends Error {
|
|
82
|
+
readonly code: string;
|
|
83
|
+
readonly status?: number;
|
|
84
|
+
constructor(code: string, message: string, status?: number);
|
|
85
|
+
}
|
|
86
|
+
export declare class TenantAdminDriver {
|
|
87
|
+
private readonly client;
|
|
88
|
+
constructor(options: TenantAdminDriverOptions);
|
|
89
|
+
/**
|
|
90
|
+
* 列租户。注意 Studio 侧在多租户关闭时返回 `{ tenants: [], multiTenantMode: false }`,
|
|
91
|
+
* 而元数据查询失败时同样返回 200 + 空列表(`multiTenantMode: true`)——两者需在
|
|
92
|
+
* 上层区分,见 `tenant/probe.ts`。
|
|
93
|
+
*/
|
|
94
|
+
list(statusFilter?: string): Promise<TenantListResult>;
|
|
95
|
+
/** 单租户详情(脱敏行)。404 归一化为 TENANT_NOT_FOUND。 */
|
|
96
|
+
get(tenantId: string): Promise<RedactedTenant>;
|
|
97
|
+
/**
|
|
98
|
+
* 显式取该租户的密钥。唯一会返回密钥明文的读路径:调用方必须只把它送进
|
|
99
|
+
* 钥匙串或 `0600` 交付包,不得写入 stdout / `--json` / 日志。
|
|
100
|
+
*/
|
|
101
|
+
getKeys(tenantId: string): Promise<TenantKeyBundle>;
|
|
102
|
+
/**
|
|
103
|
+
* 建租户。**撞名是破坏性的**:同名租户若处于软删除态,平台会复活它并**重新生成
|
|
104
|
+
* `jwt_secret`、覆写两把密钥**。调用方必须先 `get()` 判重并显式确认。
|
|
105
|
+
*/
|
|
106
|
+
create(input: TenantCreateInput): Promise<TenantCreateResult>;
|
|
107
|
+
/** 改租户属性(服务端白名单:display_name/status/plan/db_name/db_user/oss_prefix/anon_key/service_role_key)。 */
|
|
108
|
+
update(tenantId: string, patch: {
|
|
109
|
+
displayName?: string;
|
|
110
|
+
status?: string;
|
|
111
|
+
plan?: string;
|
|
112
|
+
}): Promise<RedactedTenant>;
|
|
113
|
+
/**
|
|
114
|
+
* 补空密钥:只对 `jwt_secret` 有值但 `anon_key`/`service_role_key` 为 NULL 的存量行,
|
|
115
|
+
* 用**原 secret** 重签两把键。幂等、非破坏性。
|
|
116
|
+
*
|
|
117
|
+
* 这不是轮换:已签发的密钥不会被作废(HS256 无 jti / 无撤销表)。
|
|
118
|
+
*/
|
|
119
|
+
repairKeys(): Promise<TenantRepairKeysResult>;
|
|
120
|
+
/** 删除租户(平台侧软删 + 资源回收,具体语义由平台 purge 流程负责)。 */
|
|
121
|
+
remove(tenantId: string): Promise<void>;
|
|
122
|
+
private request;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Studio 的错误体是 `{ error: { message } }`(apiWrapper 兜底时为 `{ error: "<msg>" }`),
|
|
126
|
+
* 401 也可能是 Kong basic-auth 直接返回的 `{ message }`。逐级兜底并保留状态码语义,
|
|
127
|
+
* 否则调用方无法区分"口令错"与"租户不存在"。
|
|
128
|
+
*/
|
|
129
|
+
export declare function normalizeTenantAdminError(error: unknown): TenantAdminError;
|
|
130
|
+
//# sourceMappingURL=tenant-admin.driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-admin.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/tenant-admin.driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant Admin Driver — 多租户实例的「平台管理员」侧客户端。
|
|
3
|
+
*
|
|
4
|
+
* 对接 Studio BFF 的平台管理端点(经 Kong `dashboard` catch-all + basic-auth 保护,
|
|
5
|
+
* 见 kong/mysql/kong.yml 的 dashboard 服务与 DASHBOARD consumer):
|
|
6
|
+
* - GET /api/platform/tenants 列租户(`{ tenants, multiTenantMode }`)
|
|
7
|
+
* - GET /api/platform/tenants/{id} 单租户(响应即租户行,顶层展开)
|
|
8
|
+
* - POST /api/platform/tenants 建/复活租户(201,响应为租户行 + `realtime_provisioned`)
|
|
9
|
+
* - PATCH /api/platform/tenants/{id} 改属性/改键(白名单字段,不含 jwt_secret)
|
|
10
|
+
* - PATCH /api/platform/tenants 补空密钥(仅 anon_key/service_role_key 为 NULL 的行)
|
|
11
|
+
* - DELETE /api/platform/tenants/{id} 删除(软删)
|
|
12
|
+
*
|
|
13
|
+
* 认证模型:HTTP Basic(DASHBOARD_USERNAME / DASHBOARD_PASSWORD)。数据面的 anon /
|
|
14
|
+
* service_role key 在这里一律不适用——全局密钥访问租户管理面会被网关挡掉。
|
|
15
|
+
*
|
|
16
|
+
* ── 脱敏纪律(务必遵守)──────────────────────────────────────────────
|
|
17
|
+
* 这些端点的响应体**同时包含 `jwt_secret`(租户签名母密钥)与两把明文密钥**。母密钥
|
|
18
|
+
* 一旦外泄,持有者可自签任意 role / tenant_id / 期限的 token,危害高于 service_role。
|
|
19
|
+
* 因此本 driver 在**解析层**就把 `jwt_secret` 从所有返回类型里剥离,密钥值只在调用方
|
|
20
|
+
* 显式要求({@link TenantAdminDriver.getKeys} / {@link TenantAdminDriver.create})时以
|
|
21
|
+
* `TenantKeyBundle` 单独返回,其余任何路径都拿不到密钥明文。脱敏不依赖调用方自觉。
|
|
22
|
+
*/
|
|
23
|
+
import axios from "axios";
|
|
24
|
+
/** 平台管理面调用的统一错误(携带机器码 + HTTP 状态)。 */
|
|
25
|
+
export class TenantAdminError extends Error {
|
|
26
|
+
code;
|
|
27
|
+
status;
|
|
28
|
+
constructor(code, message, status) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = "TenantAdminError";
|
|
31
|
+
this.code = code;
|
|
32
|
+
this.status = status;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class TenantAdminDriver {
|
|
36
|
+
client;
|
|
37
|
+
constructor(options) {
|
|
38
|
+
const endpoint = options.endpoint.replace(/\/$/, "");
|
|
39
|
+
this.client = axios.create({
|
|
40
|
+
baseURL: `${endpoint}/api/platform/tenants`,
|
|
41
|
+
timeout: options.timeout ?? 30_000,
|
|
42
|
+
auth: { username: options.username, password: options.password },
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 列租户。注意 Studio 侧在多租户关闭时返回 `{ tenants: [], multiTenantMode: false }`,
|
|
47
|
+
* 而元数据查询失败时同样返回 200 + 空列表(`multiTenantMode: true`)——两者需在
|
|
48
|
+
* 上层区分,见 `tenant/probe.ts`。
|
|
49
|
+
*/
|
|
50
|
+
async list(statusFilter) {
|
|
51
|
+
const response = await this.request(() => this.client.get("", {
|
|
52
|
+
params: statusFilter ? { status: statusFilter } : undefined,
|
|
53
|
+
}));
|
|
54
|
+
return {
|
|
55
|
+
multiTenantMode: response?.multiTenantMode !== false,
|
|
56
|
+
tenants: (response?.tenants ?? []).map(redact),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** 单租户详情(脱敏行)。404 归一化为 TENANT_NOT_FOUND。 */
|
|
60
|
+
async get(tenantId) {
|
|
61
|
+
const row = await this.request(() => this.client.get(`/${encodeURIComponent(tenantId)}`));
|
|
62
|
+
return redact(row);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 显式取该租户的密钥。唯一会返回密钥明文的读路径:调用方必须只把它送进
|
|
66
|
+
* 钥匙串或 `0600` 交付包,不得写入 stdout / `--json` / 日志。
|
|
67
|
+
*/
|
|
68
|
+
async getKeys(tenantId) {
|
|
69
|
+
const row = await this.request(() => this.client.get(`/${encodeURIComponent(tenantId)}`));
|
|
70
|
+
return keysOf(row);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 建租户。**撞名是破坏性的**:同名租户若处于软删除态,平台会复活它并**重新生成
|
|
74
|
+
* `jwt_secret`、覆写两把密钥**。调用方必须先 `get()` 判重并显式确认。
|
|
75
|
+
*/
|
|
76
|
+
async create(input) {
|
|
77
|
+
const body = { tenant_id: input.tenantId };
|
|
78
|
+
if (input.plan !== undefined)
|
|
79
|
+
body.plan = input.plan;
|
|
80
|
+
if (input.ossPrefix !== undefined)
|
|
81
|
+
body.oss_prefix = input.ossPrefix;
|
|
82
|
+
if (input.retentionDays !== undefined)
|
|
83
|
+
body.retention_days = input.retentionDays;
|
|
84
|
+
if (input.tenantCode !== undefined)
|
|
85
|
+
body.tenant_code = input.tenantCode;
|
|
86
|
+
if (input.displayName !== undefined)
|
|
87
|
+
body.display_name = input.displayName;
|
|
88
|
+
if (input.dbName !== undefined)
|
|
89
|
+
body.db_name = input.dbName;
|
|
90
|
+
if (input.dbUser !== undefined)
|
|
91
|
+
body.db_user = input.dbUser;
|
|
92
|
+
const row = await this.request(() => this.client.post("", body));
|
|
93
|
+
return {
|
|
94
|
+
tenant: redact(row),
|
|
95
|
+
keys: keysOf(row),
|
|
96
|
+
realtimeProvisioned: typeof row?.realtime_provisioned === "boolean" ? row.realtime_provisioned : undefined,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** 改租户属性(服务端白名单:display_name/status/plan/db_name/db_user/oss_prefix/anon_key/service_role_key)。 */
|
|
100
|
+
async update(tenantId, patch) {
|
|
101
|
+
const body = {};
|
|
102
|
+
if (patch.displayName !== undefined)
|
|
103
|
+
body.display_name = patch.displayName;
|
|
104
|
+
if (patch.status !== undefined)
|
|
105
|
+
body.status = patch.status;
|
|
106
|
+
if (patch.plan !== undefined)
|
|
107
|
+
body.plan = patch.plan;
|
|
108
|
+
const row = await this.request(() => this.client.patch(`/${encodeURIComponent(tenantId)}`, body));
|
|
109
|
+
return redact(row);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 补空密钥:只对 `jwt_secret` 有值但 `anon_key`/`service_role_key` 为 NULL 的存量行,
|
|
113
|
+
* 用**原 secret** 重签两把键。幂等、非破坏性。
|
|
114
|
+
*
|
|
115
|
+
* 这不是轮换:已签发的密钥不会被作废(HS256 无 jti / 无撤销表)。
|
|
116
|
+
*/
|
|
117
|
+
async repairKeys() {
|
|
118
|
+
const body = await this.request(() => this.client.patch("", {}));
|
|
119
|
+
return {
|
|
120
|
+
message: typeof body?.message === "string" ? body.message : "backfill attempted",
|
|
121
|
+
updated: typeof body?.updated === "number" ? body.updated : 0,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/** 删除租户(平台侧软删 + 资源回收,具体语义由平台 purge 流程负责)。 */
|
|
125
|
+
async remove(tenantId) {
|
|
126
|
+
await this.request(() => this.client.delete(`/${encodeURIComponent(tenantId)}`));
|
|
127
|
+
}
|
|
128
|
+
async request(operation) {
|
|
129
|
+
try {
|
|
130
|
+
const response = await operation();
|
|
131
|
+
return (response.data ?? {});
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
throw normalizeTenantAdminError(error);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 租户行 → 可安全外传的结构。**显式构造**而非展开,新增列默认不会外泄;
|
|
140
|
+
* `jwt_secret` 因此无论平台侧返回什么都不会离开解析层。
|
|
141
|
+
*/
|
|
142
|
+
function redact(row) {
|
|
143
|
+
const r = row ?? {};
|
|
144
|
+
const status = str(r.status) ?? "";
|
|
145
|
+
return {
|
|
146
|
+
tenantId: str(r.tenant_id) ?? "",
|
|
147
|
+
tenantCode: optStr(r.tenant_code),
|
|
148
|
+
displayName: optStr(r.display_name),
|
|
149
|
+
status,
|
|
150
|
+
plan: optStr(r.plan),
|
|
151
|
+
dbName: optStr(r.db_name),
|
|
152
|
+
dbUser: optStr(r.db_user),
|
|
153
|
+
ossPrefix: optStr(r.oss_prefix),
|
|
154
|
+
retentionDays: typeof r.retention_days === "number" || r.retention_days == null
|
|
155
|
+
? r.retention_days
|
|
156
|
+
: String(r.retention_days),
|
|
157
|
+
createdAt: optStr(r.created_at),
|
|
158
|
+
updatedAt: optStr(r.updated_at),
|
|
159
|
+
deletedAt: r.deleted_at == null ? null : String(r.deleted_at),
|
|
160
|
+
hasAnonKey: isNonEmptyString(r.anon_key),
|
|
161
|
+
hasServiceRoleKey: isNonEmptyString(r.service_role_key),
|
|
162
|
+
softDeleted: status === "deleted",
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function keysOf(row) {
|
|
166
|
+
return {
|
|
167
|
+
anonKey: isNonEmptyString(row?.anon_key) ? String(row?.anon_key) : null,
|
|
168
|
+
serviceRoleKey: isNonEmptyString(row?.service_role_key)
|
|
169
|
+
? String(row?.service_role_key)
|
|
170
|
+
: null,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Studio 的错误体是 `{ error: { message } }`(apiWrapper 兜底时为 `{ error: "<msg>" }`),
|
|
175
|
+
* 401 也可能是 Kong basic-auth 直接返回的 `{ message }`。逐级兜底并保留状态码语义,
|
|
176
|
+
* 否则调用方无法区分"口令错"与"租户不存在"。
|
|
177
|
+
*/
|
|
178
|
+
export function normalizeTenantAdminError(error) {
|
|
179
|
+
if (!axios.isAxiosError(error)) {
|
|
180
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
181
|
+
return new TenantAdminError("TENANT_ADMIN_UNKNOWN_ERROR", message);
|
|
182
|
+
}
|
|
183
|
+
const axiosError = error;
|
|
184
|
+
const status = axiosError.response?.status;
|
|
185
|
+
const body = axiosError.response?.data;
|
|
186
|
+
const nested = body?.error && typeof body.error === "object"
|
|
187
|
+
? body.error.message
|
|
188
|
+
: typeof body?.error === "string"
|
|
189
|
+
? body.error
|
|
190
|
+
: undefined;
|
|
191
|
+
const message = typeof nested === "string" && nested
|
|
192
|
+
? nested
|
|
193
|
+
: typeof body?.message === "string" && body.message
|
|
194
|
+
? body.message
|
|
195
|
+
: status
|
|
196
|
+
? `Tenant admin request failed (HTTP ${status})`
|
|
197
|
+
: axiosError.message || "Tenant admin network request failed";
|
|
198
|
+
const code = status === 401
|
|
199
|
+
? "TENANT_ADMIN_UNAUTHORIZED"
|
|
200
|
+
: status === 403
|
|
201
|
+
? "TENANT_ADMIN_FORBIDDEN"
|
|
202
|
+
: status === 404
|
|
203
|
+
? "TENANT_NOT_FOUND"
|
|
204
|
+
: status === 409
|
|
205
|
+
? "TENANT_ALREADY_EXISTS"
|
|
206
|
+
: status === 400
|
|
207
|
+
? "TENANT_ADMIN_BAD_REQUEST"
|
|
208
|
+
: status
|
|
209
|
+
? `TENANT_ADMIN_HTTP_${status}`
|
|
210
|
+
: "TENANT_ADMIN_NETWORK_ERROR";
|
|
211
|
+
return new TenantAdminError(code, message, status);
|
|
212
|
+
}
|
|
213
|
+
function str(value) {
|
|
214
|
+
return typeof value === "string" && value !== "" ? value : undefined;
|
|
215
|
+
}
|
|
216
|
+
function optStr(value) {
|
|
217
|
+
return value == null ? undefined : String(value);
|
|
218
|
+
}
|
|
219
|
+
function isNonEmptyString(value) {
|
|
220
|
+
return typeof value === "string" && value.length > 0;
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=tenant-admin.driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-admin.driver.js","sourceRoot":"","sources":["../../src/drivers/tenant-admin.driver.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared API error formatting for all drivers.
|
|
3
|
+
*
|
|
4
|
+
* WHY: Storage/Meta error bodies are `{ statusCode, error, message }` where
|
|
5
|
+
* `error` is a coarse category (literally "Error" for Storage 400s) and
|
|
6
|
+
* `message` carries the actionable detail. Each driver used to prefer `error`
|
|
7
|
+
* and hard-coded 401/403/404 texts that swallowed the server `message`
|
|
8
|
+
* entirely, so users saw e.g. `Storage API error (400): Error` instead of
|
|
9
|
+
* `body must have required property 'prefix'`.
|
|
10
|
+
*
|
|
11
|
+
* Contract: always throws a plain `Error` whose message starts with
|
|
12
|
+
* `<source> API error (<status>): ` — upper layers match on that text, so do
|
|
13
|
+
* not introduce custom error classes or codes here.
|
|
14
|
+
*/
|
|
15
|
+
/** Minimal view of an AxiosResponse so drivers can pass plain object literals. */
|
|
16
|
+
export interface ApiErrorInfo {
|
|
17
|
+
status?: number;
|
|
18
|
+
data?: unknown;
|
|
19
|
+
/** Transport-level message (axiosError.message); used when there is no response body. */
|
|
20
|
+
fallbackMessage?: string;
|
|
21
|
+
/** Debug context appended verbatim under `--debug`. */
|
|
22
|
+
debug?: {
|
|
23
|
+
method?: string;
|
|
24
|
+
url?: string;
|
|
25
|
+
/** Response body serialized by the caller. */
|
|
26
|
+
responseBody?: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface FormatApiErrorOptions {
|
|
30
|
+
/** Friendly texts per HTTP status; the server message (if any) is appended after them. */
|
|
31
|
+
statusTexts?: Partial<Record<401 | 403 | 404, string>>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Build the error for a failed API call and throw it as a plain `Error`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatApiError(source: string, info: ApiErrorInfo, options?: FormatApiErrorOptions): never;
|
|
37
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,kFAAkF;AAClF,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,KAAK,CAAC,EAAE;QACN,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,8CAA8C;QAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,0FAA0F;IAC1F,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD;AAaD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,qBAA0B,GAClC,KAAK,CAoCP"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared API error formatting for all drivers.
|
|
3
|
+
*
|
|
4
|
+
* WHY: Storage/Meta error bodies are `{ statusCode, error, message }` where
|
|
5
|
+
* `error` is a coarse category (literally "Error" for Storage 400s) and
|
|
6
|
+
* `message` carries the actionable detail. Each driver used to prefer `error`
|
|
7
|
+
* and hard-coded 401/403/404 texts that swallowed the server `message`
|
|
8
|
+
* entirely, so users saw e.g. `Storage API error (400): Error` instead of
|
|
9
|
+
* `body must have required property 'prefix'`.
|
|
10
|
+
*
|
|
11
|
+
* Contract: always throws a plain `Error` whose message starts with
|
|
12
|
+
* `<source> API error (<status>): ` — upper layers match on that text, so do
|
|
13
|
+
* not introduce custom error classes or codes here.
|
|
14
|
+
*/
|
|
15
|
+
function asRecord(value) {
|
|
16
|
+
return typeof value === 'object' && value !== null ? value : undefined;
|
|
17
|
+
}
|
|
18
|
+
function firstString(...candidates) {
|
|
19
|
+
for (const candidate of candidates) {
|
|
20
|
+
if (typeof candidate === 'string' && candidate.trim() !== '')
|
|
21
|
+
return candidate;
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Build the error for a failed API call and throw it as a plain `Error`.
|
|
27
|
+
*/
|
|
28
|
+
export function formatApiError(source, info, options = {}) {
|
|
29
|
+
const { status, data } = info;
|
|
30
|
+
const body = asRecord(data);
|
|
31
|
+
// Share-Links nests details as `{ error: { message } }`; Meta/Storage use flat
|
|
32
|
+
// `{ error, message }`. `message` always wins over the coarse `error` category.
|
|
33
|
+
const nested = asRecord(body?.error);
|
|
34
|
+
const detail = firstString(body?.message, nested?.message, body?.error);
|
|
35
|
+
const friendly = status !== undefined
|
|
36
|
+
? options.statusTexts?.[status]
|
|
37
|
+
: undefined;
|
|
38
|
+
let message;
|
|
39
|
+
if (friendly) {
|
|
40
|
+
message = detail ? `${friendly} Server said: ${detail}` : friendly;
|
|
41
|
+
}
|
|
42
|
+
else if (detail) {
|
|
43
|
+
// Keep the category as a prefix only when it adds information beyond the detail.
|
|
44
|
+
const category = typeof body?.error === 'string' && body.error !== detail ? `${body.error}: ` : '';
|
|
45
|
+
message = `${category}${detail}`;
|
|
46
|
+
}
|
|
47
|
+
else if (body === undefined && info.fallbackMessage) {
|
|
48
|
+
// No JSON body at all (network failure / gateway HTML): keep the transport message.
|
|
49
|
+
message = info.fallbackMessage;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
message = 'no error body';
|
|
53
|
+
}
|
|
54
|
+
if (info.debug) {
|
|
55
|
+
const method = info.debug.method ?? 'unknown';
|
|
56
|
+
const url = info.debug.url ?? 'unknown';
|
|
57
|
+
message += `\n[debug] ${method.toUpperCase()} ${url} -> ${status ?? 'unknown'}`;
|
|
58
|
+
if (info.debug.responseBody !== undefined) {
|
|
59
|
+
message += `\n[debug] response body: ${info.debug.responseBody}`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
throw new Error(`${source} API error (${status ?? 'unknown'}): ${message}`);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAsBH,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtG,CAAC;AAED,SAAS,WAAW,CAAC,GAAG,UAAqB;IAC3C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,SAAS,CAAC;IACjF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,IAAkB,EAClB,UAAiC,EAAE;IAEnC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,+EAA+E;IAC/E,gFAAgF;IAChF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACxE,MAAM,QAAQ,GACZ,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,MAAyB,CAAC;QAClD,CAAC,CAAC,SAAS,CAAC;IAEhB,IAAI,OAAe,CAAC;IACpB,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,iBAAiB,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IACrE,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAClB,iFAAiF;QACjF,MAAM,QAAQ,GAAG,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACnG,OAAO,GAAG,GAAG,QAAQ,GAAG,MAAM,EAAE,CAAC;IACnC,CAAC;SAAM,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACtD,oFAAoF;QACpF,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,eAAe,CAAC;IAC5B,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,SAAS,CAAC;QACxC,OAAO,IAAI,aAAa,MAAM,CAAC,WAAW,EAAE,IAAI,GAAG,OAAO,MAAM,IAAI,SAAS,EAAE,CAAC;QAChF,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,IAAI,4BAA4B,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACnE,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,eAAe,MAAM,IAAI,SAAS,MAAM,OAAO,EAAE,CAAC,CAAC;AAC9E,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* @packageDocumentation
|
|
15
15
|
*/
|
|
16
16
|
export * from "./types.js";
|
|
17
|
+
export * from "./errors.js";
|
|
17
18
|
export * from "./drivers/meta.driver.js";
|
|
18
19
|
export * from "./drivers/functions.driver.js";
|
|
19
20
|
export * from "./drivers/apps.driver.js";
|
|
@@ -21,5 +22,6 @@ export * from "./drivers/share-links.driver.js";
|
|
|
21
22
|
export * from "./drivers/storage.driver.js";
|
|
22
23
|
export * from "./drivers/auth-admin.driver.js";
|
|
23
24
|
export * from "./drivers/tenant-ddl.driver.js";
|
|
25
|
+
export * from "./drivers/tenant-admin.driver.js";
|
|
24
26
|
export * from "./drivers/zero.driver.js";
|
|
25
27
|
//# 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;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAM5B,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,kCAAkC,CAAC;AAGjD,cAAc,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* @packageDocumentation
|
|
15
15
|
*/
|
|
16
16
|
export * from "./types.js";
|
|
17
|
+
export * from "./errors.js";
|
|
17
18
|
// TODO: M1 - Add Kong client
|
|
18
19
|
// export * from './kong.js';
|
|
19
20
|
// M3 - Meta API driver
|
|
@@ -27,6 +28,8 @@ export * from "./drivers/storage.driver.js";
|
|
|
27
28
|
export * from "./drivers/auth-admin.driver.js";
|
|
28
29
|
// Tenant self-service DDL / RLS driver (multi-tenant, per-tenant service_role)
|
|
29
30
|
export * from "./drivers/tenant-ddl.driver.js";
|
|
31
|
+
// Tenant admin driver (platform-operator surface; dashboard Basic Auth)
|
|
32
|
+
export * from "./drivers/tenant-admin.driver.js";
|
|
30
33
|
// Zero provisioning driver (PolarDB-X Zero PXBaas)
|
|
31
34
|
export * from "./drivers/zero.driver.js";
|
|
32
35
|
// 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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAE5B,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,wEAAwE;AACxE,cAAc,kCAAkC,CAAC;AAEjD,mDAAmD;AACnD,cAAc,0BAA0B,CAAC;AAEzC,6BAA6B;AAC7B,4CAA4C"}
|