hydrousdb 2.0.3 → 3.0.1

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/errors.ts","../src/utils/http.ts","../src/auth/client.ts","../src/utils/query.ts","../src/records/client.ts","../src/analytics/client.ts","../src/storage/scoped.ts","../src/storage/manager.ts","../src/client.ts","../src/index.ts"],"names":["_a","_b"],"mappings":"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","file":"index.js","sourcesContent":["import type { HydrousError } from '../types/index.js';\n\nexport class HydrousDBError extends Error {\n readonly code: string;\n readonly status: number | undefined;\n\n constructor(message: string, code = 'SDK_ERROR', status?: number) {\n super(message);\n this.name = 'HydrousDBError';\n this.code = code;\n this.status = status;\n }\n}\n\nexport function toHydrousError(err: unknown): HydrousError {\n if (err instanceof HydrousDBError) {\n return { message: err.message, code: err.code, status: err.status };\n }\n if (err instanceof Error) {\n return { message: err.message, code: 'UNKNOWN_ERROR' };\n }\n return { message: String(err), code: 'UNKNOWN_ERROR' };\n}\n\nexport function isHydrousError(err: unknown): err is HydrousDBError {\n return err instanceof HydrousDBError;\n}\n","import { HydrousDBError } from './errors.js';\n\nexport async function parseResponse<T>(res: Response): Promise<T> {\n let body: unknown;\n try {\n body = await res.json();\n } catch {\n if (!res.ok) throw new HydrousDBError(`HTTP ${res.status}`, 'HTTP_ERROR', res.status);\n return undefined as T;\n }\n if (!res.ok) {\n const e = body as { error?: string; message?: string; code?: string };\n throw new HydrousDBError(\n e.error || e.message || `HTTP ${res.status}`,\n e.code || 'HTTP_ERROR',\n res.status,\n );\n }\n return body as T;\n}\n\nexport function buildUrl(\n base: string,\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n): string {\n const url = new URL(path, base.endsWith('/') ? base : base + '/');\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined && v !== null) url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\nexport function mergeHeaders(\n a: Record<string, string>,\n b?: Record<string, string>,\n): Record<string, string> {\n return { ...a, ...b };\n}\n\n/**\n * Parse a streaming Server-Sent Events response.\n * Resolves when the stream ends.\n */\nexport async function readSSEStream(\n response: Response,\n onEvent: (eventType: string, data: unknown) => void,\n): Promise<void> {\n if (!response.body) return;\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buf = '';\n\n const flush = (chunk: string) => {\n buf += chunk;\n const blocks = buf.split('\\n\\n');\n buf = blocks.pop() ?? '';\n for (const block of blocks) {\n if (!block.trim()) continue;\n let eventType = 'message';\n let dataLine: string | null = null;\n for (const line of block.split('\\n')) {\n if (line.startsWith('event:')) eventType = line.slice(6).trim();\n if (line.startsWith('data:')) dataLine = line.slice(5).trim();\n }\n if (dataLine === null) continue;\n try { onEvent(eventType, JSON.parse(dataLine)); } catch { /* skip heartbeats */ }\n }\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n flush(decoder.decode(value, { stream: true }));\n }\n if (buf.trim()) flush('');\n}\n\n/** Parse an already-complete SSE text body (XHR response flow) */\nexport function parseSSEText(\n text: string,\n onEvent: (eventType: string, data: unknown) => void,\n): void {\n const blocks = text.split('\\n\\n');\n for (const block of blocks) {\n if (!block.trim()) continue;\n let eventType = 'message';\n let dataLine: string | null = null;\n for (const line of block.split('\\n')) {\n if (line.startsWith('event:')) eventType = line.slice(6).trim();\n if (line.startsWith('data:')) dataLine = line.slice(5).trim();\n }\n if (dataLine === null) continue;\n try { onEvent(eventType, JSON.parse(dataLine)); } catch { /* skip */ }\n }\n}\n\n/**\n * XHR-based upload — gives real byte-level progress during the outbound\n * request body transfer. `fetch()` cannot do this because it buffers the\n * entire body before sending.\n */\nexport function xhrUpload(\n url: string,\n body: FormData | Blob | BufferSource,\n headers: Record<string, string>,\n onProgress?: (loaded: number, total: number) => void,\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('POST', url);\n for (const [k, v] of Object.entries(headers)) xhr.setRequestHeader(k, v);\n xhr.responseType = 'text';\n\n if (onProgress) {\n xhr.upload.onprogress = (e) => {\n if (e.lengthComputable) onProgress(e.loaded, e.total);\n };\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText);\n } else {\n try {\n const d = JSON.parse(xhr.responseText) as { error?: string };\n reject(new HydrousDBError(d.error ?? `HTTP ${xhr.status}`, 'HTTP_ERROR', xhr.status));\n } catch {\n reject(new HydrousDBError(`HTTP ${xhr.status}`, 'HTTP_ERROR', xhr.status));\n }\n }\n };\n\n xhr.onerror = () => reject(new HydrousDBError('Network error', 'NETWORK_ERROR'));\n xhr.onabort = () => reject(new HydrousDBError('Upload aborted', 'UPLOAD_ABORTED'));\n xhr.ontimeout = () => reject(new HydrousDBError('Upload timed out', 'UPLOAD_TIMEOUT'));\n xhr.send(body);\n });\n}\n","import type {\n HydrousConfig, HydrousResponse,\n AuthUser, AuthSession, SignUpOptions, SignInOptions,\n} from '../types/index.js';\nimport { toHydrousError } from '../utils/errors.js';\nimport { buildUrl, mergeHeaders, parseResponse } from '../utils/http.js';\n\nexport class AuthClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private session: AuthSession | null = null;\n\n constructor(config: HydrousConfig) {\n this.baseUrl = config.url;\n this.headers = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.authKey}`,\n };\n }\n\n /** Create a new user account */\n async signUp(options: SignUpOptions): Promise<HydrousResponse<AuthSession>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, 'auth/signup'), {\n method: 'POST', headers: this.headers, body: JSON.stringify(options),\n });\n const json = await parseResponse<{ data: AuthSession }>(res);\n this.session = json.data;\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Sign in with email and password */\n async signIn(options: SignInOptions): Promise<HydrousResponse<AuthSession>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, 'auth/signin'), {\n method: 'POST', headers: this.headers, body: JSON.stringify(options),\n });\n const json = await parseResponse<{ data: AuthSession }>(res);\n this.session = json.data;\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Sign out and invalidate the current session */\n async signOut(): Promise<HydrousResponse<void>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, 'auth/signout'), {\n method: 'POST',\n headers: mergeHeaders(this.headers, this._sessionHeader()),\n });\n await parseResponse<void>(res);\n this.session = null;\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Get the currently authenticated user */\n async getUser(): Promise<HydrousResponse<AuthUser>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, 'auth/user'), {\n headers: mergeHeaders(this.headers, this._sessionHeader()),\n });\n const json = await parseResponse<{ data: AuthUser }>(res);\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Refresh the access token using the stored refresh token */\n async refreshSession(): Promise<HydrousResponse<AuthSession>> {\n if (!this.session?.refreshToken) {\n return { data: null, error: { message: 'No active session', code: 'NO_SESSION' } };\n }\n try {\n const res = await fetch(buildUrl(this.baseUrl, 'auth/refresh'), {\n method: 'POST', headers: this.headers,\n body: JSON.stringify({ refreshToken: this.session.refreshToken }),\n });\n const json = await parseResponse<{ data: AuthSession }>(res);\n this.session = json.data;\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Return the current in-memory session (may be null) */\n getSession(): AuthSession | null { return this.session; }\n\n private _sessionHeader(): Record<string, string> {\n return this.session?.accessToken\n ? { 'X-Session-Token': this.session.accessToken }\n : {};\n }\n}\n","import type { Filter, FilterOperator, QueryOptions } from '../types/index.js';\n\nexport function serialiseQuery(opts: QueryOptions = {}): Record<string, string> {\n const params: Record<string, string> = {};\n if (opts.limit !== undefined) params['limit'] = String(opts.limit);\n if (opts.offset !== undefined) params['offset'] = String(opts.offset);\n if (opts.select && opts.select.length > 0) params['select'] = opts.select.join(',');\n if (opts.orderBy) {\n params['orderBy'] = opts.orderBy.field;\n params['direction'] = opts.orderBy.direction ?? 'asc';\n }\n const filters = opts.where\n ? Array.isArray(opts.where) ? opts.where : [opts.where]\n : [];\n if (filters.length > 0) params['where'] = JSON.stringify(filters);\n return params;\n}\n\nexport const eq = (field: string, value: unknown): Filter => ({ field, operator: 'eq' as FilterOperator, value });\nexport const neq = (field: string, value: unknown): Filter => ({ field, operator: 'neq' as FilterOperator, value });\nexport const gt = (field: string, value: unknown): Filter => ({ field, operator: 'gt' as FilterOperator, value });\nexport const lt = (field: string, value: unknown): Filter => ({ field, operator: 'lt' as FilterOperator, value });\nexport const gte = (field: string, value: unknown): Filter => ({ field, operator: 'gte' as FilterOperator, value });\nexport const lte = (field: string, value: unknown): Filter => ({ field, operator: 'lte' as FilterOperator, value });\nexport const inArray = (field: string, value: unknown[]): Filter => ({ field, operator: 'in' as FilterOperator, value });\n","import type {\n HydrousConfig, QueryOptions,\n RecordResponse, SingleRecordResponse,\n} from '../types/index.js';\nimport { toHydrousError } from '../utils/errors.js';\nimport { buildUrl, parseResponse } from '../utils/http.js';\nimport { serialiseQuery } from '../utils/query.js';\n\nexport class RecordsClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n\n constructor(config: HydrousConfig) {\n this.baseUrl = config.url;\n this.headers = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.bucketSecurityKey}`,\n };\n }\n\n /** Query records from a collection */\n async select<T = Record<string, unknown>>(\n collection: string,\n options: QueryOptions = {},\n ): Promise<RecordResponse<T>> {\n try {\n const url = buildUrl(this.baseUrl, `records/${collection}`, serialiseQuery(options));\n const res = await fetch(url, { headers: this.headers });\n const json = await parseResponse<{ data: T[]; count: number }>(res);\n return { data: json.data, count: json.count, error: null };\n } catch (err) { return { data: [], count: 0, error: toHydrousError(err) }; }\n }\n\n /** Fetch a single record by ID */\n async get<T = Record<string, unknown>>(\n collection: string,\n id: string,\n ): Promise<SingleRecordResponse<T>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, `records/${collection}/${id}`), { headers: this.headers });\n const json = await parseResponse<{ data: T }>(res);\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Insert one or more records */\n async insert<T = Record<string, unknown>>(\n collection: string,\n payload: Partial<T> | Partial<T>[],\n ): Promise<RecordResponse<T>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, `records/${collection}`), {\n method: 'POST', headers: this.headers, body: JSON.stringify(payload),\n });\n const json = await parseResponse<{ data: T[]; count: number }>(res);\n return { data: json.data, count: json.count, error: null };\n } catch (err) { return { data: [], count: 0, error: toHydrousError(err) }; }\n }\n\n /** Update a record by ID */\n async update<T = Record<string, unknown>>(\n collection: string,\n id: string,\n payload: Partial<T>,\n ): Promise<SingleRecordResponse<T>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, `records/${collection}/${id}`), {\n method: 'PATCH', headers: this.headers, body: JSON.stringify(payload),\n });\n const json = await parseResponse<{ data: T }>(res);\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Delete a record by ID */\n async delete(collection: string, id: string): Promise<SingleRecordResponse<void>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, `records/${collection}/${id}`), {\n method: 'DELETE', headers: this.headers,\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n}\n","import type {\n HydrousConfig, HydrousResponse,\n TrackEventOptions, AnalyticsQueryOptions,\n AnalyticsEvent, RecordResponse,\n} from '../types/index.js';\nimport { toHydrousError } from '../utils/errors.js';\nimport { buildUrl, parseResponse } from '../utils/http.js';\n\nexport class AnalyticsClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n\n constructor(config: HydrousConfig) {\n this.baseUrl = config.url;\n this.headers = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.bucketSecurityKey}`,\n };\n }\n\n /** Track a single analytics event */\n async track(options: TrackEventOptions): Promise<HydrousResponse<void>> {\n try {\n const res = await fetch(buildUrl(this.baseUrl, 'analytics/track'), {\n method: 'POST', headers: this.headers,\n body: JSON.stringify({ ...options, timestamp: options.timestamp ?? Date.now() }),\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Track many events in one request */\n async trackBatch(events: TrackEventOptions[]): Promise<HydrousResponse<void>> {\n try {\n const stamped = events.map(e => ({ ...e, timestamp: e.timestamp ?? Date.now() }));\n const res = await fetch(buildUrl(this.baseUrl, 'analytics/track/batch'), {\n method: 'POST', headers: this.headers,\n body: JSON.stringify({ events: stamped }),\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Query recorded analytics events */\n async query(options: AnalyticsQueryOptions = {}): Promise<RecordResponse<AnalyticsEvent>> {\n try {\n const params: Record<string, string> = {};\n if (options.event) params['event'] = options.event;\n if (options.from) params['from'] = options.from;\n if (options.to) params['to'] = options.to;\n if (options.limit) params['limit'] = String(options.limit);\n if (options.groupBy) params['groupBy'] = options.groupBy;\n const url = buildUrl(this.baseUrl, 'analytics/events', params);\n const res = await fetch(url, { headers: this.headers });\n const json = await parseResponse<{ data: AnalyticsEvent[]; count: number }>(res);\n return { data: json.data, count: json.count, error: null };\n } catch (err) { return { data: [], count: 0, error: toHydrousError(err) }; }\n }\n}\n","import type {\n HydrousResponse,\n UploadOptions, UploadResult,\n BatchUploadOptions, BatchUploadResult,\n BatchDownloadOptions, BatchDownloadFile,\n ListOptions, ListResult,\n SignedUrlOptions, SignedUrlResult,\n FileMetadata, StorageStats, StorageItem,\n UploadProgress, DownloadProgress,\n} from '../types/index.js';\nimport { HydrousDBError, toHydrousError } from '../utils/errors.js';\nimport {\n buildUrl, parseResponse,\n readSSEStream, parseSSEText, xhrUpload,\n} from '../utils/http.js';\n\n// ── env detect ────────────────────────────────────────────────────────────────\nconst isBrowser =\n typeof window !== 'undefined' && typeof XMLHttpRequest !== 'undefined';\n\n// ── internal helpers ──────────────────────────────────────────────────────────\nfunction storageBase(url: string, bucketKey: string): string {\n return `${url.replace(/\\/$/, '')}/storage/${encodeURIComponent(bucketKey)}`;\n}\n\nfunction storageHeaders(bucketKey: string): Record<string, string> {\n return { 'X-Storage-Key': bucketKey };\n}\n\nfunction jsonHeaders(bucketKey: string): Record<string, string> {\n return { 'X-Storage-Key': bucketKey, 'Content-Type': 'application/json' };\n}\n\n/** Pull progress events + final results out of a completed SSE text body */\nfunction drainSSE(\n raw: string,\n onProgress: ((p: UploadProgress) => void) | undefined,\n): { results: UploadResult[]; errors: Array<{ path: string; error: string; code: string }> } {\n const results: UploadResult[] = [];\n const errors: Array<{ path: string; error: string; code: string }> = [];\n\n parseSSEText(raw, (eventType, data) => {\n const d = data as Record<string, unknown>;\n\n if (eventType === 'progress' && onProgress) {\n onProgress({\n index: (d['index'] as number) ?? 0,\n total: (d['total'] as number) ?? 1,\n path: (d['path'] as string) ?? '',\n stage: (d['stage'] as UploadProgress['stage']) ?? 'uploading',\n bytesUploaded: (d['bytesUploaded'] as number) ?? 0,\n totalBytes: (d['totalBytes'] as number) ?? 0,\n percent: (d['percent'] as number) ?? 0,\n bytesPerSecond: (d['bytesPerSecond'] as number | null) ?? null,\n eta: (d['eta'] as number | null) ?? null,\n result: d['result'] as UploadResult | undefined,\n error: d['error'] as string | undefined,\n code: d['code'] as string | undefined,\n });\n }\n\n if (eventType === 'done') {\n if ((d as { path?: string })['path']) {\n results.push(d as unknown as UploadResult);\n } else if (Array.isArray(d['succeeded'])) {\n results.push(...(d['succeeded'] as UploadResult[]));\n errors.push(...(d['errors'] as Array<{ path: string; error: string; code: string }> ?? []));\n }\n }\n\n if (eventType === 'error') {\n errors.push({\n path: '',\n error: (d['error'] as string) ?? 'Unknown error',\n code: (d['code'] as string) ?? 'UNKNOWN',\n });\n }\n });\n\n return { results, errors };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ScopedStorageClient\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * A storage client that is already bound to a specific storage key.\n * You get one of these by calling `db.storage('keyName')`.\n *\n * None of the methods on this class require you to pass a bucket key —\n * it's already baked in.\n */\nexport class ScopedStorageClient {\n private readonly base: string;\n private readonly key: string;\n readonly keyName: string;\n\n constructor(baseUrl: string, keyName: string, bucketKey: string) {\n this.base = storageBase(baseUrl, bucketKey);\n this.key = bucketKey;\n this.keyName = keyName;\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // UPLOAD — single file\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Upload a single file.\n *\n * Supply `onProgress` to receive live upload ticks including bytes\n * transferred, speed (bytes/sec), ETA, and lifecycle stage.\n *\n * **Stage sequence:**\n * `pending → compressing → uploading → done | error`\n *\n * In browsers the progress is tracked at the network level via XHR, so\n * `percent` reflects actual bytes leaving the device. `done` only fires\n * after the server confirms the write to cloud storage, so 100% is real.\n *\n * @example\n * const { data, error } = await db.storage('avatars').upload(file, {\n * path: 'users/alice.jpg',\n * overwrite: true,\n * onProgress: (p) => {\n * setProgress(p.percent); // e.g. drive a <progress> bar\n * setSpeed(`${p.bytesPerSecond} B/s`);\n * setEta(`${p.eta}s remaining`);\n * },\n * });\n */\n async upload(\n file: File | Blob | Uint8Array | ArrayBuffer,\n options: UploadOptions = {},\n ): Promise<HydrousResponse<UploadResult>> {\n const { path, overwrite = false, onProgress } = options;\n\n try {\n const url = `${this.base}/upload`;\n const form = new FormData();\n\n if (file instanceof Uint8Array) {\n form.append('file', new Blob([file.buffer as ArrayBuffer]), path ?? 'file');\n } else if (file instanceof ArrayBuffer) {\n form.append('file', new Blob([file]), path ?? 'file');\n } else {\n form.append('file', file, path ?? (file instanceof File ? file.name : 'file'));\n }\n\n if (path) form.append('path', path);\n if (overwrite) form.append('overwrite', 'true');\n\n const headers = storageHeaders(this.key);\n\n // ── browser: XHR (real progress) + SSE parse ──────────────────────────\n if (isBrowser) {\n const totalBytes =\n file instanceof Blob ? file.size :\n file instanceof Uint8Array ? file.byteLength :\n (file as ArrayBuffer).byteLength;\n\n const rawBody = await xhrUpload(url, form, headers, (loaded, total) => {\n onProgress?.({\n index: 0, total: 1, path: path ?? '',\n stage: 'uploading',\n bytesUploaded: loaded,\n totalBytes: total || totalBytes,\n percent: Math.min(99, Math.round((loaded / (total || totalBytes)) * 100)),\n bytesPerSecond: null,\n eta: null,\n });\n });\n\n const { results, errors } = drainSSE(rawBody, onProgress);\n\n if (errors.length > 0 && results.length === 0) {\n return { data: null, error: { message: errors[0].error, code: errors[0].code } };\n }\n\n const result = results[0] ?? null;\n if (result && onProgress) {\n onProgress({ index: 0, total: 1, path: result.path, stage: 'done',\n bytesUploaded: totalBytes, totalBytes, percent: 100,\n bytesPerSecond: null, eta: 0, result });\n }\n return { data: result, error: null };\n }\n\n // ── Node / Edge: fetch + streaming SSE ────────────────────────────────\n const res = await fetch(url, { method: 'POST', headers, body: form });\n if (!res.ok) {\n const e = await res.json().catch(() => ({})) as { error?: string };\n throw new HydrousDBError(e.error ?? `HTTP ${res.status}`, 'HTTP_ERROR', res.status);\n }\n\n let finalResult: UploadResult | null = null;\n await readSSEStream(res, (eventType, data) => {\n const d = data as Record<string, unknown>;\n if (eventType === 'progress' && onProgress) {\n onProgress({\n index: 0, total: 1, path: path ?? '',\n stage: (d['stage'] as UploadProgress['stage']) ?? 'uploading',\n bytesUploaded: (d['bytesUploaded'] as number) ?? 0,\n totalBytes: (d['totalBytes'] as number) ?? 0,\n percent: (d['percent'] as number) ?? 0,\n bytesPerSecond: (d['bytesPerSecond'] as number | null) ?? null,\n eta: (d['eta'] as number | null) ?? null,\n result: d['result'] as UploadResult | undefined,\n });\n }\n if (eventType === 'done') finalResult = data as UploadResult;\n if (eventType === 'error') {\n throw new HydrousDBError(\n (d['error'] as string) ?? 'Upload failed',\n (d['code'] as string) ?? 'UPLOAD_ERROR',\n );\n }\n });\n\n return { data: finalResult, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // UPLOAD TEXT / JSON\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Upload raw text or JSON content directly — no File object needed.\n *\n * @example\n * // Save a JSON config\n * await db.storage('configs').uploadText(\n * 'settings/app.json',\n * JSON.stringify({ theme: 'dark' }),\n * { mimeType: 'application/json' }\n * );\n */\n async uploadText(\n path: string,\n content: string,\n options: { mimeType?: string; overwrite?: boolean; onProgress?: UploadOptions['onProgress'] } = {},\n ): Promise<HydrousResponse<UploadResult>> {\n const { mimeType = 'text/plain', overwrite = false, onProgress } = options;\n try {\n const res = await fetch(`${this.base}/upload-raw`, {\n method: 'POST', headers: jsonHeaders(this.key),\n body: JSON.stringify({ path, content, mimeType, overwrite }),\n });\n if (!res.ok) {\n const e = await res.json().catch(() => ({})) as { error?: string };\n throw new HydrousDBError(e.error ?? `HTTP ${res.status}`, 'HTTP_ERROR', res.status);\n }\n let finalResult: UploadResult | null = null;\n await readSSEStream(res, (eventType, data) => {\n const d = data as Record<string, unknown>;\n if (eventType === 'progress' && onProgress) {\n onProgress({\n index: 0, total: 1, path,\n stage: (d['stage'] as UploadProgress['stage']) ?? 'uploading',\n bytesUploaded: (d['bytesUploaded'] as number) ?? 0,\n totalBytes: (d['totalBytes'] as number) ?? 0,\n percent: (d['percent'] as number) ?? 0,\n bytesPerSecond: (d['bytesPerSecond'] as number | null) ?? null,\n eta: (d['eta'] as number | null) ?? null,\n });\n }\n if (eventType === 'done') finalResult = data as UploadResult;\n });\n return { data: finalResult, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // BATCH UPLOAD\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Upload multiple files in one request.\n *\n * `onProgress` fires per file — use `p.index` to identify which file.\n * All files receive a `pending` event upfront so you can render progress\n * bars immediately before any data is sent.\n *\n * @example\n * await db.storage('documents').batchUpload(files, {\n * prefix: 'reports/2024/',\n * onProgress: (p) => updateBar(p.index, p.percent),\n * });\n */\n async batchUpload(\n files: File[],\n options: BatchUploadOptions = {},\n ): Promise<HydrousResponse<BatchUploadResult>> {\n const { prefix = '', paths, overwrite = false, onProgress } = options;\n try {\n const url = `${this.base}/batch-upload`;\n const resolvedPaths = files.map((f, i) => paths?.[i] ?? `${prefix}${f.name}`);\n const form = new FormData();\n\n files.forEach(f => form.append('files', f, f.name));\n form.append('paths', JSON.stringify(resolvedPaths));\n if (overwrite) form.append('overwrite', 'true');\n\n const headers = storageHeaders(this.key);\n\n if (isBrowser) {\n const totalBytes = files.reduce((s, f) => s + f.size, 0);\n const rawBody = await xhrUpload(url, form, headers, (loaded, total) => {\n if (!onProgress) return;\n let cursor = 0;\n for (let i = 0; i < files.length; i++) {\n const share = files[i].size / (totalBytes || 1);\n const fileLoaded = Math.max(0, Math.min(\n files[i].size,\n ((loaded / (total || totalBytes)) - cursor) / share * files[i].size,\n ));\n onProgress({\n index: i, total: files.length, path: resolvedPaths[i],\n stage: 'uploading',\n bytesUploaded: Math.round(fileLoaded),\n totalBytes: files[i].size,\n percent: Math.min(99, Math.round((fileLoaded / files[i].size) * 100)),\n bytesPerSecond: null, eta: null,\n });\n cursor += share;\n }\n });\n const { results, errors } = drainSSE(rawBody, onProgress);\n return { data: { succeeded: results, failed: errors }, error: null };\n }\n\n const res = await fetch(url, { method: 'POST', headers, body: form });\n if (!res.ok) {\n const e = await res.json().catch(() => ({})) as { error?: string };\n throw new HydrousDBError(e.error ?? `HTTP ${res.status}`, 'HTTP_ERROR', res.status);\n }\n\n const succeeded: UploadResult[] = [];\n const failed: Array<{ path: string; error: string; code: string }> = [];\n await readSSEStream(res, (eventType, data) => {\n const d = data as Record<string, unknown>;\n if (eventType === 'progress' && onProgress) {\n onProgress({\n index: (d['index'] as number) ?? 0,\n total: (d['total'] as number) ?? files.length,\n path: (d['path'] as string) ?? '',\n stage: (d['stage'] as UploadProgress['stage']) ?? 'uploading',\n bytesUploaded: (d['bytesUploaded'] as number) ?? 0,\n totalBytes: (d['totalBytes'] as number) ?? 0,\n percent: (d['percent'] as number) ?? 0,\n bytesPerSecond: (d['bytesPerSecond'] as number | null) ?? null,\n eta: (d['eta'] as number | null) ?? null,\n });\n }\n if (eventType === 'done' && d['succeeded']) {\n succeeded.push(...(d['succeeded'] as UploadResult[]));\n failed.push(...(d['errors'] as Array<{ path: string; error: string; code: string }> ?? []));\n }\n });\n return { data: { succeeded, failed }, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // DOWNLOAD\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Download a single file and return its content as an `ArrayBuffer`.\n *\n * @example\n * const { data } = await db.storage('avatars').download('users/alice.jpg');\n * const blob = new Blob([data!]);\n * img.src = URL.createObjectURL(blob);\n */\n async download(filePath: string): Promise<HydrousResponse<ArrayBuffer>> {\n try {\n const res = await fetch(`${this.base}/download/${filePath}`, {\n headers: storageHeaders(this.key),\n });\n if (!res.ok) {\n const e = await res.json().catch(() => ({})) as { error?: string };\n throw new HydrousDBError(e.error ?? `HTTP ${res.status}`, 'HTTP_ERROR', res.status);\n }\n return { data: await res.arrayBuffer(), error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // BATCH DOWNLOAD\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Download multiple files in one request.\n *\n * Set `autoSave: true` (browser only) to trigger a Save dialog per file.\n *\n * @example\n * const { data } = await db.storage('reports').batchDownload(\n * ['jan.pdf', 'feb.pdf'],\n * { autoSave: true, onProgress: (p) => console.log(p.path, p.status) }\n * );\n */\n async batchDownload(\n filePaths: string[],\n options: BatchDownloadOptions = {},\n ): Promise<HydrousResponse<BatchDownloadFile[]>> {\n const { concurrency = 5, onProgress, autoSave = false } = options;\n try {\n const res = await fetch(`${this.base}/batch-download`, {\n method: 'POST', headers: jsonHeaders(this.key),\n body: JSON.stringify({ paths: filePaths, concurrency }),\n });\n if (!res.ok) {\n const e = await res.json().catch(() => ({})) as { error?: string };\n throw new HydrousDBError(e.error ?? `HTTP ${res.status}`, 'HTTP_ERROR', res.status);\n }\n\n const downloadedFiles: BatchDownloadFile[] = [];\n await readSSEStream(res, (eventType, data) => {\n const d = data as Record<string, unknown>;\n if (eventType === 'file') {\n const base64 = d['content'] as string;\n const mimeType = (d['mimeType'] as string) ?? 'application/octet-stream';\n const path = (d['path'] as string) ?? '';\n const size = (d['size'] as number) ?? 0;\n const index = (d['index'] as number) ?? 0;\n\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n\n downloadedFiles.push({ path, content: bytes.buffer, mimeType, size });\n\n onProgress?.({ index, total: filePaths.length, path, status: 'success', size, mimeType });\n\n if (autoSave && isBrowser) {\n const blob = new Blob([bytes.buffer], { type: mimeType });\n const blobUrl = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = blobUrl; a.download = path.split('/').pop() ?? 'download'; a.click();\n setTimeout(() => URL.revokeObjectURL(blobUrl), 5000);\n }\n }\n if (eventType === 'error' && onProgress) {\n const index = (d['index'] as number) ?? 0;\n onProgress({ index, total: filePaths.length, path: filePaths[index] ?? '', status: 'error',\n error: (d['error'] as string) ?? 'Download failed' });\n }\n });\n return { data: downloadedFiles, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // LIST\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * List files and folders (paginated).\n *\n * @example\n * const { data } = await db.storage('avatars').list({ prefix: 'users/' });\n * for (const item of data!.items) {\n * console.log(item.type, item.path, item.size);\n * }\n */\n async list(options: ListOptions = {}): Promise<HydrousResponse<ListResult>> {\n const { prefix = '', limit = 50, cursor } = options;\n try {\n const url = buildUrl(this.base, 'list', {\n prefix: prefix || undefined, limit, cursor: cursor || undefined,\n });\n const res = await fetch(url.replace(this.base + '/list', `${this.base}/list`), {\n headers: storageHeaders(this.key),\n });\n // buildUrl prepends a second base — use direct construction instead\n const u = `${this.base}/list?${new URLSearchParams(\n Object.entries({ prefix: prefix || '', limit: String(limit), ...(cursor ? { cursor } : {}) })\n .filter(([, v]) => v !== '')\n ).toString()}`;\n const r = await fetch(u, { headers: storageHeaders(this.key) });\n const json = await parseResponse<ListResult>(r);\n return { data: json, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // METADATA\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Get metadata for a file (size, MIME type, compression, etc.)\n *\n * @example\n * const { data: meta } = await db.storage('docs').metadata('report.pdf');\n * console.log(meta!.size, meta!.mimeType, meta!.isCompressed);\n */\n async metadata(filePath: string): Promise<HydrousResponse<FileMetadata>> {\n try {\n const res = await fetch(`${this.base}/metadata/${filePath}`, {\n headers: storageHeaders(this.key),\n });\n const json = await parseResponse<{ data: FileMetadata }>(res);\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // DELETE\n // ══════════════════════════════════════════════════════════════════════════\n\n /** Delete a single file */\n async deleteFile(filePath: string): Promise<HydrousResponse<void>> {\n try {\n const res = await fetch(`${this.base}/file`, {\n method: 'DELETE', headers: jsonHeaders(this.key),\n body: JSON.stringify({ path: filePath }),\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Recursively delete a folder and all its contents */\n async deleteFolder(folderPath: string): Promise<HydrousResponse<void>> {\n try {\n const res = await fetch(`${this.base}/folder`, {\n method: 'DELETE', headers: jsonHeaders(this.key),\n body: JSON.stringify({ path: folderPath }),\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Create an empty folder */\n async createFolder(folderPath: string): Promise<HydrousResponse<void>> {\n try {\n const res = await fetch(`${this.base}/folder`, {\n method: 'POST', headers: jsonHeaders(this.key),\n body: JSON.stringify({ path: folderPath }),\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // MOVE & COPY\n // ══════════════════════════════════════════════════════════════════════════\n\n /** Move (rename) a file */\n async move(fromPath: string, toPath: string): Promise<HydrousResponse<void>> {\n try {\n const res = await fetch(`${this.base}/move`, {\n method: 'POST', headers: jsonHeaders(this.key),\n body: JSON.stringify({ from: fromPath, to: toPath }),\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n /** Copy a file (original is kept) */\n async copy(fromPath: string, toPath: string): Promise<HydrousResponse<void>> {\n try {\n const res = await fetch(`${this.base}/copy`, {\n method: 'POST', headers: jsonHeaders(this.key),\n body: JSON.stringify({ from: fromPath, to: toPath }),\n });\n await parseResponse<void>(res);\n return { data: undefined, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // SIGNED URL\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Generate a time-limited public URL for a private file.\n *\n * @example\n * const { data } = await db.storage('contracts').signedUrl('nda.pdf', { expiresIn: 300 });\n * console.log(data!.signedUrl); // share this\n */\n async signedUrl(\n filePath: string,\n options: SignedUrlOptions = {},\n ): Promise<HydrousResponse<SignedUrlResult>> {\n const { expiresIn = 3600 } = options;\n try {\n const res = await fetch(`${this.base}/signed-url`, {\n method: 'POST', headers: jsonHeaders(this.key),\n body: JSON.stringify({ path: filePath, expiresInSeconds: expiresIn }),\n });\n const json = await parseResponse<SignedUrlResult>(res);\n return { data: json, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n\n // ══════════════════════════════════════════════════════════════════════════\n // STATS\n // ══════════════════════════════════════════════════════════════════════════\n\n /**\n * Get usage and billing stats for this storage key.\n *\n * @example\n * const { data } = await db.storage('main').stats();\n * console.log(data!.totalFiles, data!.totalSizeBytes);\n */\n async stats(): Promise<HydrousResponse<StorageStats>> {\n try {\n const res = await fetch(`${this.base}/stats`, {\n headers: storageHeaders(this.key),\n });\n const json = await parseResponse<{ data: StorageStats }>(res);\n return { data: json.data, error: null };\n } catch (err) { return { data: null, error: toHydrousError(err) }; }\n }\n}\n","import type { HydrousConfig, StorageKeys } from '../types/index.js';\nimport { HydrousDBError } from '../utils/errors.js';\nimport { ScopedStorageClient } from './scoped.js';\n\n/**\n * StorageManager is the object exposed as `db.storage`.\n *\n * Call `.use(keyName)` — or use the shorthand `db.storage('keyName')` which\n * the main HydrousClient wires up as a Proxy — to get a scoped storage client\n * bound to that key.\n *\n * ```ts\n * db.storage('main').upload(file)\n * db.storage('avatars').list()\n * db.storage('documents').download('report.pdf')\n * ```\n */\nexport class StorageManager {\n private readonly baseUrl: string;\n private readonly _keys: StorageKeys;\n private readonly cache: Map<string, ScopedStorageClient> = new Map();\n\n constructor(config: HydrousConfig) {\n this.baseUrl = config.url;\n this._keys = config.storageKeys;\n }\n\n /**\n * Get a storage client scoped to a named key.\n *\n * @param keyName - Must match a property you declared in `storageKeys`\n *\n * @example\n * const avatarStore = db.storage('avatars');\n * const documentStore = db.storage('documents');\n *\n * await avatarStore.upload(file, { path: 'users/alice.jpg' });\n * const list = await documentStore.list({ prefix: 'invoices/' });\n */\n use(keyName: string): ScopedStorageClient {\n const bucketKey = this._keys[keyName];\n if (!bucketKey) {\n const available = Object.keys(this._keys).join(', ');\n throw new HydrousDBError(\n `Storage key \"${keyName}\" is not defined.\\nAvailable: ${available || '(none)'}`,\n 'UNKNOWN_STORAGE_KEY',\n );\n }\n if (!this.cache.has(keyName)) {\n this.cache.set(keyName, new ScopedStorageClient(this.baseUrl, keyName, bucketKey));\n }\n return this.cache.get(keyName)!;\n }\n\n /** Return the names of all configured storage keys */\n keyNames(): string[] {\n return Object.keys(this._keys);\n }\n}\n","import type { HydrousConfig } from './types/index.js';\nimport { AuthClient } from './auth/client.js';\nimport { RecordsClient } from './records/client.js';\nimport { AnalyticsClient } from './analytics/client.js';\nimport { StorageManager } from './storage/manager.js';\nimport { ScopedStorageClient } from './storage/scoped.js';\n\n// ── callable storage interface ────────────────────────────────────────────────\n// We want db.storage('avatars').upload(...)\n// So storage must be callable AND have the manager methods on it.\n\nexport interface CallableStorage {\n /** Get a scoped storage client by key name */\n (keyName: string): ScopedStorageClient;\n /** Same as calling db.storage(keyName) — more explicit */\n use(keyName: string): ScopedStorageClient;\n /** Return names of all configured storage keys */\n keyNames(): string[];\n}\n\n/**\n * The HydrousDB root client.\n *\n * Create once and reuse across your app:\n *\n * ```ts\n * import { createClient } from 'hydrousdb';\n *\n * const db = createClient({\n * url: 'https://api.myapp.hydrous.app',\n * authKey: 'hk_auth_…',\n * bucketSecurityKey: 'hk_bucket_…',\n * storageKeys: {\n * main: 'ssk_main_…',\n * avatars: 'ssk_avatars_…',\n * documents: 'ssk_docs_…',\n * },\n * });\n * ```\n */\nexport class HydrousClient {\n /** Auth — sign up, sign in, sign out, session management */\n public readonly auth: AuthClient;\n /** Records — insert, select, update, delete structured data */\n public readonly records: RecordsClient;\n /** Analytics — track events and query history */\n public readonly analytics: AnalyticsClient;\n /**\n * Storage — call with the name of the key you want.\n *\n * ```ts\n * db.storage('avatars').upload(file, { path: 'user.jpg' })\n * db.storage('documents').list({ prefix: 'invoices/' })\n * db.storage('main').stats()\n * ```\n */\n public readonly storage: CallableStorage;\n\n constructor(config: HydrousConfig) {\n if (!config.url) throw new Error('[HydrousDB] config.url is required');\n if (!config.authKey) throw new Error('[HydrousDB] config.authKey is required');\n if (!config.bucketSecurityKey) throw new Error('[HydrousDB] config.bucketSecurityKey is required');\n if (!config.storageKeys || typeof config.storageKeys !== 'object') {\n throw new Error('[HydrousDB] config.storageKeys must be an object of named keys');\n }\n\n this.auth = new AuthClient(config);\n this.records = new RecordsClient(config);\n this.analytics = new AnalyticsClient(config);\n\n // Build the manager then wrap it in a Proxy so db.storage('name') works\n const manager = new StorageManager(config);\n\n const fn = (keyName: string) => manager.use(keyName);\n fn.use = (keyName: string) => manager.use(keyName);\n fn.keyNames = () => manager.keyNames();\n\n this.storage = fn as CallableStorage;\n }\n}\n","// ─── Main client & factory ────────────────────────────────────────────────────\nexport { HydrousClient } from './client.js';\nexport type { CallableStorage } from './client.js';\n\nimport { HydrousClient } from './client.js';\nimport type { HydrousConfig } from './types/index.js';\n\n/**\n * Create a HydrousDB client.\n *\n * @example\n * import { createClient } from 'hydrousdb';\n *\n * const db = createClient({\n * url: 'https://api.myapp.hydrous.app',\n * authKey: 'hk_auth_…',\n * bucketSecurityKey: 'hk_bucket_…',\n * storageKeys: {\n * main: 'ssk_main_…',\n * avatars: 'ssk_avatars_…',\n * documents: 'ssk_docs_…',\n * },\n * });\n */\nexport function createClient(config: HydrousConfig): HydrousClient {\n return new HydrousClient(config);\n}\n\n// ─── Sub-clients ──────────────────────────────────────────────────────────────\nexport { AuthClient } from './auth/index.js';\nexport { RecordsClient } from './records/index.js';\nexport { AnalyticsClient } from './analytics/index.js';\nexport { StorageManager, ScopedStorageClient } from './storage/index.js';\n\n// ─── All types ────────────────────────────────────────────────────────────────\nexport type {\n HydrousConfig, StorageKeys,\n HydrousResponse, HydrousError,\n Filter, FilterOperator, QueryOptions,\n RecordResponse, SingleRecordResponse,\n AuthUser, AuthSession, SignUpOptions, SignInOptions,\n TrackEventOptions, AnalyticsQueryOptions, AnalyticsEvent,\n UploadStage, UploadProgress, DownloadProgress,\n UploadResult, UploadOptions,\n BatchUploadOptions, BatchUploadResult,\n BatchDownloadOptions, BatchDownloadFile,\n FileMetadata, StorageItem, ListResult, ListOptions,\n SignedUrlResult, SignedUrlOptions,\n StorageStats,\n} from './types/index.js';\n\n// ─── Query helpers ────────────────────────────────────────────────────────────\nexport { eq, neq, gt, lt, gte, lte, inArray } from './utils/query.js';\n\n// ─── Error utilities ─────────────────────────────────────────────────────────\nexport { HydrousDBError, isHydrousError } from './utils/errors.js';\n"]}
1
+ {"version":3,"sources":["../src/utils/errors.ts","../src/utils/http.ts","../src/auth/client.ts","../src/utils/query.ts","../src/records/client.ts","../src/analytics/client.ts","../src/storage/manager.ts","../src/storage/scoped.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export class HydrousError extends Error {\n /** Machine-readable error code returned by the API. */\n readonly code: string;\n /** HTTP status code (if applicable). */\n readonly status?: number;\n /** The original request ID for support tracing. */\n readonly requestId?: string;\n /** Additional validation details. */\n readonly details?: string[];\n\n constructor(\n message: string,\n code: string,\n status?: number,\n requestId?: string,\n details?: string[],\n ) {\n super(message);\n this.name = 'HydrousError';\n this.code = code;\n this.status = status;\n this.requestId = requestId;\n this.details = details;\n // Maintain proper prototype chain in transpiled environments\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n toString(): string {\n return `HydrousError [${this.code}]: ${this.message}`;\n }\n}\n\nexport class AuthError extends HydrousError {\n constructor(\n message: string,\n code: string,\n status?: number,\n requestId?: string,\n details?: string[],\n ) {\n super(message, code, status, requestId, details);\n this.name = 'AuthError';\n }\n}\n\nexport class RecordError extends HydrousError {\n constructor(\n message: string,\n code: string,\n status?: number,\n requestId?: string,\n details?: string[],\n ) {\n super(message, code, status, requestId, details);\n this.name = 'RecordError';\n }\n}\n\nexport class StorageError extends HydrousError {\n constructor(\n message: string,\n code: string,\n status?: number,\n requestId?: string,\n ) {\n super(message, code, status, requestId);\n this.name = 'StorageError';\n }\n}\n\nexport class AnalyticsError extends HydrousError {\n constructor(\n message: string,\n code: string,\n status?: number,\n requestId?: string,\n ) {\n super(message, code, status, requestId);\n this.name = 'AnalyticsError';\n }\n}\n\nexport class ValidationError extends HydrousError {\n constructor(message: string, details?: string[]) {\n super(message, 'VALIDATION_ERROR', 400, undefined, details);\n this.name = 'ValidationError';\n }\n}\n\nexport class NetworkError extends HydrousError {\n readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message, 'NETWORK_ERROR');\n this.name = 'NetworkError';\n if (cause) this.cause = cause;\n }\n}","import { HydrousError, NetworkError } from './errors.js';\n\nexport const DEFAULT_BASE_URL = 'https://db-api-82687684612.us-central1.run.app';\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n body?: unknown;\n headers?: Record<string, string>;\n rawBody?: string | FormData | Uint8Array<ArrayBuffer>;\n contentType?: string;\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n }\n\n async request<T = unknown>(\n path: string,\n apiKeyOrOpts?: string | RequestOptions,\n opts: RequestOptions = {},\n ): Promise<T> {\n let apiKey: string | undefined;\n let resolvedOpts: RequestOptions;\n\n if (typeof apiKeyOrOpts === 'string') {\n apiKey = apiKeyOrOpts;\n resolvedOpts = opts;\n } else {\n apiKey = undefined;\n resolvedOpts = apiKeyOrOpts ?? opts;\n }\n\n const {\n method = 'GET',\n body,\n headers = {},\n rawBody,\n contentType = 'application/json',\n } = resolvedOpts;\n\n const url = `${this.baseUrl}${path}`;\n\n const reqHeaders: Record<string, string> = {\n ...(apiKey ? { 'X-Api-Key': apiKey } : {}),\n ...headers,\n };\n\n let reqBody: string | FormData | Uint8Array<ArrayBuffer> | null = null;\n\n if (rawBody !== undefined) {\n reqBody = rawBody;\n if (contentType) reqHeaders['Content-Type'] = contentType;\n } else if (body !== undefined) {\n reqBody = JSON.stringify(body);\n reqHeaders['Content-Type'] = 'application/json';\n }\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers: reqHeaders,\n body: reqBody,\n });\n } catch (err) {\n throw new NetworkError(\n `Network request failed: ${err instanceof Error ? err.message : String(err)}`,\n err,\n );\n }\n\n const ct = response.headers.get('content-type') ?? '';\n\n if (!ct.includes('application/json')) {\n if (!response.ok) {\n throw new HydrousError(\n `Request failed with status ${response.status}`,\n `HTTP_${response.status}`,\n response.status,\n );\n }\n const buffer = await response.arrayBuffer();\n return buffer as T;\n }\n\n let responseData: unknown;\n try {\n responseData = await response.json() as unknown;\n } catch {\n throw new HydrousError(\n 'Failed to parse server response as JSON',\n 'PARSE_ERROR',\n response.status,\n );\n }\n\n if (!response.ok) {\n const errData = responseData as Record<string, unknown>;\n throw new HydrousError(\n (errData['error'] as string | undefined) ?? `Request failed with status ${response.status}`,\n (errData['code'] as string | undefined) ?? `HTTP_${response.status}`,\n response.status,\n errData['requestId'] as string | undefined,\n errData['details'] as string[] | undefined,\n );\n }\n\n return responseData as T;\n }\n\n get<T = unknown>(path: string, apiKey?: string, headers?: Record<string, string>): Promise<T> {\n return this.request<T>(path, apiKey, { method: 'GET', headers });\n }\n\n post<T = unknown>(path: string, apiKey?: string, body?: unknown, headers?: Record<string, string>): Promise<T> {\n return this.request<T>(path, apiKey, { method: 'POST', body, headers });\n }\n\n put<T = unknown>(path: string, apiKey?: string, body?: unknown, headers?: Record<string, string>): Promise<T> {\n return this.request<T>(path, apiKey, { method: 'PUT', body, headers });\n }\n\n patch<T = unknown>(path: string, apiKey?: string, body?: unknown, headers?: Record<string, string>): Promise<T> {\n return this.request<T>(path, apiKey, { method: 'PATCH', body, headers });\n }\n\n delete<T = unknown>(path: string, apiKey?: string, body?: unknown, headers?: Record<string, string>): Promise<T> {\n return this.request<T>(path, apiKey, { method: 'DELETE', body, headers });\n }\n\n async putToSignedUrl(\n signedUrl: string,\n data: Blob | Uint8Array<ArrayBuffer> | ArrayBuffer,\n mimeType: string,\n onProgress?: (percent: number) => void,\n ): Promise<void> {\n // Access XHR via globalThis to avoid requiring DOM lib types\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const XHR = (typeof (globalThis as any)['XMLHttpRequest'] !== 'undefined')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ? (globalThis as any)['XMLHttpRequest'] as new () => any\n : undefined;\n\n if (XHR && onProgress) {\n return new Promise<void>((resolve, reject) => {\n const xhr = new XHR();\n\n xhr.upload.onprogress = (e: { lengthComputable: boolean; loaded: number; total: number }) => {\n if (e.lengthComputable) {\n onProgress(Math.round((e.loaded / e.total) * 100));\n }\n };\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve();\n } else {\n reject(new Error(`Upload failed: ${xhr.status}`));\n }\n };\n\n xhr.onerror = () => reject(new Error('Upload network error'));\n xhr.open('PUT', signedUrl);\n xhr.setRequestHeader('Content-Type', mimeType);\n\n const payload: Blob = data instanceof Blob\n ? data\n : new Blob([data as ArrayBuffer], { type: mimeType });\n\n xhr.send(payload);\n });\n }\n\n const fetchBody: Blob = data instanceof Blob\n ? data\n : new Blob([data as ArrayBuffer], { type: mimeType });\n\n const response = await fetch(signedUrl, {\n method: 'PUT',\n headers: { 'Content-Type': mimeType },\n body: fetchBody,\n });\n\n if (!response.ok) {\n throw new NetworkError(`Signed URL upload failed with status ${response.status}`);\n }\n }\n}","import type { HttpClient } from '../utils/http.js';\nimport type {\n SignupOptions,\n LoginOptions,\n AuthResult,\n UserRecord,\n UpdateUserOptions,\n ChangePasswordOptions,\n ListUsersOptions,\n ListUsersResult,\n Session,\n} from '../types/index.js';\n\ninterface ApiAuthResult {\n success: boolean;\n user: UserRecord;\n session: Session;\n requestId?: string;\n}\n\ninterface ApiUserResult {\n success: boolean;\n user: UserRecord;\n requestId?: string;\n}\n\ninterface ApiSessionResult {\n success: boolean;\n session: Session;\n requestId?: string;\n}\n\ninterface ApiMessageResult {\n success: boolean;\n message: string;\n meta?: Record<string, unknown>;\n requestId?: string;\n}\n\n/**\n * AuthClient — full user authentication for a single bucket.\n * Uses the `authKey` (`hk_auth_…`) sent via `X-Api-Key` header.\n *\n * @example\n * ```ts\n * const db = createClient({ authKey: 'hk_auth_…', bucketSecurityKey: '…', storageKeys: { main: '…' } });\n * const auth = db.auth('my-app-users');\n * const { user, session } = await auth.signup({ email: 'alice@example.com', password: 'hunter2' });\n * ```\n */\nexport class AuthClient {\n private readonly http: HttpClient;\n private readonly authKey: string;\n private readonly basePath: string;\n\n constructor(http: HttpClient, authKey: string, bucketKey: string) {\n this.http = http;\n this.authKey = authKey;\n this.basePath = `/auth/${bucketKey}`;\n }\n\n private post<T>(path: string, body?: unknown): Promise<T> {\n return this.http.post<T>(path, this.authKey, body);\n }\n\n private get<T>(path: string): Promise<T> {\n return this.http.get<T>(path, this.authKey);\n }\n\n private patch<T>(path: string, body?: unknown): Promise<T> {\n return this.http.patch<T>(path, this.authKey, body);\n }\n\n private delete<T>(path: string, body?: unknown): Promise<T> {\n return this.http.delete<T>(path, this.authKey, body);\n }\n\n // ─── Registration & Login ─────────────────────────────────────────────────\n\n async signup(options: SignupOptions): Promise<AuthResult> {\n const result = await this.post<ApiAuthResult>(`${this.basePath}/signup`, options);\n return { user: result.user, session: result.session };\n }\n\n async login(options: LoginOptions): Promise<AuthResult> {\n const result = await this.post<ApiAuthResult>(`${this.basePath}/login`, options);\n return { user: result.user, session: result.session };\n }\n\n async logout({ sessionId }: { sessionId: string }): Promise<void> {\n await this.post<ApiMessageResult>(`${this.basePath}/logout`, { sessionId });\n }\n\n async refreshSession({ refreshToken }: { refreshToken: string }): Promise<Session> {\n const result = await this.post<ApiSessionResult>(`${this.basePath}/session/refresh`, { refreshToken });\n return result.session;\n }\n\n // ─── User Profile ─────────────────────────────────────────────────────────\n\n async getUser({ userId }: { userId: string }): Promise<UserRecord> {\n const result = await this.get<ApiUserResult>(`${this.basePath}/user/${userId}`);\n return result.user;\n }\n\n async updateUser(options: UpdateUserOptions): Promise<UserRecord> {\n const { sessionId, userId, data } = options;\n const result = await this.patch<ApiUserResult>(`${this.basePath}/user`, { sessionId, userId, ...data });\n return result.user;\n }\n\n async deleteUser({ sessionId, userId }: { sessionId: string; userId: string }): Promise<void> {\n await this.delete<ApiMessageResult>(`${this.basePath}/user`, { sessionId, userId });\n }\n\n // ─── Admin Operations ─────────────────────────────────────────────────────\n\n async listUsers(options: ListUsersOptions): Promise<ListUsersResult> {\n const { sessionId, limit = 50, offset = 0 } = options;\n const result = await this.post<{ success: boolean } & ListUsersResult>(\n `${this.basePath}/users/list`,\n { sessionId, limit, offset },\n );\n return { users: result.users, total: result.total, limit: result.limit, offset: result.offset };\n }\n\n async hardDeleteUser({ sessionId, userId }: { sessionId: string; userId: string }): Promise<void> {\n await this.delete<ApiMessageResult>(`${this.basePath}/user/hard`, { sessionId, userId });\n }\n\n async bulkDeleteUsers({ sessionId, userIds }: { sessionId: string; userIds: string[] }): Promise<{ deleted: number; failed: string[] }> {\n const result = await this.post<{ success: boolean; deleted: number; failed: string[] }>(\n `${this.basePath}/users/bulk-delete`,\n { sessionId, userIds },\n );\n return { deleted: result.deleted, failed: result.failed };\n }\n\n async lockAccount({ sessionId, userId, duration }: { sessionId: string; userId: string; duration?: number }): Promise<{ lockedUntil: number; unlockTime: string }> {\n const result = await this.post<{ success: boolean; data: { lockedUntil: number; unlockTime: string } }>(\n `${this.basePath}/account/lock`,\n { sessionId, userId, duration },\n );\n return result.data;\n }\n\n async unlockAccount({ sessionId, userId }: { sessionId: string; userId: string }): Promise<void> {\n await this.post<ApiMessageResult>(`${this.basePath}/account/unlock`, { sessionId, userId });\n }\n\n // ─── Password Management ──────────────────────────────────────────────────\n\n async changePassword(options: ChangePasswordOptions): Promise<void> {\n await this.post<ApiMessageResult>(`${this.basePath}/password/change`, options);\n }\n\n async requestPasswordReset({ email }: { email: string }): Promise<void> {\n await this.post<ApiMessageResult>(`${this.basePath}/password/reset/request`, { email });\n }\n\n async confirmPasswordReset({ resetToken, newPassword }: { resetToken: string; newPassword: string }): Promise<void> {\n await this.post<ApiMessageResult>(`${this.basePath}/password/reset/confirm`, { resetToken, newPassword });\n }\n\n // ─── Email Verification ───────────────────────────────────────────────────\n\n async requestEmailVerification({ userId }: { userId: string }): Promise<void> {\n await this.post<ApiMessageResult>(`${this.basePath}/email/verify/request`, { userId });\n }\n\n async confirmEmailVerification({ verifyToken }: { verifyToken: string }): Promise<void> {\n await this.post<ApiMessageResult>(`${this.basePath}/email/verify/confirm`, { verifyToken });\n }\n}\n","import type { QueryFilter, QueryOptions } from '../types/index.js';\n\n/**\n * Build query string parameters for GET /records/:bucket requests.\n */\nexport function buildQueryParams(options: QueryOptions = {}): string {\n const params = new URLSearchParams();\n\n if (options.limit !== undefined) params.set('limit', String(options.limit));\n if (options.offset !== undefined) params.set('offset', String(options.offset));\n if (options.orderBy !== undefined) params.set('orderBy', options.orderBy);\n if (options.order !== undefined) params.set('order', options.order);\n if (options.fields !== undefined) params.set('fields', options.fields);\n if (options.startAfter !== undefined) params.set('startAfter', options.startAfter);\n if (options.startAt !== undefined) params.set('startAt', options.startAt);\n if (options.endAt !== undefined) params.set('endAt', options.endAt);\n\n if (options.dateRange?.start !== undefined)\n params.set('startDate', new Date(options.dateRange.start).toISOString().split('T')[0]!);\n if (options.dateRange?.end !== undefined)\n params.set('endDate', new Date(options.dateRange.end).toISOString().split('T')[0]!);\n\n if (options.filters && options.filters.length > 0) {\n params.set('filters', JSON.stringify(options.filters));\n }\n\n const str = params.toString();\n return str ? `?${str}` : '';\n}\n\n/**\n * Normalise a filter shorthand into the standard { field, op, value } shape.\n * Accepts either a QueryFilter object or a 3-tuple [field, op, value].\n */\nexport function normaliseFilter(\n filter: QueryFilter | [string, QueryFilter['op'], QueryFilter['value']],\n): QueryFilter {\n if (Array.isArray(filter)) {\n const [field, op, value] = filter;\n return { field, op, value };\n }\n return filter;\n}\n\n/**\n * Detect a likely MIME type from a file extension.\n * Used when mimeType is not explicitly provided.\n */\nexport function guessMimeType(filename: string): string {\n const ext = filename.split('.').pop()?.toLowerCase();\n const map: Record<string, string> = {\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n pdf: 'application/pdf',\n mp4: 'video/mp4',\n webm: 'video/webm',\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n txt: 'text/plain',\n html: 'text/html',\n css: 'text/css',\n js: 'application/javascript',\n json: 'application/json',\n xml: 'application/xml',\n zip: 'application/zip',\n csv: 'text/csv',\n };\n return map[ext ?? ''] ?? 'application/octet-stream';\n}\n\n/**\n * Validate that a bucket key contains only safe characters.\n * Must match the server-side SAFE_RE: /^[a-zA-Z_][a-zA-Z0-9_.]{0,200}$/\n */\nexport function assertSafeName(name: string, label = 'name'): void {\n if (!/^[a-zA-Z_][a-zA-Z0-9_.\\-]{0,200}$/.test(name)) {\n throw new Error(\n `Invalid ${label} \"${name}\". Must start with a letter or underscore and contain only letters, numbers, underscores, dots, or hyphens.`,\n );\n }\n}\n","import type { HttpClient } from '../utils/http.js';\nimport { buildQueryParams, assertSafeName } from '../utils/query.js';\nimport type {\n RecordData,\n RecordResult,\n QueryOptions,\n QueryResult,\n PatchRecordOptions,\n RecordHistoryEntry,\n} from '../types/index.js';\n\ninterface ApiRecordResult<T> {\n success: boolean;\n record?: T & RecordResult;\n data?: T & RecordResult;\n}\n\ninterface ApiQueryResult<T> {\n success: boolean;\n records: (T & RecordResult)[];\n total?: number;\n hasMore?: boolean;\n nextCursor?: string;\n}\n\ninterface ApiDeleteResult {\n success: boolean;\n deleted: boolean;\n id: string;\n}\n\ninterface ApiHistoryResult {\n success: boolean;\n history: RecordHistoryEntry[];\n}\n\n/**\n * RecordsClient — CRUD + query for a single bucket.\n * Uses the `bucketSecurityKey` (`hk_bucket_…`) sent via `X-Api-Key` header.\n *\n * @example\n * ```ts\n * const db = createClient({ authKey: '…', bucketSecurityKey: 'hk_bucket_…', storageKeys: { main: '…' } });\n * const posts = db.records('blog-posts');\n * const post = await posts.create({ title: 'Hello World', status: 'draft' });\n * ```\n */\nexport class RecordsClient<T extends RecordData = RecordData> {\n private readonly http: HttpClient;\n private readonly bucketKey: string;\n private readonly basePath: string;\n private readonly bucketKey_: string;\n\n constructor(http: HttpClient, bucketSecurityKey: string, bucketKey: string) {\n assertSafeName(bucketKey, 'bucketKey');\n this.http = http;\n this.bucketKey = bucketKey;\n this.bucketKey_ = bucketSecurityKey;\n this.basePath = `/records/${bucketKey}`;\n }\n\n private get key(): string { return this.bucketKey_; }\n\n // ─── Single Record Operations ─────────────────────────────────────────────\n\n async create(data: T): Promise<T & RecordResult> {\n const result = await this.http.post<ApiRecordResult<T>>(this.basePath, this.key, data);\n return (result.record ?? result.data)!;\n }\n\n async get(id: string): Promise<T & RecordResult> {\n const result = await this.http.get<ApiRecordResult<T>>(`${this.basePath}/${id}`, this.key);\n return (result.record ?? result.data)!;\n }\n\n async set(id: string, data: T): Promise<T & RecordResult> {\n const result = await this.http.put<ApiRecordResult<T>>(`${this.basePath}/${id}`, this.key, data);\n return (result.record ?? result.data)!;\n }\n\n async patch(id: string, data: Partial<T>, options: PatchRecordOptions = {}): Promise<T & RecordResult> {\n const { merge = true } = options;\n const result = await this.http.patch<ApiRecordResult<T>>(\n `${this.basePath}/${id}`,\n this.key,\n { ...data, _merge: merge },\n );\n return (result.record ?? result.data)!;\n }\n\n async delete(id: string): Promise<void> {\n await this.http.delete<ApiDeleteResult>(`${this.basePath}/${id}`, this.key);\n }\n\n // ─── Batch Operations ─────────────────────────────────────────────────────\n\n async batchCreate(items: T[]): Promise<(T & RecordResult)[]> {\n const result = await this.http.post<{ success: boolean; records: (T & RecordResult)[] }>(\n `${this.basePath}/batch`,\n this.key,\n { records: items },\n );\n return result.records;\n }\n\n async batchDelete(ids: string[]): Promise<{ deleted: number; failed: string[] }> {\n const result = await this.http.post<{ success: boolean; deleted: number; failed: string[] }>(\n `${this.basePath}/batch/delete`,\n this.key,\n { ids },\n );\n return { deleted: result.deleted, failed: result.failed };\n }\n\n // ─── Querying ─────────────────────────────────────────────────────────────\n\n async query(options: QueryOptions = {}): Promise<QueryResult<T>> {\n const qs = buildQueryParams(options);\n const result = await this.http.get<ApiQueryResult<T>>(`${this.basePath}${qs}`, this.key);\n return {\n records: result.records,\n total: result.total,\n hasMore: result.hasMore,\n nextCursor: result.nextCursor,\n };\n }\n\n async getAll(options: Omit<QueryOptions, 'filters'> = {}): Promise<(T & RecordResult)[]> {\n const { records } = await this.query(options);\n return records;\n }\n\n async count(filters: QueryOptions['filters'] = []): Promise<number> {\n const result = await this.http.post<{ success: boolean; count: number }>(\n `${this.basePath}/count`,\n this.key,\n { filters },\n );\n return result.count;\n }\n\n // ─── Version History ──────────────────────────────────────────────────────\n\n async getHistory(id: string): Promise<RecordHistoryEntry[]> {\n const result = await this.http.get<ApiHistoryResult>(`${this.basePath}/${id}/history`, this.key);\n return result.history;\n }\n\n async restoreVersion(id: string, version: number): Promise<T & RecordResult> {\n const result = await this.http.post<ApiRecordResult<T>>(\n `${this.basePath}/${id}/restore`,\n this.key,\n { version },\n );\n return (result.record ?? result.data)!;\n }\n}\n","import type { HttpClient } from '../utils/http.js';\nimport { assertSafeName } from '../utils/query.js';\nimport type {\n AnalyticsQuery,\n AnalyticsResult,\n Aggregation,\n Granularity,\n SortOrder,\n DateRange,\n AnalyticsFilter,\n MetricDefinition,\n CountResult,\n DistributionRow,\n SumRow,\n TimeSeriesRow,\n FieldTimeSeriesRow,\n TopNRow,\n FieldStats,\n MultiMetricResult,\n StorageStatsResult,\n CrossBucketRow,\n RecordData,\n RecordResult,\n} from '../types/index.js';\n\ninterface ApiAnalyticsResult<T> {\n success: boolean;\n queryType: string;\n data: T;\n}\n\n/**\n * AnalyticsClient — BigQuery-powered aggregations for a bucket.\n * Uses the `bucketSecurityKey` (`hk_bucket_…`) sent via `X-Api-Key` header.\n *\n * @example\n * ```ts\n * const db = createClient({ authKey: '…', bucketSecurityKey: 'hk_bucket_…', storageKeys: { main: '…' } });\n * const analytics = db.analytics('orders');\n * const { count } = await analytics.count();\n * ```\n */\nexport class AnalyticsClient {\n private readonly http: HttpClient;\n private readonly bucketSecurityKey: string;\n private readonly basePath: string;\n\n constructor(http: HttpClient, bucketSecurityKey: string, bucketKey: string) {\n assertSafeName(bucketKey, 'bucketKey');\n this.http = http;\n this.bucketSecurityKey = bucketSecurityKey;\n this.basePath = `/analytics/${bucketKey}`;\n }\n\n private async run<T>(query: AnalyticsQuery): Promise<T> {\n const result = await this.http.post<ApiAnalyticsResult<T>>(\n this.basePath,\n this.bucketSecurityKey,\n query,\n );\n return result.data;\n }\n\n async count(opts: { dateRange?: DateRange } = {}): Promise<CountResult> {\n return this.run<CountResult>({ queryType: 'count', ...opts });\n }\n\n async distribution(opts: { field: string; limit?: number; order?: SortOrder; dateRange?: DateRange }): Promise<DistributionRow[]> {\n assertSafeName(opts.field, 'field');\n return this.run<DistributionRow[]>({ queryType: 'distribution', ...opts });\n }\n\n async sum(opts: { field: string; groupBy?: string; limit?: number; dateRange?: DateRange }): Promise<SumRow[]> {\n assertSafeName(opts.field, 'field');\n if (opts.groupBy) assertSafeName(opts.groupBy, 'groupBy');\n return this.run<SumRow[]>({ queryType: 'sum', ...opts });\n }\n\n async timeSeries(opts: { granularity?: Granularity; dateRange?: DateRange } = {}): Promise<TimeSeriesRow[]> {\n return this.run<TimeSeriesRow[]>({ queryType: 'timeSeries', granularity: 'day', ...opts });\n }\n\n async fieldTimeSeries(opts: { field: string; aggregation?: Aggregation; granularity?: Granularity; dateRange?: DateRange }): Promise<FieldTimeSeriesRow[]> {\n assertSafeName(opts.field, 'field');\n return this.run<FieldTimeSeriesRow[]>({ queryType: 'fieldTimeSeries', aggregation: 'sum', granularity: 'day', ...opts });\n }\n\n async topN(opts: { field: string; n?: number; labelField?: string; order?: SortOrder; dateRange?: DateRange }): Promise<TopNRow[]> {\n assertSafeName(opts.field, 'field');\n if (opts.labelField) assertSafeName(opts.labelField, 'labelField');\n return this.run<TopNRow[]>({ queryType: 'topN', n: 10, order: 'desc', ...opts });\n }\n\n async stats(opts: { field: string; dateRange?: DateRange }): Promise<FieldStats> {\n assertSafeName(opts.field, 'field');\n return this.run<FieldStats>({ queryType: 'stats', ...opts });\n }\n\n async records<T extends RecordData = RecordData>(opts: { filters?: AnalyticsFilter[]; selectFields?: string[]; limit?: number; offset?: number; orderBy?: string; order?: SortOrder; dateRange?: DateRange } = {}): Promise<(T & RecordResult)[]> {\n if (opts.orderBy) assertSafeName(opts.orderBy, 'orderBy');\n if (opts.selectFields) opts.selectFields.forEach(f => assertSafeName(f, 'selectField'));\n return this.run<(T & RecordResult)[]>({ queryType: 'records', limit: 100, order: 'desc', ...opts });\n }\n\n async multiMetric(opts: { metrics: MetricDefinition[]; dateRange?: DateRange }): Promise<MultiMetricResult> {\n opts.metrics.forEach(m => { assertSafeName(m.field, 'metric.field'); assertSafeName(m.name, 'metric.name'); });\n return this.run<MultiMetricResult>({ queryType: 'multiMetric', ...opts });\n }\n\n async storageStats(opts: { dateRange?: DateRange } = {}): Promise<StorageStatsResult> {\n return this.run<StorageStatsResult>({ queryType: 'storageStats', ...opts });\n }\n\n async crossBucket(opts: { bucketKeys: string[]; field: string; aggregation?: Aggregation; dateRange?: DateRange }): Promise<CrossBucketRow[]> {\n assertSafeName(opts.field, 'field');\n opts.bucketKeys.forEach(k => assertSafeName(k, 'bucketKey'));\n return this.run<CrossBucketRow[]>({ queryType: 'crossBucket', aggregation: 'sum', ...opts });\n }\n\n async query<T = unknown>(query: AnalyticsQuery): Promise<AnalyticsResult<T>> {\n const data = await this.run<T>(query);\n return { queryType: query.queryType, data };\n }\n}\n","import type { HttpClient } from '../utils/http.js';\nimport { guessMimeType } from '../utils/query.js';\nimport { StorageError } from '../utils/errors.js';\nimport type {\n UploadOptions,\n UploadResult,\n UploadUrlResult,\n ListOptions,\n ListResult,\n FileEntry,\n FileMetadata,\n SignedUrlResult,\n StorageStats,\n BatchUploadItem,\n BatchUploadUrlResult,\n} from '../types/index.js';\n\ninterface ApiUploadUrlResult {\n uploadUrl: string;\n path: string;\n mimeType: string;\n expiresAt: string;\n expiresIn: number;\n}\n\ninterface ApiConfirmResult {\n success: boolean;\n path: string;\n mimeType: string;\n size: number;\n isPublic: boolean;\n publicUrl: string | null;\n downloadUrl: string | null;\n}\n\ninterface ApiListResult {\n success: boolean;\n files: FileEntry[];\n folders: string[];\n hasMore: boolean;\n nextCursor?: string;\n}\n\ninterface ApiMetadataResult {\n success: boolean;\n path: string;\n size: number;\n mimeType: string;\n isPublic: boolean;\n publicUrl: string | null;\n downloadUrl: string | null;\n createdAt?: string;\n updatedAt?: string;\n}\n\ninterface ApiSignedUrlResult {\n success: boolean;\n signedUrl: string;\n expiresAt: string;\n expiresIn: number;\n path: string;\n}\n\ninterface ApiVisibilityResult {\n success: boolean;\n path: string;\n isPublic: boolean;\n publicUrl: string | null;\n downloadUrl: string | null;\n}\n\ninterface ApiStatsResult {\n success: boolean;\n stats: StorageStats;\n}\n\n/**\n * StorageManager — upload, download, list, move, copy, and delete files.\n * Uses an `X-Storage-Key` (`ssk_…`) header — separate from auth and bucket keys.\n * Each key is scoped to a specific storage bucket and permission set.\n *\n * Get a StorageManager via `db.storage('keyName')` where the key name\n * matches one of the keys you defined in `storageKeys` when calling `createClient`.\n *\n * @example\n * ```ts\n * const db = createClient({ authKey: '…', bucketSecurityKey: '…', storageKeys: { avatars: 'ssk_avatars_…' } });\n * const avatars = db.storage('avatars');\n * const result = await avatars.upload(file, 'alice.jpg', { isPublic: true });\n * ```\n */\nexport class StorageManager {\n private readonly http: HttpClient;\n private readonly storageKey: string;\n private readonly basePath = '/storage';\n\n constructor(http: HttpClient, storageKey: string) {\n this.http = http;\n this.storageKey = storageKey;\n }\n\n /** Headers for all storage requests — uses X-Storage-Key, not X-Api-Key. */\n private get authHeaders(): Record<string, string> {\n return { 'X-Storage-Key': this.storageKey };\n }\n\n // ─── Upload: Simple (server-buffered) ────────────────────────────────────\n\n /**\n * Upload a file to storage in one step (server-buffered, up to 500 MB).\n * For files >10 MB or when you need upload progress, use `getUploadUrl()` instead.\n *\n * @param data File data as a Blob, Buffer, Uint8Array, or ArrayBuffer.\n * @param path Destination path in your storage (e.g. `\"avatars/alice.jpg\"`).\n * @param options Upload options: isPublic, overwrite, mimeType.\n *\n * @example\n * ```ts\n * // Upload a public avatar\n * const result = await storage.upload(file, 'avatars/alice.jpg', { isPublic: true });\n * console.log(result.publicUrl); // → https://...\n *\n * // Upload a private document\n * const result = await storage.upload(pdfBuffer, 'docs/contract.pdf');\n * console.log(result.downloadUrl); // → /storage/download/docs/contract.pdf\n * ```\n */\n async upload(\n data: Blob | Uint8Array<ArrayBuffer> | ArrayBuffer | Buffer,\n path: string,\n options: UploadOptions = {},\n ): Promise<UploadResult> {\n const { isPublic = false, overwrite = false, mimeType } = options;\n const mime = mimeType ?? guessMimeType(path);\n\n const formData = new FormData();\n const blob = data instanceof Blob\n ? data\n : new Blob([data as ArrayBuffer], { type: mime });\n\n formData.append('file', blob, path.split('/').pop() ?? 'file');\n formData.append('path', path);\n formData.append('mimeType', mime);\n formData.append('isPublic', String(isPublic));\n formData.append('overwrite', String(overwrite));\n\n const result = await this.http.request<ApiConfirmResult>(`${this.basePath}/upload`, {\n method: 'POST',\n rawBody: formData,\n headers: this.authHeaders,\n });\n\n return {\n path: result.path,\n mimeType: result.mimeType,\n size: result.size,\n isPublic: result.isPublic,\n publicUrl: result.publicUrl,\n downloadUrl: result.downloadUrl,\n };\n }\n\n /**\n * Upload raw JSON or plain text data as a file.\n *\n * @example\n * ```ts\n * const result = await storage.uploadRaw(\n * { config: { theme: 'dark' } },\n * 'settings/user-config.json',\n * { isPublic: false },\n * );\n * ```\n */\n async uploadRaw(\n data: unknown,\n path: string,\n options: UploadOptions = {},\n ): Promise<UploadResult> {\n const { isPublic = false, overwrite = false, mimeType = 'application/json' } = options;\n const body = typeof data === 'string' ? data : JSON.stringify(data);\n\n const result = await this.http.request<ApiConfirmResult>(`${this.basePath}/upload-raw`, {\n method: 'POST',\n body: { path, data: body, mimeType, isPublic, overwrite },\n headers: this.authHeaders,\n });\n\n return {\n path: result.path,\n mimeType: result.mimeType,\n size: result.size,\n isPublic: result.isPublic,\n publicUrl: result.publicUrl,\n downloadUrl: result.downloadUrl,\n };\n }\n\n // ─── Upload: Direct-to-GCS (recommended for large files) ─────────────────\n\n /**\n * Step 1 of the recommended upload flow.\n * Get a signed URL to upload directly to GCS from the client (supports progress).\n *\n * @example\n * ```ts\n * const { uploadUrl, path: confirmedPath } = await storage.getUploadUrl({\n * path: 'videos/intro.mp4',\n * mimeType: 'video/mp4',\n * size: file.size,\n * isPublic: true,\n * });\n *\n * // Upload using XHR for progress tracking\n * await storage.uploadToSignedUrl(uploadUrl, file, 'video/mp4', (pct) => {\n * console.log(`${pct}% uploaded`);\n * });\n *\n * // Step 3: confirm\n * const result = await storage.confirmUpload({ path: confirmedPath, mimeType: 'video/mp4', isPublic: true });\n * ```\n */\n async getUploadUrl(opts: {\n path: string;\n mimeType: string;\n size: number;\n isPublic?: boolean;\n overwrite?: boolean;\n expiresInSeconds?: number;\n }): Promise<UploadUrlResult> {\n const result = await this.http.request<ApiUploadUrlResult>(`${this.basePath}/upload-url`, {\n method: 'POST',\n body: { isPublic: false, overwrite: false, expiresInSeconds: 900, ...opts },\n headers: this.authHeaders,\n });\n return result;\n }\n\n /**\n * Upload data directly to a signed GCS URL (no auth headers needed).\n * Optionally tracks progress via a callback.\n *\n * @param signedUrl The URL returned by `getUploadUrl()`.\n * @param data File data.\n * @param mimeType Must match what was used in `getUploadUrl()`.\n * @param onProgress Optional callback called with 0–100 progress percentage.\n */\n async uploadToSignedUrl(\n signedUrl: string,\n data: Blob | Uint8Array<ArrayBuffer> | ArrayBuffer,\n mimeType: string,\n onProgress?: (percent: number) => void,\n ): Promise<void> {\n await this.http.putToSignedUrl(signedUrl, data, mimeType, onProgress);\n }\n\n /**\n * Step 3 of the recommended upload flow.\n * Confirm a direct upload and register metadata on the server.\n *\n * @example\n * ```ts\n * const result = await storage.confirmUpload({\n * path: 'videos/intro.mp4',\n * mimeType: 'video/mp4',\n * isPublic: true,\n * });\n * console.log(result.publicUrl);\n * ```\n */\n async confirmUpload(opts: {\n path: string;\n mimeType: string;\n isPublic?: boolean;\n }): Promise<UploadResult> {\n const result = await this.http.request<ApiConfirmResult>(`${this.basePath}/confirm`, {\n method: 'POST',\n body: { isPublic: false, ...opts },\n headers: this.authHeaders,\n });\n return {\n path: result.path,\n mimeType: result.mimeType,\n size: result.size,\n isPublic: result.isPublic,\n publicUrl: result.publicUrl,\n downloadUrl: result.downloadUrl,\n };\n }\n\n // ─── Batch Upload ─────────────────────────────────────────────────────────\n\n /**\n * Get signed upload URLs for multiple files at once.\n *\n * @example\n * ```ts\n * const { files } = await storage.getBatchUploadUrls([\n * { path: 'images/photo1.jpg', mimeType: 'image/jpeg', size: 204800 },\n * { path: 'images/photo2.jpg', mimeType: 'image/jpeg', size: 153600 },\n * ]);\n *\n * // Upload each file and confirm\n * for (const f of files) {\n * await storage.uploadToSignedUrl(f.uploadUrl, blobs[f.index], f.mimeType);\n * await storage.confirmUpload({ path: f.path, mimeType: f.mimeType });\n * }\n * ```\n */\n async getBatchUploadUrls(files: BatchUploadItem[]): Promise<BatchUploadUrlResult> {\n const result = await this.http.request<{ success: boolean; files: BatchUploadUrlResult['files'] }>(\n `${this.basePath}/batch-upload-urls`,\n { method: 'POST', body: { files }, headers: this.authHeaders },\n );\n return { files: result.files };\n }\n\n /**\n * Confirm multiple direct uploads at once.\n */\n async batchConfirmUploads(\n items: Array<{ path: string; mimeType: string; isPublic?: boolean }>,\n ): Promise<UploadResult[]> {\n const result = await this.http.request<{ success: boolean; files: ApiConfirmResult[] }>(\n `${this.basePath}/batch-confirm`,\n { method: 'POST', body: { files: items }, headers: this.authHeaders },\n );\n return result.files.map(r => ({\n path: r.path,\n mimeType: r.mimeType,\n size: r.size,\n isPublic: r.isPublic,\n publicUrl: r.publicUrl,\n downloadUrl: r.downloadUrl,\n }));\n }\n\n // ─── Download ─────────────────────────────────────────────────────────────\n\n /**\n * Download a private file as an ArrayBuffer.\n * For public files, use the `publicUrl` directly — no SDK needed.\n *\n * @example\n * ```ts\n * const buffer = await storage.download('docs/contract.pdf');\n * const blob = new Blob([buffer], { type: 'application/pdf' });\n * // Open in browser:\n * window.open(URL.createObjectURL(blob));\n * ```\n */\n async download(path: string): Promise<ArrayBuffer> {\n const encoded = path.split('/').map(encodeURIComponent).join('/');\n return this.http.request<ArrayBuffer>(`${this.basePath}/download/${encoded}`, {\n method: 'GET',\n headers: this.authHeaders,\n });\n }\n\n /**\n * Download multiple files at once, returned as a JSON map of `{ path: base64 }`.\n *\n * @example\n * ```ts\n * const files = await storage.batchDownload(['docs/a.pdf', 'docs/b.pdf']);\n * ```\n */\n async batchDownload(paths: string[]): Promise<Record<string, string>> {\n const result = await this.http.request<{ success: boolean; files: Record<string, string> }>(\n `${this.basePath}/batch-download`,\n { method: 'POST', body: { paths }, headers: this.authHeaders },\n );\n return result.files;\n }\n\n // ─── List ─────────────────────────────────────────────────────────────────\n\n /**\n * List files and folders at a given path prefix.\n *\n * @example\n * ```ts\n * // List everything in the root\n * const { files, folders } = await storage.list();\n *\n * // List a specific folder\n * const { files, folders, hasMore, nextCursor } = await storage.list({\n * prefix: 'avatars/',\n * limit: 20,\n * });\n *\n * // Next page\n * const page2 = await storage.list({ prefix: 'avatars/', cursor: nextCursor });\n * ```\n */\n async list(opts: ListOptions = {}): Promise<ListResult> {\n const params = new URLSearchParams();\n if (opts.prefix) params.set('prefix', opts.prefix);\n if (opts.limit) params.set('limit', String(opts.limit));\n if (opts.cursor) params.set('cursor', opts.cursor);\n if (opts.recursive) params.set('recursive', 'true');\n const qs = params.toString() ? `?${params}` : '';\n\n const result = await this.http.request<ApiListResult>(`${this.basePath}/list${qs}`, {\n method: 'GET',\n headers: this.authHeaders,\n });\n return {\n files: result.files,\n folders: result.folders,\n hasMore: result.hasMore,\n nextCursor: result.nextCursor,\n };\n }\n\n // ─── Metadata ─────────────────────────────────────────────────────────────\n\n /**\n * Get metadata for a file (size, MIME type, visibility, URLs).\n *\n * @example\n * ```ts\n * const meta = await storage.getMetadata('avatars/alice.jpg');\n * console.log(meta.size, meta.isPublic, meta.publicUrl);\n * ```\n */\n async getMetadata(path: string): Promise<FileMetadata> {\n const encoded = path.split('/').map(encodeURIComponent).join('/');\n const result = await this.http.request<ApiMetadataResult>(\n `${this.basePath}/metadata/${encoded}`,\n { method: 'GET', headers: this.authHeaders },\n );\n return {\n path: result.path,\n size: result.size,\n mimeType: result.mimeType,\n isPublic: result.isPublic,\n publicUrl: result.publicUrl,\n downloadUrl: result.downloadUrl,\n createdAt: result.createdAt,\n updatedAt: result.updatedAt,\n };\n }\n\n // ─── Signed URL (time-limited share) ─────────────────────────────────────\n\n /**\n * Generate a time-limited download URL for a private file.\n * The URL can be shared externally without requiring an `X-Storage-Key`.\n *\n * > **Note:** Downloads via signed URLs bypass the server, so download stats\n * > are NOT tracked. Use `downloadUrl` for tracked downloads.\n *\n * @param path Path to the file.\n * @param expiresIn URL lifetime in seconds (default 3600 = 1 hour).\n *\n * @example\n * ```ts\n * const { signedUrl, expiresAt } = await storage.getSignedUrl('docs/invoice.pdf', 1800);\n * // Share signedUrl with the recipient — it expires in 30 minutes.\n * ```\n */\n async getSignedUrl(path: string, expiresIn = 3600): Promise<SignedUrlResult> {\n const result = await this.http.request<ApiSignedUrlResult>(`${this.basePath}/signed-url`, {\n method: 'POST',\n body: { path, expiresIn },\n headers: this.authHeaders,\n });\n return {\n signedUrl: result.signedUrl,\n expiresAt: result.expiresAt,\n expiresIn: result.expiresIn,\n path: result.path,\n };\n }\n\n // ─── Visibility ───────────────────────────────────────────────────────────\n\n /**\n * Change a file's visibility between public and private after upload.\n *\n * @example\n * ```ts\n * // Make a file public\n * const result = await storage.setVisibility('avatars/alice.jpg', true);\n * console.log(result.publicUrl); // CDN URL\n *\n * // Make a file private\n * const result = await storage.setVisibility('avatars/alice.jpg', false);\n * console.log(result.downloadUrl); // Auth-required URL\n * ```\n */\n async setVisibility(\n path: string,\n isPublic: boolean,\n ): Promise<{ path: string; isPublic: boolean; publicUrl: string | null; downloadUrl: string | null }> {\n const result = await this.http.request<ApiVisibilityResult>(`${this.basePath}/visibility`, {\n method: 'PATCH',\n body: { path, isPublic },\n headers: this.authHeaders,\n });\n return {\n path: result.path,\n isPublic: result.isPublic,\n publicUrl: result.publicUrl,\n downloadUrl: result.downloadUrl,\n };\n }\n\n // ─── Folder Operations ────────────────────────────────────────────────────\n\n /**\n * Create a folder (a GCS prefix placeholder).\n *\n * @example\n * ```ts\n * await storage.createFolder('uploads/2025/');\n * ```\n */\n async createFolder(path: string): Promise<{ path: string }> {\n const result = await this.http.request<{ success: boolean; path: string }>(\n `${this.basePath}/folder`,\n { method: 'POST', body: { path }, headers: this.authHeaders },\n );\n return { path: result.path };\n }\n\n // ─── File Operations ──────────────────────────────────────────────────────\n\n /**\n * Delete a single file.\n *\n * @example\n * ```ts\n * await storage.deleteFile('avatars/old-avatar.jpg');\n * ```\n */\n async deleteFile(path: string): Promise<void> {\n await this.http.request<{ success: boolean }>(`${this.basePath}/file`, {\n method: 'DELETE',\n body: { path },\n headers: this.authHeaders,\n });\n }\n\n /**\n * Delete a folder and all its contents recursively.\n *\n * @example\n * ```ts\n * await storage.deleteFolder('temp/');\n * ```\n */\n async deleteFolder(path: string): Promise<void> {\n await this.http.request<{ success: boolean }>(`${this.basePath}/folder`, {\n method: 'DELETE',\n body: { path },\n headers: this.authHeaders,\n });\n }\n\n /**\n * Move or rename a file.\n *\n * @example\n * ```ts\n * // Rename\n * await storage.move('docs/draft.pdf', 'docs/final.pdf');\n * // Move to a different folder\n * await storage.move('inbox/report.xlsx', 'archive/2025/report.xlsx');\n * ```\n */\n async move(from: string, to: string): Promise<{ from: string; to: string }> {\n const result = await this.http.request<{ success: boolean; from: string; to: string }>(\n `${this.basePath}/move`,\n { method: 'POST', body: { from, to }, headers: this.authHeaders },\n );\n return { from: result.from, to: result.to };\n }\n\n /**\n * Copy a file to a new path.\n *\n * @example\n * ```ts\n * await storage.copy('templates/base.html', 'sites/my-site/index.html');\n * ```\n */\n async copy(from: string, to: string): Promise<{ from: string; to: string }> {\n const result = await this.http.request<{ success: boolean; from: string; to: string }>(\n `${this.basePath}/copy`,\n { method: 'POST', body: { from, to }, headers: this.authHeaders },\n );\n return { from: result.from, to: result.to };\n }\n\n // ─── Stats ────────────────────────────────────────────────────────────────\n\n /**\n * Get storage statistics for your key: total files, bytes, operation counts.\n *\n * @example\n * ```ts\n * const stats = await storage.getStats();\n * console.log(`${stats.totalFiles} files, ${(stats.totalBytes / 1e6).toFixed(1)} MB`);\n * ```\n */\n async getStats(): Promise<StorageStats> {\n const result = await this.http.request<ApiStatsResult>(`${this.basePath}/stats`, {\n method: 'GET',\n headers: this.authHeaders,\n });\n return result.stats;\n }\n\n // ─── Info (no auth) ───────────────────────────────────────────────────────\n\n /**\n * Ping the storage service. No authentication required.\n *\n * @example\n * ```ts\n * const info = await storage.info();\n * // → { ok: true, storageRoot: 'hydrous-storage' }\n * ```\n */\n async info(): Promise<{ ok: boolean; storageRoot: string }> {\n return this.http.get<{ ok: boolean; storageRoot: string }>(`${this.basePath}/info`);\n }\n}\n","import type { StorageManager } from './manager.js';\nimport type {\n UploadOptions,\n UploadResult,\n UploadUrlResult,\n ListOptions,\n ListResult,\n FileMetadata,\n SignedUrlResult,\n} from '../types/index.js';\n\n/**\n * ScopedStorage — a StorageManager pre-scoped to a specific folder prefix.\n *\n * All paths are automatically prepended with the scope, so you never\n * have to repeat the folder name.\n *\n * @example\n * ```ts\n * const db = createClient({ securityKey: 'sk_...' });\n *\n * // All operations in the \"avatars/\" folder\n * const avatars = db.storage.scope('avatars');\n *\n * await avatars.upload(file, 'alice.jpg'); // → \"avatars/alice.jpg\"\n * const list = await avatars.list(); // → files under \"avatars/\"\n * await avatars.deleteFile('alice.jpg'); // → deletes \"avatars/alice.jpg\"\n * ```\n */\nexport class ScopedStorage {\n private readonly manager: StorageManager;\n private readonly prefix: string;\n\n constructor(manager: StorageManager, prefix: string) {\n this.manager = manager;\n // Normalise: ensure the prefix ends with exactly one slash\n this.prefix = prefix.replace(/\\/+$/, '') + '/';\n }\n\n private scopedPath(userPath: string): string {\n return `${this.prefix}${userPath.replace(/^\\/+/, '')}`;\n }\n\n /** Upload a file within the scoped folder. */\n upload(\n data: Blob | Uint8Array<ArrayBuffer> | ArrayBuffer | Buffer,\n path: string,\n options?: UploadOptions,\n ): Promise<UploadResult> {\n return this.manager.upload(data, this.scopedPath(path), options);\n }\n\n /** Upload raw JSON or text within the scoped folder. */\n uploadRaw(data: unknown, path: string, options?: UploadOptions): Promise<UploadResult> {\n return this.manager.uploadRaw(data, this.scopedPath(path), options);\n }\n\n /** Get a signed upload URL for a file within the scoped folder. */\n getUploadUrl(opts: {\n path: string;\n mimeType: string;\n size: number;\n isPublic?: boolean;\n overwrite?: boolean;\n }): Promise<UploadUrlResult> {\n return this.manager.getUploadUrl({ ...opts, path: this.scopedPath(opts.path) });\n }\n\n /** Confirm a direct upload within the scoped folder. */\n confirmUpload(opts: {\n path: string;\n mimeType: string;\n isPublic?: boolean;\n }): Promise<UploadResult> {\n return this.manager.confirmUpload({ ...opts, path: this.scopedPath(opts.path) });\n }\n\n /** Download a file within the scoped folder. */\n download(path: string): Promise<ArrayBuffer> {\n return this.manager.download(this.scopedPath(path));\n }\n\n /**\n * List files within the scoped folder.\n * `prefix` in options is relative to the scope.\n */\n list(opts: ListOptions = {}): Promise<ListResult> {\n const scopedOpts = {\n ...opts,\n prefix: this.scopedPath(opts.prefix ?? ''),\n };\n return this.manager.list(scopedOpts);\n }\n\n /** Get metadata for a file within the scoped folder. */\n getMetadata(path: string): Promise<FileMetadata> {\n return this.manager.getMetadata(this.scopedPath(path));\n }\n\n /** Get a time-limited signed URL for a file within the scoped folder. */\n getSignedUrl(path: string, expiresIn?: number): Promise<SignedUrlResult> {\n return this.manager.getSignedUrl(this.scopedPath(path), expiresIn);\n }\n\n /** Change visibility of a file within the scoped folder. */\n setVisibility(\n path: string,\n isPublic: boolean,\n ): Promise<{ path: string; isPublic: boolean; publicUrl: string | null; downloadUrl: string | null }> {\n return this.manager.setVisibility(this.scopedPath(path), isPublic);\n }\n\n /** Delete a file within the scoped folder. */\n deleteFile(path: string): Promise<void> {\n return this.manager.deleteFile(this.scopedPath(path));\n }\n\n /** Delete a sub-folder within the scoped folder. */\n deleteFolder(path: string): Promise<void> {\n return this.manager.deleteFolder(this.scopedPath(path));\n }\n\n /** Move a file within the scoped folder. */\n move(from: string, to: string): Promise<{ from: string; to: string }> {\n return this.manager.move(this.scopedPath(from), this.scopedPath(to));\n }\n\n /** Copy a file within the scoped folder. */\n copy(from: string, to: string): Promise<{ from: string; to: string }> {\n return this.manager.copy(this.scopedPath(from), this.scopedPath(to));\n }\n\n /** Create a sub-folder within the scoped folder. */\n createFolder(path: string): Promise<{ path: string }> {\n return this.manager.createFolder(this.scopedPath(path));\n }\n\n /**\n * Create a further-scoped instance nested within this scope.\n *\n * @example\n * ```ts\n * const uploads = db.storage.scope('user-uploads');\n * const images = uploads.scope('images'); // → \"user-uploads/images/\"\n * ```\n */\n scope(subPrefix: string): ScopedStorage {\n return new ScopedStorage(this.manager, this.scopedPath(subPrefix));\n }\n}","import { HttpClient, DEFAULT_BASE_URL } from './utils/http.js';\nimport { AuthClient } from './auth/client.js';\nimport { RecordsClient } from './records/client.js';\nimport { AnalyticsClient } from './analytics/client.js';\nimport { StorageManager } from './storage/manager.js';\nimport { ScopedStorage } from './storage/scoped.js';\nimport type { HydrousConfig, RecordData } from './types/index.js';\n\n/**\n * HydrousClient — the main entry point for the HydrousDB SDK.\n *\n * Each service uses its own dedicated key:\n * - `authKey` (`hk_auth_…`) → `db.auth('bucket')`\n * - `bucketSecurityKey` (`hk_bucket_…`) → `db.records('bucket')` + `db.analytics('bucket')`\n * - `storageKeys` (`ssk_…`) → `db.storage('keyName')`\n *\n * @example\n * ```ts\n * import { createClient } from 'hydrousdb';\n *\n * const db = createClient({\n * authKey: 'hk_auth_…',\n * bucketSecurityKey: 'hk_bucket_…',\n * storageKeys: {\n * main: 'ssk_main_…',\n * avatars: 'ssk_avatars_…',\n * documents: 'ssk_docs_…',\n * },\n * });\n *\n * // Records & Analytics — use bucketSecurityKey automatically\n * const posts = db.records('blog-posts');\n * const analytics = db.analytics('orders');\n *\n * // Auth — uses authKey automatically\n * const auth = db.auth('app-users');\n *\n * // Storage — pick which key to use by name\n * const avatarStorage = db.storage('avatars');\n * const documentStorage = db.storage('documents');\n * ```\n */\nexport class HydrousClient {\n private readonly http: HttpClient;\n private readonly authKey_: string;\n private readonly bucketSecurityKey_: string;\n private readonly storageKeys_: Record<string, string>;\n\n private readonly _recordsCache = new Map<string, RecordsClient<RecordData>>();\n private readonly _authCache = new Map<string, AuthClient>();\n private readonly _analyticsCache = new Map<string, AnalyticsClient>();\n private readonly _storageCache = new Map<string, StorageManager>();\n\n constructor(config: HydrousConfig) {\n if (!config.authKey) {\n throw new Error('[HydrousDB] authKey is required. Get yours from https://hydrousdb.com/dashboard.');\n }\n if (!config.bucketSecurityKey) {\n throw new Error('[HydrousDB] bucketSecurityKey is required. Get yours from https://hydrousdb.com/dashboard.');\n }\n if (!config.storageKeys || Object.keys(config.storageKeys).length === 0) {\n throw new Error('[HydrousDB] storageKeys is required. Define at least one storage key from https://hydrousdb.com/dashboard.');\n }\n\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n this.http = new HttpClient(baseUrl);\n this.authKey_ = config.authKey;\n this.bucketSecurityKey_ = config.bucketSecurityKey;\n this.storageKeys_ = config.storageKeys;\n }\n\n // ─── Records ─────────────────────────────────────────────────────────────\n\n /**\n * Get a typed records client for the named bucket.\n * Uses your `bucketSecurityKey` automatically.\n *\n * @example\n * ```ts\n * interface Post { title: string; published: boolean }\n * const posts = db.records<Post>('blog-posts');\n * const post = await posts.create({ title: 'Hello', published: false });\n * ```\n */\n records<T extends RecordData = RecordData>(bucketKey: string): RecordsClient<T> {\n if (!this._recordsCache.has(bucketKey)) {\n this._recordsCache.set(\n bucketKey,\n new RecordsClient<T>(this.http, this.bucketSecurityKey_, bucketKey) as RecordsClient<RecordData>,\n );\n }\n return this._recordsCache.get(bucketKey) as RecordsClient<T>;\n }\n\n // ─── Auth ─────────────────────────────────────────────────────────────────\n\n /**\n * Get an auth client for the named user bucket.\n * Uses your `authKey` automatically.\n *\n * @example\n * ```ts\n * const auth = db.auth('app-users');\n * const { user, session } = await auth.login({ email: '…', password: '…' });\n * ```\n */\n auth(bucketKey: string): AuthClient {\n if (!this._authCache.has(bucketKey)) {\n this._authCache.set(bucketKey, new AuthClient(this.http, this.authKey_, bucketKey));\n }\n return this._authCache.get(bucketKey)!;\n }\n\n // ─── Analytics ────────────────────────────────────────────────────────────\n\n /**\n * Get an analytics client for the named bucket.\n * Uses your `bucketSecurityKey` automatically.\n *\n * @example\n * ```ts\n * const analytics = db.analytics('orders');\n * const { count } = await analytics.count();\n * ```\n */\n analytics(bucketKey: string): AnalyticsClient {\n if (!this._analyticsCache.has(bucketKey)) {\n this._analyticsCache.set(\n bucketKey,\n new AnalyticsClient(this.http, this.bucketSecurityKey_, bucketKey),\n );\n }\n return this._analyticsCache.get(bucketKey)!;\n }\n\n // ─── Storage ──────────────────────────────────────────────────────────────\n\n /**\n * Get a storage manager for the named storage key.\n * The name must match a key you defined in `storageKeys` when calling `createClient`.\n * Uses the corresponding `ssk_…` key automatically via `X-Storage-Key` header.\n *\n * @param keyName The name of the storage key (e.g. `\"avatars\"`, `\"documents\"`, `\"main\"`).\n *\n * @example\n * ```ts\n * const avatars = db.storage('avatars');\n * const documents = db.storage('documents');\n *\n * // Upload to avatars bucket\n * await avatars.upload(file, `${userId}.jpg`, { isPublic: true });\n *\n * // Scope to a sub-folder\n * const userDocs = db.storage('documents').scope(`users/${userId}`);\n * await userDocs.upload(pdfBuffer, 'contract.pdf');\n * ```\n */\n storage(keyName: string): StorageManager & { scope: (prefix: string) => ScopedStorage } {\n const ssk = this.storageKeys_[keyName];\n if (!ssk) {\n const available = Object.keys(this.storageKeys_).join(', ');\n throw new Error(\n `[HydrousDB] Unknown storage key name \"${keyName}\". ` +\n `Available keys: ${available}. ` +\n `Add it to storageKeys in your createClient() config.`,\n );\n }\n\n if (!this._storageCache.has(keyName)) {\n this._storageCache.set(keyName, new StorageManager(this.http, ssk));\n }\n\n const mgr = this._storageCache.get(keyName)!;\n const extended = mgr as StorageManager & { scope: (prefix: string) => ScopedStorage };\n if (!extended.scope) {\n extended.scope = (prefix: string) => new ScopedStorage(mgr, prefix);\n }\n return extended;\n }\n}\n\n// ─── Factory ──────────────────────────────────────────────────────────────────\n\n/**\n * Create a new HydrousDB client.\n *\n * @example\n * ```ts\n * import { createClient } from 'hydrousdb';\n *\n * const db = createClient({\n * authKey: process.env.HYDROUS_AUTH_KEY!,\n * bucketSecurityKey: process.env.HYDROUS_BUCKET_KEY!,\n * storageKeys: {\n * main: process.env.HYDROUS_STORAGE_MAIN!,\n * avatars: process.env.HYDROUS_STORAGE_AVATARS!,\n * documents: process.env.HYDROUS_STORAGE_DOCS!,\n * },\n * });\n * ```\n */\nexport function createClient(config: HydrousConfig): HydrousClient {\n return new HydrousClient(config);\n}\n"]}
package/package.json CHANGED
@@ -1,33 +1,62 @@
1
1
  {
2
2
  "name": "hydrousdb",
3
- "version": "2.0.3",
4
- "description": "Official JavaScript/TypeScript SDK for HydrousDB — auth, records, analytics, and storage",
3
+ "version": "3.0.1",
4
+ "type": "module",
5
+ "description": "Official JavaScript/TypeScript SDK for HydrousDB — the backend-as-a-service platform for records, auth, storage, and analytics.",
5
6
  "main": "./dist/index.js",
6
7
  "module": "./dist/index.mjs",
7
8
  "types": "./dist/index.d.ts",
8
9
  "exports": {
9
10
  ".": {
10
- "types": "./dist/index.d.ts",
11
- "import": "./dist/index.mjs",
12
- "require": "./dist/index.js"
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.js"
13
14
  }
14
15
  },
15
- "files": ["dist"],
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
16
21
  "scripts": {
17
- "build": "tsup",
18
- "dev": "tsup --watch",
19
- "test": "vitest run",
20
- "test:watch": "vitest",
21
- "lint": "tsc --noEmit",
22
+ "build": "tsup",
23
+ "dev": "tsup --watch",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest",
26
+ "test:coverage": "vitest run --coverage",
27
+ "lint": "tsc --noEmit",
22
28
  "prepublishOnly": "npm run build"
23
29
  },
24
- "keywords": ["hydrousdb", "hydrous", "baas", "storage", "auth", "analytics", "database", "sdk"],
25
- "author": "HydrousDB",
30
+ "keywords": [
31
+ "hydrousdb",
32
+ "hydrous",
33
+ "database",
34
+ "baas",
35
+ "backend-as-a-service",
36
+ "auth",
37
+ "storage",
38
+ "analytics",
39
+ "records",
40
+ "sdk"
41
+ ],
42
+ "author": "HydrousDB <support@hydrousdb.com>",
26
43
  "license": "MIT",
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "https://github.com/hydrousdb/hydrousdb-js.git"
47
+ },
48
+ "homepage": "https://hydrousdb.com",
49
+ "bugs": {
50
+ "url": "https://github.com/hydrousdb/hydrousdb-js/issues"
51
+ },
27
52
  "devDependencies": {
28
- "tsup": "^8.0.0",
29
- "typescript": "^5.0.0",
30
- "vitest": "^1.0.0"
53
+ "@types/node": "^22.13.0",
54
+ "@vitest/coverage-v8": "^3.0.8",
55
+ "tsup": "^8.4.0",
56
+ "typescript": "^5.7.3",
57
+ "vitest": "^3.0.8"
31
58
  },
32
- "engines": { "node": ">=16.0.0" }
33
- }
59
+ "engines": {
60
+ "node": ">=18.0.0"
61
+ }
62
+ }