{"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 { 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        throw new BlobInternalError(\n          `Failed to get blob: ${response.statusText}`,\n        );\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        throw new BlobInternalError(\n          `Failed to get blob: ${response.statusText}`,\n        );\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        throw new BlobInternalError(\n          `Failed to get blob: ${response.statusText}`,\n        );\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        throw new BlobInternalError(\n          `Failed to get blob: ${response.statusText}`,\n        );\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        throw new BlobInternalError(\n          `Failed to put blob: ${response.statusText}`,\n        );\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        throw new BlobInternalError(\n          `Failed to put blob: ${response.statusText}`,\n        );\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        throw new BlobInternalError(\n          `Failed to put blob: ${response.statusText}`,\n        );\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        throw new BlobInternalError(\n          `Failed to put blob: ${response.statusText}`,\n        );\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        throw new BlobInternalError(\n          `Failed to delete blob: ${response.statusText}`,\n        );\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        throw new BlobInternalError(\n          `Failed to get metadata: ${response.statusText}`,\n        );\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        throw new BlobInternalError(\n          `Failed to update metadata: ${response.statusText}`,\n        );\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        handleApiError(response, \"listBlobs\");\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","BlobInternalError","Readable","BlobConflictError","readConfig"],"mappings":"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"}