@cubis/vfsclient 0.0.1 → 0.0.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.
- package/dist/index.cjs +53 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -1
- package/dist/index.d.ts +14 -1
- package/dist/index.js +50 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/errors.ts","../src/http/error.ts","../src/http/client.ts","../src/cache/memory.ts","../src/cache/browser.ts","../src/cache/filesystem.ts","../src/cache/factory.ts","../src/crypto/hash.ts","../src/upload/normalizer.ts","../src/upload/preflight.ts","../src/upload/single.ts","../src/upload/session.ts","../src/upload/queue.ts","../src/client.ts"],"names":["expiresAt"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Problem details (RFC 7807) and SDK error definitions.\n */\n\nexport interface ProblemDetails {\n type?: string;\n title?: string;\n status?: number;\n detail?: string;\n instance?: string;\n extensions?: {\n trace_id?: string;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\nexport class VFSError extends Error {\n readonly status: number;\n readonly code?: string;\n readonly problem?: ProblemDetails;\n readonly headers?: Headers;\n\n constructor(\n message: string,\n options?: {\n status?: number;\n code?: string;\n problem?: ProblemDetails;\n headers?: Headers;\n cause?: unknown;\n }\n ) {\n super(message);\n this.name = 'VFSError';\n this.status = options?.status ?? 500;\n this.code = options?.code;\n this.problem = options?.problem;\n this.headers = options?.headers;\n\n if (options?.cause) {\n this.cause = options.cause;\n }\n\n Object.setPrototypeOf(this, VFSError.prototype);\n }\n\n /**\n * Helper to check if error is a specific HTTP status code.\n */\n is(status: number): boolean {\n return this.status === status;\n }\n}\n","import { VFSError, type ProblemDetails } from '../types/errors';\n\n/**\n * Parses an HTTP Response into a structured VFSError with RFC 7807 Problem Details.\n */\nexport async function parseHttpError(res: Response): Promise<VFSError> {\n const status = res.status;\n const contentType = res.headers.get('content-type') || '';\n let errorMessage = res.statusText || `Request failed with status ${status}`;\n let problemDetails: ProblemDetails | undefined;\n let code: string | undefined;\n\n try {\n if (contentType.includes('application/json') || contentType.includes('application/problem+json')) {\n const json = await res.json();\n if (json && typeof json === 'object') {\n problemDetails = json as ProblemDetails;\n\n if (problemDetails.detail) {\n errorMessage = problemDetails.detail;\n } else if (problemDetails.title) {\n errorMessage = problemDetails.title;\n } else if ((json as { error?: string }).error) {\n errorMessage = (json as { error: string }).error;\n } else if ((json as { message?: string }).message) {\n errorMessage = (json as { message: string }).message;\n }\n\n if (problemDetails.extensions?.code && typeof problemDetails.extensions.code === 'string') {\n code = problemDetails.extensions.code;\n }\n }\n } else {\n const text = await res.text();\n if (text) {\n errorMessage = text;\n }\n }\n } catch {\n // Keep fallback statusText if body cannot be parsed\n }\n\n return new VFSError(errorMessage, {\n status,\n code,\n problem: problemDetails,\n headers: res.headers,\n });\n}\n","import type { VFSClientOptions } from '../types';\nimport { VFSError } from '../types/errors';\nimport { parseHttpError } from './error';\n\nexport interface RequestOptions {\n headers?: Record<string, string>;\n params?: Record<string, string | number | boolean | undefined | null>;\n body?: BodyInit | null;\n timeout?: number;\n signal?: AbortSignal;\n skipAuth?: boolean;\n}\n\nexport interface HttpResponse<T = unknown> {\n data: T;\n status: number;\n statusText: string;\n headers: Headers;\n totalCount?: number;\n}\n\nexport class HttpClient {\n private readonly endpoint: string;\n private readonly apiKey?: string;\n private readonly apiHash?: string;\n private readonly defaultTimeout: number;\n private readonly fetchImpl: typeof fetch;\n private readonly debug?: (message: string, ...args: unknown[]) => void;\n private readonly maxRetries: number;\n private readonly retryDelay: number;\n private readonly retryOnStatus: number[];\n\n constructor(options: VFSClientOptions) {\n if (!options.endpoint) {\n throw new VFSError('Endpoint URL is required', { status: 400 });\n }\n this.endpoint = options.endpoint.replace(/\\/+$/, '');\n this.apiKey = options.apiKey;\n this.apiHash = options.apiHash;\n this.defaultTimeout = options.timeout ?? 30000;\n this.fetchImpl = options.fetch ?? globalThis.fetch;\n\n if (typeof options.debug === 'function') {\n this.debug = options.debug;\n } else if (options.debug === true) {\n this.debug = (msg, ...args) => console.debug(`[VFSClient] ${msg}`, ...args);\n }\n\n this.maxRetries = options.retry?.maxRetries ?? 2;\n this.retryDelay = options.retry?.retryDelay ?? 500;\n this.retryOnStatus = options.retry?.retryOnStatus ?? [502, 503, 504];\n }\n\n getEndpoint(): string {\n return this.endpoint;\n }\n\n getApiKey(): string | undefined {\n return this.apiKey;\n }\n\n getApiHash(): string | undefined {\n return this.apiHash;\n }\n\n private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined | null>): string {\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${this.endpoint}${cleanPath}`);\n\n if (params) {\n for (const [key, val] of Object.entries(params)) {\n if (val !== undefined && val !== null) {\n url.searchParams.append(key, String(val));\n }\n }\n }\n\n return url.toString();\n }\n\n private buildHeaders(customHeaders?: Record<string, string>, skipAuth?: boolean): Headers {\n const headers = new Headers();\n\n if (!skipAuth) {\n if (this.apiKey) {\n headers.set('x-api-key', this.apiKey);\n }\n if (this.apiHash) {\n headers.set('x-api-hash', this.apiHash);\n }\n }\n\n if (customHeaders) {\n for (const [key, value] of Object.entries(customHeaders)) {\n headers.set(key, value);\n }\n }\n\n return headers;\n }\n\n async request<T = unknown>(method: string, path: string, options: RequestOptions = {}): Promise<HttpResponse<T>> {\n const url = this.buildUrl(path, options.params);\n const headers = this.buildHeaders(options.headers, options.skipAuth);\n const timeoutMs = options.timeout ?? this.defaultTimeout;\n\n let attempt = 0;\n let lastError: unknown;\n\n while (attempt <= this.maxRetries) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(new Error('Request timed out')), timeoutMs);\n\n // Link external AbortSignal if provided\n if (options.signal) {\n options.signal.addEventListener('abort', () => controller.abort(options.signal?.reason), { once: true });\n }\n\n this.debug?.(`${method} ${url} (Attempt ${attempt + 1}/${this.maxRetries + 1})`);\n\n try {\n const res = await this.fetchImpl(url, {\n method,\n headers,\n body: options.body,\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n if (!res.ok) {\n // Check if retryable\n if (attempt < this.maxRetries && this.retryOnStatus.includes(res.status)) {\n attempt++;\n const backoff = this.retryDelay * Math.pow(2, attempt - 1);\n this.debug?.(`HTTP ${res.status} on ${method} ${url}. Retrying in ${backoff}ms...`);\n await new Promise((resolve) => setTimeout(resolve, backoff));\n continue;\n }\n\n throw await parseHttpError(res);\n }\n\n // Parse successful response\n let data: T;\n const contentType = res.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n data = (await res.json()) as T;\n } else if (contentType.includes('text/')) {\n data = (await res.text()) as unknown as T;\n } else {\n // Return raw Response or Blob based on caller expectation\n data = res as unknown as T;\n }\n\n let totalCount: number | undefined;\n const totalCountHeader = res.headers.get('x-total-count');\n if (totalCountHeader) {\n const parsed = parseInt(totalCountHeader, 10);\n if (!isNaN(parsed)) {\n totalCount = parsed;\n }\n }\n\n return {\n data,\n status: res.status,\n statusText: res.statusText,\n headers: res.headers,\n totalCount,\n };\n } catch (err: unknown) {\n clearTimeout(timer);\n\n if (err instanceof VFSError) {\n throw err;\n }\n\n lastError = err;\n const isAbort = options.signal?.aborted;\n if (isAbort) {\n throw new VFSError('Request was aborted by caller', { status: 499, cause: err });\n }\n\n if (attempt < this.maxRetries) {\n attempt++;\n const backoff = this.retryDelay * Math.pow(2, attempt - 1);\n this.debug?.(`Network error on ${method} ${url}. Retrying in ${backoff}ms...`, err);\n await new Promise((resolve) => setTimeout(resolve, backoff));\n continue;\n }\n\n throw new VFSError(err instanceof Error ? err.message : 'Network request failed', {\n status: 0,\n cause: err,\n });\n }\n }\n\n throw lastError instanceof VFSError\n ? lastError\n : new VFSError('Request failed after retries', { status: 500, cause: lastError });\n }\n\n get<T = unknown>(path: string, options?: RequestOptions): Promise<HttpResponse<T>> {\n return this.request<T>('GET', path, options);\n }\n\n post<T = unknown>(path: string, body?: BodyInit | null, options?: RequestOptions): Promise<HttpResponse<T>> {\n return this.request<T>('POST', path, { ...options, body });\n }\n\n put<T = unknown>(path: string, body?: BodyInit | null, options?: RequestOptions): Promise<HttpResponse<T>> {\n return this.request<T>('PUT', path, { ...options, body });\n }\n\n delete<T = unknown>(path: string, options?: RequestOptions): Promise<HttpResponse<T>> {\n return this.request<T>('DELETE', path, options);\n }\n\n /**\n * Fetches raw Response object directly (useful for streaming file downloads).\n */\n async fetchRaw(path: string, options: RequestOptions = {}): Promise<Response> {\n const url = this.buildUrl(path, options.params);\n const headers = this.buildHeaders(options.headers, options.skipAuth);\n const timeoutMs = options.timeout ?? this.defaultTimeout;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(new Error('Request timed out')), timeoutMs);\n\n if (options.signal) {\n options.signal.addEventListener('abort', () => controller.abort(options.signal?.reason), { once: true });\n }\n\n try {\n const res = await this.fetchImpl(url, {\n method: 'GET',\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n if (!res.ok) {\n throw await parseHttpError(res);\n }\n\n return res;\n } catch (err: unknown) {\n clearTimeout(timer);\n if (err instanceof VFSError) {\n throw err;\n }\n throw new VFSError(err instanceof Error ? err.message : 'Download failed', {\n status: 0,\n cause: err,\n });\n }\n }\n}\n","import type { VFSCacheAdapter, VFSCacheEntry } from './adapter';\n\nexport interface MemoryCacheOptions {\n /**\n * Maximum number of items in cache (default: 200).\n */\n maxItems?: number;\n\n /**\n * Default TTL in seconds (default: 3600 = 1 hour, 0 for indefinite).\n */\n defaultTTL?: number;\n}\n\nexport class MemoryCacheAdapter implements VFSCacheAdapter {\n private readonly store = new Map<string, VFSCacheEntry>();\n private readonly maxItems: number;\n private readonly defaultTTL: number;\n\n constructor(options: MemoryCacheOptions = {}) {\n this.maxItems = options.maxItems ?? 200;\n this.defaultTTL = options.defaultTTL ?? 3600;\n }\n\n private isExpired(entry: VFSCacheEntry): boolean {\n if (!entry.expiresAt) return false;\n return Date.now() > entry.expiresAt;\n }\n\n get(key: string): VFSCacheEntry | null {\n const entry = this.store.get(key);\n if (!entry) return null;\n\n if (this.isExpired(entry)) {\n this.store.delete(key);\n return null;\n }\n\n // Refresh LRU order\n this.store.delete(key);\n this.store.set(key, entry);\n return entry;\n }\n\n set(key: string, entry: VFSCacheEntry, ttlSeconds?: number): void {\n const ttl = ttlSeconds ?? this.defaultTTL;\n const expiresAt = ttl > 0 ? Date.now() + ttl * 1000 : undefined;\n\n const clonedEntry: VFSCacheEntry = {\n ...entry,\n expiresAt,\n };\n\n if (this.store.has(key)) {\n this.store.delete(key);\n } else if (this.store.size >= this.maxItems) {\n // Evict oldest (first key in map)\n const oldestKey = this.store.keys().next().value;\n if (oldestKey !== undefined) {\n this.store.delete(oldestKey);\n }\n }\n\n this.store.set(key, clonedEntry);\n }\n\n delete(key: string): boolean {\n return this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n\n has(key: string): boolean {\n const entry = this.store.get(key);\n if (!entry) return false;\n if (this.isExpired(entry)) {\n this.store.delete(key);\n return false;\n }\n return true;\n }\n\n size(): number {\n return this.store.size;\n }\n}\n","import type { VFSCacheAdapter, VFSCacheEntry } from './adapter';\nimport { MemoryCacheAdapter } from './memory';\n\nexport interface BrowserCacheOptions {\n cacheName?: string;\n defaultTTL?: number;\n}\n\nexport class BrowserCacheAdapter implements VFSCacheAdapter {\n private readonly cacheName: string;\n private readonly defaultTTL: number;\n private readonly fallback: MemoryCacheAdapter;\n\n constructor(options: BrowserCacheOptions = {}) {\n this.cacheName = options.cacheName ?? 'vfs-client-cache-v1';\n this.defaultTTL = options.defaultTTL ?? 3600;\n this.fallback = new MemoryCacheAdapter({ defaultTTL: this.defaultTTL });\n }\n\n private isAvailable(): boolean {\n return typeof window !== 'undefined' && typeof window.caches !== 'undefined';\n }\n\n private urlForKey(key: string): string {\n return `https://vfs-cache.internal/${encodeURIComponent(key)}`;\n }\n\n async get(key: string): Promise<VFSCacheEntry | null> {\n if (!this.isAvailable()) {\n return this.fallback.get(key);\n }\n\n try {\n const cache = await window.caches.open(this.cacheName);\n const res = await cache.match(this.urlForKey(key));\n if (!res) return null;\n\n const expiresHeader = res.headers.get('x-vfs-expires-at');\n if (expiresHeader) {\n const expiresAt = parseInt(expiresHeader, 10);\n if (!isNaN(expiresAt) && Date.now() > expiresAt) {\n await cache.delete(this.urlForKey(key));\n return null;\n }\n }\n\n const buffer = await res.arrayBuffer();\n const contentType = res.headers.get('content-type') || undefined;\n const name = res.headers.get('x-vfs-name') || undefined;\n const hash = res.headers.get('x-vfs-hash') || undefined;\n const createdAtHeader = res.headers.get('x-vfs-created-at');\n const createdAt = createdAtHeader ? parseInt(createdAtHeader, 10) : Date.now();\n const expiresAt = expiresHeader ? parseInt(expiresHeader, 10) : undefined;\n\n return {\n data: new Uint8Array(buffer),\n contentType,\n name,\n size: buffer.byteLength,\n hash,\n createdAt,\n expiresAt,\n };\n } catch {\n return this.fallback.get(key);\n }\n }\n\n async set(key: string, entry: VFSCacheEntry, ttlSeconds?: number): Promise<void> {\n if (!this.isAvailable()) {\n this.fallback.set(key, entry, ttlSeconds);\n return;\n }\n\n try {\n const ttl = ttlSeconds ?? this.defaultTTL;\n const expiresAt = ttl > 0 ? Date.now() + ttl * 1000 : undefined;\n\n const headers = new Headers();\n if (entry.contentType) headers.set('content-type', entry.contentType);\n if (entry.name) headers.set('x-vfs-name', entry.name);\n if (entry.hash) headers.set('x-vfs-hash', entry.hash);\n headers.set('x-vfs-created-at', String(entry.createdAt));\n if (expiresAt) headers.set('x-vfs-expires-at', String(expiresAt));\n\n const response = new Response(entry.data as any, { headers });\n const cache = await window.caches.open(this.cacheName);\n await cache.put(this.urlForKey(key), response);\n } catch {\n this.fallback.set(key, entry, ttlSeconds);\n }\n }\n\n async delete(key: string): Promise<boolean> {\n if (!this.isAvailable()) {\n return this.fallback.delete(key);\n }\n\n try {\n const cache = await window.caches.open(this.cacheName);\n return await cache.delete(this.urlForKey(key));\n } catch {\n return this.fallback.delete(key);\n }\n }\n\n async clear(): Promise<void> {\n if (!this.isAvailable()) {\n this.fallback.clear();\n return;\n }\n\n try {\n await window.caches.delete(this.cacheName);\n } catch {\n this.fallback.clear();\n }\n }\n\n async has(key: string): Promise<boolean> {\n const entry = await this.get(key);\n return entry !== null;\n }\n}\n","import type { VFSCacheAdapter, VFSCacheEntry } from './adapter';\nimport { MemoryCacheAdapter } from './memory';\n\nexport interface FileSystemCacheOptions {\n /**\n * Directory to store cached files (default: \"./.vfs-cache\").\n */\n cacheDir?: string;\n\n /**\n * Default TTL in seconds (default: 3600 = 1 hour).\n */\n defaultTTL?: number;\n}\n\ninterface StoredMeta {\n contentType?: string;\n name?: string;\n size: number;\n hash?: string;\n createdAt: number;\n expiresAt?: number;\n}\n\nexport class FileSystemCacheAdapter implements VFSCacheAdapter {\n private readonly cacheDir: string;\n private readonly defaultTTL: number;\n private readonly fallback: MemoryCacheAdapter;\n private isNodeEnv: boolean;\n\n constructor(options: FileSystemCacheOptions = {}) {\n this.cacheDir = options.cacheDir ?? './.vfs-cache';\n this.defaultTTL = options.defaultTTL ?? 3600;\n this.fallback = new MemoryCacheAdapter({ defaultTTL: this.defaultTTL });\n this.isNodeEnv = typeof process !== 'undefined' && Boolean(process.versions?.node || process.versions?.bun);\n }\n\n private sanitizeKey(key: string): string {\n return encodeURIComponent(key).replace(/[*?:<>|\"/\\\\%]/g, '_');\n }\n\n private async getFs() {\n if (!this.isNodeEnv) return null;\n try {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n return { fs, path };\n } catch {\n return null;\n }\n }\n\n private async ensureDir(): Promise<boolean> {\n const mods = await this.getFs();\n if (!mods) return false;\n try {\n await mods.fs.mkdir(this.cacheDir, { recursive: true });\n return true;\n } catch {\n return false;\n }\n }\n\n async get(key: string): Promise<VFSCacheEntry | null> {\n const mods = await this.getFs();\n if (!mods) return this.fallback.get(key);\n\n const safeKey = this.sanitizeKey(key);\n const dataPath = mods.path.join(this.cacheDir, `${safeKey}.bin`);\n const metaPath = mods.path.join(this.cacheDir, `${safeKey}.json`);\n\n try {\n const metaRaw = await mods.fs.readFile(metaPath, 'utf8');\n const meta = JSON.parse(metaRaw) as StoredMeta;\n\n if (meta.expiresAt && Date.now() > meta.expiresAt) {\n await Promise.allSettled([mods.fs.unlink(dataPath), mods.fs.unlink(metaPath)]);\n return null;\n }\n\n const buffer = await mods.fs.readFile(dataPath);\n return {\n data: new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength),\n contentType: meta.contentType,\n name: meta.name,\n size: meta.size,\n hash: meta.hash,\n createdAt: meta.createdAt,\n expiresAt: meta.expiresAt,\n };\n } catch {\n return null;\n }\n }\n\n async set(key: string, entry: VFSCacheEntry, ttlSeconds?: number): Promise<void> {\n const mods = await this.getFs();\n if (!mods) {\n this.fallback.set(key, entry, ttlSeconds);\n return;\n }\n\n if (!(await this.ensureDir())) {\n this.fallback.set(key, entry, ttlSeconds);\n return;\n }\n\n const ttl = ttlSeconds ?? this.defaultTTL;\n const expiresAt = ttl > 0 ? Date.now() + ttl * 1000 : undefined;\n const safeKey = this.sanitizeKey(key);\n const dataPath = mods.path.join(this.cacheDir, `${safeKey}.bin`);\n const metaPath = mods.path.join(this.cacheDir, `${safeKey}.json`);\n\n const meta: StoredMeta = {\n contentType: entry.contentType,\n name: entry.name,\n size: entry.size,\n hash: entry.hash,\n createdAt: entry.createdAt,\n expiresAt,\n };\n\n try {\n await Promise.all([\n mods.fs.writeFile(dataPath, entry.data),\n mods.fs.writeFile(metaPath, JSON.stringify(meta), 'utf8'),\n ]);\n } catch {\n this.fallback.set(key, entry, ttlSeconds);\n }\n }\n\n async delete(key: string): Promise<boolean> {\n const mods = await this.getFs();\n if (!mods) return this.fallback.delete(key);\n\n const safeKey = this.sanitizeKey(key);\n const dataPath = mods.path.join(this.cacheDir, `${safeKey}.bin`);\n const metaPath = mods.path.join(this.cacheDir, `${safeKey}.json`);\n\n try {\n await Promise.allSettled([mods.fs.unlink(dataPath), mods.fs.unlink(metaPath)]);\n return true;\n } catch {\n return false;\n }\n }\n\n async clear(): Promise<void> {\n const mods = await this.getFs();\n if (!mods) {\n this.fallback.clear();\n return;\n }\n\n try {\n const files = await mods.fs.readdir(this.cacheDir);\n await Promise.allSettled(files.map((file) => mods.fs.unlink(mods.path.join(this.cacheDir, file))));\n } catch {\n this.fallback.clear();\n }\n }\n\n async has(key: string): Promise<boolean> {\n const entry = await this.get(key);\n return entry !== null;\n }\n}\n","import type { VFSCacheAdapter } from './adapter';\nimport { MemoryCacheAdapter } from './memory';\nimport { BrowserCacheAdapter } from './browser';\nimport { FileSystemCacheAdapter } from './filesystem';\n\nexport * from './adapter';\nexport * from './memory';\nexport * from './browser';\nexport * from './filesystem';\n\n/**\n * Creates the most suitable cache adapter for the current runtime environment.\n * - In Browser: Uses BrowserCacheAdapter (CacheStorage / IndexedDB / Memory fallback)\n * - In Node.js / Bun: Uses FileSystemCacheAdapter (or MemoryCacheAdapter if directory unwritable)\n * - Otherwise: Uses MemoryCacheAdapter\n */\nexport function createDefaultCache(): VFSCacheAdapter {\n if (typeof window !== 'undefined' && typeof window.caches !== 'undefined') {\n return new BrowserCacheAdapter();\n }\n\n if (typeof process !== 'undefined' && (process.versions?.node || process.versions?.bun)) {\n return new FileSystemCacheAdapter();\n }\n\n return new MemoryCacheAdapter();\n}\n","/**\n * Isomorphic SHA-256 calculation for Browser, Node.js, and Bun.\n */\n\n/**\n * Converts an ArrayBuffer or Uint8Array to a hex string.\n */\nexport function bufferToHex(buffer: ArrayBuffer | Uint8Array): string {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i].toString(16).padStart(2, '0');\n }\n return hex;\n}\n\n/**\n * Calculates SHA-256 hex digest of an ArrayBuffer or Uint8Array.\n */\nexport async function calculateSHA256(data: ArrayBuffer | Uint8Array | string): Promise<string> {\n let bytes: Uint8Array;\n if (typeof data === 'string') {\n bytes = new TextEncoder().encode(data);\n } else if (data instanceof Uint8Array) {\n bytes = data;\n } else {\n bytes = new Uint8Array(data);\n }\n\n // 1. Try globalThis.crypto.subtle (available in Browser, Node 18+, Bun, Deno, Cloudflare Workers)\n if (typeof globalThis !== 'undefined' && globalThis.crypto?.subtle?.digest) {\n const hashBuffer = await globalThis.crypto.subtle.digest('SHA-256', bytes as any);\n return bufferToHex(hashBuffer);\n }\n\n // 2. Fallback to node:crypto if running in an older Node or environment without WebCrypto\n try {\n const nodeCrypto = await import('node:crypto');\n return nodeCrypto.createHash('sha256').update(bytes).digest('hex');\n } catch {\n throw new Error('No crypto implementation found in current environment for SHA-256');\n }\n}\n\n/**\n * Calculates SHA-256 of a Blob or File.\n */\nexport async function calculateBlobSHA256(blob: Blob): Promise<string> {\n const arrayBuffer = await blob.arrayBuffer();\n return calculateSHA256(arrayBuffer);\n}\n","import type { UploadInput } from '../types';\nimport { calculateSHA256 } from '../crypto/hash';\nimport { VFSError } from '../types/errors';\n\nexport interface NormalizedFileInput {\n bytes: Uint8Array;\n name: string;\n size: number;\n contentType: string;\n hash: string;\n}\n\n/**\n * Detects basic mime type from file name extension.\n */\nexport function guessContentType(filename: string): string {\n const ext = filename.split('.').pop()?.toLowerCase();\n switch (ext) {\n case 'jpg':\n case 'jpeg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n case 'gif':\n return 'image/gif';\n case 'webp':\n return 'image/webp';\n case 'svg':\n return 'image/svg+xml';\n case 'pdf':\n return 'application/pdf';\n case 'json':\n return 'application/json';\n case 'txt':\n return 'text/plain';\n case 'html':\n return 'text/html';\n case 'csv':\n return 'text/csv';\n case 'zip':\n return 'application/zip';\n case 'tar':\n return 'application/x-tar';\n case 'gz':\n return 'application/gzip';\n case 'mp4':\n return 'video/mp4';\n case 'mp3':\n return 'audio/mpeg';\n default:\n return 'application/octet-stream';\n }\n}\n\n/**\n * Normalizes any supported input into an in-memory Uint8Array with metadata and SHA-256 hash.\n */\nexport async function normalizeUploadInput(input: UploadInput): Promise<NormalizedFileInput> {\n const file = input.file;\n let bytes: Uint8Array = new Uint8Array(0);\n let name = input.name || 'unnamed_file';\n let contentType = input.contentType;\n\n // 1. File (Browser)\n if (typeof File !== 'undefined' && file instanceof File) {\n name = input.name || file.name;\n contentType = contentType || file.type || guessContentType(name);\n const arrayBuffer = await file.arrayBuffer();\n bytes = new Uint8Array(arrayBuffer);\n }\n // 2. Blob\n else if (typeof Blob !== 'undefined' && file instanceof Blob) {\n contentType = contentType || file.type || guessContentType(name);\n const arrayBuffer = await file.arrayBuffer();\n bytes = new Uint8Array(arrayBuffer);\n }\n // 3. Uint8Array or Buffer\n else if (file instanceof Uint8Array) {\n bytes = file;\n contentType = contentType || guessContentType(name);\n }\n // 4. ArrayBuffer\n else if (file instanceof ArrayBuffer) {\n bytes = new Uint8Array(file);\n contentType = contentType || guessContentType(name);\n }\n // 5. ReadableStream (Web Streams)\n else if (typeof ReadableStream !== 'undefined' && file instanceof ReadableStream) {\n const reader = file.getReader();\n const chunks: Uint8Array[] = [];\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) chunks.push(value);\n }\n const totalLength = chunks.reduce((acc, c) => acc + c.length, 0);\n bytes = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.length;\n }\n contentType = contentType || guessContentType(name);\n }\n // 6. Node.js Readable Stream\n else if (typeof file === 'object' && file !== null && 'on' in file && typeof (file as any).pipe === 'function') {\n const chunks: Uint8Array[] = [];\n await new Promise<void>((resolve, reject) => {\n (file as any).on('data', (chunk: any) => {\n if (typeof chunk === 'string') {\n chunks.push(new TextEncoder().encode(chunk));\n } else if (chunk instanceof Uint8Array) {\n chunks.push(chunk);\n }\n });\n (file as any).on('end', () => resolve());\n (file as any).on('error', (err: any) => reject(err));\n });\n const totalLength = chunks.reduce((acc, c) => acc + c.length, 0);\n bytes = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.length;\n }\n contentType = contentType || guessContentType(name);\n }\n // 7. String: File path or base64/raw string\n else if (typeof file === 'string') {\n // Check if it's a file path in Node.js / Bun\n const isNode = typeof process !== 'undefined' && Boolean(process.versions?.node || process.versions?.bun);\n let readFromFile = false;\n\n if (isNode) {\n try {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const stat = await fs.stat(file);\n if (stat.isFile()) {\n const buf = await fs.readFile(file);\n bytes = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n name = input.name || path.basename(file);\n contentType = contentType || guessContentType(name);\n readFromFile = true;\n }\n } catch {\n // Not a valid file path, proceed as string content\n }\n }\n\n if (!readFromFile) {\n if (file.startsWith('data:')) {\n // Data URL\n const commaIdx = file.indexOf(',');\n if (commaIdx !== -1) {\n const mimeMatch = file.slice(0, commaIdx).match(/data:(.*?);/);\n if (mimeMatch && !contentType) {\n contentType = mimeMatch[1];\n }\n const base64Data = file.slice(commaIdx + 1);\n const binaryStr = atob(base64Data);\n bytes = new Uint8Array(binaryStr.length);\n for (let i = 0; i < binaryStr.length; i++) {\n bytes[i] = binaryStr.charCodeAt(i);\n }\n } else {\n bytes = new TextEncoder().encode(file);\n }\n } else {\n bytes = new TextEncoder().encode(file);\n }\n contentType = contentType || guessContentType(name);\n }\n } else {\n throw new VFSError('Unsupported file input type for upload', { status: 400 });\n }\n\n const hash = input.fileHash || (await calculateSHA256(bytes));\n\n return {\n bytes,\n name,\n size: bytes.byteLength,\n contentType: contentType || 'application/octet-stream',\n hash,\n };\n}\n","import type { HttpClient } from '../http/client';\nimport type { PreflightRequest, PreflightResponse } from '../types/models';\nimport { VFSError } from '../types/errors';\n\n/**\n * Checks metadata with VFS Server preflight endpoint before uploading data.\n * Detects quota violations, file size exceedance, and duplicate hits.\n */\nexport async function executePreflight(\n http: HttpClient,\n req: PreflightRequest,\n signal?: AbortSignal\n): Promise<PreflightResponse> {\n try {\n const res = await http.post<PreflightResponse>('/api/upload/preflight', JSON.stringify(req), {\n headers: { 'Content-Type': 'application/json' },\n signal,\n });\n return res.data;\n } catch (err: unknown) {\n // If the server does not implement /preflight (404), fall back to standard upload\n if (err instanceof VFSError && err.status === 404) {\n return {\n allowed: true,\n bucket_id: req.bucket_id,\n size: req.size ?? 0,\n max_upload_bytes: 0,\n };\n }\n throw err;\n }\n}\n","import type { HttpClient } from '../http/client';\nimport type { AttachmentResponse, UploadInput } from '../types';\nimport { normalizeUploadInput } from './normalizer';\nimport { executePreflight } from './preflight';\nimport { VFSError } from '../types/errors';\n\nexport async function uploadSingleFile(\n http: HttpClient,\n input: UploadInput,\n defaultBucket: string = 'default'\n): Promise<AttachmentResponse> {\n const bucketId = input.bucketId || defaultBucket;\n\n input.onProgress?.({\n loaded: 0,\n total: 100,\n percent: 5,\n phase: 'hashing',\n });\n\n const normalized = await normalizeUploadInput(input);\n\n // Preflight check\n let uploadToken: string | undefined;\n if (input.preflight !== false) {\n input.onProgress?.({\n loaded: 0,\n total: normalized.size,\n percent: 15,\n phase: 'preflight',\n });\n\n const preflight = await executePreflight(\n http,\n {\n bucket_id: bucketId,\n name: normalized.name,\n size: normalized.size,\n content_type: normalized.contentType,\n file_hash: normalized.hash,\n },\n input.signal\n );\n\n // If file already exists in bucket, return deduplicated attachment immediately!\n if (preflight.duplicate) {\n input.onProgress?.({\n loaded: normalized.size,\n total: normalized.size,\n percent: 100,\n phase: 'complete',\n });\n return preflight.duplicate;\n }\n\n if (!preflight.allowed) {\n throw new VFSError(preflight.reason || 'Upload rejected by server preflight check', {\n status: 400,\n });\n }\n\n uploadToken = preflight.upload_token;\n }\n\n // Upload bytes via multipart/form-data\n input.onProgress?.({\n loaded: 0,\n total: normalized.size,\n percent: 30,\n phase: 'uploading',\n });\n\n const formData = new FormData();\n // Wrap Uint8Array in Blob\n const blob = new Blob([normalized.bytes as any], { type: normalized.contentType });\n formData.append('file', blob, normalized.name);\n formData.append('bucket_id', bucketId);\n\n if (normalized.hash) {\n formData.append('file_hash', normalized.hash);\n }\n\n if (uploadToken) {\n formData.append('upload_token', uploadToken);\n }\n\n if (input.metadata && Object.keys(input.metadata).length > 0) {\n formData.append('metadata', JSON.stringify(input.metadata));\n }\n\n const res = await http.post<AttachmentResponse>('/api/upload', formData, {\n signal: input.signal,\n });\n\n input.onProgress?.({\n loaded: normalized.size,\n total: normalized.size,\n percent: 100,\n phase: 'complete',\n });\n\n return res.data;\n}\n","import type { HttpClient, HttpResponse } from '../http/client';\nimport type { AttachmentResponse, SessionView, UploadInput } from '../types';\nimport { normalizeUploadInput } from './normalizer';\nimport { calculateSHA256 } from '../crypto/hash';\nimport { VFSError } from '../types/errors';\n\nconst DEFAULT_CHUNK_SIZE = 1048576; // 1 MiB standard VFS chunk size\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nfunction generateSessionId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n return Array.from({ length: 32 }, () => Math.floor(Math.random() * 16).toString(16)).join('');\n}\n\n/**\n * Uploads a file using the VFS Resumable Chunked Session Upload Protocol.\n * Ideal for large files, unstable connections, and edge-distributed storage.\n */\nexport async function uploadSessionFile(\n http: HttpClient,\n input: UploadInput,\n defaultBucket: string = 'default'\n): Promise<AttachmentResponse> {\n const bucketId = input.bucketId || defaultBucket;\n\n input.onProgress?.({\n loaded: 0,\n total: 100,\n percent: 5,\n phase: 'hashing',\n });\n\n const normalized = await normalizeUploadInput(input);\n const sessionId = input.resumeId || generateSessionId();\n const chunkSize = input.chunkSize || DEFAULT_CHUNK_SIZE;\n\n input.onProgress?.({\n loaded: 0,\n total: normalized.size,\n percent: 10,\n phase: 'preflight',\n });\n\n // 1. Create or recover session\n let session: SessionView | undefined;\n let failures = 0;\n\n while (!session) {\n if (input.signal?.aborted) {\n throw new VFSError('Upload aborted', { status: 499 });\n }\n\n try {\n const res = await http.post<SessionView>(\n '/api/upload/sessions',\n JSON.stringify({\n id: sessionId,\n bucket_id: bucketId,\n name: normalized.name,\n size: normalized.size,\n file_hash: normalized.hash,\n content_type: normalized.contentType,\n }),\n {\n headers: { 'Content-Type': 'application/json' },\n signal: input.signal,\n timeout: 15000,\n }\n );\n session = res.data;\n } catch (err: unknown) {\n if (err instanceof VFSError) {\n if (err.status === 410) {\n throw new VFSError('The upload session has expired. Start a new session.', { status: 410, cause: err });\n }\n if ([400, 401, 403, 409, 413, 422].includes(err.status)) {\n throw err;\n }\n }\n\n failures++;\n if (failures >= 5) {\n throw new VFSError('Failed to initialize upload session after retries', { cause: err });\n }\n\n await delay(500 * Math.pow(2, failures - 1));\n }\n }\n\n if (!session) {\n throw new VFSError('Failed to initialize upload session');\n }\n\n let currentSession: SessionView = session;\n\n // 2. Upload chunks\n failures = 0;\n let offset = currentSession.offset;\n\n while (['receiving', 'paused'].includes(currentSession.state) && offset < normalized.size) {\n if (input.signal?.aborted) {\n throw new VFSError('Upload aborted', { status: 499 });\n }\n\n const currentChunkSize = Math.min(currentSession.chunk_size || chunkSize, normalized.size - offset);\n const chunkBytes = normalized.bytes.subarray(offset, offset + currentChunkSize);\n const chunkHash = await calculateSHA256(chunkBytes);\n\n const percent = Math.min(95, 15 + Math.floor((offset / normalized.size) * 80));\n input.onProgress?.({\n loaded: offset,\n total: normalized.size,\n percent,\n phase: 'chunks',\n });\n\n try {\n const chunkRes: HttpResponse<SessionView> = await http.put<SessionView>(\n `/api/upload/sessions/${currentSession.id}/chunks/${offset}`,\n // Pass Uint8Array slice directly as binary body\n chunkBytes as unknown as BodyInit,\n {\n headers: {\n 'Content-Type': 'application/octet-stream',\n 'X-Upload-SHA256': chunkHash,\n },\n signal: input.signal,\n timeout: 30000,\n }\n );\n\n currentSession = chunkRes.data;\n offset = currentSession.offset;\n failures = 0;\n } catch (err: unknown) {\n failures++;\n if (err instanceof VFSError && [400, 401, 403, 410, 413, 422].includes(err.status)) {\n throw err;\n }\n\n if (failures >= 6) {\n throw new VFSError(`Chunk upload failed at offset ${offset}: ${err instanceof Error ? err.message : 'Unknown error'}`, {\n cause: err,\n });\n }\n\n await delay(Math.min(500 * Math.pow(2, failures - 1), 8000));\n\n // Attempt to sync status from server\n try {\n const statusRes = await http.get<SessionView>(`/api/upload/sessions/${currentSession.id}`, {\n timeout: 10000,\n signal: input.signal,\n });\n currentSession = statusRes.data;\n offset = currentSession.offset;\n } catch {\n // Keep previous offset and retry same chunk\n }\n }\n }\n\n // 3. Finalize session\n input.onProgress?.({\n loaded: normalized.size,\n total: normalized.size,\n percent: 96,\n phase: 'finalizing',\n });\n\n if (currentSession.state !== 'complete') {\n for (let attempt = 0; attempt < 5; attempt++) {\n if (input.signal?.aborted) {\n throw new VFSError('Upload aborted', { status: 499 });\n }\n\n try {\n const finalRes = await http.post<SessionView>(\n `/api/upload/sessions/${currentSession.id}/finalize`,\n '{}',\n {\n headers: { 'Content-Type': 'application/json' },\n timeout: 15000,\n signal: input.signal,\n }\n );\n currentSession = finalRes.data;\n break;\n } catch (err: unknown) {\n if (attempt >= 4) {\n throw new VFSError('Failed to finalize session upload', { cause: err });\n }\n await delay(1000);\n }\n }\n }\n\n // Poll until complete or max attempts\n let pollAttempts = 0;\n while (currentSession.state !== 'complete' && pollAttempts < 10) {\n await delay(1000);\n try {\n const statusRes = await http.get<SessionView>(`/api/upload/sessions/${currentSession.id}`, {\n timeout: 5000,\n signal: input.signal,\n });\n currentSession = statusRes.data;\n if (currentSession.state === 'complete') break;\n } catch {\n // Ignore transient polling failure\n }\n pollAttempts++;\n }\n\n input.onProgress?.({\n loaded: normalized.size,\n total: normalized.size,\n percent: 100,\n phase: 'complete',\n });\n\n // Construct standard AttachmentResponse\n const ext = normalized.name.split('.').pop() || '';\n const fileUrl = `${http.getEndpoint()}/v/${bucketId}/${currentSession.id}${ext ? `.${ext}` : ''}`;\n\n return {\n id: currentSession.id,\n bucket_id: bucketId,\n file_id: currentSession.id,\n file_hash: normalized.hash,\n extension: ext,\n name: normalized.name,\n size: normalized.size,\n type: normalized.contentType,\n metadata: input.metadata,\n created_at: new Date().toISOString(),\n url: fileUrl,\n key: `edge:${currentSession.id}`,\n store: 'edge',\n is_stat_synced: true,\n };\n}\n","import type { HttpClient } from '../http/client';\nimport type { AttachmentResponse, UploadInput, UploadMultipleInput } from '../types';\nimport { uploadSingleFile } from './single';\nimport { uploadSessionFile } from './session';\nimport { executePreflight } from './preflight';\nimport { normalizeUploadInput } from './normalizer';\n\nexport interface QueueItem {\n id: string;\n input: UploadInput;\n status: 'pending' | 'uploading' | 'completed' | 'failed' | 'cancelled';\n progress: number;\n response?: AttachmentResponse;\n error?: Error;\n}\n\nexport interface QueueProgress {\n totalFiles: number;\n completedFiles: number;\n failedFiles: number;\n overallPercent: number;\n currentFile?: string;\n}\n\nexport type QueueListener = (progress: QueueProgress, item?: QueueItem) => void;\n\nexport class BackgroundUploadQueue {\n private readonly http: HttpClient;\n private readonly defaultBucket: string;\n private concurrency: number;\n private items: QueueItem[] = [];\n private activeCount: number = 0;\n private isPaused: boolean = false;\n private abortController: AbortController = new AbortController();\n private listeners: Set<QueueListener> = new Set();\n private onFileSuccessCb?: (file: UploadInput, response: AttachmentResponse) => void;\n private onFileErrorCb?: (file: UploadInput, error: Error) => void;\n private onCompletePromiseResolve?: (results: AttachmentResponse[]) => void;\n private onCompletePromiseReject?: (error: Error) => void;\n\n constructor(http: HttpClient, options: { defaultBucket?: string; concurrency?: number } = {}) {\n this.http = http;\n this.defaultBucket = options.defaultBucket || 'default';\n this.concurrency = Math.max(1, options.concurrency || 3);\n }\n\n onProgress(listener: QueueListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n onFileSuccess(cb: (file: UploadInput, response: AttachmentResponse) => void): this {\n this.onFileSuccessCb = cb;\n return this;\n }\n\n onFileError(cb: (file: UploadInput, error: Error) => void): this {\n this.onFileErrorCb = cb;\n return this;\n }\n\n add(input: UploadInput): string {\n const id = typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).slice(2);\n const item: QueueItem = {\n id,\n input,\n status: 'pending',\n progress: 0,\n };\n this.items.push(item);\n this.processQueue();\n return id;\n }\n\n addAll(inputs: UploadInput[]): string[] {\n return inputs.map((input) => this.add(input));\n }\n\n pause(): void {\n this.isPaused = true;\n }\n\n resume(): void {\n if (this.isPaused) {\n this.isPaused = false;\n this.processQueue();\n }\n }\n\n cancel(): void {\n this.abortController.abort();\n this.abortController = new AbortController();\n for (const item of this.items) {\n if (item.status === 'pending' || item.status === 'uploading') {\n item.status = 'cancelled';\n }\n }\n this.activeCount = 0;\n this.notifyProgress();\n this.onCompletePromiseReject?.(new Error('Upload queue cancelled'));\n }\n\n clear(): void {\n this.cancel();\n this.items = [];\n }\n\n getItems(): ReadonlyArray<QueueItem> {\n return [...this.items];\n }\n\n getProgress(): QueueProgress {\n const totalFiles = this.items.length;\n if (totalFiles === 0) {\n return { totalFiles: 0, completedFiles: 0, failedFiles: 0, overallPercent: 100 };\n }\n\n let completedFiles = 0;\n let failedFiles = 0;\n let totalPercentSum = 0;\n let currentFile: string | undefined;\n\n for (const item of this.items) {\n if (item.status === 'completed') {\n completedFiles++;\n totalPercentSum += 100;\n } else if (item.status === 'failed') {\n failedFiles++;\n totalPercentSum += 100;\n } else if (item.status === 'uploading') {\n currentFile = item.input.name;\n totalPercentSum += item.progress;\n }\n }\n\n const overallPercent = Math.round(totalPercentSum / totalFiles);\n return {\n totalFiles,\n completedFiles,\n failedFiles,\n overallPercent,\n currentFile,\n };\n }\n\n private notifyProgress(item?: QueueItem) {\n const progress = this.getProgress();\n for (const listener of this.listeners) {\n try {\n listener(progress, item);\n } catch {\n // Safe swallow\n }\n }\n }\n\n private async processQueue(): Promise<void> {\n if (this.isPaused) return;\n\n while (this.activeCount < this.concurrency) {\n const nextItem = this.items.find((i) => i.status === 'pending');\n if (!nextItem) break;\n\n this.activeCount++;\n nextItem.status = 'uploading';\n this.notifyProgress(nextItem);\n\n this.uploadItem(nextItem)\n .catch(() => {\n // Handled inside uploadItem\n })\n .finally(() => {\n this.activeCount--;\n this.notifyProgress(nextItem);\n this.processQueue();\n this.checkCompletion();\n });\n }\n }\n\n private async uploadItem(item: QueueItem): Promise<void> {\n const inputWithProgress: UploadInput = {\n ...item.input,\n signal: item.input.signal || this.abortController.signal,\n onProgress: (p) => {\n item.progress = p.percent;\n item.input.onProgress?.(p);\n this.notifyProgress(item);\n },\n };\n\n try {\n let result: AttachmentResponse;\n\n // Check preflight protocol or resumable flag\n if (item.input.resumable) {\n result = await uploadSessionFile(this.http, inputWithProgress, this.defaultBucket);\n } else if (item.input.preflight !== false) {\n const normalized = await normalizeUploadInput(item.input);\n const bucketId = item.input.bucketId || this.defaultBucket;\n const preflight = await executePreflight(\n this.http,\n {\n bucket_id: bucketId,\n name: normalized.name,\n size: normalized.size,\n content_type: normalized.contentType,\n file_hash: normalized.hash,\n },\n inputWithProgress.signal\n );\n\n if (preflight.duplicate) {\n result = preflight.duplicate;\n } else if (preflight.upload_protocol === 'edge-chunks-v1') {\n result = await uploadSessionFile(this.http, inputWithProgress, this.defaultBucket);\n } else {\n result = await uploadSingleFile(this.http, inputWithProgress, this.defaultBucket);\n }\n } else {\n result = await uploadSingleFile(this.http, inputWithProgress, this.defaultBucket);\n }\n\n item.status = 'completed';\n item.progress = 100;\n item.response = result;\n this.onFileSuccessCb?.(item.input, result);\n } catch (err: unknown) {\n item.status = 'failed';\n item.error = err instanceof Error ? err : new Error(String(err));\n this.onFileErrorCb?.(item.input, item.error);\n }\n }\n\n private checkCompletion(): void {\n const hasPending = this.items.some((i) => i.status === 'pending' || i.status === 'uploading');\n if (!hasPending && this.activeCount === 0) {\n const successful = this.items.filter((i) => i.status === 'completed' && i.response).map((i) => i.response!);\n this.onCompletePromiseResolve?.(successful);\n }\n }\n\n /**\n * Returns a promise that resolves when all items currently in the queue have completed.\n */\n async wait(): Promise<AttachmentResponse[]> {\n const hasPending = this.items.some((i) => i.status === 'pending' || i.status === 'uploading');\n if (!hasPending && this.activeCount === 0) {\n return this.items.filter((i) => i.status === 'completed' && i.response).map((i) => i.response!);\n }\n\n return new Promise((resolve, reject) => {\n this.onCompletePromiseResolve = resolve;\n this.onCompletePromiseReject = reject;\n });\n }\n}\n\n/**\n * Uploads multiple files with concurrency control and progress tracking.\n */\nexport async function uploadMultipleFiles(\n http: HttpClient,\n input: UploadMultipleInput,\n defaultBucket: string = 'default'\n): Promise<AttachmentResponse[]> {\n const queue = new BackgroundUploadQueue(http, {\n defaultBucket: input.bucketId || defaultBucket,\n concurrency: input.concurrency || 3,\n });\n\n if (input.onProgress) {\n queue.onProgress((p) => input.onProgress?.(p));\n }\n\n if (input.onFileSuccess) {\n queue.onFileSuccess(input.onFileSuccess);\n }\n\n if (input.onFileError) {\n queue.onFileError(input.onFileError);\n }\n\n if (input.signal) {\n input.signal.addEventListener('abort', () => queue.cancel(), { once: true });\n }\n\n queue.addAll(input.files);\n return queue.wait();\n}\n","import type {\n AttachmentResponse,\n BucketMetricsByDate,\n BucketStat,\n BucketStatSummary,\n BucketStatsListResponse,\n GetFileOptions,\n GetUrlOptions,\n ListFilesOptions,\n ObjectManifestResponse,\n UploadInput,\n UploadMultipleInput,\n VFSClientOptions,\n} from './types';\nimport { VFSError } from './types/errors';\nimport { HttpClient } from './http/client';\nimport type { VFSCacheAdapter } from './cache/adapter';\nimport { createDefaultCache } from './cache/factory';\nimport { uploadSingleFile } from './upload/single';\nimport { uploadSessionFile } from './upload/session';\nimport { BackgroundUploadQueue, uploadMultipleFiles } from './upload/queue';\n\nexport class VFSClient {\n readonly http: HttpClient;\n readonly defaultBucket: string;\n readonly cache?: VFSCacheAdapter;\n\n constructor(options: VFSClientOptions) {\n this.http = new HttpClient(options);\n this.defaultBucket = options.defaultBucket || 'default';\n\n if (options.cache === true) {\n this.cache = createDefaultCache();\n } else if (options.cache && typeof options.cache === 'object') {\n this.cache = options.cache;\n }\n }\n\n /**\n * Upload a single file to VFS.\n * Proactively checks preflight quota and deduplication: if identical file content exists,\n * skips transfer and returns the existing file immediately.\n */\n async upload(input: UploadInput): Promise<AttachmentResponse> {\n if (input.resumable) {\n return uploadSessionFile(this.http, input, this.defaultBucket);\n }\n return uploadSingleFile(this.http, input, this.defaultBucket);\n }\n\n /**\n * Upload multiple files with concurrency control, progress reporting, and stream/chunk support.\n */\n async uploadMultiple(input: UploadMultipleInput): Promise<AttachmentResponse[]> {\n return uploadMultipleFiles(this.http, input, this.defaultBucket);\n }\n\n /**\n * Creates a background upload queue manager for continuous uploads with pause/resume and events.\n */\n createBackgroundQueue(options?: { concurrency?: number; bucketId?: string }): BackgroundUploadQueue {\n return new BackgroundUploadQueue(this.http, {\n defaultBucket: options?.bucketId || this.defaultBucket,\n concurrency: options?.concurrency || 3,\n });\n }\n\n /**\n * Retrieves a file from VFS with multi-tier caching (Browser CacheStorage / Server Filesystem).\n */\n async getFile(\n bucketId: string,\n fileId: string,\n options: GetFileOptions = {}\n ): Promise<Blob | ArrayBuffer | ReadableStream<Uint8Array> | string | unknown> {\n const cacheKey = `vfs:${bucketId}:${fileId}`;\n const shouldUseCache = options.useCache !== false && Boolean(this.cache);\n\n // 1. Check cache first\n if (shouldUseCache && this.cache) {\n const cached = await this.cache.get(cacheKey);\n if (cached) {\n if (options.responseType === 'arrayBuffer') {\n return cached.data.buffer.slice(cached.data.byteOffset, cached.data.byteOffset + cached.data.byteLength);\n }\n if (options.responseType === 'text') {\n return new TextDecoder().decode(cached.data);\n }\n if (options.responseType === 'json') {\n return JSON.parse(new TextDecoder().decode(cached.data));\n }\n if (options.responseType === 'stream') {\n return new ReadableStream({\n start(controller) {\n controller.enqueue(cached.data);\n controller.close();\n },\n });\n }\n // Default: Blob\n return new Blob([cached.data as any], { type: cached.contentType });\n }\n }\n\n // 2. Fetch from VFS Server\n const params: Record<string, string | number | boolean | undefined> = {};\n if (options.download) {\n params.download = true;\n }\n if (options.imgproxy) {\n if (options.imgproxy.width) params.w = options.imgproxy.width;\n if (options.imgproxy.height) params.h = options.imgproxy.height;\n if (options.imgproxy.resizingType) params.rs = options.imgproxy.resizingType;\n if (options.imgproxy.format) params.fmt = options.imgproxy.format;\n if (options.imgproxy.quality) params.q = options.imgproxy.quality;\n }\n\n const response = await this.http.fetchRaw(`/v/${encodeURIComponent(bucketId)}/${encodeURIComponent(fileId)}`, {\n params,\n signal: options.signal,\n });\n\n const contentType = response.headers.get('content-type') || 'application/octet-stream';\n const contentDisposition = response.headers.get('content-disposition') || '';\n let filename: string | undefined;\n const match = contentDisposition.match(/filename=\"?([^\";]+)\"?/);\n if (match) filename = match[1];\n\n // Read bytes\n const arrayBuffer = await response.arrayBuffer();\n const bytes = new Uint8Array(arrayBuffer);\n\n // 3. Save to cache\n if (shouldUseCache && this.cache) {\n await this.cache.set(cacheKey, {\n data: bytes,\n contentType,\n name: filename,\n size: bytes.byteLength,\n createdAt: Date.now(),\n });\n }\n\n // 4. Return formatted response\n if (options.responseType === 'arrayBuffer') {\n return arrayBuffer;\n }\n if (options.responseType === 'text') {\n return new TextDecoder().decode(bytes);\n }\n if (options.responseType === 'json') {\n return JSON.parse(new TextDecoder().decode(bytes));\n }\n if (options.responseType === 'stream') {\n return new ReadableStream({\n start(controller) {\n controller.enqueue(bytes);\n controller.close();\n },\n });\n }\n\n return new Blob([bytes as any], { type: contentType });\n }\n\n /**\n * Retrieves a file directly by its SHA-256 hash (/h/:hash).\n * Hash-addressed content is immutable and cached indefinitely.\n */\n async getFileByHash(\n hash: string,\n options: GetFileOptions = {}\n ): Promise<Blob | ArrayBuffer | ReadableStream<Uint8Array> | string | unknown> {\n const cacheKey = `vfs:hash:${hash}`;\n const shouldUseCache = options.useCache !== false && Boolean(this.cache);\n\n if (shouldUseCache && this.cache) {\n const cached = await this.cache.get(cacheKey);\n if (cached) {\n if (options.responseType === 'arrayBuffer') {\n return cached.data.buffer.slice(cached.data.byteOffset, cached.data.byteOffset + cached.data.byteLength);\n }\n if (options.responseType === 'text') {\n return new TextDecoder().decode(cached.data);\n }\n if (options.responseType === 'json') {\n return JSON.parse(new TextDecoder().decode(cached.data));\n }\n return new Blob([cached.data as any], { type: cached.contentType });\n }\n }\n\n const response = await this.http.fetchRaw(`/h/${encodeURIComponent(hash)}`, {\n signal: options.signal,\n });\n\n const contentType = response.headers.get('content-type') || 'application/octet-stream';\n const arrayBuffer = await response.arrayBuffer();\n const bytes = new Uint8Array(arrayBuffer);\n\n if (shouldUseCache && this.cache) {\n // 1 year TTL for immutable content\n await this.cache.set(\n cacheKey,\n {\n data: bytes,\n contentType,\n size: bytes.byteLength,\n hash,\n createdAt: Date.now(),\n },\n 31536000\n );\n }\n\n if (options.responseType === 'arrayBuffer') {\n return arrayBuffer;\n }\n if (options.responseType === 'text') {\n return new TextDecoder().decode(bytes);\n }\n if (options.responseType === 'json') {\n return JSON.parse(new TextDecoder().decode(bytes));\n }\n\n return new Blob([bytes as any], { type: contentType });\n }\n\n /**\n * Gets metadata manifest of an uploaded file as a JSON object without downloading the file data.\n */\n async getFileMetadata(bucketId: string, fileId: string, signal?: AbortSignal): Promise<ObjectManifestResponse> {\n const res = await this.http.get<ObjectManifestResponse>(\n `/v/${encodeURIComponent(bucketId)}/${encodeURIComponent(fileId)}`,\n {\n params: { output: 'json' },\n headers: { Accept: 'application/json' },\n signal,\n }\n );\n return res.data;\n }\n\n /**\n * Gets metadata manifest of a file by its SHA-256 hash.\n */\n async getFileMetadataByHash(hash: string, signal?: AbortSignal): Promise<ObjectManifestResponse> {\n const res = await this.http.get<ObjectManifestResponse>(`/h/${encodeURIComponent(hash)}`, {\n params: { output: 'json' },\n headers: { Accept: 'application/json' },\n signal,\n });\n return res.data;\n }\n\n /**\n * Generates public/access URL for a file, supporting imgproxy transformations and download triggers.\n */\n getFileUrl(bucketId: string, fileId: string, options: GetUrlOptions = {}): string {\n const url = new URL(`${this.http.getEndpoint()}/v/${encodeURIComponent(bucketId)}/${encodeURIComponent(fileId)}`);\n if (options.download) {\n url.searchParams.set('download', 'true');\n }\n if (options.imgproxy) {\n if (options.imgproxy.width) url.searchParams.set('w', String(options.imgproxy.width));\n if (options.imgproxy.height) url.searchParams.set('h', String(options.imgproxy.height));\n if (options.imgproxy.resizingType) url.searchParams.set('rs', options.imgproxy.resizingType);\n if (options.imgproxy.format) url.searchParams.set('fmt', options.imgproxy.format);\n if (options.imgproxy.quality) url.searchParams.set('q', String(options.imgproxy.quality));\n }\n return url.toString();\n }\n\n /**\n * Generates public URL for a file addressed by its SHA-256 hash.\n */\n getFileUrlByHash(hash: string): string {\n return `${this.http.getEndpoint()}/h/${encodeURIComponent(hash)}`;\n }\n\n /**\n * Deletes a file by bucket ID and file ID, invalidating any cached copies.\n */\n async deleteFile(bucketId: string, fileId: string, signal?: AbortSignal): Promise<void> {\n try {\n await this.http.delete(`/api/upload/unlink/${encodeURIComponent(bucketId)}/${encodeURIComponent(fileId)}`, {\n signal,\n });\n } catch (err: unknown) {\n // If 404, file is already gone, consider success\n if (err instanceof VFSError && err.status === 404) {\n // No-op\n } else {\n throw err;\n }\n }\n\n if (this.cache) {\n await this.cache.delete(`vfs:${bucketId}:${fileId}`);\n }\n }\n\n /**\n * Deletes a file record by catalog ID.\n */\n async deleteFileById(id: string, signal?: AbortSignal): Promise<void> {\n await this.http.delete(`/api/upload/${encodeURIComponent(id)}`, { signal });\n }\n\n /**\n * Deletes all files within a specified bucket.\n */\n async deleteAllInBucket(bucketId: string, signal?: AbortSignal): Promise<void> {\n await this.http.delete(`/api/upload/bucket/${encodeURIComponent(bucketId)}`, { signal });\n }\n\n /**\n * Lists stored objects in a bucket.\n */\n async listFiles(options: ListFilesOptions = {}): Promise<AttachmentResponse[]> {\n const bucketId = options.bucketId || this.defaultBucket;\n const res = await this.http.get<AttachmentResponse[]>('/api/upload', {\n params: { bucket_id: bucketId },\n signal: options.signal,\n });\n return res.data;\n }\n\n /**\n * Gets real-time statistics for a bucket (total files, storage usage, read/write counts, quota limits).\n */\n async getBucketStats(bucketId?: string, signal?: AbortSignal): Promise<BucketStat> {\n const targetBucket = bucketId || this.defaultBucket;\n const res = await this.http.get<BucketStat>(`/api/bucket/stats/${encodeURIComponent(targetBucket)}`, { signal });\n return res.data;\n }\n\n /**\n * Gets a list of all bucket statistics.\n */\n async getAllBucketStats(\n params?: { page?: number; limit?: number },\n signal?: AbortSignal\n ): Promise<BucketStatsListResponse> {\n const res = await this.http.get<BucketStat[]>('/api/bucket/stats', {\n params,\n signal,\n });\n return {\n items: res.data,\n total: res.totalCount,\n };\n }\n\n /**\n * Gets overall system summary of bucket statistics (total buckets, total files, total storage size).\n */\n async getBucketSummary(signal?: AbortSignal): Promise<BucketStatSummary> {\n const res = await this.http.get<BucketStatSummary>('/api/bucket/stats/summary', { signal });\n return res.data;\n }\n\n /**\n * Gets date-based usage growth metrics for a bucket.\n */\n async getBucketMetrics(bucketId?: string, signal?: AbortSignal): Promise<BucketMetricsByDate[]> {\n const targetBucket = bucketId || this.defaultBucket;\n const res = await this.http.get<BucketMetricsByDate[]>(\n `/api/bucket/stats/${encodeURIComponent(targetBucket)}/metrics`,\n { signal }\n );\n return res.data;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/errors.ts","../src/http/error.ts","../package.json","../src/version.ts","../src/http/client.ts","../src/cache/memory.ts","../src/cache/browser.ts","../src/cache/filesystem.ts","../src/cache/factory.ts","../src/crypto/hash.ts","../src/upload/normalizer.ts","../src/upload/preflight.ts","../src/upload/single.ts","../src/upload/session.ts","../src/upload/queue.ts","../src/client.ts"],"names":["expiresAt"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Problem details (RFC 7807) and SDK error definitions.\n */\n\nexport interface ProblemDetails {\n type?: string;\n title?: string;\n status?: number;\n detail?: string;\n instance?: string;\n extensions?: {\n trace_id?: string;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\nexport class VFSError extends Error {\n readonly status: number;\n readonly code?: string;\n readonly problem?: ProblemDetails;\n readonly headers?: Headers;\n\n constructor(\n message: string,\n options?: {\n status?: number;\n code?: string;\n problem?: ProblemDetails;\n headers?: Headers;\n cause?: unknown;\n }\n ) {\n super(message);\n this.name = 'VFSError';\n this.status = options?.status ?? 500;\n this.code = options?.code;\n this.problem = options?.problem;\n this.headers = options?.headers;\n\n if (options?.cause) {\n this.cause = options.cause;\n }\n\n Object.setPrototypeOf(this, VFSError.prototype);\n }\n\n /**\n * Helper to check if error is a specific HTTP status code.\n */\n is(status: number): boolean {\n return this.status === status;\n }\n}\n","import { VFSError, type ProblemDetails } from '../types/errors';\n\n/**\n * Parses an HTTP Response into a structured VFSError with RFC 7807 Problem Details.\n */\nexport async function parseHttpError(res: Response): Promise<VFSError> {\n const status = res.status;\n const contentType = res.headers.get('content-type') || '';\n let errorMessage = res.statusText || `Request failed with status ${status}`;\n let problemDetails: ProblemDetails | undefined;\n let code: string | undefined;\n\n try {\n if (contentType.includes('application/json') || contentType.includes('application/problem+json')) {\n const json = await res.json();\n if (json && typeof json === 'object') {\n problemDetails = json as ProblemDetails;\n\n if (problemDetails.detail) {\n errorMessage = problemDetails.detail;\n } else if (problemDetails.title) {\n errorMessage = problemDetails.title;\n } else if ((json as { error?: string }).error) {\n errorMessage = (json as { error: string }).error;\n } else if ((json as { message?: string }).message) {\n errorMessage = (json as { message: string }).message;\n }\n\n if (problemDetails.extensions?.code && typeof problemDetails.extensions.code === 'string') {\n code = problemDetails.extensions.code;\n }\n }\n } else {\n const text = await res.text();\n if (text) {\n errorMessage = text;\n }\n }\n } catch {\n // Keep fallback statusText if body cannot be parsed\n }\n\n return new VFSError(errorMessage, {\n status,\n code,\n problem: problemDetails,\n headers: res.headers,\n });\n}\n","{\n \"name\": \"@cubis/vfsclient\",\n \"version\": \"0.0.2\",\n \"description\": \"Isomorphic VFS Client SDK for Node.js and Browser file uploads, chunked streaming, caching, and bucket management\",\n \"keywords\": [\n \"vfs\",\n \"storage\",\n \"upload\",\n \"chunked-upload\",\n \"resumable\",\n \"cache\",\n \"file-management\",\n \"s3\",\n \"r2\",\n \"edge\",\n \"cubis\"\n ],\n \"author\": \"CUBETIQ Labs\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/cubetiqlabs/vfs-server.git\",\n \"directory\": \"packages/vfsclient\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"bun test\",\n \"prepublishOnly\": \"bun run test && bun run typecheck && bun run build\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.20.2\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n }\n}\n","import packageJson from '../package.json';\n\nexport const SDK_NAME: string = packageJson.name || 'vfsclient';\nexport const SDK_VERSION: string = packageJson.version || '0.0.1';\n\n/**\n * Returns the detected runtime name and version.\n * e.g. \"Bun/1.4.3 (darwin-arm64)\", \"Node.js/v22.2.0 (darwin-arm64)\", or \"Browser\"\n */\nexport function getRuntimeInfo(): string {\n if (typeof process !== 'undefined' && process.versions) {\n const platform = process.platform ? `; ${process.platform}-${process.arch || 'unknown'}` : '';\n if (process.versions.bun) {\n return `Bun/${process.versions.bun}${platform}`;\n }\n if (process.versions.node) {\n return `Node.js/${process.versions.node}${platform}`;\n }\n }\n\n // Deno check\n if (typeof (globalThis as any).Deno !== 'undefined') {\n const deno = (globalThis as any).Deno;\n const version = deno.version?.deno || 'unknown';\n return `Deno/${version}`;\n }\n\n if (typeof window !== 'undefined') {\n return 'Browser';\n }\n\n return 'Unknown';\n}\n\n/**\n * Builds standard User-Agent string:\n * e.g. \"@cubis/vfsclient/1.0.0 (Bun/1.4.3; darwin-arm64)\"\n */\nexport function getUserAgent(): string {\n const runtime = getRuntimeInfo();\n return `${SDK_NAME}/${SDK_VERSION} (${runtime})`;\n}\n","import type { VFSClientOptions } from '../types';\nimport { VFSError } from '../types/errors';\nimport { parseHttpError } from './error';\nimport { getUserAgent } from '../version';\n\nexport interface RequestOptions {\n headers?: Record<string, string>;\n params?: Record<string, string | number | boolean | undefined | null>;\n body?: BodyInit | null;\n timeout?: number;\n signal?: AbortSignal;\n skipAuth?: boolean;\n}\n\nexport interface HttpResponse<T = unknown> {\n data: T;\n status: number;\n statusText: string;\n headers: Headers;\n totalCount?: number;\n}\n\nexport class HttpClient {\n private readonly endpoint: string;\n private readonly apiKey?: string;\n private readonly apiHash?: string;\n private readonly defaultTimeout: number;\n private readonly fetchImpl: typeof fetch;\n private readonly debug?: (message: string, ...args: unknown[]) => void;\n private readonly maxRetries: number;\n private readonly retryDelay: number;\n private readonly retryOnStatus: number[];\n\n constructor(options: VFSClientOptions) {\n if (!options.endpoint) {\n throw new VFSError('Endpoint URL is required', { status: 400 });\n }\n this.endpoint = options.endpoint.replace(/\\/+$/, '');\n this.apiKey = options.apiKey;\n this.apiHash = options.apiHash;\n this.defaultTimeout = options.timeout ?? 30000;\n const rawFetch = options.fetch ?? globalThis.fetch;\n this.fetchImpl = typeof rawFetch === 'function' ? rawFetch.bind(globalThis) : rawFetch;\n\n if (typeof options.debug === 'function') {\n this.debug = options.debug;\n } else if (options.debug === true) {\n this.debug = (msg, ...args) => console.debug(`[VFSClient] ${msg}`, ...args);\n }\n\n this.maxRetries = options.retry?.maxRetries ?? 2;\n this.retryDelay = options.retry?.retryDelay ?? 500;\n this.retryOnStatus = options.retry?.retryOnStatus ?? [502, 503, 504];\n }\n\n getEndpoint(): string {\n return this.endpoint;\n }\n\n getApiKey(): string | undefined {\n return this.apiKey;\n }\n\n getApiHash(): string | undefined {\n return this.apiHash;\n }\n\n private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined | null>): string {\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(`${this.endpoint}${cleanPath}`);\n\n if (params) {\n for (const [key, val] of Object.entries(params)) {\n if (val !== undefined && val !== null) {\n url.searchParams.append(key, String(val));\n }\n }\n }\n\n return url.toString();\n }\n\n private buildHeaders(customHeaders?: Record<string, string>, skipAuth?: boolean): Headers {\n const headers = new Headers();\n\n const ua = getUserAgent();\n try {\n headers.set('User-Agent', ua);\n } catch {\n // Browser environment may restrict setting User-Agent header\n }\n headers.set('x-user-agent', ua);\n\n if (!skipAuth) {\n if (this.apiKey) {\n headers.set('x-api-key', this.apiKey);\n }\n if (this.apiHash) {\n headers.set('x-api-hash', this.apiHash);\n }\n }\n\n if (customHeaders) {\n for (const [key, value] of Object.entries(customHeaders)) {\n headers.set(key, value);\n }\n }\n\n return headers;\n }\n\n async request<T = unknown>(method: string, path: string, options: RequestOptions = {}): Promise<HttpResponse<T>> {\n const url = this.buildUrl(path, options.params);\n const headers = this.buildHeaders(options.headers, options.skipAuth);\n const timeoutMs = options.timeout ?? this.defaultTimeout;\n\n let attempt = 0;\n let lastError: unknown;\n\n while (attempt <= this.maxRetries) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(new Error('Request timed out')), timeoutMs);\n\n // Link external AbortSignal if provided\n if (options.signal) {\n options.signal.addEventListener('abort', () => controller.abort(options.signal?.reason), { once: true });\n }\n\n this.debug?.(`${method} ${url} (Attempt ${attempt + 1}/${this.maxRetries + 1})`);\n\n try {\n const res = await this.fetchImpl(url, {\n method,\n headers,\n body: options.body,\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n if (!res.ok) {\n // Check if retryable\n if (attempt < this.maxRetries && this.retryOnStatus.includes(res.status)) {\n attempt++;\n const backoff = this.retryDelay * Math.pow(2, attempt - 1);\n this.debug?.(`HTTP ${res.status} on ${method} ${url}. Retrying in ${backoff}ms...`);\n await new Promise((resolve) => setTimeout(resolve, backoff));\n continue;\n }\n\n throw await parseHttpError(res);\n }\n\n // Parse successful response\n let data: T;\n const contentType = res.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n data = (await res.json()) as T;\n } else if (contentType.includes('text/')) {\n data = (await res.text()) as unknown as T;\n } else {\n // Return raw Response or Blob based on caller expectation\n data = res as unknown as T;\n }\n\n let totalCount: number | undefined;\n const totalCountHeader = res.headers.get('x-total-count');\n if (totalCountHeader) {\n const parsed = parseInt(totalCountHeader, 10);\n if (!isNaN(parsed)) {\n totalCount = parsed;\n }\n }\n\n return {\n data,\n status: res.status,\n statusText: res.statusText,\n headers: res.headers,\n totalCount,\n };\n } catch (err: unknown) {\n clearTimeout(timer);\n\n if (err instanceof VFSError) {\n throw err;\n }\n\n lastError = err;\n const isAbort = options.signal?.aborted;\n if (isAbort) {\n throw new VFSError('Request was aborted by caller', { status: 499, cause: err });\n }\n\n if (attempt < this.maxRetries) {\n attempt++;\n const backoff = this.retryDelay * Math.pow(2, attempt - 1);\n this.debug?.(`Network error on ${method} ${url}. Retrying in ${backoff}ms...`, err);\n await new Promise((resolve) => setTimeout(resolve, backoff));\n continue;\n }\n\n throw new VFSError(err instanceof Error ? err.message : 'Network request failed', {\n status: 0,\n cause: err,\n });\n }\n }\n\n throw lastError instanceof VFSError\n ? lastError\n : new VFSError('Request failed after retries', { status: 500, cause: lastError });\n }\n\n get<T = unknown>(path: string, options?: RequestOptions): Promise<HttpResponse<T>> {\n return this.request<T>('GET', path, options);\n }\n\n post<T = unknown>(path: string, body?: BodyInit | null, options?: RequestOptions): Promise<HttpResponse<T>> {\n return this.request<T>('POST', path, { ...options, body });\n }\n\n put<T = unknown>(path: string, body?: BodyInit | null, options?: RequestOptions): Promise<HttpResponse<T>> {\n return this.request<T>('PUT', path, { ...options, body });\n }\n\n delete<T = unknown>(path: string, options?: RequestOptions): Promise<HttpResponse<T>> {\n return this.request<T>('DELETE', path, options);\n }\n\n /**\n * Fetches raw Response object directly (useful for streaming file downloads).\n */\n async fetchRaw(path: string, options: RequestOptions = {}): Promise<Response> {\n const url = this.buildUrl(path, options.params);\n const headers = this.buildHeaders(options.headers, options.skipAuth);\n const timeoutMs = options.timeout ?? this.defaultTimeout;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(new Error('Request timed out')), timeoutMs);\n\n if (options.signal) {\n options.signal.addEventListener('abort', () => controller.abort(options.signal?.reason), { once: true });\n }\n\n try {\n const res = await this.fetchImpl(url, {\n method: 'GET',\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n if (!res.ok) {\n throw await parseHttpError(res);\n }\n\n return res;\n } catch (err: unknown) {\n clearTimeout(timer);\n if (err instanceof VFSError) {\n throw err;\n }\n throw new VFSError(err instanceof Error ? err.message : 'Download failed', {\n status: 0,\n cause: err,\n });\n }\n }\n}\n","import type { VFSCacheAdapter, VFSCacheEntry } from './adapter';\n\nexport interface MemoryCacheOptions {\n /**\n * Maximum number of items in cache (default: 200).\n */\n maxItems?: number;\n\n /**\n * Default TTL in seconds (default: 3600 = 1 hour, 0 for indefinite).\n */\n defaultTTL?: number;\n}\n\nexport class MemoryCacheAdapter implements VFSCacheAdapter {\n private readonly store = new Map<string, VFSCacheEntry>();\n private readonly maxItems: number;\n private readonly defaultTTL: number;\n\n constructor(options: MemoryCacheOptions = {}) {\n this.maxItems = options.maxItems ?? 200;\n this.defaultTTL = options.defaultTTL ?? 3600;\n }\n\n private isExpired(entry: VFSCacheEntry): boolean {\n if (!entry.expiresAt) return false;\n return Date.now() > entry.expiresAt;\n }\n\n get(key: string): VFSCacheEntry | null {\n const entry = this.store.get(key);\n if (!entry) return null;\n\n if (this.isExpired(entry)) {\n this.store.delete(key);\n return null;\n }\n\n // Refresh LRU order\n this.store.delete(key);\n this.store.set(key, entry);\n return entry;\n }\n\n set(key: string, entry: VFSCacheEntry, ttlSeconds?: number): void {\n const ttl = ttlSeconds ?? this.defaultTTL;\n const expiresAt = ttl > 0 ? Date.now() + ttl * 1000 : undefined;\n\n const clonedEntry: VFSCacheEntry = {\n ...entry,\n expiresAt,\n };\n\n if (this.store.has(key)) {\n this.store.delete(key);\n } else if (this.store.size >= this.maxItems) {\n // Evict oldest (first key in map)\n const oldestKey = this.store.keys().next().value;\n if (oldestKey !== undefined) {\n this.store.delete(oldestKey);\n }\n }\n\n this.store.set(key, clonedEntry);\n }\n\n delete(key: string): boolean {\n return this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n\n has(key: string): boolean {\n const entry = this.store.get(key);\n if (!entry) return false;\n if (this.isExpired(entry)) {\n this.store.delete(key);\n return false;\n }\n return true;\n }\n\n size(): number {\n return this.store.size;\n }\n}\n","import type { VFSCacheAdapter, VFSCacheEntry } from './adapter';\nimport { MemoryCacheAdapter } from './memory';\n\nexport interface BrowserCacheOptions {\n cacheName?: string;\n defaultTTL?: number;\n}\n\nexport class BrowserCacheAdapter implements VFSCacheAdapter {\n private readonly cacheName: string;\n private readonly defaultTTL: number;\n private readonly fallback: MemoryCacheAdapter;\n\n constructor(options: BrowserCacheOptions = {}) {\n this.cacheName = options.cacheName ?? 'vfs-client-cache-v1';\n this.defaultTTL = options.defaultTTL ?? 3600;\n this.fallback = new MemoryCacheAdapter({ defaultTTL: this.defaultTTL });\n }\n\n private isAvailable(): boolean {\n return typeof window !== 'undefined' && typeof window.caches !== 'undefined';\n }\n\n private urlForKey(key: string): string {\n return `https://vfs-cache.internal/${encodeURIComponent(key)}`;\n }\n\n async get(key: string): Promise<VFSCacheEntry | null> {\n if (!this.isAvailable()) {\n return this.fallback.get(key);\n }\n\n try {\n const cache = await window.caches.open(this.cacheName);\n const res = await cache.match(this.urlForKey(key));\n if (!res) return null;\n\n const expiresHeader = res.headers.get('x-vfs-expires-at');\n if (expiresHeader) {\n const expiresAt = parseInt(expiresHeader, 10);\n if (!isNaN(expiresAt) && Date.now() > expiresAt) {\n await cache.delete(this.urlForKey(key));\n return null;\n }\n }\n\n const buffer = await res.arrayBuffer();\n const contentType = res.headers.get('content-type') || undefined;\n const name = res.headers.get('x-vfs-name') || undefined;\n const hash = res.headers.get('x-vfs-hash') || undefined;\n const createdAtHeader = res.headers.get('x-vfs-created-at');\n const createdAt = createdAtHeader ? parseInt(createdAtHeader, 10) : Date.now();\n const expiresAt = expiresHeader ? parseInt(expiresHeader, 10) : undefined;\n\n return {\n data: new Uint8Array(buffer),\n contentType,\n name,\n size: buffer.byteLength,\n hash,\n createdAt,\n expiresAt,\n };\n } catch {\n return this.fallback.get(key);\n }\n }\n\n async set(key: string, entry: VFSCacheEntry, ttlSeconds?: number): Promise<void> {\n if (!this.isAvailable()) {\n this.fallback.set(key, entry, ttlSeconds);\n return;\n }\n\n try {\n const ttl = ttlSeconds ?? this.defaultTTL;\n const expiresAt = ttl > 0 ? Date.now() + ttl * 1000 : undefined;\n\n const headers = new Headers();\n if (entry.contentType) headers.set('content-type', entry.contentType);\n if (entry.name) headers.set('x-vfs-name', entry.name);\n if (entry.hash) headers.set('x-vfs-hash', entry.hash);\n headers.set('x-vfs-created-at', String(entry.createdAt));\n if (expiresAt) headers.set('x-vfs-expires-at', String(expiresAt));\n\n const response = new Response(entry.data as any, { headers });\n const cache = await window.caches.open(this.cacheName);\n await cache.put(this.urlForKey(key), response);\n } catch {\n this.fallback.set(key, entry, ttlSeconds);\n }\n }\n\n async delete(key: string): Promise<boolean> {\n if (!this.isAvailable()) {\n return this.fallback.delete(key);\n }\n\n try {\n const cache = await window.caches.open(this.cacheName);\n return await cache.delete(this.urlForKey(key));\n } catch {\n return this.fallback.delete(key);\n }\n }\n\n async clear(): Promise<void> {\n if (!this.isAvailable()) {\n this.fallback.clear();\n return;\n }\n\n try {\n await window.caches.delete(this.cacheName);\n } catch {\n this.fallback.clear();\n }\n }\n\n async has(key: string): Promise<boolean> {\n const entry = await this.get(key);\n return entry !== null;\n }\n}\n","import type { VFSCacheAdapter, VFSCacheEntry } from './adapter';\nimport { MemoryCacheAdapter } from './memory';\n\nexport interface FileSystemCacheOptions {\n /**\n * Directory to store cached files (default: \"./.vfs-cache\").\n */\n cacheDir?: string;\n\n /**\n * Default TTL in seconds (default: 3600 = 1 hour).\n */\n defaultTTL?: number;\n}\n\ninterface StoredMeta {\n contentType?: string;\n name?: string;\n size: number;\n hash?: string;\n createdAt: number;\n expiresAt?: number;\n}\n\nexport class FileSystemCacheAdapter implements VFSCacheAdapter {\n private readonly cacheDir: string;\n private readonly defaultTTL: number;\n private readonly fallback: MemoryCacheAdapter;\n private isNodeEnv: boolean;\n\n constructor(options: FileSystemCacheOptions = {}) {\n this.cacheDir = options.cacheDir ?? './.vfs-cache';\n this.defaultTTL = options.defaultTTL ?? 3600;\n this.fallback = new MemoryCacheAdapter({ defaultTTL: this.defaultTTL });\n this.isNodeEnv = typeof process !== 'undefined' && Boolean(process.versions?.node || process.versions?.bun);\n }\n\n private sanitizeKey(key: string): string {\n return encodeURIComponent(key).replace(/[*?:<>|\"/\\\\%]/g, '_');\n }\n\n private async getFs() {\n if (!this.isNodeEnv) return null;\n try {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n return { fs, path };\n } catch {\n return null;\n }\n }\n\n private async ensureDir(): Promise<boolean> {\n const mods = await this.getFs();\n if (!mods) return false;\n try {\n await mods.fs.mkdir(this.cacheDir, { recursive: true });\n return true;\n } catch {\n return false;\n }\n }\n\n async get(key: string): Promise<VFSCacheEntry | null> {\n const mods = await this.getFs();\n if (!mods) return this.fallback.get(key);\n\n const safeKey = this.sanitizeKey(key);\n const dataPath = mods.path.join(this.cacheDir, `${safeKey}.bin`);\n const metaPath = mods.path.join(this.cacheDir, `${safeKey}.json`);\n\n try {\n const metaRaw = await mods.fs.readFile(metaPath, 'utf8');\n const meta = JSON.parse(metaRaw) as StoredMeta;\n\n if (meta.expiresAt && Date.now() > meta.expiresAt) {\n await Promise.allSettled([mods.fs.unlink(dataPath), mods.fs.unlink(metaPath)]);\n return null;\n }\n\n const buffer = await mods.fs.readFile(dataPath);\n return {\n data: new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength),\n contentType: meta.contentType,\n name: meta.name,\n size: meta.size,\n hash: meta.hash,\n createdAt: meta.createdAt,\n expiresAt: meta.expiresAt,\n };\n } catch {\n return null;\n }\n }\n\n async set(key: string, entry: VFSCacheEntry, ttlSeconds?: number): Promise<void> {\n const mods = await this.getFs();\n if (!mods) {\n this.fallback.set(key, entry, ttlSeconds);\n return;\n }\n\n if (!(await this.ensureDir())) {\n this.fallback.set(key, entry, ttlSeconds);\n return;\n }\n\n const ttl = ttlSeconds ?? this.defaultTTL;\n const expiresAt = ttl > 0 ? Date.now() + ttl * 1000 : undefined;\n const safeKey = this.sanitizeKey(key);\n const dataPath = mods.path.join(this.cacheDir, `${safeKey}.bin`);\n const metaPath = mods.path.join(this.cacheDir, `${safeKey}.json`);\n\n const meta: StoredMeta = {\n contentType: entry.contentType,\n name: entry.name,\n size: entry.size,\n hash: entry.hash,\n createdAt: entry.createdAt,\n expiresAt,\n };\n\n try {\n await Promise.all([\n mods.fs.writeFile(dataPath, entry.data),\n mods.fs.writeFile(metaPath, JSON.stringify(meta), 'utf8'),\n ]);\n } catch {\n this.fallback.set(key, entry, ttlSeconds);\n }\n }\n\n async delete(key: string): Promise<boolean> {\n const mods = await this.getFs();\n if (!mods) return this.fallback.delete(key);\n\n const safeKey = this.sanitizeKey(key);\n const dataPath = mods.path.join(this.cacheDir, `${safeKey}.bin`);\n const metaPath = mods.path.join(this.cacheDir, `${safeKey}.json`);\n\n try {\n await Promise.allSettled([mods.fs.unlink(dataPath), mods.fs.unlink(metaPath)]);\n return true;\n } catch {\n return false;\n }\n }\n\n async clear(): Promise<void> {\n const mods = await this.getFs();\n if (!mods) {\n this.fallback.clear();\n return;\n }\n\n try {\n const files = await mods.fs.readdir(this.cacheDir);\n await Promise.allSettled(files.map((file) => mods.fs.unlink(mods.path.join(this.cacheDir, file))));\n } catch {\n this.fallback.clear();\n }\n }\n\n async has(key: string): Promise<boolean> {\n const entry = await this.get(key);\n return entry !== null;\n }\n}\n","import type { VFSCacheAdapter } from './adapter';\nimport { MemoryCacheAdapter } from './memory';\nimport { BrowserCacheAdapter } from './browser';\nimport { FileSystemCacheAdapter } from './filesystem';\n\nexport * from './adapter';\nexport * from './memory';\nexport * from './browser';\nexport * from './filesystem';\n\n/**\n * Creates the most suitable cache adapter for the current runtime environment.\n * - In Browser: Uses BrowserCacheAdapter (CacheStorage / IndexedDB / Memory fallback)\n * - In Node.js / Bun: Uses FileSystemCacheAdapter (or MemoryCacheAdapter if directory unwritable)\n * - Otherwise: Uses MemoryCacheAdapter\n */\nexport function createDefaultCache(): VFSCacheAdapter {\n if (typeof window !== 'undefined' && typeof window.caches !== 'undefined') {\n return new BrowserCacheAdapter();\n }\n\n if (typeof process !== 'undefined' && (process.versions?.node || process.versions?.bun)) {\n return new FileSystemCacheAdapter();\n }\n\n return new MemoryCacheAdapter();\n}\n","/**\n * Isomorphic SHA-256 calculation for Browser, Node.js, and Bun.\n */\n\n/**\n * Converts an ArrayBuffer or Uint8Array to a hex string.\n */\nexport function bufferToHex(buffer: ArrayBuffer | Uint8Array): string {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i].toString(16).padStart(2, '0');\n }\n return hex;\n}\n\n/**\n * Calculates SHA-256 hex digest of an ArrayBuffer or Uint8Array.\n */\nexport async function calculateSHA256(data: ArrayBuffer | Uint8Array | string): Promise<string> {\n let bytes: Uint8Array;\n if (typeof data === 'string') {\n bytes = new TextEncoder().encode(data);\n } else if (data instanceof Uint8Array) {\n bytes = data;\n } else {\n bytes = new Uint8Array(data);\n }\n\n // 1. Try globalThis.crypto.subtle (available in Browser, Node 18+, Bun, Deno, Cloudflare Workers)\n if (typeof globalThis !== 'undefined' && globalThis.crypto?.subtle?.digest) {\n const hashBuffer = await globalThis.crypto.subtle.digest('SHA-256', bytes as any);\n return bufferToHex(hashBuffer);\n }\n\n // 2. Fallback to node:crypto if running in an older Node or environment without WebCrypto\n try {\n const nodeCrypto = await import('node:crypto');\n return nodeCrypto.createHash('sha256').update(bytes).digest('hex');\n } catch {\n throw new Error('No crypto implementation found in current environment for SHA-256');\n }\n}\n\n/**\n * Calculates SHA-256 of a Blob or File.\n */\nexport async function calculateBlobSHA256(blob: Blob): Promise<string> {\n const arrayBuffer = await blob.arrayBuffer();\n return calculateSHA256(arrayBuffer);\n}\n","import type { UploadInput } from '../types';\nimport { calculateSHA256 } from '../crypto/hash';\nimport { VFSError } from '../types/errors';\n\nexport interface NormalizedFileInput {\n bytes: Uint8Array;\n name: string;\n size: number;\n contentType: string;\n hash: string;\n}\n\n/**\n * Detects basic mime type from file name extension.\n */\nexport function guessContentType(filename: string): string {\n const ext = filename.split('.').pop()?.toLowerCase();\n switch (ext) {\n case 'jpg':\n case 'jpeg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n case 'gif':\n return 'image/gif';\n case 'webp':\n return 'image/webp';\n case 'svg':\n return 'image/svg+xml';\n case 'pdf':\n return 'application/pdf';\n case 'json':\n return 'application/json';\n case 'txt':\n return 'text/plain';\n case 'html':\n return 'text/html';\n case 'csv':\n return 'text/csv';\n case 'zip':\n return 'application/zip';\n case 'tar':\n return 'application/x-tar';\n case 'gz':\n return 'application/gzip';\n case 'mp4':\n return 'video/mp4';\n case 'mp3':\n return 'audio/mpeg';\n default:\n return 'application/octet-stream';\n }\n}\n\n/**\n * Normalizes any supported input into an in-memory Uint8Array with metadata and SHA-256 hash.\n */\nexport async function normalizeUploadInput(input: UploadInput): Promise<NormalizedFileInput> {\n const file = input.file;\n let bytes: Uint8Array = new Uint8Array(0);\n let name = input.name || 'unnamed_file';\n let contentType = input.contentType;\n\n // 1. File (Browser)\n if (typeof File !== 'undefined' && file instanceof File) {\n name = input.name || file.name;\n contentType = contentType || file.type || guessContentType(name);\n const arrayBuffer = await file.arrayBuffer();\n bytes = new Uint8Array(arrayBuffer);\n }\n // 2. Blob\n else if (typeof Blob !== 'undefined' && file instanceof Blob) {\n contentType = contentType || file.type || guessContentType(name);\n const arrayBuffer = await file.arrayBuffer();\n bytes = new Uint8Array(arrayBuffer);\n }\n // 3. Uint8Array or Buffer\n else if (file instanceof Uint8Array) {\n bytes = file;\n contentType = contentType || guessContentType(name);\n }\n // 4. ArrayBuffer\n else if (file instanceof ArrayBuffer) {\n bytes = new Uint8Array(file);\n contentType = contentType || guessContentType(name);\n }\n // 5. ReadableStream (Web Streams)\n else if (typeof ReadableStream !== 'undefined' && file instanceof ReadableStream) {\n const reader = file.getReader();\n const chunks: Uint8Array[] = [];\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) chunks.push(value);\n }\n const totalLength = chunks.reduce((acc, c) => acc + c.length, 0);\n bytes = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.length;\n }\n contentType = contentType || guessContentType(name);\n }\n // 6. Node.js Readable Stream\n else if (typeof file === 'object' && file !== null && 'on' in file && typeof (file as any).pipe === 'function') {\n const chunks: Uint8Array[] = [];\n await new Promise<void>((resolve, reject) => {\n (file as any).on('data', (chunk: any) => {\n if (typeof chunk === 'string') {\n chunks.push(new TextEncoder().encode(chunk));\n } else if (chunk instanceof Uint8Array) {\n chunks.push(chunk);\n }\n });\n (file as any).on('end', () => resolve());\n (file as any).on('error', (err: any) => reject(err));\n });\n const totalLength = chunks.reduce((acc, c) => acc + c.length, 0);\n bytes = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.length;\n }\n contentType = contentType || guessContentType(name);\n }\n // 7. String: File path or base64/raw string\n else if (typeof file === 'string') {\n // Check if it's a file path in Node.js / Bun\n const isNode = typeof process !== 'undefined' && Boolean(process.versions?.node || process.versions?.bun);\n let readFromFile = false;\n\n if (isNode) {\n try {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const stat = await fs.stat(file);\n if (stat.isFile()) {\n const buf = await fs.readFile(file);\n bytes = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n name = input.name || path.basename(file);\n contentType = contentType || guessContentType(name);\n readFromFile = true;\n }\n } catch {\n // Not a valid file path, proceed as string content\n }\n }\n\n if (!readFromFile) {\n if (file.startsWith('data:')) {\n // Data URL\n const commaIdx = file.indexOf(',');\n if (commaIdx !== -1) {\n const mimeMatch = file.slice(0, commaIdx).match(/data:(.*?);/);\n if (mimeMatch && !contentType) {\n contentType = mimeMatch[1];\n }\n const base64Data = file.slice(commaIdx + 1);\n const binaryStr = atob(base64Data);\n bytes = new Uint8Array(binaryStr.length);\n for (let i = 0; i < binaryStr.length; i++) {\n bytes[i] = binaryStr.charCodeAt(i);\n }\n } else {\n bytes = new TextEncoder().encode(file);\n }\n } else {\n bytes = new TextEncoder().encode(file);\n }\n contentType = contentType || guessContentType(name);\n }\n } else {\n throw new VFSError('Unsupported file input type for upload', { status: 400 });\n }\n\n const hash = input.fileHash || (await calculateSHA256(bytes));\n\n return {\n bytes,\n name,\n size: bytes.byteLength,\n contentType: contentType || 'application/octet-stream',\n hash,\n };\n}\n","import type { HttpClient } from '../http/client';\nimport type { PreflightRequest, PreflightResponse } from '../types/models';\nimport { VFSError } from '../types/errors';\n\n/**\n * Checks metadata with VFS Server preflight endpoint before uploading data.\n * Detects quota violations, file size exceedance, and duplicate hits.\n */\nexport async function executePreflight(\n http: HttpClient,\n req: PreflightRequest,\n signal?: AbortSignal\n): Promise<PreflightResponse> {\n try {\n const res = await http.post<PreflightResponse>('/api/upload/preflight', JSON.stringify(req), {\n headers: { 'Content-Type': 'application/json' },\n signal,\n });\n return res.data;\n } catch (err: unknown) {\n // If the server does not implement /preflight (404), fall back to standard upload\n if (err instanceof VFSError && err.status === 404) {\n return {\n allowed: true,\n bucket_id: req.bucket_id,\n size: req.size ?? 0,\n max_upload_bytes: 0,\n };\n }\n throw err;\n }\n}\n","import type { HttpClient } from '../http/client';\nimport type { AttachmentResponse, UploadInput } from '../types';\nimport { normalizeUploadInput } from './normalizer';\nimport { executePreflight } from './preflight';\nimport { VFSError } from '../types/errors';\n\nexport async function uploadSingleFile(\n http: HttpClient,\n input: UploadInput,\n defaultBucket: string = 'default'\n): Promise<AttachmentResponse> {\n const bucketId = input.bucketId || defaultBucket;\n\n input.onProgress?.({\n loaded: 0,\n total: 100,\n percent: 5,\n phase: 'hashing',\n });\n\n const normalized = await normalizeUploadInput(input);\n\n // Preflight check\n let uploadToken: string | undefined;\n if (input.preflight !== false) {\n input.onProgress?.({\n loaded: 0,\n total: normalized.size,\n percent: 15,\n phase: 'preflight',\n });\n\n const preflight = await executePreflight(\n http,\n {\n bucket_id: bucketId,\n name: normalized.name,\n size: normalized.size,\n content_type: normalized.contentType,\n file_hash: normalized.hash,\n },\n input.signal\n );\n\n // If file already exists in bucket, return deduplicated attachment immediately!\n if (preflight.duplicate) {\n input.onProgress?.({\n loaded: normalized.size,\n total: normalized.size,\n percent: 100,\n phase: 'complete',\n });\n return preflight.duplicate;\n }\n\n if (!preflight.allowed) {\n throw new VFSError(preflight.reason || 'Upload rejected by server preflight check', {\n status: 400,\n });\n }\n\n uploadToken = preflight.upload_token;\n }\n\n // Upload bytes via multipart/form-data\n input.onProgress?.({\n loaded: 0,\n total: normalized.size,\n percent: 30,\n phase: 'uploading',\n });\n\n const formData = new FormData();\n // Wrap Uint8Array in Blob\n const blob = new Blob([normalized.bytes as any], { type: normalized.contentType });\n formData.append('file', blob, normalized.name);\n formData.append('bucket_id', bucketId);\n\n if (normalized.hash) {\n formData.append('file_hash', normalized.hash);\n }\n\n if (uploadToken) {\n formData.append('upload_token', uploadToken);\n }\n\n if (input.metadata && Object.keys(input.metadata).length > 0) {\n formData.append('metadata', JSON.stringify(input.metadata));\n }\n\n const res = await http.post<AttachmentResponse>('/api/upload', formData, {\n signal: input.signal,\n });\n\n input.onProgress?.({\n loaded: normalized.size,\n total: normalized.size,\n percent: 100,\n phase: 'complete',\n });\n\n return res.data;\n}\n","import type { HttpClient, HttpResponse } from '../http/client';\nimport type { AttachmentResponse, SessionView, UploadInput } from '../types';\nimport { normalizeUploadInput } from './normalizer';\nimport { calculateSHA256 } from '../crypto/hash';\nimport { VFSError } from '../types/errors';\n\nconst DEFAULT_CHUNK_SIZE = 1048576; // 1 MiB standard VFS chunk size\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nfunction generateSessionId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n return Array.from({ length: 32 }, () => Math.floor(Math.random() * 16).toString(16)).join('');\n}\n\n/**\n * Uploads a file using the VFS Resumable Chunked Session Upload Protocol.\n * Ideal for large files, unstable connections, and edge-distributed storage.\n */\nexport async function uploadSessionFile(\n http: HttpClient,\n input: UploadInput,\n defaultBucket: string = 'default'\n): Promise<AttachmentResponse> {\n const bucketId = input.bucketId || defaultBucket;\n\n input.onProgress?.({\n loaded: 0,\n total: 100,\n percent: 5,\n phase: 'hashing',\n });\n\n const normalized = await normalizeUploadInput(input);\n const sessionId = input.resumeId || generateSessionId();\n const chunkSize = input.chunkSize || DEFAULT_CHUNK_SIZE;\n\n input.onProgress?.({\n loaded: 0,\n total: normalized.size,\n percent: 10,\n phase: 'preflight',\n });\n\n // 1. Create or recover session\n let session: SessionView | undefined;\n let failures = 0;\n\n while (!session) {\n if (input.signal?.aborted) {\n throw new VFSError('Upload aborted', { status: 499 });\n }\n\n try {\n const res = await http.post<SessionView>(\n '/api/upload/sessions',\n JSON.stringify({\n id: sessionId,\n bucket_id: bucketId,\n name: normalized.name,\n size: normalized.size,\n file_hash: normalized.hash,\n content_type: normalized.contentType,\n }),\n {\n headers: { 'Content-Type': 'application/json' },\n signal: input.signal,\n timeout: 15000,\n }\n );\n session = res.data;\n } catch (err: unknown) {\n if (err instanceof VFSError) {\n if (err.status === 410) {\n throw new VFSError('The upload session has expired. Start a new session.', { status: 410, cause: err });\n }\n if ([400, 401, 403, 409, 413, 422, 503].includes(err.status)) {\n throw err;\n }\n }\n\n failures++;\n if (failures >= 5) {\n if (err instanceof VFSError) {\n throw err;\n }\n throw new VFSError(\n `Failed to initialize upload session: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err }\n );\n }\n\n await delay(500 * Math.pow(2, failures - 1));\n }\n }\n\n if (!session) {\n throw new VFSError('Failed to initialize upload session');\n }\n\n let currentSession: SessionView = session;\n\n // 2. Upload chunks\n failures = 0;\n let offset = currentSession.offset;\n\n while (['receiving', 'paused'].includes(currentSession.state) && offset < normalized.size) {\n if (input.signal?.aborted) {\n throw new VFSError('Upload aborted', { status: 499 });\n }\n\n const currentChunkSize = Math.min(currentSession.chunk_size || chunkSize, normalized.size - offset);\n const chunkBytes = normalized.bytes.subarray(offset, offset + currentChunkSize);\n const chunkHash = await calculateSHA256(chunkBytes);\n\n const percent = Math.min(95, 15 + Math.floor((offset / normalized.size) * 80));\n input.onProgress?.({\n loaded: offset,\n total: normalized.size,\n percent,\n phase: 'chunks',\n });\n\n try {\n const chunkRes: HttpResponse<SessionView> = await http.put<SessionView>(\n `/api/upload/sessions/${currentSession.id}/chunks/${offset}`,\n // Pass Uint8Array slice directly as binary body\n chunkBytes as unknown as BodyInit,\n {\n headers: {\n 'Content-Type': 'application/octet-stream',\n 'X-Upload-SHA256': chunkHash,\n },\n signal: input.signal,\n timeout: 30000,\n }\n );\n\n currentSession = chunkRes.data;\n offset = currentSession.offset;\n failures = 0;\n } catch (err: unknown) {\n failures++;\n if (err instanceof VFSError && [400, 401, 403, 410, 413, 422].includes(err.status)) {\n throw err;\n }\n\n if (failures >= 6) {\n throw new VFSError(`Chunk upload failed at offset ${offset}: ${err instanceof Error ? err.message : 'Unknown error'}`, {\n cause: err,\n });\n }\n\n await delay(Math.min(500 * Math.pow(2, failures - 1), 8000));\n\n // Attempt to sync status from server\n try {\n const statusRes = await http.get<SessionView>(`/api/upload/sessions/${currentSession.id}`, {\n timeout: 10000,\n signal: input.signal,\n });\n currentSession = statusRes.data;\n offset = currentSession.offset;\n } catch {\n // Keep previous offset and retry same chunk\n }\n }\n }\n\n // 3. Finalize session\n input.onProgress?.({\n loaded: normalized.size,\n total: normalized.size,\n percent: 96,\n phase: 'finalizing',\n });\n\n if (currentSession.state !== 'complete') {\n for (let attempt = 0; attempt < 5; attempt++) {\n if (input.signal?.aborted) {\n throw new VFSError('Upload aborted', { status: 499 });\n }\n\n try {\n const finalRes = await http.post<SessionView>(\n `/api/upload/sessions/${currentSession.id}/finalize`,\n '{}',\n {\n headers: { 'Content-Type': 'application/json' },\n timeout: 15000,\n signal: input.signal,\n }\n );\n currentSession = finalRes.data;\n break;\n } catch (err: unknown) {\n if (attempt >= 4) {\n throw new VFSError('Failed to finalize session upload', { cause: err });\n }\n await delay(1000);\n }\n }\n }\n\n // Poll until complete or max attempts\n let pollAttempts = 0;\n while (currentSession.state !== 'complete' && pollAttempts < 10) {\n await delay(1000);\n try {\n const statusRes = await http.get<SessionView>(`/api/upload/sessions/${currentSession.id}`, {\n timeout: 5000,\n signal: input.signal,\n });\n currentSession = statusRes.data;\n if (currentSession.state === 'complete') break;\n } catch {\n // Ignore transient polling failure\n }\n pollAttempts++;\n }\n\n input.onProgress?.({\n loaded: normalized.size,\n total: normalized.size,\n percent: 100,\n phase: 'complete',\n });\n\n // Construct standard AttachmentResponse\n const ext = normalized.name.split('.').pop() || '';\n const fileUrl = `${http.getEndpoint()}/v/${bucketId}/${currentSession.id}${ext ? `.${ext}` : ''}`;\n\n return {\n id: currentSession.id,\n bucket_id: bucketId,\n file_id: currentSession.id,\n file_hash: normalized.hash,\n extension: ext,\n name: normalized.name,\n size: normalized.size,\n type: normalized.contentType,\n metadata: input.metadata,\n created_at: new Date().toISOString(),\n url: fileUrl,\n key: `edge:${currentSession.id}`,\n store: 'edge',\n is_stat_synced: true,\n };\n}\n","import type { HttpClient } from '../http/client';\nimport type { AttachmentResponse, UploadInput, UploadMultipleInput } from '../types';\nimport { uploadSingleFile } from './single';\nimport { uploadSessionFile } from './session';\nimport { executePreflight } from './preflight';\nimport { normalizeUploadInput } from './normalizer';\n\nexport interface QueueItem {\n id: string;\n input: UploadInput;\n status: 'pending' | 'uploading' | 'completed' | 'failed' | 'cancelled';\n progress: number;\n response?: AttachmentResponse;\n error?: Error;\n}\n\nexport interface QueueProgress {\n totalFiles: number;\n completedFiles: number;\n failedFiles: number;\n overallPercent: number;\n currentFile?: string;\n}\n\nexport type QueueListener = (progress: QueueProgress, item?: QueueItem) => void;\n\nexport class BackgroundUploadQueue {\n private readonly http: HttpClient;\n private readonly defaultBucket: string;\n private concurrency: number;\n private items: QueueItem[] = [];\n private activeCount: number = 0;\n private isPaused: boolean = false;\n private abortController: AbortController = new AbortController();\n private listeners: Set<QueueListener> = new Set();\n private onFileSuccessCb?: (file: UploadInput, response: AttachmentResponse) => void;\n private onFileErrorCb?: (file: UploadInput, error: Error) => void;\n private onCompletePromiseResolve?: (results: AttachmentResponse[]) => void;\n private onCompletePromiseReject?: (error: Error) => void;\n\n constructor(http: HttpClient, options: { defaultBucket?: string; concurrency?: number } = {}) {\n this.http = http;\n this.defaultBucket = options.defaultBucket || 'default';\n this.concurrency = Math.max(1, options.concurrency || 3);\n }\n\n onProgress(listener: QueueListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n onFileSuccess(cb: (file: UploadInput, response: AttachmentResponse) => void): this {\n this.onFileSuccessCb = cb;\n return this;\n }\n\n onFileError(cb: (file: UploadInput, error: Error) => void): this {\n this.onFileErrorCb = cb;\n return this;\n }\n\n add(input: UploadInput): string {\n const id = typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).slice(2);\n const item: QueueItem = {\n id,\n input,\n status: 'pending',\n progress: 0,\n };\n this.items.push(item);\n this.processQueue();\n return id;\n }\n\n addAll(inputs: UploadInput[]): string[] {\n return inputs.map((input) => this.add(input));\n }\n\n pause(): void {\n this.isPaused = true;\n }\n\n resume(): void {\n if (this.isPaused) {\n this.isPaused = false;\n this.processQueue();\n }\n }\n\n cancel(): void {\n this.abortController.abort();\n this.abortController = new AbortController();\n for (const item of this.items) {\n if (item.status === 'pending' || item.status === 'uploading') {\n item.status = 'cancelled';\n }\n }\n this.activeCount = 0;\n this.notifyProgress();\n this.onCompletePromiseReject?.(new Error('Upload queue cancelled'));\n }\n\n clear(): void {\n this.cancel();\n this.items = [];\n }\n\n getItems(): ReadonlyArray<QueueItem> {\n return [...this.items];\n }\n\n getProgress(): QueueProgress {\n const totalFiles = this.items.length;\n if (totalFiles === 0) {\n return { totalFiles: 0, completedFiles: 0, failedFiles: 0, overallPercent: 100 };\n }\n\n let completedFiles = 0;\n let failedFiles = 0;\n let totalPercentSum = 0;\n let currentFile: string | undefined;\n\n for (const item of this.items) {\n if (item.status === 'completed') {\n completedFiles++;\n totalPercentSum += 100;\n } else if (item.status === 'failed') {\n failedFiles++;\n totalPercentSum += 100;\n } else if (item.status === 'uploading') {\n currentFile = item.input.name;\n totalPercentSum += item.progress;\n }\n }\n\n const overallPercent = Math.round(totalPercentSum / totalFiles);\n return {\n totalFiles,\n completedFiles,\n failedFiles,\n overallPercent,\n currentFile,\n };\n }\n\n private notifyProgress(item?: QueueItem) {\n const progress = this.getProgress();\n for (const listener of this.listeners) {\n try {\n listener(progress, item);\n } catch {\n // Safe swallow\n }\n }\n }\n\n private async processQueue(): Promise<void> {\n if (this.isPaused) return;\n\n while (this.activeCount < this.concurrency) {\n const nextItem = this.items.find((i) => i.status === 'pending');\n if (!nextItem) break;\n\n this.activeCount++;\n nextItem.status = 'uploading';\n this.notifyProgress(nextItem);\n\n this.uploadItem(nextItem)\n .catch(() => {\n // Handled inside uploadItem\n })\n .finally(() => {\n this.activeCount--;\n this.notifyProgress(nextItem);\n this.processQueue();\n this.checkCompletion();\n });\n }\n }\n\n private async uploadItem(item: QueueItem): Promise<void> {\n const inputWithProgress: UploadInput = {\n ...item.input,\n signal: item.input.signal || this.abortController.signal,\n onProgress: (p) => {\n item.progress = p.percent;\n item.input.onProgress?.(p);\n this.notifyProgress(item);\n },\n };\n\n try {\n let result: AttachmentResponse;\n\n // Check preflight protocol or resumable flag\n if (item.input.resumable) {\n result = await uploadSessionFile(this.http, inputWithProgress, this.defaultBucket);\n } else if (item.input.preflight !== false) {\n const normalized = await normalizeUploadInput(item.input);\n const bucketId = item.input.bucketId || this.defaultBucket;\n const preflight = await executePreflight(\n this.http,\n {\n bucket_id: bucketId,\n name: normalized.name,\n size: normalized.size,\n content_type: normalized.contentType,\n file_hash: normalized.hash,\n },\n inputWithProgress.signal\n );\n\n if (preflight.duplicate) {\n result = preflight.duplicate;\n } else if (preflight.upload_protocol === 'edge-chunks-v1') {\n result = await uploadSessionFile(this.http, inputWithProgress, this.defaultBucket);\n } else {\n result = await uploadSingleFile(this.http, inputWithProgress, this.defaultBucket);\n }\n } else {\n result = await uploadSingleFile(this.http, inputWithProgress, this.defaultBucket);\n }\n\n item.status = 'completed';\n item.progress = 100;\n item.response = result;\n this.onFileSuccessCb?.(item.input, result);\n } catch (err: unknown) {\n item.status = 'failed';\n item.error = err instanceof Error ? err : new Error(String(err));\n this.onFileErrorCb?.(item.input, item.error);\n }\n }\n\n private checkCompletion(): void {\n const hasPending = this.items.some((i) => i.status === 'pending' || i.status === 'uploading');\n if (!hasPending && this.activeCount === 0) {\n const successful = this.items.filter((i) => i.status === 'completed' && i.response).map((i) => i.response!);\n this.onCompletePromiseResolve?.(successful);\n }\n }\n\n /**\n * Returns a promise that resolves when all items currently in the queue have completed.\n */\n async wait(): Promise<AttachmentResponse[]> {\n const hasPending = this.items.some((i) => i.status === 'pending' || i.status === 'uploading');\n if (!hasPending && this.activeCount === 0) {\n return this.items.filter((i) => i.status === 'completed' && i.response).map((i) => i.response!);\n }\n\n return new Promise((resolve, reject) => {\n this.onCompletePromiseResolve = resolve;\n this.onCompletePromiseReject = reject;\n });\n }\n}\n\n/**\n * Uploads multiple files with concurrency control and progress tracking.\n */\nexport async function uploadMultipleFiles(\n http: HttpClient,\n input: UploadMultipleInput,\n defaultBucket: string = 'default'\n): Promise<AttachmentResponse[]> {\n const queue = new BackgroundUploadQueue(http, {\n defaultBucket: input.bucketId || defaultBucket,\n concurrency: input.concurrency || 3,\n });\n\n if (input.onProgress) {\n queue.onProgress((p) => input.onProgress?.(p));\n }\n\n if (input.onFileSuccess) {\n queue.onFileSuccess(input.onFileSuccess);\n }\n\n if (input.onFileError) {\n queue.onFileError(input.onFileError);\n }\n\n if (input.signal) {\n input.signal.addEventListener('abort', () => queue.cancel(), { once: true });\n }\n\n queue.addAll(input.files);\n return queue.wait();\n}\n","import type {\n AttachmentResponse,\n BucketMetricsByDate,\n BucketStat,\n BucketStatSummary,\n BucketStatsListResponse,\n GetFileOptions,\n GetUrlOptions,\n ListFilesOptions,\n ObjectManifestResponse,\n UploadInput,\n UploadMultipleInput,\n VFSClientOptions,\n} from './types';\nimport { VFSError } from './types/errors';\nimport { HttpClient } from './http/client';\nimport type { VFSCacheAdapter } from './cache/adapter';\nimport { createDefaultCache } from './cache/factory';\nimport { uploadSingleFile } from './upload/single';\nimport { uploadSessionFile } from './upload/session';\nimport { BackgroundUploadQueue, uploadMultipleFiles } from './upload/queue';\n\nexport class VFSClient {\n readonly http: HttpClient;\n readonly defaultBucket: string;\n readonly cache?: VFSCacheAdapter;\n\n constructor(options: VFSClientOptions) {\n this.http = new HttpClient(options);\n this.defaultBucket = options.defaultBucket || 'default';\n\n if (options.cache === true) {\n this.cache = createDefaultCache();\n } else if (options.cache && typeof options.cache === 'object') {\n this.cache = options.cache;\n }\n }\n\n /**\n * Upload a single file to VFS.\n * Proactively checks preflight quota and deduplication: if identical file content exists,\n * skips transfer and returns the existing file immediately.\n */\n async upload(input: UploadInput): Promise<AttachmentResponse> {\n if (input.resumable) {\n return uploadSessionFile(this.http, input, this.defaultBucket);\n }\n return uploadSingleFile(this.http, input, this.defaultBucket);\n }\n\n /**\n * Upload multiple files with concurrency control, progress reporting, and stream/chunk support.\n */\n async uploadMultiple(input: UploadMultipleInput): Promise<AttachmentResponse[]> {\n return uploadMultipleFiles(this.http, input, this.defaultBucket);\n }\n\n /**\n * Creates a background upload queue manager for continuous uploads with pause/resume and events.\n */\n createBackgroundQueue(options?: { concurrency?: number; bucketId?: string }): BackgroundUploadQueue {\n return new BackgroundUploadQueue(this.http, {\n defaultBucket: options?.bucketId || this.defaultBucket,\n concurrency: options?.concurrency || 3,\n });\n }\n\n /**\n * Retrieves a file from VFS with multi-tier caching (Browser CacheStorage / Server Filesystem).\n */\n async getFile(\n bucketId: string,\n fileId: string,\n options: GetFileOptions = {}\n ): Promise<Blob | ArrayBuffer | ReadableStream<Uint8Array> | string | unknown> {\n const cacheKey = `vfs:${bucketId}:${fileId}`;\n const shouldUseCache = options.useCache !== false && Boolean(this.cache);\n\n // 1. Check cache first\n if (shouldUseCache && this.cache) {\n const cached = await this.cache.get(cacheKey);\n if (cached) {\n if (options.responseType === 'arrayBuffer') {\n return cached.data.buffer.slice(cached.data.byteOffset, cached.data.byteOffset + cached.data.byteLength);\n }\n if (options.responseType === 'text') {\n return new TextDecoder().decode(cached.data);\n }\n if (options.responseType === 'json') {\n return JSON.parse(new TextDecoder().decode(cached.data));\n }\n if (options.responseType === 'stream') {\n return new ReadableStream({\n start(controller) {\n controller.enqueue(cached.data);\n controller.close();\n },\n });\n }\n // Default: Blob\n return new Blob([cached.data as any], { type: cached.contentType });\n }\n }\n\n // 2. Fetch from VFS Server\n const params: Record<string, string | number | boolean | undefined> = {};\n if (options.download) {\n params.download = true;\n }\n if (options.imgproxy) {\n if (options.imgproxy.width) params.w = options.imgproxy.width;\n if (options.imgproxy.height) params.h = options.imgproxy.height;\n if (options.imgproxy.resizingType) params.rs = options.imgproxy.resizingType;\n if (options.imgproxy.format) params.fmt = options.imgproxy.format;\n if (options.imgproxy.quality) params.q = options.imgproxy.quality;\n }\n\n const response = await this.http.fetchRaw(`/v/${encodeURIComponent(bucketId)}/${encodeURIComponent(fileId)}`, {\n params,\n signal: options.signal,\n });\n\n const contentType = response.headers.get('content-type') || 'application/octet-stream';\n const contentDisposition = response.headers.get('content-disposition') || '';\n let filename: string | undefined;\n const match = contentDisposition.match(/filename=\"?([^\";]+)\"?/);\n if (match) filename = match[1];\n\n // Read bytes\n const arrayBuffer = await response.arrayBuffer();\n const bytes = new Uint8Array(arrayBuffer);\n\n // 3. Save to cache\n if (shouldUseCache && this.cache) {\n await this.cache.set(cacheKey, {\n data: bytes,\n contentType,\n name: filename,\n size: bytes.byteLength,\n createdAt: Date.now(),\n });\n }\n\n // 4. Return formatted response\n if (options.responseType === 'arrayBuffer') {\n return arrayBuffer;\n }\n if (options.responseType === 'text') {\n return new TextDecoder().decode(bytes);\n }\n if (options.responseType === 'json') {\n return JSON.parse(new TextDecoder().decode(bytes));\n }\n if (options.responseType === 'stream') {\n return new ReadableStream({\n start(controller) {\n controller.enqueue(bytes);\n controller.close();\n },\n });\n }\n\n return new Blob([bytes as any], { type: contentType });\n }\n\n /**\n * Retrieves a file directly by its SHA-256 hash (/h/:hash).\n * Hash-addressed content is immutable and cached indefinitely.\n */\n async getFileByHash(\n hash: string,\n options: GetFileOptions = {}\n ): Promise<Blob | ArrayBuffer | ReadableStream<Uint8Array> | string | unknown> {\n const cacheKey = `vfs:hash:${hash}`;\n const shouldUseCache = options.useCache !== false && Boolean(this.cache);\n\n if (shouldUseCache && this.cache) {\n const cached = await this.cache.get(cacheKey);\n if (cached) {\n if (options.responseType === 'arrayBuffer') {\n return cached.data.buffer.slice(cached.data.byteOffset, cached.data.byteOffset + cached.data.byteLength);\n }\n if (options.responseType === 'text') {\n return new TextDecoder().decode(cached.data);\n }\n if (options.responseType === 'json') {\n return JSON.parse(new TextDecoder().decode(cached.data));\n }\n return new Blob([cached.data as any], { type: cached.contentType });\n }\n }\n\n const response = await this.http.fetchRaw(`/h/${encodeURIComponent(hash)}`, {\n signal: options.signal,\n });\n\n const contentType = response.headers.get('content-type') || 'application/octet-stream';\n const arrayBuffer = await response.arrayBuffer();\n const bytes = new Uint8Array(arrayBuffer);\n\n if (shouldUseCache && this.cache) {\n // 1 year TTL for immutable content\n await this.cache.set(\n cacheKey,\n {\n data: bytes,\n contentType,\n size: bytes.byteLength,\n hash,\n createdAt: Date.now(),\n },\n 31536000\n );\n }\n\n if (options.responseType === 'arrayBuffer') {\n return arrayBuffer;\n }\n if (options.responseType === 'text') {\n return new TextDecoder().decode(bytes);\n }\n if (options.responseType === 'json') {\n return JSON.parse(new TextDecoder().decode(bytes));\n }\n\n return new Blob([bytes as any], { type: contentType });\n }\n\n /**\n * Gets metadata manifest of an uploaded file as a JSON object without downloading the file data.\n */\n async getFileMetadata(bucketId: string, fileId: string, signal?: AbortSignal): Promise<ObjectManifestResponse> {\n const res = await this.http.get<ObjectManifestResponse>(\n `/v/${encodeURIComponent(bucketId)}/${encodeURIComponent(fileId)}`,\n {\n params: { output: 'json' },\n headers: { Accept: 'application/json' },\n signal,\n }\n );\n return res.data;\n }\n\n /**\n * Gets metadata manifest of a file by its SHA-256 hash.\n */\n async getFileMetadataByHash(hash: string, signal?: AbortSignal): Promise<ObjectManifestResponse> {\n const res = await this.http.get<ObjectManifestResponse>(`/h/${encodeURIComponent(hash)}`, {\n params: { output: 'json' },\n headers: { Accept: 'application/json' },\n signal,\n });\n return res.data;\n }\n\n /**\n * Generates public/access URL for a file, supporting imgproxy transformations and download triggers.\n */\n getFileUrl(bucketId: string, fileId: string, options: GetUrlOptions = {}): string {\n const url = new URL(`${this.http.getEndpoint()}/v/${encodeURIComponent(bucketId)}/${encodeURIComponent(fileId)}`);\n if (options.download) {\n url.searchParams.set('download', 'true');\n }\n if (options.imgproxy) {\n if (options.imgproxy.width) url.searchParams.set('w', String(options.imgproxy.width));\n if (options.imgproxy.height) url.searchParams.set('h', String(options.imgproxy.height));\n if (options.imgproxy.resizingType) url.searchParams.set('rs', options.imgproxy.resizingType);\n if (options.imgproxy.format) url.searchParams.set('fmt', options.imgproxy.format);\n if (options.imgproxy.quality) url.searchParams.set('q', String(options.imgproxy.quality));\n }\n return url.toString();\n }\n\n /**\n * Generates public URL for a file addressed by its SHA-256 hash.\n */\n getFileUrlByHash(hash: string): string {\n return `${this.http.getEndpoint()}/h/${encodeURIComponent(hash)}`;\n }\n\n /**\n * Deletes a file by bucket ID and file ID, invalidating any cached copies.\n */\n async deleteFile(bucketId: string, fileId: string, signal?: AbortSignal): Promise<void> {\n try {\n await this.http.delete(`/api/upload/unlink/${encodeURIComponent(bucketId)}/${encodeURIComponent(fileId)}`, {\n signal,\n });\n } catch (err: unknown) {\n // If 404, file is already gone, consider success\n if (err instanceof VFSError && err.status === 404) {\n // No-op\n } else {\n throw err;\n }\n }\n\n if (this.cache) {\n await this.cache.delete(`vfs:${bucketId}:${fileId}`);\n }\n }\n\n /**\n * Deletes a file record by catalog ID.\n */\n async deleteFileById(id: string, signal?: AbortSignal): Promise<void> {\n await this.http.delete(`/api/upload/${encodeURIComponent(id)}`, { signal });\n }\n\n /**\n * Deletes all files within a specified bucket.\n */\n async deleteAllInBucket(bucketId: string, signal?: AbortSignal): Promise<void> {\n await this.http.delete(`/api/upload/bucket/${encodeURIComponent(bucketId)}`, { signal });\n }\n\n /**\n * Lists stored objects in a bucket.\n */\n async listFiles(options: ListFilesOptions = {}): Promise<AttachmentResponse[]> {\n const bucketId = options.bucketId || this.defaultBucket;\n const res = await this.http.get<AttachmentResponse[]>('/api/upload', {\n params: { bucket_id: bucketId },\n signal: options.signal,\n });\n return res.data;\n }\n\n /**\n * Gets real-time statistics for a bucket (total files, storage usage, read/write counts, quota limits).\n */\n async getBucketStats(bucketId?: string, signal?: AbortSignal): Promise<BucketStat> {\n const targetBucket = bucketId || this.defaultBucket;\n const res = await this.http.get<BucketStat>(`/api/bucket/stats/${encodeURIComponent(targetBucket)}`, { signal });\n return res.data;\n }\n\n /**\n * Gets a list of all bucket statistics.\n */\n async getAllBucketStats(\n params?: { page?: number; limit?: number },\n signal?: AbortSignal\n ): Promise<BucketStatsListResponse> {\n const res = await this.http.get<BucketStat[]>('/api/bucket/stats', {\n params,\n signal,\n });\n return {\n items: res.data,\n total: res.totalCount,\n };\n }\n\n /**\n * Gets overall system summary of bucket statistics (total buckets, total files, total storage size).\n */\n async getBucketSummary(signal?: AbortSignal): Promise<BucketStatSummary> {\n const res = await this.http.get<BucketStatSummary>('/api/bucket/stats/summary', { signal });\n return res.data;\n }\n\n /**\n * Gets date-based usage growth metrics for a bucket.\n */\n async getBucketMetrics(bucketId?: string, signal?: AbortSignal): Promise<BucketMetricsByDate[]> {\n const targetBucket = bucketId || this.defaultBucket;\n const res = await this.http.get<BucketMetricsByDate[]>(\n `/api/bucket/stats/${encodeURIComponent(targetBucket)}/metrics`,\n { signal }\n );\n return res.data;\n }\n}\n"]}
|