@polardbx/pxbaas-client 0.0.0-stage → 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.
Files changed (42) hide show
  1. package/README.md +51 -2
  2. package/dist/drivers/apps.driver.d.ts +121 -0
  3. package/dist/drivers/apps.driver.d.ts.map +1 -0
  4. package/dist/drivers/apps.driver.js +90 -0
  5. package/dist/drivers/apps.driver.js.map +1 -0
  6. package/dist/drivers/auth-admin.driver.d.ts +78 -0
  7. package/dist/drivers/auth-admin.driver.d.ts.map +1 -0
  8. package/dist/drivers/auth-admin.driver.js +145 -0
  9. package/dist/drivers/auth-admin.driver.js.map +1 -0
  10. package/dist/drivers/functions.driver.d.ts +75 -0
  11. package/dist/drivers/functions.driver.d.ts.map +1 -0
  12. package/dist/drivers/functions.driver.js +173 -0
  13. package/dist/drivers/functions.driver.js.map +1 -0
  14. package/dist/drivers/meta.driver.d.ts +77 -0
  15. package/dist/drivers/meta.driver.d.ts.map +1 -0
  16. package/dist/drivers/meta.driver.js +191 -0
  17. package/dist/drivers/meta.driver.js.map +1 -0
  18. package/dist/drivers/share-links.driver.d.ts +42 -0
  19. package/dist/drivers/share-links.driver.d.ts.map +1 -0
  20. package/dist/drivers/share-links.driver.js +53 -0
  21. package/dist/drivers/share-links.driver.js.map +1 -0
  22. package/dist/drivers/storage.driver.d.ts +72 -0
  23. package/dist/drivers/storage.driver.d.ts.map +1 -0
  24. package/dist/drivers/storage.driver.js +171 -0
  25. package/dist/drivers/storage.driver.js.map +1 -0
  26. package/dist/drivers/tenant-ddl.driver.d.ts +106 -0
  27. package/dist/drivers/tenant-ddl.driver.d.ts.map +1 -0
  28. package/dist/drivers/tenant-ddl.driver.js +131 -0
  29. package/dist/drivers/tenant-ddl.driver.js.map +1 -0
  30. package/dist/drivers/zero.driver.d.ts +78 -0
  31. package/dist/drivers/zero.driver.d.ts.map +1 -0
  32. package/dist/drivers/zero.driver.js +117 -0
  33. package/dist/drivers/zero.driver.js.map +1 -0
  34. package/dist/index.d.ts +25 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +34 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/types.d.ts +26 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +5 -0
  41. package/dist/types.js.map +1 -0
  42. package/package.json +57 -3
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Functions Driver - Edge Functions Management API client
3
+ *
4
+ * Endpoints:
5
+ * - POST /v1/projects/{ref}/functions/deploy?slug={slug} - Deploy function
6
+ * - GET /v1/projects/{ref}/functions - List functions
7
+ * - GET /v1/projects/{ref}/functions/{slug} - Get function details
8
+ * - DELETE /v1/projects/{ref}/functions/{slug} - Delete function
9
+ */
10
+ import axios from 'axios';
11
+ import FormData from 'form-data';
12
+ import { readFile } from 'node:fs/promises';
13
+ import { basename } from 'node:path';
14
+ export class FunctionsDriver {
15
+ client;
16
+ serviceRoleKey;
17
+ tenantId;
18
+ projectRef;
19
+ constructor(options) {
20
+ this.serviceRoleKey = options.serviceRoleKey;
21
+ this.tenantId = options.tenantId;
22
+ this.projectRef = options.projectRef ?? 'default';
23
+ this.client = axios.create({
24
+ baseURL: `${options.endpoint}/v1/projects/${this.projectRef}`,
25
+ timeout: options.timeout ?? 60000, // 60s for deploy
26
+ headers: {
27
+ 'Authorization': `Bearer ${this.serviceRoleKey}`,
28
+ },
29
+ });
30
+ }
31
+ getHeaders() {
32
+ const headers = {
33
+ 'Authorization': `Bearer ${this.serviceRoleKey}`,
34
+ };
35
+ // Note: Do NOT include apikey header for Functions Management API
36
+ // Kong will inject X-Tenant-Id from the JWT
37
+ return headers;
38
+ }
39
+ handleError(error) {
40
+ if (axios.isAxiosError(error)) {
41
+ const axiosError = error;
42
+ const status = axiosError.response?.status;
43
+ const data = axiosError.response?.data;
44
+ let message = axiosError.message;
45
+ if (status === 401) {
46
+ message = 'Authentication failed. Please check your service_role key and run "pxbaas login" again.';
47
+ }
48
+ else if (status === 403) {
49
+ message = 'Permission denied. Functions Management API requires service_role key.';
50
+ }
51
+ else if (status === 404) {
52
+ message = 'Function not found. Please check the slug and try again.';
53
+ }
54
+ else if (status === 400) {
55
+ // Common issue: metadata part missing or incorrectly formatted
56
+ const errorMsg = data?.message;
57
+ if (typeof errorMsg === 'string' && errorMsg.includes('metadata')) {
58
+ message = 'Invalid metadata format. Ensure metadata is passed as a form field without filename.';
59
+ }
60
+ else {
61
+ message = typeof errorMsg === 'string' ? errorMsg : 'Bad request';
62
+ }
63
+ }
64
+ else if (data?.message) {
65
+ message = typeof data.message === 'string' ? data.message : String(data.message);
66
+ }
67
+ throw new Error(`Functions API error (${status ?? 'unknown'}): ${message}`);
68
+ }
69
+ throw error;
70
+ }
71
+ /**
72
+ * Deploy a function
73
+ *
74
+ * IMPORTANT: metadata must be passed as a form field WITHOUT filename,
75
+ * not as a file upload. This is a common source of 400 errors.
76
+ */
77
+ async deploy(options) {
78
+ try {
79
+ const formData = new FormData();
80
+ // Prepare metadata (MUST be without filename)
81
+ const metadata = {
82
+ name: options.slug,
83
+ entrypoint_path: options.entrypointPath ?? 'index.ts',
84
+ verify_jwt: options.verifyJwt ?? true,
85
+ };
86
+ // Add metadata as a form field (NOT as a file)
87
+ formData.append('metadata', JSON.stringify(metadata), {
88
+ contentType: 'application/json',
89
+ // IMPORTANT: Do NOT set filename here
90
+ });
91
+ // Add files
92
+ for (const file of options.files) {
93
+ const content = file.content ?? await readFile(file.path, 'utf-8');
94
+ // Preserve nested paths (assets/style.css); fall back to basename.
95
+ const filename = file.relativePath ?? basename(file.path);
96
+ formData.append('file', content, {
97
+ // form-data basenames a custom `filename` (lib/form_data.js
98
+ // `_getContentDisposition`), which flattens nested artifact paths such as
99
+ // `frontend/dist/index.html` and makes the Management API reject the
100
+ // candidate. `filepath` is normalized instead, so the nesting survives.
101
+ // Both options serialize to the same `Content-Disposition` header.
102
+ ...(filename.includes('/')
103
+ ? { filepath: filename }
104
+ : { filename }),
105
+ contentType: this.getContentType(filename),
106
+ });
107
+ }
108
+ const response = await this.client.post(`/functions/deploy`, formData, {
109
+ headers: {
110
+ ...this.getHeaders(),
111
+ ...formData.getHeaders(),
112
+ },
113
+ params: {
114
+ slug: options.slug,
115
+ },
116
+ });
117
+ return response.data;
118
+ }
119
+ catch (error) {
120
+ this.handleError(error);
121
+ }
122
+ }
123
+ /**
124
+ * List all deployed functions
125
+ */
126
+ async list() {
127
+ try {
128
+ const response = await this.client.get('/functions', { headers: this.getHeaders() });
129
+ return response.data ?? [];
130
+ }
131
+ catch (error) {
132
+ this.handleError(error);
133
+ }
134
+ }
135
+ /**
136
+ * Get function details
137
+ */
138
+ async get(slug) {
139
+ try {
140
+ const response = await this.client.get(`/functions/${slug}`, { headers: this.getHeaders() });
141
+ return response.data;
142
+ }
143
+ catch (error) {
144
+ this.handleError(error);
145
+ }
146
+ }
147
+ /**
148
+ * Delete a function
149
+ */
150
+ async delete(slug) {
151
+ try {
152
+ await this.client.delete(`/functions/${slug}`, { headers: this.getHeaders() });
153
+ }
154
+ catch (error) {
155
+ this.handleError(error);
156
+ }
157
+ }
158
+ /**
159
+ * Get content type based on file extension
160
+ */
161
+ getContentType(filename) {
162
+ const ext = filename.split('.').pop()?.toLowerCase();
163
+ const contentTypes = {
164
+ 'ts': 'application/typescript',
165
+ 'js': 'application/javascript',
166
+ 'json': 'application/json',
167
+ 'md': 'text/markdown',
168
+ 'txt': 'text/plain',
169
+ };
170
+ return contentTypes[ext ?? ''] ?? 'application/octet-stream';
171
+ }
172
+ }
173
+ //# sourceMappingURL=functions.driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.driver.js","sourceRoot":"","sources":["../../src/drivers/functions.driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Meta API Driver - PolarDB-X BaaS 元数据 API 客户端
3
+ *
4
+ * Endpoints:
5
+ * - POST /pg/query - Execute SQL query
6
+ * - GET /pg/tables - List tables
7
+ * - GET /pg/tables/{table}/columns - Get table columns
8
+ * - GET /pg/tables/{table}/indexes - Get table indexes
9
+ * - GET /pg/types - Get data types
10
+ */
11
+ export interface QueryResult {
12
+ rows: Record<string, unknown>[];
13
+ rowCount: number;
14
+ fields?: Array<{
15
+ name: string;
16
+ dataType: string;
17
+ }>;
18
+ }
19
+ export interface TableColumn {
20
+ name: string;
21
+ dataType: string;
22
+ isNullable: boolean;
23
+ defaultValue: string | null;
24
+ isPrimaryKey: boolean;
25
+ comment?: string;
26
+ }
27
+ export interface TableIndex {
28
+ name: string;
29
+ columns: string[];
30
+ isUnique: boolean;
31
+ isPrimary: boolean;
32
+ type: string;
33
+ }
34
+ export interface TableInfo {
35
+ schema: string;
36
+ name: string;
37
+ type: 'table' | 'view';
38
+ rowCount?: number;
39
+ comment?: string;
40
+ }
41
+ export interface MetaDriverOptions {
42
+ endpoint: string;
43
+ anonKey: string;
44
+ serviceRoleKey?: string;
45
+ tenantId?: string;
46
+ timeout?: number;
47
+ }
48
+ export declare class MetaDriver {
49
+ private client;
50
+ private anonKey;
51
+ private serviceRoleKey?;
52
+ private tenantId?;
53
+ constructor(options: MetaDriverOptions);
54
+ private getHeaders;
55
+ private handleError;
56
+ /**
57
+ * Execute SQL query
58
+ */
59
+ query(sql: string, useServiceRole?: boolean): Promise<QueryResult>;
60
+ /**
61
+ * List all tables in the database
62
+ */
63
+ listTables(useServiceRole?: boolean, schema?: string): Promise<TableInfo[]>;
64
+ /**
65
+ * Get table columns
66
+ */
67
+ getTableColumns(tableName: string, schema?: string, useServiceRole?: boolean): Promise<TableColumn[]>;
68
+ /**
69
+ * Get table indexes
70
+ */
71
+ getTableIndexes(tableName: string, schema?: string, useServiceRole?: boolean): Promise<TableIndex[]>;
72
+ /**
73
+ * Get database data types
74
+ */
75
+ getTypes(useServiceRole?: boolean): Promise<Record<string, string>>;
76
+ }
77
+ //# sourceMappingURL=meta.driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/meta.driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,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;CAClB;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;gBAEd,OAAO,EAAE,iBAAiB;IActC,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,WAAW;IAwBnB;;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"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Meta API Driver - PolarDB-X BaaS 元数据 API 客户端
3
+ *
4
+ * Endpoints:
5
+ * - POST /pg/query - Execute SQL query
6
+ * - GET /pg/tables - List tables
7
+ * - GET /pg/tables/{table}/columns - Get table columns
8
+ * - GET /pg/tables/{table}/indexes - Get table indexes
9
+ * - GET /pg/types - Get data types
10
+ */
11
+ import axios from 'axios';
12
+ /**
13
+ * PG-Meta returns BARE JSON arrays (pg-meta style), not a {data,error} envelope.
14
+ * Normalize either shape into a QueryResult.
15
+ */
16
+ function toQueryResult(body) {
17
+ if (Array.isArray(body)) {
18
+ const rows = body;
19
+ return {
20
+ rows,
21
+ rowCount: rows.length,
22
+ fields: rows.length > 0 ? Object.keys(rows[0]).map((name) => ({ name, dataType: 'unknown' })) : [],
23
+ };
24
+ }
25
+ const wrapped = body;
26
+ if (wrapped && typeof wrapped === 'object') {
27
+ if (wrapped.error)
28
+ throw new Error(`Query failed: ${wrapped.error}`);
29
+ if (wrapped.data)
30
+ return wrapped.data;
31
+ }
32
+ return { rows: [], rowCount: 0 };
33
+ }
34
+ function unwrapArray(body) {
35
+ if (Array.isArray(body))
36
+ return body;
37
+ const wrapped = body;
38
+ if (wrapped && typeof wrapped === 'object') {
39
+ if (wrapped.error)
40
+ throw new Error(String(wrapped.error));
41
+ return wrapped.data ?? [];
42
+ }
43
+ return [];
44
+ }
45
+ export class MetaDriver {
46
+ client;
47
+ anonKey;
48
+ serviceRoleKey;
49
+ tenantId;
50
+ constructor(options) {
51
+ this.anonKey = options.anonKey;
52
+ this.serviceRoleKey = options.serviceRoleKey;
53
+ this.tenantId = options.tenantId;
54
+ this.client = axios.create({
55
+ baseURL: `${options.endpoint}/pg`,
56
+ timeout: options.timeout ?? 30000,
57
+ headers: {
58
+ 'Content-Type': 'application/json',
59
+ },
60
+ });
61
+ }
62
+ getHeaders(useServiceRole = false) {
63
+ // Kong identifies the consumer via the `apikey` header (key-auth) and forwards
64
+ // `Authorization` downstream for JWT verification; both MUST carry the SAME key.
65
+ // Sending apikey=anon with Authorization=service_role makes Kong see the anon
66
+ // consumer, so admin-ACL routes like /pg/ return 403. Use one key for both.
67
+ const key = useServiceRole && this.serviceRoleKey ? this.serviceRoleKey : this.anonKey;
68
+ const headers = {
69
+ 'apikey': key,
70
+ 'Authorization': `Bearer ${key}`,
71
+ };
72
+ if (this.tenantId) {
73
+ headers['X-Tenant-Id'] = this.tenantId;
74
+ }
75
+ return headers;
76
+ }
77
+ handleError(error) {
78
+ if (axios.isAxiosError(error)) {
79
+ const axiosError = error;
80
+ const status = axiosError.response?.status;
81
+ const data = axiosError.response?.data;
82
+ let message = axiosError.message;
83
+ if (status === 401) {
84
+ message = 'Authentication failed. Please check your API keys and run "pxbaas login" again.';
85
+ }
86
+ else if (status === 403) {
87
+ message = 'Permission denied. You may need service_role key for this operation.';
88
+ }
89
+ else if (status === 404) {
90
+ message = 'Resource not found. Please check the table name and try again.';
91
+ }
92
+ else if (data?.error) {
93
+ message = String(data.error);
94
+ }
95
+ throw new Error(`Meta API error (${status ?? 'unknown'}): ${message}`);
96
+ }
97
+ throw error;
98
+ }
99
+ /**
100
+ * Execute SQL query
101
+ */
102
+ async query(sql, useServiceRole = false) {
103
+ try {
104
+ const response = await this.client.post('/query', { query: sql }, { headers: this.getHeaders(useServiceRole) });
105
+ return toQueryResult(response.data);
106
+ }
107
+ catch (error) {
108
+ this.handleError(error);
109
+ }
110
+ }
111
+ /**
112
+ * List all tables in the database
113
+ */
114
+ async listTables(useServiceRole = true, schema) {
115
+ try {
116
+ const response = await this.client.get('/tables', { headers: this.getHeaders(useServiceRole) });
117
+ const arr = unwrapArray(response.data);
118
+ const mapped = arr.map((t) => ({
119
+ schema: String(t.schema ?? 'public'),
120
+ name: String(t.name ?? t.table_name ?? ''),
121
+ type: (t.type === 'view' || t.table_type === 'VIEW') ? 'view' : 'table',
122
+ rowCount: t.live_rows_estimate != null ? Number(t.live_rows_estimate) : undefined,
123
+ comment: t.comment != null ? String(t.comment) : undefined,
124
+ }));
125
+ return schema ? mapped.filter((t) => t.schema === schema) : mapped;
126
+ }
127
+ catch (error) {
128
+ this.handleError(error);
129
+ }
130
+ }
131
+ /**
132
+ * Get table columns
133
+ */
134
+ async getTableColumns(tableName, schema = 'public', useServiceRole = true) {
135
+ // Use information_schema via /pg/query (reliable, schema-filtered) instead of
136
+ // the pg-meta /tables/{schema}.{table}/columns path (404 on this deployment).
137
+ const sql = `SELECT column_name AS name, data_type AS dataType, ` +
138
+ `CASE WHEN is_nullable='YES' THEN 1 ELSE 0 END AS isNullable, ` +
139
+ `column_default AS defaultValue, ` +
140
+ `CASE WHEN column_key='PRI' THEN 1 ELSE 0 END AS isPrimaryKey, ` +
141
+ `column_comment AS comment ` +
142
+ `FROM information_schema.columns ` +
143
+ `WHERE table_schema='${schema.replace(/'/g, "''")}' AND table_name='${tableName.replace(/'/g, "''")}' ` +
144
+ `ORDER BY ordinal_position`;
145
+ const r = await this.query(sql, useServiceRole);
146
+ return r.rows.map((row) => ({
147
+ name: String(row.name),
148
+ dataType: String(row.dataType),
149
+ isNullable: row.isNullable === 1 || row.isNullable === true,
150
+ defaultValue: row.defaultValue == null ? null : String(row.defaultValue),
151
+ isPrimaryKey: row.isPrimaryKey === 1 || row.isPrimaryKey === true,
152
+ comment: row.comment != null && row.comment !== '' ? String(row.comment) : undefined,
153
+ }));
154
+ }
155
+ /**
156
+ * Get table indexes
157
+ */
158
+ async getTableIndexes(tableName, schema = 'public', useServiceRole = true) {
159
+ const sql = `SELECT index_name AS name, ` +
160
+ `GROUP_CONCAT(column_name ORDER BY seq_in_index) AS cols, ` +
161
+ `CASE WHEN MIN(non_unique)=0 THEN 1 ELSE 0 END AS isUnique, ` +
162
+ `CASE WHEN index_name='PRIMARY' THEN 1 ELSE 0 END AS isPrimary ` +
163
+ `FROM information_schema.statistics ` +
164
+ `WHERE table_schema='${schema.replace(/'/g, "''")}' AND table_name='${tableName.replace(/'/g, "''")}' ` +
165
+ `GROUP BY index_name`;
166
+ const r = await this.query(sql, useServiceRole);
167
+ return r.rows.map((row) => ({
168
+ name: String(row.name),
169
+ columns: row.cols != null && row.cols !== '' ? String(row.cols).split(',') : [],
170
+ isUnique: row.isUnique === 1 || row.isUnique === true,
171
+ isPrimary: row.isPrimary === 1 || row.isPrimary === true,
172
+ type: 'BTREE',
173
+ }));
174
+ }
175
+ /**
176
+ * Get database data types
177
+ */
178
+ async getTypes(useServiceRole = false) {
179
+ try {
180
+ const response = await this.client.get('/types', { headers: this.getHeaders(useServiceRole) });
181
+ if (response.data.error) {
182
+ throw new Error(`Get types failed: ${response.data.error}`);
183
+ }
184
+ return response.data.data ?? {};
185
+ }
186
+ catch (error) {
187
+ this.handleError(error);
188
+ }
189
+ }
190
+ }
191
+ //# sourceMappingURL=meta.driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.driver.js","sourceRoot":"","sources":["../../src/drivers/meta.driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export type ShareLinkStatus = 'ACTIVE' | 'REVOKED' | 'EXPIRED';
2
+ export interface ShareLink {
3
+ id: string;
4
+ mount_id: string;
5
+ tenant_id: string;
6
+ function_slug: string;
7
+ status: ShareLinkStatus;
8
+ expires_at: string;
9
+ max_uses: number | null;
10
+ used_count: number;
11
+ session_generation: number;
12
+ created_by: string | null;
13
+ used_at: string | null;
14
+ revoked_at: string | null;
15
+ created_at: string;
16
+ updated_at: string;
17
+ }
18
+ /** Only create returns this short-lived capability; list/get/revoke never do. */
19
+ export interface CreatedShareLink extends ShareLink {
20
+ ticket: string;
21
+ }
22
+ export interface ShareLinksDriverOptions {
23
+ endpoint: string;
24
+ serviceRoleKey: string;
25
+ projectRef?: string;
26
+ timeout?: number;
27
+ }
28
+ export declare class ShareLinksDriver {
29
+ private readonly client;
30
+ constructor(options: ShareLinksDriverOptions);
31
+ create(functionSlug: string, options: {
32
+ expiresAt?: string;
33
+ expiresInSeconds?: number;
34
+ maxUses?: number;
35
+ tenantId?: string;
36
+ }): Promise<CreatedShareLink>;
37
+ list(functionSlug: string, tenantId?: string): Promise<ShareLink[]>;
38
+ get(functionSlug: string, shareId: string, tenantId?: string): Promise<ShareLink>;
39
+ revoke(functionSlug: string, shareId: string, tenantId?: string): Promise<ShareLink>;
40
+ private request;
41
+ }
42
+ //# sourceMappingURL=share-links.driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share-links.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/share-links.driver.ts"],"names":[],"mappings":"AAEA,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"}
@@ -0,0 +1,53 @@
1
+ import axios from 'axios';
2
+ export class ShareLinksDriver {
3
+ client;
4
+ constructor(options) {
5
+ this.client = axios.create({
6
+ baseURL: `${options.endpoint.replace(/\/$/, '')}/v1/projects/${options.projectRef ?? 'default'}`,
7
+ timeout: options.timeout ?? 30_000,
8
+ headers: { Authorization: `Bearer ${options.serviceRoleKey}` },
9
+ });
10
+ }
11
+ async create(functionSlug, options) {
12
+ const response = await this.request(() => this.client.post(`/functions/${encodeURIComponent(functionSlug)}/shares`, {
13
+ ...(options.expiresAt ? { expires_at: options.expiresAt } : {}),
14
+ ...(options.expiresInSeconds !== undefined
15
+ ? { expires_in_seconds: options.expiresInSeconds }
16
+ : {}),
17
+ ...(options.maxUses !== undefined ? { max_uses: options.maxUses } : {}),
18
+ ...(options.tenantId ? { tenant_id: options.tenantId } : {}),
19
+ }));
20
+ return response.data;
21
+ }
22
+ async list(functionSlug, tenantId) {
23
+ const response = await this.request(() => this.client.get(`/functions/${encodeURIComponent(functionSlug)}/shares`, {
24
+ params: tenantId ? { tenant_id: tenantId } : undefined,
25
+ }));
26
+ return response.data.shares ?? [];
27
+ }
28
+ async get(functionSlug, shareId, tenantId) {
29
+ const response = await this.request(() => this.client.get(`/functions/${encodeURIComponent(functionSlug)}/shares/${encodeURIComponent(shareId)}`, { params: tenantId ? { tenant_id: tenantId } : undefined }));
30
+ return response.data;
31
+ }
32
+ async revoke(functionSlug, shareId, tenantId) {
33
+ const response = await this.request(() => this.client.post(`/functions/${encodeURIComponent(functionSlug)}/shares/${encodeURIComponent(shareId)}/revoke`, tenantId ? { tenant_id: tenantId } : {}));
34
+ return response.data;
35
+ }
36
+ async request(operation) {
37
+ try {
38
+ return await operation();
39
+ }
40
+ catch (error) {
41
+ if (axios.isAxiosError(error)) {
42
+ const axiosError = error;
43
+ const status = axiosError.response?.status;
44
+ const message = axiosError.response?.data?.error?.message ??
45
+ axiosError.response?.data?.message ??
46
+ axiosError.message;
47
+ throw new Error(`Share API error (${status ?? 'unknown'}): ${message}`);
48
+ }
49
+ throw error;
50
+ }
51
+ }
52
+ }
53
+ //# sourceMappingURL=share-links.driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share-links.driver.js","sourceRoot":"","sources":["../../src/drivers/share-links.driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Storage Driver - Supabase Storage API client
3
+ *
4
+ * Endpoints:
5
+ * - GET /storage/v1/bucket - List buckets
6
+ * - GET /storage/v1/object/list/{bucket} - List objects
7
+ * - POST /storage/v1/object/{bucket}/{path} - Upload object
8
+ * - GET /storage/v1/object/{bucket}/{path} - Download object
9
+ * - DELETE /storage/v1/object/{bucket}/{path} - Delete object
10
+ * - POST /storage/v1/object/move - Move object
11
+ * - POST /storage/v1/object/copy - Copy object
12
+ */
13
+ export interface Bucket {
14
+ id: string;
15
+ name: string;
16
+ public: boolean;
17
+ created_at: string;
18
+ updated_at: string;
19
+ }
20
+ export interface StorageObject {
21
+ name: string;
22
+ id: string;
23
+ bucket_id: string;
24
+ owner: string;
25
+ created_at: string;
26
+ updated_at: string;
27
+ last_accessed_at: string;
28
+ metadata: Record<string, unknown>;
29
+ }
30
+ export interface StorageDriverOptions {
31
+ endpoint: string;
32
+ serviceRoleKey: string;
33
+ tenantId?: string;
34
+ timeout?: number;
35
+ }
36
+ export declare class StorageDriver {
37
+ private client;
38
+ private serviceRoleKey;
39
+ private tenantId?;
40
+ constructor(options: StorageDriverOptions);
41
+ private getHeaders;
42
+ private handleError;
43
+ /**
44
+ * List all buckets
45
+ */
46
+ listBuckets(): Promise<Bucket[]>;
47
+ /**
48
+ * List objects in a bucket
49
+ */
50
+ listObjects(bucket: string, prefix?: string): Promise<StorageObject[]>;
51
+ /**
52
+ * Upload a file to storage
53
+ */
54
+ upload(bucket: string, remotePath: string, localPath: string): Promise<void>;
55
+ /**
56
+ * Download a file from storage
57
+ */
58
+ download(bucket: string, remotePath: string, localPath: string): Promise<void>;
59
+ /**
60
+ * Delete an object from storage
61
+ */
62
+ delete(bucket: string, remotePath: string): Promise<void>;
63
+ /**
64
+ * Move/rename an object
65
+ */
66
+ move(sourceBucket: string, sourcePath: string, destBucket: string, destPath: string): Promise<void>;
67
+ /**
68
+ * Copy an object
69
+ */
70
+ copy(sourceBucket: string, sourcePath: string, destBucket: string, destPath: string): Promise<void>;
71
+ }
72
+ //# sourceMappingURL=storage.driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/storage.driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,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,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;CAClB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,CAAS;gBAEd,OAAO,EAAE,oBAAoB;IAczC,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,WAAW;IA0BnB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAatC;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAc5E;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBlF;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBpF;;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"}