get-db9 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +151 -0
- package/dist/admin.cjs +267 -0
- package/dist/admin.cjs.map +1 -0
- package/dist/admin.d.cts +46 -0
- package/dist/admin.d.ts +46 -0
- package/dist/admin.js +240 -0
- package/dist/admin.js.map +1 -0
- package/dist/customer-B6lzIJnQ.d.cts +81 -0
- package/dist/customer-wv08UX50.d.ts +81 -0
- package/dist/customer.cjs +291 -0
- package/dist/customer.cjs.map +1 -0
- package/dist/customer.d.cts +2 -0
- package/dist/customer.d.ts +2 -0
- package/dist/customer.js +264 -0
- package/dist/customer.js.map +1 -0
- package/dist/index.cjs +624 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +41 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +578 -0
- package/dist/index.js.map +1 -0
- package/dist/types-ktbIiH5T.d.cts +321 -0
- package/dist/types-ktbIiH5T.d.ts +321 -0
- package/package.json +61 -0
package/README.md
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# get-db9
|
|
2
|
+
|
|
3
|
+
TypeScript SDK for [pg-tikv](https://github.com/pgtikv/pg-tikv) — instant PostgreSQL-compatible databases on TiKV.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install get-db9
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
### One-liner: Get a database instantly
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { instantDatabase } from 'get-db9';
|
|
17
|
+
|
|
18
|
+
const db = await instantDatabase();
|
|
19
|
+
console.log(db.connectionString);
|
|
20
|
+
// postgresql://tenant.admin:password@host:5433/postgres
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### With seeding
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
const db = await instantDatabase({
|
|
27
|
+
name: 'myapp',
|
|
28
|
+
seed: 'CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT)',
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Customer API
|
|
33
|
+
|
|
34
|
+
Full typed client for the Customer API (register, databases, SQL, migrations).
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { createCustomerClient } from 'get-db9/customer';
|
|
38
|
+
|
|
39
|
+
const client = createCustomerClient({ token: 'your-token' });
|
|
40
|
+
|
|
41
|
+
// Create a database
|
|
42
|
+
const db = await client.databases.create({ name: 'myapp' });
|
|
43
|
+
|
|
44
|
+
// Execute SQL
|
|
45
|
+
const result = await client.databases.sql(db.id, 'SELECT * FROM users');
|
|
46
|
+
console.log(result.columns, result.rows);
|
|
47
|
+
|
|
48
|
+
// Schema inspection
|
|
49
|
+
const schema = await client.databases.schema(db.id);
|
|
50
|
+
|
|
51
|
+
// Migrations
|
|
52
|
+
await client.databases.applyMigration(db.id, {
|
|
53
|
+
name: 'add_users',
|
|
54
|
+
sql: 'CREATE TABLE users (id SERIAL PRIMARY KEY)',
|
|
55
|
+
checksum: 'abc123',
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Admin API
|
|
60
|
+
|
|
61
|
+
Full typed client for the Admin API (tenant management, batch operations, audit).
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
import { createAdminClient } from 'get-db9/admin';
|
|
65
|
+
|
|
66
|
+
const admin = createAdminClient({ apiKey: 'your-api-key' });
|
|
67
|
+
|
|
68
|
+
// List tenants
|
|
69
|
+
const { items } = await admin.tenants.list({ state: 'ACTIVE' });
|
|
70
|
+
|
|
71
|
+
// Create tenant
|
|
72
|
+
const tenant = await admin.tenants.create();
|
|
73
|
+
console.log(tenant.connection_string);
|
|
74
|
+
|
|
75
|
+
// Batch operations
|
|
76
|
+
const batch = await admin.tenants.batchCreate({ count: 5 });
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Configuration
|
|
80
|
+
|
|
81
|
+
### instantDatabase options
|
|
82
|
+
|
|
83
|
+
| Option | Type | Default | Description |
|
|
84
|
+
|--------|------|---------|-------------|
|
|
85
|
+
| `name` | `string` | `'default'` | Database name |
|
|
86
|
+
| `baseUrl` | `string` | Production URL | API endpoint |
|
|
87
|
+
| `fetch` | `FetchFn` | `globalThis.fetch` | Custom fetch |
|
|
88
|
+
| `credentialStore` | `CredentialStore` | `FileCredentialStore` | Credential storage |
|
|
89
|
+
| `seed` | `string` | — | SQL to run after creation |
|
|
90
|
+
| `seedFile` | `string` | — | SQL file content to run |
|
|
91
|
+
|
|
92
|
+
### Customer client options
|
|
93
|
+
|
|
94
|
+
| Option | Type | Default | Description |
|
|
95
|
+
|--------|------|---------|-------------|
|
|
96
|
+
| `baseUrl` | `string` | Production URL | API endpoint |
|
|
97
|
+
| `token` | `string` | — | Bearer token |
|
|
98
|
+
| `fetch` | `FetchFn` | `globalThis.fetch` | Custom fetch |
|
|
99
|
+
| `credentialStore` | `CredentialStore` | — | Auto-load token |
|
|
100
|
+
|
|
101
|
+
### Admin client options
|
|
102
|
+
|
|
103
|
+
| Option | Type | Default | Description |
|
|
104
|
+
|--------|------|---------|-------------|
|
|
105
|
+
| `baseUrl` | `string` | Production URL | API endpoint |
|
|
106
|
+
| `apiKey` | `string` | — | X-API-Key header |
|
|
107
|
+
| `fetch` | `FetchFn` | `globalThis.fetch` | Custom fetch |
|
|
108
|
+
|
|
109
|
+
## Error Handling
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
import { Db9Error, Db9AuthError, Db9NotFoundError } from 'get-db9';
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
await client.databases.get('nonexistent');
|
|
116
|
+
} catch (err) {
|
|
117
|
+
if (err instanceof Db9NotFoundError) {
|
|
118
|
+
console.log('Database not found');
|
|
119
|
+
} else if (err instanceof Db9AuthError) {
|
|
120
|
+
console.log('Authentication failed');
|
|
121
|
+
} else if (err instanceof Db9Error) {
|
|
122
|
+
console.log(`API error ${err.statusCode}: ${err.message}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Credential Storage
|
|
128
|
+
|
|
129
|
+
Credentials are stored in `~/.db9/credentials` (TOML format), shared with the db9 CLI.
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
import { FileCredentialStore, MemoryCredentialStore } from 'get-db9';
|
|
133
|
+
|
|
134
|
+
// File-based (default, shared with CLI)
|
|
135
|
+
const fileStore = new FileCredentialStore();
|
|
136
|
+
|
|
137
|
+
// Custom path
|
|
138
|
+
const customStore = new FileCredentialStore('/path/to/credentials');
|
|
139
|
+
|
|
140
|
+
// In-memory (for testing or serverless)
|
|
141
|
+
const memStore = new MemoryCredentialStore();
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Requirements
|
|
145
|
+
|
|
146
|
+
- Node.js >= 18 (native fetch)
|
|
147
|
+
- TypeScript >= 5.0 (for type exports)
|
|
148
|
+
|
|
149
|
+
## License
|
|
150
|
+
|
|
151
|
+
Apache-2.0
|
package/dist/admin.cjs
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/admin.ts
|
|
21
|
+
var admin_exports = {};
|
|
22
|
+
__export(admin_exports, {
|
|
23
|
+
createAdminClient: () => createAdminClient
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(admin_exports);
|
|
26
|
+
|
|
27
|
+
// src/errors.ts
|
|
28
|
+
var Db9Error = class _Db9Error extends Error {
|
|
29
|
+
statusCode;
|
|
30
|
+
response;
|
|
31
|
+
constructor(message, statusCode, response) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.name = "Db9Error";
|
|
34
|
+
this.statusCode = statusCode;
|
|
35
|
+
this.response = response;
|
|
36
|
+
}
|
|
37
|
+
static async fromResponse(response) {
|
|
38
|
+
let message;
|
|
39
|
+
try {
|
|
40
|
+
const body = await response.json();
|
|
41
|
+
message = body.message || response.statusText;
|
|
42
|
+
} catch {
|
|
43
|
+
message = response.statusText;
|
|
44
|
+
}
|
|
45
|
+
switch (response.status) {
|
|
46
|
+
case 401:
|
|
47
|
+
return new Db9AuthError(message, response);
|
|
48
|
+
case 404:
|
|
49
|
+
return new Db9NotFoundError(message, response);
|
|
50
|
+
case 409:
|
|
51
|
+
return new Db9ConflictError(message, response);
|
|
52
|
+
default:
|
|
53
|
+
return new _Db9Error(message, response.status, response);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
var Db9AuthError = class extends Db9Error {
|
|
58
|
+
constructor(message, response) {
|
|
59
|
+
super(message, 401, response);
|
|
60
|
+
this.name = "Db9AuthError";
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
var Db9NotFoundError = class extends Db9Error {
|
|
64
|
+
constructor(message, response) {
|
|
65
|
+
super(message, 404, response);
|
|
66
|
+
this.name = "Db9NotFoundError";
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
var Db9ConflictError = class extends Db9Error {
|
|
70
|
+
constructor(message, response) {
|
|
71
|
+
super(message, 409, response);
|
|
72
|
+
this.name = "Db9ConflictError";
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// src/http.ts
|
|
77
|
+
function createHttpClient(options) {
|
|
78
|
+
const fetchFn = options.fetch ?? globalThis.fetch;
|
|
79
|
+
const baseUrl = options.baseUrl.replace(/\/$/, "");
|
|
80
|
+
async function request(method, path, body, params) {
|
|
81
|
+
let url = `${baseUrl}${path}`;
|
|
82
|
+
if (params) {
|
|
83
|
+
const searchParams = new URLSearchParams();
|
|
84
|
+
for (const [key, value] of Object.entries(params)) {
|
|
85
|
+
if (value !== void 0) {
|
|
86
|
+
searchParams.set(key, value);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const qs = searchParams.toString();
|
|
90
|
+
if (qs) url += `?${qs}`;
|
|
91
|
+
}
|
|
92
|
+
const headers = {
|
|
93
|
+
"Content-Type": "application/json",
|
|
94
|
+
...options.headers
|
|
95
|
+
};
|
|
96
|
+
const init = { method, headers };
|
|
97
|
+
if (body !== void 0) {
|
|
98
|
+
init.body = JSON.stringify(body);
|
|
99
|
+
}
|
|
100
|
+
const response = await fetchFn(url, init);
|
|
101
|
+
if (!response.ok) {
|
|
102
|
+
throw await Db9Error.fromResponse(response);
|
|
103
|
+
}
|
|
104
|
+
if (response.status === 204) {
|
|
105
|
+
return void 0;
|
|
106
|
+
}
|
|
107
|
+
return response.json();
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
get: (path, params) => request("GET", path, void 0, params),
|
|
111
|
+
post: (path, body) => request("POST", path, body),
|
|
112
|
+
put: (path, body) => request("PUT", path, body),
|
|
113
|
+
del: (path) => request("DELETE", path)
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// src/admin.ts
|
|
118
|
+
function createAdminClient(options = {}) {
|
|
119
|
+
const baseUrl = options.baseUrl ?? "https://db9.shared.aws.tidbcloud.com/api";
|
|
120
|
+
const headers = {};
|
|
121
|
+
if (options.apiKey) {
|
|
122
|
+
headers["X-API-Key"] = options.apiKey;
|
|
123
|
+
}
|
|
124
|
+
const client = createHttpClient({
|
|
125
|
+
baseUrl,
|
|
126
|
+
fetch: options.fetch,
|
|
127
|
+
headers
|
|
128
|
+
});
|
|
129
|
+
return {
|
|
130
|
+
tenants: {
|
|
131
|
+
list: (params) => {
|
|
132
|
+
const queryParams = {};
|
|
133
|
+
if (params) {
|
|
134
|
+
if (params.page !== void 0)
|
|
135
|
+
queryParams.page = String(params.page);
|
|
136
|
+
if (params.size !== void 0)
|
|
137
|
+
queryParams.size = String(params.size);
|
|
138
|
+
if (params.state !== void 0) queryParams.state = params.state;
|
|
139
|
+
if (params.q !== void 0) queryParams.q = params.q;
|
|
140
|
+
if (params.cursor !== void 0) queryParams.cursor = params.cursor;
|
|
141
|
+
if (params.tag !== void 0) queryParams.tag = params.tag;
|
|
142
|
+
}
|
|
143
|
+
return client.get("/tenants", queryParams);
|
|
144
|
+
},
|
|
145
|
+
create: (req) => client.post("/tenants", req),
|
|
146
|
+
get: (tenantId) => client.get(`/tenants/${tenantId}`),
|
|
147
|
+
update: (tenantId, req) => client.put(`/tenants/${tenantId}`, req),
|
|
148
|
+
delete: (tenantId) => client.del(`/tenants/${tenantId}`),
|
|
149
|
+
remove: (tenantId) => client.post(`/tenants/${tenantId}/remove`),
|
|
150
|
+
batchCreate: (req) => client.post("/tenants/batch", req),
|
|
151
|
+
batchDelete: (req) => client.post("/tenants/batch/delete", req),
|
|
152
|
+
batchUpdate: (req) => client.put("/tenants/batch", req),
|
|
153
|
+
connect: (tenantId, req) => client.post(
|
|
154
|
+
`/tenants/${tenantId}/connect`,
|
|
155
|
+
req
|
|
156
|
+
),
|
|
157
|
+
// query() needs X-Tenant-Session header — create a one-off client
|
|
158
|
+
query: async (tenantId, sessionId, req) => {
|
|
159
|
+
const sessionClient = createHttpClient({
|
|
160
|
+
baseUrl,
|
|
161
|
+
fetch: options.fetch,
|
|
162
|
+
headers: {
|
|
163
|
+
...headers,
|
|
164
|
+
"X-Tenant-Session": sessionId
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
return sessionClient.post(
|
|
168
|
+
`/tenants/${tenantId}/query`,
|
|
169
|
+
req
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
system: {
|
|
174
|
+
health: () => client.get("/health"),
|
|
175
|
+
info: () => client.get("/info")
|
|
176
|
+
},
|
|
177
|
+
users: {
|
|
178
|
+
list: async (tenantId, sessionId) => {
|
|
179
|
+
const sessionClient = createHttpClient({
|
|
180
|
+
baseUrl,
|
|
181
|
+
fetch: options.fetch,
|
|
182
|
+
headers: {
|
|
183
|
+
...headers,
|
|
184
|
+
"X-Tenant-Session": sessionId
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
return sessionClient.get(
|
|
188
|
+
`/tenants/${tenantId}/users`
|
|
189
|
+
);
|
|
190
|
+
},
|
|
191
|
+
create: async (tenantId, sessionId, req) => {
|
|
192
|
+
const sessionClient = createHttpClient({
|
|
193
|
+
baseUrl,
|
|
194
|
+
fetch: options.fetch,
|
|
195
|
+
headers: {
|
|
196
|
+
...headers,
|
|
197
|
+
"X-Tenant-Session": sessionId
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
return sessionClient.post(
|
|
201
|
+
`/tenants/${tenantId}/users`,
|
|
202
|
+
req
|
|
203
|
+
);
|
|
204
|
+
},
|
|
205
|
+
delete: async (tenantId, sessionId, username) => {
|
|
206
|
+
const sessionClient = createHttpClient({
|
|
207
|
+
baseUrl,
|
|
208
|
+
fetch: options.fetch,
|
|
209
|
+
headers: {
|
|
210
|
+
...headers,
|
|
211
|
+
"X-Tenant-Session": sessionId
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
return sessionClient.del(
|
|
215
|
+
`/tenants/${tenantId}/users/${username}`
|
|
216
|
+
);
|
|
217
|
+
},
|
|
218
|
+
resetPassword: async (tenantId, sessionId, username) => {
|
|
219
|
+
const sessionClient = createHttpClient({
|
|
220
|
+
baseUrl,
|
|
221
|
+
fetch: options.fetch,
|
|
222
|
+
headers: {
|
|
223
|
+
...headers,
|
|
224
|
+
"X-Tenant-Session": sessionId
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
return sessionClient.post(
|
|
228
|
+
`/tenants/${tenantId}/users/${username}/password`
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
observability: {
|
|
233
|
+
get: (tenantId) => client.get(
|
|
234
|
+
`/tenants/${tenantId}/observability`
|
|
235
|
+
),
|
|
236
|
+
bootstrap: (tenantId, req) => client.post(
|
|
237
|
+
`/tenants/${tenantId}/observability/bootstrap`,
|
|
238
|
+
req
|
|
239
|
+
)
|
|
240
|
+
},
|
|
241
|
+
audit: {
|
|
242
|
+
list: (params) => {
|
|
243
|
+
const queryParams = {};
|
|
244
|
+
if (params) {
|
|
245
|
+
if (params.tenant_id !== void 0)
|
|
246
|
+
queryParams.tenant_id = params.tenant_id;
|
|
247
|
+
if (params.operation_type !== void 0)
|
|
248
|
+
queryParams.operation_type = params.operation_type;
|
|
249
|
+
if (params.resource_type !== void 0)
|
|
250
|
+
queryParams.resource_type = params.resource_type;
|
|
251
|
+
if (params.success !== void 0)
|
|
252
|
+
queryParams.success = String(params.success);
|
|
253
|
+
if (params.limit !== void 0)
|
|
254
|
+
queryParams.limit = String(params.limit);
|
|
255
|
+
if (params.offset !== void 0)
|
|
256
|
+
queryParams.offset = String(params.offset);
|
|
257
|
+
}
|
|
258
|
+
return client.get("/audit-logs", queryParams);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
264
|
+
0 && (module.exports = {
|
|
265
|
+
createAdminClient
|
|
266
|
+
});
|
|
267
|
+
//# sourceMappingURL=admin.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/admin.ts","../src/errors.ts","../src/http.ts"],"sourcesContent":["import { createHttpClient, type FetchFn } from './http';\nimport type {\n CreateTenantRequest,\n CreateTenantResponse,\n TenantResponse,\n TenantListResponse,\n TenantUpdateRequest,\n TenantConnectRequest,\n TenantConnectResponse,\n SqlQueryRequest,\n SqlQueryResponse,\n ListTenantsParams,\n MessageResponse,\n HealthResponse,\n BatchCreateRequest,\n BatchCreateResponse,\n BatchDeleteRequest,\n BatchDeleteResponse,\n BatchUpdateRequest,\n BatchUpdateResponse,\n UserResponse,\n UserCreateResponse,\n AdminCreateUserRequest,\n PasswordResetResponse,\n TenantObservabilityResponse,\n AuditLogParams,\n AuditLogResponse,\n} from './types';\n\nexport interface AdminClientOptions {\n baseUrl?: string;\n apiKey?: string;\n fetch?: FetchFn;\n}\n\nexport function createAdminClient(options: AdminClientOptions = {}) {\n const baseUrl =\n options.baseUrl ?? 'https://db9.shared.aws.tidbcloud.com/api';\n const headers: Record<string, string> = {};\n if (options.apiKey) {\n headers['X-API-Key'] = options.apiKey;\n }\n\n const client = createHttpClient({\n baseUrl,\n fetch: options.fetch,\n headers,\n });\n\n return {\n tenants: {\n list: (params?: ListTenantsParams) => {\n const queryParams: Record<string, string | undefined> = {};\n if (params) {\n if (params.page !== undefined)\n queryParams.page = String(params.page);\n if (params.size !== undefined)\n queryParams.size = String(params.size);\n if (params.state !== undefined) queryParams.state = params.state;\n if (params.q !== undefined) queryParams.q = params.q;\n if (params.cursor !== undefined) queryParams.cursor = params.cursor;\n if (params.tag !== undefined) queryParams.tag = params.tag;\n }\n return client.get<TenantListResponse>('/tenants', queryParams);\n },\n create: (req?: CreateTenantRequest) =>\n client.post<CreateTenantResponse>('/tenants', req),\n get: (tenantId: string) =>\n client.get<TenantResponse>(`/tenants/${tenantId}`),\n update: (tenantId: string, req: TenantUpdateRequest) =>\n client.put<TenantResponse>(`/tenants/${tenantId}`, req),\n delete: (tenantId: string) =>\n client.del<MessageResponse>(`/tenants/${tenantId}`),\n remove: (tenantId: string) =>\n client.post<MessageResponse>(`/tenants/${tenantId}/remove`),\n\n batchCreate: (req: BatchCreateRequest) =>\n client.post<BatchCreateResponse>('/tenants/batch', req),\n batchDelete: (req: BatchDeleteRequest) =>\n client.post<BatchDeleteResponse>('/tenants/batch/delete', req),\n batchUpdate: (req: BatchUpdateRequest) =>\n client.put<BatchUpdateResponse>('/tenants/batch', req),\n\n connect: (tenantId: string, req: TenantConnectRequest) =>\n client.post<TenantConnectResponse>(\n `/tenants/${tenantId}/connect`,\n req\n ),\n\n // query() needs X-Tenant-Session header — create a one-off client\n query: async (\n tenantId: string,\n sessionId: string,\n req: SqlQueryRequest\n ) => {\n const sessionClient = createHttpClient({\n baseUrl,\n fetch: options.fetch,\n headers: {\n ...headers,\n 'X-Tenant-Session': sessionId,\n },\n });\n return sessionClient.post<SqlQueryResponse>(\n `/tenants/${tenantId}/query`,\n req\n );\n },\n },\n\n system: {\n health: () => client.get<HealthResponse>('/health'),\n info: () =>\n client.get<{ name: string; version: string; docs: string }>('/info'),\n },\n\n users: {\n list: async (tenantId: string, sessionId: string) => {\n const sessionClient = createHttpClient({\n baseUrl,\n fetch: options.fetch,\n headers: {\n ...headers,\n 'X-Tenant-Session': sessionId,\n },\n });\n return sessionClient.get<UserResponse[]>(\n `/tenants/${tenantId}/users`\n );\n },\n\n create: async (\n tenantId: string,\n sessionId: string,\n req: AdminCreateUserRequest\n ) => {\n const sessionClient = createHttpClient({\n baseUrl,\n fetch: options.fetch,\n headers: {\n ...headers,\n 'X-Tenant-Session': sessionId,\n },\n });\n return sessionClient.post<UserCreateResponse>(\n `/tenants/${tenantId}/users`,\n req\n );\n },\n\n delete: async (\n tenantId: string,\n sessionId: string,\n username: string\n ) => {\n const sessionClient = createHttpClient({\n baseUrl,\n fetch: options.fetch,\n headers: {\n ...headers,\n 'X-Tenant-Session': sessionId,\n },\n });\n return sessionClient.del<MessageResponse>(\n `/tenants/${tenantId}/users/${username}`\n );\n },\n\n resetPassword: async (\n tenantId: string,\n sessionId: string,\n username: string\n ) => {\n const sessionClient = createHttpClient({\n baseUrl,\n fetch: options.fetch,\n headers: {\n ...headers,\n 'X-Tenant-Session': sessionId,\n },\n });\n return sessionClient.post<PasswordResetResponse>(\n `/tenants/${tenantId}/users/${username}/password`\n );\n },\n },\n\n observability: {\n get: (tenantId: string) =>\n client.get<TenantObservabilityResponse>(\n `/tenants/${tenantId}/observability`\n ),\n\n bootstrap: (tenantId: string, req: TenantConnectRequest) =>\n client.post<MessageResponse>(\n `/tenants/${tenantId}/observability/bootstrap`,\n req\n ),\n },\n\n audit: {\n list: (params?: AuditLogParams) => {\n const queryParams: Record<string, string | undefined> = {};\n if (params) {\n if (params.tenant_id !== undefined)\n queryParams.tenant_id = params.tenant_id;\n if (params.operation_type !== undefined)\n queryParams.operation_type = params.operation_type;\n if (params.resource_type !== undefined)\n queryParams.resource_type = params.resource_type;\n if (params.success !== undefined)\n queryParams.success = String(params.success);\n if (params.limit !== undefined)\n queryParams.limit = String(params.limit);\n if (params.offset !== undefined)\n queryParams.offset = String(params.offset);\n }\n return client.get<AuditLogResponse[]>('/audit-logs', queryParams);\n },\n },\n };\n}\n\nexport type AdminClient = ReturnType<typeof createAdminClient>;","export class Db9Error extends Error {\n readonly statusCode: number;\n readonly response?: Response;\n\n constructor(message: string, statusCode: number, response?: Response) {\n super(message);\n this.name = 'Db9Error';\n this.statusCode = statusCode;\n this.response = response;\n }\n\n static async fromResponse(response: Response): Promise<Db9Error> {\n // Parse { \"message\": string } body — the ONLY error format from the API\n let message: string;\n try {\n const body = (await response.json()) as { message?: string };\n message = body.message || response.statusText;\n } catch {\n message = response.statusText;\n }\n\n // Return specific subclass based on status code\n switch (response.status) {\n case 401:\n return new Db9AuthError(message, response);\n case 404:\n return new Db9NotFoundError(message, response);\n case 409:\n return new Db9ConflictError(message, response);\n default:\n return new Db9Error(message, response.status, response);\n }\n }\n}\n\nexport class Db9AuthError extends Db9Error {\n constructor(message: string, response?: Response) {\n super(message, 401, response);\n this.name = 'Db9AuthError';\n }\n}\n\nexport class Db9NotFoundError extends Db9Error {\n constructor(message: string, response?: Response) {\n super(message, 404, response);\n this.name = 'Db9NotFoundError';\n }\n}\n\nexport class Db9ConflictError extends Db9Error {\n constructor(message: string, response?: Response) {\n super(message, 409, response);\n this.name = 'Db9ConflictError';\n }\n}\n","import { Db9Error } from './errors';\n\nexport type FetchFn = typeof globalThis.fetch;\n\nexport interface HttpClientOptions {\n baseUrl: string;\n fetch?: FetchFn;\n headers?: Record<string, string>;\n}\n\nexport interface HttpClient {\n get<T>(path: string, params?: Record<string, string | undefined>): Promise<T>;\n post<T>(path: string, body?: unknown): Promise<T>;\n put<T>(path: string, body?: unknown): Promise<T>;\n del<T>(path: string): Promise<T>;\n}\n\nexport function createHttpClient(options: HttpClientOptions): HttpClient {\n const fetchFn = options.fetch ?? globalThis.fetch;\n const baseUrl = options.baseUrl.replace(/\\/$/, ''); // strip trailing slash\n\n async function request<T>(\n method: string,\n path: string,\n body?: unknown,\n params?: Record<string, string | undefined>\n ): Promise<T> {\n let url = `${baseUrl}${path}`;\n\n // Append query params for GET requests\n if (params) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n searchParams.set(key, value);\n }\n }\n const qs = searchParams.toString();\n if (qs) url += `?${qs}`;\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n\n const init: RequestInit = { method, headers };\n if (body !== undefined) {\n init.body = JSON.stringify(body);\n }\n\n const response = await fetchFn(url, init);\n\n if (!response.ok) {\n throw await Db9Error.fromResponse(response);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n\n return {\n get: <T>(path: string, params?: Record<string, string | undefined>) =>\n request<T>('GET', path, undefined, params),\n post: <T>(path: string, body?: unknown) => request<T>('POST', path, body),\n put: <T>(path: string, body?: unknown) => request<T>('PUT', path, body),\n del: <T>(path: string) => request<T>('DELETE', path),\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/admin.d.cts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { F as FetchFn, L as ListTenantsParams, _ as TenantListResponse, r as CreateTenantRequest, s as CreateTenantResponse, a0 as TenantResponse, a2 as TenantUpdateRequest, M as MessageResponse, B as BatchCreateRequest, g as BatchCreateResponse, h as BatchDeleteRequest, i as BatchDeleteResponse, k as BatchUpdateRequest, l as BatchUpdateResponse, Y as TenantConnectRequest, Z as TenantConnectResponse, U as SqlQueryRequest, V as SqlQueryResponse, H as HealthResponse, a5 as UserResponse, A as AdminCreateUserRequest, a4 as UserCreateResponse, P as PasswordResetResponse, $ as TenantObservabilityResponse, e as AuditLogParams, f as AuditLogResponse } from './types-ktbIiH5T.cjs';
|
|
2
|
+
|
|
3
|
+
interface AdminClientOptions {
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
apiKey?: string;
|
|
6
|
+
fetch?: FetchFn;
|
|
7
|
+
}
|
|
8
|
+
declare function createAdminClient(options?: AdminClientOptions): {
|
|
9
|
+
tenants: {
|
|
10
|
+
list: (params?: ListTenantsParams) => Promise<TenantListResponse>;
|
|
11
|
+
create: (req?: CreateTenantRequest) => Promise<CreateTenantResponse>;
|
|
12
|
+
get: (tenantId: string) => Promise<TenantResponse>;
|
|
13
|
+
update: (tenantId: string, req: TenantUpdateRequest) => Promise<TenantResponse>;
|
|
14
|
+
delete: (tenantId: string) => Promise<MessageResponse>;
|
|
15
|
+
remove: (tenantId: string) => Promise<MessageResponse>;
|
|
16
|
+
batchCreate: (req: BatchCreateRequest) => Promise<BatchCreateResponse>;
|
|
17
|
+
batchDelete: (req: BatchDeleteRequest) => Promise<BatchDeleteResponse>;
|
|
18
|
+
batchUpdate: (req: BatchUpdateRequest) => Promise<BatchUpdateResponse>;
|
|
19
|
+
connect: (tenantId: string, req: TenantConnectRequest) => Promise<TenantConnectResponse>;
|
|
20
|
+
query: (tenantId: string, sessionId: string, req: SqlQueryRequest) => Promise<SqlQueryResponse>;
|
|
21
|
+
};
|
|
22
|
+
system: {
|
|
23
|
+
health: () => Promise<HealthResponse>;
|
|
24
|
+
info: () => Promise<{
|
|
25
|
+
name: string;
|
|
26
|
+
version: string;
|
|
27
|
+
docs: string;
|
|
28
|
+
}>;
|
|
29
|
+
};
|
|
30
|
+
users: {
|
|
31
|
+
list: (tenantId: string, sessionId: string) => Promise<UserResponse[]>;
|
|
32
|
+
create: (tenantId: string, sessionId: string, req: AdminCreateUserRequest) => Promise<UserCreateResponse>;
|
|
33
|
+
delete: (tenantId: string, sessionId: string, username: string) => Promise<MessageResponse>;
|
|
34
|
+
resetPassword: (tenantId: string, sessionId: string, username: string) => Promise<PasswordResetResponse>;
|
|
35
|
+
};
|
|
36
|
+
observability: {
|
|
37
|
+
get: (tenantId: string) => Promise<TenantObservabilityResponse>;
|
|
38
|
+
bootstrap: (tenantId: string, req: TenantConnectRequest) => Promise<MessageResponse>;
|
|
39
|
+
};
|
|
40
|
+
audit: {
|
|
41
|
+
list: (params?: AuditLogParams) => Promise<AuditLogResponse[]>;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
type AdminClient = ReturnType<typeof createAdminClient>;
|
|
45
|
+
|
|
46
|
+
export { type AdminClient, type AdminClientOptions, createAdminClient };
|
package/dist/admin.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { F as FetchFn, L as ListTenantsParams, _ as TenantListResponse, r as CreateTenantRequest, s as CreateTenantResponse, a0 as TenantResponse, a2 as TenantUpdateRequest, M as MessageResponse, B as BatchCreateRequest, g as BatchCreateResponse, h as BatchDeleteRequest, i as BatchDeleteResponse, k as BatchUpdateRequest, l as BatchUpdateResponse, Y as TenantConnectRequest, Z as TenantConnectResponse, U as SqlQueryRequest, V as SqlQueryResponse, H as HealthResponse, a5 as UserResponse, A as AdminCreateUserRequest, a4 as UserCreateResponse, P as PasswordResetResponse, $ as TenantObservabilityResponse, e as AuditLogParams, f as AuditLogResponse } from './types-ktbIiH5T.js';
|
|
2
|
+
|
|
3
|
+
interface AdminClientOptions {
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
apiKey?: string;
|
|
6
|
+
fetch?: FetchFn;
|
|
7
|
+
}
|
|
8
|
+
declare function createAdminClient(options?: AdminClientOptions): {
|
|
9
|
+
tenants: {
|
|
10
|
+
list: (params?: ListTenantsParams) => Promise<TenantListResponse>;
|
|
11
|
+
create: (req?: CreateTenantRequest) => Promise<CreateTenantResponse>;
|
|
12
|
+
get: (tenantId: string) => Promise<TenantResponse>;
|
|
13
|
+
update: (tenantId: string, req: TenantUpdateRequest) => Promise<TenantResponse>;
|
|
14
|
+
delete: (tenantId: string) => Promise<MessageResponse>;
|
|
15
|
+
remove: (tenantId: string) => Promise<MessageResponse>;
|
|
16
|
+
batchCreate: (req: BatchCreateRequest) => Promise<BatchCreateResponse>;
|
|
17
|
+
batchDelete: (req: BatchDeleteRequest) => Promise<BatchDeleteResponse>;
|
|
18
|
+
batchUpdate: (req: BatchUpdateRequest) => Promise<BatchUpdateResponse>;
|
|
19
|
+
connect: (tenantId: string, req: TenantConnectRequest) => Promise<TenantConnectResponse>;
|
|
20
|
+
query: (tenantId: string, sessionId: string, req: SqlQueryRequest) => Promise<SqlQueryResponse>;
|
|
21
|
+
};
|
|
22
|
+
system: {
|
|
23
|
+
health: () => Promise<HealthResponse>;
|
|
24
|
+
info: () => Promise<{
|
|
25
|
+
name: string;
|
|
26
|
+
version: string;
|
|
27
|
+
docs: string;
|
|
28
|
+
}>;
|
|
29
|
+
};
|
|
30
|
+
users: {
|
|
31
|
+
list: (tenantId: string, sessionId: string) => Promise<UserResponse[]>;
|
|
32
|
+
create: (tenantId: string, sessionId: string, req: AdminCreateUserRequest) => Promise<UserCreateResponse>;
|
|
33
|
+
delete: (tenantId: string, sessionId: string, username: string) => Promise<MessageResponse>;
|
|
34
|
+
resetPassword: (tenantId: string, sessionId: string, username: string) => Promise<PasswordResetResponse>;
|
|
35
|
+
};
|
|
36
|
+
observability: {
|
|
37
|
+
get: (tenantId: string) => Promise<TenantObservabilityResponse>;
|
|
38
|
+
bootstrap: (tenantId: string, req: TenantConnectRequest) => Promise<MessageResponse>;
|
|
39
|
+
};
|
|
40
|
+
audit: {
|
|
41
|
+
list: (params?: AuditLogParams) => Promise<AuditLogResponse[]>;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
type AdminClient = ReturnType<typeof createAdminClient>;
|
|
45
|
+
|
|
46
|
+
export { type AdminClient, type AdminClientOptions, createAdminClient };
|