UNPKG

@gensx/storage

Version:

Cloud storage, blobs, sqlite, and vector database providers/hooks for GenSX.

1 lines 36.3 kB
{"version":3,"file":"remote.cjs","sources":["@gensx/storage/../../../../src/blob/remote.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/only-throw-error */\n\nimport { Readable } from \"stream\";\n\nimport { readConfig } from \"@gensx/core\";\n\nimport { parseErrorResponse } from \"../utils/parse-error.js\";\nimport { USER_AGENT } from \"../utils/user-agent.js\";\nimport {\n Blob,\n BlobConflictError,\n BlobError,\n BlobInternalError,\n BlobNetworkError,\n BlobOptions,\n BlobResponse,\n BlobStorage,\n DeleteBlobResult,\n ListBlobsOptions,\n ListBlobsResponse,\n} from \"./types.js\";\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 BlobErrors\n */\nfunction handleApiError(err: unknown, operation: string): never {\n if (err instanceof BlobError) {\n throw err;\n }\n if (err instanceof Error) {\n throw new BlobNetworkError(\n `Error during ${operation}: ${err.message}`,\n err,\n );\n }\n throw new BlobNetworkError(`Error during ${operation}: ${String(err)}`);\n}\n\n/**\n * Implementation of Blob interface for remote cloud storage\n */\nexport class RemoteBlob<T> implements Blob<T> {\n private key: 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 key: string,\n baseUrl: string,\n apiKey: string,\n org: string,\n project: string,\n environment: string,\n ) {\n this.key = encodeURIComponent(key);\n this.baseUrl = baseUrl;\n this.apiKey = apiKey;\n this.org = org;\n this.project = project;\n this.environment = environment;\n }\n\n async getJSON(): Promise<T | null> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/blob/${this.key}`,\n {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": USER_AGENT,\n },\n },\n );\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new BlobInternalError(`Failed to get blob: ${message}`);\n }\n\n const data = (await response.json()) as BlobResponse<string>;\n\n // Parse the content as JSON since it's stored as a string\n return JSON.parse(data.content) as T;\n } catch (err) {\n throw handleApiError(err, \"getJSON\");\n }\n }\n\n async getString(): Promise<string | null> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/blob/${this.key}`,\n {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": USER_AGENT,\n },\n },\n );\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new BlobInternalError(`Failed to get blob: ${message}`);\n }\n\n const data = (await response.json()) as BlobResponse<string>;\n\n return data.content;\n } catch (err) {\n throw handleApiError(err, \"getString\");\n }\n }\n\n async getRaw(): Promise<BlobResponse<Buffer> | null> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/blob/${this.key}`,\n {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": USER_AGENT,\n },\n },\n );\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new BlobInternalError(`Failed to get blob: ${message}`);\n }\n\n const data = (await response.json()) as {\n content: string;\n contentType?: string;\n etag?: string;\n lastModified?: string;\n size?: number;\n metadata?: Record<string, string>;\n };\n\n const {\n content,\n contentType,\n etag,\n lastModified,\n size,\n metadata = {},\n } = data;\n\n // Always decode base64 for raw data\n const buffer = Buffer.from(content, \"base64\");\n\n return {\n content: buffer,\n contentType,\n etag,\n lastModified: lastModified ? new Date(lastModified) : undefined,\n size,\n metadata: Object.fromEntries(\n Object.entries(metadata).filter(([key]) => key !== \"isBase64\"),\n ),\n };\n } catch (err) {\n throw handleApiError(err, \"getRaw\");\n }\n }\n\n async getStream(): Promise<Readable> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/blob/${this.key}`,\n {\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 BlobInternalError(`Failed to get blob: ${message}`);\n }\n\n if (!response.body) {\n throw new BlobInternalError(\"Response body is null\");\n }\n\n return Readable.from(response.body);\n } catch (err) {\n throw handleApiError(err, \"getStream\");\n }\n }\n\n async putJSON(value: T, options?: BlobOptions): Promise<{ etag: string }> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/blob/${this.key}`,\n {\n method: \"PUT\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n ...(options?.etag && { \"If-Match\": options.etag }),\n \"User-Agent\": USER_AGENT,\n },\n body: JSON.stringify({\n content: JSON.stringify(value),\n contentType: \"application/json\",\n metadata: options?.metadata,\n }),\n },\n );\n\n if (!response.ok) {\n if (response.status === 412) {\n throw new BlobConflictError(\"ETag mismatch\");\n }\n const message = await parseErrorResponse(response);\n throw new BlobInternalError(`Failed to put blob: ${message}`);\n }\n\n const etag = response.headers.get(\"etag\");\n if (!etag) {\n throw new BlobInternalError(\"No ETag returned from server\");\n }\n\n return { etag };\n } catch (err) {\n throw handleApiError(err, \"putJSON\");\n }\n }\n\n async putString(\n value: string,\n options?: BlobOptions,\n ): Promise<{ etag: string }> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/blob/${this.key}`,\n {\n method: \"PUT\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n ...(options?.etag && { \"If-Match\": options.etag }),\n \"User-Agent\": USER_AGENT,\n },\n body: JSON.stringify({\n content: value,\n contentType: \"text/plain\",\n metadata: options?.metadata,\n }),\n },\n );\n\n if (!response.ok) {\n if (response.status === 412) {\n throw new BlobConflictError(\"ETag mismatch\");\n }\n const message = await parseErrorResponse(response);\n throw new BlobInternalError(`Failed to put blob: ${message}`);\n }\n\n const etag = response.headers.get(\"etag\");\n if (!etag) {\n throw new BlobInternalError(\"No ETag returned from server\");\n }\n\n return { etag };\n } catch (err) {\n throw handleApiError(err, \"putString\");\n }\n }\n\n /**\n * Put raw binary data into the blob.\n * @param value The binary data to store\n * @param options Optional metadata and content type\n */\n async putRaw(\n value: Buffer,\n options?: BlobOptions,\n ): Promise<{ etag: string }> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/blob/${this.key}`,\n {\n method: \"PUT\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n ...(options?.etag && { \"If-Match\": options.etag }),\n \"User-Agent\": USER_AGENT,\n },\n body: JSON.stringify({\n content: value.toString(\"base64\"),\n contentType: options?.contentType ?? \"application/octet-stream\",\n metadata: {\n ...(options?.metadata ?? {}),\n isBase64: \"true\",\n },\n }),\n },\n );\n\n if (!response.ok) {\n if (response.status === 412) {\n throw new BlobConflictError(\"ETag mismatch\");\n }\n const message = await parseErrorResponse(response);\n throw new BlobInternalError(`Failed to put blob: ${message}`);\n }\n\n const etag = response.headers.get(\"etag\");\n if (!etag) {\n throw new BlobInternalError(\"No ETag returned from server\");\n }\n\n return { etag };\n } catch (err) {\n throw handleApiError(err, \"putRaw\");\n }\n }\n\n async putStream(\n stream: Readable,\n options?: BlobOptions,\n ): Promise<{ etag: string }> {\n try {\n // Convert stream to buffer - necessary for the current API implementation\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.from(chunk as ArrayBufferLike));\n }\n const buffer = Buffer.concat(chunks);\n\n // Send the buffer as base64-encoded content\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/blob/${this.key}`,\n {\n method: \"PUT\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n ...(options?.etag && { \"If-Match\": options.etag }),\n \"User-Agent\": USER_AGENT,\n },\n body: JSON.stringify({\n content: buffer.toString(\"base64\"),\n contentType: options?.contentType ?? \"application/octet-stream\",\n metadata: {\n ...(options?.metadata ?? {}),\n isBase64: \"true\",\n },\n }),\n },\n );\n\n if (!response.ok) {\n if (response.status === 412) {\n throw new BlobConflictError(\"ETag mismatch\");\n }\n const message = await parseErrorResponse(response);\n throw new BlobInternalError(`Failed to put blob: ${message}`);\n }\n\n const etag = response.headers.get(\"etag\");\n if (!etag) {\n throw new BlobInternalError(\"No ETag returned from server\");\n }\n\n return { etag };\n } catch (err) {\n throw handleApiError(err, \"putStream\");\n }\n }\n\n async delete(): Promise<void> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/blob/${this.key}`,\n {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": USER_AGENT,\n },\n },\n );\n\n if (!response.ok && response.status !== 404) {\n const message = await parseErrorResponse(response);\n throw new BlobInternalError(`Failed to delete blob: ${message}`);\n }\n } catch (err) {\n throw handleApiError(err, \"delete\");\n }\n }\n\n async exists(): Promise<boolean> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/blob/${this.key}`,\n {\n method: \"HEAD\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n },\n );\n\n return response.ok;\n } catch (err) {\n throw handleApiError(err, \"exists\");\n }\n }\n\n async getMetadata(): Promise<Record<string, string> | null> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/blob/${this.key}`,\n {\n method: \"HEAD\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"User-Agent\": USER_AGENT,\n },\n },\n );\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n const message = await parseErrorResponse(response);\n throw new BlobInternalError(`Failed to get metadata: ${message}`);\n }\n\n // Extract standard headers\n const metadata: Record<string, string> = {};\n\n // Get etag from standard headers\n const etag = response.headers.get(\"etag\");\n if (etag) {\n metadata.etag = etag;\n }\n\n // Get custom metadata from individual x-blob-meta-* headers\n for (const [name, value] of Object.entries(\n Object.fromEntries(response.headers),\n )) {\n if (name.toLowerCase().startsWith(\"x-blob-meta-\")) {\n const metaKey = name.substring(\"x-blob-meta-\".length);\n if (metaKey === \"content-type\") {\n metadata.contentType = value;\n } else {\n metadata[metaKey] = value;\n }\n }\n }\n\n return Object.keys(metadata).length > 0 ? metadata : null;\n } catch (err) {\n throw handleApiError(err, \"getMetadata\");\n }\n }\n\n async updateMetadata(\n metadata: Record<string, string>,\n options?: BlobOptions,\n ): Promise<void> {\n try {\n const response = await fetch(\n `${this.baseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/blob/${this.key}`,\n {\n method: \"PATCH\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n ...(options?.etag && { \"If-Match\": options.etag }),\n \"User-Agent\": USER_AGENT,\n },\n body: JSON.stringify({\n metadata,\n }),\n },\n );\n\n if (!response.ok) {\n if (response.status === 412) {\n throw new BlobConflictError(\"ETag mismatch\");\n }\n const message = await parseErrorResponse(response);\n throw new BlobInternalError(`Failed to update metadata: ${message}`);\n }\n } catch (err) {\n throw handleApiError(err, \"updateMetadata\");\n }\n }\n}\n\n/**\n * Remote implementation of blob storage using GenSX Console API\n */\nexport class RemoteBlobStorage implements BlobStorage {\n private apiKey: string;\n private apiBaseUrl: string;\n private org: string;\n private project: string;\n private environment: string;\n private defaultPrefix?: string;\n constructor(project: string, environment: string, defaultPrefix?: string) {\n this.project = project;\n this.environment = environment;\n this.defaultPrefix = defaultPrefix;\n // readConfig has internal error handling and always returns a GensxConfig object\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 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 getBlob<T>(key: string): Blob<T> {\n const fullKey = this.defaultPrefix ? `${this.defaultPrefix}/${key}` : key;\n return new RemoteBlob<T>(\n fullKey,\n this.apiBaseUrl,\n this.apiKey,\n this.org,\n this.project,\n this.environment,\n );\n }\n\n async listBlobs(options?: ListBlobsOptions): Promise<ListBlobsResponse> {\n try {\n // Normalize prefixes by removing trailing slashes\n const normalizedDefaultPrefix = this.defaultPrefix?.replace(/\\/$/, \"\");\n const normalizedPrefix = options?.prefix?.replace(/\\/$/, \"\");\n\n // Build the search prefix\n const searchPrefix = normalizedDefaultPrefix\n ? normalizedPrefix\n ? `${normalizedDefaultPrefix}/${normalizedPrefix}`\n : normalizedDefaultPrefix\n : (normalizedPrefix ?? \"\");\n\n // Build query parameters\n const queryParams = new URLSearchParams();\n if (searchPrefix) {\n queryParams.append(\"prefix\", searchPrefix);\n }\n\n // Default to 100 documents if no limit is specified\n queryParams.append(\"limit\", (options?.limit ?? 100).toString());\n\n if (options?.cursor) {\n queryParams.append(\"cursor\", options.cursor);\n }\n\n const response = await fetch(\n `${this.apiBaseUrl}/org/${this.org}/projects/${this.project}/environments/${this.environment}/blob?${queryParams.toString()}`,\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 BlobInternalError(`Failed to list blobs: ${message}`);\n }\n\n const data = (await response.json()) as {\n blobs: { key: string; lastModified: string; size: number }[];\n nextCursor?: string;\n };\n\n // Process blob keys to handle the default prefix\n let processedBlobs: {\n key: string;\n lastModified: string;\n size: number;\n }[] = [];\n if (normalizedDefaultPrefix) {\n processedBlobs = data.blobs\n .filter(\n (blob) =>\n blob.key === normalizedDefaultPrefix ||\n blob.key.startsWith(`${normalizedDefaultPrefix}/`),\n )\n .map((blob) => ({\n ...blob,\n key:\n blob.key === normalizedDefaultPrefix\n ? \"\"\n : blob.key.slice(normalizedDefaultPrefix.length + 1),\n }));\n } else {\n processedBlobs = data.blobs;\n }\n\n return {\n blobs: processedBlobs,\n nextCursor: data.nextCursor,\n };\n } catch (err) {\n if (err instanceof BlobError) {\n throw err;\n }\n throw new BlobNetworkError(\n `Error during listBlobs operation: ${String(err)}`,\n err as Error,\n );\n }\n }\n\n async blobExists(key: string): Promise<boolean> {\n const blob = this.getBlob(key);\n return blob.exists();\n }\n\n async deleteBlob(key: string): Promise<DeleteBlobResult> {\n try {\n const blob = this.getBlob(key);\n await blob.delete();\n return { deleted: true };\n } catch (err) {\n if (err instanceof BlobError) {\n throw err;\n }\n throw new BlobNetworkError(\n `Error during deleteBlob operation: ${String(err)}`,\n err as Error,\n );\n }\n }\n}\n"],"names":["BlobError","BlobNetworkError","USER_AGENT","parseErrorResponse","BlobInternalError","Readable","BlobConflictError","readConfig"],"mappings":"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"}