@gensx/storage
Version:
Cloud storage, blobs, sqlite, and vector database providers/hooks for GenSX.
1 lines • 21.6 kB
Source Map (JSON)
{"version":3,"file":"remote.cjs","sources":["@gensx/storage/../../../../src/database/remote.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/only-throw-error */\n\nimport { readConfig } from \"@gensx/core\";\nimport { InArgs } from \"@libsql/client\";\n\nimport { parseErrorResponse } from \"../utils/parse-error.js\";\nimport { USER_AGENT } from \"../utils/user-agent.js\";\nimport {\n Database,\n DatabaseBatchResult,\n DatabaseError,\n DatabaseInfo,\n DatabaseInternalError,\n DatabaseNetworkError,\n DatabaseResult,\n DatabaseStatement,\n DatabaseStorage,\n DeleteDatabaseResult,\n EnsureDatabaseResult,\n} from \"./types.js\";\n\n/**\n * Base URL for the GenSX Console API\n */\nconst API_BASE_URL = \"https://api.gensx.com\";\n\n/**\n * Helper to convert between API errors and DatabaseErrors\n */\nfunction handleApiError(err: unknown, operation: string): never {\n if (err instanceof DatabaseError) {\n throw err;\n }\n if (err instanceof Error) {\n throw new DatabaseNetworkError(\n `Error during ${operation}: ${err.message}`,\n err,\n );\n }\n throw new DatabaseNetworkError(`Error during ${operation}: ${String(err)}`);\n}\n\n/**\n * Implementation of Database interface for remote cloud storage\n */\nexport class RemoteDatabase implements Database {\n private databaseName: string;\n private baseUrl: string;\n private apiKey: string;\n private org: string;\n private project: string;\n private environment: string;\n\n constructor(\n databaseName: string,\n baseUrl: string,\n apiKey: string,\n org: string,\n project: string,\n environment: string,\n ) {\n this.databaseName = encodeURIComponent(databaseName);\n this.baseUrl = baseUrl;\n this.apiKey = apiKey;\n this.org = org;\n this.project = project;\n this.environment = environment;\n }\n\n async execute(sql: string, params?: InArgs): Promise<DatabaseResult> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/database/${this.databaseName}/execute`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": USER_AGENT,\n },\n body: JSON.stringify({\n sql,\n params,\n }),\n },\n );\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new DatabaseInternalError(`Failed to execute SQL: ${message}`);\n }\n\n const data = (await response.json()) as DatabaseResult;\n return data;\n } catch (err) {\n throw handleApiError(err, \"execute\");\n }\n }\n\n async batch(statements: DatabaseStatement[]): Promise<DatabaseBatchResult> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/database/${this.databaseName}/batch`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": USER_AGENT,\n },\n body: JSON.stringify({ statements }),\n },\n );\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new DatabaseInternalError(`Failed to execute batch: ${message}`);\n }\n\n const data = (await response.json()) as DatabaseBatchResult;\n return data;\n } catch (err) {\n throw handleApiError(err, \"batch\");\n }\n }\n\n async executeMultiple(sql: string): Promise<DatabaseBatchResult> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/database/${this.databaseName}/multiple`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": USER_AGENT,\n },\n body: JSON.stringify({ sql }),\n },\n );\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new DatabaseInternalError(\n `Failed to execute multiple: ${message}`,\n );\n }\n\n const data = (await response.json()) as DatabaseBatchResult;\n return data;\n } catch (err) {\n throw handleApiError(err, \"executeMultiple\");\n }\n }\n\n async migrate(sql: string): Promise<DatabaseBatchResult> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/database/${this.databaseName}/migrate`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": USER_AGENT,\n },\n body: JSON.stringify({ sql }),\n },\n );\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new DatabaseInternalError(\n `Failed to execute migration: ${message}`,\n );\n }\n\n const data = (await response.json()) as DatabaseBatchResult;\n return data;\n } catch (err) {\n throw handleApiError(err, \"migrate\");\n }\n }\n\n async getInfo(): Promise<DatabaseInfo> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/database/${this.databaseName}/info`,\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": USER_AGENT,\n },\n },\n );\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new DatabaseInternalError(\n `Failed to get database info: ${message}`,\n );\n }\n\n const data = (await response.json()) as DatabaseInfo;\n\n // Convert date string to Date object\n const { lastModified, ...rest } = data;\n return {\n ...rest,\n lastModified: new Date(lastModified as unknown as string),\n };\n } catch (err) {\n throw handleApiError(err, \"getInfo\");\n }\n }\n\n close() {\n // No-op for remote database - connection is managed by API\n return;\n }\n}\n\n/**\n * Implementation of DatabaseStorage interface for remote cloud storage\n */\nexport class RemoteDatabaseStorage implements DatabaseStorage {\n private apiKey: string;\n private apiBaseUrl: string;\n private org: string;\n private project: string;\n private environment: string;\n private databases: Map<string, RemoteDatabase> = new Map<\n string,\n RemoteDatabase\n >();\n\n constructor(project: string, environment: string) {\n this.project = project;\n this.environment = environment;\n\n const config = readConfig();\n\n this.apiKey = process.env.GENSX_API_KEY ?? config.api?.token ?? \"\";\n if (!this.apiKey) {\n throw new Error(\n \"GENSX_API_KEY environment variable must be set for cloud storage\",\n );\n }\n\n this.org = process.env.GENSX_ORG ?? config.api?.org ?? \"\";\n if (!this.org) {\n throw new Error(\n \"Organization ID must be provided via props or GENSX_ORG environment variable\",\n );\n }\n\n this.apiBaseUrl =\n process.env.GENSX_API_BASE_URL ?? config.api?.baseUrl ?? API_BASE_URL;\n }\n\n getDatabase(name: string): Database {\n if (!this.databases.has(name)) {\n this.databases.set(\n name,\n new RemoteDatabase(\n name,\n this.apiBaseUrl,\n this.apiKey,\n this.org,\n this.project,\n this.environment,\n ),\n );\n }\n\n return this.databases.get(name)!;\n }\n\n async listDatabases(options?: { limit?: number; cursor?: string }): Promise<{\n databases: { name: string; createdAt: Date }[];\n nextCursor?: string;\n }> {\n try {\n const url = new URL(\n `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/database`,\n );\n\n if (options?.limit) {\n url.searchParams.append(\"limit\", options.limit.toString());\n }\n\n if (options?.cursor) {\n url.searchParams.append(\"cursor\", options.cursor);\n }\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new DatabaseInternalError(`Failed to list databases: ${message}`);\n }\n\n const data = (await response.json()) as {\n databases: { name: string; createdAt: string }[];\n nextCursor?: string;\n };\n\n return {\n databases: data.databases.map((db) => ({\n name: decodeURIComponent(db.name),\n createdAt: new Date(db.createdAt),\n })),\n ...(data.nextCursor && { nextCursor: data.nextCursor }),\n };\n } catch (err) {\n throw handleApiError(err, \"listDatabases\");\n }\n }\n\n async ensureDatabase(name: string): Promise<EnsureDatabaseResult> {\n try {\n const response = await fetch(\n `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/database/${encodeURIComponent(\n name,\n )}/ensure`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": USER_AGENT,\n },\n },\n );\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new DatabaseInternalError(\n `Failed to ensure database: ${message}`,\n );\n }\n\n const data = (await response.json()) as EnsureDatabaseResult;\n\n // Make sure the database is in our cache\n if (!this.databases.has(name)) {\n this.getDatabase(name);\n }\n\n return data;\n } catch (err) {\n if (err instanceof DatabaseError) {\n throw err;\n }\n throw new DatabaseNetworkError(\n `Error during ensureDatabase operation: ${String(err)}`,\n err as Error,\n );\n }\n }\n\n hasEnsuredDatabase(name: string): boolean {\n return this.databases.has(name);\n }\n\n async deleteDatabase(name: string): Promise<DeleteDatabaseResult> {\n try {\n const response = await fetch(\n `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/database/${encodeURIComponent(\n name,\n )}`,\n {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": USER_AGENT,\n },\n },\n );\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new DatabaseInternalError(\n `Failed to delete database: ${message}`,\n );\n }\n\n const data = (await response.json()) as DeleteDatabaseResult;\n\n // Remove database from caches if it was successfully deleted\n if (data.deleted) {\n if (this.databases.has(name)) {\n const db = this.databases.get(name);\n if (db) {\n db.close();\n this.databases.delete(name);\n }\n }\n }\n\n return data;\n } catch (err) {\n if (err instanceof DatabaseError) {\n throw err;\n }\n throw new DatabaseNetworkError(\n `Error during deleteDatabase operation: ${String(err)}`,\n err as Error,\n );\n }\n }\n}\n"],"names":["DatabaseError","DatabaseNetworkError","USER_AGENT","parseErrorResponse","DatabaseInternalError","readConfig"],"mappings":"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"}