@fluxbase/sdk 0.0.1-rc.44 → 0.0.1-rc.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +11 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fetch.ts","../src/utils/error-handling.ts","../src/auth.ts","../src/realtime.ts","../src/storage.ts","../src/functions.ts","../src/jobs.ts","../src/settings.ts","../src/ddl.ts","../src/oauth.ts","../src/impersonation.ts","../src/management.ts","../src/admin-functions.ts","../src/admin-migrations.ts","../src/admin-jobs.ts","../src/admin.ts","../src/query-builder.ts","../src/schema-query-builder.ts","../src/client.ts"],"names":["fetch","queryString","path","data"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * HTTP client for making requests to the Fluxbase API\n */\n\nimport type { FluxbaseError, HttpMethod } from './types'\n\nexport interface FetchOptions {\n method: HttpMethod\n headers?: Record<string, string>\n body?: unknown\n timeout?: number\n /** Skip automatic token refresh on 401 (used for auth endpoints) */\n skipAutoRefresh?: boolean\n}\n\n/**\n * Response with headers included (for count queries)\n */\nexport interface FetchResponseWithHeaders<T> {\n data: T\n headers: Headers\n status: number\n}\n\n/** Callback type for automatic token refresh on 401 errors */\nexport type RefreshTokenCallback = () => Promise<boolean>\n\nexport class FluxbaseFetch {\n private baseUrl: string\n private defaultHeaders: Record<string, string>\n private timeout: number\n private debug: boolean\n private refreshTokenCallback: RefreshTokenCallback | null = null\n private isRefreshing = false\n private refreshPromise: Promise<boolean> | null = null\n private anonKey: string | null = null\n\n constructor(\n baseUrl: string,\n options: {\n headers?: Record<string, string>\n timeout?: number\n debug?: boolean\n } = {}\n ) {\n this.baseUrl = baseUrl.replace(/\\/$/, '') // Remove trailing slash\n this.defaultHeaders = {\n 'Content-Type': 'application/json',\n ...options.headers,\n }\n this.timeout = options.timeout ?? 30000\n this.debug = options.debug ?? false\n }\n\n /**\n * Register a callback to refresh the token when a 401 error occurs\n * The callback should return true if refresh was successful, false otherwise\n */\n setRefreshTokenCallback(callback: RefreshTokenCallback | null) {\n this.refreshTokenCallback = callback\n }\n\n /**\n * Set the anon key for fallback authentication\n * When setAuthToken(null) is called, the Authorization header will be\n * restored to use this anon key instead of being deleted\n */\n setAnonKey(key: string) {\n this.anonKey = key\n }\n\n /**\n * Update the authorization header\n * When token is null, restores to anon key if available\n */\n setAuthToken(token: string | null) {\n if (token) {\n this.defaultHeaders['Authorization'] = `Bearer ${token}`\n } else if (this.anonKey) {\n // Restore anon key auth instead of deleting header\n this.defaultHeaders['Authorization'] = `Bearer ${this.anonKey}`\n } else {\n delete this.defaultHeaders['Authorization']\n }\n }\n\n /**\n * Make an HTTP request\n */\n async request<T = unknown>(path: string, options: FetchOptions): Promise<T> {\n return this.requestInternal<T>(path, options, false)\n }\n\n /**\n * Internal request implementation with retry capability\n */\n private async requestInternal<T = unknown>(\n path: string,\n options: FetchOptions,\n isRetry: boolean\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`\n const headers = { ...this.defaultHeaders, ...options.headers }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), options.timeout ?? this.timeout)\n\n if (this.debug) {\n console.log(`[Fluxbase SDK] ${options.method} ${url}`, options.body)\n }\n\n try {\n // Determine if body is FormData (needs special handling for multipart uploads)\n // Use constructor.name check for cross-runtime compatibility (Deno, Node, Browser)\n // instanceof can fail across different realms/contexts in bundled IIFE code\n const isFormData = options.body &&\n (options.body.constructor?.name === 'FormData' || options.body instanceof FormData);\n\n // For FormData, omit Content-Type to let runtime set multipart/form-data with boundary\n const requestHeaders = isFormData\n ? Object.fromEntries(\n Object.entries(headers).filter(([key]) => key.toLowerCase() !== 'content-type')\n )\n : headers;\n\n const response = await fetch(url, {\n method: options.method,\n headers: requestHeaders,\n body: isFormData ? (options.body as FormData) : (options.body ? JSON.stringify(options.body) : undefined),\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n // Parse response\n const contentType = response.headers.get('content-type')\n let data: unknown\n\n if (contentType?.includes('application/json')) {\n data = await response.json()\n } else {\n data = await response.text()\n }\n\n if (this.debug) {\n console.log(`[Fluxbase SDK] Response:`, response.status, data)\n }\n\n // Handle 401 errors with automatic token refresh\n if (\n response.status === 401 &&\n !isRetry &&\n !options.skipAutoRefresh &&\n this.refreshTokenCallback\n ) {\n const refreshSuccess = await this.handleTokenRefresh()\n if (refreshSuccess) {\n // Retry the request with the new token\n return this.requestInternal<T>(path, options, true)\n }\n }\n\n // Handle errors\n if (!response.ok) {\n const error = new Error(\n typeof data === 'object' && data && 'error' in data\n ? String(data.error)\n : response.statusText\n ) as FluxbaseError\n\n error.status = response.status\n error.details = data\n\n throw error\n }\n\n return data as T\n } catch (err) {\n clearTimeout(timeoutId)\n\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n const timeoutError = new Error('Request timeout') as FluxbaseError\n timeoutError.status = 408\n throw timeoutError\n }\n\n throw err\n }\n\n throw new Error('Unknown error occurred')\n }\n }\n\n /**\n * Handle token refresh with deduplication\n * Multiple concurrent requests that fail with 401 will share the same refresh operation\n */\n private async handleTokenRefresh(): Promise<boolean> {\n // If already refreshing, wait for the existing refresh to complete\n if (this.isRefreshing && this.refreshPromise) {\n return this.refreshPromise\n }\n\n this.isRefreshing = true\n this.refreshPromise = this.executeRefresh()\n\n try {\n return await this.refreshPromise\n } finally {\n this.isRefreshing = false\n this.refreshPromise = null\n }\n }\n\n /**\n * Execute the actual token refresh\n */\n private async executeRefresh(): Promise<boolean> {\n if (!this.refreshTokenCallback) {\n return false\n }\n\n try {\n return await this.refreshTokenCallback()\n } catch (error) {\n if (this.debug) {\n console.error('[Fluxbase SDK] Token refresh failed:', error)\n }\n return false\n }\n }\n\n /**\n * GET request\n */\n async get<T = unknown>(path: string, options: Omit<FetchOptions, 'method'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'GET' })\n }\n\n /**\n * GET request that returns response with headers (for count queries)\n */\n async getWithHeaders<T = unknown>(path: string, options: Omit<FetchOptions, 'method'> = {}): Promise<FetchResponseWithHeaders<T>> {\n return this.requestWithHeaders<T>(path, { ...options, method: 'GET' })\n }\n\n /**\n * Make an HTTP request and return response with headers\n */\n async requestWithHeaders<T = unknown>(path: string, options: FetchOptions): Promise<FetchResponseWithHeaders<T>> {\n return this.requestWithHeadersInternal<T>(path, options, false)\n }\n\n /**\n * Internal request implementation that returns response with headers\n */\n private async requestWithHeadersInternal<T = unknown>(\n path: string,\n options: FetchOptions,\n isRetry: boolean\n ): Promise<FetchResponseWithHeaders<T>> {\n const url = `${this.baseUrl}${path}`\n const headers = { ...this.defaultHeaders, ...options.headers }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), options.timeout ?? this.timeout)\n\n if (this.debug) {\n console.log(`[Fluxbase SDK] ${options.method} ${url}`, options.body)\n }\n\n try {\n // Determine if body is FormData (needs special handling for multipart uploads)\n // Use constructor.name check for cross-runtime compatibility (Deno, Node, Browser)\n // instanceof can fail across different realms/contexts in bundled IIFE code\n const isFormData = options.body &&\n (options.body.constructor?.name === 'FormData' || options.body instanceof FormData);\n\n // For FormData, omit Content-Type to let runtime set multipart/form-data with boundary\n const requestHeaders = isFormData\n ? Object.fromEntries(\n Object.entries(headers).filter(([key]) => key.toLowerCase() !== 'content-type')\n )\n : headers;\n\n const response = await fetch(url, {\n method: options.method,\n headers: requestHeaders,\n body: isFormData ? (options.body as FormData) : (options.body ? JSON.stringify(options.body) : undefined),\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n // Parse response\n const contentType = response.headers.get('content-type')\n let data: unknown\n\n if (contentType?.includes('application/json')) {\n data = await response.json()\n } else {\n data = await response.text()\n }\n\n if (this.debug) {\n console.log(`[Fluxbase SDK] Response:`, response.status, data)\n }\n\n // Handle 401 errors with automatic token refresh\n if (\n response.status === 401 &&\n !isRetry &&\n !options.skipAutoRefresh &&\n this.refreshTokenCallback\n ) {\n const refreshSuccess = await this.handleTokenRefresh()\n if (refreshSuccess) {\n // Retry the request with the new token\n return this.requestWithHeadersInternal<T>(path, options, true)\n }\n }\n\n // Handle errors\n if (!response.ok) {\n const error = new Error(\n typeof data === 'object' && data && 'error' in data\n ? String(data.error)\n : response.statusText\n ) as FluxbaseError\n\n error.status = response.status\n error.details = data\n\n throw error\n }\n\n return {\n data: data as T,\n headers: response.headers,\n status: response.status,\n }\n } catch (err) {\n clearTimeout(timeoutId)\n\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n const timeoutError = new Error('Request timeout') as FluxbaseError\n timeoutError.status = 408\n throw timeoutError\n }\n\n throw err\n }\n\n throw new Error('Unknown error occurred')\n }\n }\n\n /**\n * POST request\n */\n async post<T = unknown>(path: string, body?: unknown, options: Omit<FetchOptions, 'method' | 'body'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'POST', body })\n }\n\n /**\n * PUT request\n */\n async put<T = unknown>(path: string, body?: unknown, options: Omit<FetchOptions, 'method' | 'body'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'PUT', body })\n }\n\n /**\n * PATCH request\n */\n async patch<T = unknown>(path: string, body?: unknown, options: Omit<FetchOptions, 'method' | 'body'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'PATCH', body })\n }\n\n /**\n * DELETE request\n */\n async delete<T = unknown>(path: string, options: Omit<FetchOptions, 'method'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'DELETE' })\n }\n\n /**\n * HEAD request\n */\n async head(path: string, options: Omit<FetchOptions, 'method'> = {}): Promise<Headers> {\n const url = `${this.baseUrl}${path}`\n const headers = { ...this.defaultHeaders, ...options.headers }\n\n const response = await fetch(url, {\n method: 'HEAD',\n headers,\n })\n\n return response.headers\n }\n}\n","import type { FluxbaseResponse, VoidResponse } from '../types'\n\n/**\n * Wraps an async operation with try-catch, returning Fluxbase response format\n * @param operation The async operation to wrap\n * @returns Promise resolving to { data, error: null } on success or { data: null, error } on failure\n */\nexport async function wrapAsync<T>(\n operation: () => Promise<T>\n): Promise<FluxbaseResponse<T>> {\n try {\n const data = await operation()\n return { data, error: null }\n } catch (error) {\n return {\n data: null,\n error: error instanceof Error ? error : new Error(String(error))\n }\n }\n}\n\n/**\n * Wraps void async operations (operations that don't return data)\n * @param operation The async void operation to wrap\n * @returns Promise resolving to { error: null } on success or { error } on failure\n */\nexport async function wrapAsyncVoid(\n operation: () => Promise<void>\n): Promise<VoidResponse> {\n try {\n await operation()\n return { error: null }\n } catch (error) {\n return {\n error: error instanceof Error ? error : new Error(String(error))\n }\n }\n}\n\n/**\n * Wraps synchronous operations (for consistency)\n * @param operation The sync operation to wrap\n * @returns { data, error: null } on success or { data: null, error } on failure\n */\nexport function wrapSync<T>(\n operation: () => T\n): FluxbaseResponse<T> {\n try {\n const data = operation()\n return { data, error: null }\n } catch (error) {\n return {\n data: null,\n error: error instanceof Error ? error : new Error(String(error))\n }\n }\n}\n","/**\n * Authentication module for Fluxbase SDK\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n AuthResponse,\n AuthResponseData,\n AuthSession,\n SignInCredentials,\n SignUpCredentials,\n UpdateUserAttributes,\n User,\n TwoFactorSetupResponse,\n TwoFactorEnableResponse,\n TwoFactorLoginResponse,\n TwoFactorStatusResponse,\n TwoFactorDisableResponse,\n TwoFactorVerifyRequest,\n SignInWith2FAResponse,\n PasswordResetResponse,\n VerifyResetTokenResponse,\n ResetPasswordResponse,\n MagicLinkOptions,\n MagicLinkResponse,\n AnonymousSignInResponse,\n OAuthProvidersResponse,\n OAuthOptions,\n OAuthUrlResponse,\n AuthChangeEvent,\n AuthStateChangeCallback,\n AuthSubscription,\n FluxbaseAuthResponse,\n FluxbaseResponse,\n UserResponse,\n DataResponse,\n VoidResponse,\n SignInWithOtpCredentials,\n VerifyOtpParams,\n ResendOtpParams,\n OTPResponse,\n UserIdentitiesResponse,\n LinkIdentityCredentials,\n UnlinkIdentityParams,\n ReauthenticateResponse,\n SignInWithIdTokenCredentials,\n} from \"./types\";\nimport { wrapAsync, wrapAsyncVoid } from \"./utils/error-handling\";\n\nconst AUTH_STORAGE_KEY = \"fluxbase.auth.session\";\n\n// Auto-refresh configuration constants\nconst AUTO_REFRESH_TICK_THRESHOLD = 10; // seconds before expiry to trigger refresh\nconst AUTO_REFRESH_TICK_MINIMUM = 1000; // minimum delay in ms (1 second)\nconst MAX_REFRESH_RETRIES = 3; // number of retry attempts before signing out\n\n/**\n * In-memory storage adapter for Node.js/SSR environments\n * where localStorage is not available\n */\nclass MemoryStorage implements Storage {\n private store = new Map<string, string>();\n\n get length(): number {\n return this.store.size;\n }\n\n clear(): void {\n this.store.clear();\n }\n\n getItem(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n setItem(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n removeItem(key: string): void {\n this.store.delete(key);\n }\n\n key(index: number): string | null {\n return [...this.store.keys()][index] ?? null;\n }\n}\n\n/**\n * Check if localStorage is available and working\n */\nfunction isLocalStorageAvailable(): boolean {\n try {\n if (typeof localStorage === \"undefined\") {\n return false;\n }\n // Test that localStorage actually works (some browsers block it)\n const testKey = \"__fluxbase_storage_test__\";\n localStorage.setItem(testKey, \"test\");\n localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\nexport class FluxbaseAuth {\n private fetch: FluxbaseFetch;\n private session: AuthSession | null = null;\n private persist: boolean;\n private autoRefresh: boolean;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private stateChangeListeners: Set<AuthStateChangeCallback> = new Set();\n private storage: Storage | null = null;\n\n constructor(fetch: FluxbaseFetch, autoRefresh = true, persist = true) {\n this.fetch = fetch;\n this.persist = persist;\n this.autoRefresh = autoRefresh;\n\n // Register refresh callback for automatic 401 handling\n this.fetch.setRefreshTokenCallback(async () => {\n const result = await this.refreshSession();\n return !result.error;\n });\n\n // Initialize storage based on persist option and environment\n if (this.persist) {\n if (isLocalStorageAvailable()) {\n this.storage = localStorage;\n } else {\n // Node.js/SSR fallback - use in-memory storage\n this.storage = new MemoryStorage();\n }\n }\n\n // Load session from storage if persisted\n if (this.storage) {\n const stored = this.storage.getItem(AUTH_STORAGE_KEY);\n if (stored) {\n try {\n this.session = JSON.parse(stored);\n if (this.session) {\n this.fetch.setAuthToken(this.session.access_token);\n // Schedule auto-refresh if enabled (only runs in browser environments)\n this.scheduleTokenRefresh();\n }\n } catch {\n // Invalid stored session, ignore\n this.storage.removeItem(AUTH_STORAGE_KEY);\n }\n }\n }\n }\n\n /**\n * Get the current session (Supabase-compatible)\n * Returns the session from the client-side cache without making a network request\n */\n async getSession(): Promise<\n FluxbaseResponse<{ session: AuthSession | null }>\n > {\n return { data: { session: this.session }, error: null };\n }\n\n /**\n * Get the current user (Supabase-compatible)\n * Returns the user from the client-side session without making a network request\n * For server-side validation, use getCurrentUser() instead\n */\n async getUser(): Promise<FluxbaseResponse<{ user: User | null }>> {\n return { data: { user: this.session?.user ?? null }, error: null };\n }\n\n /**\n * Get the current access token\n */\n getAccessToken(): string | null {\n return this.session?.access_token ?? null;\n }\n\n /**\n * Listen to auth state changes (Supabase-compatible)\n * @param callback - Function called when auth state changes\n * @returns Object containing subscription data\n *\n * @example\n * ```typescript\n * const { data: { subscription } } = client.auth.onAuthStateChange((event, session) => {\n * console.log('Auth event:', event, session)\n * })\n *\n * // Later, to unsubscribe:\n * subscription.unsubscribe()\n * ```\n */\n onAuthStateChange(callback: AuthStateChangeCallback): {\n data: { subscription: AuthSubscription };\n } {\n this.stateChangeListeners.add(callback);\n\n const subscription: AuthSubscription = {\n unsubscribe: () => {\n this.stateChangeListeners.delete(callback);\n },\n };\n\n return { data: { subscription } };\n }\n\n /**\n * Start the automatic token refresh timer\n * This is called automatically when autoRefresh is enabled and a session exists\n * Only works in browser environments\n */\n startAutoRefresh(): void {\n this.scheduleTokenRefresh();\n }\n\n /**\n * Stop the automatic token refresh timer\n * Call this when you want to disable auto-refresh without signing out\n */\n stopAutoRefresh(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n /**\n * Sign in with email and password (Supabase-compatible)\n * Returns { user, session } if successful, or SignInWith2FAResponse if 2FA is required\n */\n async signIn(\n credentials: SignInCredentials,\n ): Promise<FluxbaseResponse<AuthResponseData | SignInWith2FAResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<\n AuthResponse | SignInWith2FAResponse\n >(\"/api/v1/auth/signin\", credentials);\n\n // Check if 2FA is required\n if (\"requires_2fa\" in response && response.requires_2fa) {\n return response as SignInWith2FAResponse;\n }\n\n // Normal sign in without 2FA\n const authResponse = response as AuthResponse;\n const session: AuthSession = {\n ...authResponse,\n expires_at: Date.now() + authResponse.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Sign in with email and password (Supabase-compatible)\n * Alias for signIn() to maintain compatibility with common authentication patterns\n * Returns { user, session } if successful, or SignInWith2FAResponse if 2FA is required\n */\n async signInWithPassword(\n credentials: SignInCredentials,\n ): Promise<FluxbaseResponse<AuthResponseData | SignInWith2FAResponse>> {\n return this.signIn(credentials);\n }\n\n /**\n * Sign up with email and password (Supabase-compatible)\n * Returns session when email confirmation is disabled\n * Returns null session when email confirmation is required\n */\n async signUp(credentials: SignUpCredentials): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n // Transform Supabase-style options.data to backend's user_metadata format\n const requestBody: any = {\n email: credentials.email,\n password: credentials.password,\n };\n\n // Map options.data to user_metadata for the backend\n if (credentials.options?.data) {\n requestBody.user_metadata = credentials.options.data;\n }\n\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/signup\",\n requestBody,\n );\n\n // Check if session tokens are provided (no email confirmation required)\n if (response.access_token && response.refresh_token) {\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: response.user, session };\n }\n\n // Email confirmation required - return user without session\n return { user: response.user, session: null };\n });\n }\n\n /**\n * Sign out the current user\n */\n async signOut(): Promise<VoidResponse> {\n return wrapAsyncVoid(async () => {\n try {\n await this.fetch.post(\"/api/v1/auth/signout\");\n } finally {\n this.clearSession();\n }\n });\n }\n\n /**\n * Refresh the session (Supabase-compatible)\n * Returns a new session with refreshed tokens\n */\n async refreshSession(): Promise<\n FluxbaseResponse<{ user: User; session: AuthSession }>\n > {\n return wrapAsync(async () => {\n if (!this.session?.refresh_token) {\n throw new Error(\"No refresh token available\");\n }\n\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/refresh\",\n {\n refresh_token: this.session.refresh_token,\n },\n { skipAutoRefresh: true }, // Prevent infinite loop on 401\n );\n\n const session: AuthSession = {\n ...response,\n user: response.user ?? this.session.user,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session, \"TOKEN_REFRESHED\");\n return { user: session.user, session };\n });\n }\n\n /**\n * Refresh the session (Supabase-compatible alias)\n * Alias for refreshSession() to maintain compatibility with Supabase naming\n * Returns a new session with refreshed tokens\n */\n async refreshToken(): Promise<\n FluxbaseResponse<{ user: User; session: AuthSession }>\n > {\n return this.refreshSession();\n }\n\n /**\n * Get the current user from the server\n */\n async getCurrentUser(): Promise<UserResponse> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n const user = await this.fetch.get<User>(\"/api/v1/auth/user\");\n return { user };\n });\n }\n\n /**\n * Update the current user (Supabase-compatible)\n * @param attributes - User attributes to update (email, password, data for metadata)\n */\n async updateUser(attributes: UpdateUserAttributes): Promise<UserResponse> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n // Transform Supabase-style 'data' to backend's 'user_metadata' format\n const requestBody: any = {};\n\n if (attributes.email) {\n requestBody.email = attributes.email;\n }\n\n if (attributes.password) {\n requestBody.password = attributes.password;\n }\n\n if (attributes.data) {\n requestBody.user_metadata = attributes.data;\n }\n\n if (attributes.nonce) {\n requestBody.nonce = attributes.nonce;\n }\n\n const user = await this.fetch.patch<User>(\n \"/api/v1/auth/user\",\n requestBody,\n );\n\n // Update session with new user data\n if (this.session) {\n this.session.user = user;\n this.saveSession();\n this.emitAuthChange(\"USER_UPDATED\", this.session);\n }\n\n return { user };\n });\n }\n\n /**\n * Set the session manually (Supabase-compatible)\n * Useful for restoring a session from storage or SSR scenarios\n * @param session - Object containing access_token and refresh_token\n * @returns Promise with session data\n */\n async setSession(session: {\n access_token: string;\n refresh_token: string;\n }): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n // Create a full auth session from the tokens\n const authSession: AuthSession = {\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n user: null as any, // Will be populated by getCurrentUser\n expires_in: 3600, // Default, will be updated on refresh\n expires_at: Date.now() + 3600 * 1000,\n };\n\n // Set the token so we can make authenticated requests\n this.fetch.setAuthToken(session.access_token);\n\n // Fetch the current user to populate the session\n const user = await this.fetch.get<User>(\"/api/v1/auth/user\");\n authSession.user = user;\n\n // Store the session\n this.setSessionInternal(authSession, \"SIGNED_IN\");\n\n return { user, session: authSession };\n });\n }\n\n /**\n * Setup 2FA for the current user (Supabase-compatible)\n * Enrolls a new MFA factor and returns TOTP details\n * @param issuer - Optional custom issuer name for the QR code (e.g., \"MyApp\"). If not provided, uses server default.\n * @returns Promise with factor id, type, and TOTP setup details\n */\n async setup2FA(\n issuer?: string,\n ): Promise<DataResponse<TwoFactorSetupResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<TwoFactorSetupResponse>(\n \"/api/v1/auth/2fa/setup\",\n issuer ? { issuer } : undefined,\n );\n });\n }\n\n /**\n * Enable 2FA after verifying the TOTP code (Supabase-compatible)\n * Verifies the TOTP code and returns new tokens with MFA session\n * @param code - TOTP code from authenticator app\n * @returns Promise with access_token, refresh_token, and user\n */\n async enable2FA(\n code: string,\n ): Promise<DataResponse<TwoFactorEnableResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<TwoFactorEnableResponse>(\n \"/api/v1/auth/2fa/enable\",\n { code },\n );\n });\n }\n\n /**\n * Disable 2FA for the current user (Supabase-compatible)\n * Unenrolls the MFA factor\n * @param password - User password for confirmation\n * @returns Promise with unenrolled factor id\n */\n async disable2FA(\n password: string,\n ): Promise<DataResponse<TwoFactorDisableResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<TwoFactorDisableResponse>(\n \"/api/v1/auth/2fa/disable\",\n { password },\n );\n });\n }\n\n /**\n * Check 2FA status for the current user (Supabase-compatible)\n * Lists all enrolled MFA factors\n * @returns Promise with all factors and TOTP factors\n */\n async get2FAStatus(): Promise<DataResponse<TwoFactorStatusResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.get<TwoFactorStatusResponse>(\n \"/api/v1/auth/2fa/status\",\n );\n });\n }\n\n /**\n * Verify 2FA code during login (Supabase-compatible)\n * Call this after signIn returns requires_2fa: true\n * @param request - User ID and TOTP code\n * @returns Promise with access_token, refresh_token, and user\n */\n async verify2FA(\n request: TwoFactorVerifyRequest,\n ): Promise<DataResponse<TwoFactorLoginResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<TwoFactorLoginResponse>(\n \"/api/v1/auth/2fa/verify\",\n request,\n );\n\n // Create session from the response tokens\n if (response.access_token && response.refresh_token) {\n const session: AuthSession = {\n user: response.user,\n access_token: response.access_token,\n refresh_token: response.refresh_token,\n expires_in: response.expires_in || 3600,\n expires_at: Date.now() + (response.expires_in || 3600) * 1000,\n };\n\n this.setSessionInternal(session, \"MFA_CHALLENGE_VERIFIED\");\n }\n\n return response;\n });\n }\n\n /**\n * Send password reset email (Supabase-compatible)\n * Sends a password reset link to the provided email address\n * @param email - Email address to send reset link to\n * @returns Promise with OTP-style response\n */\n async sendPasswordReset(\n email: string,\n ): Promise<DataResponse<PasswordResetResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/password/reset\", { email });\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Supabase-compatible alias for sendPasswordReset()\n * @param email - Email address to send reset link to\n * @param _options - Optional redirect configuration (currently not used)\n * @returns Promise with OTP-style response\n */\n async resetPasswordForEmail(\n email: string,\n _options?: { redirectTo?: string },\n ): Promise<DataResponse<PasswordResetResponse>> {\n return this.sendPasswordReset(email);\n }\n\n /**\n * Verify password reset token\n * Check if a password reset token is valid before allowing password reset\n * @param token - Password reset token to verify\n */\n async verifyResetToken(\n token: string,\n ): Promise<DataResponse<VerifyResetTokenResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.post<VerifyResetTokenResponse>(\n \"/api/v1/auth/password/reset/verify\",\n {\n token,\n },\n );\n });\n }\n\n /**\n * Reset password with token (Supabase-compatible)\n * Complete the password reset process with a valid token\n * @param token - Password reset token\n * @param newPassword - New password to set\n * @returns Promise with user and new session\n */\n async resetPassword(\n token: string,\n newPassword: string,\n ): Promise<DataResponse<ResetPasswordResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/password/reset/confirm\",\n {\n token,\n new_password: newPassword,\n },\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session, \"PASSWORD_RECOVERY\");\n return { user: session.user, session };\n });\n }\n\n /**\n * Send magic link for passwordless authentication (Supabase-compatible)\n * @param email - Email address to send magic link to\n * @param options - Optional configuration for magic link\n * @returns Promise with OTP-style response\n */\n async sendMagicLink(\n email: string,\n options?: MagicLinkOptions,\n ): Promise<DataResponse<MagicLinkResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/magiclink\", {\n email,\n redirect_to: options?.redirect_to,\n });\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Verify magic link token and sign in\n * @param token - Magic link token from email\n */\n async verifyMagicLink(token: string): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/magiclink/verify\",\n {\n token,\n },\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Sign in anonymously\n * Creates a temporary anonymous user session\n */\n async signInAnonymously(): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AnonymousSignInResponse>(\n \"/api/v1/auth/signin/anonymous\",\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Get list of enabled OAuth providers\n */\n async getOAuthProviders(): Promise<DataResponse<OAuthProvidersResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.get<OAuthProvidersResponse>(\n \"/api/v1/auth/oauth/providers\",\n );\n });\n }\n\n /**\n * Get OAuth authorization URL for a provider\n * @param provider - OAuth provider name (e.g., 'google', 'github')\n * @param options - Optional OAuth configuration\n */\n async getOAuthUrl(\n provider: string,\n options?: OAuthOptions,\n ): Promise<DataResponse<OAuthUrlResponse>> {\n return wrapAsync(async () => {\n const params = new URLSearchParams();\n if (options?.redirect_to) {\n params.append(\"redirect_to\", options.redirect_to);\n }\n if (options?.scopes && options.scopes.length > 0) {\n params.append(\"scopes\", options.scopes.join(\",\"));\n }\n\n const queryString = params.toString();\n const url = queryString\n ? `/api/v1/auth/oauth/${provider}/authorize?${queryString}`\n : `/api/v1/auth/oauth/${provider}/authorize`;\n\n const response = await this.fetch.get<OAuthUrlResponse>(url);\n return response;\n });\n }\n\n /**\n * Exchange OAuth authorization code for session\n * This is typically called in your OAuth callback handler\n * @param code - Authorization code from OAuth callback\n */\n async exchangeCodeForSession(code: string): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/oauth/callback\",\n { code },\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Convenience method to initiate OAuth sign-in\n * Redirects the user to the OAuth provider's authorization page\n * @param provider - OAuth provider name (e.g., 'google', 'github')\n * @param options - Optional OAuth configuration\n */\n async signInWithOAuth(\n provider: string,\n options?: OAuthOptions,\n ): Promise<DataResponse<{ provider: string; url: string }>> {\n return wrapAsync(async () => {\n const result = await this.getOAuthUrl(provider, options);\n\n if (result.error) {\n throw result.error;\n }\n\n const url = result.data.url;\n\n if (typeof window !== \"undefined\") {\n window.location.href = url;\n } else {\n throw new Error(\n \"signInWithOAuth can only be called in a browser environment\",\n );\n }\n\n return { provider, url };\n });\n }\n\n /**\n * Sign in with OTP (One-Time Password) - Supabase-compatible\n * Sends a one-time password via email or SMS for passwordless authentication\n * @param credentials - Email or phone number and optional configuration\n * @returns Promise with OTP-style response\n */\n async signInWithOtp(\n credentials: SignInWithOtpCredentials,\n ): Promise<DataResponse<OTPResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/otp/signin\", credentials);\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Verify OTP (One-Time Password) - Supabase-compatible\n * Verify OTP tokens for various authentication flows\n * @param params - OTP verification parameters including token and type\n * @returns Promise with user and session if successful\n */\n async verifyOtp(params: VerifyOtpParams): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/otp/verify\",\n params,\n );\n\n // Check if session tokens are provided\n if (response.access_token && response.refresh_token) {\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: response.user, session };\n }\n\n // Email confirmation required - return user without session\n return { user: response.user, session: null };\n });\n }\n\n /**\n * Resend OTP (One-Time Password) - Supabase-compatible\n * Resend OTP code when user doesn't receive it\n * @param params - Resend parameters including type and email/phone\n * @returns Promise with OTP-style response\n */\n async resendOtp(params: ResendOtpParams): Promise<DataResponse<OTPResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/otp/resend\", params);\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Get user identities (linked OAuth providers) - Supabase-compatible\n * Lists all OAuth identities linked to the current user\n * @returns Promise with list of user identities\n */\n async getUserIdentities(): Promise<DataResponse<UserIdentitiesResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.get<UserIdentitiesResponse>(\n \"/api/v1/auth/user/identities\",\n );\n });\n }\n\n /**\n * Link an OAuth identity to current user - Supabase-compatible\n * Links an additional OAuth provider to the existing account\n * @param credentials - Provider to link\n * @returns Promise with OAuth URL to complete linking\n */\n async linkIdentity(\n credentials: LinkIdentityCredentials,\n ): Promise<DataResponse<OAuthUrlResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<OAuthUrlResponse>(\n \"/api/v1/auth/user/identities\",\n credentials,\n );\n });\n }\n\n /**\n * Unlink an OAuth identity from current user - Supabase-compatible\n * Removes a linked OAuth provider from the account\n * @param params - Identity to unlink\n * @returns Promise with void response\n */\n async unlinkIdentity(params: UnlinkIdentityParams): Promise<VoidResponse> {\n return wrapAsyncVoid(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n await this.fetch.delete(\n `/api/v1/auth/user/identities/${params.identity.id}`,\n );\n });\n }\n\n /**\n * Reauthenticate to get security nonce - Supabase-compatible\n * Get a security nonce for sensitive operations (password change, etc.)\n * @returns Promise with nonce for reauthentication\n */\n async reauthenticate(): Promise<DataResponse<ReauthenticateResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<ReauthenticateResponse>(\n \"/api/v1/auth/reauthenticate\",\n );\n });\n }\n\n /**\n * Sign in with ID token (for native mobile apps) - Supabase-compatible\n * Authenticate using native mobile app ID tokens (Google, Apple)\n * @param credentials - Provider, ID token, and optional nonce\n * @returns Promise with user and session\n */\n async signInWithIdToken(\n credentials: SignInWithIdTokenCredentials,\n ): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/signin/idtoken\",\n credentials,\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Internal: Set the session and persist it\n */\n private setSessionInternal(\n session: AuthSession,\n event: AuthChangeEvent = \"SIGNED_IN\",\n ) {\n this.session = session;\n this.fetch.setAuthToken(session.access_token);\n this.saveSession();\n this.scheduleTokenRefresh();\n this.emitAuthChange(event, session);\n }\n\n /**\n * Internal: Clear the session\n */\n private clearSession() {\n this.session = null;\n this.fetch.setAuthToken(null);\n\n if (this.storage) {\n this.storage.removeItem(AUTH_STORAGE_KEY);\n }\n\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n\n this.emitAuthChange(\"SIGNED_OUT\", null);\n }\n\n /**\n * Internal: Save session to storage\n */\n private saveSession() {\n if (this.storage && this.session) {\n this.storage.setItem(AUTH_STORAGE_KEY, JSON.stringify(this.session));\n }\n }\n\n /**\n * Internal: Schedule automatic token refresh\n * Only runs in browser environments when autoRefresh is enabled\n */\n private scheduleTokenRefresh() {\n // Only auto-refresh in browser environments\n if (!this.autoRefresh || typeof window === \"undefined\") {\n return;\n }\n\n if (!this.session?.expires_at) {\n return;\n }\n\n // Clear existing timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n\n // Calculate time until expiry (expires_at is in ms)\n const expiresAt = this.session.expires_at;\n const now = Date.now();\n const timeUntilExpiry = expiresAt - now;\n\n // Refresh 10 seconds before expiry, minimum 1 second delay\n const refreshIn = Math.max(\n timeUntilExpiry - AUTO_REFRESH_TICK_THRESHOLD * 1000,\n AUTO_REFRESH_TICK_MINIMUM,\n );\n\n this.refreshTimer = setTimeout(() => {\n this.attemptRefresh();\n }, refreshIn);\n }\n\n /**\n * Internal: Attempt to refresh the token with retry logic\n * Uses exponential backoff: 1s, 2s, 4s delays between retries\n */\n private async attemptRefresh(retries = MAX_REFRESH_RETRIES): Promise<void> {\n try {\n const result = await this.refreshSession();\n if (result.error) {\n throw result.error;\n }\n // Success - scheduleTokenRefresh is called within setSessionInternal\n // via refreshSession -> setSessionInternal -> scheduleTokenRefresh\n } catch (error) {\n if (retries > 0) {\n // Exponential backoff: 1s, 2s, 4s (Math.pow(2, MAX_REFRESH_RETRIES - retries) * 1000)\n const delay = Math.pow(2, MAX_REFRESH_RETRIES - retries) * 1000;\n console.warn(\n `Token refresh failed, retrying in ${delay / 1000}s (${retries} attempts remaining)`,\n error,\n );\n this.refreshTimer = setTimeout(() => {\n this.attemptRefresh(retries - 1);\n }, delay);\n } else {\n // All retries exhausted - sign out\n console.error(\n \"Token refresh failed after all retries, signing out\",\n error,\n );\n this.clearSession();\n }\n }\n }\n\n /**\n * Internal: Emit auth state change event to all listeners\n */\n private emitAuthChange(event: AuthChangeEvent, session: AuthSession | null) {\n this.stateChangeListeners.forEach((callback) => {\n try {\n callback(event, session);\n } catch (error) {\n console.error(\"Error in auth state change listener:\", error);\n }\n });\n }\n}\n","/**\n * Realtime subscriptions using WebSockets\n */\n\nimport type {\n RealtimeCallback,\n RealtimePostgresChangesPayload,\n RealtimeMessage,\n PostgresChangesConfig,\n RealtimeChannelConfig,\n PresenceState,\n RealtimePresencePayload,\n PresenceCallback,\n BroadcastMessage,\n RealtimeBroadcastPayload,\n BroadcastCallback,\n} from \"./types\";\n\nexport class RealtimeChannel {\n private ws: WebSocket | null = null;\n private url: string;\n private token: string | null;\n private channelName: string;\n private callbacks: Map<string, Set<RealtimeCallback>> = new Map();\n private presenceCallbacks: Map<string, Set<PresenceCallback>> = new Map();\n private broadcastCallbacks: Map<string, Set<BroadcastCallback>> = new Map();\n private subscriptionConfig: PostgresChangesConfig | null = null;\n private subscriptionId: string | null = null;\n private _presenceState: Record<string, PresenceState[]> = {};\n private myPresenceKey: string | null = null;\n private config: RealtimeChannelConfig;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 10;\n private reconnectDelay = 1000;\n private shouldReconnect = true;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n private pendingAcks: Map<\n string,\n { resolve: (value: string) => void; reject: (reason: any) => void; timeout: ReturnType<typeof setTimeout> }\n > = new Map();\n private messageIdCounter = 0;\n private onTokenRefreshNeeded: (() => Promise<string | null>) | null = null;\n private isRefreshingToken = false;\n\n constructor(\n url: string,\n channelName: string,\n token: string | null = null,\n config: RealtimeChannelConfig = {}\n ) {\n this.url = url;\n this.channelName = channelName;\n this.token = token;\n this.config = config;\n }\n\n /**\n * Set callback to request a token refresh when connection fails due to auth\n * @internal\n */\n setTokenRefreshCallback(callback: () => Promise<string | null>) {\n this.onTokenRefreshNeeded = callback;\n }\n\n /**\n * Listen to postgres_changes with optional row-level filtering\n *\n * @param event - 'postgres_changes'\n * @param config - Configuration including optional filter\n * @param callback - Function to call when changes occur\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('postgres_changes', {\n * event: '*',\n * schema: 'public',\n * table: 'jobs',\n * filter: 'created_by=eq.user123'\n * }, (payload) => {\n * console.log('Job updated:', payload)\n * })\n * ```\n */\n on(\n event: \"postgres_changes\",\n config: PostgresChangesConfig,\n callback: RealtimeCallback,\n ): this;\n\n /**\n * Listen to a specific event type (backwards compatibility)\n *\n * @param event - The event type (INSERT, UPDATE, DELETE, or '*' for all)\n * @param callback - The callback function\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('INSERT', (payload) => {\n * console.log('New record inserted:', payload.new_record)\n * })\n * ```\n */\n on(\n event: \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\",\n callback: RealtimeCallback,\n ): this;\n\n /**\n * Listen to broadcast messages\n *\n * @param event - 'broadcast'\n * @param config - Configuration with event name\n * @param callback - Function to call when broadcast received\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('broadcast', { event: 'cursor-pos' }, (payload) => {\n * console.log('Cursor moved:', payload)\n * })\n * ```\n */\n on(\n event: \"broadcast\",\n config: { event: string },\n callback: BroadcastCallback,\n ): this;\n\n /**\n * Listen to presence events\n *\n * @param event - 'presence'\n * @param config - Configuration with event type (sync, join, leave)\n * @param callback - Function to call when presence changes\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('presence', { event: 'sync' }, (payload) => {\n * console.log('Presence synced:', payload)\n * })\n * ```\n */\n on(\n event: \"presence\",\n config: { event: \"sync\" | \"join\" | \"leave\" },\n callback: PresenceCallback,\n ): this;\n\n // Implementation\n on(\n event:\n | \"postgres_changes\"\n | \"INSERT\"\n | \"UPDATE\"\n | \"DELETE\"\n | \"*\"\n | \"broadcast\"\n | \"presence\",\n configOrCallback:\n | PostgresChangesConfig\n | RealtimeCallback\n | { event: string }\n | { event: \"sync\" | \"join\" | \"leave\" },\n callback?: RealtimeCallback | BroadcastCallback | PresenceCallback,\n ): this {\n if (\n event === \"postgres_changes\" &&\n typeof configOrCallback !== \"function\"\n ) {\n // on('postgres_changes', config, callback)\n const config = configOrCallback as PostgresChangesConfig;\n this.subscriptionConfig = config;\n const actualCallback = callback!;\n\n const eventType = config.event;\n if (!this.callbacks.has(eventType)) {\n this.callbacks.set(eventType, new Set());\n }\n this.callbacks.get(eventType)!.add(actualCallback as RealtimeCallback);\n } else if (event === \"broadcast\" && typeof configOrCallback !== \"function\") {\n // on('broadcast', { event }, callback)\n const config = configOrCallback as { event: string };\n const actualCallback = callback as BroadcastCallback;\n\n if (!this.broadcastCallbacks.has(config.event)) {\n this.broadcastCallbacks.set(config.event, new Set());\n }\n this.broadcastCallbacks.get(config.event)!.add(actualCallback);\n } else if (event === \"presence\" && typeof configOrCallback !== \"function\") {\n // on('presence', { event }, callback)\n const config = configOrCallback as { event: \"sync\" | \"join\" | \"leave\" };\n const actualCallback = callback as PresenceCallback;\n\n if (!this.presenceCallbacks.has(config.event)) {\n this.presenceCallbacks.set(config.event, new Set());\n }\n this.presenceCallbacks.get(config.event)!.add(actualCallback);\n } else {\n // on('INSERT'|'UPDATE'|'DELETE'|'*', callback)\n const actualEvent = event as \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\";\n const actualCallback = configOrCallback as RealtimeCallback;\n\n if (!this.callbacks.has(actualEvent)) {\n this.callbacks.set(actualEvent, new Set());\n }\n this.callbacks.get(actualEvent)!.add(actualCallback);\n }\n\n return this;\n }\n\n /**\n * Remove a callback\n */\n off(\n event: \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\",\n callback: RealtimeCallback,\n ): this {\n const callbacks = this.callbacks.get(event);\n if (callbacks) {\n callbacks.delete(callback);\n }\n return this;\n }\n\n /**\n * Subscribe to the channel\n * @param callback - Optional status callback (Supabase-compatible)\n * @param _timeout - Optional timeout in milliseconds (currently unused)\n */\n subscribe(\n callback?: (\n status: \"SUBSCRIBED\" | \"CHANNEL_ERROR\" | \"TIMED_OUT\" | \"CLOSED\",\n err?: Error,\n ) => void,\n _timeout?: number,\n ): this {\n // Re-enable reconnection in case this is a re-subscribe after unsubscribe\n this.shouldReconnect = true;\n this.connect();\n\n // Call callback with SUBSCRIBED status after connection\n if (callback) {\n // Wait for connection to open\n const checkConnection = () => {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n callback(\"SUBSCRIBED\");\n } else if (this.ws && this.ws.readyState === WebSocket.CLOSED) {\n callback(\"CHANNEL_ERROR\", new Error(\"Failed to connect\"));\n } else {\n setTimeout(checkConnection, 100);\n }\n };\n setTimeout(checkConnection, 100);\n }\n\n return this;\n }\n\n /**\n * Unsubscribe from the channel\n * @param timeout - Optional timeout in milliseconds\n * @returns Promise resolving to status string (Supabase-compatible)\n */\n async unsubscribe(timeout?: number): Promise<\"ok\" | \"timed out\" | \"error\"> {\n // Prevent automatic reconnection after intentional unsubscribe\n this.shouldReconnect = false;\n\n return new Promise((resolve) => {\n if (this.ws) {\n this.sendMessage({\n type: \"unsubscribe\",\n channel: this.channelName,\n subscription_id: this.subscriptionId || undefined,\n });\n\n // Wait for disconnect\n const startTime = Date.now();\n const maxWait = timeout || 5000;\n\n const checkDisconnect = () => {\n if (!this.ws || this.ws.readyState === WebSocket.CLOSED) {\n this.disconnect();\n resolve(\"ok\");\n } else if (Date.now() - startTime > maxWait) {\n this.disconnect();\n resolve(\"timed out\");\n } else {\n setTimeout(checkDisconnect, 100);\n }\n };\n\n setTimeout(checkDisconnect, 100);\n } else {\n resolve(\"ok\");\n }\n });\n }\n\n /**\n * Send a broadcast message to all subscribers on this channel\n *\n * @param message - Broadcast message with type, event, and payload\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * await channel.send({\n * type: 'broadcast',\n * event: 'cursor-pos',\n * payload: { x: 100, y: 200 }\n * })\n * ```\n */\n async send(message: BroadcastMessage): Promise<\"ok\" | \"error\"> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return \"error\";\n }\n\n try {\n // Generate message ID if acknowledgment is requested\n const messageId = this.config.broadcast?.ack\n ? `msg_${Date.now()}_${++this.messageIdCounter}`\n : undefined;\n\n this.ws.send(\n JSON.stringify({\n type: \"broadcast\",\n channel: this.channelName,\n event: message.event,\n payload: message.payload,\n ...(messageId && { messageId }),\n })\n );\n\n // Handle acknowledgment if configured\n if (this.config.broadcast?.ack && messageId) {\n // Wait for ack response with timeout (default 5 seconds)\n const ackTimeout = this.config.broadcast.ackTimeout || 5000;\n return await new Promise<\"ok\" | \"error\">((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingAcks.delete(messageId);\n reject(new Error(\"Acknowledgment timeout\"));\n }, ackTimeout);\n\n this.pendingAcks.set(messageId, {\n resolve: (value) => {\n clearTimeout(timeout);\n this.pendingAcks.delete(messageId);\n resolve(value as \"ok\" | \"error\");\n },\n reject: (reason) => {\n clearTimeout(timeout);\n this.pendingAcks.delete(messageId);\n reject(reason);\n },\n timeout,\n });\n }).catch((error) => {\n console.error(\"[Fluxbase Realtime] Acknowledgment error:\", error);\n return \"error\" as const;\n });\n }\n\n return \"ok\";\n } catch (error) {\n console.error(\"[Fluxbase Realtime] Failed to send broadcast:\", error);\n return \"error\";\n }\n }\n\n /**\n * Track user presence on this channel\n *\n * @param state - Presence state to track\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * await channel.track({\n * user_id: 123,\n * status: 'online'\n * })\n * ```\n */\n async track(state: PresenceState): Promise<\"ok\" | \"error\"> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return \"error\";\n }\n\n try {\n // Generate presence key if not set\n if (!this.myPresenceKey) {\n this.myPresenceKey =\n this.config.presence?.key || `presence-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n this.ws.send(\n JSON.stringify({\n type: \"presence\",\n channel: this.channelName,\n event: \"track\",\n payload: {\n key: this.myPresenceKey,\n state,\n },\n })\n );\n\n return \"ok\";\n } catch (error) {\n console.error(\"[Fluxbase Realtime] Failed to track presence:\", error);\n return \"error\";\n }\n }\n\n /**\n * Stop tracking presence on this channel\n *\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * await channel.untrack()\n * ```\n */\n async untrack(): Promise<\"ok\" | \"error\"> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return \"error\";\n }\n\n if (!this.myPresenceKey) {\n return \"ok\"; // Already not tracking\n }\n\n try {\n this.ws.send(\n JSON.stringify({\n type: \"presence\",\n channel: this.channelName,\n event: \"untrack\",\n payload: {\n key: this.myPresenceKey,\n },\n })\n );\n\n this.myPresenceKey = null;\n return \"ok\";\n } catch (error) {\n console.error(\"[Fluxbase Realtime] Failed to untrack presence:\", error);\n return \"error\";\n }\n }\n\n /**\n * Get current presence state for all users on this channel\n *\n * @returns Current presence state\n *\n * @example\n * ```typescript\n * const state = channel.presenceState()\n * console.log('Online users:', Object.keys(state).length)\n * ```\n */\n presenceState(): Record<string, PresenceState[]> {\n return { ...this._presenceState };\n }\n\n /**\n * Check if the current token is expired or about to expire\n */\n private isTokenExpired(): boolean {\n if (!this.token) return false;\n\n try {\n // Decode JWT payload (base64url encoded, second part)\n const parts = this.token.split(\".\");\n if (parts.length !== 3 || !parts[1]) return false;\n\n const payload = JSON.parse(atob(parts[1].replace(/-/g, \"+\").replace(/_/g, \"/\")));\n if (!payload.exp) return false;\n\n // Check if expired or will expire in the next 10 seconds\n const now = Math.floor(Date.now() / 1000);\n return payload.exp <= now + 10;\n } catch {\n // If we can't decode the token, assume it might be expired\n return true;\n }\n }\n\n /**\n * Internal: Connect to WebSocket\n */\n private connect() {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n return;\n }\n\n // Check if token is expired and we have a refresh callback\n if (this.isTokenExpired() && this.onTokenRefreshNeeded && !this.isRefreshingToken) {\n this.isRefreshingToken = true;\n console.log(\"[Fluxbase Realtime] Token expired, requesting refresh before connecting\");\n\n this.onTokenRefreshNeeded()\n .then((newToken) => {\n this.isRefreshingToken = false;\n if (newToken) {\n this.token = newToken;\n console.log(\"[Fluxbase Realtime] Token refreshed, connecting with new token\");\n }\n this.connectWithToken();\n })\n .catch((err) => {\n this.isRefreshingToken = false;\n console.error(\"[Fluxbase Realtime] Token refresh failed:\", err);\n // Try connecting anyway - might work if refresh failed for other reasons\n this.connectWithToken();\n });\n return;\n }\n\n this.connectWithToken();\n }\n\n /**\n * Internal: Actually establish the WebSocket connection\n */\n private connectWithToken() {\n // Build WebSocket URL\n const wsUrl = new URL(this.url);\n wsUrl.protocol = wsUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n wsUrl.pathname = \"/realtime\";\n\n if (this.token) {\n wsUrl.searchParams.set(\"token\", this.token);\n }\n\n this.ws = new WebSocket(wsUrl.toString());\n\n this.ws.onopen = () => {\n console.log(\"[Fluxbase Realtime] Connected\");\n this.reconnectAttempts = 0;\n\n // Subscribe to channel with optional config\n const subscribeMessage: RealtimeMessage = {\n type: \"subscribe\",\n channel: this.channelName,\n };\n\n // Add subscription config if using new postgres_changes API\n if (this.subscriptionConfig) {\n subscribeMessage.config = this.subscriptionConfig;\n }\n\n this.sendMessage(subscribeMessage);\n\n // Start heartbeat\n this.startHeartbeat();\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n let message: RealtimeMessage;\n try {\n message = typeof event.data === 'string'\n ? JSON.parse(event.data)\n : event.data;\n } catch (err) {\n console.error(\"[Fluxbase Realtime] Failed to parse message:\", err);\n return;\n }\n\n try {\n this.handleMessage(message);\n } catch (err) {\n console.error(\"[Fluxbase Realtime] Error handling message:\", err, message);\n }\n };\n\n this.ws.onerror = (error) => {\n console.error(\"[Fluxbase Realtime] WebSocket error:\", error);\n };\n\n this.ws.onclose = () => {\n console.log(\"[Fluxbase Realtime] Disconnected\");\n this.stopHeartbeat();\n this.attemptReconnect();\n };\n }\n\n /**\n * Internal: Disconnect WebSocket\n */\n private disconnect() {\n this.stopHeartbeat();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n /**\n * Internal: Send a message\n */\n private sendMessage(message: RealtimeMessage) {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(message));\n }\n }\n\n /**\n * Internal: Handle incoming message\n */\n private handleMessage(message: RealtimeMessage) {\n switch (message.type) {\n case \"heartbeat\":\n // Server heartbeat received - no echo needed\n // Client sends its own heartbeats on interval\n break;\n\n case \"broadcast\":\n if (message.broadcast) {\n this.handleBroadcastMessage(message.broadcast);\n } else if (message.payload) {\n // Legacy postgres_changes format\n this.handlePostgresChanges(message.payload);\n }\n break;\n\n case \"presence\":\n if (message.presence) {\n this.handlePresenceMessage(message.presence);\n }\n break;\n\n case \"ack\":\n // Handle broadcast acknowledgment\n if (message.messageId && this.pendingAcks.has(message.messageId)) {\n const ackHandler = this.pendingAcks.get(message.messageId);\n if (ackHandler) {\n ackHandler.resolve(message.status || \"ok\");\n }\n } else if (message.payload && typeof message.payload === 'object' && 'type' in message.payload) {\n const payload = message.payload as { type: string; updated?: boolean; subscription_id?: string };\n\n // Handle access_token acknowledgment\n if (payload.type === \"access_token\" && this.pendingAcks.has(\"access_token\")) {\n const ackHandler = this.pendingAcks.get(\"access_token\");\n if (ackHandler) {\n ackHandler.resolve(\"ok\");\n this.pendingAcks.delete(\"access_token\");\n }\n console.log(\"[Fluxbase Realtime] Token updated successfully\");\n } else {\n // Store subscription_id from subscription acknowledgment\n if (payload.subscription_id) {\n this.subscriptionId = payload.subscription_id;\n console.log(\"[Fluxbase Realtime] Subscription ID received:\", this.subscriptionId);\n } else {\n // Log other acknowledgments\n console.log(\"[Fluxbase Realtime] Acknowledged:\", message);\n }\n }\n } else {\n // Store subscription_id from subscription acknowledgment (legacy format)\n if (message.payload && typeof message.payload === 'object' && 'subscription_id' in message.payload) {\n this.subscriptionId = (message.payload as { subscription_id: string }).subscription_id;\n console.log(\"[Fluxbase Realtime] Subscription ID received:\", this.subscriptionId);\n } else {\n // Log other acknowledgments\n console.log(\"[Fluxbase Realtime] Acknowledged:\", message);\n }\n }\n break;\n\n case \"error\":\n console.error(\"[Fluxbase Realtime] Error:\", message.error);\n // If there's a pending access_token update, reject it and trigger reconnect\n if (this.pendingAcks.has(\"access_token\")) {\n const ackHandler = this.pendingAcks.get(\"access_token\");\n if (ackHandler) {\n ackHandler.reject(new Error(message.error || \"Token update failed\"));\n this.pendingAcks.delete(\"access_token\");\n }\n }\n break;\n\n case \"postgres_changes\":\n // Handle postgres_changes events\n if (message.payload) {\n this.handlePostgresChanges(message.payload);\n }\n break;\n }\n }\n\n /**\n * Internal: Handle broadcast message\n */\n private handleBroadcastMessage(message: any) {\n const event = message.event;\n const payload: RealtimeBroadcastPayload = {\n event,\n payload: message.payload,\n };\n\n // Filter self-messages if configured\n if (!this.config.broadcast?.self && message.self) {\n return;\n }\n\n // Call event-specific callbacks\n const callbacks = this.broadcastCallbacks.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => callback(payload));\n }\n\n // Call wildcard callbacks\n const wildcardCallbacks = this.broadcastCallbacks.get(\"*\");\n if (wildcardCallbacks) {\n wildcardCallbacks.forEach((callback) => callback(payload));\n }\n }\n\n /**\n * Internal: Handle presence message\n */\n private handlePresenceMessage(message: any) {\n const event = message.event as \"sync\" | \"join\" | \"leave\";\n const payload: RealtimePresencePayload = {\n event,\n key: message.key,\n newPresences: message.newPresences,\n leftPresences: message.leftPresences,\n currentPresences: message.currentPresences || this._presenceState,\n };\n\n // Update local presence state\n if (message.currentPresences) {\n this._presenceState = message.currentPresences;\n }\n\n // Call event-specific callbacks\n const callbacks = this.presenceCallbacks.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => callback(payload));\n }\n }\n\n /**\n * Internal: Handle postgres_changes message\n */\n private handlePostgresChanges(payload: any) {\n // Convert to Supabase-compatible format\n const supabasePayload: RealtimePostgresChangesPayload = {\n eventType: payload.type || payload.eventType,\n schema: payload.schema,\n table: payload.table,\n commit_timestamp:\n payload.timestamp ||\n payload.commit_timestamp ||\n new Date().toISOString(),\n new: payload.new_record || payload.new || payload.record || {},\n old: payload.old_record || payload.old || {},\n errors: payload.errors || null,\n };\n\n // Call event-specific callbacks\n const callbacks = this.callbacks.get(supabasePayload.eventType);\n if (callbacks) {\n callbacks.forEach((callback) => callback(supabasePayload));\n }\n\n // Call wildcard callbacks\n const wildcardCallbacks = this.callbacks.get(\"*\");\n if (wildcardCallbacks) {\n wildcardCallbacks.forEach((callback) => callback(supabasePayload));\n }\n }\n\n /**\n * Internal: Start heartbeat interval\n */\n private startHeartbeat() {\n // Clear any existing interval to prevent accumulation during reconnects\n this.stopHeartbeat();\n this.heartbeatInterval = setInterval(() => {\n this.sendMessage({ type: \"heartbeat\" });\n }, 30000); // 30 seconds\n }\n\n /**\n * Internal: Stop heartbeat interval\n */\n private stopHeartbeat() {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n /**\n * Update the authentication token on an existing connection\n * Sends an access_token message to the server to update auth context\n * On failure, silently triggers a reconnect\n *\n * @param token - The new JWT access token\n * @internal\n */\n updateToken(token: string | null) {\n this.token = token;\n\n // Only send update if connected\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n\n if (!token) {\n // If token is null, we need to reconnect (can't send null token message)\n this.disconnect();\n this.connect();\n return;\n }\n\n // Send access_token message\n const message: RealtimeMessage = {\n type: \"access_token\",\n token: token,\n };\n\n try {\n this.ws.send(JSON.stringify(message));\n\n // Set up a timeout for the acknowledgment\n const timeout = setTimeout(() => {\n console.warn(\n \"[Fluxbase Realtime] Token update acknowledgment timeout, reconnecting\"\n );\n this.disconnect();\n this.connect();\n }, 5000); // 5 second timeout\n\n // Store the timeout so we can clear it when we receive the ack\n // We'll handle this in handleMessage for 'ack' type with access_token\n this.pendingAcks.set(\"access_token\", {\n resolve: () => {\n clearTimeout(timeout);\n },\n reject: () => {\n clearTimeout(timeout);\n this.disconnect();\n this.connect();\n },\n timeout,\n });\n } catch (error) {\n console.error(\"[Fluxbase Realtime] Failed to send token update:\", error);\n // Silent fallback: reconnect\n this.disconnect();\n this.connect();\n }\n }\n\n /**\n * Internal: Attempt to reconnect\n */\n private attemptReconnect() {\n // Don't reconnect if intentionally disconnected\n if (!this.shouldReconnect) {\n return;\n }\n\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.error(\"[Fluxbase Realtime] Max reconnect attempts reached\");\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n\n console.log(\n `[Fluxbase Realtime] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`,\n );\n\n setTimeout(() => {\n this.connect();\n }, delay);\n }\n}\n\nexport class FluxbaseRealtime {\n private url: string;\n private token: string | null;\n private channels: Map<string, RealtimeChannel> = new Map();\n private tokenRefreshCallback: (() => Promise<string | null>) | null = null;\n\n constructor(url: string, token: string | null = null) {\n this.url = url;\n this.token = token;\n }\n\n /**\n * Set callback to request a token refresh when connections fail due to auth\n * This callback should refresh the auth token and return the new access token\n * @internal\n */\n setTokenRefreshCallback(callback: () => Promise<string | null>) {\n this.tokenRefreshCallback = callback;\n // Set callback on all existing channels\n this.channels.forEach((channel) => {\n channel.setTokenRefreshCallback(callback);\n });\n }\n\n /**\n * Create or get a channel with optional configuration\n *\n * @param channelName - Channel name (e.g., 'table:public.products')\n * @param config - Optional channel configuration\n * @returns RealtimeChannel instance\n *\n * @example\n * ```typescript\n * const channel = realtime.channel('room-1', {\n * broadcast: { self: true, ack: true },\n * presence: { key: 'user-123' }\n * })\n * ```\n */\n channel(\n channelName: string,\n config?: RealtimeChannelConfig\n ): RealtimeChannel {\n // Create a unique key based on name and config\n const configKey = config ? JSON.stringify(config) : \"\";\n const key = `${channelName}:${configKey}`;\n\n if (this.channels.has(key)) {\n return this.channels.get(key)!;\n }\n\n const channel = new RealtimeChannel(\n this.url,\n channelName,\n this.token,\n config\n );\n // Set token refresh callback if available\n if (this.tokenRefreshCallback) {\n channel.setTokenRefreshCallback(this.tokenRefreshCallback);\n }\n this.channels.set(key, channel);\n return channel;\n }\n\n /**\n * Remove a specific channel\n *\n * @param channel - The channel to remove\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * const channel = realtime.channel('room-1')\n * await realtime.removeChannel(channel)\n * ```\n */\n async removeChannel(\n channel: RealtimeChannel\n ): Promise<\"ok\" | \"error\"> {\n // Unsubscribe the channel\n await channel.unsubscribe();\n\n // Remove from channels map\n for (const [key, ch] of this.channels.entries()) {\n if (ch === channel) {\n this.channels.delete(key);\n return \"ok\";\n }\n }\n\n return \"error\";\n }\n\n /**\n * Remove all channels\n */\n removeAllChannels() {\n this.channels.forEach((channel) => channel.unsubscribe());\n this.channels.clear();\n }\n\n /**\n * Update auth token for all channels\n * Updates both the stored token for new channels and propagates\n * the token to all existing connected channels.\n *\n * @param token - The new auth token\n */\n setAuth(token: string | null) {\n this.token = token;\n // Update all existing connected channels\n this.channels.forEach((channel) => {\n channel.updateToken(token);\n });\n }\n}\n","/**\n * Storage client for file operations\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n FileObject,\n UploadOptions,\n UploadProgress,\n ListOptions,\n SignedUrlOptions,\n DownloadOptions,\n StreamDownloadData,\n ResumableDownloadOptions,\n ResumableDownloadData,\n ShareFileOptions,\n FileShare,\n BucketSettings,\n Bucket,\n} from \"./types\";\n\nexport class StorageBucket {\n private fetch: FluxbaseFetch;\n private bucketName: string;\n\n constructor(fetch: FluxbaseFetch, bucketName: string) {\n this.fetch = fetch;\n this.bucketName = bucketName;\n }\n\n /**\n * Upload a file to the bucket\n * @param path - The path/key for the file\n * @param file - The file to upload (File, Blob, or ArrayBuffer)\n * @param options - Upload options\n */\n async upload(\n path: string,\n file: File | Blob | ArrayBuffer,\n options?: UploadOptions,\n ): Promise<{ data: { id: string; path: string; fullPath: string } | null; error: Error | null }> {\n try {\n // Prepare FormData (common to both code paths)\n const formData = new FormData();\n\n // Convert to Blob if ArrayBuffer\n const blob = file instanceof ArrayBuffer ? new Blob([file]) : file;\n\n formData.append(\"file\", blob);\n\n if (options?.contentType) {\n formData.append(\"content_type\", options.contentType);\n }\n\n if (options?.metadata) {\n formData.append(\"metadata\", JSON.stringify(options.metadata));\n }\n\n if (options?.cacheControl) {\n formData.append(\"cache_control\", options.cacheControl);\n }\n\n if (options?.upsert !== undefined) {\n formData.append(\"upsert\", String(options.upsert));\n }\n\n let response: any;\n\n // Use XMLHttpRequest for progress tracking if callback is provided\n if (options?.onUploadProgress) {\n response = await this.uploadWithProgress(path, formData, options.onUploadProgress);\n } else {\n // Use standard fetch for uploads without progress tracking\n response = await this.fetch.request<any>(\n `/api/v1/storage/${this.bucketName}/${path}`,\n {\n method: \"POST\",\n body: formData,\n headers: {}, // Let browser set Content-Type for FormData\n },\n );\n }\n\n // Return Supabase-compatible response format\n return {\n data: {\n id: response.id || response.key || path,\n path: path,\n fullPath: `${this.bucketName}/${path}`\n },\n error: null\n };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Upload with progress tracking using XMLHttpRequest\n * @private\n */\n private uploadWithProgress(\n path: string,\n formData: FormData,\n onProgress: (progress: UploadProgress) => void,\n ): Promise<any> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n const url = `${this.fetch[\"baseUrl\"]}/api/v1/storage/${this.bucketName}/${path}`;\n\n // Track upload progress\n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable) {\n const percentage = Math.round((event.loaded / event.total) * 100);\n onProgress({\n loaded: event.loaded,\n total: event.total,\n percentage,\n });\n }\n });\n\n // Handle completion\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const response = JSON.parse(xhr.responseText);\n resolve(response);\n } catch (e) {\n resolve(xhr.responseText);\n }\n } else {\n try {\n const errorData = JSON.parse(xhr.responseText);\n reject(new Error(errorData.error || xhr.statusText));\n } catch (e) {\n reject(new Error(xhr.statusText));\n }\n }\n });\n\n // Handle errors\n xhr.addEventListener('error', () => {\n reject(new Error('Upload failed'));\n });\n\n xhr.addEventListener('abort', () => {\n reject(new Error('Upload aborted'));\n });\n\n // Open and send request\n xhr.open('POST', url);\n\n // Set authorization header if present\n const headers = this.fetch[\"defaultHeaders\"];\n for (const [key, value] of Object.entries(headers)) {\n // Don't set Content-Type header - let browser handle it for FormData\n if (key.toLowerCase() !== 'content-type') {\n xhr.setRequestHeader(key, value);\n }\n }\n\n xhr.send(formData);\n });\n }\n\n /**\n * Download a file from the bucket\n * @param path - The path/key of the file\n * @param options - Download options (use { stream: true } for streaming)\n *\n * @example\n * ```typescript\n * // Default: returns Blob\n * const { data: blob } = await storage.from('bucket').download('file.pdf');\n *\n * // Streaming: returns { stream, size } for progress tracking\n * const { data } = await storage.from('bucket').download('large.json', { stream: true });\n * console.log(`File size: ${data.size} bytes`);\n * // Process data.stream...\n * ```\n */\n async download(\n path: string,\n ): Promise<{ data: Blob | null; error: Error | null }>;\n async download(\n path: string,\n options: { stream: true; timeout?: number; signal?: AbortSignal },\n ): Promise<{ data: StreamDownloadData | null; error: Error | null }>;\n async download(\n path: string,\n options: { stream?: false; timeout?: number; signal?: AbortSignal },\n ): Promise<{ data: Blob | null; error: Error | null }>;\n async download(\n path: string,\n options?: DownloadOptions,\n ): Promise<{\n data: Blob | StreamDownloadData | null;\n error: Error | null;\n }> {\n try {\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n // Forward external signal to our controller\n if (options?.signal) {\n if (options.signal.aborted) {\n return { data: null, error: new Error(\"Download aborted\") };\n }\n options.signal.addEventListener(\"abort\", () => controller.abort(), {\n once: true,\n });\n }\n\n // For streaming: no timeout by default (large files need time)\n // For non-streaming: 30s default\n const timeout = options?.timeout ?? (options?.stream ? 0 : 30000);\n\n if (timeout > 0) {\n timeoutId = setTimeout(() => controller.abort(), timeout);\n }\n\n try {\n const response = await fetch(\n `${this.fetch[\"baseUrl\"]}/api/v1/storage/${this.bucketName}/${path}`,\n {\n headers: this.fetch[\"defaultHeaders\"],\n signal: controller.signal,\n },\n );\n\n if (timeoutId) clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`Failed to download file: ${response.statusText}`);\n }\n\n // Return stream with size if requested\n if (options?.stream) {\n if (!response.body) {\n throw new Error(\"Response body is not available for streaming\");\n }\n // Extract file size from Content-Length header\n const contentLength = response.headers.get(\"content-length\");\n const size = contentLength ? parseInt(contentLength, 10) : null;\n return {\n data: { stream: response.body, size },\n error: null,\n };\n }\n\n // Default: return Blob\n const blob = await response.blob();\n return { data: blob, error: null };\n } catch (err) {\n if (timeoutId) clearTimeout(timeoutId);\n\n if (err instanceof Error && err.name === \"AbortError\") {\n // Check if it was user abort or timeout\n if (options?.signal?.aborted) {\n return { data: null, error: new Error(\"Download aborted\") };\n }\n return { data: null, error: new Error(\"Download timeout\") };\n }\n throw err;\n }\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Download a file with resumable chunked downloads for large files.\n * Returns a ReadableStream that abstracts the chunking internally.\n *\n * Features:\n * - Downloads file in chunks using HTTP Range headers\n * - Automatically retries failed chunks with exponential backoff\n * - Reports progress via callback\n * - Falls back to regular streaming if Range not supported\n *\n * @param path - The file path within the bucket\n * @param options - Download options including chunk size, retries, and progress callback\n * @returns A ReadableStream and file size (consumer doesn't need to know about chunking)\n *\n * @example\n * ```typescript\n * const { data, error } = await storage.from('bucket').downloadResumable('large.json', {\n * chunkSize: 5 * 1024 * 1024, // 5MB chunks\n * maxRetries: 3,\n * onProgress: (progress) => console.log(`${progress.percentage}% complete`)\n * });\n * if (data) {\n * console.log(`File size: ${data.size} bytes`);\n * // Process data.stream...\n * }\n * ```\n */\n async downloadResumable(\n path: string,\n options?: ResumableDownloadOptions,\n ): Promise<{ data: ResumableDownloadData | null; error: Error | null }> {\n try {\n const chunkSize = options?.chunkSize ?? 5 * 1024 * 1024; // 5MB default\n const maxRetries = options?.maxRetries ?? 3;\n const retryDelayMs = options?.retryDelayMs ?? 1000;\n const chunkTimeout = options?.chunkTimeout ?? 30000;\n\n const url = `${this.fetch[\"baseUrl\"]}/api/v1/storage/${this.bucketName}/${path}`;\n const headers = this.fetch[\"defaultHeaders\"];\n\n // Check if already aborted\n if (options?.signal?.aborted) {\n return { data: null, error: new Error(\"Download aborted\") };\n }\n\n // Get file info with HEAD request to determine size and Range support\n const headResponse = await fetch(url, {\n method: \"HEAD\",\n headers,\n signal: options?.signal,\n });\n\n if (!headResponse.ok) {\n throw new Error(`Failed to get file info: ${headResponse.statusText}`);\n }\n\n const contentLength = headResponse.headers.get(\"content-length\");\n const acceptRanges = headResponse.headers.get(\"accept-ranges\");\n const totalSize = contentLength ? parseInt(contentLength, 10) : null;\n\n // If server doesn't support Range requests, fall back to regular streaming\n if (acceptRanges !== \"bytes\") {\n const { data, error } = await this.download(path, {\n stream: true,\n timeout: 0,\n signal: options?.signal,\n });\n if (error) return { data: null, error };\n return {\n data: data as ResumableDownloadData,\n error: null,\n };\n }\n\n // Create a ReadableStream that fetches chunks internally\n let downloadedBytes = 0;\n let currentChunk = 0;\n const totalChunks = totalSize ? Math.ceil(totalSize / chunkSize) : null;\n let lastProgressTime = Date.now();\n let lastProgressBytes = 0;\n\n const stream = new ReadableStream<Uint8Array>({\n async pull(controller) {\n // Check if aborted\n if (options?.signal?.aborted) {\n controller.error(new Error(\"Download aborted\"));\n return;\n }\n\n // Check if we've downloaded everything\n if (totalSize !== null && downloadedBytes >= totalSize) {\n controller.close();\n return;\n }\n\n const rangeStart = downloadedBytes;\n const rangeEnd =\n totalSize !== null\n ? Math.min(downloadedBytes + chunkSize - 1, totalSize - 1)\n : downloadedBytes + chunkSize - 1;\n\n let retryCount = 0;\n let chunk: Uint8Array | null = null;\n\n while (retryCount <= maxRetries && chunk === null) {\n try {\n // Check abort before each attempt\n if (options?.signal?.aborted) {\n controller.error(new Error(\"Download aborted\"));\n return;\n }\n\n const chunkController = new AbortController();\n const timeoutId = setTimeout(\n () => chunkController.abort(),\n chunkTimeout,\n );\n\n // Forward external signal to chunk controller\n if (options?.signal) {\n options.signal.addEventListener(\n \"abort\",\n () => chunkController.abort(),\n { once: true },\n );\n }\n\n const chunkResponse = await fetch(url, {\n headers: {\n ...headers,\n Range: `bytes=${rangeStart}-${rangeEnd}`,\n },\n signal: chunkController.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!chunkResponse.ok && chunkResponse.status !== 206) {\n throw new Error(\n `Chunk download failed: ${chunkResponse.statusText}`,\n );\n }\n\n const arrayBuffer = await chunkResponse.arrayBuffer();\n chunk = new Uint8Array(arrayBuffer);\n\n // Check if we got less data than expected (end of file)\n if (totalSize === null && chunk.byteLength < chunkSize) {\n downloadedBytes += chunk.byteLength;\n currentChunk++;\n controller.enqueue(chunk);\n controller.close();\n return;\n }\n } catch (err) {\n // Check if it was user abort\n if (options?.signal?.aborted) {\n controller.error(new Error(\"Download aborted\"));\n return;\n }\n\n retryCount++;\n if (retryCount > maxRetries) {\n controller.error(\n new Error(\n `Failed to download chunk after ${maxRetries} retries`,\n ),\n );\n return;\n }\n\n // Exponential backoff: 1s, 2s, 4s...\n const delay = retryDelayMs * Math.pow(2, retryCount - 1);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n if (chunk) {\n downloadedBytes += chunk.byteLength;\n currentChunk++;\n\n // Report progress\n if (options?.onProgress) {\n const now = Date.now();\n const elapsed = (now - lastProgressTime) / 1000;\n const bytesPerSecond =\n elapsed > 0\n ? (downloadedBytes - lastProgressBytes) / elapsed\n : 0;\n\n lastProgressTime = now;\n lastProgressBytes = downloadedBytes;\n\n options.onProgress({\n loaded: downloadedBytes,\n total: totalSize,\n percentage: totalSize\n ? Math.round((downloadedBytes / totalSize) * 100)\n : null,\n currentChunk,\n totalChunks,\n bytesPerSecond,\n });\n }\n\n controller.enqueue(chunk);\n\n // Check if we're done\n if (totalSize !== null && downloadedBytes >= totalSize) {\n controller.close();\n }\n }\n },\n });\n\n return {\n data: { stream, size: totalSize },\n error: null,\n };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List files in the bucket\n * Supports both Supabase-style list(path, options) and Fluxbase-style list(options)\n * @param pathOrOptions - The folder path or list options\n * @param maybeOptions - List options when first param is a path\n */\n async list(\n pathOrOptions?: string | ListOptions,\n maybeOptions?: ListOptions,\n ): Promise<{ data: FileObject[] | null; error: Error | null }> {\n try {\n const params = new URLSearchParams();\n\n // Determine if first arg is path or options\n let prefix: string | undefined;\n let options: ListOptions | undefined;\n\n if (typeof pathOrOptions === 'string') {\n // Supabase-style: list('path/', { limit: 10 })\n prefix = pathOrOptions;\n options = maybeOptions;\n } else {\n // Fluxbase-style: list({ prefix: 'path/', limit: 10 })\n options = pathOrOptions;\n prefix = options?.prefix;\n }\n\n if (prefix) {\n params.set(\"prefix\", prefix);\n }\n\n if (options?.limit) {\n params.set(\"limit\", String(options.limit));\n }\n\n if (options?.offset) {\n params.set(\"offset\", String(options.offset));\n }\n\n const queryString = params.toString();\n const path = `/api/v1/storage/${this.bucketName}${queryString ? `?${queryString}` : \"\"}`;\n\n const response = await this.fetch.get<{ files: any[] }>(path);\n\n // Convert to FileObject format\n const files: FileObject[] = (response.files || []).map((file: any) => ({\n name: file.key || file.name,\n id: file.id,\n bucket_id: file.bucket || this.bucketName,\n created_at: file.last_modified || file.created_at,\n updated_at: file.updated_at,\n last_accessed_at: file.last_accessed_at,\n metadata: file.metadata,\n }));\n\n return { data: files, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Remove files from the bucket\n * @param paths - Array of file paths to remove\n */\n async remove(paths: string[]): Promise<{ data: FileObject[] | null; error: Error | null }> {\n try {\n const removedFiles: FileObject[] = [];\n\n // Delete files one by one (could be optimized with batch endpoint)\n for (const path of paths) {\n await this.fetch.delete(`/api/v1/storage/${this.bucketName}/${path}`);\n // Add to removed files list\n removedFiles.push({\n name: path,\n bucket_id: this.bucketName,\n });\n }\n\n return { data: removedFiles, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get a public URL for a file\n * @param path - The file path\n */\n getPublicUrl(path: string): { data: { publicUrl: string } } {\n const publicUrl = `${this.fetch[\"baseUrl\"]}/api/v1/storage/${this.bucketName}/${path}`;\n return { data: { publicUrl } };\n }\n\n /**\n * Create a signed URL for temporary access to a file\n * @param path - The file path\n * @param options - Signed URL options\n */\n async createSignedUrl(\n path: string,\n options?: SignedUrlOptions,\n ): Promise<{ data: { signedUrl: string } | null; error: Error | null }> {\n try {\n const expiresIn = options?.expiresIn || 3600; // Default 1 hour\n\n const data = await this.fetch.post<{ signed_url: string }>(\n `/api/v1/storage/${this.bucketName}/sign/${path}`,\n { expires_in: expiresIn },\n );\n\n return { data: { signedUrl: data.signed_url }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Move a file to a new location\n * @param fromPath - Current file path\n * @param toPath - New file path\n */\n async move(\n fromPath: string,\n toPath: string,\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n await this.fetch.post(\n `/api/v1/storage/${this.bucketName}/move`,\n {\n from_path: fromPath,\n to_path: toPath,\n },\n );\n\n return {\n data: { message: 'Successfully moved' },\n error: null\n };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Copy a file to a new location\n * @param fromPath - Source file path\n * @param toPath - Destination file path\n */\n async copy(\n fromPath: string,\n toPath: string,\n ): Promise<{ data: { path: string } | null; error: Error | null }> {\n try {\n await this.fetch.post(\n `/api/v1/storage/${this.bucketName}/copy`,\n {\n from_path: fromPath,\n to_path: toPath,\n },\n );\n\n return {\n data: { path: toPath },\n error: null\n };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Share a file with another user (RLS)\n * @param path - The file path\n * @param options - Share options (userId and permission)\n */\n async share(\n path: string,\n options: ShareFileOptions,\n ): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.post(\n `/api/v1/storage/${this.bucketName}/${path}/share`,\n {\n user_id: options.userId,\n permission: options.permission,\n },\n );\n\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Revoke file access from a user (RLS)\n * @param path - The file path\n * @param userId - The user ID to revoke access from\n */\n async revokeShare(\n path: string,\n userId: string,\n ): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.delete(\n `/api/v1/storage/${this.bucketName}/${path}/share/${userId}`,\n );\n\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List users a file is shared with (RLS)\n * @param path - The file path\n */\n async listShares(\n path: string,\n ): Promise<{ data: FileShare[] | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<{ shares: FileShare[] }>(\n `/api/v1/storage/${this.bucketName}/${path}/shares`,\n );\n\n return { data: data.shares || [], error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n}\n\nexport class FluxbaseStorage {\n private fetch: FluxbaseFetch;\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch;\n }\n\n /**\n * Get a reference to a storage bucket\n * @param bucketName - The name of the bucket\n */\n from(bucketName: string): StorageBucket {\n return new StorageBucket(this.fetch, bucketName);\n }\n\n /**\n * List all buckets\n */\n async listBuckets(): Promise<{\n data: Array<{ name: string; created_at: string }> | null;\n error: Error | null;\n }> {\n try {\n const data = await this.fetch.get<{\n buckets: Array<{ name: string; created_at: string }>;\n }>(\"/api/v1/storage/buckets\");\n\n return { data: data.buckets || [], error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Create a new bucket\n * @param bucketName - The name of the bucket to create\n */\n async createBucket(\n bucketName: string,\n ): Promise<{ data: { name: string } | null; error: Error | null }> {\n try {\n await this.fetch.post(`/api/v1/storage/buckets/${bucketName}`);\n return { data: { name: bucketName }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Delete a bucket\n * @param bucketName - The name of the bucket to delete\n */\n async deleteBucket(\n bucketName: string,\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n await this.fetch.delete(`/api/v1/storage/buckets/${bucketName}`);\n return { data: { message: 'Successfully deleted' }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Empty a bucket (delete all files)\n * @param bucketName - The name of the bucket to empty\n */\n async emptyBucket(\n bucketName: string,\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n // List all files and delete them\n const bucket = this.from(bucketName);\n const { data: objects, error: listError } = await bucket.list();\n\n if (listError) {\n return { data: null, error: listError };\n }\n\n if (objects && objects.length > 0) {\n const paths = objects.map((obj) => obj.name);\n const { error: removeError } = await bucket.remove(paths);\n\n if (removeError) {\n return { data: null, error: removeError };\n }\n }\n\n return { data: { message: 'Successfully emptied' }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Update bucket settings (RLS - requires admin or service key)\n * @param bucketName - The name of the bucket\n * @param settings - Bucket settings to update\n */\n async updateBucketSettings(\n bucketName: string,\n settings: BucketSettings,\n ): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.put(`/api/v1/storage/buckets/${bucketName}`, settings);\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get bucket details\n * @param bucketName - The name of the bucket\n */\n async getBucket(\n bucketName: string,\n ): Promise<{ data: Bucket | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<Bucket>(\n `/api/v1/storage/buckets/${bucketName}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n}\n","/**\n * Edge Functions module for Fluxbase SDK\n * Compatible with Supabase Functions API\n *\n * @example\n * ```typescript\n * // Invoke a function\n * const { data, error } = await client.functions.invoke('hello-world', {\n * body: { name: 'Alice' }\n * })\n *\n * // With custom headers\n * const { data, error } = await client.functions.invoke('api-call', {\n * body: { query: 'data' },\n * headers: { 'X-Custom-Header': 'value' },\n * method: 'POST'\n * })\n * ```\n */\n\nimport type { FluxbaseFetch } from './fetch'\nimport type {\n FunctionInvokeOptions,\n EdgeFunction,\n} from './types'\n\n/**\n * Edge Functions client for invoking serverless functions\n * API-compatible with Supabase Functions\n *\n * For admin operations (create, update, delete, sync), use client.admin.functions\n *\n * @category Functions\n */\nexport class FluxbaseFunctions {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Invoke an edge function\n *\n * This method is fully compatible with Supabase's functions.invoke() API.\n *\n * @param functionName - The name of the function to invoke\n * @param options - Invocation options including body, headers, HTTP method, and namespace\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * // Simple invocation (uses first matching function by namespace alphabetically)\n * const { data, error } = await client.functions.invoke('hello', {\n * body: { name: 'World' }\n * })\n *\n * // Invoke a specific namespace's function\n * const { data, error } = await client.functions.invoke('hello', {\n * body: { name: 'World' },\n * namespace: 'my-app'\n * })\n *\n * // With GET method\n * const { data, error } = await client.functions.invoke('get-data', {\n * method: 'GET'\n * })\n *\n * // With custom headers\n * const { data, error } = await client.functions.invoke('api-proxy', {\n * body: { query: 'search' },\n * headers: { 'Authorization': 'Bearer token' },\n * method: 'POST'\n * })\n * ```\n */\n async invoke<T = any>(\n functionName: string,\n options?: FunctionInvokeOptions\n ): Promise<{ data: T | null; error: Error | null }> {\n try {\n const method = options?.method || 'POST'\n const headers = options?.headers || {}\n const body = options?.body\n const namespace = options?.namespace\n\n // Use the Fluxbase backend endpoint\n // If namespace is provided, add it as a query parameter\n const endpoint = namespace\n ? `/api/v1/functions/${functionName}/invoke?namespace=${encodeURIComponent(namespace)}`\n : `/api/v1/functions/${functionName}/invoke`\n\n let response: T\n\n // Route to appropriate HTTP method\n switch (method) {\n case 'GET':\n response = await this.fetch.get<T>(endpoint, { headers })\n break\n case 'DELETE':\n response = await this.fetch.delete<T>(endpoint, { headers })\n break\n case 'PUT':\n response = await this.fetch.put<T>(endpoint, body, { headers })\n break\n case 'PATCH':\n response = await this.fetch.patch<T>(endpoint, body, { headers })\n break\n case 'POST':\n default:\n response = await this.fetch.post<T>(endpoint, body, { headers })\n break\n }\n\n return { data: response, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * List all public edge functions\n *\n * @returns Promise resolving to { data, error } tuple with array of public functions\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.list()\n * if (data) {\n * console.log('Functions:', data.map(f => f.name))\n * }\n * ```\n */\n async list(): Promise<{ data: EdgeFunction[] | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<EdgeFunction[]>('/api/v1/functions')\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Get details of a specific edge function\n *\n * @param name - Function name\n * @returns Promise resolving to { data, error } tuple with function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.get('my-function')\n * if (data) {\n * console.log('Function version:', data.version)\n * }\n * ```\n */\n async get(name: string): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<EdgeFunction>(`/api/v1/functions/${name}`)\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n}\n","/**\n * Jobs module for Fluxbase SDK\n * Client-facing API for submitting and monitoring background jobs\n *\n * @example\n * ```typescript\n * // Submit a job\n * const { data, error } = await client.jobs.submit('process-data', {\n * items: [1, 2, 3]\n * })\n *\n * // Get job status\n * const { data: job, error } = await client.jobs.get(data.id)\n * console.log('Job status:', job.status)\n *\n * // Cancel a running job\n * await client.jobs.cancel(data.id)\n * ```\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type { Job, SubmitJobRequest } from \"./types\";\n\n/**\n * Jobs client for submitting and monitoring background jobs\n *\n * For admin operations (create job functions, manage workers, view all jobs),\n * use client.admin.jobs\n *\n * @category Jobs\n */\nexport class FluxbaseJobs {\n private fetch: FluxbaseFetch;\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch;\n }\n\n /**\n * Submit a new job for execution\n *\n * @param jobName - Name of the job function to execute\n * @param payload - Job input data\n * @param options - Additional options (priority, namespace, scheduled time)\n * @returns Promise resolving to { data, error } tuple with submitted job details\n *\n * @example\n * ```typescript\n * // Submit a simple job\n * const { data, error } = await client.jobs.submit('send-email', {\n * to: 'user@example.com',\n * subject: 'Hello',\n * body: 'Welcome!'\n * })\n *\n * if (data) {\n * console.log('Job submitted:', data.id)\n * console.log('Status:', data.status)\n * }\n *\n * // Submit with priority\n * const { data } = await client.jobs.submit('high-priority-task', payload, {\n * priority: 10\n * })\n *\n * // Schedule for later\n * const { data } = await client.jobs.submit('scheduled-task', payload, {\n * scheduled: '2025-01-01T00:00:00Z'\n * })\n * ```\n */\n async submit(\n jobName: string,\n payload?: any,\n options?: {\n priority?: number;\n namespace?: string;\n scheduled?: string;\n },\n ): Promise<{ data: Job | null; error: Error | null }> {\n try {\n const request: SubmitJobRequest = {\n job_name: jobName,\n payload,\n ...options,\n };\n\n const data = await this.fetch.post<Job>(\"/api/v1/jobs/submit\", request);\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get status and details of a specific job\n *\n * @param jobId - Job ID\n * @returns Promise resolving to { data, error } tuple with job details\n *\n * @example\n * ```typescript\n * const { data: job, error } = await client.jobs.get('550e8400-e29b-41d4-a716-446655440000')\n *\n * if (job) {\n * console.log('Status:', job.status)\n * console.log('Progress:', job.progress_percent + '%')\n * console.log('Result:', job.result)\n * console.log('Logs:', job.logs)\n * }\n * ```\n */\n async get(jobId: string): Promise<{ data: Job | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<Job>(`/api/v1/jobs/${jobId}`);\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List jobs submitted by the current user\n *\n * @param filters - Optional filters (status, namespace, limit, offset)\n * @returns Promise resolving to { data, error } tuple with array of jobs\n *\n * @example\n * ```typescript\n * // List all your jobs\n * const { data: jobs, error } = await client.jobs.list()\n *\n * // Filter by status\n * const { data: running } = await client.jobs.list({\n * status: 'running'\n * })\n *\n * // Paginate\n * const { data: page } = await client.jobs.list({\n * limit: 20,\n * offset: 40\n * })\n * ```\n */\n async list(filters?: {\n status?: string;\n namespace?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ data: Job[] | null; error: Error | null }> {\n try {\n const params = new URLSearchParams();\n if (filters?.status) params.append(\"status\", filters.status);\n if (filters?.namespace) params.append(\"namespace\", filters.namespace);\n if (filters?.limit) params.append(\"limit\", filters.limit.toString());\n if (filters?.offset) params.append(\"offset\", filters.offset.toString());\n\n const queryString = params.toString();\n const data = await this.fetch.get<Job[]>(\n `/api/v1/jobs${queryString ? `?${queryString}` : \"\"}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Cancel a pending or running job\n *\n * @param jobId - Job ID to cancel\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * const { error } = await client.jobs.cancel('550e8400-e29b-41d4-a716-446655440000')\n *\n * if (!error) {\n * console.log('Job cancelled successfully')\n * }\n * ```\n */\n async cancel(jobId: string): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.post(`/api/v1/jobs/${jobId}/cancel`, {});\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Retry a failed job\n *\n * Creates a new job execution with the same parameters\n *\n * @param jobId - Job ID to retry\n * @returns Promise resolving to { data, error } tuple with new job\n *\n * @example\n * ```typescript\n * const { data: newJob, error } = await client.jobs.retry('550e8400-e29b-41d4-a716-446655440000')\n *\n * if (newJob) {\n * console.log('Job retried, new ID:', newJob.id)\n * }\n * ```\n */\n async retry(jobId: string): Promise<{ data: Job | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<Job>(`/api/v1/jobs/${jobId}/retry`, {});\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n}\n","import type { FluxbaseFetch } from \"./fetch\";\nimport type {\n SystemSetting,\n UpdateSystemSettingRequest,\n ListSystemSettingsResponse,\n AppSettings,\n UpdateAppSettingsRequest,\n CustomSetting,\n EmailTemplate,\n EmailTemplateType,\n UpdateEmailTemplateRequest,\n ListEmailTemplatesResponse,\n} from \"./types\";\n\n/**\n * System Settings Manager\n *\n * Manages low-level system settings with key-value storage.\n * For application-level settings, use AppSettingsManager instead.\n *\n * @example\n * ```typescript\n * const settings = client.admin.settings.system\n *\n * // List all system settings\n * const { settings } = await settings.list()\n *\n * // Get specific setting\n * const setting = await settings.get('app.auth.enable_signup')\n *\n * // Update setting\n * await settings.update('app.auth.enable_signup', {\n * value: { value: true },\n * description: 'Enable user signup'\n * })\n *\n * // Delete setting\n * await settings.delete('app.auth.enable_signup')\n * ```\n */\nexport class SystemSettingsManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * List all system settings\n *\n * @returns Promise resolving to ListSystemSettingsResponse\n *\n * @example\n * ```typescript\n * const response = await client.admin.settings.system.list()\n * console.log(response.settings)\n * ```\n */\n async list(): Promise<ListSystemSettingsResponse> {\n const settings = await this.fetch.get<SystemSetting[]>(\n \"/api/v1/admin/system/settings\",\n );\n return { settings: Array.isArray(settings) ? settings : [] };\n }\n\n /**\n * Get a specific system setting by key\n *\n * @param key - Setting key (e.g., 'app.auth.enable_signup')\n * @returns Promise resolving to SystemSetting\n *\n * @example\n * ```typescript\n * const setting = await client.admin.settings.system.get('app.auth.enable_signup')\n * console.log(setting.value)\n * ```\n */\n async get(key: string): Promise<SystemSetting> {\n return await this.fetch.get<SystemSetting>(\n `/api/v1/admin/system/settings/${key}`,\n );\n }\n\n /**\n * Update or create a system setting\n *\n * @param key - Setting key\n * @param request - Update request with value and optional description\n * @returns Promise resolving to SystemSetting\n *\n * @example\n * ```typescript\n * const updated = await client.admin.settings.system.update('app.auth.enable_signup', {\n * value: { value: true },\n * description: 'Enable user signup'\n * })\n * ```\n */\n async update(\n key: string,\n request: UpdateSystemSettingRequest,\n ): Promise<SystemSetting> {\n return await this.fetch.put<SystemSetting>(\n `/api/v1/admin/system/settings/${key}`,\n request,\n );\n }\n\n /**\n * Delete a system setting\n *\n * @param key - Setting key to delete\n * @returns Promise<void>\n *\n * @example\n * ```typescript\n * await client.admin.settings.system.delete('app.auth.enable_signup')\n * ```\n */\n async delete(key: string): Promise<void> {\n await this.fetch.delete(`/api/v1/admin/system/settings/${key}`);\n }\n}\n\n/**\n * Application Settings Manager\n *\n * Manages high-level application settings with a structured API.\n * Provides type-safe access to authentication, features, email, and security settings.\n *\n * @example\n * ```typescript\n * const settings = client.admin.settings.app\n *\n * // Get all app settings\n * const appSettings = await settings.get()\n * console.log(appSettings.authentication.enable_signup)\n *\n * // Update specific settings\n * const updated = await settings.update({\n * authentication: {\n * enable_signup: true,\n * password_min_length: 12\n * }\n * })\n *\n * // Reset to defaults\n * await settings.reset()\n * ```\n */\nexport class AppSettingsManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Get all application settings\n *\n * Returns structured settings for authentication, features, email, and security.\n *\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * const settings = await client.admin.settings.app.get()\n *\n * console.log('Signup enabled:', settings.authentication.enable_signup)\n * console.log('Realtime enabled:', settings.features.enable_realtime)\n * console.log('Email provider:', settings.email.provider)\n * ```\n */\n async get(): Promise<AppSettings> {\n return await this.fetch.get<AppSettings>(\"/api/v1/admin/app/settings\");\n }\n\n /**\n * Update application settings\n *\n * Supports partial updates - only provide the fields you want to change.\n *\n * @param request - Settings to update (partial update supported)\n * @returns Promise resolving to AppSettings - Updated settings\n *\n * @example\n * ```typescript\n * // Update authentication settings\n * const updated = await client.admin.settings.app.update({\n * authentication: {\n * enable_signup: true,\n * password_min_length: 12\n * }\n * })\n *\n * // Update multiple categories\n * await client.admin.settings.app.update({\n * authentication: { enable_signup: false },\n * features: { enable_realtime: true },\n * security: { enable_global_rate_limit: true }\n * })\n * ```\n */\n async update(request: UpdateAppSettingsRequest): Promise<AppSettings> {\n return await this.fetch.put<AppSettings>(\n \"/api/v1/admin/app/settings\",\n request,\n );\n }\n\n /**\n * Reset all application settings to defaults\n *\n * This will delete all custom settings and return to default values.\n *\n * @returns Promise resolving to AppSettings - Default settings\n *\n * @example\n * ```typescript\n * const defaults = await client.admin.settings.app.reset()\n * console.log('Settings reset to defaults:', defaults)\n * ```\n */\n async reset(): Promise<AppSettings> {\n return await this.fetch.post<AppSettings>(\n \"/api/v1/admin/app/settings/reset\",\n {},\n );\n }\n\n /**\n * Enable user signup\n *\n * Convenience method to enable user registration.\n *\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.enableSignup()\n * ```\n */\n async enableSignup(): Promise<AppSettings> {\n return await this.update({\n authentication: { enable_signup: true },\n });\n }\n\n /**\n * Disable user signup\n *\n * Convenience method to disable user registration.\n *\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.disableSignup()\n * ```\n */\n async disableSignup(): Promise<AppSettings> {\n return await this.update({\n authentication: { enable_signup: false },\n });\n }\n\n /**\n * Update password minimum length\n *\n * Convenience method to set password requirements.\n *\n * @param length - Minimum password length (8-128 characters)\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setPasswordMinLength(12)\n * ```\n */\n async setPasswordMinLength(length: number): Promise<AppSettings> {\n if (length < 8 || length > 128) {\n throw new Error(\n \"Password minimum length must be between 8 and 128 characters\",\n );\n }\n\n return await this.update({\n authentication: { password_min_length: length },\n });\n }\n\n /**\n * Enable or disable a feature\n *\n * Convenience method to toggle feature flags.\n *\n * @param feature - Feature name ('realtime' | 'storage' | 'functions')\n * @param enabled - Whether to enable or disable the feature\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * // Enable realtime\n * await client.admin.settings.app.setFeature('realtime', true)\n *\n * // Disable storage\n * await client.admin.settings.app.setFeature('storage', false)\n * ```\n */\n async setFeature(\n feature: \"realtime\" | \"storage\" | \"functions\",\n enabled: boolean,\n ): Promise<AppSettings> {\n const featureKey =\n feature === \"realtime\"\n ? \"enable_realtime\"\n : feature === \"storage\"\n ? \"enable_storage\"\n : \"enable_functions\";\n\n return await this.update({\n features: { [featureKey]: enabled },\n });\n }\n\n /**\n * Enable or disable global rate limiting\n *\n * Convenience method to toggle global rate limiting.\n *\n * @param enabled - Whether to enable rate limiting\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setRateLimiting(true)\n * ```\n */\n async setRateLimiting(enabled: boolean): Promise<AppSettings> {\n return await this.update({\n security: { enable_global_rate_limit: enabled },\n });\n }\n\n /**\n * Configure SMTP email provider\n *\n * Convenience method to set up SMTP email delivery.\n *\n * @param config - SMTP configuration\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureSMTP({\n * host: 'smtp.gmail.com',\n * port: 587,\n * username: 'your-email@gmail.com',\n * password: 'your-app-password',\n * use_tls: true,\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * })\n * ```\n */\n async configureSMTP(config: {\n host: string;\n port: number;\n username: string;\n password: string;\n use_tls: boolean;\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n }): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"smtp\",\n from_address: config.from_address,\n from_name: config.from_name,\n reply_to_address: config.reply_to_address,\n smtp: {\n host: config.host,\n port: config.port,\n username: config.username,\n password: config.password,\n use_tls: config.use_tls,\n },\n },\n });\n }\n\n /**\n * Configure SendGrid email provider\n *\n * Convenience method to set up SendGrid email delivery.\n *\n * @param apiKey - SendGrid API key\n * @param options - Optional from address, name, and reply-to\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureSendGrid('SG.xxx', {\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * })\n * ```\n */\n async configureSendGrid(\n apiKey: string,\n options?: {\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n },\n ): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"sendgrid\",\n from_address: options?.from_address,\n from_name: options?.from_name,\n reply_to_address: options?.reply_to_address,\n sendgrid: {\n api_key: apiKey,\n },\n },\n });\n }\n\n /**\n * Configure Mailgun email provider\n *\n * Convenience method to set up Mailgun email delivery.\n *\n * @param apiKey - Mailgun API key\n * @param domain - Mailgun domain\n * @param options - Optional EU region flag and email addresses\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureMailgun('key-xxx', 'mg.yourapp.com', {\n * eu_region: false,\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * })\n * ```\n */\n async configureMailgun(\n apiKey: string,\n domain: string,\n options?: {\n eu_region?: boolean;\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n },\n ): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"mailgun\",\n from_address: options?.from_address,\n from_name: options?.from_name,\n reply_to_address: options?.reply_to_address,\n mailgun: {\n api_key: apiKey,\n domain: domain,\n eu_region: options?.eu_region ?? false,\n },\n },\n });\n }\n\n /**\n * Configure AWS SES email provider\n *\n * Convenience method to set up AWS SES email delivery.\n *\n * @param accessKeyId - AWS access key ID\n * @param secretAccessKey - AWS secret access key\n * @param region - AWS region (e.g., 'us-east-1')\n * @param options - Optional email addresses\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureSES(\n * 'AKIAIOSFODNN7EXAMPLE',\n * 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',\n * 'us-east-1',\n * {\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * }\n * )\n * ```\n */\n async configureSES(\n accessKeyId: string,\n secretAccessKey: string,\n region: string,\n options?: {\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n },\n ): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"ses\",\n from_address: options?.from_address,\n from_name: options?.from_name,\n reply_to_address: options?.reply_to_address,\n ses: {\n access_key_id: accessKeyId,\n secret_access_key: secretAccessKey,\n region: region,\n },\n },\n });\n }\n\n /**\n * Enable or disable email functionality\n *\n * Convenience method to toggle email system on/off.\n *\n * @param enabled - Whether to enable email\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setEmailEnabled(true)\n * ```\n */\n async setEmailEnabled(enabled: boolean): Promise<AppSettings> {\n return await this.update({\n email: { enabled },\n });\n }\n\n /**\n * Configure password complexity requirements\n *\n * Convenience method to set password validation rules.\n *\n * @param requirements - Password complexity requirements\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setPasswordComplexity({\n * min_length: 12,\n * require_uppercase: true,\n * require_lowercase: true,\n * require_number: true,\n * require_special: true\n * })\n * ```\n */\n async setPasswordComplexity(requirements: {\n min_length?: number;\n require_uppercase?: boolean;\n require_lowercase?: boolean;\n require_number?: boolean;\n require_special?: boolean;\n }): Promise<AppSettings> {\n return await this.update({\n authentication: {\n password_min_length: requirements.min_length,\n password_require_uppercase: requirements.require_uppercase,\n password_require_lowercase: requirements.require_lowercase,\n password_require_number: requirements.require_number,\n password_require_special: requirements.require_special,\n },\n });\n }\n\n /**\n * Configure session settings\n *\n * Convenience method to set session timeout and limits.\n *\n * @param timeoutMinutes - Session timeout in minutes (0 for no timeout)\n * @param maxSessionsPerUser - Maximum concurrent sessions per user (0 for unlimited)\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * // 30 minute sessions, max 3 devices per user\n * await client.admin.settings.app.setSessionSettings(30, 3)\n * ```\n */\n async setSessionSettings(\n timeoutMinutes: number,\n maxSessionsPerUser: number,\n ): Promise<AppSettings> {\n return await this.update({\n authentication: {\n session_timeout_minutes: timeoutMinutes,\n max_sessions_per_user: maxSessionsPerUser,\n },\n });\n }\n\n /**\n * Enable or disable email verification requirement\n *\n * Convenience method to require email verification for new signups.\n *\n * @param required - Whether to require email verification\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setEmailVerificationRequired(true)\n * ```\n */\n async setEmailVerificationRequired(required: boolean): Promise<AppSettings> {\n return await this.update({\n authentication: { require_email_verification: required },\n });\n }\n\n // ===================================================================\n // CUSTOM SETTINGS METHODS\n // Flexible key-value storage for application-specific configuration\n // ===================================================================\n\n /**\n * Get a specific custom setting's value only (without metadata)\n *\n * Convenience method that returns just the value field instead of the full CustomSetting object.\n *\n * @param key - Setting key (e.g., 'billing.tiers', 'features.beta_enabled')\n * @returns Promise resolving to the setting's value\n *\n * @example\n * ```typescript\n * const tiers = await client.admin.settings.app.getSetting('billing.tiers')\n * console.log(tiers) // { free: 1000, pro: 10000, enterprise: 100000 }\n * ```\n */\n async getSetting(key: string): Promise<any> {\n const setting = await this.fetch.get<CustomSetting>(\n `/api/v1/admin/settings/custom/${key}`,\n );\n return setting.value;\n }\n\n /**\n * Get multiple custom settings' values by keys\n *\n * Fetches multiple settings in a single request and returns only their values.\n *\n * @param keys - Array of setting keys to fetch\n * @returns Promise resolving to object mapping keys to values\n *\n * @example\n * ```typescript\n * const values = await client.admin.settings.app.getSettings([\n * 'billing.tiers',\n * 'features.beta_enabled'\n * ])\n * console.log(values)\n * // {\n * // 'billing.tiers': { free: 1000, pro: 10000 },\n * // 'features.beta_enabled': { enabled: true }\n * // }\n * ```\n */\n async getSettings(keys: string[]): Promise<Record<string, any>> {\n const response = await this.fetch.post<CustomSetting[]>(\n \"/api/v1/settings/batch\",\n { keys },\n );\n return response.reduce(\n (acc, setting) => {\n acc[setting.key] = setting.value;\n return acc;\n },\n {} as Record<string, any>,\n );\n }\n\n /**\n * Set or create a custom setting\n *\n * Creates a new custom setting or updates an existing one.\n *\n * @param key - Setting key\n * @param value - Setting value (any JSON-serializable value)\n * @param options - Optional configuration (description, is_public, is_secret, etc.)\n * @returns Promise resolving to CustomSetting\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setSetting('billing.tiers', {\n * free: 1000,\n * pro: 10000,\n * enterprise: 100000\n * }, {\n * description: 'API quotas per billing tier',\n * is_public: false\n * })\n * ```\n */\n async setSetting(\n key: string,\n value: any,\n options?: {\n description?: string;\n is_public?: boolean;\n is_secret?: boolean;\n value_type?: string;\n },\n ): Promise<CustomSetting> {\n // Try to update first, if not found, create\n try {\n return await this.fetch.put<CustomSetting>(\n `/api/v1/admin/settings/custom/${key}`,\n {\n value,\n description: options?.description,\n is_public: options?.is_public,\n is_secret: options?.is_secret,\n },\n );\n } catch (error: any) {\n // If not found (404), create new setting\n if (error.status === 404 || error.message?.includes(\"not found\")) {\n return await this.fetch.post<CustomSetting>(\n \"/api/v1/admin/settings/custom\",\n {\n key,\n value,\n value_type: options?.value_type || \"json\",\n description: options?.description,\n is_public: options?.is_public ?? false,\n is_secret: options?.is_secret ?? false,\n },\n );\n }\n throw error;\n }\n }\n\n /**\n * List all custom settings\n *\n * @returns Promise resolving to array of CustomSetting objects\n *\n * @example\n * ```typescript\n * const settings = await client.admin.settings.app.listSettings()\n * settings.forEach(s => console.log(s.key, s.value))\n * ```\n */\n async listSettings(): Promise<CustomSetting[]> {\n return await this.fetch.get<CustomSetting[]>(\n \"/api/v1/admin/settings/custom\",\n );\n }\n\n /**\n * Delete a custom setting\n *\n * @param key - Setting key to delete\n * @returns Promise<void>\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.deleteSetting('billing.tiers')\n * ```\n */\n async deleteSetting(key: string): Promise<void> {\n await this.fetch.delete(`/api/v1/admin/settings/custom/${key}`);\n }\n}\n\n/**\n * Email Template Manager\n *\n * Manages email templates for authentication and user communication.\n * Supports customizing templates for magic links, email verification, password resets, and user invitations.\n *\n * @example\n * ```typescript\n * const templates = client.admin.emailTemplates\n *\n * // List all templates\n * const { templates: allTemplates } = await templates.list()\n *\n * // Get specific template\n * const magicLink = await templates.get('magic_link')\n *\n * // Update template\n * await templates.update('magic_link', {\n * subject: 'Sign in to ' + '{{.AppName}}',\n * html_body: '<html>Custom template with ' + '{{.MagicLink}}' + '</html>',\n * text_body: 'Click here: ' + '{{.MagicLink}}'\n * })\n *\n * // Test template (sends to specified email)\n * await templates.test('magic_link', 'test@example.com')\n *\n * // Reset to default\n * await templates.reset('magic_link')\n * ```\n */\nexport class EmailTemplateManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * List all email templates\n *\n * @returns Promise resolving to ListEmailTemplatesResponse\n *\n * @example\n * ```typescript\n * const response = await client.admin.emailTemplates.list()\n * console.log(response.templates)\n * ```\n */\n async list(): Promise<ListEmailTemplatesResponse> {\n const templates = await this.fetch.get<EmailTemplate[]>(\n \"/api/v1/admin/email/templates\",\n );\n return { templates: Array.isArray(templates) ? templates : [] };\n }\n\n /**\n * Get a specific email template by type\n *\n * @param type - Template type (magic_link | verify_email | reset_password | invite_user)\n * @returns Promise resolving to EmailTemplate\n *\n * @example\n * ```typescript\n * const template = await client.admin.emailTemplates.get('magic_link')\n * console.log(template.subject)\n * console.log(template.html_body)\n * ```\n */\n async get(type: EmailTemplateType): Promise<EmailTemplate> {\n return await this.fetch.get<EmailTemplate>(\n `/api/v1/admin/email/templates/${type}`,\n );\n }\n\n /**\n * Update an email template\n *\n * Available template variables:\n * - magic_link: `{{.MagicLink}}`, `{{.AppName}}`, `{{.ExpiryMinutes}}`\n * - verify_email: `{{.VerificationLink}}`, `{{.AppName}}`\n * - reset_password: `{{.ResetLink}}`, `{{.AppName}}`, `{{.ExpiryMinutes}}`\n * - invite_user: `{{.InviteLink}}`, `{{.AppName}}`, `{{.InviterName}}`\n *\n * @param type - Template type to update\n * @param request - Update request with subject, html_body, and optional text_body\n * @returns Promise resolving to EmailTemplate\n *\n * @example\n * ```typescript\n * const updated = await client.admin.emailTemplates.update('magic_link', {\n * subject: 'Your Magic Link - Sign in to ' + '{{.AppName}}',\n * html_body: '<html><body><h1>Welcome!</h1><a href=\"' + '{{.MagicLink}}' + '\">Sign In</a></body></html>',\n * text_body: 'Click here to sign in: ' + '{{.MagicLink}}'\n * })\n * ```\n */\n async update(\n type: EmailTemplateType,\n request: UpdateEmailTemplateRequest,\n ): Promise<EmailTemplate> {\n return await this.fetch.put<EmailTemplate>(\n `/api/v1/admin/email/templates/${type}`,\n request,\n );\n }\n\n /**\n * Reset an email template to default\n *\n * Removes any customizations and restores the template to its original state.\n *\n * @param type - Template type to reset\n * @returns Promise resolving to EmailTemplate - The default template\n *\n * @example\n * ```typescript\n * const defaultTemplate = await client.admin.emailTemplates.reset('magic_link')\n * ```\n */\n async reset(type: EmailTemplateType): Promise<EmailTemplate> {\n return await this.fetch.post<EmailTemplate>(\n `/api/v1/admin/email/templates/${type}/reset`,\n {},\n );\n }\n\n /**\n * Send a test email using the template\n *\n * Useful for previewing template changes before deploying to production.\n *\n * @param type - Template type to test\n * @param recipientEmail - Email address to send test to\n * @returns Promise<void>\n *\n * @example\n * ```typescript\n * await client.admin.emailTemplates.test('magic_link', 'test@example.com')\n * ```\n */\n async test(type: EmailTemplateType, recipientEmail: string): Promise<void> {\n await this.fetch.post(`/api/v1/admin/email/templates/${type}/test`, {\n recipient_email: recipientEmail,\n });\n }\n}\n\n/**\n * Settings Manager\n *\n * Provides access to system-level and application-level settings.\n * AppSettingsManager now handles both structured framework settings and custom key-value settings.\n *\n * @example\n * ```typescript\n * const settings = client.admin.settings\n *\n * // Access system settings\n * const systemSettings = await settings.system.list()\n *\n * // Access app settings (structured)\n * const appSettings = await settings.app.get()\n * await settings.app.enableSignup()\n *\n * // Access custom settings (key-value)\n * await settings.app.setSetting('billing.tiers', { free: 1000, pro: 10000 })\n * const tiers = await settings.app.getSetting('billing.tiers')\n * ```\n */\nexport class FluxbaseSettings {\n public system: SystemSettingsManager;\n public app: AppSettingsManager;\n\n constructor(fetch: FluxbaseFetch) {\n this.system = new SystemSettingsManager(fetch);\n this.app = new AppSettingsManager(fetch);\n }\n}\n\n/**\n * Public Settings Client\n *\n * Provides read-only access to public settings for non-admin users.\n * Access is controlled by RLS policies on the app.settings table.\n *\n * @example\n * ```typescript\n * const client = new FluxbaseClient(url, userToken)\n *\n * // Get single public setting\n * const betaEnabled = await client.settings.get('features.beta_enabled')\n * console.log(betaEnabled) // { enabled: true }\n *\n * // Get multiple public settings\n * const values = await client.settings.getMany([\n * 'features.beta_enabled',\n * 'features.dark_mode',\n * 'public.app_version'\n * ])\n * console.log(values)\n * // {\n * // 'features.beta_enabled': { enabled: true },\n * // 'features.dark_mode': { enabled: false },\n * // 'public.app_version': '1.0.0'\n * // }\n * ```\n */\nexport class SettingsClient {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Get a single setting's value\n *\n * Returns only the value field of the setting.\n * Access is controlled by RLS policies - will return 403 if the user\n * doesn't have permission to read the setting.\n *\n * @param key - Setting key (e.g., 'features.beta_enabled')\n * @returns Promise resolving to the setting's value\n * @throws Error if setting doesn't exist or user lacks permission\n *\n * @example\n * ```typescript\n * // Get public setting (any user)\n * const value = await client.settings.get('features.beta_enabled')\n * console.log(value) // { enabled: true }\n *\n * // Get restricted setting (requires permission)\n * try {\n * const secret = await client.settings.get('internal.api_key')\n * } catch (error) {\n * console.error('Access denied:', error)\n * }\n * ```\n */\n async get(key: string): Promise<any> {\n const response = await this.fetch.get<{ value: any }>(\n `/api/v1/settings/${encodeURIComponent(key)}`,\n );\n return response.value;\n }\n\n /**\n * Get multiple settings' values by keys\n *\n * Fetches multiple settings in a single request.\n * Only returns settings the user has permission to read based on RLS policies.\n * Settings the user can't access will be omitted from the result (no error thrown).\n *\n * @param keys - Array of setting keys to fetch\n * @returns Promise resolving to object mapping keys to values\n *\n * @example\n * ```typescript\n * const values = await client.settings.getMany([\n * 'features.beta_enabled', // public - will be returned\n * 'features.dark_mode', // public - will be returned\n * 'internal.api_key' // secret - will be omitted\n * ])\n * console.log(values)\n * // {\n * // 'features.beta_enabled': { enabled: true },\n * // 'features.dark_mode': { enabled: false }\n * // // 'internal.api_key' is omitted (no error)\n * // }\n * ```\n */\n async getMany(keys: string[]): Promise<Record<string, any>> {\n const response = await this.fetch.post<Array<{ key: string; value: any }>>(\n \"/api/v1/settings/batch\",\n { keys },\n );\n return response.reduce(\n (acc, setting) => {\n acc[setting.key] = setting.value;\n return acc;\n },\n {} as Record<string, any>,\n );\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n CreateSchemaRequest,\n CreateSchemaResponse,\n CreateTableRequest,\n CreateTableResponse,\n DeleteTableResponse,\n ListSchemasResponse,\n ListTablesResponse,\n CreateColumnRequest,\n} from './types'\n\n/**\n * DDL (Data Definition Language) Manager\n *\n * Provides methods for managing database schemas and tables programmatically.\n * This includes creating schemas, creating tables with custom columns, listing\n * schemas and tables, and deleting tables.\n *\n * @example\n * ```typescript\n * const ddl = client.admin.ddl\n *\n * // Create a new schema\n * await ddl.createSchema('analytics')\n *\n * // Create a table with columns\n * await ddl.createTable('analytics', 'events', [\n * { name: 'id', type: 'UUID', primaryKey: true, defaultValue: 'gen_random_uuid()' },\n * { name: 'user_id', type: 'UUID', nullable: false },\n * { name: 'event_name', type: 'TEXT', nullable: false },\n * { name: 'event_data', type: 'JSONB' },\n * { name: 'created_at', type: 'TIMESTAMPTZ', defaultValue: 'NOW()' }\n * ])\n *\n * // List all schemas\n * const { schemas } = await ddl.listSchemas()\n *\n * // List all tables in a schema\n * const { tables } = await ddl.listTables('analytics')\n *\n * // Delete a table\n * await ddl.deleteTable('analytics', 'events')\n * ```\n */\nexport class DDLManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Create a new database schema\n *\n * Creates a new schema in the database. Schemas are used to organize tables\n * into logical groups and provide namespace isolation.\n *\n * @param name - Schema name (must be valid PostgreSQL identifier)\n * @returns Promise resolving to CreateSchemaResponse\n *\n * @example\n * ```typescript\n * // Create a schema for analytics data\n * const result = await client.admin.ddl.createSchema('analytics')\n * console.log(result.message) // \"Schema created successfully\"\n * console.log(result.schema) // \"analytics\"\n * ```\n */\n async createSchema(name: string): Promise<CreateSchemaResponse> {\n const request: CreateSchemaRequest = { name }\n return await this.fetch.post<CreateSchemaResponse>('/api/v1/admin/ddl/schemas', request)\n }\n\n /**\n * List all database schemas\n *\n * Retrieves a list of all schemas in the database. This includes both\n * system schemas (like 'public', 'pg_catalog') and user-created schemas.\n *\n * @returns Promise resolving to ListSchemasResponse\n *\n * @example\n * ```typescript\n * const { schemas } = await client.admin.ddl.listSchemas()\n *\n * schemas.forEach(schema => {\n * console.log(`Schema: ${schema.name}, Owner: ${schema.owner}`)\n * })\n * ```\n */\n async listSchemas(): Promise<ListSchemasResponse> {\n return await this.fetch.get<ListSchemasResponse>('/api/v1/admin/ddl/schemas')\n }\n\n /**\n * Create a new table in a schema\n *\n * Creates a new table with the specified columns. Supports various column\n * options including primary keys, nullability, data types, and default values.\n *\n * @param schema - Schema name where the table will be created\n * @param name - Table name (must be valid PostgreSQL identifier)\n * @param columns - Array of column definitions\n * @returns Promise resolving to CreateTableResponse\n *\n * @example\n * ```typescript\n * // Create a users table\n * await client.admin.ddl.createTable('public', 'users', [\n * {\n * name: 'id',\n * type: 'UUID',\n * primaryKey: true,\n * defaultValue: 'gen_random_uuid()'\n * },\n * {\n * name: 'email',\n * type: 'TEXT',\n * nullable: false\n * },\n * {\n * name: 'name',\n * type: 'TEXT'\n * },\n * {\n * name: 'created_at',\n * type: 'TIMESTAMPTZ',\n * nullable: false,\n * defaultValue: 'NOW()'\n * }\n * ])\n * ```\n *\n * @example\n * ```typescript\n * // Create a products table with JSONB metadata\n * await client.admin.ddl.createTable('public', 'products', [\n * { name: 'id', type: 'SERIAL', primaryKey: true },\n * { name: 'name', type: 'TEXT', nullable: false },\n * { name: 'price', type: 'DECIMAL(10,2)', nullable: false },\n * { name: 'metadata', type: 'JSONB' },\n * { name: 'in_stock', type: 'BOOLEAN', defaultValue: 'true' }\n * ])\n * ```\n */\n async createTable(schema: string, name: string, columns: CreateColumnRequest[]): Promise<CreateTableResponse> {\n const request: CreateTableRequest = { schema, name, columns }\n return await this.fetch.post<CreateTableResponse>('/api/v1/admin/ddl/tables', request)\n }\n\n /**\n * List all tables in the database or a specific schema\n *\n * Retrieves a list of all tables. If a schema is specified, only tables\n * from that schema are returned. Otherwise, all tables from all schemas\n * are returned.\n *\n * @param schema - Optional schema name to filter tables\n * @returns Promise resolving to ListTablesResponse\n *\n * @example\n * ```typescript\n * // List all tables in the public schema\n * const { tables } = await client.admin.ddl.listTables('public')\n *\n * tables.forEach(table => {\n * console.log(`Table: ${table.schema}.${table.name}`)\n * table.columns?.forEach(col => {\n * console.log(` - ${col.name}: ${col.type}`)\n * })\n * })\n * ```\n *\n * @example\n * ```typescript\n * // List all tables across all schemas\n * const { tables } = await client.admin.ddl.listTables()\n *\n * const tablesBySchema = tables.reduce((acc, table) => {\n * if (!acc[table.schema]) acc[table.schema] = []\n * acc[table.schema].push(table.name)\n * return acc\n * }, {} as Record<string, string[]>)\n *\n * console.log(tablesBySchema)\n * ```\n */\n async listTables(schema?: string): Promise<ListTablesResponse> {\n const params = schema ? `?schema=${encodeURIComponent(schema)}` : ''\n return await this.fetch.get<ListTablesResponse>(`/api/v1/admin/ddl/tables${params}`)\n }\n\n /**\n * Delete a table from a schema\n *\n * Permanently deletes a table and all its data. This operation cannot be undone.\n *\n * @param schema - Schema name containing the table\n * @param name - Table name to delete\n * @returns Promise resolving to DeleteTableResponse\n *\n * @example\n * ```typescript\n * // Delete a table\n * const result = await client.admin.ddl.deleteTable('public', 'old_data')\n * console.log(result.message) // \"Table deleted successfully\"\n * ```\n *\n * @example\n * ```typescript\n * // Safe deletion with confirmation\n * const confirm = await askUser('Are you sure you want to delete this table?')\n * if (confirm) {\n * await client.admin.ddl.deleteTable('analytics', 'events')\n * console.log('Table deleted')\n * }\n * ```\n */\n async deleteTable(schema: string, name: string): Promise<DeleteTableResponse> {\n return await this.fetch.delete<DeleteTableResponse>(\n `/api/v1/admin/ddl/tables/${encodeURIComponent(schema)}/${encodeURIComponent(name)}`\n )\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n OAuthProvider,\n CreateOAuthProviderRequest,\n CreateOAuthProviderResponse,\n UpdateOAuthProviderRequest,\n UpdateOAuthProviderResponse,\n DeleteOAuthProviderResponse,\n AuthSettings,\n UpdateAuthSettingsRequest,\n UpdateAuthSettingsResponse,\n} from './types'\n\n/**\n * OAuth Provider Manager\n *\n * Manages OAuth provider configurations for third-party authentication.\n * Supports both built-in providers (Google, GitHub, etc.) and custom OAuth2 providers.\n *\n * @example\n * ```typescript\n * const oauth = client.admin.oauth\n *\n * // List all OAuth providers\n * const { providers } = await oauth.listProviders()\n *\n * // Create a new provider\n * await oauth.createProvider({\n * provider_name: 'github',\n * display_name: 'GitHub',\n * enabled: true,\n * client_id: 'your-client-id',\n * client_secret: 'your-client-secret',\n * redirect_url: 'https://yourapp.com/auth/callback',\n * scopes: ['user:email', 'read:user'],\n * is_custom: false\n * })\n *\n * // Update a provider\n * await oauth.updateProvider('provider-id', {\n * enabled: false\n * })\n *\n * // Delete a provider\n * await oauth.deleteProvider('provider-id')\n * ```\n */\nexport class OAuthProviderManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * List all OAuth providers\n *\n * Retrieves all configured OAuth providers including both enabled and disabled providers.\n * Note: Client secrets are not included in the response for security reasons.\n *\n * @returns Promise resolving to ListOAuthProvidersResponse\n *\n * @example\n * ```typescript\n * const { providers } = await client.admin.oauth.listProviders()\n *\n * providers.forEach(provider => {\n * console.log(`${provider.display_name}: ${provider.enabled ? 'enabled' : 'disabled'}`)\n * })\n * ```\n */\n async listProviders(): Promise<OAuthProvider[]> {\n const providers = await this.fetch.get<OAuthProvider[]>('/api/v1/admin/oauth/providers')\n return Array.isArray(providers) ? providers : []\n }\n\n /**\n * Get a specific OAuth provider by ID\n *\n * Retrieves detailed configuration for a single OAuth provider.\n * Note: Client secret is not included in the response.\n *\n * @param providerId - Provider ID (UUID)\n * @returns Promise resolving to OAuthProvider\n *\n * @example\n * ```typescript\n * const provider = await client.admin.oauth.getProvider('provider-uuid')\n *\n * console.log('Provider:', provider.display_name)\n * console.log('Scopes:', provider.scopes.join(', '))\n * console.log('Redirect URL:', provider.redirect_url)\n * ```\n */\n async getProvider(providerId: string): Promise<OAuthProvider> {\n return await this.fetch.get<OAuthProvider>(`/api/v1/admin/oauth/providers/${providerId}`)\n }\n\n /**\n * Create a new OAuth provider\n *\n * Creates a new OAuth provider configuration. For built-in providers (Google, GitHub, etc.),\n * set `is_custom` to false. For custom OAuth2 providers, set `is_custom` to true and provide\n * the authorization, token, and user info URLs.\n *\n * @param request - OAuth provider configuration\n * @returns Promise resolving to CreateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * // Create GitHub provider\n * const result = await client.admin.oauth.createProvider({\n * provider_name: 'github',\n * display_name: 'GitHub',\n * enabled: true,\n * client_id: process.env.GITHUB_CLIENT_ID,\n * client_secret: process.env.GITHUB_CLIENT_SECRET,\n * redirect_url: 'https://yourapp.com/auth/callback',\n * scopes: ['user:email', 'read:user'],\n * is_custom: false\n * })\n *\n * console.log('Provider created:', result.id)\n * ```\n *\n * @example\n * ```typescript\n * // Create custom OAuth2 provider\n * await client.admin.oauth.createProvider({\n * provider_name: 'custom_sso',\n * display_name: 'Custom SSO',\n * enabled: true,\n * client_id: 'client-id',\n * client_secret: 'client-secret',\n * redirect_url: 'https://yourapp.com/auth/callback',\n * scopes: ['openid', 'profile', 'email'],\n * is_custom: true,\n * authorization_url: 'https://sso.example.com/oauth/authorize',\n * token_url: 'https://sso.example.com/oauth/token',\n * user_info_url: 'https://sso.example.com/oauth/userinfo'\n * })\n * ```\n */\n async createProvider(request: CreateOAuthProviderRequest): Promise<CreateOAuthProviderResponse> {\n return await this.fetch.post<CreateOAuthProviderResponse>('/api/v1/admin/oauth/providers', request)\n }\n\n /**\n * Update an existing OAuth provider\n *\n * Updates an OAuth provider configuration. All fields are optional - only provided fields\n * will be updated. To update the client secret, provide a non-empty value.\n *\n * @param providerId - Provider ID (UUID)\n * @param request - Fields to update\n * @returns Promise resolving to UpdateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * // Disable a provider\n * await client.admin.oauth.updateProvider('provider-id', {\n * enabled: false\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Update scopes and redirect URL\n * await client.admin.oauth.updateProvider('provider-id', {\n * scopes: ['user:email', 'read:user', 'read:org'],\n * redirect_url: 'https://newdomain.com/auth/callback'\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Rotate client secret\n * await client.admin.oauth.updateProvider('provider-id', {\n * client_id: 'new-client-id',\n * client_secret: 'new-client-secret'\n * })\n * ```\n */\n async updateProvider(\n providerId: string,\n request: UpdateOAuthProviderRequest\n ): Promise<UpdateOAuthProviderResponse> {\n return await this.fetch.put<UpdateOAuthProviderResponse>(\n `/api/v1/admin/oauth/providers/${providerId}`,\n request\n )\n }\n\n /**\n * Delete an OAuth provider\n *\n * Permanently deletes an OAuth provider configuration. This will prevent users from\n * authenticating with this provider.\n *\n * @param providerId - Provider ID (UUID) to delete\n * @returns Promise resolving to DeleteOAuthProviderResponse\n *\n * @example\n * ```typescript\n * await client.admin.oauth.deleteProvider('provider-id')\n * console.log('Provider deleted')\n * ```\n *\n * @example\n * ```typescript\n * // Safe deletion with confirmation\n * const provider = await client.admin.oauth.getProvider('provider-id')\n * const confirmed = await confirm(`Delete ${provider.display_name}?`)\n *\n * if (confirmed) {\n * await client.admin.oauth.deleteProvider('provider-id')\n * }\n * ```\n */\n async deleteProvider(providerId: string): Promise<DeleteOAuthProviderResponse> {\n return await this.fetch.delete<DeleteOAuthProviderResponse>(\n `/api/v1/admin/oauth/providers/${providerId}`\n )\n }\n\n /**\n * Enable an OAuth provider\n *\n * Convenience method to enable a provider.\n *\n * @param providerId - Provider ID (UUID)\n * @returns Promise resolving to UpdateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * await client.admin.oauth.enableProvider('provider-id')\n * ```\n */\n async enableProvider(providerId: string): Promise<UpdateOAuthProviderResponse> {\n return await this.updateProvider(providerId, { enabled: true })\n }\n\n /**\n * Disable an OAuth provider\n *\n * Convenience method to disable a provider.\n *\n * @param providerId - Provider ID (UUID)\n * @returns Promise resolving to UpdateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * await client.admin.oauth.disableProvider('provider-id')\n * ```\n */\n async disableProvider(providerId: string): Promise<UpdateOAuthProviderResponse> {\n return await this.updateProvider(providerId, { enabled: false })\n }\n}\n\n/**\n * Authentication Settings Manager\n *\n * Manages global authentication settings including password requirements, session timeouts,\n * and signup configuration.\n *\n * @example\n * ```typescript\n * const authSettings = client.admin.authSettings\n *\n * // Get current settings\n * const settings = await authSettings.get()\n *\n * // Update settings\n * await authSettings.update({\n * password_min_length: 12,\n * password_require_uppercase: true,\n * session_timeout_minutes: 120\n * })\n * ```\n */\nexport class AuthSettingsManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Get current authentication settings\n *\n * Retrieves all authentication configuration settings.\n *\n * @returns Promise resolving to AuthSettings\n *\n * @example\n * ```typescript\n * const settings = await client.admin.authSettings.get()\n *\n * console.log('Password min length:', settings.password_min_length)\n * console.log('Signup enabled:', settings.enable_signup)\n * console.log('Session timeout:', settings.session_timeout_minutes, 'minutes')\n * ```\n */\n async get(): Promise<AuthSettings> {\n return await this.fetch.get<AuthSettings>('/api/v1/admin/auth/settings')\n }\n\n /**\n * Update authentication settings\n *\n * Updates one or more authentication settings. All fields are optional - only provided\n * fields will be updated.\n *\n * @param request - Settings to update\n * @returns Promise resolving to UpdateAuthSettingsResponse\n *\n * @example\n * ```typescript\n * // Strengthen password requirements\n * await client.admin.authSettings.update({\n * password_min_length: 16,\n * password_require_uppercase: true,\n * password_require_lowercase: true,\n * password_require_number: true,\n * password_require_special: true\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Extend session timeout\n * await client.admin.authSettings.update({\n * session_timeout_minutes: 240,\n * max_sessions_per_user: 10\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Disable email verification during development\n * await client.admin.authSettings.update({\n * require_email_verification: false\n * })\n * ```\n */\n async update(request: UpdateAuthSettingsRequest): Promise<UpdateAuthSettingsResponse> {\n return await this.fetch.put<UpdateAuthSettingsResponse>('/api/v1/admin/auth/settings', request)\n }\n}\n\n/**\n * OAuth Configuration Manager\n *\n * Root manager providing access to OAuth provider and authentication settings management.\n *\n * @example\n * ```typescript\n * const oauth = client.admin.oauth\n *\n * // Manage OAuth providers\n * const providers = await oauth.providers.listProviders()\n *\n * // Manage auth settings\n * const settings = await oauth.authSettings.get()\n * ```\n */\nexport class FluxbaseOAuth {\n public providers: OAuthProviderManager\n public authSettings: AuthSettingsManager\n\n constructor(fetch: FluxbaseFetch) {\n this.providers = new OAuthProviderManager(fetch)\n this.authSettings = new AuthSettingsManager(fetch)\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n ImpersonateUserRequest,\n ImpersonateAnonRequest,\n ImpersonateServiceRequest,\n StartImpersonationResponse,\n StopImpersonationResponse,\n GetImpersonationResponse,\n ListImpersonationSessionsOptions,\n ListImpersonationSessionsResponse,\n} from './types'\n\n/**\n * Impersonation Manager\n *\n * Manages user impersonation for debugging, testing RLS policies, and customer support.\n * Allows admins to view data as different users, anonymous visitors, or with service role permissions.\n *\n * All impersonation sessions are logged in the audit trail for security and compliance.\n *\n * @example\n * ```typescript\n * const impersonation = client.admin.impersonation\n *\n * // Impersonate a specific user\n * const { session, access_token } = await impersonation.impersonateUser({\n * target_user_id: 'user-uuid',\n * reason: 'Support ticket #1234'\n * })\n *\n * // Impersonate anonymous user\n * await impersonation.impersonateAnon({\n * reason: 'Testing public data access'\n * })\n *\n * // Impersonate with service role\n * await impersonation.impersonateService({\n * reason: 'Administrative query'\n * })\n *\n * // Stop impersonation\n * await impersonation.stop()\n * ```\n */\nexport class ImpersonationManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Impersonate a specific user\n *\n * Start an impersonation session as a specific user. This allows you to see data\n * exactly as that user would see it, respecting all RLS policies and permissions.\n *\n * @param request - Impersonation request with target user ID and reason\n * @returns Promise resolving to impersonation session with access token\n *\n * @example\n * ```typescript\n * const result = await client.admin.impersonation.impersonateUser({\n * target_user_id: 'user-123',\n * reason: 'Support ticket #5678 - user reports missing data'\n * })\n *\n * console.log('Impersonating:', result.target_user.email)\n * console.log('Session ID:', result.session.id)\n *\n * // Use the access token for subsequent requests\n * // (typically handled automatically by the SDK)\n * ```\n */\n async impersonateUser(request: ImpersonateUserRequest): Promise<StartImpersonationResponse> {\n return await this.fetch.post<StartImpersonationResponse>('/api/v1/auth/impersonate', request)\n }\n\n /**\n * Impersonate anonymous user\n *\n * Start an impersonation session as an unauthenticated user. This allows you to see\n * what data is publicly accessible and test RLS policies for anonymous access.\n *\n * @param request - Impersonation request with reason\n * @returns Promise resolving to impersonation session with access token\n *\n * @example\n * ```typescript\n * await client.admin.impersonation.impersonateAnon({\n * reason: 'Testing public data access for blog posts'\n * })\n *\n * // Now all queries will use anonymous permissions\n * const publicPosts = await client.from('posts').select('*')\n * console.log('Public posts:', publicPosts.length)\n * ```\n */\n async impersonateAnon(request: ImpersonateAnonRequest): Promise<StartImpersonationResponse> {\n return await this.fetch.post<StartImpersonationResponse>('/api/v1/auth/impersonate/anon', request)\n }\n\n /**\n * Impersonate with service role\n *\n * Start an impersonation session with service-level permissions. This provides elevated\n * access that may bypass RLS policies, useful for administrative operations.\n *\n * @param request - Impersonation request with reason\n * @returns Promise resolving to impersonation session with access token\n *\n * @example\n * ```typescript\n * await client.admin.impersonation.impersonateService({\n * reason: 'Administrative data cleanup'\n * })\n *\n * // Now all queries will use service role permissions\n * const allRecords = await client.from('sensitive_data').select('*')\n * console.log('All records:', allRecords.length)\n * ```\n */\n async impersonateService(request: ImpersonateServiceRequest): Promise<StartImpersonationResponse> {\n return await this.fetch.post<StartImpersonationResponse>('/api/v1/auth/impersonate/service', request)\n }\n\n /**\n * Stop impersonation\n *\n * Ends the current impersonation session and returns to admin context.\n * The session is marked as ended in the audit trail.\n *\n * @returns Promise resolving to stop confirmation\n *\n * @example\n * ```typescript\n * await client.admin.impersonation.stop()\n * console.log('Impersonation ended')\n *\n * // Subsequent queries will use admin permissions\n * ```\n */\n async stop(): Promise<StopImpersonationResponse> {\n return await this.fetch.delete<StopImpersonationResponse>('/api/v1/auth/impersonate')\n }\n\n /**\n * Get current impersonation session\n *\n * Retrieves information about the active impersonation session, if any.\n *\n * @returns Promise resolving to current impersonation session or null\n *\n * @example\n * ```typescript\n * const current = await client.admin.impersonation.getCurrent()\n *\n * if (current.session) {\n * console.log('Currently impersonating:', current.target_user?.email)\n * console.log('Reason:', current.session.reason)\n * console.log('Started:', current.session.started_at)\n * } else {\n * console.log('No active impersonation')\n * }\n * ```\n */\n async getCurrent(): Promise<GetImpersonationResponse> {\n return await this.fetch.get<GetImpersonationResponse>('/api/v1/auth/impersonate')\n }\n\n /**\n * List impersonation sessions (audit trail)\n *\n * Retrieves a list of impersonation sessions for audit and compliance purposes.\n * Can be filtered by admin user, target user, type, and active status.\n *\n * @param options - Filter and pagination options\n * @returns Promise resolving to list of impersonation sessions\n *\n * @example\n * ```typescript\n * // List all sessions\n * const { sessions, total } = await client.admin.impersonation.listSessions()\n * console.log(`Total sessions: ${total}`)\n *\n * // List active sessions only\n * const active = await client.admin.impersonation.listSessions({\n * is_active: true\n * })\n * console.log('Active sessions:', active.sessions.length)\n *\n * // List sessions for a specific admin\n * const adminSessions = await client.admin.impersonation.listSessions({\n * admin_user_id: 'admin-uuid',\n * limit: 50\n * })\n *\n * // List user impersonation sessions only\n * const userSessions = await client.admin.impersonation.listSessions({\n * impersonation_type: 'user',\n * offset: 0,\n * limit: 100\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Audit trail: Find who impersonated a specific user\n * const userHistory = await client.admin.impersonation.listSessions({\n * target_user_id: 'user-uuid'\n * })\n *\n * userHistory.sessions.forEach(session => {\n * console.log(`Admin ${session.admin_user_id} impersonated user`)\n * console.log(`Reason: ${session.reason}`)\n * console.log(`Duration: ${session.started_at} - ${session.ended_at}`)\n * })\n * ```\n */\n async listSessions(options: ListImpersonationSessionsOptions = {}): Promise<ListImpersonationSessionsResponse> {\n const params = new URLSearchParams()\n\n if (options.limit !== undefined) {\n params.append('limit', String(options.limit))\n }\n if (options.offset !== undefined) {\n params.append('offset', String(options.offset))\n }\n if (options.admin_user_id) {\n params.append('admin_user_id', options.admin_user_id)\n }\n if (options.target_user_id) {\n params.append('target_user_id', options.target_user_id)\n }\n if (options.impersonation_type) {\n params.append('impersonation_type', options.impersonation_type)\n }\n if (options.is_active !== undefined) {\n params.append('is_active', String(options.is_active))\n }\n\n const queryString = params.toString()\n const url = queryString ? `/api/v1/auth/impersonate/sessions?${queryString}` : '/api/v1/auth/impersonate/sessions'\n\n return await this.fetch.get<ListImpersonationSessionsResponse>(url)\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n // API Keys\n APIKey,\n CreateAPIKeyRequest,\n CreateAPIKeyResponse,\n DeleteAPIKeyResponse,\n ListAPIKeysResponse,\n RevokeAPIKeyResponse,\n UpdateAPIKeyRequest,\n // Webhooks\n CreateWebhookRequest,\n DeleteWebhookResponse,\n ListWebhookDeliveriesResponse,\n ListWebhooksResponse,\n TestWebhookResponse,\n UpdateWebhookRequest,\n Webhook,\n // Invitations\n AcceptInvitationRequest,\n AcceptInvitationResponse,\n CreateInvitationRequest,\n CreateInvitationResponse,\n ListInvitationsOptions,\n ListInvitationsResponse,\n RevokeInvitationResponse,\n ValidateInvitationResponse,\n} from './types'\n\n/**\n * API Keys management client\n *\n * Provides methods for managing API keys for service-to-service authentication.\n * API keys allow external services to authenticate without user credentials.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.auth.login({ email: 'user@example.com', password: 'password' })\n *\n * // Create an API key\n * const { api_key, key } = await client.management.apiKeys.create({\n * name: 'Production Service',\n * scopes: ['read:users', 'write:users'],\n * rate_limit_per_minute: 100\n * })\n *\n * // List API keys\n * const { api_keys } = await client.management.apiKeys.list()\n * ```\n *\n * @category Management\n */\nexport class APIKeysManager {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Create a new API key\n *\n * @param request - API key configuration\n * @returns Created API key with the full key value (only shown once)\n *\n * @example\n * ```typescript\n * const { api_key, key } = await client.management.apiKeys.create({\n * name: 'Production Service',\n * description: 'API key for production service',\n * scopes: ['read:users', 'write:users'],\n * rate_limit_per_minute: 100,\n * expires_at: '2025-12-31T23:59:59Z'\n * })\n *\n * // Store the key securely - it won't be shown again\n * console.log('API Key:', key)\n * ```\n */\n async create(request: CreateAPIKeyRequest): Promise<CreateAPIKeyResponse> {\n return await this.fetch.post<CreateAPIKeyResponse>('/api/v1/api-keys', request)\n }\n\n /**\n * List all API keys for the authenticated user\n *\n * @returns List of API keys (without full key values)\n *\n * @example\n * ```typescript\n * const { api_keys, total } = await client.management.apiKeys.list()\n *\n * api_keys.forEach(key => {\n * console.log(`${key.name}: ${key.key_prefix}... (expires: ${key.expires_at})`)\n * })\n * ```\n */\n async list(): Promise<ListAPIKeysResponse> {\n return await this.fetch.get<ListAPIKeysResponse>('/api/v1/api-keys')\n }\n\n /**\n * Get a specific API key by ID\n *\n * @param keyId - API key ID\n * @returns API key details\n *\n * @example\n * ```typescript\n * const apiKey = await client.management.apiKeys.get('key-uuid')\n * console.log('Last used:', apiKey.last_used_at)\n * ```\n */\n async get(keyId: string): Promise<APIKey> {\n return await this.fetch.get<APIKey>(`/api/v1/api-keys/${keyId}`)\n }\n\n /**\n * Update an API key\n *\n * @param keyId - API key ID\n * @param updates - Fields to update\n * @returns Updated API key\n *\n * @example\n * ```typescript\n * const updated = await client.management.apiKeys.update('key-uuid', {\n * name: 'Updated Name',\n * rate_limit_per_minute: 200\n * })\n * ```\n */\n async update(keyId: string, updates: UpdateAPIKeyRequest): Promise<APIKey> {\n return await this.fetch.patch<APIKey>(`/api/v1/api-keys/${keyId}`, updates)\n }\n\n /**\n * Revoke an API key\n *\n * Revoked keys can no longer be used but remain in the system for audit purposes.\n *\n * @param keyId - API key ID\n * @returns Revocation confirmation\n *\n * @example\n * ```typescript\n * await client.management.apiKeys.revoke('key-uuid')\n * console.log('API key revoked')\n * ```\n */\n async revoke(keyId: string): Promise<RevokeAPIKeyResponse> {\n return await this.fetch.post<RevokeAPIKeyResponse>(`/api/v1/api-keys/${keyId}/revoke`, {})\n }\n\n /**\n * Delete an API key\n *\n * Permanently removes the API key from the system.\n *\n * @param keyId - API key ID\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await client.management.apiKeys.delete('key-uuid')\n * console.log('API key deleted')\n * ```\n */\n async delete(keyId: string): Promise<DeleteAPIKeyResponse> {\n return await this.fetch.delete<DeleteAPIKeyResponse>(`/api/v1/api-keys/${keyId}`)\n }\n}\n\n/**\n * Webhooks management client\n *\n * Provides methods for managing webhooks to receive real-time event notifications.\n * Webhooks allow your application to be notified when events occur in Fluxbase.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.auth.login({ email: 'user@example.com', password: 'password' })\n *\n * // Create a webhook\n * const webhook = await client.management.webhooks.create({\n * url: 'https://myapp.com/webhook',\n * events: ['user.created', 'user.updated'],\n * secret: 'my-webhook-secret'\n * })\n *\n * // Test the webhook\n * const result = await client.management.webhooks.test(webhook.id)\n * ```\n *\n * @category Management\n */\nexport class WebhooksManager {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Create a new webhook\n *\n * @param request - Webhook configuration\n * @returns Created webhook\n *\n * @example\n * ```typescript\n * const webhook = await client.management.webhooks.create({\n * url: 'https://myapp.com/webhook',\n * events: ['user.created', 'user.updated', 'user.deleted'],\n * description: 'User events webhook',\n * secret: 'my-webhook-secret'\n * })\n * ```\n */\n async create(request: CreateWebhookRequest): Promise<Webhook> {\n return await this.fetch.post<Webhook>('/api/v1/webhooks', request)\n }\n\n /**\n * List all webhooks for the authenticated user\n *\n * @returns List of webhooks\n *\n * @example\n * ```typescript\n * const { webhooks, total } = await client.management.webhooks.list()\n *\n * webhooks.forEach(webhook => {\n * console.log(`${webhook.url}: ${webhook.is_active ? 'active' : 'inactive'}`)\n * })\n * ```\n */\n async list(): Promise<ListWebhooksResponse> {\n return await this.fetch.get<ListWebhooksResponse>('/api/v1/webhooks')\n }\n\n /**\n * Get a specific webhook by ID\n *\n * @param webhookId - Webhook ID\n * @returns Webhook details\n *\n * @example\n * ```typescript\n * const webhook = await client.management.webhooks.get('webhook-uuid')\n * console.log('Events:', webhook.events)\n * ```\n */\n async get(webhookId: string): Promise<Webhook> {\n return await this.fetch.get<Webhook>(`/api/v1/webhooks/${webhookId}`)\n }\n\n /**\n * Update a webhook\n *\n * @param webhookId - Webhook ID\n * @param updates - Fields to update\n * @returns Updated webhook\n *\n * @example\n * ```typescript\n * const updated = await client.management.webhooks.update('webhook-uuid', {\n * events: ['user.created', 'user.deleted'],\n * is_active: false\n * })\n * ```\n */\n async update(webhookId: string, updates: UpdateWebhookRequest): Promise<Webhook> {\n return await this.fetch.patch<Webhook>(`/api/v1/webhooks/${webhookId}`, updates)\n }\n\n /**\n * Delete a webhook\n *\n * @param webhookId - Webhook ID\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await client.management.webhooks.delete('webhook-uuid')\n * console.log('Webhook deleted')\n * ```\n */\n async delete(webhookId: string): Promise<DeleteWebhookResponse> {\n return await this.fetch.delete<DeleteWebhookResponse>(`/api/v1/webhooks/${webhookId}`)\n }\n\n /**\n * Test a webhook by sending a test payload\n *\n * @param webhookId - Webhook ID\n * @returns Test result with status and response\n *\n * @example\n * ```typescript\n * const result = await client.management.webhooks.test('webhook-uuid')\n *\n * if (result.success) {\n * console.log('Webhook test successful')\n * } else {\n * console.error('Webhook test failed:', result.error)\n * }\n * ```\n */\n async test(webhookId: string): Promise<TestWebhookResponse> {\n return await this.fetch.post<TestWebhookResponse>(`/api/v1/webhooks/${webhookId}/test`, {})\n }\n\n /**\n * List webhook delivery history\n *\n * @param webhookId - Webhook ID\n * @param limit - Maximum number of deliveries to return (default: 50)\n * @returns List of webhook deliveries\n *\n * @example\n * ```typescript\n * const { deliveries } = await client.management.webhooks.listDeliveries('webhook-uuid', 100)\n *\n * deliveries.forEach(delivery => {\n * console.log(`Event: ${delivery.event}, Status: ${delivery.status_code}`)\n * })\n * ```\n */\n async listDeliveries(webhookId: string, limit: number = 50): Promise<ListWebhookDeliveriesResponse> {\n return await this.fetch.get<ListWebhookDeliveriesResponse>(\n `/api/v1/webhooks/${webhookId}/deliveries?limit=${limit}`,\n )\n }\n}\n\n/**\n * Invitations management client\n *\n * Provides methods for creating and managing user invitations.\n * Invitations allow admins to invite new users to join the dashboard.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.admin.login({ email: 'admin@example.com', password: 'password' })\n *\n * // Create an invitation\n * const invitation = await client.management.invitations.create({\n * email: 'newuser@example.com',\n * role: 'dashboard_user'\n * })\n *\n * console.log('Invite link:', invitation.invite_link)\n * ```\n *\n * @category Management\n */\nexport class InvitationsManager {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Create a new invitation (admin only)\n *\n * @param request - Invitation details\n * @returns Created invitation with invite link\n *\n * @example\n * ```typescript\n * const invitation = await client.management.invitations.create({\n * email: 'newuser@example.com',\n * role: 'dashboard_user',\n * expiry_duration: 604800 // 7 days in seconds\n * })\n *\n * // Share the invite link\n * console.log('Send this link to the user:', invitation.invite_link)\n * ```\n */\n async create(request: CreateInvitationRequest): Promise<CreateInvitationResponse> {\n return await this.fetch.post<CreateInvitationResponse>('/api/v1/admin/invitations', request)\n }\n\n /**\n * List all invitations (admin only)\n *\n * @param options - Filter options\n * @returns List of invitations\n *\n * @example\n * ```typescript\n * // List pending invitations only\n * const { invitations } = await client.management.invitations.list({\n * include_accepted: false,\n * include_expired: false\n * })\n *\n * // List all invitations including accepted and expired\n * const all = await client.management.invitations.list({\n * include_accepted: true,\n * include_expired: true\n * })\n * ```\n */\n async list(options: ListInvitationsOptions = {}): Promise<ListInvitationsResponse> {\n const params = new URLSearchParams()\n\n if (options.include_accepted !== undefined) {\n params.append('include_accepted', String(options.include_accepted))\n }\n if (options.include_expired !== undefined) {\n params.append('include_expired', String(options.include_expired))\n }\n\n const queryString = params.toString()\n const url = queryString ? `/api/v1/admin/invitations?${queryString}` : '/api/v1/admin/invitations'\n\n return await this.fetch.get<ListInvitationsResponse>(url)\n }\n\n /**\n * Validate an invitation token (public endpoint)\n *\n * @param token - Invitation token\n * @returns Validation result with invitation details\n *\n * @example\n * ```typescript\n * const result = await client.management.invitations.validate('invitation-token')\n *\n * if (result.valid) {\n * console.log('Valid invitation for:', result.invitation?.email)\n * } else {\n * console.error('Invalid:', result.error)\n * }\n * ```\n */\n async validate(token: string): Promise<ValidateInvitationResponse> {\n return await this.fetch.get<ValidateInvitationResponse>(`/api/v1/invitations/${token}/validate`)\n }\n\n /**\n * Accept an invitation and create a new user (public endpoint)\n *\n * @param token - Invitation token\n * @param request - User details (password and name)\n * @returns Created user with authentication tokens\n *\n * @example\n * ```typescript\n * const response = await client.management.invitations.accept('invitation-token', {\n * password: 'SecurePassword123!',\n * name: 'John Doe'\n * })\n *\n * // Store tokens\n * localStorage.setItem('access_token', response.access_token)\n * console.log('Welcome:', response.user.name)\n * ```\n */\n async accept(token: string, request: AcceptInvitationRequest): Promise<AcceptInvitationResponse> {\n return await this.fetch.post<AcceptInvitationResponse>(`/api/v1/invitations/${token}/accept`, request)\n }\n\n /**\n * Revoke an invitation (admin only)\n *\n * @param token - Invitation token\n * @returns Revocation confirmation\n *\n * @example\n * ```typescript\n * await client.management.invitations.revoke('invitation-token')\n * console.log('Invitation revoked')\n * ```\n */\n async revoke(token: string): Promise<RevokeInvitationResponse> {\n return await this.fetch.delete<RevokeInvitationResponse>(`/api/v1/admin/invitations/${token}`)\n }\n}\n\n/**\n * Management client for API keys, webhooks, and invitations\n *\n * @category Management\n */\nexport class FluxbaseManagement {\n /** API Keys management */\n public apiKeys: APIKeysManager\n\n /** Webhooks management */\n public webhooks: WebhooksManager\n\n /** Invitations management */\n public invitations: InvitationsManager\n\n constructor(fetch: FluxbaseFetch) {\n this.apiKeys = new APIKeysManager(fetch)\n this.webhooks = new WebhooksManager(fetch)\n this.invitations = new InvitationsManager(fetch)\n }\n}\n","/**\n * Admin Functions module for managing edge functions\n * Provides administrative operations for function lifecycle management\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n EdgeFunction,\n CreateFunctionRequest,\n UpdateFunctionRequest,\n EdgeFunctionExecution,\n SyncFunctionsOptions,\n SyncFunctionsResult,\n} from \"./types\";\n\n/**\n * Admin Functions manager for managing edge functions\n * Provides create, update, delete, and bulk sync operations\n *\n * @category Admin\n */\nexport class FluxbaseAdminFunctions {\n private fetch: FluxbaseFetch;\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch;\n }\n\n /**\n * Create a new edge function\n *\n * @param request - Function configuration and code\n * @returns Promise resolving to { data, error } tuple with created function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.functions.create({\n * name: 'my-function',\n * code: 'export default async function handler(req) { return { hello: \"world\" } }',\n * enabled: true\n * })\n * ```\n */\n async create(\n request: CreateFunctionRequest,\n ): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<EdgeFunction>(\n \"/api/v1/functions\",\n request,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List all namespaces that have edge functions\n *\n * @returns Promise resolving to { data, error } tuple with array of namespace strings\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.functions.listNamespaces()\n * if (data) {\n * console.log('Available namespaces:', data)\n * }\n * ```\n */\n async listNamespaces(): Promise<{\n data: string[] | null;\n error: Error | null;\n }> {\n try {\n const response = await this.fetch.get<{ namespaces: string[] }>(\n \"/api/v1/admin/functions/namespaces\",\n );\n return { data: response.namespaces || [\"default\"], error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List all edge functions (admin view)\n *\n * @param namespace - Optional namespace filter (if not provided, lists all public functions)\n * @returns Promise resolving to { data, error } tuple with array of functions\n *\n * @example\n * ```typescript\n * // List all public functions\n * const { data, error } = await client.admin.functions.list()\n *\n * // List functions in a specific namespace\n * const { data, error } = await client.admin.functions.list('my-namespace')\n * if (data) {\n * console.log('Functions:', data.map(f => f.name))\n * }\n * ```\n */\n async list(\n namespace?: string,\n ): Promise<{ data: EdgeFunction[] | null; error: Error | null }> {\n try {\n const params = namespace ? `?namespace=${namespace}` : \"\";\n const data = await this.fetch.get<EdgeFunction[]>(\n `/api/v1/functions${params}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get details of a specific edge function\n *\n * @param name - Function name\n * @returns Promise resolving to { data, error } tuple with function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.functions.get('my-function')\n * if (data) {\n * console.log('Function version:', data.version)\n * }\n * ```\n */\n async get(\n name: string,\n ): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<EdgeFunction>(\n `/api/v1/functions/${name}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Update an existing edge function\n *\n * @param name - Function name\n * @param updates - Fields to update\n * @returns Promise resolving to { data, error } tuple with updated function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.functions.update('my-function', {\n * enabled: false,\n * description: 'Updated description'\n * })\n * ```\n */\n async update(\n name: string,\n updates: UpdateFunctionRequest,\n ): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.put<EdgeFunction>(\n `/api/v1/functions/${name}`,\n updates,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Delete an edge function\n *\n * @param name - Function name\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.functions.delete('my-function')\n * ```\n */\n async delete(name: string): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.delete(`/api/v1/functions/${name}`);\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get execution history for an edge function\n *\n * @param name - Function name\n * @param limit - Maximum number of executions to return (optional)\n * @returns Promise resolving to { data, error } tuple with execution records\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.functions.getExecutions('my-function', 10)\n * if (data) {\n * data.forEach(exec => {\n * console.log(`${exec.executed_at}: ${exec.status} (${exec.duration_ms}ms)`)\n * })\n * }\n * ```\n */\n async getExecutions(\n name: string,\n limit?: number,\n ): Promise<{ data: EdgeFunctionExecution[] | null; error: Error | null }> {\n try {\n const params = limit ? `?limit=${limit}` : \"\";\n const data = await this.fetch.get<EdgeFunctionExecution[]>(\n `/api/v1/functions/${name}/executions${params}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Sync multiple functions to a namespace\n *\n * Bulk create/update/delete functions in a specific namespace. This is useful for\n * deploying functions from your application to Fluxbase in Kubernetes or other\n * container environments.\n *\n * Requires service_role or admin authentication.\n *\n * @param options - Sync configuration including namespace, functions, and options\n * @returns Promise resolving to { data, error } tuple with sync results\n *\n * @example\n * ```typescript\n * // Sync functions to \"payment-service\" namespace\n * const { data, error } = await client.admin.functions.sync({\n * namespace: 'payment-service',\n * functions: [\n * {\n * name: 'process-payment',\n * code: 'export default async function handler(req) { ... }',\n * enabled: true,\n * allow_net: true\n * },\n * {\n * name: 'refund-payment',\n * code: 'export default async function handler(req) { ... }',\n * enabled: true\n * }\n * ],\n * options: {\n * delete_missing: true // Remove functions not in this list\n * }\n * })\n *\n * if (data) {\n * console.log(`Synced: ${data.summary.created} created, ${data.summary.updated} updated`)\n * }\n *\n * // Dry run to preview changes\n * const { data, error } = await client.admin.functions.sync({\n * namespace: 'myapp',\n * functions: [...],\n * options: { dry_run: true }\n * })\n * ```\n */\n async sync(\n options: SyncFunctionsOptions,\n ): Promise<{ data: SyncFunctionsResult | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<SyncFunctionsResult>(\n \"/api/v1/admin/functions/sync\",\n options,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n}\n","/**\n * Admin Migrations module for managing database migrations\n * Provides API-based migration management without filesystem coupling\n */\n\nimport type { FluxbaseFetch } from './fetch'\nimport type {\n Migration,\n CreateMigrationRequest,\n UpdateMigrationRequest,\n MigrationExecution,\n SyncMigrationsOptions,\n SyncMigrationsResult,\n} from './types'\n\n/**\n * Admin Migrations manager for database migration operations\n * Provides create, update, delete, apply, rollback, and smart sync operations\n *\n * @category Admin\n */\nexport class FluxbaseAdminMigrations {\n private fetch: FluxbaseFetch\n private localMigrations: Map<string, CreateMigrationRequest> = new Map()\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Register a migration locally for smart sync\n *\n * Call this method to register migrations in your application code.\n * When you call sync(), only new or changed migrations will be sent to the server.\n *\n * @param migration - Migration definition\n * @returns { error } tuple (always succeeds unless validation fails)\n *\n * @example\n * ```typescript\n * // In your app initialization\n * const { error: err1 } = client.admin.migrations.register({\n * name: '001_create_users_table',\n * namespace: 'myapp',\n * up_sql: 'CREATE TABLE app.users (...)',\n * down_sql: 'DROP TABLE app.users',\n * description: 'Initial users table'\n * })\n *\n * const { error: err2 } = client.admin.migrations.register({\n * name: '002_add_posts_table',\n * namespace: 'myapp',\n * up_sql: 'CREATE TABLE app.posts (...)',\n * down_sql: 'DROP TABLE app.posts'\n * })\n *\n * // Sync all registered migrations\n * await client.admin.migrations.sync()\n * ```\n */\n register(migration: CreateMigrationRequest): { error: Error | null } {\n try {\n // Basic validation\n if (!migration.name || !migration.up_sql) {\n return {\n error: new Error('Migration name and up_sql are required')\n }\n }\n\n const key = `${migration.namespace || 'default'}:${migration.name}`\n this.localMigrations.set(key, migration)\n\n return { error: null }\n } catch (error) {\n return { error: error as Error }\n }\n }\n\n /**\n * Trigger schema refresh which will restart the server\n * Handles the restart gracefully by waiting for the server to come back online\n *\n * @private\n */\n private async triggerSchemaRefreshWithRestart(): Promise<void> {\n console.log('Triggering schema refresh (server will restart)...')\n\n try {\n // Call the schema refresh endpoint\n // Server will return 202 and then restart\n const response = await this.fetch.post<{ message: string }>(\n '/api/v1/admin/schema/refresh',\n {}\n )\n\n // If we got a 202, the server is restarting\n console.log('Server restart initiated:', response.message || 'Schema refresh in progress')\n } catch (error: any) {\n // Connection errors are expected during restart\n const isConnectionError =\n error.message?.includes('fetch failed') ||\n error.message?.includes('ECONNREFUSED') ||\n error.message?.includes('ECONNRESET') ||\n error.code === 'ECONNREFUSED' ||\n error.code === 'ECONNRESET'\n\n if (!isConnectionError) {\n // Unexpected error - propagate it\n throw error\n }\n\n console.log('Connection dropped (expected during restart)...')\n }\n\n // Wait for server to restart (typically takes 5-7 seconds with build + startup)\n console.log('Waiting 6 seconds for server to restart...')\n await this.sleep(6000)\n\n // Verify server is back online by attempting a simple health check\n // Try up to 5 times with exponential backoff\n const maxAttempts = 5\n const baseDelay = 1000 // 1 second\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n // Check the root health endpoint (not /api/v1/health which doesn't exist)\n // We don't care about the response content, just that it responds without error\n await this.fetch.get('/health')\n console.log('Server is back online and ready')\n return\n } catch (error: any) {\n const isLastAttempt = attempt === maxAttempts\n\n if (isLastAttempt) {\n throw new Error(\n `Server did not come back online after ${maxAttempts} attempts. ` +\n `Please check server logs and try again.`\n )\n }\n\n // Exponential backoff: 1s, 2s, 4s, 8s\n const delay = baseDelay * Math.pow(2, attempt - 1)\n console.log(`Server not ready yet, retrying in ${delay}ms... (attempt ${attempt}/${maxAttempts})`)\n await this.sleep(delay)\n }\n }\n }\n\n /**\n * Helper function to sleep for a given duration\n * @private\n */\n private sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n }\n\n /**\n * Smart sync all registered migrations\n *\n * Automatically determines which migrations need to be created or updated by:\n * 1. Fetching existing migrations from the server\n * 2. Comparing content hashes to detect changes\n * 3. Only sending new or changed migrations\n *\n * After successful sync, can optionally auto-apply new migrations and refresh\n * the server's schema cache.\n *\n * @param options - Sync options\n * @returns Promise resolving to { data, error } tuple with sync results\n *\n * @example\n * ```typescript\n * // Basic sync (idempotent - safe to call on every app startup)\n * const { data, error } = await client.admin.migrations.sync()\n * if (data) {\n * console.log(`Created: ${data.summary.created}, Updated: ${data.summary.updated}`)\n * }\n *\n * // Sync with auto-apply (applies new migrations automatically)\n * const { data, error } = await client.admin.migrations.sync({\n * auto_apply: true\n * })\n *\n * // Dry run to preview changes without applying\n * const { data, error } = await client.admin.migrations.sync({\n * dry_run: true\n * })\n * ```\n */\n async sync(\n options: Partial<SyncMigrationsOptions> = {}\n ): Promise<{ data: SyncMigrationsResult | null; error: Error | null }> {\n try {\n // Group migrations by namespace\n const byNamespace = new Map<string, CreateMigrationRequest[]>()\n\n for (const migration of this.localMigrations.values()) {\n const ns = migration.namespace || 'default'\n if (!byNamespace.has(ns)) {\n byNamespace.set(ns, [])\n }\n byNamespace.get(ns)!.push(migration)\n }\n\n // Sync each namespace\n const results: SyncMigrationsResult[] = []\n const errors: Error[] = []\n\n for (const [namespace, migrations] of byNamespace) {\n try {\n const result = await this.fetch.post<SyncMigrationsResult>(\n '/api/v1/admin/migrations/sync',\n {\n namespace,\n migrations: migrations.map(m => ({\n name: m.name,\n description: m.description,\n up_sql: m.up_sql,\n down_sql: m.down_sql,\n })),\n options: {\n update_if_changed: options.update_if_changed ?? true,\n auto_apply: options.auto_apply ?? false,\n dry_run: options.dry_run ?? false,\n },\n }\n )\n results.push(result)\n } catch (error) {\n // If sync failed with errors (422), extract the sync result from error.details\n const err = error as any\n if (err.status === 422 && err.details) {\n // Server returned sync results with errors - include them\n results.push(err.details as SyncMigrationsResult)\n errors.push(err)\n } else {\n // Other errors (network, auth, etc.) - propagate them\n throw error\n }\n }\n }\n\n // Combine results\n const combined: SyncMigrationsResult = {\n message: results.map(r => r.message).join('; '),\n namespace: Array.from(byNamespace.keys()).join(', '),\n summary: {\n created: results.reduce((sum, r) => sum + r.summary.created, 0),\n updated: results.reduce((sum, r) => sum + r.summary.updated, 0),\n unchanged: results.reduce((sum, r) => sum + r.summary.unchanged, 0),\n skipped: results.reduce((sum, r) => sum + r.summary.skipped, 0),\n applied: results.reduce((sum, r) => sum + r.summary.applied, 0),\n errors: results.reduce((sum, r) => sum + r.summary.errors, 0),\n },\n details: {\n created: results.flatMap(r => r.details.created),\n updated: results.flatMap(r => r.details.updated),\n unchanged: results.flatMap(r => r.details.unchanged),\n skipped: results.flatMap(r => r.details.skipped),\n applied: results.flatMap(r => r.details.applied),\n errors: results.flatMap(r => r.details.errors),\n },\n dry_run: options.dry_run ?? false,\n warnings: results.flatMap(r => r.warnings || []),\n }\n\n // Refresh schema cache after migration sync (unless dry run or no changes)\n // Only restart if migrations were actually created or updated\n // The server will restart to refresh routes, so we need to wait and handle connection drops\n const hasChanges = combined.summary.created > 0 || combined.summary.updated > 0\n if (!combined.dry_run && hasChanges) {\n try {\n await this.triggerSchemaRefreshWithRestart()\n } catch (refreshError) {\n // Log warning but don't fail the sync operation\n console.warn('Schema refresh completed with warnings:', refreshError)\n }\n }\n\n // If there were errors during sync, return error with full details\n if (errors.length > 0 || combined.summary.errors > 0) {\n const error = new Error(combined.message) as any\n error.syncResult = combined\n error.details = combined.details.errors\n return { data: combined, error }\n }\n\n return { data: combined, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Create a new migration\n *\n * @param request - Migration configuration\n * @returns Promise resolving to { data, error } tuple with created migration\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.create({\n * namespace: 'myapp',\n * name: '001_create_users',\n * up_sql: 'CREATE TABLE app.users (id UUID PRIMARY KEY, email TEXT)',\n * down_sql: 'DROP TABLE app.users',\n * description: 'Create users table'\n * })\n * ```\n */\n async create(\n request: CreateMigrationRequest\n ): Promise<{ data: Migration | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<Migration>('/api/v1/admin/migrations', request)\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * List migrations in a namespace\n *\n * @param namespace - Migration namespace (default: 'default')\n * @param status - Filter by status: 'pending', 'applied', 'failed', 'rolled_back'\n * @returns Promise resolving to { data, error } tuple with migrations array\n *\n * @example\n * ```typescript\n * // List all migrations\n * const { data, error } = await client.admin.migrations.list('myapp')\n *\n * // List only pending migrations\n * const { data, error } = await client.admin.migrations.list('myapp', 'pending')\n * ```\n */\n async list(\n namespace: string = 'default',\n status?: 'pending' | 'applied' | 'failed' | 'rolled_back'\n ): Promise<{ data: Migration[] | null; error: Error | null }> {\n try {\n const params = new URLSearchParams({ namespace })\n if (status) params.append('status', status)\n\n const data = await this.fetch.get<Migration[]>(\n `/api/v1/admin/migrations?${params.toString()}`\n )\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Get details of a specific migration\n *\n * @param name - Migration name\n * @param namespace - Migration namespace (default: 'default')\n * @returns Promise resolving to { data, error } tuple with migration details\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.get('001_create_users', 'myapp')\n * ```\n */\n async get(\n name: string,\n namespace: string = 'default'\n ): Promise<{ data: Migration | null; error: Error | null }> {\n try {\n const params = new URLSearchParams({ namespace })\n const data = await this.fetch.get<Migration>(\n `/api/v1/admin/migrations/${name}?${params.toString()}`\n )\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Update a migration (only if status is pending)\n *\n * @param name - Migration name\n * @param updates - Fields to update\n * @param namespace - Migration namespace (default: 'default')\n * @returns Promise resolving to { data, error } tuple with updated migration\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.update(\n * '001_create_users',\n * { description: 'Updated description' },\n * 'myapp'\n * )\n * ```\n */\n async update(\n name: string,\n updates: UpdateMigrationRequest,\n namespace: string = 'default'\n ): Promise<{ data: Migration | null; error: Error | null }> {\n try {\n const params = new URLSearchParams({ namespace })\n const data = await this.fetch.put<Migration>(\n `/api/v1/admin/migrations/${name}?${params.toString()}`,\n updates\n )\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Delete a migration (only if status is pending)\n *\n * @param name - Migration name\n * @param namespace - Migration namespace (default: 'default')\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.delete('001_create_users', 'myapp')\n * ```\n */\n async delete(\n name: string,\n namespace: string = 'default'\n ): Promise<{ data: null; error: Error | null }> {\n try {\n const params = new URLSearchParams({ namespace })\n await this.fetch.delete(`/api/v1/admin/migrations/${name}?${params.toString()}`)\n return { data: null, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Apply a specific migration\n *\n * @param name - Migration name\n * @param namespace - Migration namespace (default: 'default')\n * @returns Promise resolving to { data, error } tuple with result message\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.apply('001_create_users', 'myapp')\n * if (data) {\n * console.log(data.message) // \"Migration applied successfully\"\n * }\n * ```\n */\n async apply(\n name: string,\n namespace: string = 'default'\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<{ message: string }>(\n `/api/v1/admin/migrations/${name}/apply`,\n { namespace }\n )\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Rollback a specific migration\n *\n * @param name - Migration name\n * @param namespace - Migration namespace (default: 'default')\n * @returns Promise resolving to { data, error } tuple with result message\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.rollback('001_create_users', 'myapp')\n * ```\n */\n async rollback(\n name: string,\n namespace: string = 'default'\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<{ message: string }>(\n `/api/v1/admin/migrations/${name}/rollback`,\n { namespace }\n )\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Apply all pending migrations in order\n *\n * @param namespace - Migration namespace (default: 'default')\n * @returns Promise resolving to { data, error } tuple with applied/failed counts\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.applyPending('myapp')\n * if (data) {\n * console.log(`Applied: ${data.applied.length}, Failed: ${data.failed.length}`)\n * }\n * ```\n */\n async applyPending(\n namespace: string = 'default'\n ): Promise<{\n data: { message: string; applied: string[]; failed: string[] } | null\n error: Error | null\n }> {\n try {\n const data = await this.fetch.post<{\n message: string\n applied: string[]\n failed: string[]\n }>('/api/v1/admin/migrations/apply-pending', { namespace })\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Get execution history for a migration\n *\n * @param name - Migration name\n * @param namespace - Migration namespace (default: 'default')\n * @param limit - Maximum number of executions to return (default: 50, max: 100)\n * @returns Promise resolving to { data, error } tuple with execution records\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.getExecutions(\n * '001_create_users',\n * 'myapp',\n * 10\n * )\n * if (data) {\n * data.forEach(exec => {\n * console.log(`${exec.executed_at}: ${exec.action} - ${exec.status}`)\n * })\n * }\n * ```\n */\n async getExecutions(\n name: string,\n namespace: string = 'default',\n limit: number = 50\n ): Promise<{ data: MigrationExecution[] | null; error: Error | null }> {\n try {\n const params = new URLSearchParams({ namespace, limit: limit.toString() })\n const data = await this.fetch.get<MigrationExecution[]>(\n `/api/v1/admin/migrations/${name}/executions?${params.toString()}`\n )\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n}\n","/**\n * Admin Jobs module for managing job functions and executions\n * Provides administrative operations for job lifecycle management\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n JobFunction,\n CreateJobFunctionRequest,\n UpdateJobFunctionRequest,\n Job,\n JobStats,\n JobWorker,\n SyncJobsResult,\n JobFunctionSpec,\n SyncJobsOptions,\n} from \"./types\";\n\n// Optional esbuild import - will be dynamically loaded if available\nlet esbuild: typeof import(\"esbuild\") | null = null;\n\n// Optional fs import for reading deno.json\nlet fs: typeof import(\"fs\") | null = null;\n\n/**\n * Try to load esbuild for client-side bundling\n * Returns true if esbuild is available, false otherwise\n */\nasync function loadEsbuild(): Promise<boolean> {\n if (esbuild) return true;\n try {\n esbuild = await import(\"esbuild\");\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Try to load fs module\n */\nasync function loadFs(): Promise<boolean> {\n if (fs) return true;\n try {\n fs = await import(\"fs\");\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Load import map from a deno.json file\n *\n * @param denoJsonPath - Path to deno.json file\n * @returns Import map object or null if not found\n *\n * @example\n * ```typescript\n * const importMap = await loadImportMap('./deno.json')\n * const bundled = await FluxbaseAdminJobs.bundleCode({\n * code: myCode,\n * importMap,\n * })\n * ```\n */\n/**\n * esbuild plugin that marks Deno-specific imports as external\n * Use this when bundling jobs with esbuild to handle npm:, https://, and jsr: imports\n *\n * @example\n * ```typescript\n * import { denoExternalPlugin } from '@fluxbase/sdk'\n * import * as esbuild from 'esbuild'\n *\n * const result = await esbuild.build({\n * entryPoints: ['./my-job.ts'],\n * bundle: true,\n * plugins: [denoExternalPlugin],\n * // ... other options\n * })\n * ```\n */\nexport const denoExternalPlugin = {\n name: \"deno-external\",\n setup(build: {\n onResolve: (\n opts: { filter: RegExp },\n cb: (args: { path: string }) => { path: string; external: boolean },\n ) => void;\n }) {\n // Mark npm: imports as external - Deno will resolve them at runtime\n build.onResolve({ filter: /^npm:/ }, (args) => ({\n path: args.path,\n external: true,\n }));\n\n // Mark https:// and http:// imports as external\n build.onResolve({ filter: /^https?:\\/\\// }, (args) => ({\n path: args.path,\n external: true,\n }));\n\n // Mark jsr: imports as external (Deno's JSR registry)\n build.onResolve({ filter: /^jsr:/ }, (args) => ({\n path: args.path,\n external: true,\n }));\n },\n};\n\nexport async function loadImportMap(\n denoJsonPath: string,\n): Promise<Record<string, string> | null> {\n const hasFs = await loadFs();\n if (!hasFs || !fs) {\n console.warn(\"fs module not available, cannot load import map\");\n return null;\n }\n\n try {\n const content = fs.readFileSync(denoJsonPath, \"utf-8\");\n const config = JSON.parse(content);\n return config.imports || null;\n } catch (error) {\n console.warn(`Failed to load import map from ${denoJsonPath}:`, error);\n return null;\n }\n}\n\n/**\n * Options for bundling job code\n */\nexport interface BundleOptions {\n /** Entry point code */\n code: string;\n /** External modules to exclude from bundle */\n external?: string[];\n /** Source map generation */\n sourcemap?: boolean;\n /** Minify output */\n minify?: boolean;\n /** Import map from deno.json (maps aliases to npm: or file paths) */\n importMap?: Record<string, string>;\n /** Base directory for resolving relative imports (resolveDir in esbuild) */\n baseDir?: string;\n /** Additional paths to search for node_modules (useful when importing from parent directories) */\n nodePaths?: string[];\n /** Custom define values for esbuild (e.g., { 'process.env.NODE_ENV': '\"production\"' }) */\n define?: Record<string, string>;\n}\n\n/**\n * Result of bundling job code\n */\nexport interface BundleResult {\n /** Bundled code */\n code: string;\n /** Source map (if enabled) */\n sourceMap?: string;\n}\n\n/**\n * Admin Jobs manager for managing background job functions\n * Provides create, update, delete, sync, and monitoring operations\n *\n * @category Admin\n */\nexport class FluxbaseAdminJobs {\n private fetch: FluxbaseFetch;\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch;\n }\n\n /**\n * Create a new job function\n *\n * @param request - Job function configuration and code\n * @returns Promise resolving to { data, error } tuple with created job function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.create({\n * name: 'process-data',\n * code: 'export async function handler(req) { return { success: true } }',\n * enabled: true,\n * timeout_seconds: 300\n * })\n * ```\n */\n async create(\n request: CreateJobFunctionRequest,\n ): Promise<{ data: JobFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<JobFunction>(\n \"/api/v1/admin/jobs/functions\",\n request,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List all namespaces that have job functions\n *\n * @returns Promise resolving to { data, error } tuple with array of namespace strings\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.listNamespaces()\n * if (data) {\n * console.log('Available namespaces:', data)\n * }\n * ```\n */\n async listNamespaces(): Promise<{\n data: string[] | null;\n error: Error | null;\n }> {\n try {\n const response = await this.fetch.get<{ namespaces: string[] }>(\n \"/api/v1/admin/jobs/namespaces\",\n );\n return { data: response.namespaces || [\"default\"], error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List all job functions (admin view)\n *\n * @param namespace - Optional namespace filter\n * @returns Promise resolving to { data, error } tuple with array of job functions\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.list('default')\n * if (data) {\n * console.log('Job functions:', data.map(f => f.name))\n * }\n * ```\n */\n async list(\n namespace?: string,\n ): Promise<{ data: JobFunction[] | null; error: Error | null }> {\n try {\n const params = namespace ? `?namespace=${namespace}` : \"\";\n const data = await this.fetch.get<JobFunction[]>(\n `/api/v1/admin/jobs/functions${params}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get details of a specific job function\n *\n * @param namespace - Namespace\n * @param name - Job function name\n * @returns Promise resolving to { data, error } tuple with job function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.get('default', 'process-data')\n * if (data) {\n * console.log('Job function version:', data.version)\n * }\n * ```\n */\n async get(\n namespace: string,\n name: string,\n ): Promise<{ data: JobFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<JobFunction>(\n `/api/v1/admin/jobs/functions/${namespace}/${name}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Update an existing job function\n *\n * @param namespace - Namespace\n * @param name - Job function name\n * @param updates - Fields to update\n * @returns Promise resolving to { data, error } tuple with updated job function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.update('default', 'process-data', {\n * enabled: false,\n * timeout_seconds: 600\n * })\n * ```\n */\n async update(\n namespace: string,\n name: string,\n updates: UpdateJobFunctionRequest,\n ): Promise<{ data: JobFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.put<JobFunction>(\n `/api/v1/admin/jobs/functions/${namespace}/${name}`,\n updates,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Delete a job function\n *\n * @param namespace - Namespace\n * @param name - Job function name\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.delete('default', 'process-data')\n * ```\n */\n async delete(\n namespace: string,\n name: string,\n ): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.delete(\n `/api/v1/admin/jobs/functions/${namespace}/${name}`,\n );\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List all jobs (executions) across all namespaces (admin view)\n *\n * @param filters - Optional filters (status, namespace, limit, offset)\n * @returns Promise resolving to { data, error } tuple with array of jobs\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.listJobs({\n * status: 'running',\n * namespace: 'default',\n * limit: 50\n * })\n * if (data) {\n * data.forEach(job => {\n * console.log(`${job.job_name}: ${job.status}`)\n * })\n * }\n * ```\n */\n async listJobs(filters?: {\n status?: string;\n namespace?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ data: Job[] | null; error: Error | null }> {\n try {\n const params = new URLSearchParams();\n if (filters?.status) params.append(\"status\", filters.status);\n if (filters?.namespace) params.append(\"namespace\", filters.namespace);\n if (filters?.limit) params.append(\"limit\", filters.limit.toString());\n if (filters?.offset) params.append(\"offset\", filters.offset.toString());\n\n const queryString = params.toString();\n const data = await this.fetch.get<Job[]>(\n `/api/v1/admin/jobs/queue${queryString ? `?${queryString}` : \"\"}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get details of a specific job (execution)\n *\n * @param jobId - Job ID\n * @returns Promise resolving to { data, error } tuple with job details\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.getJob('550e8400-e29b-41d4-a716-446655440000')\n * if (data) {\n * console.log(`Job ${data.job_name}: ${data.status}`)\n * }\n * ```\n */\n async getJob(\n jobId: string,\n ): Promise<{ data: Job | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<Job>(\n `/api/v1/admin/jobs/queue/${jobId}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Cancel a running or pending job\n *\n * @param jobId - Job ID\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.cancel('550e8400-e29b-41d4-a716-446655440000')\n * ```\n */\n async cancel(jobId: string): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.post(`/api/v1/admin/jobs/queue/${jobId}/cancel`, {});\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Terminate a running job immediately\n *\n * @param jobId - Job ID\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.terminate('550e8400-e29b-41d4-a716-446655440000')\n * ```\n */\n async terminate(jobId: string): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.post(`/api/v1/admin/jobs/queue/${jobId}/terminate`, {});\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Retry a failed job\n *\n * @param jobId - Job ID\n * @returns Promise resolving to { data, error } tuple with new job\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.retry('550e8400-e29b-41d4-a716-446655440000')\n * ```\n */\n async retry(\n jobId: string,\n ): Promise<{ data: Job | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<Job>(\n `/api/v1/admin/jobs/queue/${jobId}/retry`,\n {},\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get job statistics\n *\n * @param namespace - Optional namespace filter\n * @returns Promise resolving to { data, error } tuple with job stats\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.getStats('default')\n * if (data) {\n * console.log(`Pending: ${data.pending}, Running: ${data.running}`)\n * }\n * ```\n */\n async getStats(\n namespace?: string,\n ): Promise<{ data: JobStats | null; error: Error | null }> {\n try {\n const params = namespace ? `?namespace=${namespace}` : \"\";\n const data = await this.fetch.get<JobStats>(\n `/api/v1/admin/jobs/stats${params}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List active workers\n *\n * @returns Promise resolving to { data, error } tuple with array of workers\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.listWorkers()\n * if (data) {\n * data.forEach(worker => {\n * console.log(`Worker ${worker.id}: ${worker.current_jobs} jobs`)\n * })\n * }\n * ```\n */\n async listWorkers(): Promise<{\n data: JobWorker[] | null;\n error: Error | null;\n }> {\n try {\n const data = await this.fetch.get<JobWorker[]>(\n \"/api/v1/admin/jobs/workers\",\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Sync multiple job functions to a namespace\n *\n * Can sync from:\n * 1. Filesystem (if no jobs provided) - loads from configured jobs directory\n * 2. API payload (if jobs array provided) - syncs provided job specifications\n *\n * Requires service_role or admin authentication.\n *\n * @param options - Sync options including namespace and optional jobs array\n * @returns Promise resolving to { data, error } tuple with sync results\n *\n * @example\n * ```typescript\n * // Sync from filesystem\n * const { data, error } = await client.admin.jobs.sync({ namespace: 'default' })\n *\n * // Sync with pre-bundled code (client-side bundling)\n * const bundled = await FluxbaseAdminJobs.bundleCode({ code: myJobCode })\n * const { data, error } = await client.admin.jobs.sync({\n * namespace: 'default',\n * functions: [{\n * name: 'my-job',\n * code: bundled.code,\n * is_pre_bundled: true,\n * original_code: myJobCode,\n * }],\n * options: {\n * delete_missing: true, // Remove jobs not in this sync\n * dry_run: false, // Preview changes without applying\n * }\n * })\n *\n * if (data) {\n * console.log(`Synced: ${data.summary.created} created, ${data.summary.updated} updated`)\n * }\n * ```\n */\n async sync(\n options: SyncJobsOptions | string,\n ): Promise<{ data: SyncJobsResult | null; error: Error | null }> {\n try {\n // Support legacy string-only namespace argument\n const syncOptions: SyncJobsOptions =\n typeof options === \"string\" ? { namespace: options } : options;\n\n const data = await this.fetch.post<SyncJobsResult>(\n \"/api/v1/admin/jobs/sync\",\n {\n namespace: syncOptions.namespace,\n jobs: syncOptions.functions,\n options: {\n delete_missing: syncOptions.options?.delete_missing ?? false,\n dry_run: syncOptions.options?.dry_run ?? false,\n },\n },\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Sync job functions with automatic client-side bundling\n *\n * This is a convenience method that bundles all job code using esbuild\n * before sending to the server. Requires esbuild as a peer dependency.\n *\n * @param options - Sync options including namespace and jobs array\n * @param bundleOptions - Optional bundling configuration\n * @returns Promise resolving to { data, error } tuple with sync results\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.syncWithBundling({\n * namespace: 'default',\n * functions: [\n * { name: 'process-data', code: processDataCode },\n * { name: 'send-email', code: sendEmailCode },\n * ],\n * options: { delete_missing: true }\n * })\n * ```\n */\n async syncWithBundling(\n options: SyncJobsOptions,\n bundleOptions?: Partial<BundleOptions>,\n ): Promise<{ data: SyncJobsResult | null; error: Error | null }> {\n if (!options.functions || options.functions.length === 0) {\n return this.sync(options);\n }\n\n // Check if esbuild is available\n const hasEsbuild = await loadEsbuild();\n if (!hasEsbuild) {\n return {\n data: null,\n error: new Error(\n \"esbuild is required for client-side bundling. Install it with: npm install esbuild\",\n ),\n };\n }\n\n try {\n // Bundle each function\n const bundledFunctions: JobFunctionSpec[] = await Promise.all(\n options.functions.map(async (fn) => {\n // Skip if already pre-bundled\n if (fn.is_pre_bundled) {\n return fn;\n }\n\n const bundled = await FluxbaseAdminJobs.bundleCode({\n // Apply global bundle options first\n ...bundleOptions,\n // Then override with per-function values (these take priority)\n code: fn.code,\n // Use function's sourceDir for resolving relative imports\n baseDir: fn.sourceDir || bundleOptions?.baseDir,\n // Use function's nodePaths for additional module resolution\n nodePaths: fn.nodePaths || bundleOptions?.nodePaths,\n });\n\n return {\n ...fn,\n code: bundled.code,\n original_code: fn.code,\n is_pre_bundled: true,\n };\n }),\n );\n\n // Sync with pre-bundled code\n return this.sync({\n ...options,\n functions: bundledFunctions,\n });\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Bundle job code using esbuild (client-side)\n *\n * Transforms and bundles TypeScript/JavaScript code into a single file\n * that can be executed by the Fluxbase jobs runtime.\n *\n * Requires esbuild as a peer dependency.\n *\n * @param options - Bundle options including source code\n * @returns Promise resolving to bundled code\n * @throws Error if esbuild is not available\n *\n * @example\n * ```typescript\n * const bundled = await FluxbaseAdminJobs.bundleCode({\n * code: `\n * import { helper } from './utils'\n * export async function handler(req) {\n * return helper(req.payload)\n * }\n * `,\n * minify: true,\n * })\n *\n * // Use bundled code in sync\n * await client.admin.jobs.sync({\n * namespace: 'default',\n * functions: [{\n * name: 'my-job',\n * code: bundled.code,\n * is_pre_bundled: true,\n * }]\n * })\n * ```\n */\n static async bundleCode(options: BundleOptions): Promise<BundleResult> {\n const hasEsbuild = await loadEsbuild();\n if (!hasEsbuild || !esbuild) {\n throw new Error(\n \"esbuild is required for bundling. Install it with: npm install esbuild\",\n );\n }\n\n // Process import map to extract externals and aliases\n const externals = [...(options.external ?? [])];\n const alias: Record<string, string> = {};\n\n if (options.importMap) {\n for (const [key, value] of Object.entries(options.importMap)) {\n // npm: imports should be marked as external - Deno will resolve them at runtime\n if (value.startsWith(\"npm:\")) {\n // Add the import key as external (e.g., \"@streamparser/json\")\n externals.push(key);\n } else if (\n value.startsWith(\"https://\") ||\n value.startsWith(\"http://\")\n ) {\n // URL imports should also be external - Deno will fetch them at runtime\n externals.push(key);\n } else if (\n value.startsWith(\"/\") ||\n value.startsWith(\"./\") ||\n value.startsWith(\"../\")\n ) {\n // Local file paths - create alias for esbuild\n alias[key] = value;\n } else {\n // Other imports (bare specifiers) - mark as external\n externals.push(key);\n }\n }\n }\n\n // Create a plugin to handle Deno-specific imports (npm:, https://, http://)\n const denoExternalPlugin: import(\"esbuild\").Plugin = {\n name: \"deno-external\",\n setup(build) {\n // Mark npm: imports as external\n build.onResolve({ filter: /^npm:/ }, (args) => ({\n path: args.path,\n external: true,\n }));\n\n // Mark https:// and http:// imports as external\n build.onResolve({ filter: /^https?:\\/\\// }, (args) => ({\n path: args.path,\n external: true,\n }));\n\n // Mark jsr: imports as external (Deno's JSR registry)\n build.onResolve({ filter: /^jsr:/ }, (args) => ({\n path: args.path,\n external: true,\n }));\n },\n };\n\n const resolveDir = options.baseDir || process.cwd?.() || \"/\";\n\n const buildOptions: import(\"esbuild\").BuildOptions = {\n stdin: {\n contents: options.code,\n loader: \"ts\",\n resolveDir,\n },\n // Set absWorkingDir for consistent path resolution\n absWorkingDir: resolveDir,\n bundle: true,\n write: false,\n format: \"esm\",\n // Use 'node' platform for better node_modules resolution (Deno supports Node APIs)\n platform: \"node\",\n target: \"esnext\",\n minify: options.minify ?? false,\n sourcemap: options.sourcemap ? \"inline\" : false,\n external: externals,\n plugins: [denoExternalPlugin],\n // Preserve handler export\n treeShaking: true,\n // Resolve .ts, .js, .mjs extensions\n resolveExtensions: [\".ts\", \".tsx\", \".js\", \".mjs\", \".json\"],\n // ESM conditions for better module resolution\n conditions: [\"import\", \"module\"],\n };\n\n // Add alias if we have any\n if (Object.keys(alias).length > 0) {\n buildOptions.alias = alias;\n }\n\n // Add nodePaths for resolving modules from additional directories\n if (options.nodePaths && options.nodePaths.length > 0) {\n buildOptions.nodePaths = options.nodePaths;\n }\n\n // Add custom define values\n if (options.define) {\n buildOptions.define = options.define;\n }\n\n const result = await esbuild.build(buildOptions);\n\n const output = result.outputFiles?.[0];\n if (!output) {\n throw new Error(\"Bundling failed: no output generated\");\n }\n\n return {\n code: output.text,\n sourceMap: options.sourcemap ? output.text : undefined,\n };\n }\n}\n","import type { FluxbaseFetch } from \"./fetch\";\nimport type {\n AdminAuthResponse,\n AdminLoginRequest,\n AdminMeResponse,\n AdminRefreshRequest,\n AdminRefreshResponse,\n AdminSetupRequest,\n AdminSetupStatusResponse,\n DeleteUserResponse,\n EnrichedUser,\n InviteUserRequest,\n InviteUserResponse,\n ListUsersOptions,\n ListUsersResponse,\n ResetUserPasswordResponse,\n DataResponse,\n VoidResponse,\n} from \"./types\";\nimport { wrapAsync, wrapAsyncVoid } from \"./utils/error-handling\";\nimport { FluxbaseSettings, EmailTemplateManager } from \"./settings\";\nimport { DDLManager } from \"./ddl\";\nimport { FluxbaseOAuth } from \"./oauth\";\nimport { ImpersonationManager } from \"./impersonation\";\nimport { FluxbaseManagement } from \"./management\";\nimport { FluxbaseAdminFunctions } from \"./admin-functions\";\nimport { FluxbaseAdminMigrations } from \"./admin-migrations\";\nimport { FluxbaseAdminJobs } from \"./admin-jobs\";\n\n/**\n * Admin client for managing Fluxbase instance\n */\nexport class FluxbaseAdmin {\n private fetch: FluxbaseFetch;\n private adminToken: string | null = null;\n\n /**\n * Settings manager for system and application settings\n */\n public settings: FluxbaseSettings;\n\n /**\n * DDL manager for database schema and table operations\n */\n public ddl: DDLManager;\n\n /**\n * OAuth configuration manager for provider and auth settings\n */\n public oauth: FluxbaseOAuth;\n\n /**\n * Impersonation manager for user impersonation and audit trail\n */\n public impersonation: ImpersonationManager;\n\n /**\n * Management namespace for API keys, webhooks, and invitations\n */\n public management: FluxbaseManagement;\n\n /**\n * Email template manager for customizing authentication and notification emails\n */\n public emailTemplates: EmailTemplateManager;\n\n /**\n * Functions manager for edge function management (create, update, delete, sync)\n */\n public functions: FluxbaseAdminFunctions;\n\n /**\n * Jobs manager for background job management (create, update, delete, sync, monitoring)\n */\n public jobs: FluxbaseAdminJobs;\n\n /**\n * Migrations manager for database migration operations (create, apply, rollback, sync)\n */\n public migrations: FluxbaseAdminMigrations;\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch;\n this.settings = new FluxbaseSettings(fetch);\n this.ddl = new DDLManager(fetch);\n this.oauth = new FluxbaseOAuth(fetch);\n this.impersonation = new ImpersonationManager(fetch);\n this.management = new FluxbaseManagement(fetch);\n this.emailTemplates = new EmailTemplateManager(fetch);\n this.functions = new FluxbaseAdminFunctions(fetch);\n this.jobs = new FluxbaseAdminJobs(fetch);\n this.migrations = new FluxbaseAdminMigrations(fetch);\n }\n\n /**\n * Set admin authentication token\n */\n setToken(token: string) {\n this.adminToken = token;\n this.fetch.setAuthToken(token);\n }\n\n /**\n * Get current admin token\n */\n getToken(): string | null {\n return this.adminToken;\n }\n\n /**\n * Clear admin token\n */\n clearToken() {\n this.adminToken = null;\n this.fetch.setAuthToken(null);\n }\n\n // ============================================================================\n // Admin Authentication\n // ============================================================================\n\n /**\n * Check if initial admin setup is needed\n *\n * @returns Setup status indicating if initial setup is required\n *\n * @example\n * ```typescript\n * const status = await admin.getSetupStatus();\n * if (status.needs_setup) {\n * console.log('Initial setup required');\n * }\n * ```\n */\n async getSetupStatus(): Promise<DataResponse<AdminSetupStatusResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.get<AdminSetupStatusResponse>(\n \"/api/v1/admin/setup/status\",\n );\n });\n }\n\n /**\n * Perform initial admin setup\n *\n * Creates the first admin user and completes initial setup.\n * This endpoint can only be called once.\n *\n * @param email - Admin email address\n * @param password - Admin password (minimum 12 characters)\n * @param name - Admin display name\n * @returns Authentication response with tokens\n *\n * @example\n * ```typescript\n * const response = await admin.setup({\n * email: 'admin@example.com',\n * password: 'SecurePassword123!',\n * name: 'Admin User'\n * });\n *\n * // Store tokens\n * localStorage.setItem('admin_token', response.access_token);\n * ```\n */\n async setup(request: AdminSetupRequest): Promise<DataResponse<AdminAuthResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AdminAuthResponse>(\n \"/api/v1/admin/setup\",\n request,\n );\n this.setToken(response.access_token);\n return response;\n });\n }\n\n /**\n * Admin login\n *\n * Authenticate as an admin user\n *\n * @param email - Admin email\n * @param password - Admin password\n * @returns Authentication response with tokens\n *\n * @example\n * ```typescript\n * const response = await admin.login({\n * email: 'admin@example.com',\n * password: 'password123'\n * });\n *\n * // Token is automatically set in the client\n * console.log('Logged in as:', response.user.email);\n * ```\n */\n async login(request: AdminLoginRequest): Promise<DataResponse<AdminAuthResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AdminAuthResponse>(\n \"/api/v1/admin/login\",\n request,\n );\n this.setToken(response.access_token);\n return response;\n });\n }\n\n /**\n * Refresh admin access token\n *\n * @param refreshToken - Refresh token\n * @returns New access and refresh tokens\n *\n * @example\n * ```typescript\n * const refreshToken = localStorage.getItem('admin_refresh_token');\n * const response = await admin.refreshToken({ refresh_token: refreshToken });\n *\n * // Update stored tokens\n * localStorage.setItem('admin_token', response.access_token);\n * localStorage.setItem('admin_refresh_token', response.refresh_token);\n * ```\n */\n async refreshToken(\n request: AdminRefreshRequest,\n ): Promise<DataResponse<AdminRefreshResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AdminRefreshResponse>(\n \"/api/v1/admin/refresh\",\n request,\n );\n this.setToken(response.access_token);\n return response;\n });\n }\n\n /**\n * Admin logout\n *\n * Invalidates the current admin session\n *\n * @example\n * ```typescript\n * await admin.logout();\n * localStorage.removeItem('admin_token');\n * ```\n */\n async logout(): Promise<VoidResponse> {\n return wrapAsyncVoid(async () => {\n await this.fetch.post<{ message: string }>(\"/api/v1/admin/logout\", {});\n this.clearToken();\n });\n }\n\n /**\n * Get current admin user information\n *\n * @returns Current admin user details\n *\n * @example\n * ```typescript\n * const { user } = await admin.me();\n * console.log('Logged in as:', user.email);\n * console.log('Role:', user.role);\n * ```\n */\n async me(): Promise<DataResponse<AdminMeResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.get<AdminMeResponse>(\"/api/v1/admin/me\");\n });\n }\n\n // ============================================================================\n // User Management\n // ============================================================================\n\n /**\n * List all users\n *\n * @param options - Filter and pagination options\n * @returns List of users with metadata\n *\n * @example\n * ```typescript\n * // List all users\n * const { users, total } = await admin.listUsers();\n *\n * // List with filters\n * const result = await admin.listUsers({\n * exclude_admins: true,\n * search: 'john',\n * limit: 50,\n * type: 'app'\n * });\n * ```\n */\n async listUsers(options: ListUsersOptions = {}): Promise<DataResponse<ListUsersResponse>> {\n return wrapAsync(async () => {\n const params = new URLSearchParams();\n\n if (options.exclude_admins !== undefined) {\n params.append(\"exclude_admins\", String(options.exclude_admins));\n }\n if (options.search) {\n params.append(\"search\", options.search);\n }\n if (options.limit !== undefined) {\n params.append(\"limit\", String(options.limit));\n }\n if (options.type) {\n params.append(\"type\", options.type);\n }\n\n const queryString = params.toString();\n const url = queryString\n ? `/api/v1/admin/users?${queryString}`\n : \"/api/v1/admin/users\";\n\n return await this.fetch.get<ListUsersResponse>(url);\n });\n }\n\n /**\n * Get a user by ID\n *\n * Fetch a single user's details by their user ID\n *\n * @param userId - User ID to fetch\n * @param type - User type ('app' or 'dashboard')\n * @returns User details with metadata\n *\n * @example\n * ```typescript\n * // Get an app user\n * const user = await admin.getUserById('user-123');\n *\n * // Get a dashboard user\n * const dashboardUser = await admin.getUserById('admin-456', 'dashboard');\n * console.log('User email:', dashboardUser.email);\n * console.log('Last login:', dashboardUser.last_login_at);\n * ```\n */\n async getUserById(\n userId: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<EnrichedUser>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}?type=${type}`;\n return await this.fetch.get<EnrichedUser>(url);\n });\n }\n\n /**\n * Invite a new user\n *\n * Creates a new user and optionally sends an invitation email\n *\n * @param request - User invitation details\n * @param type - User type ('app' or 'dashboard')\n * @returns Created user and invitation details\n *\n * @example\n * ```typescript\n * const response = await admin.inviteUser({\n * email: 'newuser@example.com',\n * role: 'user',\n * send_email: true\n * });\n *\n * console.log('User invited:', response.user.email);\n * console.log('Invitation link:', response.invitation_link);\n * ```\n */\n async inviteUser(\n request: InviteUserRequest,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<InviteUserResponse>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/invite?type=${type}`;\n return await this.fetch.post<InviteUserResponse>(url, request);\n });\n }\n\n /**\n * Delete a user\n *\n * Permanently deletes a user and all associated data\n *\n * @param userId - User ID to delete\n * @param type - User type ('app' or 'dashboard')\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await admin.deleteUser('user-uuid');\n * console.log('User deleted');\n * ```\n */\n async deleteUser(\n userId: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<DeleteUserResponse>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}?type=${type}`;\n return await this.fetch.delete<DeleteUserResponse>(url);\n });\n }\n\n /**\n * Update user role\n *\n * Changes a user's role\n *\n * @param userId - User ID\n * @param role - New role\n * @param type - User type ('app' or 'dashboard')\n * @returns Updated user\n *\n * @example\n * ```typescript\n * const user = await admin.updateUserRole('user-uuid', 'admin');\n * console.log('User role updated:', user.role);\n * ```\n */\n async updateUserRole(\n userId: string,\n role: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<EnrichedUser>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}/role?type=${type}`;\n return await this.fetch.patch<EnrichedUser>(url, { role });\n });\n }\n\n /**\n * Reset user password\n *\n * Generates a new password for the user and optionally sends it via email\n *\n * @param userId - User ID\n * @param type - User type ('app' or 'dashboard')\n * @returns Reset confirmation message\n *\n * @example\n * ```typescript\n * const response = await admin.resetUserPassword('user-uuid');\n * console.log(response.message);\n * ```\n */\n async resetUserPassword(\n userId: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<ResetUserPasswordResponse>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}/reset-password?type=${type}`;\n return await this.fetch.post<ResetUserPasswordResponse>(url, {});\n });\n }\n}\n","/**\n * PostgreSQL query builder for Fluxbase SDK\n * Inspired by Supabase's PostgREST client\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n CountType,\n FilterOperator,\n OrderBy,\n PostgrestResponse,\n SelectOptions,\n UpsertOptions,\n} from \"./types\";\n\nexport class QueryBuilder<T = unknown>\n implements PromiseLike<PostgrestResponse<T>>\n{\n private fetch: FluxbaseFetch;\n private table: string;\n private schema?: string;\n private selectQuery: string = \"*\";\n private filters: Array<{\n column: string;\n operator: FilterOperator;\n value: unknown;\n }> = [];\n private orFilters: string[] = [];\n private andFilters: string[] = [];\n private orderBys: OrderBy[] = [];\n private limitValue?: number;\n private offsetValue?: number;\n private singleRow: boolean = false;\n private maybeSingleRow: boolean = false;\n private groupByColumns?: string[];\n private operationType: \"select\" | \"insert\" | \"update\" | \"delete\" = \"select\";\n private countType?: CountType;\n private headOnly: boolean = false;\n private insertData?: Partial<T> | Array<Partial<T>>;\n private updateData?: Partial<T>;\n\n constructor(fetch: FluxbaseFetch, table: string, schema?: string) {\n this.fetch = fetch;\n this.table = table;\n this.schema = schema;\n }\n\n /**\n * Build the API path for this table, including schema if specified\n */\n private buildTablePath(): string {\n return this.schema\n ? `/api/v1/tables/${this.schema}/${this.table}`\n : `/api/v1/tables/${this.table}`;\n }\n\n /**\n * Select columns to return\n * @example select('*')\n * @example select('id, name, email')\n * @example select('id, name, posts(title, content)')\n * @example select('*', { count: 'exact' }) // Get exact count\n * @example select('*', { count: 'exact', head: true }) // Get count only (no data)\n */\n select(columns: string = \"*\", options?: SelectOptions): this {\n this.selectQuery = columns;\n if (options?.count) {\n this.countType = options.count;\n }\n if (options?.head) {\n this.headOnly = true;\n }\n return this;\n }\n\n /**\n * Insert a single row or multiple rows\n */\n insert(data: Partial<T> | Array<Partial<T>>): this {\n this.operationType = \"insert\";\n this.insertData = data;\n return this;\n }\n\n /**\n * Upsert (insert or update) rows (Supabase-compatible)\n * @param data - Row(s) to upsert\n * @param options - Upsert options (onConflict, ignoreDuplicates, defaultToNull)\n */\n async upsert(\n data: Partial<T> | Array<Partial<T>>,\n options?: UpsertOptions,\n ): Promise<PostgrestResponse<T>> {\n const body = Array.isArray(data) ? data : data;\n\n // Build Prefer header based on options\n const preferValues: string[] = [];\n\n if (options?.ignoreDuplicates) {\n preferValues.push(\"resolution=ignore-duplicates\");\n } else {\n preferValues.push(\"resolution=merge-duplicates\");\n }\n\n if (options?.defaultToNull) {\n preferValues.push(\"missing=default\");\n }\n\n const headers: Record<string, string> = {\n Prefer: preferValues.join(\",\"),\n };\n\n // Add onConflict as query parameter if specified\n let path = this.buildTablePath();\n if (options?.onConflict) {\n path += `?on_conflict=${encodeURIComponent(options.onConflict)}`;\n }\n\n const response = await this.fetch.post<T>(path, body, { headers });\n\n return {\n data: response,\n error: null,\n count: Array.isArray(data) ? data.length : 1,\n status: 201,\n statusText: \"Created\",\n };\n }\n\n /**\n * Update rows matching the filters\n */\n update(data: Partial<T>): this {\n this.operationType = \"update\";\n this.updateData = data;\n return this;\n }\n\n /**\n * Delete rows matching the filters\n */\n delete(): this {\n this.operationType = \"delete\";\n return this;\n }\n\n /**\n * Equal to\n */\n eq(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"eq\", value });\n return this;\n }\n\n /**\n * Not equal to\n */\n neq(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"neq\", value });\n return this;\n }\n\n /**\n * Greater than\n */\n gt(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"gt\", value });\n return this;\n }\n\n /**\n * Greater than or equal to\n */\n gte(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"gte\", value });\n return this;\n }\n\n /**\n * Less than\n */\n lt(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"lt\", value });\n return this;\n }\n\n /**\n * Less than or equal to\n */\n lte(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"lte\", value });\n return this;\n }\n\n /**\n * Pattern matching (case-sensitive)\n */\n like(column: string, pattern: string): this {\n this.filters.push({ column, operator: \"like\", value: pattern });\n return this;\n }\n\n /**\n * Pattern matching (case-insensitive)\n */\n ilike(column: string, pattern: string): this {\n this.filters.push({ column, operator: \"ilike\", value: pattern });\n return this;\n }\n\n /**\n * Check if value is null or not null\n */\n is(column: string, value: null | boolean): this {\n this.filters.push({ column, operator: \"is\", value });\n return this;\n }\n\n /**\n * Check if value is in array\n */\n in(column: string, values: unknown[]): this {\n this.filters.push({ column, operator: \"in\", value: values });\n return this;\n }\n\n /**\n * Contains (for arrays and JSONB)\n */\n contains(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"cs\", value });\n return this;\n }\n\n /**\n * Full-text search\n */\n textSearch(column: string, query: string): this {\n this.filters.push({ column, operator: \"fts\", value: query });\n return this;\n }\n\n /**\n * Negate a filter condition (Supabase-compatible)\n * @example not('status', 'eq', 'deleted')\n * @example not('completed_at', 'is', null)\n */\n not(column: string, operator: FilterOperator, value: unknown): this {\n this.filters.push({\n column,\n operator: \"not\" as FilterOperator,\n value: `${operator}.${this.formatValue(value)}`,\n });\n return this;\n }\n\n /**\n * Apply OR logic to filters (Supabase-compatible)\n * @example or('status.eq.active,status.eq.pending')\n * @example or('id.eq.2,name.eq.Han')\n */\n or(filters: string): this {\n this.orFilters.push(filters);\n return this;\n }\n\n /**\n * Apply AND logic to filters (Supabase-compatible)\n * Groups multiple conditions that must all be true\n * @example and('status.eq.active,verified.eq.true')\n * @example and('age.gte.18,age.lte.65')\n */\n and(filters: string): this {\n this.andFilters.push(filters);\n return this;\n }\n\n /**\n * Match multiple columns with exact values (Supabase-compatible)\n * Shorthand for multiple .eq() calls\n * @example match({ id: 1, status: 'active', role: 'admin' })\n */\n match(conditions: Record<string, unknown>): this {\n for (const [column, value] of Object.entries(conditions)) {\n this.eq(column, value);\n }\n return this;\n }\n\n /**\n * Generic filter method using PostgREST syntax (Supabase-compatible)\n * @example filter('name', 'in', '(\"Han\",\"Yoda\")')\n * @example filter('age', 'gte', '18')\n */\n filter(column: string, operator: FilterOperator, value: unknown): this {\n this.filters.push({ column, operator, value });\n return this;\n }\n\n /**\n * Check if column is contained by value (Supabase-compatible)\n * For arrays and JSONB\n * @example containedBy('tags', '[\"news\",\"update\"]')\n */\n containedBy(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"cd\", value });\n return this;\n }\n\n /**\n * Check if arrays have common elements (Supabase-compatible)\n * @example overlaps('tags', '[\"news\",\"sports\"]')\n */\n overlaps(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"ov\", value });\n return this;\n }\n\n // PostGIS Spatial Query Methods\n\n /**\n * Check if geometries intersect (PostGIS ST_Intersects)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test intersection with\n * @example intersects('location', { type: 'Point', coordinates: [-122.4, 37.8] })\n */\n intersects(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_intersects\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Check if geometry A contains geometry B (PostGIS ST_Contains)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test containment\n * @example contains('region', { type: 'Point', coordinates: [-122.4, 37.8] })\n */\n stContains(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_contains\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Check if geometry A is within geometry B (PostGIS ST_Within)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test containment within\n * @example within('point', { type: 'Polygon', coordinates: [[...]] })\n */\n within(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_within\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Check if geometries touch (PostGIS ST_Touches)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test touching\n * @example touches('boundary', { type: 'LineString', coordinates: [[...]] })\n */\n touches(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_touches\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Check if geometries cross (PostGIS ST_Crosses)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test crossing\n * @example crosses('road', { type: 'LineString', coordinates: [[...]] })\n */\n crosses(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_crosses\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Check if geometries spatially overlap (PostGIS ST_Overlaps)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test overlap\n * @example stOverlaps('area', { type: 'Polygon', coordinates: [[...]] })\n */\n stOverlaps(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_overlaps\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Order results\n */\n order(\n column: string,\n options?: { ascending?: boolean; nullsFirst?: boolean },\n ): this {\n this.orderBys.push({\n column,\n direction: options?.ascending === false ? \"desc\" : \"asc\",\n nulls: options?.nullsFirst ? \"first\" : \"last\",\n });\n return this;\n }\n\n /**\n * Limit number of rows returned\n */\n limit(count: number): this {\n this.limitValue = count;\n return this;\n }\n\n /**\n * Skip rows\n */\n offset(count: number): this {\n this.offsetValue = count;\n return this;\n }\n\n /**\n * Return a single row (adds limit(1))\n * Errors if no rows found\n */\n single(): this {\n this.singleRow = true;\n this.limitValue = 1;\n return this;\n }\n\n /**\n * Return a single row or null (adds limit(1))\n * Does not error if no rows found (Supabase-compatible)\n * @example\n * ```typescript\n * // Returns null instead of erroring when no row exists\n * const { data, error } = await client\n * .from('users')\n * .select('*')\n * .eq('id', 999)\n * .maybeSingle()\n * // data will be null if no row found\n * ```\n */\n maybeSingle(): this {\n this.maybeSingleRow = true;\n this.limitValue = 1;\n return this;\n }\n\n /**\n * Range selection (pagination)\n */\n range(from: number, to: number): this {\n this.offsetValue = from;\n this.limitValue = to - from + 1;\n return this;\n }\n\n /**\n * Group results by one or more columns (for use with aggregations)\n *\n * @param columns - Column name(s) to group by\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Group by single column\n * const { data } = await client.from('orders')\n * .count('*')\n * .groupBy('status')\n * .execute()\n *\n * // Group by multiple columns\n * const { data } = await client.from('sales')\n * .sum('amount')\n * .groupBy(['region', 'product_category'])\n * .execute()\n * ```\n *\n * @category Aggregation\n */\n groupBy(columns: string | string[]): this {\n this.groupByColumns = Array.isArray(columns) ? columns : [columns];\n return this;\n }\n\n /**\n * Count rows or a specific column\n *\n * @param column - Column to count (default: '*' for row count)\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Count all rows\n * const { data } = await client.from('users').count().execute()\n * // Returns: { count: 150 }\n *\n * // Count non-null values in a column\n * const { data } = await client.from('orders').count('completed_at').execute()\n *\n * // Count with grouping\n * const { data } = await client.from('products')\n * .count('*')\n * .groupBy('category')\n * .execute()\n * // Returns: [{ category: 'electronics', count: 45 }, { category: 'books', count: 23 }]\n * ```\n *\n * @category Aggregation\n */\n count(column: string = \"*\"): this {\n this.selectQuery = `count(${column})`;\n return this;\n }\n\n /**\n * Calculate the sum of a numeric column\n *\n * @param column - Column to sum\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Sum all prices\n * const { data } = await client.from('products').sum('price').execute()\n * // Returns: { sum_price: 15420.50 }\n *\n * // Sum by category\n * const { data } = await client.from('orders')\n * .sum('total')\n * .groupBy('status')\n * .execute()\n * // Returns: [{ status: 'completed', sum_total: 12500 }, { status: 'pending', sum_total: 3200 }]\n * ```\n *\n * @category Aggregation\n */\n sum(column: string): this {\n this.selectQuery = `sum(${column})`;\n return this;\n }\n\n /**\n * Calculate the average of a numeric column\n *\n * @param column - Column to average\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Average price\n * const { data } = await client.from('products').avg('price').execute()\n * // Returns: { avg_price: 129.99 }\n *\n * // Average by category\n * const { data } = await client.from('products')\n * .avg('price')\n * .groupBy('category')\n * .execute()\n * ```\n *\n * @category Aggregation\n */\n avg(column: string): this {\n this.selectQuery = `avg(${column})`;\n return this;\n }\n\n /**\n * Find the minimum value in a column\n *\n * @param column - Column to find minimum value\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Find lowest price\n * const { data } = await client.from('products').min('price').execute()\n * // Returns: { min_price: 9.99 }\n *\n * // Find earliest date\n * const { data } = await client.from('orders').min('created_at').execute()\n * ```\n *\n * @category Aggregation\n */\n min(column: string): this {\n this.selectQuery = `min(${column})`;\n return this;\n }\n\n /**\n * Find the maximum value in a column\n *\n * @param column - Column to find maximum value\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Find highest price\n * const { data } = await client.from('products').max('price').execute()\n * // Returns: { max_price: 1999.99 }\n *\n * // Find most recent order\n * const { data } = await client.from('orders').max('created_at').execute()\n * ```\n *\n * @category Aggregation\n */\n max(column: string): this {\n this.selectQuery = `max(${column})`;\n return this;\n }\n\n /**\n * Insert multiple rows in a single request (batch insert)\n *\n * This is a convenience method that explicitly shows intent for batch operations.\n * Internally calls `insert()` with an array.\n *\n * @param rows - Array of row objects to insert\n * @returns Promise with the inserted rows\n *\n * @example\n * ```typescript\n * // Insert multiple users at once\n * const { data } = await client.from('users').insertMany([\n * { name: 'Alice', email: 'alice@example.com' },\n * { name: 'Bob', email: 'bob@example.com' },\n * { name: 'Charlie', email: 'charlie@example.com' }\n * ])\n * ```\n *\n * @category Batch Operations\n */\n async insertMany(rows: Array<Partial<T>>): Promise<PostgrestResponse<T>> {\n return this.insert(rows).execute();\n }\n\n /**\n * Update multiple rows matching the filters (batch update)\n *\n * Updates all rows that match the current query filters.\n * This is a convenience method that explicitly shows intent for batch operations.\n *\n * @param data - Data to update matching rows with\n * @returns Promise with the updated rows\n *\n * @example\n * ```typescript\n * // Apply discount to all electronics\n * const { data } = await client.from('products')\n * .eq('category', 'electronics')\n * .updateMany({ discount: 10, updated_at: new Date() })\n *\n * // Mark all pending orders as processing\n * const { data } = await client.from('orders')\n * .eq('status', 'pending')\n * .updateMany({ status: 'processing' })\n * ```\n *\n * @category Batch Operations\n */\n async updateMany(data: Partial<T>): Promise<PostgrestResponse<T>> {\n return this.update(data).execute();\n }\n\n /**\n * Delete multiple rows matching the filters (batch delete)\n *\n * Deletes all rows that match the current query filters.\n * This is a convenience method that explicitly shows intent for batch operations.\n *\n * @returns Promise confirming deletion\n *\n * @example\n * ```typescript\n * // Delete all inactive users\n * await client.from('users')\n * .eq('active', false)\n * .deleteMany()\n *\n * // Delete old logs\n * await client.from('logs')\n * .lt('created_at', '2024-01-01')\n * .deleteMany()\n * ```\n *\n * @category Batch Operations\n */\n async deleteMany(): Promise<PostgrestResponse<null>> {\n return this.delete().execute() as Promise<PostgrestResponse<null>>;\n }\n\n /**\n * Execute the query and return results\n */\n async execute(): Promise<PostgrestResponse<T>> {\n try {\n // Handle INSERT operation\n if (this.operationType === \"insert\") {\n if (!this.insertData) {\n throw new Error(\"Insert data is required for insert operation\");\n }\n const body = Array.isArray(this.insertData)\n ? this.insertData\n : this.insertData;\n const response = await this.fetch.post<T>(this.buildTablePath(), body);\n\n return {\n data: response,\n error: null,\n count: Array.isArray(this.insertData) ? this.insertData.length : 1,\n status: 201,\n statusText: \"Created\",\n };\n }\n\n // Handle UPDATE operation\n if (this.operationType === \"update\") {\n if (!this.updateData) {\n throw new Error(\"Update data is required for update operation\");\n }\n const queryString = this.buildQueryString();\n const path = `${this.buildTablePath()}${queryString}`;\n const response = await this.fetch.patch<T>(path, this.updateData);\n\n return {\n data: response,\n error: null,\n count: null,\n status: 200,\n statusText: \"OK\",\n };\n }\n\n // Handle DELETE operation\n if (this.operationType === \"delete\") {\n const queryString = this.buildQueryString();\n const path = `${this.buildTablePath()}${queryString}`;\n await this.fetch.delete(path);\n\n return {\n data: null,\n error: null,\n count: null,\n status: 204,\n statusText: \"No Content\",\n } as PostgrestResponse<T>;\n }\n\n // Handle SELECT operation (default)\n const queryString = this.buildQueryString();\n const path = `${this.buildTablePath()}${queryString}`;\n\n // When count is requested, use getWithHeaders to access Content-Range header\n if (this.countType) {\n const response = await this.fetch.getWithHeaders<T | T[]>(path);\n const serverCount = this.parseContentRangeCount(response.headers);\n const data = response.data;\n\n // Handle head-only request (only return count, no data)\n if (this.headOnly) {\n return {\n data: null,\n error: null,\n count: serverCount,\n status: response.status,\n statusText: \"OK\",\n };\n }\n\n // Handle single row response with count\n if (this.singleRow) {\n if (Array.isArray(data) && data.length === 0) {\n return {\n data: null,\n error: { message: \"No rows found\", code: \"PGRST116\" },\n count: serverCount ?? 0,\n status: 404,\n statusText: \"Not Found\",\n };\n }\n const singleData = Array.isArray(data) ? data[0] : data;\n return {\n data: singleData as T,\n error: null,\n count: serverCount ?? 1,\n status: 200,\n statusText: \"OK\",\n };\n }\n\n // Handle maybeSingle row response with count\n if (this.maybeSingleRow) {\n if (Array.isArray(data) && data.length === 0) {\n return {\n data: null,\n error: null,\n count: serverCount ?? 0,\n status: 200,\n statusText: \"OK\",\n };\n }\n const singleData = Array.isArray(data) ? data[0] : data;\n return {\n data: singleData as T,\n error: null,\n count: serverCount ?? 1,\n status: 200,\n statusText: \"OK\",\n };\n }\n\n // Normal response with server count\n return {\n data: data as T,\n error: null,\n count: serverCount ?? (Array.isArray(data) ? data.length : null),\n status: 200,\n statusText: \"OK\",\n };\n }\n\n // Standard path without count - use regular get\n const data = await this.fetch.get<T | T[]>(path);\n\n // Handle single row response\n if (this.singleRow) {\n if (Array.isArray(data) && data.length === 0) {\n return {\n data: null,\n error: { message: \"No rows found\", code: \"PGRST116\" },\n count: 0,\n status: 404,\n statusText: \"Not Found\",\n };\n }\n const singleData = Array.isArray(data) ? data[0] : data;\n return {\n data: singleData as T,\n error: null,\n count: 1,\n status: 200,\n statusText: \"OK\",\n };\n }\n\n // Handle maybeSingle row response (returns null instead of error when no rows found)\n if (this.maybeSingleRow) {\n if (Array.isArray(data) && data.length === 0) {\n return {\n data: null,\n error: null,\n count: 0,\n status: 200,\n statusText: \"OK\",\n };\n }\n const singleData = Array.isArray(data) ? data[0] : data;\n return {\n data: singleData as T,\n error: null,\n count: 1,\n status: 200,\n statusText: \"OK\",\n };\n }\n\n return {\n data: data as T,\n error: null,\n count: Array.isArray(data) ? data.length : null,\n status: 200,\n statusText: \"OK\",\n };\n } catch (err) {\n const error = err as Error;\n return {\n data: null,\n error: {\n message: error.message,\n code: \"PGRST000\",\n },\n count: null,\n status: 500,\n statusText: \"Internal Server Error\",\n };\n }\n }\n\n /**\n * Execute the query and throw an error if one occurs (Supabase-compatible)\n * Returns the data directly instead of { data, error } wrapper\n *\n * @throws {Error} If the query fails or returns an error\n * @example\n * ```typescript\n * // Throws error instead of returning { data, error }\n * try {\n * const user = await client\n * .from('users')\n * .select('*')\n * .eq('id', 1)\n * .single()\n * .throwOnError()\n * } catch (error) {\n * console.error('Query failed:', error)\n * }\n * ```\n */\n async throwOnError(): Promise<T> {\n const response = await this.execute();\n\n if (response.error) {\n const error = new Error(response.error.message);\n // Preserve error code if available\n if (response.error.code) {\n (error as any).code = response.error.code;\n }\n throw error;\n }\n\n return response.data as T;\n }\n\n /**\n * Make QueryBuilder awaitable (implements PromiseLike)\n * This allows using `await client.from('table').select()` without calling `.execute()`\n *\n * @example\n * ```typescript\n * // Without .execute() (new way)\n * const { data } = await client.from('users').select('*')\n *\n * // With .execute() (old way, still supported)\n * const { data } = await client.from('users').select('*').execute()\n * ```\n */\n then<TResult1 = PostgrestResponse<T>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResponse<T>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.execute().then(onfulfilled, onrejected);\n }\n\n /**\n * Build the query string from filters, ordering, etc.\n */\n private buildQueryString(): string {\n const params = new URLSearchParams();\n\n // Select\n if (this.selectQuery && this.selectQuery !== \"*\") {\n params.append(\"select\", this.selectQuery);\n }\n\n // Filters\n for (const filter of this.filters) {\n params.append(\n filter.column,\n `${filter.operator}.${this.formatValue(filter.value)}`,\n );\n }\n\n // OR Filters\n for (const orFilter of this.orFilters) {\n params.append(\"or\", `(${orFilter})`);\n }\n\n // AND Filters\n for (const andFilter of this.andFilters) {\n params.append(\"and\", `(${andFilter})`);\n }\n\n // Group By\n if (this.groupByColumns && this.groupByColumns.length > 0) {\n params.append(\"group_by\", this.groupByColumns.join(\",\"));\n }\n\n // Order\n if (this.orderBys.length > 0) {\n const orderStr = this.orderBys\n .map(\n (o) =>\n `${o.column}.${o.direction}${o.nulls ? `.nulls${o.nulls}` : \"\"}`,\n )\n .join(\",\");\n params.append(\"order\", orderStr);\n }\n\n // Limit\n if (this.limitValue !== undefined) {\n params.append(\"limit\", String(this.limitValue));\n }\n\n // Offset\n if (this.offsetValue !== undefined) {\n params.append(\"offset\", String(this.offsetValue));\n }\n\n // Count - request server to return total count in Content-Range header\n if (this.countType) {\n params.append(\"count\", this.countType);\n }\n\n const queryString = params.toString();\n return queryString ? `?${queryString}` : \"\";\n }\n\n /**\n * Format a value for the query string\n */\n private formatValue(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (Array.isArray(value)) {\n return `(${value.map((v) => this.formatValue(v)).join(\",\")})`;\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n return String(value);\n }\n\n /**\n * Parse the Content-Range header to extract the total count\n * Header format: \"0-999/50000\" or \"* /50000\" (when no rows returned)\n */\n private parseContentRangeCount(headers: Headers): number | null {\n const contentRange = headers.get(\"Content-Range\");\n if (!contentRange) {\n return null;\n }\n // Match the total count after the slash: \"0-999/50000\" -> \"50000\"\n const match = contentRange.match(/\\/(\\d+)$/);\n if (match && match[1]) {\n return parseInt(match[1], 10);\n }\n return null;\n }\n}\n","/**\n * Schema-scoped query builder for accessing tables in non-public schemas.\n *\n * @example\n * ```typescript\n * // Query the jobs.execution_logs table\n * const { data } = await client\n * .schema('jobs')\n * .from('execution_logs')\n * .select('*')\n * .execute();\n * ```\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport { QueryBuilder } from \"./query-builder\";\n\nexport class SchemaQueryBuilder {\n constructor(\n private fetch: FluxbaseFetch,\n private schemaName: string,\n ) {}\n\n /**\n * Create a query builder for a table in this schema\n *\n * @param table - The table name (without schema prefix)\n * @returns A query builder instance for constructing and executing queries\n */\n from<T = any>(table: string): QueryBuilder<T> {\n return new QueryBuilder<T>(this.fetch, table, this.schemaName);\n }\n}\n","/**\n * Main Fluxbase client for interacting with the Fluxbase backend.\n *\n * This client provides access to all Fluxbase features including:\n * - Database operations via PostgREST-compatible API\n * - Authentication and user management\n * - Real-time subscriptions via WebSockets\n * - File storage and management\n * - Edge functions for serverless compute\n * - PostgreSQL function calls (RPC)\n *\n * @example\n * ```typescript\n * import { createClient } from '@fluxbase/sdk'\n *\n * const client = createClient({\n * url: 'http://localhost:8080',\n * auth: {\n * token: 'your-jwt-token',\n * autoRefresh: true\n * }\n * })\n *\n * // Query database\n * const { data } = await client.from('users').select('*').execute()\n *\n * // Invoke edge function\n * const { data, error } = await client.functions.invoke('hello-world', {\n * body: { name: 'Alice' }\n * })\n *\n * // Subscribe to realtime changes\n * client.realtime.subscribe('users', (payload) => {\n * console.log('Change:', payload)\n * })\n * ```\n *\n * @category Client\n */\n\nimport { FluxbaseFetch } from \"./fetch\";\nimport { FluxbaseAuth } from \"./auth\";\nimport { FluxbaseRealtime } from \"./realtime\";\nimport { FluxbaseStorage } from \"./storage\";\nimport { FluxbaseFunctions } from \"./functions\";\nimport { FluxbaseJobs } from \"./jobs\";\nimport { FluxbaseAdmin } from \"./admin\";\nimport { FluxbaseManagement } from \"./management\";\nimport { SettingsClient } from \"./settings\";\nimport { QueryBuilder } from \"./query-builder\";\nimport { SchemaQueryBuilder } from \"./schema-query-builder\";\nimport type { FluxbaseClientOptions } from \"./types\";\n\n/**\n * Main Fluxbase client class\n * @category Client\n */\nexport class FluxbaseClient<\n Database = any,\n _SchemaName extends string & keyof Database = any,\n> {\n /** Internal HTTP client for making requests */\n private fetch: FluxbaseFetch;\n\n /** Authentication module for user management */\n public auth: FluxbaseAuth;\n\n /** Realtime module for WebSocket subscriptions */\n public realtime: FluxbaseRealtime;\n\n /** Storage module for file operations */\n public storage: FluxbaseStorage;\n\n /** Functions module for invoking and managing edge functions */\n public functions: FluxbaseFunctions;\n\n /** Jobs module for submitting and monitoring background jobs */\n public jobs: FluxbaseJobs;\n\n /** Admin module for instance management (requires admin authentication) */\n public admin: FluxbaseAdmin;\n\n /** Management module for API keys, webhooks, and invitations */\n public management: FluxbaseManagement;\n\n /** Settings module for reading public application settings (respects RLS policies) */\n public settings: SettingsClient;\n\n /**\n * Create a new Fluxbase client instance\n *\n * @param fluxbaseUrl - The URL of your Fluxbase instance\n * @param fluxbaseKey - The anon key (JWT token with \"anon\" role). Generate using scripts/generate-keys.sh\n * @param options - Additional client configuration options\n *\n * @example\n * ```typescript\n * const client = new FluxbaseClient(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...', // Anon JWT token\n * { timeout: 30000 }\n * )\n * ```\n */\n constructor(\n protected fluxbaseUrl: string,\n protected fluxbaseKey: string,\n options?: FluxbaseClientOptions,\n ) {\n // Prepare headers with anon key\n const headers = {\n apikey: fluxbaseKey,\n Authorization: `Bearer ${fluxbaseKey}`,\n ...options?.headers,\n };\n\n // Initialize HTTP client\n this.fetch = new FluxbaseFetch(fluxbaseUrl, {\n headers,\n timeout: options?.timeout,\n debug: options?.debug,\n });\n\n // Store anon key for auth restoration (when user signs out, restore anon key auth)\n this.fetch.setAnonKey(fluxbaseKey);\n\n // Initialize auth module\n this.auth = new FluxbaseAuth(\n this.fetch,\n options?.auth?.autoRefresh ?? true,\n options?.auth?.persist ?? true,\n );\n\n // Set auth token if provided\n if (options?.auth?.token) {\n this.fetch.setAuthToken(options.auth.token);\n }\n\n // Initialize realtime module\n this.realtime = new FluxbaseRealtime(\n fluxbaseUrl,\n options?.auth?.token || null,\n );\n\n // Initialize storage module\n this.storage = new FluxbaseStorage(this.fetch);\n\n // Initialize functions module\n this.functions = new FluxbaseFunctions(this.fetch);\n\n // Initialize jobs module\n this.jobs = new FluxbaseJobs(this.fetch);\n\n // Initialize admin module\n this.admin = new FluxbaseAdmin(this.fetch);\n\n // Initialize management module\n this.management = new FluxbaseManagement(this.fetch);\n\n // Initialize settings module (public read-only access with RLS)\n this.settings = new SettingsClient(this.fetch);\n\n // Subscribe to auth changes to update realtime token\n this.setupAuthSync();\n }\n\n /**\n * Create a query builder for a database table\n *\n * @param table - The table name (can include schema, e.g., 'public.users')\n * @returns A query builder instance for constructing and executing queries\n *\n * @example\n * ```typescript\n * // Simple select\n * const { data } = await client.from('users').select('*').execute()\n *\n * // With filters\n * const { data } = await client.from('products')\n * .select('id, name, price')\n * .gt('price', 100)\n * .eq('category', 'electronics')\n * .execute()\n *\n * // Insert\n * await client.from('users').insert({ name: 'John', email: 'john@example.com' }).execute()\n * ```\n *\n * @category Database\n */\n from<T = any>(table: string): QueryBuilder<T> {\n return new QueryBuilder<T>(this.fetch, table);\n }\n\n /**\n * Access a specific database schema\n *\n * Use this to query tables in non-public schemas.\n *\n * @param schemaName - The schema name (e.g., 'jobs', 'analytics')\n * @returns A schema query builder for constructing queries on that schema\n *\n * @example\n * ```typescript\n * // Query the jobs.execution_logs table\n * const { data } = await client\n * .schema('jobs')\n * .from('execution_logs')\n * .select('*')\n * .eq('job_id', jobId)\n * .execute()\n *\n * // Insert into a custom schema table\n * await client\n * .schema('analytics')\n * .from('events')\n * .insert({ event_type: 'click', data: {} })\n * .execute()\n * ```\n *\n * @category Database\n */\n schema(schemaName: string): SchemaQueryBuilder {\n return new SchemaQueryBuilder(this.fetch, schemaName);\n }\n\n /**\n * Call a PostgreSQL function (Remote Procedure Call)\n *\n * @param functionName - The name of the PostgreSQL function to call\n * @param params - Optional parameters to pass to the function\n * @returns Promise containing the function result or error\n *\n * @example\n * ```typescript\n * // Call a function without parameters\n * const { data, error } = await client.rpc('get_total_users')\n *\n * // Call a function with parameters\n * const { data, error } = await client.rpc('calculate_discount', {\n * product_id: 123,\n * coupon_code: 'SAVE20'\n * })\n * ```\n *\n * @category Database\n */\n async rpc<T = any>(\n functionName: string,\n params?: Record<string, unknown>,\n ): Promise<{ data: T | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<T>(\n `/api/v1/rpc/${functionName}`,\n params || {},\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Sync auth state with realtime connections\n * @internal\n */\n private setupAuthSync() {\n // When auth token changes, update realtime\n const originalSetAuthToken = this.fetch.setAuthToken.bind(this.fetch);\n this.fetch.setAuthToken = (token: string | null) => {\n originalSetAuthToken(token);\n this.realtime.setAuth(token);\n };\n\n // Set up token refresh callback for realtime connections\n // This is called when WebSocket connections detect an expired token\n this.realtime.setTokenRefreshCallback(async () => {\n const result = await this.auth.refreshSession();\n if (result.error || !result.data?.session) {\n console.error(\"[Fluxbase] Failed to refresh token for realtime:\", result.error);\n return null;\n }\n return result.data.session.access_token;\n });\n }\n\n /**\n * Get the current authentication token\n *\n * @returns The current JWT access token, or null if not authenticated\n *\n * @category Authentication\n */\n getAuthToken(): string | null {\n return this.auth.getAccessToken();\n }\n\n /**\n * Set a new authentication token\n *\n * This updates both the HTTP client and realtime connection with the new token.\n *\n * @param token - The JWT access token to set, or null to clear authentication\n *\n * @category Authentication\n */\n setAuthToken(token: string | null) {\n this.fetch.setAuthToken(token);\n this.realtime.setAuth(token);\n }\n\n /**\n * Create or get a realtime channel (Supabase-compatible)\n *\n * @param name - Channel name\n * @param config - Optional channel configuration\n * @returns RealtimeChannel instance\n *\n * @example\n * ```typescript\n * const channel = client.channel('room-1', {\n * broadcast: { self: true },\n * presence: { key: 'user-123' }\n * })\n * .on('broadcast', { event: 'message' }, (payload) => {\n * console.log('Message:', payload)\n * })\n * .subscribe()\n * ```\n *\n * @category Realtime\n */\n channel(name: string, config?: import(\"./types\").RealtimeChannelConfig) {\n return this.realtime.channel(name, config);\n }\n\n /**\n * Remove a realtime channel (Supabase-compatible)\n *\n * @param channel - The channel to remove\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * const channel = client.channel('room-1')\n * await client.removeChannel(channel)\n * ```\n *\n * @category Realtime\n */\n removeChannel(channel: import(\"./realtime\").RealtimeChannel) {\n return this.realtime.removeChannel(channel);\n }\n\n /**\n * Get the internal HTTP client\n *\n * Use this for advanced scenarios like making custom API calls or admin operations.\n *\n * @returns The internal FluxbaseFetch instance\n *\n * @example\n * ```typescript\n * // Make a custom API call\n * const data = await client.http.get('/api/custom-endpoint')\n * ```\n *\n * @category Advanced\n */\n get http(): FluxbaseFetch {\n return this.fetch;\n }\n}\n\n// Deno type declaration for env access\ndeclare const Deno:\n | {\n env: {\n get(name: string): string | undefined;\n };\n }\n | undefined;\n\n/**\n * Get environment variable (works in Node.js, Deno, and browser with globalThis)\n * @internal\n */\nfunction getEnvVar(name: string): string | undefined {\n // Node.js\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[name];\n }\n // Deno\n if (typeof Deno !== \"undefined\" && Deno?.env) {\n return Deno.env.get(name);\n }\n return undefined;\n}\n\n/**\n * Create a new Fluxbase client instance (Supabase-compatible)\n *\n * This function signature is identical to Supabase's createClient, making migration seamless.\n *\n * When called without arguments (or with undefined values), the function will attempt to\n * read from environment variables:\n * - `FLUXBASE_URL` - The URL of your Fluxbase instance\n * - `FLUXBASE_ANON_KEY` or `FLUXBASE_JOB_TOKEN` or `FLUXBASE_SERVICE_TOKEN` - The API key/token\n *\n * This is useful in:\n * - Server-side environments where env vars are set\n * - Fluxbase job functions where tokens are automatically provided\n * - Edge functions with configured environment\n *\n * @param fluxbaseUrl - The URL of your Fluxbase instance (optional if FLUXBASE_URL env var is set)\n * @param fluxbaseKey - The anon key or JWT token (optional if env var is set)\n * @param options - Optional client configuration\n * @returns A configured Fluxbase client instance with full TypeScript support\n *\n * @example\n * ```typescript\n * import { createClient } from '@fluxbase/sdk'\n *\n * // Initialize with anon key (identical to Supabase)\n * const client = createClient(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' // Anon JWT token\n * )\n *\n * // With additional options\n * const client = createClient(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',\n * { timeout: 30000, debug: true }\n * )\n *\n * // In a Fluxbase job function (reads from env vars automatically)\n * const client = createClient()\n *\n * // With TypeScript database types\n * const client = createClient<Database>(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'\n * )\n * ```\n *\n * @category Client\n */\nexport function createClient<\n Database = any,\n SchemaName extends string & keyof Database = any,\n>(\n fluxbaseUrl?: string,\n fluxbaseKey?: string,\n options?: FluxbaseClientOptions,\n): FluxbaseClient<Database, SchemaName> {\n // Resolve URL from argument or environment variable\n const url =\n fluxbaseUrl ||\n getEnvVar(\"FLUXBASE_URL\") ||\n getEnvVar(\"NEXT_PUBLIC_FLUXBASE_URL\") ||\n getEnvVar(\"VITE_FLUXBASE_URL\");\n\n // Resolve key from argument or environment variables (try multiple common names)\n const key =\n fluxbaseKey ||\n getEnvVar(\"FLUXBASE_ANON_KEY\") ||\n getEnvVar(\"FLUXBASE_SERVICE_TOKEN\") ||\n getEnvVar(\"FLUXBASE_JOB_TOKEN\") ||\n getEnvVar(\"NEXT_PUBLIC_FLUXBASE_ANON_KEY\") ||\n getEnvVar(\"VITE_FLUXBASE_ANON_KEY\");\n\n if (!url) {\n throw new Error(\n \"Fluxbase URL is required. Pass it as the first argument or set FLUXBASE_URL environment variable.\",\n );\n }\n\n if (!key) {\n throw new Error(\n \"Fluxbase key is required. Pass it as the second argument or set FLUXBASE_ANON_KEY environment variable.\",\n );\n }\n\n return new FluxbaseClient<Database, SchemaName>(url, key, options);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/fetch.ts","../src/utils/error-handling.ts","../src/auth.ts","../src/realtime.ts","../src/storage.ts","../src/functions.ts","../src/jobs.ts","../src/settings.ts","../src/ddl.ts","../src/oauth.ts","../src/impersonation.ts","../src/management.ts","../src/admin-functions.ts","../src/admin-migrations.ts","../src/admin-jobs.ts","../src/admin.ts","../src/query-builder.ts","../src/schema-query-builder.ts","../src/client.ts"],"names":["fetch","queryString","path","data"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * HTTP client for making requests to the Fluxbase API\n */\n\nimport type { FluxbaseError, HttpMethod } from './types'\n\nexport interface FetchOptions {\n method: HttpMethod\n headers?: Record<string, string>\n body?: unknown\n timeout?: number\n /** Skip automatic token refresh on 401 (used for auth endpoints) */\n skipAutoRefresh?: boolean\n}\n\n/**\n * Response with headers included (for count queries)\n */\nexport interface FetchResponseWithHeaders<T> {\n data: T\n headers: Headers\n status: number\n}\n\n/** Callback type for automatic token refresh on 401 errors */\nexport type RefreshTokenCallback = () => Promise<boolean>\n\nexport class FluxbaseFetch {\n private baseUrl: string\n private defaultHeaders: Record<string, string>\n private timeout: number\n private debug: boolean\n private refreshTokenCallback: RefreshTokenCallback | null = null\n private isRefreshing = false\n private refreshPromise: Promise<boolean> | null = null\n private anonKey: string | null = null\n\n constructor(\n baseUrl: string,\n options: {\n headers?: Record<string, string>\n timeout?: number\n debug?: boolean\n } = {}\n ) {\n this.baseUrl = baseUrl.replace(/\\/$/, '') // Remove trailing slash\n this.defaultHeaders = {\n 'Content-Type': 'application/json',\n ...options.headers,\n }\n this.timeout = options.timeout ?? 30000\n this.debug = options.debug ?? false\n }\n\n /**\n * Register a callback to refresh the token when a 401 error occurs\n * The callback should return true if refresh was successful, false otherwise\n */\n setRefreshTokenCallback(callback: RefreshTokenCallback | null) {\n this.refreshTokenCallback = callback\n }\n\n /**\n * Set the anon key for fallback authentication\n * When setAuthToken(null) is called, the Authorization header will be\n * restored to use this anon key instead of being deleted\n */\n setAnonKey(key: string) {\n this.anonKey = key\n }\n\n /**\n * Update the authorization header\n * When token is null, restores to anon key if available\n */\n setAuthToken(token: string | null) {\n if (token) {\n this.defaultHeaders['Authorization'] = `Bearer ${token}`\n } else if (this.anonKey) {\n // Restore anon key auth instead of deleting header\n this.defaultHeaders['Authorization'] = `Bearer ${this.anonKey}`\n } else {\n delete this.defaultHeaders['Authorization']\n }\n }\n\n /**\n * Make an HTTP request\n */\n async request<T = unknown>(path: string, options: FetchOptions): Promise<T> {\n return this.requestInternal<T>(path, options, false)\n }\n\n /**\n * Internal request implementation with retry capability\n */\n private async requestInternal<T = unknown>(\n path: string,\n options: FetchOptions,\n isRetry: boolean\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`\n const headers = { ...this.defaultHeaders, ...options.headers }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), options.timeout ?? this.timeout)\n\n if (this.debug) {\n console.log(`[Fluxbase SDK] ${options.method} ${url}`, options.body)\n }\n\n try {\n // Determine if body is FormData (needs special handling for multipart uploads)\n // Use constructor.name check for cross-runtime compatibility (Deno, Node, Browser)\n // instanceof can fail across different realms/contexts in bundled IIFE code\n const isFormData = options.body &&\n (options.body.constructor?.name === 'FormData' || options.body instanceof FormData);\n\n // For FormData, omit Content-Type to let runtime set multipart/form-data with boundary\n const requestHeaders = isFormData\n ? Object.fromEntries(\n Object.entries(headers).filter(([key]) => key.toLowerCase() !== 'content-type')\n )\n : headers;\n\n const response = await fetch(url, {\n method: options.method,\n headers: requestHeaders,\n body: isFormData ? (options.body as FormData) : (options.body ? JSON.stringify(options.body) : undefined),\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n // Parse response\n const contentType = response.headers.get('content-type')\n let data: unknown\n\n if (contentType?.includes('application/json')) {\n data = await response.json()\n } else {\n data = await response.text()\n }\n\n if (this.debug) {\n console.log(`[Fluxbase SDK] Response:`, response.status, data)\n }\n\n // Handle 401 errors with automatic token refresh\n if (\n response.status === 401 &&\n !isRetry &&\n !options.skipAutoRefresh &&\n this.refreshTokenCallback\n ) {\n const refreshSuccess = await this.handleTokenRefresh()\n if (refreshSuccess) {\n // Retry the request with the new token\n return this.requestInternal<T>(path, options, true)\n }\n }\n\n // Handle errors\n if (!response.ok) {\n const error = new Error(\n typeof data === 'object' && data && 'error' in data\n ? String(data.error)\n : response.statusText\n ) as FluxbaseError\n\n error.status = response.status\n error.details = data\n\n throw error\n }\n\n return data as T\n } catch (err) {\n clearTimeout(timeoutId)\n\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n const timeoutError = new Error('Request timeout') as FluxbaseError\n timeoutError.status = 408\n throw timeoutError\n }\n\n throw err\n }\n\n throw new Error('Unknown error occurred')\n }\n }\n\n /**\n * Handle token refresh with deduplication\n * Multiple concurrent requests that fail with 401 will share the same refresh operation\n */\n private async handleTokenRefresh(): Promise<boolean> {\n // If already refreshing, wait for the existing refresh to complete\n if (this.isRefreshing && this.refreshPromise) {\n return this.refreshPromise\n }\n\n this.isRefreshing = true\n this.refreshPromise = this.executeRefresh()\n\n try {\n return await this.refreshPromise\n } finally {\n this.isRefreshing = false\n this.refreshPromise = null\n }\n }\n\n /**\n * Execute the actual token refresh\n */\n private async executeRefresh(): Promise<boolean> {\n if (!this.refreshTokenCallback) {\n return false\n }\n\n try {\n return await this.refreshTokenCallback()\n } catch (error) {\n if (this.debug) {\n console.error('[Fluxbase SDK] Token refresh failed:', error)\n }\n return false\n }\n }\n\n /**\n * GET request\n */\n async get<T = unknown>(path: string, options: Omit<FetchOptions, 'method'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'GET' })\n }\n\n /**\n * GET request that returns response with headers (for count queries)\n */\n async getWithHeaders<T = unknown>(path: string, options: Omit<FetchOptions, 'method'> = {}): Promise<FetchResponseWithHeaders<T>> {\n return this.requestWithHeaders<T>(path, { ...options, method: 'GET' })\n }\n\n /**\n * Make an HTTP request and return response with headers\n */\n async requestWithHeaders<T = unknown>(path: string, options: FetchOptions): Promise<FetchResponseWithHeaders<T>> {\n return this.requestWithHeadersInternal<T>(path, options, false)\n }\n\n /**\n * Internal request implementation that returns response with headers\n */\n private async requestWithHeadersInternal<T = unknown>(\n path: string,\n options: FetchOptions,\n isRetry: boolean\n ): Promise<FetchResponseWithHeaders<T>> {\n const url = `${this.baseUrl}${path}`\n const headers = { ...this.defaultHeaders, ...options.headers }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), options.timeout ?? this.timeout)\n\n if (this.debug) {\n console.log(`[Fluxbase SDK] ${options.method} ${url}`, options.body)\n }\n\n try {\n // Determine if body is FormData (needs special handling for multipart uploads)\n // Use constructor.name check for cross-runtime compatibility (Deno, Node, Browser)\n // instanceof can fail across different realms/contexts in bundled IIFE code\n const isFormData = options.body &&\n (options.body.constructor?.name === 'FormData' || options.body instanceof FormData);\n\n // For FormData, omit Content-Type to let runtime set multipart/form-data with boundary\n const requestHeaders = isFormData\n ? Object.fromEntries(\n Object.entries(headers).filter(([key]) => key.toLowerCase() !== 'content-type')\n )\n : headers;\n\n const response = await fetch(url, {\n method: options.method,\n headers: requestHeaders,\n body: isFormData ? (options.body as FormData) : (options.body ? JSON.stringify(options.body) : undefined),\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n // Parse response\n const contentType = response.headers.get('content-type')\n let data: unknown\n\n if (contentType?.includes('application/json')) {\n data = await response.json()\n } else {\n data = await response.text()\n }\n\n if (this.debug) {\n console.log(`[Fluxbase SDK] Response:`, response.status, data)\n }\n\n // Handle 401 errors with automatic token refresh\n if (\n response.status === 401 &&\n !isRetry &&\n !options.skipAutoRefresh &&\n this.refreshTokenCallback\n ) {\n const refreshSuccess = await this.handleTokenRefresh()\n if (refreshSuccess) {\n // Retry the request with the new token\n return this.requestWithHeadersInternal<T>(path, options, true)\n }\n }\n\n // Handle errors\n if (!response.ok) {\n const error = new Error(\n typeof data === 'object' && data && 'error' in data\n ? String(data.error)\n : response.statusText\n ) as FluxbaseError\n\n error.status = response.status\n error.details = data\n\n throw error\n }\n\n return {\n data: data as T,\n headers: response.headers,\n status: response.status,\n }\n } catch (err) {\n clearTimeout(timeoutId)\n\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n const timeoutError = new Error('Request timeout') as FluxbaseError\n timeoutError.status = 408\n throw timeoutError\n }\n\n throw err\n }\n\n throw new Error('Unknown error occurred')\n }\n }\n\n /**\n * POST request\n */\n async post<T = unknown>(path: string, body?: unknown, options: Omit<FetchOptions, 'method' | 'body'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'POST', body })\n }\n\n /**\n * PUT request\n */\n async put<T = unknown>(path: string, body?: unknown, options: Omit<FetchOptions, 'method' | 'body'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'PUT', body })\n }\n\n /**\n * PATCH request\n */\n async patch<T = unknown>(path: string, body?: unknown, options: Omit<FetchOptions, 'method' | 'body'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'PATCH', body })\n }\n\n /**\n * DELETE request\n */\n async delete<T = unknown>(path: string, options: Omit<FetchOptions, 'method'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'DELETE' })\n }\n\n /**\n * HEAD request\n */\n async head(path: string, options: Omit<FetchOptions, 'method'> = {}): Promise<Headers> {\n const url = `${this.baseUrl}${path}`\n const headers = { ...this.defaultHeaders, ...options.headers }\n\n const response = await fetch(url, {\n method: 'HEAD',\n headers,\n })\n\n return response.headers\n }\n}\n","import type { FluxbaseResponse, VoidResponse } from '../types'\n\n/**\n * Wraps an async operation with try-catch, returning Fluxbase response format\n * @param operation The async operation to wrap\n * @returns Promise resolving to { data, error: null } on success or { data: null, error } on failure\n */\nexport async function wrapAsync<T>(\n operation: () => Promise<T>\n): Promise<FluxbaseResponse<T>> {\n try {\n const data = await operation()\n return { data, error: null }\n } catch (error) {\n return {\n data: null,\n error: error instanceof Error ? error : new Error(String(error))\n }\n }\n}\n\n/**\n * Wraps void async operations (operations that don't return data)\n * @param operation The async void operation to wrap\n * @returns Promise resolving to { error: null } on success or { error } on failure\n */\nexport async function wrapAsyncVoid(\n operation: () => Promise<void>\n): Promise<VoidResponse> {\n try {\n await operation()\n return { error: null }\n } catch (error) {\n return {\n error: error instanceof Error ? error : new Error(String(error))\n }\n }\n}\n\n/**\n * Wraps synchronous operations (for consistency)\n * @param operation The sync operation to wrap\n * @returns { data, error: null } on success or { data: null, error } on failure\n */\nexport function wrapSync<T>(\n operation: () => T\n): FluxbaseResponse<T> {\n try {\n const data = operation()\n return { data, error: null }\n } catch (error) {\n return {\n data: null,\n error: error instanceof Error ? error : new Error(String(error))\n }\n }\n}\n","/**\n * Authentication module for Fluxbase SDK\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n AuthResponse,\n AuthResponseData,\n AuthSession,\n SignInCredentials,\n SignUpCredentials,\n UpdateUserAttributes,\n User,\n TwoFactorSetupResponse,\n TwoFactorEnableResponse,\n TwoFactorLoginResponse,\n TwoFactorStatusResponse,\n TwoFactorDisableResponse,\n TwoFactorVerifyRequest,\n SignInWith2FAResponse,\n PasswordResetResponse,\n VerifyResetTokenResponse,\n ResetPasswordResponse,\n MagicLinkOptions,\n MagicLinkResponse,\n AnonymousSignInResponse,\n OAuthProvidersResponse,\n OAuthOptions,\n OAuthUrlResponse,\n AuthChangeEvent,\n AuthStateChangeCallback,\n AuthSubscription,\n FluxbaseAuthResponse,\n FluxbaseResponse,\n UserResponse,\n DataResponse,\n VoidResponse,\n SignInWithOtpCredentials,\n VerifyOtpParams,\n ResendOtpParams,\n OTPResponse,\n UserIdentitiesResponse,\n LinkIdentityCredentials,\n UnlinkIdentityParams,\n ReauthenticateResponse,\n SignInWithIdTokenCredentials,\n} from \"./types\";\nimport { wrapAsync, wrapAsyncVoid } from \"./utils/error-handling\";\n\nconst AUTH_STORAGE_KEY = \"fluxbase.auth.session\";\n\n// Auto-refresh configuration constants\nconst AUTO_REFRESH_TICK_THRESHOLD = 10; // seconds before expiry to trigger refresh\nconst AUTO_REFRESH_TICK_MINIMUM = 1000; // minimum delay in ms (1 second)\nconst MAX_REFRESH_RETRIES = 3; // number of retry attempts before signing out\n\n/**\n * In-memory storage adapter for Node.js/SSR environments\n * where localStorage is not available\n */\nclass MemoryStorage implements Storage {\n private store = new Map<string, string>();\n\n get length(): number {\n return this.store.size;\n }\n\n clear(): void {\n this.store.clear();\n }\n\n getItem(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n setItem(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n removeItem(key: string): void {\n this.store.delete(key);\n }\n\n key(index: number): string | null {\n return [...this.store.keys()][index] ?? null;\n }\n}\n\n/**\n * Check if localStorage is available and working\n */\nfunction isLocalStorageAvailable(): boolean {\n try {\n if (typeof localStorage === \"undefined\") {\n return false;\n }\n // Test that localStorage actually works (some browsers block it)\n const testKey = \"__fluxbase_storage_test__\";\n localStorage.setItem(testKey, \"test\");\n localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\nexport class FluxbaseAuth {\n private fetch: FluxbaseFetch;\n private session: AuthSession | null = null;\n private persist: boolean;\n private autoRefresh: boolean;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private stateChangeListeners: Set<AuthStateChangeCallback> = new Set();\n private storage: Storage | null = null;\n\n constructor(fetch: FluxbaseFetch, autoRefresh = true, persist = true) {\n this.fetch = fetch;\n this.persist = persist;\n this.autoRefresh = autoRefresh;\n\n // Register refresh callback for automatic 401 handling\n this.fetch.setRefreshTokenCallback(async () => {\n const result = await this.refreshSession();\n return !result.error;\n });\n\n // Initialize storage based on persist option and environment\n if (this.persist) {\n if (isLocalStorageAvailable()) {\n this.storage = localStorage;\n } else {\n // Node.js/SSR fallback - use in-memory storage\n this.storage = new MemoryStorage();\n }\n }\n\n // Load session from storage if persisted\n if (this.storage) {\n const stored = this.storage.getItem(AUTH_STORAGE_KEY);\n if (stored) {\n try {\n this.session = JSON.parse(stored);\n if (this.session) {\n this.fetch.setAuthToken(this.session.access_token);\n // Schedule auto-refresh if enabled (only runs in browser environments)\n this.scheduleTokenRefresh();\n }\n } catch {\n // Invalid stored session, ignore\n this.storage.removeItem(AUTH_STORAGE_KEY);\n }\n }\n }\n }\n\n /**\n * Get the current session (Supabase-compatible)\n * Returns the session from the client-side cache without making a network request\n */\n async getSession(): Promise<\n FluxbaseResponse<{ session: AuthSession | null }>\n > {\n return { data: { session: this.session }, error: null };\n }\n\n /**\n * Get the current user (Supabase-compatible)\n * Returns the user from the client-side session without making a network request\n * For server-side validation, use getCurrentUser() instead\n */\n async getUser(): Promise<FluxbaseResponse<{ user: User | null }>> {\n return { data: { user: this.session?.user ?? null }, error: null };\n }\n\n /**\n * Get the current access token\n */\n getAccessToken(): string | null {\n return this.session?.access_token ?? null;\n }\n\n /**\n * Listen to auth state changes (Supabase-compatible)\n * @param callback - Function called when auth state changes\n * @returns Object containing subscription data\n *\n * @example\n * ```typescript\n * const { data: { subscription } } = client.auth.onAuthStateChange((event, session) => {\n * console.log('Auth event:', event, session)\n * })\n *\n * // Later, to unsubscribe:\n * subscription.unsubscribe()\n * ```\n */\n onAuthStateChange(callback: AuthStateChangeCallback): {\n data: { subscription: AuthSubscription };\n } {\n this.stateChangeListeners.add(callback);\n\n const subscription: AuthSubscription = {\n unsubscribe: () => {\n this.stateChangeListeners.delete(callback);\n },\n };\n\n return { data: { subscription } };\n }\n\n /**\n * Start the automatic token refresh timer\n * This is called automatically when autoRefresh is enabled and a session exists\n * Only works in browser environments\n */\n startAutoRefresh(): void {\n this.scheduleTokenRefresh();\n }\n\n /**\n * Stop the automatic token refresh timer\n * Call this when you want to disable auto-refresh without signing out\n */\n stopAutoRefresh(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n /**\n * Sign in with email and password (Supabase-compatible)\n * Returns { user, session } if successful, or SignInWith2FAResponse if 2FA is required\n */\n async signIn(\n credentials: SignInCredentials,\n ): Promise<FluxbaseResponse<AuthResponseData | SignInWith2FAResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<\n AuthResponse | SignInWith2FAResponse\n >(\"/api/v1/auth/signin\", credentials);\n\n // Check if 2FA is required\n if (\"requires_2fa\" in response && response.requires_2fa) {\n return response as SignInWith2FAResponse;\n }\n\n // Normal sign in without 2FA\n const authResponse = response as AuthResponse;\n const session: AuthSession = {\n ...authResponse,\n expires_at: Date.now() + authResponse.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Sign in with email and password (Supabase-compatible)\n * Alias for signIn() to maintain compatibility with common authentication patterns\n * Returns { user, session } if successful, or SignInWith2FAResponse if 2FA is required\n */\n async signInWithPassword(\n credentials: SignInCredentials,\n ): Promise<FluxbaseResponse<AuthResponseData | SignInWith2FAResponse>> {\n return this.signIn(credentials);\n }\n\n /**\n * Sign up with email and password (Supabase-compatible)\n * Returns session when email confirmation is disabled\n * Returns null session when email confirmation is required\n */\n async signUp(credentials: SignUpCredentials): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n // Transform Supabase-style options.data to backend's user_metadata format\n const requestBody: any = {\n email: credentials.email,\n password: credentials.password,\n };\n\n // Map options.data to user_metadata for the backend\n if (credentials.options?.data) {\n requestBody.user_metadata = credentials.options.data;\n }\n\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/signup\",\n requestBody,\n );\n\n // Check if session tokens are provided (no email confirmation required)\n if (response.access_token && response.refresh_token) {\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: response.user, session };\n }\n\n // Email confirmation required - return user without session\n return { user: response.user, session: null };\n });\n }\n\n /**\n * Sign out the current user\n */\n async signOut(): Promise<VoidResponse> {\n return wrapAsyncVoid(async () => {\n try {\n await this.fetch.post(\"/api/v1/auth/signout\");\n } finally {\n this.clearSession();\n }\n });\n }\n\n /**\n * Refresh the session (Supabase-compatible)\n * Returns a new session with refreshed tokens\n */\n async refreshSession(): Promise<\n FluxbaseResponse<{ user: User; session: AuthSession }>\n > {\n return wrapAsync(async () => {\n if (!this.session?.refresh_token) {\n throw new Error(\"No refresh token available\");\n }\n\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/refresh\",\n {\n refresh_token: this.session.refresh_token,\n },\n { skipAutoRefresh: true }, // Prevent infinite loop on 401\n );\n\n const session: AuthSession = {\n ...response,\n user: response.user ?? this.session.user,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session, \"TOKEN_REFRESHED\");\n return { user: session.user, session };\n });\n }\n\n /**\n * Refresh the session (Supabase-compatible alias)\n * Alias for refreshSession() to maintain compatibility with Supabase naming\n * Returns a new session with refreshed tokens\n */\n async refreshToken(): Promise<\n FluxbaseResponse<{ user: User; session: AuthSession }>\n > {\n return this.refreshSession();\n }\n\n /**\n * Get the current user from the server\n */\n async getCurrentUser(): Promise<UserResponse> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n const user = await this.fetch.get<User>(\"/api/v1/auth/user\");\n return { user };\n });\n }\n\n /**\n * Update the current user (Supabase-compatible)\n * @param attributes - User attributes to update (email, password, data for metadata)\n */\n async updateUser(attributes: UpdateUserAttributes): Promise<UserResponse> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n // Transform Supabase-style 'data' to backend's 'user_metadata' format\n const requestBody: any = {};\n\n if (attributes.email) {\n requestBody.email = attributes.email;\n }\n\n if (attributes.password) {\n requestBody.password = attributes.password;\n }\n\n if (attributes.data) {\n requestBody.user_metadata = attributes.data;\n }\n\n if (attributes.nonce) {\n requestBody.nonce = attributes.nonce;\n }\n\n const user = await this.fetch.patch<User>(\n \"/api/v1/auth/user\",\n requestBody,\n );\n\n // Update session with new user data\n if (this.session) {\n this.session.user = user;\n this.saveSession();\n this.emitAuthChange(\"USER_UPDATED\", this.session);\n }\n\n return { user };\n });\n }\n\n /**\n * Set the session manually (Supabase-compatible)\n * Useful for restoring a session from storage or SSR scenarios\n * @param session - Object containing access_token and refresh_token\n * @returns Promise with session data\n */\n async setSession(session: {\n access_token: string;\n refresh_token: string;\n }): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n // Create a full auth session from the tokens\n const authSession: AuthSession = {\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n user: null as any, // Will be populated by getCurrentUser\n expires_in: 3600, // Default, will be updated on refresh\n expires_at: Date.now() + 3600 * 1000,\n };\n\n // Set the token so we can make authenticated requests\n this.fetch.setAuthToken(session.access_token);\n\n // Fetch the current user to populate the session\n const user = await this.fetch.get<User>(\"/api/v1/auth/user\");\n authSession.user = user;\n\n // Store the session\n this.setSessionInternal(authSession, \"SIGNED_IN\");\n\n return { user, session: authSession };\n });\n }\n\n /**\n * Setup 2FA for the current user (Supabase-compatible)\n * Enrolls a new MFA factor and returns TOTP details\n * @param issuer - Optional custom issuer name for the QR code (e.g., \"MyApp\"). If not provided, uses server default.\n * @returns Promise with factor id, type, and TOTP setup details\n */\n async setup2FA(\n issuer?: string,\n ): Promise<DataResponse<TwoFactorSetupResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<TwoFactorSetupResponse>(\n \"/api/v1/auth/2fa/setup\",\n issuer ? { issuer } : undefined,\n );\n });\n }\n\n /**\n * Enable 2FA after verifying the TOTP code (Supabase-compatible)\n * Verifies the TOTP code and returns new tokens with MFA session\n * @param code - TOTP code from authenticator app\n * @returns Promise with access_token, refresh_token, and user\n */\n async enable2FA(\n code: string,\n ): Promise<DataResponse<TwoFactorEnableResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<TwoFactorEnableResponse>(\n \"/api/v1/auth/2fa/enable\",\n { code },\n );\n });\n }\n\n /**\n * Disable 2FA for the current user (Supabase-compatible)\n * Unenrolls the MFA factor\n * @param password - User password for confirmation\n * @returns Promise with unenrolled factor id\n */\n async disable2FA(\n password: string,\n ): Promise<DataResponse<TwoFactorDisableResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<TwoFactorDisableResponse>(\n \"/api/v1/auth/2fa/disable\",\n { password },\n );\n });\n }\n\n /**\n * Check 2FA status for the current user (Supabase-compatible)\n * Lists all enrolled MFA factors\n * @returns Promise with all factors and TOTP factors\n */\n async get2FAStatus(): Promise<DataResponse<TwoFactorStatusResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.get<TwoFactorStatusResponse>(\n \"/api/v1/auth/2fa/status\",\n );\n });\n }\n\n /**\n * Verify 2FA code during login (Supabase-compatible)\n * Call this after signIn returns requires_2fa: true\n * @param request - User ID and TOTP code\n * @returns Promise with access_token, refresh_token, and user\n */\n async verify2FA(\n request: TwoFactorVerifyRequest,\n ): Promise<DataResponse<TwoFactorLoginResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<TwoFactorLoginResponse>(\n \"/api/v1/auth/2fa/verify\",\n request,\n );\n\n // Create session from the response tokens\n if (response.access_token && response.refresh_token) {\n const session: AuthSession = {\n user: response.user,\n access_token: response.access_token,\n refresh_token: response.refresh_token,\n expires_in: response.expires_in || 3600,\n expires_at: Date.now() + (response.expires_in || 3600) * 1000,\n };\n\n this.setSessionInternal(session, \"MFA_CHALLENGE_VERIFIED\");\n }\n\n return response;\n });\n }\n\n /**\n * Send password reset email (Supabase-compatible)\n * Sends a password reset link to the provided email address\n * @param email - Email address to send reset link to\n * @returns Promise with OTP-style response\n */\n async sendPasswordReset(\n email: string,\n ): Promise<DataResponse<PasswordResetResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/password/reset\", { email });\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Supabase-compatible alias for sendPasswordReset()\n * @param email - Email address to send reset link to\n * @param _options - Optional redirect configuration (currently not used)\n * @returns Promise with OTP-style response\n */\n async resetPasswordForEmail(\n email: string,\n _options?: { redirectTo?: string },\n ): Promise<DataResponse<PasswordResetResponse>> {\n return this.sendPasswordReset(email);\n }\n\n /**\n * Verify password reset token\n * Check if a password reset token is valid before allowing password reset\n * @param token - Password reset token to verify\n */\n async verifyResetToken(\n token: string,\n ): Promise<DataResponse<VerifyResetTokenResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.post<VerifyResetTokenResponse>(\n \"/api/v1/auth/password/reset/verify\",\n {\n token,\n },\n );\n });\n }\n\n /**\n * Reset password with token (Supabase-compatible)\n * Complete the password reset process with a valid token\n * @param token - Password reset token\n * @param newPassword - New password to set\n * @returns Promise with user and new session\n */\n async resetPassword(\n token: string,\n newPassword: string,\n ): Promise<DataResponse<ResetPasswordResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/password/reset/confirm\",\n {\n token,\n new_password: newPassword,\n },\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session, \"PASSWORD_RECOVERY\");\n return { user: session.user, session };\n });\n }\n\n /**\n * Send magic link for passwordless authentication (Supabase-compatible)\n * @param email - Email address to send magic link to\n * @param options - Optional configuration for magic link\n * @returns Promise with OTP-style response\n */\n async sendMagicLink(\n email: string,\n options?: MagicLinkOptions,\n ): Promise<DataResponse<MagicLinkResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/magiclink\", {\n email,\n redirect_to: options?.redirect_to,\n });\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Verify magic link token and sign in\n * @param token - Magic link token from email\n */\n async verifyMagicLink(token: string): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/magiclink/verify\",\n {\n token,\n },\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Sign in anonymously\n * Creates a temporary anonymous user session\n */\n async signInAnonymously(): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AnonymousSignInResponse>(\n \"/api/v1/auth/signin/anonymous\",\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Get list of enabled OAuth providers\n */\n async getOAuthProviders(): Promise<DataResponse<OAuthProvidersResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.get<OAuthProvidersResponse>(\n \"/api/v1/auth/oauth/providers\",\n );\n });\n }\n\n /**\n * Get OAuth authorization URL for a provider\n * @param provider - OAuth provider name (e.g., 'google', 'github')\n * @param options - Optional OAuth configuration\n */\n async getOAuthUrl(\n provider: string,\n options?: OAuthOptions,\n ): Promise<DataResponse<OAuthUrlResponse>> {\n return wrapAsync(async () => {\n const params = new URLSearchParams();\n if (options?.redirect_to) {\n params.append(\"redirect_to\", options.redirect_to);\n }\n if (options?.scopes && options.scopes.length > 0) {\n params.append(\"scopes\", options.scopes.join(\",\"));\n }\n\n const queryString = params.toString();\n const url = queryString\n ? `/api/v1/auth/oauth/${provider}/authorize?${queryString}`\n : `/api/v1/auth/oauth/${provider}/authorize`;\n\n const response = await this.fetch.get<OAuthUrlResponse>(url);\n return response;\n });\n }\n\n /**\n * Exchange OAuth authorization code for session\n * This is typically called in your OAuth callback handler\n * @param code - Authorization code from OAuth callback\n */\n async exchangeCodeForSession(code: string): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/oauth/callback\",\n { code },\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Convenience method to initiate OAuth sign-in\n * Redirects the user to the OAuth provider's authorization page\n * @param provider - OAuth provider name (e.g., 'google', 'github')\n * @param options - Optional OAuth configuration\n */\n async signInWithOAuth(\n provider: string,\n options?: OAuthOptions,\n ): Promise<DataResponse<{ provider: string; url: string }>> {\n return wrapAsync(async () => {\n const result = await this.getOAuthUrl(provider, options);\n\n if (result.error) {\n throw result.error;\n }\n\n const url = result.data.url;\n\n if (typeof window !== \"undefined\") {\n window.location.href = url;\n } else {\n throw new Error(\n \"signInWithOAuth can only be called in a browser environment\",\n );\n }\n\n return { provider, url };\n });\n }\n\n /**\n * Sign in with OTP (One-Time Password) - Supabase-compatible\n * Sends a one-time password via email or SMS for passwordless authentication\n * @param credentials - Email or phone number and optional configuration\n * @returns Promise with OTP-style response\n */\n async signInWithOtp(\n credentials: SignInWithOtpCredentials,\n ): Promise<DataResponse<OTPResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/otp/signin\", credentials);\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Verify OTP (One-Time Password) - Supabase-compatible\n * Verify OTP tokens for various authentication flows\n * @param params - OTP verification parameters including token and type\n * @returns Promise with user and session if successful\n */\n async verifyOtp(params: VerifyOtpParams): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/otp/verify\",\n params,\n );\n\n // Check if session tokens are provided\n if (response.access_token && response.refresh_token) {\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: response.user, session };\n }\n\n // Email confirmation required - return user without session\n return { user: response.user, session: null };\n });\n }\n\n /**\n * Resend OTP (One-Time Password) - Supabase-compatible\n * Resend OTP code when user doesn't receive it\n * @param params - Resend parameters including type and email/phone\n * @returns Promise with OTP-style response\n */\n async resendOtp(params: ResendOtpParams): Promise<DataResponse<OTPResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/otp/resend\", params);\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Get user identities (linked OAuth providers) - Supabase-compatible\n * Lists all OAuth identities linked to the current user\n * @returns Promise with list of user identities\n */\n async getUserIdentities(): Promise<DataResponse<UserIdentitiesResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.get<UserIdentitiesResponse>(\n \"/api/v1/auth/user/identities\",\n );\n });\n }\n\n /**\n * Link an OAuth identity to current user - Supabase-compatible\n * Links an additional OAuth provider to the existing account\n * @param credentials - Provider to link\n * @returns Promise with OAuth URL to complete linking\n */\n async linkIdentity(\n credentials: LinkIdentityCredentials,\n ): Promise<DataResponse<OAuthUrlResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<OAuthUrlResponse>(\n \"/api/v1/auth/user/identities\",\n credentials,\n );\n });\n }\n\n /**\n * Unlink an OAuth identity from current user - Supabase-compatible\n * Removes a linked OAuth provider from the account\n * @param params - Identity to unlink\n * @returns Promise with void response\n */\n async unlinkIdentity(params: UnlinkIdentityParams): Promise<VoidResponse> {\n return wrapAsyncVoid(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n await this.fetch.delete(\n `/api/v1/auth/user/identities/${params.identity.id}`,\n );\n });\n }\n\n /**\n * Reauthenticate to get security nonce - Supabase-compatible\n * Get a security nonce for sensitive operations (password change, etc.)\n * @returns Promise with nonce for reauthentication\n */\n async reauthenticate(): Promise<DataResponse<ReauthenticateResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<ReauthenticateResponse>(\n \"/api/v1/auth/reauthenticate\",\n );\n });\n }\n\n /**\n * Sign in with ID token (for native mobile apps) - Supabase-compatible\n * Authenticate using native mobile app ID tokens (Google, Apple)\n * @param credentials - Provider, ID token, and optional nonce\n * @returns Promise with user and session\n */\n async signInWithIdToken(\n credentials: SignInWithIdTokenCredentials,\n ): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/signin/idtoken\",\n credentials,\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Internal: Set the session and persist it\n */\n private setSessionInternal(\n session: AuthSession,\n event: AuthChangeEvent = \"SIGNED_IN\",\n ) {\n this.session = session;\n this.fetch.setAuthToken(session.access_token);\n this.saveSession();\n this.scheduleTokenRefresh();\n this.emitAuthChange(event, session);\n }\n\n /**\n * Internal: Clear the session\n */\n private clearSession() {\n this.session = null;\n this.fetch.setAuthToken(null);\n\n if (this.storage) {\n this.storage.removeItem(AUTH_STORAGE_KEY);\n }\n\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n\n this.emitAuthChange(\"SIGNED_OUT\", null);\n }\n\n /**\n * Internal: Save session to storage\n */\n private saveSession() {\n if (this.storage && this.session) {\n this.storage.setItem(AUTH_STORAGE_KEY, JSON.stringify(this.session));\n }\n }\n\n /**\n * Internal: Schedule automatic token refresh\n * Only runs in browser environments when autoRefresh is enabled\n */\n private scheduleTokenRefresh() {\n // Only auto-refresh in browser environments\n if (!this.autoRefresh || typeof window === \"undefined\") {\n return;\n }\n\n if (!this.session?.expires_at) {\n return;\n }\n\n // Clear existing timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n\n // Calculate time until expiry (expires_at is in ms)\n const expiresAt = this.session.expires_at;\n const now = Date.now();\n const timeUntilExpiry = expiresAt - now;\n\n // Refresh 10 seconds before expiry, minimum 1 second delay\n const refreshIn = Math.max(\n timeUntilExpiry - AUTO_REFRESH_TICK_THRESHOLD * 1000,\n AUTO_REFRESH_TICK_MINIMUM,\n );\n\n this.refreshTimer = setTimeout(() => {\n this.attemptRefresh();\n }, refreshIn);\n }\n\n /**\n * Internal: Attempt to refresh the token with retry logic\n * Uses exponential backoff: 1s, 2s, 4s delays between retries\n */\n private async attemptRefresh(retries = MAX_REFRESH_RETRIES): Promise<void> {\n try {\n const result = await this.refreshSession();\n if (result.error) {\n throw result.error;\n }\n // Success - scheduleTokenRefresh is called within setSessionInternal\n // via refreshSession -> setSessionInternal -> scheduleTokenRefresh\n } catch (error) {\n if (retries > 0) {\n // Exponential backoff: 1s, 2s, 4s (Math.pow(2, MAX_REFRESH_RETRIES - retries) * 1000)\n const delay = Math.pow(2, MAX_REFRESH_RETRIES - retries) * 1000;\n console.warn(\n `Token refresh failed, retrying in ${delay / 1000}s (${retries} attempts remaining)`,\n error,\n );\n this.refreshTimer = setTimeout(() => {\n this.attemptRefresh(retries - 1);\n }, delay);\n } else {\n // All retries exhausted - sign out\n console.error(\n \"Token refresh failed after all retries, signing out\",\n error,\n );\n this.clearSession();\n }\n }\n }\n\n /**\n * Internal: Emit auth state change event to all listeners\n */\n private emitAuthChange(event: AuthChangeEvent, session: AuthSession | null) {\n this.stateChangeListeners.forEach((callback) => {\n try {\n callback(event, session);\n } catch (error) {\n console.error(\"Error in auth state change listener:\", error);\n }\n });\n }\n}\n","/**\n * Realtime subscriptions using WebSockets\n */\n\nimport type {\n RealtimeCallback,\n RealtimePostgresChangesPayload,\n RealtimeMessage,\n PostgresChangesConfig,\n RealtimeChannelConfig,\n PresenceState,\n RealtimePresencePayload,\n PresenceCallback,\n BroadcastMessage,\n RealtimeBroadcastPayload,\n BroadcastCallback,\n} from \"./types\";\n\nexport class RealtimeChannel {\n private ws: WebSocket | null = null;\n private url: string;\n private token: string | null;\n private channelName: string;\n private callbacks: Map<string, Set<RealtimeCallback>> = new Map();\n private presenceCallbacks: Map<string, Set<PresenceCallback>> = new Map();\n private broadcastCallbacks: Map<string, Set<BroadcastCallback>> = new Map();\n private subscriptionConfig: PostgresChangesConfig | null = null;\n private subscriptionId: string | null = null;\n private _presenceState: Record<string, PresenceState[]> = {};\n private myPresenceKey: string | null = null;\n private config: RealtimeChannelConfig;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 10;\n private reconnectDelay = 1000;\n private shouldReconnect = true;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n private pendingAcks: Map<\n string,\n { resolve: (value: string) => void; reject: (reason: any) => void; timeout: ReturnType<typeof setTimeout> }\n > = new Map();\n private messageIdCounter = 0;\n private onTokenRefreshNeeded: (() => Promise<string | null>) | null = null;\n private isRefreshingToken = false;\n\n constructor(\n url: string,\n channelName: string,\n token: string | null = null,\n config: RealtimeChannelConfig = {}\n ) {\n this.url = url;\n this.channelName = channelName;\n this.token = token;\n this.config = config;\n }\n\n /**\n * Set callback to request a token refresh when connection fails due to auth\n * @internal\n */\n setTokenRefreshCallback(callback: () => Promise<string | null>) {\n this.onTokenRefreshNeeded = callback;\n }\n\n /**\n * Listen to postgres_changes with optional row-level filtering\n *\n * @param event - 'postgres_changes'\n * @param config - Configuration including optional filter\n * @param callback - Function to call when changes occur\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('postgres_changes', {\n * event: '*',\n * schema: 'public',\n * table: 'jobs',\n * filter: 'created_by=eq.user123'\n * }, (payload) => {\n * console.log('Job updated:', payload)\n * })\n * ```\n */\n on(\n event: \"postgres_changes\",\n config: PostgresChangesConfig,\n callback: RealtimeCallback,\n ): this;\n\n /**\n * Listen to a specific event type (backwards compatibility)\n *\n * @param event - The event type (INSERT, UPDATE, DELETE, or '*' for all)\n * @param callback - The callback function\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('INSERT', (payload) => {\n * console.log('New record inserted:', payload.new_record)\n * })\n * ```\n */\n on(\n event: \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\",\n callback: RealtimeCallback,\n ): this;\n\n /**\n * Listen to broadcast messages\n *\n * @param event - 'broadcast'\n * @param config - Configuration with event name\n * @param callback - Function to call when broadcast received\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('broadcast', { event: 'cursor-pos' }, (payload) => {\n * console.log('Cursor moved:', payload)\n * })\n * ```\n */\n on(\n event: \"broadcast\",\n config: { event: string },\n callback: BroadcastCallback,\n ): this;\n\n /**\n * Listen to presence events\n *\n * @param event - 'presence'\n * @param config - Configuration with event type (sync, join, leave)\n * @param callback - Function to call when presence changes\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('presence', { event: 'sync' }, (payload) => {\n * console.log('Presence synced:', payload)\n * })\n * ```\n */\n on(\n event: \"presence\",\n config: { event: \"sync\" | \"join\" | \"leave\" },\n callback: PresenceCallback,\n ): this;\n\n // Implementation\n on(\n event:\n | \"postgres_changes\"\n | \"INSERT\"\n | \"UPDATE\"\n | \"DELETE\"\n | \"*\"\n | \"broadcast\"\n | \"presence\",\n configOrCallback:\n | PostgresChangesConfig\n | RealtimeCallback\n | { event: string }\n | { event: \"sync\" | \"join\" | \"leave\" },\n callback?: RealtimeCallback | BroadcastCallback | PresenceCallback,\n ): this {\n if (\n event === \"postgres_changes\" &&\n typeof configOrCallback !== \"function\"\n ) {\n // on('postgres_changes', config, callback)\n const config = configOrCallback as PostgresChangesConfig;\n this.subscriptionConfig = config;\n const actualCallback = callback!;\n\n const eventType = config.event;\n if (!this.callbacks.has(eventType)) {\n this.callbacks.set(eventType, new Set());\n }\n this.callbacks.get(eventType)!.add(actualCallback as RealtimeCallback);\n } else if (event === \"broadcast\" && typeof configOrCallback !== \"function\") {\n // on('broadcast', { event }, callback)\n const config = configOrCallback as { event: string };\n const actualCallback = callback as BroadcastCallback;\n\n if (!this.broadcastCallbacks.has(config.event)) {\n this.broadcastCallbacks.set(config.event, new Set());\n }\n this.broadcastCallbacks.get(config.event)!.add(actualCallback);\n } else if (event === \"presence\" && typeof configOrCallback !== \"function\") {\n // on('presence', { event }, callback)\n const config = configOrCallback as { event: \"sync\" | \"join\" | \"leave\" };\n const actualCallback = callback as PresenceCallback;\n\n if (!this.presenceCallbacks.has(config.event)) {\n this.presenceCallbacks.set(config.event, new Set());\n }\n this.presenceCallbacks.get(config.event)!.add(actualCallback);\n } else {\n // on('INSERT'|'UPDATE'|'DELETE'|'*', callback)\n const actualEvent = event as \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\";\n const actualCallback = configOrCallback as RealtimeCallback;\n\n if (!this.callbacks.has(actualEvent)) {\n this.callbacks.set(actualEvent, new Set());\n }\n this.callbacks.get(actualEvent)!.add(actualCallback);\n }\n\n return this;\n }\n\n /**\n * Remove a callback\n */\n off(\n event: \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\",\n callback: RealtimeCallback,\n ): this {\n const callbacks = this.callbacks.get(event);\n if (callbacks) {\n callbacks.delete(callback);\n }\n return this;\n }\n\n /**\n * Subscribe to the channel\n * @param callback - Optional status callback (Supabase-compatible)\n * @param _timeout - Optional timeout in milliseconds (currently unused)\n */\n subscribe(\n callback?: (\n status: \"SUBSCRIBED\" | \"CHANNEL_ERROR\" | \"TIMED_OUT\" | \"CLOSED\",\n err?: Error,\n ) => void,\n _timeout?: number,\n ): this {\n // Re-enable reconnection in case this is a re-subscribe after unsubscribe\n this.shouldReconnect = true;\n this.connect();\n\n // Call callback with SUBSCRIBED status after connection\n if (callback) {\n // Wait for connection to open\n const checkConnection = () => {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n callback(\"SUBSCRIBED\");\n } else if (this.ws && this.ws.readyState === WebSocket.CLOSED) {\n callback(\"CHANNEL_ERROR\", new Error(\"Failed to connect\"));\n } else {\n setTimeout(checkConnection, 100);\n }\n };\n setTimeout(checkConnection, 100);\n }\n\n return this;\n }\n\n /**\n * Unsubscribe from the channel\n * @param timeout - Optional timeout in milliseconds\n * @returns Promise resolving to status string (Supabase-compatible)\n */\n async unsubscribe(timeout?: number): Promise<\"ok\" | \"timed out\" | \"error\"> {\n // Prevent automatic reconnection after intentional unsubscribe\n this.shouldReconnect = false;\n\n return new Promise((resolve) => {\n if (this.ws) {\n this.sendMessage({\n type: \"unsubscribe\",\n channel: this.channelName,\n subscription_id: this.subscriptionId || undefined,\n });\n\n // Wait for disconnect\n const startTime = Date.now();\n const maxWait = timeout || 5000;\n\n const checkDisconnect = () => {\n if (!this.ws || this.ws.readyState === WebSocket.CLOSED) {\n this.disconnect();\n resolve(\"ok\");\n } else if (Date.now() - startTime > maxWait) {\n this.disconnect();\n resolve(\"timed out\");\n } else {\n setTimeout(checkDisconnect, 100);\n }\n };\n\n setTimeout(checkDisconnect, 100);\n } else {\n resolve(\"ok\");\n }\n });\n }\n\n /**\n * Send a broadcast message to all subscribers on this channel\n *\n * @param message - Broadcast message with type, event, and payload\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * await channel.send({\n * type: 'broadcast',\n * event: 'cursor-pos',\n * payload: { x: 100, y: 200 }\n * })\n * ```\n */\n async send(message: BroadcastMessage): Promise<\"ok\" | \"error\"> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return \"error\";\n }\n\n try {\n // Generate message ID if acknowledgment is requested\n const messageId = this.config.broadcast?.ack\n ? `msg_${Date.now()}_${++this.messageIdCounter}`\n : undefined;\n\n this.ws.send(\n JSON.stringify({\n type: \"broadcast\",\n channel: this.channelName,\n event: message.event,\n payload: message.payload,\n ...(messageId && { messageId }),\n })\n );\n\n // Handle acknowledgment if configured\n if (this.config.broadcast?.ack && messageId) {\n // Wait for ack response with timeout (default 5 seconds)\n const ackTimeout = this.config.broadcast.ackTimeout || 5000;\n return await new Promise<\"ok\" | \"error\">((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingAcks.delete(messageId);\n reject(new Error(\"Acknowledgment timeout\"));\n }, ackTimeout);\n\n this.pendingAcks.set(messageId, {\n resolve: (value) => {\n clearTimeout(timeout);\n this.pendingAcks.delete(messageId);\n resolve(value as \"ok\" | \"error\");\n },\n reject: (reason) => {\n clearTimeout(timeout);\n this.pendingAcks.delete(messageId);\n reject(reason);\n },\n timeout,\n });\n }).catch((error) => {\n console.error(\"[Fluxbase Realtime] Acknowledgment error:\", error);\n return \"error\" as const;\n });\n }\n\n return \"ok\";\n } catch (error) {\n console.error(\"[Fluxbase Realtime] Failed to send broadcast:\", error);\n return \"error\";\n }\n }\n\n /**\n * Track user presence on this channel\n *\n * @param state - Presence state to track\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * await channel.track({\n * user_id: 123,\n * status: 'online'\n * })\n * ```\n */\n async track(state: PresenceState): Promise<\"ok\" | \"error\"> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return \"error\";\n }\n\n try {\n // Generate presence key if not set\n if (!this.myPresenceKey) {\n this.myPresenceKey =\n this.config.presence?.key || `presence-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n this.ws.send(\n JSON.stringify({\n type: \"presence\",\n channel: this.channelName,\n event: \"track\",\n payload: {\n key: this.myPresenceKey,\n state,\n },\n })\n );\n\n return \"ok\";\n } catch (error) {\n console.error(\"[Fluxbase Realtime] Failed to track presence:\", error);\n return \"error\";\n }\n }\n\n /**\n * Stop tracking presence on this channel\n *\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * await channel.untrack()\n * ```\n */\n async untrack(): Promise<\"ok\" | \"error\"> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return \"error\";\n }\n\n if (!this.myPresenceKey) {\n return \"ok\"; // Already not tracking\n }\n\n try {\n this.ws.send(\n JSON.stringify({\n type: \"presence\",\n channel: this.channelName,\n event: \"untrack\",\n payload: {\n key: this.myPresenceKey,\n },\n })\n );\n\n this.myPresenceKey = null;\n return \"ok\";\n } catch (error) {\n console.error(\"[Fluxbase Realtime] Failed to untrack presence:\", error);\n return \"error\";\n }\n }\n\n /**\n * Get current presence state for all users on this channel\n *\n * @returns Current presence state\n *\n * @example\n * ```typescript\n * const state = channel.presenceState()\n * console.log('Online users:', Object.keys(state).length)\n * ```\n */\n presenceState(): Record<string, PresenceState[]> {\n return { ...this._presenceState };\n }\n\n /**\n * Check if the current token is expired or about to expire\n */\n private isTokenExpired(): boolean {\n if (!this.token) return false;\n\n try {\n // Decode JWT payload (base64url encoded, second part)\n const parts = this.token.split(\".\");\n if (parts.length !== 3 || !parts[1]) return false;\n\n const payload = JSON.parse(atob(parts[1].replace(/-/g, \"+\").replace(/_/g, \"/\")));\n if (!payload.exp) return false;\n\n // Check if expired or will expire in the next 10 seconds\n const now = Math.floor(Date.now() / 1000);\n return payload.exp <= now + 10;\n } catch {\n // If we can't decode the token, assume it might be expired\n return true;\n }\n }\n\n /**\n * Internal: Connect to WebSocket\n */\n private connect() {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n return;\n }\n\n // Check if token is expired and we have a refresh callback\n if (this.isTokenExpired() && this.onTokenRefreshNeeded && !this.isRefreshingToken) {\n this.isRefreshingToken = true;\n console.log(\"[Fluxbase Realtime] Token expired, requesting refresh before connecting\");\n\n this.onTokenRefreshNeeded()\n .then((newToken) => {\n this.isRefreshingToken = false;\n if (newToken) {\n this.token = newToken;\n console.log(\"[Fluxbase Realtime] Token refreshed, connecting with new token\");\n }\n this.connectWithToken();\n })\n .catch((err) => {\n this.isRefreshingToken = false;\n console.error(\"[Fluxbase Realtime] Token refresh failed:\", err);\n // Try connecting anyway - might work if refresh failed for other reasons\n this.connectWithToken();\n });\n return;\n }\n\n this.connectWithToken();\n }\n\n /**\n * Internal: Actually establish the WebSocket connection\n */\n private connectWithToken() {\n // Build WebSocket URL\n const wsUrl = new URL(this.url);\n wsUrl.protocol = wsUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n wsUrl.pathname = \"/realtime\";\n\n if (this.token) {\n wsUrl.searchParams.set(\"token\", this.token);\n }\n\n this.ws = new WebSocket(wsUrl.toString());\n\n this.ws.onopen = () => {\n console.log(\"[Fluxbase Realtime] Connected\");\n this.reconnectAttempts = 0;\n\n // Subscribe to channel with optional config\n const subscribeMessage: RealtimeMessage = {\n type: \"subscribe\",\n channel: this.channelName,\n };\n\n // Add subscription config if using new postgres_changes API\n if (this.subscriptionConfig) {\n subscribeMessage.config = this.subscriptionConfig;\n }\n\n this.sendMessage(subscribeMessage);\n\n // Start heartbeat\n this.startHeartbeat();\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n let message: RealtimeMessage;\n try {\n message = typeof event.data === 'string'\n ? JSON.parse(event.data)\n : event.data;\n } catch (err) {\n console.error(\"[Fluxbase Realtime] Failed to parse message:\", err);\n return;\n }\n\n try {\n this.handleMessage(message);\n } catch (err) {\n console.error(\"[Fluxbase Realtime] Error handling message:\", err, message);\n }\n };\n\n this.ws.onerror = (error) => {\n console.error(\"[Fluxbase Realtime] WebSocket error:\", error);\n };\n\n this.ws.onclose = () => {\n console.log(\"[Fluxbase Realtime] Disconnected\");\n this.stopHeartbeat();\n this.attemptReconnect();\n };\n }\n\n /**\n * Internal: Disconnect WebSocket\n */\n private disconnect() {\n this.stopHeartbeat();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n /**\n * Internal: Send a message\n */\n private sendMessage(message: RealtimeMessage) {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(message));\n }\n }\n\n /**\n * Internal: Handle incoming message\n */\n private handleMessage(message: RealtimeMessage) {\n switch (message.type) {\n case \"heartbeat\":\n // Server heartbeat received - no echo needed\n // Client sends its own heartbeats on interval\n break;\n\n case \"broadcast\":\n if (message.broadcast) {\n this.handleBroadcastMessage(message.broadcast);\n } else if (message.payload) {\n // Legacy postgres_changes format\n this.handlePostgresChanges(message.payload);\n }\n break;\n\n case \"presence\":\n if (message.presence) {\n this.handlePresenceMessage(message.presence);\n }\n break;\n\n case \"ack\":\n // Handle broadcast acknowledgment\n if (message.messageId && this.pendingAcks.has(message.messageId)) {\n const ackHandler = this.pendingAcks.get(message.messageId);\n if (ackHandler) {\n ackHandler.resolve(message.status || \"ok\");\n }\n } else if (message.payload && typeof message.payload === 'object' && 'type' in message.payload) {\n const payload = message.payload as { type: string; updated?: boolean; subscription_id?: string };\n\n // Handle access_token acknowledgment\n if (payload.type === \"access_token\" && this.pendingAcks.has(\"access_token\")) {\n const ackHandler = this.pendingAcks.get(\"access_token\");\n if (ackHandler) {\n ackHandler.resolve(\"ok\");\n this.pendingAcks.delete(\"access_token\");\n }\n console.log(\"[Fluxbase Realtime] Token updated successfully\");\n } else {\n // Store subscription_id from subscription acknowledgment\n if (payload.subscription_id) {\n this.subscriptionId = payload.subscription_id;\n console.log(\"[Fluxbase Realtime] Subscription ID received:\", this.subscriptionId);\n } else {\n // Log other acknowledgments\n console.log(\"[Fluxbase Realtime] Acknowledged:\", message);\n }\n }\n } else {\n // Store subscription_id from subscription acknowledgment (legacy format)\n if (message.payload && typeof message.payload === 'object' && 'subscription_id' in message.payload) {\n this.subscriptionId = (message.payload as { subscription_id: string }).subscription_id;\n console.log(\"[Fluxbase Realtime] Subscription ID received:\", this.subscriptionId);\n } else {\n // Log other acknowledgments\n console.log(\"[Fluxbase Realtime] Acknowledged:\", message);\n }\n }\n break;\n\n case \"error\":\n console.error(\"[Fluxbase Realtime] Error:\", message.error);\n // If there's a pending access_token update, reject it and trigger reconnect\n if (this.pendingAcks.has(\"access_token\")) {\n const ackHandler = this.pendingAcks.get(\"access_token\");\n if (ackHandler) {\n ackHandler.reject(new Error(message.error || \"Token update failed\"));\n this.pendingAcks.delete(\"access_token\");\n }\n }\n break;\n\n case \"postgres_changes\":\n // Handle postgres_changes events\n if (message.payload) {\n this.handlePostgresChanges(message.payload);\n }\n break;\n }\n }\n\n /**\n * Internal: Handle broadcast message\n */\n private handleBroadcastMessage(message: any) {\n const event = message.event;\n const payload: RealtimeBroadcastPayload = {\n event,\n payload: message.payload,\n };\n\n // Filter self-messages if configured\n if (!this.config.broadcast?.self && message.self) {\n return;\n }\n\n // Call event-specific callbacks\n const callbacks = this.broadcastCallbacks.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => callback(payload));\n }\n\n // Call wildcard callbacks\n const wildcardCallbacks = this.broadcastCallbacks.get(\"*\");\n if (wildcardCallbacks) {\n wildcardCallbacks.forEach((callback) => callback(payload));\n }\n }\n\n /**\n * Internal: Handle presence message\n */\n private handlePresenceMessage(message: any) {\n const event = message.event as \"sync\" | \"join\" | \"leave\";\n const payload: RealtimePresencePayload = {\n event,\n key: message.key,\n newPresences: message.newPresences,\n leftPresences: message.leftPresences,\n currentPresences: message.currentPresences || this._presenceState,\n };\n\n // Update local presence state\n if (message.currentPresences) {\n this._presenceState = message.currentPresences;\n }\n\n // Call event-specific callbacks\n const callbacks = this.presenceCallbacks.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => callback(payload));\n }\n }\n\n /**\n * Internal: Handle postgres_changes message\n */\n private handlePostgresChanges(payload: any) {\n // Convert to Supabase-compatible format\n const supabasePayload: RealtimePostgresChangesPayload = {\n eventType: payload.type || payload.eventType,\n schema: payload.schema,\n table: payload.table,\n commit_timestamp:\n payload.timestamp ||\n payload.commit_timestamp ||\n new Date().toISOString(),\n new: payload.new_record || payload.new || payload.record || {},\n old: payload.old_record || payload.old || {},\n errors: payload.errors || null,\n };\n\n // Call event-specific callbacks\n const callbacks = this.callbacks.get(supabasePayload.eventType);\n if (callbacks) {\n callbacks.forEach((callback) => callback(supabasePayload));\n }\n\n // Call wildcard callbacks\n const wildcardCallbacks = this.callbacks.get(\"*\");\n if (wildcardCallbacks) {\n wildcardCallbacks.forEach((callback) => callback(supabasePayload));\n }\n }\n\n /**\n * Internal: Start heartbeat interval\n */\n private startHeartbeat() {\n // Clear any existing interval to prevent accumulation during reconnects\n this.stopHeartbeat();\n this.heartbeatInterval = setInterval(() => {\n this.sendMessage({ type: \"heartbeat\" });\n }, 30000); // 30 seconds\n }\n\n /**\n * Internal: Stop heartbeat interval\n */\n private stopHeartbeat() {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n /**\n * Update the authentication token on an existing connection\n * Sends an access_token message to the server to update auth context\n * On failure, silently triggers a reconnect\n *\n * @param token - The new JWT access token\n * @internal\n */\n updateToken(token: string | null) {\n this.token = token;\n\n // Only send update if connected\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n\n if (!token) {\n // If token is null, we need to reconnect (can't send null token message)\n this.disconnect();\n this.connect();\n return;\n }\n\n // Send access_token message\n const message: RealtimeMessage = {\n type: \"access_token\",\n token: token,\n };\n\n try {\n this.ws.send(JSON.stringify(message));\n\n // Set up a timeout for the acknowledgment\n const timeout = setTimeout(() => {\n console.warn(\n \"[Fluxbase Realtime] Token update acknowledgment timeout, reconnecting\"\n );\n this.disconnect();\n this.connect();\n }, 5000); // 5 second timeout\n\n // Store the timeout so we can clear it when we receive the ack\n // We'll handle this in handleMessage for 'ack' type with access_token\n this.pendingAcks.set(\"access_token\", {\n resolve: () => {\n clearTimeout(timeout);\n },\n reject: () => {\n clearTimeout(timeout);\n this.disconnect();\n this.connect();\n },\n timeout,\n });\n } catch (error) {\n console.error(\"[Fluxbase Realtime] Failed to send token update:\", error);\n // Silent fallback: reconnect\n this.disconnect();\n this.connect();\n }\n }\n\n /**\n * Internal: Attempt to reconnect\n */\n private attemptReconnect() {\n // Don't reconnect if intentionally disconnected\n if (!this.shouldReconnect) {\n return;\n }\n\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.error(\"[Fluxbase Realtime] Max reconnect attempts reached\");\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n\n console.log(\n `[Fluxbase Realtime] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`,\n );\n\n setTimeout(() => {\n this.connect();\n }, delay);\n }\n}\n\nexport class FluxbaseRealtime {\n private url: string;\n private token: string | null;\n private channels: Map<string, RealtimeChannel> = new Map();\n private tokenRefreshCallback: (() => Promise<string | null>) | null = null;\n\n constructor(url: string, token: string | null = null) {\n this.url = url;\n this.token = token;\n }\n\n /**\n * Set callback to request a token refresh when connections fail due to auth\n * This callback should refresh the auth token and return the new access token\n * @internal\n */\n setTokenRefreshCallback(callback: () => Promise<string | null>) {\n this.tokenRefreshCallback = callback;\n // Set callback on all existing channels\n this.channels.forEach((channel) => {\n channel.setTokenRefreshCallback(callback);\n });\n }\n\n /**\n * Create or get a channel with optional configuration\n *\n * @param channelName - Channel name (e.g., 'table:public.products')\n * @param config - Optional channel configuration\n * @returns RealtimeChannel instance\n *\n * @example\n * ```typescript\n * const channel = realtime.channel('room-1', {\n * broadcast: { self: true, ack: true },\n * presence: { key: 'user-123' }\n * })\n * ```\n */\n channel(\n channelName: string,\n config?: RealtimeChannelConfig\n ): RealtimeChannel {\n // Create a unique key based on name and config\n const configKey = config ? JSON.stringify(config) : \"\";\n const key = `${channelName}:${configKey}`;\n\n if (this.channels.has(key)) {\n return this.channels.get(key)!;\n }\n\n const channel = new RealtimeChannel(\n this.url,\n channelName,\n this.token,\n config\n );\n // Set token refresh callback if available\n if (this.tokenRefreshCallback) {\n channel.setTokenRefreshCallback(this.tokenRefreshCallback);\n }\n this.channels.set(key, channel);\n return channel;\n }\n\n /**\n * Remove a specific channel\n *\n * @param channel - The channel to remove\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * const channel = realtime.channel('room-1')\n * await realtime.removeChannel(channel)\n * ```\n */\n async removeChannel(\n channel: RealtimeChannel\n ): Promise<\"ok\" | \"error\"> {\n // Unsubscribe the channel\n await channel.unsubscribe();\n\n // Remove from channels map\n for (const [key, ch] of this.channels.entries()) {\n if (ch === channel) {\n this.channels.delete(key);\n return \"ok\";\n }\n }\n\n return \"error\";\n }\n\n /**\n * Remove all channels\n */\n removeAllChannels() {\n this.channels.forEach((channel) => channel.unsubscribe());\n this.channels.clear();\n }\n\n /**\n * Update auth token for all channels\n * Updates both the stored token for new channels and propagates\n * the token to all existing connected channels.\n *\n * @param token - The new auth token\n */\n setAuth(token: string | null) {\n this.token = token;\n // Update all existing connected channels\n this.channels.forEach((channel) => {\n channel.updateToken(token);\n });\n }\n}\n","/**\n * Storage client for file operations\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n FileObject,\n UploadOptions,\n UploadProgress,\n ListOptions,\n SignedUrlOptions,\n DownloadOptions,\n StreamDownloadData,\n ResumableDownloadOptions,\n ResumableDownloadData,\n ShareFileOptions,\n FileShare,\n BucketSettings,\n Bucket,\n} from \"./types\";\n\nexport class StorageBucket {\n private fetch: FluxbaseFetch;\n private bucketName: string;\n\n constructor(fetch: FluxbaseFetch, bucketName: string) {\n this.fetch = fetch;\n this.bucketName = bucketName;\n }\n\n /**\n * Upload a file to the bucket\n * @param path - The path/key for the file\n * @param file - The file to upload (File, Blob, ArrayBuffer, or ArrayBufferView like Uint8Array)\n * @param options - Upload options\n */\n async upload(\n path: string,\n file: File | Blob | ArrayBuffer | ArrayBufferView,\n options?: UploadOptions,\n ): Promise<{ data: { id: string; path: string; fullPath: string } | null; error: Error | null }> {\n try {\n // Prepare FormData (common to both code paths)\n const formData = new FormData();\n\n // Convert to Blob if ArrayBuffer or ArrayBufferView (Uint8Array, etc.)\n let blob: Blob | File;\n if (file instanceof ArrayBuffer) {\n blob = new Blob([file], { type: options?.contentType });\n } else if (ArrayBuffer.isView(file)) {\n // Cast needed because TypeScript's ArrayBufferView includes SharedArrayBuffer views\n blob = new Blob([file as BlobPart], { type: options?.contentType });\n } else {\n blob = file;\n }\n\n formData.append(\"file\", blob);\n\n if (options?.contentType) {\n formData.append(\"content_type\", options.contentType);\n }\n\n if (options?.metadata) {\n formData.append(\"metadata\", JSON.stringify(options.metadata));\n }\n\n if (options?.cacheControl) {\n formData.append(\"cache_control\", options.cacheControl);\n }\n\n if (options?.upsert !== undefined) {\n formData.append(\"upsert\", String(options.upsert));\n }\n\n let response: any;\n\n // Use XMLHttpRequest for progress tracking if callback is provided\n if (options?.onUploadProgress) {\n response = await this.uploadWithProgress(path, formData, options.onUploadProgress);\n } else {\n // Use standard fetch for uploads without progress tracking\n response = await this.fetch.request<any>(\n `/api/v1/storage/${this.bucketName}/${path}`,\n {\n method: \"POST\",\n body: formData,\n headers: {}, // Let browser set Content-Type for FormData\n },\n );\n }\n\n // Return Supabase-compatible response format\n return {\n data: {\n id: response.id || response.key || path,\n path: path,\n fullPath: `${this.bucketName}/${path}`\n },\n error: null\n };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Upload with progress tracking using XMLHttpRequest\n * @private\n */\n private uploadWithProgress(\n path: string,\n formData: FormData,\n onProgress: (progress: UploadProgress) => void,\n ): Promise<any> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n const url = `${this.fetch[\"baseUrl\"]}/api/v1/storage/${this.bucketName}/${path}`;\n\n // Track upload progress\n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable) {\n const percentage = Math.round((event.loaded / event.total) * 100);\n onProgress({\n loaded: event.loaded,\n total: event.total,\n percentage,\n });\n }\n });\n\n // Handle completion\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const response = JSON.parse(xhr.responseText);\n resolve(response);\n } catch (e) {\n resolve(xhr.responseText);\n }\n } else {\n try {\n const errorData = JSON.parse(xhr.responseText);\n reject(new Error(errorData.error || xhr.statusText));\n } catch (e) {\n reject(new Error(xhr.statusText));\n }\n }\n });\n\n // Handle errors\n xhr.addEventListener('error', () => {\n reject(new Error('Upload failed'));\n });\n\n xhr.addEventListener('abort', () => {\n reject(new Error('Upload aborted'));\n });\n\n // Open and send request\n xhr.open('POST', url);\n\n // Set authorization header if present\n const headers = this.fetch[\"defaultHeaders\"];\n for (const [key, value] of Object.entries(headers)) {\n // Don't set Content-Type header - let browser handle it for FormData\n if (key.toLowerCase() !== 'content-type') {\n xhr.setRequestHeader(key, value);\n }\n }\n\n xhr.send(formData);\n });\n }\n\n /**\n * Download a file from the bucket\n * @param path - The path/key of the file\n * @param options - Download options (use { stream: true } for streaming)\n *\n * @example\n * ```typescript\n * // Default: returns Blob\n * const { data: blob } = await storage.from('bucket').download('file.pdf');\n *\n * // Streaming: returns { stream, size } for progress tracking\n * const { data } = await storage.from('bucket').download('large.json', { stream: true });\n * console.log(`File size: ${data.size} bytes`);\n * // Process data.stream...\n * ```\n */\n async download(\n path: string,\n ): Promise<{ data: Blob | null; error: Error | null }>;\n async download(\n path: string,\n options: { stream: true; timeout?: number; signal?: AbortSignal },\n ): Promise<{ data: StreamDownloadData | null; error: Error | null }>;\n async download(\n path: string,\n options: { stream?: false; timeout?: number; signal?: AbortSignal },\n ): Promise<{ data: Blob | null; error: Error | null }>;\n async download(\n path: string,\n options?: DownloadOptions,\n ): Promise<{\n data: Blob | StreamDownloadData | null;\n error: Error | null;\n }> {\n try {\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n // Forward external signal to our controller\n if (options?.signal) {\n if (options.signal.aborted) {\n return { data: null, error: new Error(\"Download aborted\") };\n }\n options.signal.addEventListener(\"abort\", () => controller.abort(), {\n once: true,\n });\n }\n\n // For streaming: no timeout by default (large files need time)\n // For non-streaming: 30s default\n const timeout = options?.timeout ?? (options?.stream ? 0 : 30000);\n\n if (timeout > 0) {\n timeoutId = setTimeout(() => controller.abort(), timeout);\n }\n\n try {\n const response = await fetch(\n `${this.fetch[\"baseUrl\"]}/api/v1/storage/${this.bucketName}/${path}`,\n {\n headers: this.fetch[\"defaultHeaders\"],\n signal: controller.signal,\n },\n );\n\n if (timeoutId) clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`Failed to download file: ${response.statusText}`);\n }\n\n // Return stream with size if requested\n if (options?.stream) {\n if (!response.body) {\n throw new Error(\"Response body is not available for streaming\");\n }\n // Extract file size from Content-Length header\n const contentLength = response.headers.get(\"content-length\");\n const size = contentLength ? parseInt(contentLength, 10) : null;\n return {\n data: { stream: response.body, size },\n error: null,\n };\n }\n\n // Default: return Blob\n const blob = await response.blob();\n return { data: blob, error: null };\n } catch (err) {\n if (timeoutId) clearTimeout(timeoutId);\n\n if (err instanceof Error && err.name === \"AbortError\") {\n // Check if it was user abort or timeout\n if (options?.signal?.aborted) {\n return { data: null, error: new Error(\"Download aborted\") };\n }\n return { data: null, error: new Error(\"Download timeout\") };\n }\n throw err;\n }\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Download a file with resumable chunked downloads for large files.\n * Returns a ReadableStream that abstracts the chunking internally.\n *\n * Features:\n * - Downloads file in chunks using HTTP Range headers\n * - Automatically retries failed chunks with exponential backoff\n * - Reports progress via callback\n * - Falls back to regular streaming if Range not supported\n *\n * @param path - The file path within the bucket\n * @param options - Download options including chunk size, retries, and progress callback\n * @returns A ReadableStream and file size (consumer doesn't need to know about chunking)\n *\n * @example\n * ```typescript\n * const { data, error } = await storage.from('bucket').downloadResumable('large.json', {\n * chunkSize: 5 * 1024 * 1024, // 5MB chunks\n * maxRetries: 3,\n * onProgress: (progress) => console.log(`${progress.percentage}% complete`)\n * });\n * if (data) {\n * console.log(`File size: ${data.size} bytes`);\n * // Process data.stream...\n * }\n * ```\n */\n async downloadResumable(\n path: string,\n options?: ResumableDownloadOptions,\n ): Promise<{ data: ResumableDownloadData | null; error: Error | null }> {\n try {\n const chunkSize = options?.chunkSize ?? 5 * 1024 * 1024; // 5MB default\n const maxRetries = options?.maxRetries ?? 3;\n const retryDelayMs = options?.retryDelayMs ?? 1000;\n const chunkTimeout = options?.chunkTimeout ?? 30000;\n\n const url = `${this.fetch[\"baseUrl\"]}/api/v1/storage/${this.bucketName}/${path}`;\n const headers = this.fetch[\"defaultHeaders\"];\n\n // Check if already aborted\n if (options?.signal?.aborted) {\n return { data: null, error: new Error(\"Download aborted\") };\n }\n\n // Get file info with HEAD request to determine size and Range support\n const headResponse = await fetch(url, {\n method: \"HEAD\",\n headers,\n signal: options?.signal,\n });\n\n if (!headResponse.ok) {\n throw new Error(`Failed to get file info: ${headResponse.statusText}`);\n }\n\n const contentLength = headResponse.headers.get(\"content-length\");\n const acceptRanges = headResponse.headers.get(\"accept-ranges\");\n const totalSize = contentLength ? parseInt(contentLength, 10) : null;\n\n // If server doesn't support Range requests, fall back to regular streaming\n if (acceptRanges !== \"bytes\") {\n const { data, error } = await this.download(path, {\n stream: true,\n timeout: 0,\n signal: options?.signal,\n });\n if (error) return { data: null, error };\n return {\n data: data as ResumableDownloadData,\n error: null,\n };\n }\n\n // Create a ReadableStream that fetches chunks internally\n let downloadedBytes = 0;\n let currentChunk = 0;\n const totalChunks = totalSize ? Math.ceil(totalSize / chunkSize) : null;\n let lastProgressTime = Date.now();\n let lastProgressBytes = 0;\n\n const stream = new ReadableStream<Uint8Array>({\n async pull(controller) {\n // Check if aborted\n if (options?.signal?.aborted) {\n controller.error(new Error(\"Download aborted\"));\n return;\n }\n\n // Check if we've downloaded everything\n if (totalSize !== null && downloadedBytes >= totalSize) {\n controller.close();\n return;\n }\n\n const rangeStart = downloadedBytes;\n const rangeEnd =\n totalSize !== null\n ? Math.min(downloadedBytes + chunkSize - 1, totalSize - 1)\n : downloadedBytes + chunkSize - 1;\n\n let retryCount = 0;\n let chunk: Uint8Array | null = null;\n\n while (retryCount <= maxRetries && chunk === null) {\n try {\n // Check abort before each attempt\n if (options?.signal?.aborted) {\n controller.error(new Error(\"Download aborted\"));\n return;\n }\n\n const chunkController = new AbortController();\n const timeoutId = setTimeout(\n () => chunkController.abort(),\n chunkTimeout,\n );\n\n // Forward external signal to chunk controller\n if (options?.signal) {\n options.signal.addEventListener(\n \"abort\",\n () => chunkController.abort(),\n { once: true },\n );\n }\n\n const chunkResponse = await fetch(url, {\n headers: {\n ...headers,\n Range: `bytes=${rangeStart}-${rangeEnd}`,\n },\n signal: chunkController.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!chunkResponse.ok && chunkResponse.status !== 206) {\n throw new Error(\n `Chunk download failed: ${chunkResponse.statusText}`,\n );\n }\n\n const arrayBuffer = await chunkResponse.arrayBuffer();\n chunk = new Uint8Array(arrayBuffer);\n\n // Check if we got less data than expected (end of file)\n if (totalSize === null && chunk.byteLength < chunkSize) {\n downloadedBytes += chunk.byteLength;\n currentChunk++;\n controller.enqueue(chunk);\n controller.close();\n return;\n }\n } catch (err) {\n // Check if it was user abort\n if (options?.signal?.aborted) {\n controller.error(new Error(\"Download aborted\"));\n return;\n }\n\n retryCount++;\n if (retryCount > maxRetries) {\n controller.error(\n new Error(\n `Failed to download chunk after ${maxRetries} retries`,\n ),\n );\n return;\n }\n\n // Exponential backoff: 1s, 2s, 4s...\n const delay = retryDelayMs * Math.pow(2, retryCount - 1);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n if (chunk) {\n downloadedBytes += chunk.byteLength;\n currentChunk++;\n\n // Report progress\n if (options?.onProgress) {\n const now = Date.now();\n const elapsed = (now - lastProgressTime) / 1000;\n const bytesPerSecond =\n elapsed > 0\n ? (downloadedBytes - lastProgressBytes) / elapsed\n : 0;\n\n lastProgressTime = now;\n lastProgressBytes = downloadedBytes;\n\n options.onProgress({\n loaded: downloadedBytes,\n total: totalSize,\n percentage: totalSize\n ? Math.round((downloadedBytes / totalSize) * 100)\n : null,\n currentChunk,\n totalChunks,\n bytesPerSecond,\n });\n }\n\n controller.enqueue(chunk);\n\n // Check if we're done\n if (totalSize !== null && downloadedBytes >= totalSize) {\n controller.close();\n }\n }\n },\n });\n\n return {\n data: { stream, size: totalSize },\n error: null,\n };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List files in the bucket\n * Supports both Supabase-style list(path, options) and Fluxbase-style list(options)\n * @param pathOrOptions - The folder path or list options\n * @param maybeOptions - List options when first param is a path\n */\n async list(\n pathOrOptions?: string | ListOptions,\n maybeOptions?: ListOptions,\n ): Promise<{ data: FileObject[] | null; error: Error | null }> {\n try {\n const params = new URLSearchParams();\n\n // Determine if first arg is path or options\n let prefix: string | undefined;\n let options: ListOptions | undefined;\n\n if (typeof pathOrOptions === 'string') {\n // Supabase-style: list('path/', { limit: 10 })\n prefix = pathOrOptions;\n options = maybeOptions;\n } else {\n // Fluxbase-style: list({ prefix: 'path/', limit: 10 })\n options = pathOrOptions;\n prefix = options?.prefix;\n }\n\n if (prefix) {\n params.set(\"prefix\", prefix);\n }\n\n if (options?.limit) {\n params.set(\"limit\", String(options.limit));\n }\n\n if (options?.offset) {\n params.set(\"offset\", String(options.offset));\n }\n\n const queryString = params.toString();\n const path = `/api/v1/storage/${this.bucketName}${queryString ? `?${queryString}` : \"\"}`;\n\n const response = await this.fetch.get<{ files: any[] }>(path);\n\n // Convert to FileObject format\n const files: FileObject[] = (response.files || []).map((file: any) => ({\n name: file.key || file.name,\n id: file.id,\n bucket_id: file.bucket || this.bucketName,\n created_at: file.last_modified || file.created_at,\n updated_at: file.updated_at,\n last_accessed_at: file.last_accessed_at,\n metadata: file.metadata,\n }));\n\n return { data: files, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Remove files from the bucket\n * @param paths - Array of file paths to remove\n */\n async remove(paths: string[]): Promise<{ data: FileObject[] | null; error: Error | null }> {\n try {\n const removedFiles: FileObject[] = [];\n\n // Delete files one by one (could be optimized with batch endpoint)\n for (const path of paths) {\n await this.fetch.delete(`/api/v1/storage/${this.bucketName}/${path}`);\n // Add to removed files list\n removedFiles.push({\n name: path,\n bucket_id: this.bucketName,\n });\n }\n\n return { data: removedFiles, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get a public URL for a file\n * @param path - The file path\n */\n getPublicUrl(path: string): { data: { publicUrl: string } } {\n const publicUrl = `${this.fetch[\"baseUrl\"]}/api/v1/storage/${this.bucketName}/${path}`;\n return { data: { publicUrl } };\n }\n\n /**\n * Create a signed URL for temporary access to a file\n * @param path - The file path\n * @param options - Signed URL options\n */\n async createSignedUrl(\n path: string,\n options?: SignedUrlOptions,\n ): Promise<{ data: { signedUrl: string } | null; error: Error | null }> {\n try {\n const expiresIn = options?.expiresIn || 3600; // Default 1 hour\n\n const data = await this.fetch.post<{ signed_url: string }>(\n `/api/v1/storage/${this.bucketName}/sign/${path}`,\n { expires_in: expiresIn },\n );\n\n return { data: { signedUrl: data.signed_url }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Move a file to a new location\n * @param fromPath - Current file path\n * @param toPath - New file path\n */\n async move(\n fromPath: string,\n toPath: string,\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n await this.fetch.post(\n `/api/v1/storage/${this.bucketName}/move`,\n {\n from_path: fromPath,\n to_path: toPath,\n },\n );\n\n return {\n data: { message: 'Successfully moved' },\n error: null\n };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Copy a file to a new location\n * @param fromPath - Source file path\n * @param toPath - Destination file path\n */\n async copy(\n fromPath: string,\n toPath: string,\n ): Promise<{ data: { path: string } | null; error: Error | null }> {\n try {\n await this.fetch.post(\n `/api/v1/storage/${this.bucketName}/copy`,\n {\n from_path: fromPath,\n to_path: toPath,\n },\n );\n\n return {\n data: { path: toPath },\n error: null\n };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Share a file with another user (RLS)\n * @param path - The file path\n * @param options - Share options (userId and permission)\n */\n async share(\n path: string,\n options: ShareFileOptions,\n ): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.post(\n `/api/v1/storage/${this.bucketName}/${path}/share`,\n {\n user_id: options.userId,\n permission: options.permission,\n },\n );\n\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Revoke file access from a user (RLS)\n * @param path - The file path\n * @param userId - The user ID to revoke access from\n */\n async revokeShare(\n path: string,\n userId: string,\n ): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.delete(\n `/api/v1/storage/${this.bucketName}/${path}/share/${userId}`,\n );\n\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List users a file is shared with (RLS)\n * @param path - The file path\n */\n async listShares(\n path: string,\n ): Promise<{ data: FileShare[] | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<{ shares: FileShare[] }>(\n `/api/v1/storage/${this.bucketName}/${path}/shares`,\n );\n\n return { data: data.shares || [], error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n}\n\nexport class FluxbaseStorage {\n private fetch: FluxbaseFetch;\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch;\n }\n\n /**\n * Get a reference to a storage bucket\n * @param bucketName - The name of the bucket\n */\n from(bucketName: string): StorageBucket {\n return new StorageBucket(this.fetch, bucketName);\n }\n\n /**\n * List all buckets\n */\n async listBuckets(): Promise<{\n data: Array<{ name: string; created_at: string }> | null;\n error: Error | null;\n }> {\n try {\n const data = await this.fetch.get<{\n buckets: Array<{ name: string; created_at: string }>;\n }>(\"/api/v1/storage/buckets\");\n\n return { data: data.buckets || [], error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Create a new bucket\n * @param bucketName - The name of the bucket to create\n */\n async createBucket(\n bucketName: string,\n ): Promise<{ data: { name: string } | null; error: Error | null }> {\n try {\n await this.fetch.post(`/api/v1/storage/buckets/${bucketName}`);\n return { data: { name: bucketName }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Delete a bucket\n * @param bucketName - The name of the bucket to delete\n */\n async deleteBucket(\n bucketName: string,\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n await this.fetch.delete(`/api/v1/storage/buckets/${bucketName}`);\n return { data: { message: 'Successfully deleted' }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Empty a bucket (delete all files)\n * @param bucketName - The name of the bucket to empty\n */\n async emptyBucket(\n bucketName: string,\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n // List all files and delete them\n const bucket = this.from(bucketName);\n const { data: objects, error: listError } = await bucket.list();\n\n if (listError) {\n return { data: null, error: listError };\n }\n\n if (objects && objects.length > 0) {\n const paths = objects.map((obj) => obj.name);\n const { error: removeError } = await bucket.remove(paths);\n\n if (removeError) {\n return { data: null, error: removeError };\n }\n }\n\n return { data: { message: 'Successfully emptied' }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Update bucket settings (RLS - requires admin or service key)\n * @param bucketName - The name of the bucket\n * @param settings - Bucket settings to update\n */\n async updateBucketSettings(\n bucketName: string,\n settings: BucketSettings,\n ): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.put(`/api/v1/storage/buckets/${bucketName}`, settings);\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get bucket details\n * @param bucketName - The name of the bucket\n */\n async getBucket(\n bucketName: string,\n ): Promise<{ data: Bucket | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<Bucket>(\n `/api/v1/storage/buckets/${bucketName}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n}\n","/**\n * Edge Functions module for Fluxbase SDK\n * Compatible with Supabase Functions API\n *\n * @example\n * ```typescript\n * // Invoke a function\n * const { data, error } = await client.functions.invoke('hello-world', {\n * body: { name: 'Alice' }\n * })\n *\n * // With custom headers\n * const { data, error } = await client.functions.invoke('api-call', {\n * body: { query: 'data' },\n * headers: { 'X-Custom-Header': 'value' },\n * method: 'POST'\n * })\n * ```\n */\n\nimport type { FluxbaseFetch } from './fetch'\nimport type {\n FunctionInvokeOptions,\n EdgeFunction,\n} from './types'\n\n/**\n * Edge Functions client for invoking serverless functions\n * API-compatible with Supabase Functions\n *\n * For admin operations (create, update, delete, sync), use client.admin.functions\n *\n * @category Functions\n */\nexport class FluxbaseFunctions {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Invoke an edge function\n *\n * This method is fully compatible with Supabase's functions.invoke() API.\n *\n * @param functionName - The name of the function to invoke\n * @param options - Invocation options including body, headers, HTTP method, and namespace\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * // Simple invocation (uses first matching function by namespace alphabetically)\n * const { data, error } = await client.functions.invoke('hello', {\n * body: { name: 'World' }\n * })\n *\n * // Invoke a specific namespace's function\n * const { data, error } = await client.functions.invoke('hello', {\n * body: { name: 'World' },\n * namespace: 'my-app'\n * })\n *\n * // With GET method\n * const { data, error } = await client.functions.invoke('get-data', {\n * method: 'GET'\n * })\n *\n * // With custom headers\n * const { data, error } = await client.functions.invoke('api-proxy', {\n * body: { query: 'search' },\n * headers: { 'Authorization': 'Bearer token' },\n * method: 'POST'\n * })\n * ```\n */\n async invoke<T = any>(\n functionName: string,\n options?: FunctionInvokeOptions\n ): Promise<{ data: T | null; error: Error | null }> {\n try {\n const method = options?.method || 'POST'\n const headers = options?.headers || {}\n const body = options?.body\n const namespace = options?.namespace\n\n // Use the Fluxbase backend endpoint\n // If namespace is provided, add it as a query parameter\n const endpoint = namespace\n ? `/api/v1/functions/${functionName}/invoke?namespace=${encodeURIComponent(namespace)}`\n : `/api/v1/functions/${functionName}/invoke`\n\n let response: T\n\n // Route to appropriate HTTP method\n switch (method) {\n case 'GET':\n response = await this.fetch.get<T>(endpoint, { headers })\n break\n case 'DELETE':\n response = await this.fetch.delete<T>(endpoint, { headers })\n break\n case 'PUT':\n response = await this.fetch.put<T>(endpoint, body, { headers })\n break\n case 'PATCH':\n response = await this.fetch.patch<T>(endpoint, body, { headers })\n break\n case 'POST':\n default:\n response = await this.fetch.post<T>(endpoint, body, { headers })\n break\n }\n\n return { data: response, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * List all public edge functions\n *\n * @returns Promise resolving to { data, error } tuple with array of public functions\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.list()\n * if (data) {\n * console.log('Functions:', data.map(f => f.name))\n * }\n * ```\n */\n async list(): Promise<{ data: EdgeFunction[] | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<EdgeFunction[]>('/api/v1/functions')\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Get details of a specific edge function\n *\n * @param name - Function name\n * @returns Promise resolving to { data, error } tuple with function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.get('my-function')\n * if (data) {\n * console.log('Function version:', data.version)\n * }\n * ```\n */\n async get(name: string): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<EdgeFunction>(`/api/v1/functions/${name}`)\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n}\n","/**\n * Jobs module for Fluxbase SDK\n * Client-facing API for submitting and monitoring background jobs\n *\n * @example\n * ```typescript\n * // Submit a job\n * const { data, error } = await client.jobs.submit('process-data', {\n * items: [1, 2, 3]\n * })\n *\n * // Get job status\n * const { data: job, error } = await client.jobs.get(data.id)\n * console.log('Job status:', job.status)\n *\n * // Cancel a running job\n * await client.jobs.cancel(data.id)\n * ```\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type { Job, SubmitJobRequest } from \"./types\";\n\n/**\n * Jobs client for submitting and monitoring background jobs\n *\n * For admin operations (create job functions, manage workers, view all jobs),\n * use client.admin.jobs\n *\n * @category Jobs\n */\nexport class FluxbaseJobs {\n private fetch: FluxbaseFetch;\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch;\n }\n\n /**\n * Submit a new job for execution\n *\n * @param jobName - Name of the job function to execute\n * @param payload - Job input data\n * @param options - Additional options (priority, namespace, scheduled time)\n * @returns Promise resolving to { data, error } tuple with submitted job details\n *\n * @example\n * ```typescript\n * // Submit a simple job\n * const { data, error } = await client.jobs.submit('send-email', {\n * to: 'user@example.com',\n * subject: 'Hello',\n * body: 'Welcome!'\n * })\n *\n * if (data) {\n * console.log('Job submitted:', data.id)\n * console.log('Status:', data.status)\n * }\n *\n * // Submit with priority\n * const { data } = await client.jobs.submit('high-priority-task', payload, {\n * priority: 10\n * })\n *\n * // Schedule for later\n * const { data } = await client.jobs.submit('scheduled-task', payload, {\n * scheduled: '2025-01-01T00:00:00Z'\n * })\n * ```\n */\n async submit(\n jobName: string,\n payload?: any,\n options?: {\n priority?: number;\n namespace?: string;\n scheduled?: string;\n },\n ): Promise<{ data: Job | null; error: Error | null }> {\n try {\n const request: SubmitJobRequest = {\n job_name: jobName,\n payload,\n ...options,\n };\n\n const data = await this.fetch.post<Job>(\"/api/v1/jobs/submit\", request);\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get status and details of a specific job\n *\n * @param jobId - Job ID\n * @returns Promise resolving to { data, error } tuple with job details\n *\n * @example\n * ```typescript\n * const { data: job, error } = await client.jobs.get('550e8400-e29b-41d4-a716-446655440000')\n *\n * if (job) {\n * console.log('Status:', job.status)\n * console.log('Progress:', job.progress_percent + '%')\n * console.log('Result:', job.result)\n * console.log('Logs:', job.logs)\n * }\n * ```\n */\n async get(jobId: string): Promise<{ data: Job | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<Job>(`/api/v1/jobs/${jobId}`);\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List jobs submitted by the current user\n *\n * @param filters - Optional filters (status, namespace, limit, offset)\n * @returns Promise resolving to { data, error } tuple with array of jobs\n *\n * @example\n * ```typescript\n * // List all your jobs\n * const { data: jobs, error } = await client.jobs.list()\n *\n * // Filter by status\n * const { data: running } = await client.jobs.list({\n * status: 'running'\n * })\n *\n * // Paginate\n * const { data: page } = await client.jobs.list({\n * limit: 20,\n * offset: 40\n * })\n * ```\n */\n async list(filters?: {\n status?: string;\n namespace?: string;\n limit?: number;\n offset?: number;\n includeResult?: boolean;\n }): Promise<{ data: Job[] | null; error: Error | null }> {\n try {\n const params = new URLSearchParams();\n if (filters?.status) params.append(\"status\", filters.status);\n if (filters?.namespace) params.append(\"namespace\", filters.namespace);\n if (filters?.limit) params.append(\"limit\", filters.limit.toString());\n if (filters?.offset) params.append(\"offset\", filters.offset.toString());\n if (filters?.includeResult) params.append(\"include_result\", \"true\");\n\n const queryString = params.toString();\n const data = await this.fetch.get<Job[]>(\n `/api/v1/jobs${queryString ? `?${queryString}` : \"\"}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Cancel a pending or running job\n *\n * @param jobId - Job ID to cancel\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * const { error } = await client.jobs.cancel('550e8400-e29b-41d4-a716-446655440000')\n *\n * if (!error) {\n * console.log('Job cancelled successfully')\n * }\n * ```\n */\n async cancel(jobId: string): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.post(`/api/v1/jobs/${jobId}/cancel`, {});\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Retry a failed job\n *\n * Creates a new job execution with the same parameters\n *\n * @param jobId - Job ID to retry\n * @returns Promise resolving to { data, error } tuple with new job\n *\n * @example\n * ```typescript\n * const { data: newJob, error } = await client.jobs.retry('550e8400-e29b-41d4-a716-446655440000')\n *\n * if (newJob) {\n * console.log('Job retried, new ID:', newJob.id)\n * }\n * ```\n */\n async retry(jobId: string): Promise<{ data: Job | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<Job>(`/api/v1/jobs/${jobId}/retry`, {});\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n}\n","import type { FluxbaseFetch } from \"./fetch\";\nimport type {\n SystemSetting,\n UpdateSystemSettingRequest,\n ListSystemSettingsResponse,\n AppSettings,\n UpdateAppSettingsRequest,\n CustomSetting,\n EmailTemplate,\n EmailTemplateType,\n UpdateEmailTemplateRequest,\n ListEmailTemplatesResponse,\n} from \"./types\";\n\n/**\n * System Settings Manager\n *\n * Manages low-level system settings with key-value storage.\n * For application-level settings, use AppSettingsManager instead.\n *\n * @example\n * ```typescript\n * const settings = client.admin.settings.system\n *\n * // List all system settings\n * const { settings } = await settings.list()\n *\n * // Get specific setting\n * const setting = await settings.get('app.auth.enable_signup')\n *\n * // Update setting\n * await settings.update('app.auth.enable_signup', {\n * value: { value: true },\n * description: 'Enable user signup'\n * })\n *\n * // Delete setting\n * await settings.delete('app.auth.enable_signup')\n * ```\n */\nexport class SystemSettingsManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * List all system settings\n *\n * @returns Promise resolving to ListSystemSettingsResponse\n *\n * @example\n * ```typescript\n * const response = await client.admin.settings.system.list()\n * console.log(response.settings)\n * ```\n */\n async list(): Promise<ListSystemSettingsResponse> {\n const settings = await this.fetch.get<SystemSetting[]>(\n \"/api/v1/admin/system/settings\",\n );\n return { settings: Array.isArray(settings) ? settings : [] };\n }\n\n /**\n * Get a specific system setting by key\n *\n * @param key - Setting key (e.g., 'app.auth.enable_signup')\n * @returns Promise resolving to SystemSetting\n *\n * @example\n * ```typescript\n * const setting = await client.admin.settings.system.get('app.auth.enable_signup')\n * console.log(setting.value)\n * ```\n */\n async get(key: string): Promise<SystemSetting> {\n return await this.fetch.get<SystemSetting>(\n `/api/v1/admin/system/settings/${key}`,\n );\n }\n\n /**\n * Update or create a system setting\n *\n * @param key - Setting key\n * @param request - Update request with value and optional description\n * @returns Promise resolving to SystemSetting\n *\n * @example\n * ```typescript\n * const updated = await client.admin.settings.system.update('app.auth.enable_signup', {\n * value: { value: true },\n * description: 'Enable user signup'\n * })\n * ```\n */\n async update(\n key: string,\n request: UpdateSystemSettingRequest,\n ): Promise<SystemSetting> {\n return await this.fetch.put<SystemSetting>(\n `/api/v1/admin/system/settings/${key}`,\n request,\n );\n }\n\n /**\n * Delete a system setting\n *\n * @param key - Setting key to delete\n * @returns Promise<void>\n *\n * @example\n * ```typescript\n * await client.admin.settings.system.delete('app.auth.enable_signup')\n * ```\n */\n async delete(key: string): Promise<void> {\n await this.fetch.delete(`/api/v1/admin/system/settings/${key}`);\n }\n}\n\n/**\n * Application Settings Manager\n *\n * Manages high-level application settings with a structured API.\n * Provides type-safe access to authentication, features, email, and security settings.\n *\n * @example\n * ```typescript\n * const settings = client.admin.settings.app\n *\n * // Get all app settings\n * const appSettings = await settings.get()\n * console.log(appSettings.authentication.enable_signup)\n *\n * // Update specific settings\n * const updated = await settings.update({\n * authentication: {\n * enable_signup: true,\n * password_min_length: 12\n * }\n * })\n *\n * // Reset to defaults\n * await settings.reset()\n * ```\n */\nexport class AppSettingsManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Get all application settings\n *\n * Returns structured settings for authentication, features, email, and security.\n *\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * const settings = await client.admin.settings.app.get()\n *\n * console.log('Signup enabled:', settings.authentication.enable_signup)\n * console.log('Realtime enabled:', settings.features.enable_realtime)\n * console.log('Email provider:', settings.email.provider)\n * ```\n */\n async get(): Promise<AppSettings> {\n return await this.fetch.get<AppSettings>(\"/api/v1/admin/app/settings\");\n }\n\n /**\n * Update application settings\n *\n * Supports partial updates - only provide the fields you want to change.\n *\n * @param request - Settings to update (partial update supported)\n * @returns Promise resolving to AppSettings - Updated settings\n *\n * @example\n * ```typescript\n * // Update authentication settings\n * const updated = await client.admin.settings.app.update({\n * authentication: {\n * enable_signup: true,\n * password_min_length: 12\n * }\n * })\n *\n * // Update multiple categories\n * await client.admin.settings.app.update({\n * authentication: { enable_signup: false },\n * features: { enable_realtime: true },\n * security: { enable_global_rate_limit: true }\n * })\n * ```\n */\n async update(request: UpdateAppSettingsRequest): Promise<AppSettings> {\n return await this.fetch.put<AppSettings>(\n \"/api/v1/admin/app/settings\",\n request,\n );\n }\n\n /**\n * Reset all application settings to defaults\n *\n * This will delete all custom settings and return to default values.\n *\n * @returns Promise resolving to AppSettings - Default settings\n *\n * @example\n * ```typescript\n * const defaults = await client.admin.settings.app.reset()\n * console.log('Settings reset to defaults:', defaults)\n * ```\n */\n async reset(): Promise<AppSettings> {\n return await this.fetch.post<AppSettings>(\n \"/api/v1/admin/app/settings/reset\",\n {},\n );\n }\n\n /**\n * Enable user signup\n *\n * Convenience method to enable user registration.\n *\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.enableSignup()\n * ```\n */\n async enableSignup(): Promise<AppSettings> {\n return await this.update({\n authentication: { enable_signup: true },\n });\n }\n\n /**\n * Disable user signup\n *\n * Convenience method to disable user registration.\n *\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.disableSignup()\n * ```\n */\n async disableSignup(): Promise<AppSettings> {\n return await this.update({\n authentication: { enable_signup: false },\n });\n }\n\n /**\n * Update password minimum length\n *\n * Convenience method to set password requirements.\n *\n * @param length - Minimum password length (8-128 characters)\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setPasswordMinLength(12)\n * ```\n */\n async setPasswordMinLength(length: number): Promise<AppSettings> {\n if (length < 8 || length > 128) {\n throw new Error(\n \"Password minimum length must be between 8 and 128 characters\",\n );\n }\n\n return await this.update({\n authentication: { password_min_length: length },\n });\n }\n\n /**\n * Enable or disable a feature\n *\n * Convenience method to toggle feature flags.\n *\n * @param feature - Feature name ('realtime' | 'storage' | 'functions')\n * @param enabled - Whether to enable or disable the feature\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * // Enable realtime\n * await client.admin.settings.app.setFeature('realtime', true)\n *\n * // Disable storage\n * await client.admin.settings.app.setFeature('storage', false)\n * ```\n */\n async setFeature(\n feature: \"realtime\" | \"storage\" | \"functions\",\n enabled: boolean,\n ): Promise<AppSettings> {\n const featureKey =\n feature === \"realtime\"\n ? \"enable_realtime\"\n : feature === \"storage\"\n ? \"enable_storage\"\n : \"enable_functions\";\n\n return await this.update({\n features: { [featureKey]: enabled },\n });\n }\n\n /**\n * Enable or disable global rate limiting\n *\n * Convenience method to toggle global rate limiting.\n *\n * @param enabled - Whether to enable rate limiting\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setRateLimiting(true)\n * ```\n */\n async setRateLimiting(enabled: boolean): Promise<AppSettings> {\n return await this.update({\n security: { enable_global_rate_limit: enabled },\n });\n }\n\n /**\n * Configure SMTP email provider\n *\n * Convenience method to set up SMTP email delivery.\n *\n * @param config - SMTP configuration\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureSMTP({\n * host: 'smtp.gmail.com',\n * port: 587,\n * username: 'your-email@gmail.com',\n * password: 'your-app-password',\n * use_tls: true,\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * })\n * ```\n */\n async configureSMTP(config: {\n host: string;\n port: number;\n username: string;\n password: string;\n use_tls: boolean;\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n }): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"smtp\",\n from_address: config.from_address,\n from_name: config.from_name,\n reply_to_address: config.reply_to_address,\n smtp: {\n host: config.host,\n port: config.port,\n username: config.username,\n password: config.password,\n use_tls: config.use_tls,\n },\n },\n });\n }\n\n /**\n * Configure SendGrid email provider\n *\n * Convenience method to set up SendGrid email delivery.\n *\n * @param apiKey - SendGrid API key\n * @param options - Optional from address, name, and reply-to\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureSendGrid('SG.xxx', {\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * })\n * ```\n */\n async configureSendGrid(\n apiKey: string,\n options?: {\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n },\n ): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"sendgrid\",\n from_address: options?.from_address,\n from_name: options?.from_name,\n reply_to_address: options?.reply_to_address,\n sendgrid: {\n api_key: apiKey,\n },\n },\n });\n }\n\n /**\n * Configure Mailgun email provider\n *\n * Convenience method to set up Mailgun email delivery.\n *\n * @param apiKey - Mailgun API key\n * @param domain - Mailgun domain\n * @param options - Optional EU region flag and email addresses\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureMailgun('key-xxx', 'mg.yourapp.com', {\n * eu_region: false,\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * })\n * ```\n */\n async configureMailgun(\n apiKey: string,\n domain: string,\n options?: {\n eu_region?: boolean;\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n },\n ): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"mailgun\",\n from_address: options?.from_address,\n from_name: options?.from_name,\n reply_to_address: options?.reply_to_address,\n mailgun: {\n api_key: apiKey,\n domain: domain,\n eu_region: options?.eu_region ?? false,\n },\n },\n });\n }\n\n /**\n * Configure AWS SES email provider\n *\n * Convenience method to set up AWS SES email delivery.\n *\n * @param accessKeyId - AWS access key ID\n * @param secretAccessKey - AWS secret access key\n * @param region - AWS region (e.g., 'us-east-1')\n * @param options - Optional email addresses\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureSES(\n * 'AKIAIOSFODNN7EXAMPLE',\n * 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',\n * 'us-east-1',\n * {\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * }\n * )\n * ```\n */\n async configureSES(\n accessKeyId: string,\n secretAccessKey: string,\n region: string,\n options?: {\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n },\n ): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"ses\",\n from_address: options?.from_address,\n from_name: options?.from_name,\n reply_to_address: options?.reply_to_address,\n ses: {\n access_key_id: accessKeyId,\n secret_access_key: secretAccessKey,\n region: region,\n },\n },\n });\n }\n\n /**\n * Enable or disable email functionality\n *\n * Convenience method to toggle email system on/off.\n *\n * @param enabled - Whether to enable email\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setEmailEnabled(true)\n * ```\n */\n async setEmailEnabled(enabled: boolean): Promise<AppSettings> {\n return await this.update({\n email: { enabled },\n });\n }\n\n /**\n * Configure password complexity requirements\n *\n * Convenience method to set password validation rules.\n *\n * @param requirements - Password complexity requirements\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setPasswordComplexity({\n * min_length: 12,\n * require_uppercase: true,\n * require_lowercase: true,\n * require_number: true,\n * require_special: true\n * })\n * ```\n */\n async setPasswordComplexity(requirements: {\n min_length?: number;\n require_uppercase?: boolean;\n require_lowercase?: boolean;\n require_number?: boolean;\n require_special?: boolean;\n }): Promise<AppSettings> {\n return await this.update({\n authentication: {\n password_min_length: requirements.min_length,\n password_require_uppercase: requirements.require_uppercase,\n password_require_lowercase: requirements.require_lowercase,\n password_require_number: requirements.require_number,\n password_require_special: requirements.require_special,\n },\n });\n }\n\n /**\n * Configure session settings\n *\n * Convenience method to set session timeout and limits.\n *\n * @param timeoutMinutes - Session timeout in minutes (0 for no timeout)\n * @param maxSessionsPerUser - Maximum concurrent sessions per user (0 for unlimited)\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * // 30 minute sessions, max 3 devices per user\n * await client.admin.settings.app.setSessionSettings(30, 3)\n * ```\n */\n async setSessionSettings(\n timeoutMinutes: number,\n maxSessionsPerUser: number,\n ): Promise<AppSettings> {\n return await this.update({\n authentication: {\n session_timeout_minutes: timeoutMinutes,\n max_sessions_per_user: maxSessionsPerUser,\n },\n });\n }\n\n /**\n * Enable or disable email verification requirement\n *\n * Convenience method to require email verification for new signups.\n *\n * @param required - Whether to require email verification\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setEmailVerificationRequired(true)\n * ```\n */\n async setEmailVerificationRequired(required: boolean): Promise<AppSettings> {\n return await this.update({\n authentication: { require_email_verification: required },\n });\n }\n\n // ===================================================================\n // CUSTOM SETTINGS METHODS\n // Flexible key-value storage for application-specific configuration\n // ===================================================================\n\n /**\n * Get a specific custom setting's value only (without metadata)\n *\n * Convenience method that returns just the value field instead of the full CustomSetting object.\n *\n * @param key - Setting key (e.g., 'billing.tiers', 'features.beta_enabled')\n * @returns Promise resolving to the setting's value\n *\n * @example\n * ```typescript\n * const tiers = await client.admin.settings.app.getSetting('billing.tiers')\n * console.log(tiers) // { free: 1000, pro: 10000, enterprise: 100000 }\n * ```\n */\n async getSetting(key: string): Promise<any> {\n const setting = await this.fetch.get<CustomSetting>(\n `/api/v1/admin/settings/custom/${key}`,\n );\n return setting.value;\n }\n\n /**\n * Get multiple custom settings' values by keys\n *\n * Fetches multiple settings in a single request and returns only their values.\n *\n * @param keys - Array of setting keys to fetch\n * @returns Promise resolving to object mapping keys to values\n *\n * @example\n * ```typescript\n * const values = await client.admin.settings.app.getSettings([\n * 'billing.tiers',\n * 'features.beta_enabled'\n * ])\n * console.log(values)\n * // {\n * // 'billing.tiers': { free: 1000, pro: 10000 },\n * // 'features.beta_enabled': { enabled: true }\n * // }\n * ```\n */\n async getSettings(keys: string[]): Promise<Record<string, any>> {\n const response = await this.fetch.post<CustomSetting[]>(\n \"/api/v1/settings/batch\",\n { keys },\n );\n return response.reduce(\n (acc, setting) => {\n acc[setting.key] = setting.value;\n return acc;\n },\n {} as Record<string, any>,\n );\n }\n\n /**\n * Set or create a custom setting\n *\n * Creates a new custom setting or updates an existing one.\n *\n * @param key - Setting key\n * @param value - Setting value (any JSON-serializable value)\n * @param options - Optional configuration (description, is_public, is_secret, etc.)\n * @returns Promise resolving to CustomSetting\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setSetting('billing.tiers', {\n * free: 1000,\n * pro: 10000,\n * enterprise: 100000\n * }, {\n * description: 'API quotas per billing tier',\n * is_public: false\n * })\n * ```\n */\n async setSetting(\n key: string,\n value: any,\n options?: {\n description?: string;\n is_public?: boolean;\n is_secret?: boolean;\n value_type?: string;\n },\n ): Promise<CustomSetting> {\n // Try to update first, if not found, create\n try {\n return await this.fetch.put<CustomSetting>(\n `/api/v1/admin/settings/custom/${key}`,\n {\n value,\n description: options?.description,\n is_public: options?.is_public,\n is_secret: options?.is_secret,\n },\n );\n } catch (error: any) {\n // If not found (404), create new setting\n if (error.status === 404 || error.message?.includes(\"not found\")) {\n return await this.fetch.post<CustomSetting>(\n \"/api/v1/admin/settings/custom\",\n {\n key,\n value,\n value_type: options?.value_type || \"json\",\n description: options?.description,\n is_public: options?.is_public ?? false,\n is_secret: options?.is_secret ?? false,\n },\n );\n }\n throw error;\n }\n }\n\n /**\n * List all custom settings\n *\n * @returns Promise resolving to array of CustomSetting objects\n *\n * @example\n * ```typescript\n * const settings = await client.admin.settings.app.listSettings()\n * settings.forEach(s => console.log(s.key, s.value))\n * ```\n */\n async listSettings(): Promise<CustomSetting[]> {\n return await this.fetch.get<CustomSetting[]>(\n \"/api/v1/admin/settings/custom\",\n );\n }\n\n /**\n * Delete a custom setting\n *\n * @param key - Setting key to delete\n * @returns Promise<void>\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.deleteSetting('billing.tiers')\n * ```\n */\n async deleteSetting(key: string): Promise<void> {\n await this.fetch.delete(`/api/v1/admin/settings/custom/${key}`);\n }\n}\n\n/**\n * Email Template Manager\n *\n * Manages email templates for authentication and user communication.\n * Supports customizing templates for magic links, email verification, password resets, and user invitations.\n *\n * @example\n * ```typescript\n * const templates = client.admin.emailTemplates\n *\n * // List all templates\n * const { templates: allTemplates } = await templates.list()\n *\n * // Get specific template\n * const magicLink = await templates.get('magic_link')\n *\n * // Update template\n * await templates.update('magic_link', {\n * subject: 'Sign in to ' + '{{.AppName}}',\n * html_body: '<html>Custom template with ' + '{{.MagicLink}}' + '</html>',\n * text_body: 'Click here: ' + '{{.MagicLink}}'\n * })\n *\n * // Test template (sends to specified email)\n * await templates.test('magic_link', 'test@example.com')\n *\n * // Reset to default\n * await templates.reset('magic_link')\n * ```\n */\nexport class EmailTemplateManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * List all email templates\n *\n * @returns Promise resolving to ListEmailTemplatesResponse\n *\n * @example\n * ```typescript\n * const response = await client.admin.emailTemplates.list()\n * console.log(response.templates)\n * ```\n */\n async list(): Promise<ListEmailTemplatesResponse> {\n const templates = await this.fetch.get<EmailTemplate[]>(\n \"/api/v1/admin/email/templates\",\n );\n return { templates: Array.isArray(templates) ? templates : [] };\n }\n\n /**\n * Get a specific email template by type\n *\n * @param type - Template type (magic_link | verify_email | reset_password | invite_user)\n * @returns Promise resolving to EmailTemplate\n *\n * @example\n * ```typescript\n * const template = await client.admin.emailTemplates.get('magic_link')\n * console.log(template.subject)\n * console.log(template.html_body)\n * ```\n */\n async get(type: EmailTemplateType): Promise<EmailTemplate> {\n return await this.fetch.get<EmailTemplate>(\n `/api/v1/admin/email/templates/${type}`,\n );\n }\n\n /**\n * Update an email template\n *\n * Available template variables:\n * - magic_link: `{{.MagicLink}}`, `{{.AppName}}`, `{{.ExpiryMinutes}}`\n * - verify_email: `{{.VerificationLink}}`, `{{.AppName}}`\n * - reset_password: `{{.ResetLink}}`, `{{.AppName}}`, `{{.ExpiryMinutes}}`\n * - invite_user: `{{.InviteLink}}`, `{{.AppName}}`, `{{.InviterName}}`\n *\n * @param type - Template type to update\n * @param request - Update request with subject, html_body, and optional text_body\n * @returns Promise resolving to EmailTemplate\n *\n * @example\n * ```typescript\n * const updated = await client.admin.emailTemplates.update('magic_link', {\n * subject: 'Your Magic Link - Sign in to ' + '{{.AppName}}',\n * html_body: '<html><body><h1>Welcome!</h1><a href=\"' + '{{.MagicLink}}' + '\">Sign In</a></body></html>',\n * text_body: 'Click here to sign in: ' + '{{.MagicLink}}'\n * })\n * ```\n */\n async update(\n type: EmailTemplateType,\n request: UpdateEmailTemplateRequest,\n ): Promise<EmailTemplate> {\n return await this.fetch.put<EmailTemplate>(\n `/api/v1/admin/email/templates/${type}`,\n request,\n );\n }\n\n /**\n * Reset an email template to default\n *\n * Removes any customizations and restores the template to its original state.\n *\n * @param type - Template type to reset\n * @returns Promise resolving to EmailTemplate - The default template\n *\n * @example\n * ```typescript\n * const defaultTemplate = await client.admin.emailTemplates.reset('magic_link')\n * ```\n */\n async reset(type: EmailTemplateType): Promise<EmailTemplate> {\n return await this.fetch.post<EmailTemplate>(\n `/api/v1/admin/email/templates/${type}/reset`,\n {},\n );\n }\n\n /**\n * Send a test email using the template\n *\n * Useful for previewing template changes before deploying to production.\n *\n * @param type - Template type to test\n * @param recipientEmail - Email address to send test to\n * @returns Promise<void>\n *\n * @example\n * ```typescript\n * await client.admin.emailTemplates.test('magic_link', 'test@example.com')\n * ```\n */\n async test(type: EmailTemplateType, recipientEmail: string): Promise<void> {\n await this.fetch.post(`/api/v1/admin/email/templates/${type}/test`, {\n recipient_email: recipientEmail,\n });\n }\n}\n\n/**\n * Settings Manager\n *\n * Provides access to system-level and application-level settings.\n * AppSettingsManager now handles both structured framework settings and custom key-value settings.\n *\n * @example\n * ```typescript\n * const settings = client.admin.settings\n *\n * // Access system settings\n * const systemSettings = await settings.system.list()\n *\n * // Access app settings (structured)\n * const appSettings = await settings.app.get()\n * await settings.app.enableSignup()\n *\n * // Access custom settings (key-value)\n * await settings.app.setSetting('billing.tiers', { free: 1000, pro: 10000 })\n * const tiers = await settings.app.getSetting('billing.tiers')\n * ```\n */\nexport class FluxbaseSettings {\n public system: SystemSettingsManager;\n public app: AppSettingsManager;\n\n constructor(fetch: FluxbaseFetch) {\n this.system = new SystemSettingsManager(fetch);\n this.app = new AppSettingsManager(fetch);\n }\n}\n\n/**\n * Public Settings Client\n *\n * Provides read-only access to public settings for non-admin users.\n * Access is controlled by RLS policies on the app.settings table.\n *\n * @example\n * ```typescript\n * const client = new FluxbaseClient(url, userToken)\n *\n * // Get single public setting\n * const betaEnabled = await client.settings.get('features.beta_enabled')\n * console.log(betaEnabled) // { enabled: true }\n *\n * // Get multiple public settings\n * const values = await client.settings.getMany([\n * 'features.beta_enabled',\n * 'features.dark_mode',\n * 'public.app_version'\n * ])\n * console.log(values)\n * // {\n * // 'features.beta_enabled': { enabled: true },\n * // 'features.dark_mode': { enabled: false },\n * // 'public.app_version': '1.0.0'\n * // }\n * ```\n */\nexport class SettingsClient {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Get a single setting's value\n *\n * Returns only the value field of the setting.\n * Access is controlled by RLS policies - will return 403 if the user\n * doesn't have permission to read the setting.\n *\n * @param key - Setting key (e.g., 'features.beta_enabled')\n * @returns Promise resolving to the setting's value\n * @throws Error if setting doesn't exist or user lacks permission\n *\n * @example\n * ```typescript\n * // Get public setting (any user)\n * const value = await client.settings.get('features.beta_enabled')\n * console.log(value) // { enabled: true }\n *\n * // Get restricted setting (requires permission)\n * try {\n * const secret = await client.settings.get('internal.api_key')\n * } catch (error) {\n * console.error('Access denied:', error)\n * }\n * ```\n */\n async get(key: string): Promise<any> {\n const response = await this.fetch.get<{ value: any }>(\n `/api/v1/settings/${encodeURIComponent(key)}`,\n );\n return response.value;\n }\n\n /**\n * Get multiple settings' values by keys\n *\n * Fetches multiple settings in a single request.\n * Only returns settings the user has permission to read based on RLS policies.\n * Settings the user can't access will be omitted from the result (no error thrown).\n *\n * @param keys - Array of setting keys to fetch\n * @returns Promise resolving to object mapping keys to values\n *\n * @example\n * ```typescript\n * const values = await client.settings.getMany([\n * 'features.beta_enabled', // public - will be returned\n * 'features.dark_mode', // public - will be returned\n * 'internal.api_key' // secret - will be omitted\n * ])\n * console.log(values)\n * // {\n * // 'features.beta_enabled': { enabled: true },\n * // 'features.dark_mode': { enabled: false }\n * // // 'internal.api_key' is omitted (no error)\n * // }\n * ```\n */\n async getMany(keys: string[]): Promise<Record<string, any>> {\n const response = await this.fetch.post<Array<{ key: string; value: any }>>(\n \"/api/v1/settings/batch\",\n { keys },\n );\n return response.reduce(\n (acc, setting) => {\n acc[setting.key] = setting.value;\n return acc;\n },\n {} as Record<string, any>,\n );\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n CreateSchemaRequest,\n CreateSchemaResponse,\n CreateTableRequest,\n CreateTableResponse,\n DeleteTableResponse,\n ListSchemasResponse,\n ListTablesResponse,\n CreateColumnRequest,\n} from './types'\n\n/**\n * DDL (Data Definition Language) Manager\n *\n * Provides methods for managing database schemas and tables programmatically.\n * This includes creating schemas, creating tables with custom columns, listing\n * schemas and tables, and deleting tables.\n *\n * @example\n * ```typescript\n * const ddl = client.admin.ddl\n *\n * // Create a new schema\n * await ddl.createSchema('analytics')\n *\n * // Create a table with columns\n * await ddl.createTable('analytics', 'events', [\n * { name: 'id', type: 'UUID', primaryKey: true, defaultValue: 'gen_random_uuid()' },\n * { name: 'user_id', type: 'UUID', nullable: false },\n * { name: 'event_name', type: 'TEXT', nullable: false },\n * { name: 'event_data', type: 'JSONB' },\n * { name: 'created_at', type: 'TIMESTAMPTZ', defaultValue: 'NOW()' }\n * ])\n *\n * // List all schemas\n * const { schemas } = await ddl.listSchemas()\n *\n * // List all tables in a schema\n * const { tables } = await ddl.listTables('analytics')\n *\n * // Delete a table\n * await ddl.deleteTable('analytics', 'events')\n * ```\n */\nexport class DDLManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Create a new database schema\n *\n * Creates a new schema in the database. Schemas are used to organize tables\n * into logical groups and provide namespace isolation.\n *\n * @param name - Schema name (must be valid PostgreSQL identifier)\n * @returns Promise resolving to CreateSchemaResponse\n *\n * @example\n * ```typescript\n * // Create a schema for analytics data\n * const result = await client.admin.ddl.createSchema('analytics')\n * console.log(result.message) // \"Schema created successfully\"\n * console.log(result.schema) // \"analytics\"\n * ```\n */\n async createSchema(name: string): Promise<CreateSchemaResponse> {\n const request: CreateSchemaRequest = { name }\n return await this.fetch.post<CreateSchemaResponse>('/api/v1/admin/ddl/schemas', request)\n }\n\n /**\n * List all database schemas\n *\n * Retrieves a list of all schemas in the database. This includes both\n * system schemas (like 'public', 'pg_catalog') and user-created schemas.\n *\n * @returns Promise resolving to ListSchemasResponse\n *\n * @example\n * ```typescript\n * const { schemas } = await client.admin.ddl.listSchemas()\n *\n * schemas.forEach(schema => {\n * console.log(`Schema: ${schema.name}, Owner: ${schema.owner}`)\n * })\n * ```\n */\n async listSchemas(): Promise<ListSchemasResponse> {\n return await this.fetch.get<ListSchemasResponse>('/api/v1/admin/ddl/schemas')\n }\n\n /**\n * Create a new table in a schema\n *\n * Creates a new table with the specified columns. Supports various column\n * options including primary keys, nullability, data types, and default values.\n *\n * @param schema - Schema name where the table will be created\n * @param name - Table name (must be valid PostgreSQL identifier)\n * @param columns - Array of column definitions\n * @returns Promise resolving to CreateTableResponse\n *\n * @example\n * ```typescript\n * // Create a users table\n * await client.admin.ddl.createTable('public', 'users', [\n * {\n * name: 'id',\n * type: 'UUID',\n * primaryKey: true,\n * defaultValue: 'gen_random_uuid()'\n * },\n * {\n * name: 'email',\n * type: 'TEXT',\n * nullable: false\n * },\n * {\n * name: 'name',\n * type: 'TEXT'\n * },\n * {\n * name: 'created_at',\n * type: 'TIMESTAMPTZ',\n * nullable: false,\n * defaultValue: 'NOW()'\n * }\n * ])\n * ```\n *\n * @example\n * ```typescript\n * // Create a products table with JSONB metadata\n * await client.admin.ddl.createTable('public', 'products', [\n * { name: 'id', type: 'SERIAL', primaryKey: true },\n * { name: 'name', type: 'TEXT', nullable: false },\n * { name: 'price', type: 'DECIMAL(10,2)', nullable: false },\n * { name: 'metadata', type: 'JSONB' },\n * { name: 'in_stock', type: 'BOOLEAN', defaultValue: 'true' }\n * ])\n * ```\n */\n async createTable(schema: string, name: string, columns: CreateColumnRequest[]): Promise<CreateTableResponse> {\n const request: CreateTableRequest = { schema, name, columns }\n return await this.fetch.post<CreateTableResponse>('/api/v1/admin/ddl/tables', request)\n }\n\n /**\n * List all tables in the database or a specific schema\n *\n * Retrieves a list of all tables. If a schema is specified, only tables\n * from that schema are returned. Otherwise, all tables from all schemas\n * are returned.\n *\n * @param schema - Optional schema name to filter tables\n * @returns Promise resolving to ListTablesResponse\n *\n * @example\n * ```typescript\n * // List all tables in the public schema\n * const { tables } = await client.admin.ddl.listTables('public')\n *\n * tables.forEach(table => {\n * console.log(`Table: ${table.schema}.${table.name}`)\n * table.columns?.forEach(col => {\n * console.log(` - ${col.name}: ${col.type}`)\n * })\n * })\n * ```\n *\n * @example\n * ```typescript\n * // List all tables across all schemas\n * const { tables } = await client.admin.ddl.listTables()\n *\n * const tablesBySchema = tables.reduce((acc, table) => {\n * if (!acc[table.schema]) acc[table.schema] = []\n * acc[table.schema].push(table.name)\n * return acc\n * }, {} as Record<string, string[]>)\n *\n * console.log(tablesBySchema)\n * ```\n */\n async listTables(schema?: string): Promise<ListTablesResponse> {\n const params = schema ? `?schema=${encodeURIComponent(schema)}` : ''\n return await this.fetch.get<ListTablesResponse>(`/api/v1/admin/ddl/tables${params}`)\n }\n\n /**\n * Delete a table from a schema\n *\n * Permanently deletes a table and all its data. This operation cannot be undone.\n *\n * @param schema - Schema name containing the table\n * @param name - Table name to delete\n * @returns Promise resolving to DeleteTableResponse\n *\n * @example\n * ```typescript\n * // Delete a table\n * const result = await client.admin.ddl.deleteTable('public', 'old_data')\n * console.log(result.message) // \"Table deleted successfully\"\n * ```\n *\n * @example\n * ```typescript\n * // Safe deletion with confirmation\n * const confirm = await askUser('Are you sure you want to delete this table?')\n * if (confirm) {\n * await client.admin.ddl.deleteTable('analytics', 'events')\n * console.log('Table deleted')\n * }\n * ```\n */\n async deleteTable(schema: string, name: string): Promise<DeleteTableResponse> {\n return await this.fetch.delete<DeleteTableResponse>(\n `/api/v1/admin/ddl/tables/${encodeURIComponent(schema)}/${encodeURIComponent(name)}`\n )\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n OAuthProvider,\n CreateOAuthProviderRequest,\n CreateOAuthProviderResponse,\n UpdateOAuthProviderRequest,\n UpdateOAuthProviderResponse,\n DeleteOAuthProviderResponse,\n AuthSettings,\n UpdateAuthSettingsRequest,\n UpdateAuthSettingsResponse,\n} from './types'\n\n/**\n * OAuth Provider Manager\n *\n * Manages OAuth provider configurations for third-party authentication.\n * Supports both built-in providers (Google, GitHub, etc.) and custom OAuth2 providers.\n *\n * @example\n * ```typescript\n * const oauth = client.admin.oauth\n *\n * // List all OAuth providers\n * const { providers } = await oauth.listProviders()\n *\n * // Create a new provider\n * await oauth.createProvider({\n * provider_name: 'github',\n * display_name: 'GitHub',\n * enabled: true,\n * client_id: 'your-client-id',\n * client_secret: 'your-client-secret',\n * redirect_url: 'https://yourapp.com/auth/callback',\n * scopes: ['user:email', 'read:user'],\n * is_custom: false\n * })\n *\n * // Update a provider\n * await oauth.updateProvider('provider-id', {\n * enabled: false\n * })\n *\n * // Delete a provider\n * await oauth.deleteProvider('provider-id')\n * ```\n */\nexport class OAuthProviderManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * List all OAuth providers\n *\n * Retrieves all configured OAuth providers including both enabled and disabled providers.\n * Note: Client secrets are not included in the response for security reasons.\n *\n * @returns Promise resolving to ListOAuthProvidersResponse\n *\n * @example\n * ```typescript\n * const { providers } = await client.admin.oauth.listProviders()\n *\n * providers.forEach(provider => {\n * console.log(`${provider.display_name}: ${provider.enabled ? 'enabled' : 'disabled'}`)\n * })\n * ```\n */\n async listProviders(): Promise<OAuthProvider[]> {\n const providers = await this.fetch.get<OAuthProvider[]>('/api/v1/admin/oauth/providers')\n return Array.isArray(providers) ? providers : []\n }\n\n /**\n * Get a specific OAuth provider by ID\n *\n * Retrieves detailed configuration for a single OAuth provider.\n * Note: Client secret is not included in the response.\n *\n * @param providerId - Provider ID (UUID)\n * @returns Promise resolving to OAuthProvider\n *\n * @example\n * ```typescript\n * const provider = await client.admin.oauth.getProvider('provider-uuid')\n *\n * console.log('Provider:', provider.display_name)\n * console.log('Scopes:', provider.scopes.join(', '))\n * console.log('Redirect URL:', provider.redirect_url)\n * ```\n */\n async getProvider(providerId: string): Promise<OAuthProvider> {\n return await this.fetch.get<OAuthProvider>(`/api/v1/admin/oauth/providers/${providerId}`)\n }\n\n /**\n * Create a new OAuth provider\n *\n * Creates a new OAuth provider configuration. For built-in providers (Google, GitHub, etc.),\n * set `is_custom` to false. For custom OAuth2 providers, set `is_custom` to true and provide\n * the authorization, token, and user info URLs.\n *\n * @param request - OAuth provider configuration\n * @returns Promise resolving to CreateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * // Create GitHub provider\n * const result = await client.admin.oauth.createProvider({\n * provider_name: 'github',\n * display_name: 'GitHub',\n * enabled: true,\n * client_id: process.env.GITHUB_CLIENT_ID,\n * client_secret: process.env.GITHUB_CLIENT_SECRET,\n * redirect_url: 'https://yourapp.com/auth/callback',\n * scopes: ['user:email', 'read:user'],\n * is_custom: false\n * })\n *\n * console.log('Provider created:', result.id)\n * ```\n *\n * @example\n * ```typescript\n * // Create custom OAuth2 provider\n * await client.admin.oauth.createProvider({\n * provider_name: 'custom_sso',\n * display_name: 'Custom SSO',\n * enabled: true,\n * client_id: 'client-id',\n * client_secret: 'client-secret',\n * redirect_url: 'https://yourapp.com/auth/callback',\n * scopes: ['openid', 'profile', 'email'],\n * is_custom: true,\n * authorization_url: 'https://sso.example.com/oauth/authorize',\n * token_url: 'https://sso.example.com/oauth/token',\n * user_info_url: 'https://sso.example.com/oauth/userinfo'\n * })\n * ```\n */\n async createProvider(request: CreateOAuthProviderRequest): Promise<CreateOAuthProviderResponse> {\n return await this.fetch.post<CreateOAuthProviderResponse>('/api/v1/admin/oauth/providers', request)\n }\n\n /**\n * Update an existing OAuth provider\n *\n * Updates an OAuth provider configuration. All fields are optional - only provided fields\n * will be updated. To update the client secret, provide a non-empty value.\n *\n * @param providerId - Provider ID (UUID)\n * @param request - Fields to update\n * @returns Promise resolving to UpdateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * // Disable a provider\n * await client.admin.oauth.updateProvider('provider-id', {\n * enabled: false\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Update scopes and redirect URL\n * await client.admin.oauth.updateProvider('provider-id', {\n * scopes: ['user:email', 'read:user', 'read:org'],\n * redirect_url: 'https://newdomain.com/auth/callback'\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Rotate client secret\n * await client.admin.oauth.updateProvider('provider-id', {\n * client_id: 'new-client-id',\n * client_secret: 'new-client-secret'\n * })\n * ```\n */\n async updateProvider(\n providerId: string,\n request: UpdateOAuthProviderRequest\n ): Promise<UpdateOAuthProviderResponse> {\n return await this.fetch.put<UpdateOAuthProviderResponse>(\n `/api/v1/admin/oauth/providers/${providerId}`,\n request\n )\n }\n\n /**\n * Delete an OAuth provider\n *\n * Permanently deletes an OAuth provider configuration. This will prevent users from\n * authenticating with this provider.\n *\n * @param providerId - Provider ID (UUID) to delete\n * @returns Promise resolving to DeleteOAuthProviderResponse\n *\n * @example\n * ```typescript\n * await client.admin.oauth.deleteProvider('provider-id')\n * console.log('Provider deleted')\n * ```\n *\n * @example\n * ```typescript\n * // Safe deletion with confirmation\n * const provider = await client.admin.oauth.getProvider('provider-id')\n * const confirmed = await confirm(`Delete ${provider.display_name}?`)\n *\n * if (confirmed) {\n * await client.admin.oauth.deleteProvider('provider-id')\n * }\n * ```\n */\n async deleteProvider(providerId: string): Promise<DeleteOAuthProviderResponse> {\n return await this.fetch.delete<DeleteOAuthProviderResponse>(\n `/api/v1/admin/oauth/providers/${providerId}`\n )\n }\n\n /**\n * Enable an OAuth provider\n *\n * Convenience method to enable a provider.\n *\n * @param providerId - Provider ID (UUID)\n * @returns Promise resolving to UpdateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * await client.admin.oauth.enableProvider('provider-id')\n * ```\n */\n async enableProvider(providerId: string): Promise<UpdateOAuthProviderResponse> {\n return await this.updateProvider(providerId, { enabled: true })\n }\n\n /**\n * Disable an OAuth provider\n *\n * Convenience method to disable a provider.\n *\n * @param providerId - Provider ID (UUID)\n * @returns Promise resolving to UpdateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * await client.admin.oauth.disableProvider('provider-id')\n * ```\n */\n async disableProvider(providerId: string): Promise<UpdateOAuthProviderResponse> {\n return await this.updateProvider(providerId, { enabled: false })\n }\n}\n\n/**\n * Authentication Settings Manager\n *\n * Manages global authentication settings including password requirements, session timeouts,\n * and signup configuration.\n *\n * @example\n * ```typescript\n * const authSettings = client.admin.authSettings\n *\n * // Get current settings\n * const settings = await authSettings.get()\n *\n * // Update settings\n * await authSettings.update({\n * password_min_length: 12,\n * password_require_uppercase: true,\n * session_timeout_minutes: 120\n * })\n * ```\n */\nexport class AuthSettingsManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Get current authentication settings\n *\n * Retrieves all authentication configuration settings.\n *\n * @returns Promise resolving to AuthSettings\n *\n * @example\n * ```typescript\n * const settings = await client.admin.authSettings.get()\n *\n * console.log('Password min length:', settings.password_min_length)\n * console.log('Signup enabled:', settings.enable_signup)\n * console.log('Session timeout:', settings.session_timeout_minutes, 'minutes')\n * ```\n */\n async get(): Promise<AuthSettings> {\n return await this.fetch.get<AuthSettings>('/api/v1/admin/auth/settings')\n }\n\n /**\n * Update authentication settings\n *\n * Updates one or more authentication settings. All fields are optional - only provided\n * fields will be updated.\n *\n * @param request - Settings to update\n * @returns Promise resolving to UpdateAuthSettingsResponse\n *\n * @example\n * ```typescript\n * // Strengthen password requirements\n * await client.admin.authSettings.update({\n * password_min_length: 16,\n * password_require_uppercase: true,\n * password_require_lowercase: true,\n * password_require_number: true,\n * password_require_special: true\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Extend session timeout\n * await client.admin.authSettings.update({\n * session_timeout_minutes: 240,\n * max_sessions_per_user: 10\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Disable email verification during development\n * await client.admin.authSettings.update({\n * require_email_verification: false\n * })\n * ```\n */\n async update(request: UpdateAuthSettingsRequest): Promise<UpdateAuthSettingsResponse> {\n return await this.fetch.put<UpdateAuthSettingsResponse>('/api/v1/admin/auth/settings', request)\n }\n}\n\n/**\n * OAuth Configuration Manager\n *\n * Root manager providing access to OAuth provider and authentication settings management.\n *\n * @example\n * ```typescript\n * const oauth = client.admin.oauth\n *\n * // Manage OAuth providers\n * const providers = await oauth.providers.listProviders()\n *\n * // Manage auth settings\n * const settings = await oauth.authSettings.get()\n * ```\n */\nexport class FluxbaseOAuth {\n public providers: OAuthProviderManager\n public authSettings: AuthSettingsManager\n\n constructor(fetch: FluxbaseFetch) {\n this.providers = new OAuthProviderManager(fetch)\n this.authSettings = new AuthSettingsManager(fetch)\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n ImpersonateUserRequest,\n ImpersonateAnonRequest,\n ImpersonateServiceRequest,\n StartImpersonationResponse,\n StopImpersonationResponse,\n GetImpersonationResponse,\n ListImpersonationSessionsOptions,\n ListImpersonationSessionsResponse,\n} from './types'\n\n/**\n * Impersonation Manager\n *\n * Manages user impersonation for debugging, testing RLS policies, and customer support.\n * Allows admins to view data as different users, anonymous visitors, or with service role permissions.\n *\n * All impersonation sessions are logged in the audit trail for security and compliance.\n *\n * @example\n * ```typescript\n * const impersonation = client.admin.impersonation\n *\n * // Impersonate a specific user\n * const { session, access_token } = await impersonation.impersonateUser({\n * target_user_id: 'user-uuid',\n * reason: 'Support ticket #1234'\n * })\n *\n * // Impersonate anonymous user\n * await impersonation.impersonateAnon({\n * reason: 'Testing public data access'\n * })\n *\n * // Impersonate with service role\n * await impersonation.impersonateService({\n * reason: 'Administrative query'\n * })\n *\n * // Stop impersonation\n * await impersonation.stop()\n * ```\n */\nexport class ImpersonationManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Impersonate a specific user\n *\n * Start an impersonation session as a specific user. This allows you to see data\n * exactly as that user would see it, respecting all RLS policies and permissions.\n *\n * @param request - Impersonation request with target user ID and reason\n * @returns Promise resolving to impersonation session with access token\n *\n * @example\n * ```typescript\n * const result = await client.admin.impersonation.impersonateUser({\n * target_user_id: 'user-123',\n * reason: 'Support ticket #5678 - user reports missing data'\n * })\n *\n * console.log('Impersonating:', result.target_user.email)\n * console.log('Session ID:', result.session.id)\n *\n * // Use the access token for subsequent requests\n * // (typically handled automatically by the SDK)\n * ```\n */\n async impersonateUser(request: ImpersonateUserRequest): Promise<StartImpersonationResponse> {\n return await this.fetch.post<StartImpersonationResponse>('/api/v1/auth/impersonate', request)\n }\n\n /**\n * Impersonate anonymous user\n *\n * Start an impersonation session as an unauthenticated user. This allows you to see\n * what data is publicly accessible and test RLS policies for anonymous access.\n *\n * @param request - Impersonation request with reason\n * @returns Promise resolving to impersonation session with access token\n *\n * @example\n * ```typescript\n * await client.admin.impersonation.impersonateAnon({\n * reason: 'Testing public data access for blog posts'\n * })\n *\n * // Now all queries will use anonymous permissions\n * const publicPosts = await client.from('posts').select('*')\n * console.log('Public posts:', publicPosts.length)\n * ```\n */\n async impersonateAnon(request: ImpersonateAnonRequest): Promise<StartImpersonationResponse> {\n return await this.fetch.post<StartImpersonationResponse>('/api/v1/auth/impersonate/anon', request)\n }\n\n /**\n * Impersonate with service role\n *\n * Start an impersonation session with service-level permissions. This provides elevated\n * access that may bypass RLS policies, useful for administrative operations.\n *\n * @param request - Impersonation request with reason\n * @returns Promise resolving to impersonation session with access token\n *\n * @example\n * ```typescript\n * await client.admin.impersonation.impersonateService({\n * reason: 'Administrative data cleanup'\n * })\n *\n * // Now all queries will use service role permissions\n * const allRecords = await client.from('sensitive_data').select('*')\n * console.log('All records:', allRecords.length)\n * ```\n */\n async impersonateService(request: ImpersonateServiceRequest): Promise<StartImpersonationResponse> {\n return await this.fetch.post<StartImpersonationResponse>('/api/v1/auth/impersonate/service', request)\n }\n\n /**\n * Stop impersonation\n *\n * Ends the current impersonation session and returns to admin context.\n * The session is marked as ended in the audit trail.\n *\n * @returns Promise resolving to stop confirmation\n *\n * @example\n * ```typescript\n * await client.admin.impersonation.stop()\n * console.log('Impersonation ended')\n *\n * // Subsequent queries will use admin permissions\n * ```\n */\n async stop(): Promise<StopImpersonationResponse> {\n return await this.fetch.delete<StopImpersonationResponse>('/api/v1/auth/impersonate')\n }\n\n /**\n * Get current impersonation session\n *\n * Retrieves information about the active impersonation session, if any.\n *\n * @returns Promise resolving to current impersonation session or null\n *\n * @example\n * ```typescript\n * const current = await client.admin.impersonation.getCurrent()\n *\n * if (current.session) {\n * console.log('Currently impersonating:', current.target_user?.email)\n * console.log('Reason:', current.session.reason)\n * console.log('Started:', current.session.started_at)\n * } else {\n * console.log('No active impersonation')\n * }\n * ```\n */\n async getCurrent(): Promise<GetImpersonationResponse> {\n return await this.fetch.get<GetImpersonationResponse>('/api/v1/auth/impersonate')\n }\n\n /**\n * List impersonation sessions (audit trail)\n *\n * Retrieves a list of impersonation sessions for audit and compliance purposes.\n * Can be filtered by admin user, target user, type, and active status.\n *\n * @param options - Filter and pagination options\n * @returns Promise resolving to list of impersonation sessions\n *\n * @example\n * ```typescript\n * // List all sessions\n * const { sessions, total } = await client.admin.impersonation.listSessions()\n * console.log(`Total sessions: ${total}`)\n *\n * // List active sessions only\n * const active = await client.admin.impersonation.listSessions({\n * is_active: true\n * })\n * console.log('Active sessions:', active.sessions.length)\n *\n * // List sessions for a specific admin\n * const adminSessions = await client.admin.impersonation.listSessions({\n * admin_user_id: 'admin-uuid',\n * limit: 50\n * })\n *\n * // List user impersonation sessions only\n * const userSessions = await client.admin.impersonation.listSessions({\n * impersonation_type: 'user',\n * offset: 0,\n * limit: 100\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Audit trail: Find who impersonated a specific user\n * const userHistory = await client.admin.impersonation.listSessions({\n * target_user_id: 'user-uuid'\n * })\n *\n * userHistory.sessions.forEach(session => {\n * console.log(`Admin ${session.admin_user_id} impersonated user`)\n * console.log(`Reason: ${session.reason}`)\n * console.log(`Duration: ${session.started_at} - ${session.ended_at}`)\n * })\n * ```\n */\n async listSessions(options: ListImpersonationSessionsOptions = {}): Promise<ListImpersonationSessionsResponse> {\n const params = new URLSearchParams()\n\n if (options.limit !== undefined) {\n params.append('limit', String(options.limit))\n }\n if (options.offset !== undefined) {\n params.append('offset', String(options.offset))\n }\n if (options.admin_user_id) {\n params.append('admin_user_id', options.admin_user_id)\n }\n if (options.target_user_id) {\n params.append('target_user_id', options.target_user_id)\n }\n if (options.impersonation_type) {\n params.append('impersonation_type', options.impersonation_type)\n }\n if (options.is_active !== undefined) {\n params.append('is_active', String(options.is_active))\n }\n\n const queryString = params.toString()\n const url = queryString ? `/api/v1/auth/impersonate/sessions?${queryString}` : '/api/v1/auth/impersonate/sessions'\n\n return await this.fetch.get<ListImpersonationSessionsResponse>(url)\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n // API Keys\n APIKey,\n CreateAPIKeyRequest,\n CreateAPIKeyResponse,\n DeleteAPIKeyResponse,\n ListAPIKeysResponse,\n RevokeAPIKeyResponse,\n UpdateAPIKeyRequest,\n // Webhooks\n CreateWebhookRequest,\n DeleteWebhookResponse,\n ListWebhookDeliveriesResponse,\n ListWebhooksResponse,\n TestWebhookResponse,\n UpdateWebhookRequest,\n Webhook,\n // Invitations\n AcceptInvitationRequest,\n AcceptInvitationResponse,\n CreateInvitationRequest,\n CreateInvitationResponse,\n ListInvitationsOptions,\n ListInvitationsResponse,\n RevokeInvitationResponse,\n ValidateInvitationResponse,\n} from './types'\n\n/**\n * API Keys management client\n *\n * Provides methods for managing API keys for service-to-service authentication.\n * API keys allow external services to authenticate without user credentials.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.auth.login({ email: 'user@example.com', password: 'password' })\n *\n * // Create an API key\n * const { api_key, key } = await client.management.apiKeys.create({\n * name: 'Production Service',\n * scopes: ['read:users', 'write:users'],\n * rate_limit_per_minute: 100\n * })\n *\n * // List API keys\n * const { api_keys } = await client.management.apiKeys.list()\n * ```\n *\n * @category Management\n */\nexport class APIKeysManager {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Create a new API key\n *\n * @param request - API key configuration\n * @returns Created API key with the full key value (only shown once)\n *\n * @example\n * ```typescript\n * const { api_key, key } = await client.management.apiKeys.create({\n * name: 'Production Service',\n * description: 'API key for production service',\n * scopes: ['read:users', 'write:users'],\n * rate_limit_per_minute: 100,\n * expires_at: '2025-12-31T23:59:59Z'\n * })\n *\n * // Store the key securely - it won't be shown again\n * console.log('API Key:', key)\n * ```\n */\n async create(request: CreateAPIKeyRequest): Promise<CreateAPIKeyResponse> {\n return await this.fetch.post<CreateAPIKeyResponse>('/api/v1/api-keys', request)\n }\n\n /**\n * List all API keys for the authenticated user\n *\n * @returns List of API keys (without full key values)\n *\n * @example\n * ```typescript\n * const { api_keys, total } = await client.management.apiKeys.list()\n *\n * api_keys.forEach(key => {\n * console.log(`${key.name}: ${key.key_prefix}... (expires: ${key.expires_at})`)\n * })\n * ```\n */\n async list(): Promise<ListAPIKeysResponse> {\n return await this.fetch.get<ListAPIKeysResponse>('/api/v1/api-keys')\n }\n\n /**\n * Get a specific API key by ID\n *\n * @param keyId - API key ID\n * @returns API key details\n *\n * @example\n * ```typescript\n * const apiKey = await client.management.apiKeys.get('key-uuid')\n * console.log('Last used:', apiKey.last_used_at)\n * ```\n */\n async get(keyId: string): Promise<APIKey> {\n return await this.fetch.get<APIKey>(`/api/v1/api-keys/${keyId}`)\n }\n\n /**\n * Update an API key\n *\n * @param keyId - API key ID\n * @param updates - Fields to update\n * @returns Updated API key\n *\n * @example\n * ```typescript\n * const updated = await client.management.apiKeys.update('key-uuid', {\n * name: 'Updated Name',\n * rate_limit_per_minute: 200\n * })\n * ```\n */\n async update(keyId: string, updates: UpdateAPIKeyRequest): Promise<APIKey> {\n return await this.fetch.patch<APIKey>(`/api/v1/api-keys/${keyId}`, updates)\n }\n\n /**\n * Revoke an API key\n *\n * Revoked keys can no longer be used but remain in the system for audit purposes.\n *\n * @param keyId - API key ID\n * @returns Revocation confirmation\n *\n * @example\n * ```typescript\n * await client.management.apiKeys.revoke('key-uuid')\n * console.log('API key revoked')\n * ```\n */\n async revoke(keyId: string): Promise<RevokeAPIKeyResponse> {\n return await this.fetch.post<RevokeAPIKeyResponse>(`/api/v1/api-keys/${keyId}/revoke`, {})\n }\n\n /**\n * Delete an API key\n *\n * Permanently removes the API key from the system.\n *\n * @param keyId - API key ID\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await client.management.apiKeys.delete('key-uuid')\n * console.log('API key deleted')\n * ```\n */\n async delete(keyId: string): Promise<DeleteAPIKeyResponse> {\n return await this.fetch.delete<DeleteAPIKeyResponse>(`/api/v1/api-keys/${keyId}`)\n }\n}\n\n/**\n * Webhooks management client\n *\n * Provides methods for managing webhooks to receive real-time event notifications.\n * Webhooks allow your application to be notified when events occur in Fluxbase.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.auth.login({ email: 'user@example.com', password: 'password' })\n *\n * // Create a webhook\n * const webhook = await client.management.webhooks.create({\n * url: 'https://myapp.com/webhook',\n * events: ['user.created', 'user.updated'],\n * secret: 'my-webhook-secret'\n * })\n *\n * // Test the webhook\n * const result = await client.management.webhooks.test(webhook.id)\n * ```\n *\n * @category Management\n */\nexport class WebhooksManager {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Create a new webhook\n *\n * @param request - Webhook configuration\n * @returns Created webhook\n *\n * @example\n * ```typescript\n * const webhook = await client.management.webhooks.create({\n * url: 'https://myapp.com/webhook',\n * events: ['user.created', 'user.updated', 'user.deleted'],\n * description: 'User events webhook',\n * secret: 'my-webhook-secret'\n * })\n * ```\n */\n async create(request: CreateWebhookRequest): Promise<Webhook> {\n return await this.fetch.post<Webhook>('/api/v1/webhooks', request)\n }\n\n /**\n * List all webhooks for the authenticated user\n *\n * @returns List of webhooks\n *\n * @example\n * ```typescript\n * const { webhooks, total } = await client.management.webhooks.list()\n *\n * webhooks.forEach(webhook => {\n * console.log(`${webhook.url}: ${webhook.is_active ? 'active' : 'inactive'}`)\n * })\n * ```\n */\n async list(): Promise<ListWebhooksResponse> {\n return await this.fetch.get<ListWebhooksResponse>('/api/v1/webhooks')\n }\n\n /**\n * Get a specific webhook by ID\n *\n * @param webhookId - Webhook ID\n * @returns Webhook details\n *\n * @example\n * ```typescript\n * const webhook = await client.management.webhooks.get('webhook-uuid')\n * console.log('Events:', webhook.events)\n * ```\n */\n async get(webhookId: string): Promise<Webhook> {\n return await this.fetch.get<Webhook>(`/api/v1/webhooks/${webhookId}`)\n }\n\n /**\n * Update a webhook\n *\n * @param webhookId - Webhook ID\n * @param updates - Fields to update\n * @returns Updated webhook\n *\n * @example\n * ```typescript\n * const updated = await client.management.webhooks.update('webhook-uuid', {\n * events: ['user.created', 'user.deleted'],\n * is_active: false\n * })\n * ```\n */\n async update(webhookId: string, updates: UpdateWebhookRequest): Promise<Webhook> {\n return await this.fetch.patch<Webhook>(`/api/v1/webhooks/${webhookId}`, updates)\n }\n\n /**\n * Delete a webhook\n *\n * @param webhookId - Webhook ID\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await client.management.webhooks.delete('webhook-uuid')\n * console.log('Webhook deleted')\n * ```\n */\n async delete(webhookId: string): Promise<DeleteWebhookResponse> {\n return await this.fetch.delete<DeleteWebhookResponse>(`/api/v1/webhooks/${webhookId}`)\n }\n\n /**\n * Test a webhook by sending a test payload\n *\n * @param webhookId - Webhook ID\n * @returns Test result with status and response\n *\n * @example\n * ```typescript\n * const result = await client.management.webhooks.test('webhook-uuid')\n *\n * if (result.success) {\n * console.log('Webhook test successful')\n * } else {\n * console.error('Webhook test failed:', result.error)\n * }\n * ```\n */\n async test(webhookId: string): Promise<TestWebhookResponse> {\n return await this.fetch.post<TestWebhookResponse>(`/api/v1/webhooks/${webhookId}/test`, {})\n }\n\n /**\n * List webhook delivery history\n *\n * @param webhookId - Webhook ID\n * @param limit - Maximum number of deliveries to return (default: 50)\n * @returns List of webhook deliveries\n *\n * @example\n * ```typescript\n * const { deliveries } = await client.management.webhooks.listDeliveries('webhook-uuid', 100)\n *\n * deliveries.forEach(delivery => {\n * console.log(`Event: ${delivery.event}, Status: ${delivery.status_code}`)\n * })\n * ```\n */\n async listDeliveries(webhookId: string, limit: number = 50): Promise<ListWebhookDeliveriesResponse> {\n return await this.fetch.get<ListWebhookDeliveriesResponse>(\n `/api/v1/webhooks/${webhookId}/deliveries?limit=${limit}`,\n )\n }\n}\n\n/**\n * Invitations management client\n *\n * Provides methods for creating and managing user invitations.\n * Invitations allow admins to invite new users to join the dashboard.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.admin.login({ email: 'admin@example.com', password: 'password' })\n *\n * // Create an invitation\n * const invitation = await client.management.invitations.create({\n * email: 'newuser@example.com',\n * role: 'dashboard_user'\n * })\n *\n * console.log('Invite link:', invitation.invite_link)\n * ```\n *\n * @category Management\n */\nexport class InvitationsManager {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Create a new invitation (admin only)\n *\n * @param request - Invitation details\n * @returns Created invitation with invite link\n *\n * @example\n * ```typescript\n * const invitation = await client.management.invitations.create({\n * email: 'newuser@example.com',\n * role: 'dashboard_user',\n * expiry_duration: 604800 // 7 days in seconds\n * })\n *\n * // Share the invite link\n * console.log('Send this link to the user:', invitation.invite_link)\n * ```\n */\n async create(request: CreateInvitationRequest): Promise<CreateInvitationResponse> {\n return await this.fetch.post<CreateInvitationResponse>('/api/v1/admin/invitations', request)\n }\n\n /**\n * List all invitations (admin only)\n *\n * @param options - Filter options\n * @returns List of invitations\n *\n * @example\n * ```typescript\n * // List pending invitations only\n * const { invitations } = await client.management.invitations.list({\n * include_accepted: false,\n * include_expired: false\n * })\n *\n * // List all invitations including accepted and expired\n * const all = await client.management.invitations.list({\n * include_accepted: true,\n * include_expired: true\n * })\n * ```\n */\n async list(options: ListInvitationsOptions = {}): Promise<ListInvitationsResponse> {\n const params = new URLSearchParams()\n\n if (options.include_accepted !== undefined) {\n params.append('include_accepted', String(options.include_accepted))\n }\n if (options.include_expired !== undefined) {\n params.append('include_expired', String(options.include_expired))\n }\n\n const queryString = params.toString()\n const url = queryString ? `/api/v1/admin/invitations?${queryString}` : '/api/v1/admin/invitations'\n\n return await this.fetch.get<ListInvitationsResponse>(url)\n }\n\n /**\n * Validate an invitation token (public endpoint)\n *\n * @param token - Invitation token\n * @returns Validation result with invitation details\n *\n * @example\n * ```typescript\n * const result = await client.management.invitations.validate('invitation-token')\n *\n * if (result.valid) {\n * console.log('Valid invitation for:', result.invitation?.email)\n * } else {\n * console.error('Invalid:', result.error)\n * }\n * ```\n */\n async validate(token: string): Promise<ValidateInvitationResponse> {\n return await this.fetch.get<ValidateInvitationResponse>(`/api/v1/invitations/${token}/validate`)\n }\n\n /**\n * Accept an invitation and create a new user (public endpoint)\n *\n * @param token - Invitation token\n * @param request - User details (password and name)\n * @returns Created user with authentication tokens\n *\n * @example\n * ```typescript\n * const response = await client.management.invitations.accept('invitation-token', {\n * password: 'SecurePassword123!',\n * name: 'John Doe'\n * })\n *\n * // Store tokens\n * localStorage.setItem('access_token', response.access_token)\n * console.log('Welcome:', response.user.name)\n * ```\n */\n async accept(token: string, request: AcceptInvitationRequest): Promise<AcceptInvitationResponse> {\n return await this.fetch.post<AcceptInvitationResponse>(`/api/v1/invitations/${token}/accept`, request)\n }\n\n /**\n * Revoke an invitation (admin only)\n *\n * @param token - Invitation token\n * @returns Revocation confirmation\n *\n * @example\n * ```typescript\n * await client.management.invitations.revoke('invitation-token')\n * console.log('Invitation revoked')\n * ```\n */\n async revoke(token: string): Promise<RevokeInvitationResponse> {\n return await this.fetch.delete<RevokeInvitationResponse>(`/api/v1/admin/invitations/${token}`)\n }\n}\n\n/**\n * Management client for API keys, webhooks, and invitations\n *\n * @category Management\n */\nexport class FluxbaseManagement {\n /** API Keys management */\n public apiKeys: APIKeysManager\n\n /** Webhooks management */\n public webhooks: WebhooksManager\n\n /** Invitations management */\n public invitations: InvitationsManager\n\n constructor(fetch: FluxbaseFetch) {\n this.apiKeys = new APIKeysManager(fetch)\n this.webhooks = new WebhooksManager(fetch)\n this.invitations = new InvitationsManager(fetch)\n }\n}\n","/**\n * Admin Functions module for managing edge functions\n * Provides administrative operations for function lifecycle management\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n EdgeFunction,\n CreateFunctionRequest,\n UpdateFunctionRequest,\n EdgeFunctionExecution,\n SyncFunctionsOptions,\n SyncFunctionsResult,\n} from \"./types\";\n\n/**\n * Admin Functions manager for managing edge functions\n * Provides create, update, delete, and bulk sync operations\n *\n * @category Admin\n */\nexport class FluxbaseAdminFunctions {\n private fetch: FluxbaseFetch;\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch;\n }\n\n /**\n * Create a new edge function\n *\n * @param request - Function configuration and code\n * @returns Promise resolving to { data, error } tuple with created function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.functions.create({\n * name: 'my-function',\n * code: 'export default async function handler(req) { return { hello: \"world\" } }',\n * enabled: true\n * })\n * ```\n */\n async create(\n request: CreateFunctionRequest,\n ): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<EdgeFunction>(\n \"/api/v1/functions\",\n request,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List all namespaces that have edge functions\n *\n * @returns Promise resolving to { data, error } tuple with array of namespace strings\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.functions.listNamespaces()\n * if (data) {\n * console.log('Available namespaces:', data)\n * }\n * ```\n */\n async listNamespaces(): Promise<{\n data: string[] | null;\n error: Error | null;\n }> {\n try {\n const response = await this.fetch.get<{ namespaces: string[] }>(\n \"/api/v1/admin/functions/namespaces\",\n );\n return { data: response.namespaces || [\"default\"], error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List all edge functions (admin view)\n *\n * @param namespace - Optional namespace filter (if not provided, lists all public functions)\n * @returns Promise resolving to { data, error } tuple with array of functions\n *\n * @example\n * ```typescript\n * // List all public functions\n * const { data, error } = await client.admin.functions.list()\n *\n * // List functions in a specific namespace\n * const { data, error } = await client.admin.functions.list('my-namespace')\n * if (data) {\n * console.log('Functions:', data.map(f => f.name))\n * }\n * ```\n */\n async list(\n namespace?: string,\n ): Promise<{ data: EdgeFunction[] | null; error: Error | null }> {\n try {\n const params = namespace ? `?namespace=${namespace}` : \"\";\n const data = await this.fetch.get<EdgeFunction[]>(\n `/api/v1/functions${params}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get details of a specific edge function\n *\n * @param name - Function name\n * @returns Promise resolving to { data, error } tuple with function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.functions.get('my-function')\n * if (data) {\n * console.log('Function version:', data.version)\n * }\n * ```\n */\n async get(\n name: string,\n ): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<EdgeFunction>(\n `/api/v1/functions/${name}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Update an existing edge function\n *\n * @param name - Function name\n * @param updates - Fields to update\n * @returns Promise resolving to { data, error } tuple with updated function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.functions.update('my-function', {\n * enabled: false,\n * description: 'Updated description'\n * })\n * ```\n */\n async update(\n name: string,\n updates: UpdateFunctionRequest,\n ): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.put<EdgeFunction>(\n `/api/v1/functions/${name}`,\n updates,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Delete an edge function\n *\n * @param name - Function name\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.functions.delete('my-function')\n * ```\n */\n async delete(name: string): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.delete(`/api/v1/functions/${name}`);\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get execution history for an edge function\n *\n * @param name - Function name\n * @param limit - Maximum number of executions to return (optional)\n * @returns Promise resolving to { data, error } tuple with execution records\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.functions.getExecutions('my-function', 10)\n * if (data) {\n * data.forEach(exec => {\n * console.log(`${exec.executed_at}: ${exec.status} (${exec.duration_ms}ms)`)\n * })\n * }\n * ```\n */\n async getExecutions(\n name: string,\n limit?: number,\n ): Promise<{ data: EdgeFunctionExecution[] | null; error: Error | null }> {\n try {\n const params = limit ? `?limit=${limit}` : \"\";\n const data = await this.fetch.get<EdgeFunctionExecution[]>(\n `/api/v1/functions/${name}/executions${params}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Sync multiple functions to a namespace\n *\n * Bulk create/update/delete functions in a specific namespace. This is useful for\n * deploying functions from your application to Fluxbase in Kubernetes or other\n * container environments.\n *\n * Requires service_role or admin authentication.\n *\n * @param options - Sync configuration including namespace, functions, and options\n * @returns Promise resolving to { data, error } tuple with sync results\n *\n * @example\n * ```typescript\n * // Sync functions to \"payment-service\" namespace\n * const { data, error } = await client.admin.functions.sync({\n * namespace: 'payment-service',\n * functions: [\n * {\n * name: 'process-payment',\n * code: 'export default async function handler(req) { ... }',\n * enabled: true,\n * allow_net: true\n * },\n * {\n * name: 'refund-payment',\n * code: 'export default async function handler(req) { ... }',\n * enabled: true\n * }\n * ],\n * options: {\n * delete_missing: true // Remove functions not in this list\n * }\n * })\n *\n * if (data) {\n * console.log(`Synced: ${data.summary.created} created, ${data.summary.updated} updated`)\n * }\n *\n * // Dry run to preview changes\n * const { data, error } = await client.admin.functions.sync({\n * namespace: 'myapp',\n * functions: [...],\n * options: { dry_run: true }\n * })\n * ```\n */\n async sync(\n options: SyncFunctionsOptions,\n ): Promise<{ data: SyncFunctionsResult | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<SyncFunctionsResult>(\n \"/api/v1/admin/functions/sync\",\n options,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n}\n","/**\n * Admin Migrations module for managing database migrations\n * Provides API-based migration management without filesystem coupling\n */\n\nimport type { FluxbaseFetch } from './fetch'\nimport type {\n Migration,\n CreateMigrationRequest,\n UpdateMigrationRequest,\n MigrationExecution,\n SyncMigrationsOptions,\n SyncMigrationsResult,\n} from './types'\n\n/**\n * Admin Migrations manager for database migration operations\n * Provides create, update, delete, apply, rollback, and smart sync operations\n *\n * @category Admin\n */\nexport class FluxbaseAdminMigrations {\n private fetch: FluxbaseFetch\n private localMigrations: Map<string, CreateMigrationRequest> = new Map()\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Register a migration locally for smart sync\n *\n * Call this method to register migrations in your application code.\n * When you call sync(), only new or changed migrations will be sent to the server.\n *\n * @param migration - Migration definition\n * @returns { error } tuple (always succeeds unless validation fails)\n *\n * @example\n * ```typescript\n * // In your app initialization\n * const { error: err1 } = client.admin.migrations.register({\n * name: '001_create_users_table',\n * namespace: 'myapp',\n * up_sql: 'CREATE TABLE app.users (...)',\n * down_sql: 'DROP TABLE app.users',\n * description: 'Initial users table'\n * })\n *\n * const { error: err2 } = client.admin.migrations.register({\n * name: '002_add_posts_table',\n * namespace: 'myapp',\n * up_sql: 'CREATE TABLE app.posts (...)',\n * down_sql: 'DROP TABLE app.posts'\n * })\n *\n * // Sync all registered migrations\n * await client.admin.migrations.sync()\n * ```\n */\n register(migration: CreateMigrationRequest): { error: Error | null } {\n try {\n // Basic validation\n if (!migration.name || !migration.up_sql) {\n return {\n error: new Error('Migration name and up_sql are required')\n }\n }\n\n const key = `${migration.namespace || 'default'}:${migration.name}`\n this.localMigrations.set(key, migration)\n\n return { error: null }\n } catch (error) {\n return { error: error as Error }\n }\n }\n\n /**\n * Trigger schema refresh which will restart the server\n * Handles the restart gracefully by waiting for the server to come back online\n *\n * @private\n */\n private async triggerSchemaRefreshWithRestart(): Promise<void> {\n console.log('Triggering schema refresh (server will restart)...')\n\n try {\n // Call the schema refresh endpoint\n // Server will return 202 and then restart\n const response = await this.fetch.post<{ message: string }>(\n '/api/v1/admin/schema/refresh',\n {}\n )\n\n // If we got a 202, the server is restarting\n console.log('Server restart initiated:', response.message || 'Schema refresh in progress')\n } catch (error: any) {\n // Connection errors are expected during restart\n const isConnectionError =\n error.message?.includes('fetch failed') ||\n error.message?.includes('ECONNREFUSED') ||\n error.message?.includes('ECONNRESET') ||\n error.code === 'ECONNREFUSED' ||\n error.code === 'ECONNRESET'\n\n if (!isConnectionError) {\n // Unexpected error - propagate it\n throw error\n }\n\n console.log('Connection dropped (expected during restart)...')\n }\n\n // Wait for server to restart (typically takes 5-7 seconds with build + startup)\n console.log('Waiting 6 seconds for server to restart...')\n await this.sleep(6000)\n\n // Verify server is back online by attempting a simple health check\n // Try up to 5 times with exponential backoff\n const maxAttempts = 5\n const baseDelay = 1000 // 1 second\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n // Check the root health endpoint (not /api/v1/health which doesn't exist)\n // We don't care about the response content, just that it responds without error\n await this.fetch.get('/health')\n console.log('Server is back online and ready')\n return\n } catch (error: any) {\n const isLastAttempt = attempt === maxAttempts\n\n if (isLastAttempt) {\n throw new Error(\n `Server did not come back online after ${maxAttempts} attempts. ` +\n `Please check server logs and try again.`\n )\n }\n\n // Exponential backoff: 1s, 2s, 4s, 8s\n const delay = baseDelay * Math.pow(2, attempt - 1)\n console.log(`Server not ready yet, retrying in ${delay}ms... (attempt ${attempt}/${maxAttempts})`)\n await this.sleep(delay)\n }\n }\n }\n\n /**\n * Helper function to sleep for a given duration\n * @private\n */\n private sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n }\n\n /**\n * Smart sync all registered migrations\n *\n * Automatically determines which migrations need to be created or updated by:\n * 1. Fetching existing migrations from the server\n * 2. Comparing content hashes to detect changes\n * 3. Only sending new or changed migrations\n *\n * After successful sync, can optionally auto-apply new migrations and refresh\n * the server's schema cache.\n *\n * @param options - Sync options\n * @returns Promise resolving to { data, error } tuple with sync results\n *\n * @example\n * ```typescript\n * // Basic sync (idempotent - safe to call on every app startup)\n * const { data, error } = await client.admin.migrations.sync()\n * if (data) {\n * console.log(`Created: ${data.summary.created}, Updated: ${data.summary.updated}`)\n * }\n *\n * // Sync with auto-apply (applies new migrations automatically)\n * const { data, error } = await client.admin.migrations.sync({\n * auto_apply: true\n * })\n *\n * // Dry run to preview changes without applying\n * const { data, error } = await client.admin.migrations.sync({\n * dry_run: true\n * })\n * ```\n */\n async sync(\n options: Partial<SyncMigrationsOptions> = {}\n ): Promise<{ data: SyncMigrationsResult | null; error: Error | null }> {\n try {\n // Group migrations by namespace\n const byNamespace = new Map<string, CreateMigrationRequest[]>()\n\n for (const migration of this.localMigrations.values()) {\n const ns = migration.namespace || 'default'\n if (!byNamespace.has(ns)) {\n byNamespace.set(ns, [])\n }\n byNamespace.get(ns)!.push(migration)\n }\n\n // Sync each namespace\n const results: SyncMigrationsResult[] = []\n const errors: Error[] = []\n\n for (const [namespace, migrations] of byNamespace) {\n try {\n const result = await this.fetch.post<SyncMigrationsResult>(\n '/api/v1/admin/migrations/sync',\n {\n namespace,\n migrations: migrations.map(m => ({\n name: m.name,\n description: m.description,\n up_sql: m.up_sql,\n down_sql: m.down_sql,\n })),\n options: {\n update_if_changed: options.update_if_changed ?? true,\n auto_apply: options.auto_apply ?? false,\n dry_run: options.dry_run ?? false,\n },\n }\n )\n results.push(result)\n } catch (error) {\n // If sync failed with errors (422), extract the sync result from error.details\n const err = error as any\n if (err.status === 422 && err.details) {\n // Server returned sync results with errors - include them\n results.push(err.details as SyncMigrationsResult)\n errors.push(err)\n } else {\n // Other errors (network, auth, etc.) - propagate them\n throw error\n }\n }\n }\n\n // Combine results\n const combined: SyncMigrationsResult = {\n message: results.map(r => r.message).join('; '),\n namespace: Array.from(byNamespace.keys()).join(', '),\n summary: {\n created: results.reduce((sum, r) => sum + r.summary.created, 0),\n updated: results.reduce((sum, r) => sum + r.summary.updated, 0),\n unchanged: results.reduce((sum, r) => sum + r.summary.unchanged, 0),\n skipped: results.reduce((sum, r) => sum + r.summary.skipped, 0),\n applied: results.reduce((sum, r) => sum + r.summary.applied, 0),\n errors: results.reduce((sum, r) => sum + r.summary.errors, 0),\n },\n details: {\n created: results.flatMap(r => r.details.created),\n updated: results.flatMap(r => r.details.updated),\n unchanged: results.flatMap(r => r.details.unchanged),\n skipped: results.flatMap(r => r.details.skipped),\n applied: results.flatMap(r => r.details.applied),\n errors: results.flatMap(r => r.details.errors),\n },\n dry_run: options.dry_run ?? false,\n warnings: results.flatMap(r => r.warnings || []),\n }\n\n // Refresh schema cache after migration sync (unless dry run or no changes)\n // Only restart if migrations were actually created or updated\n // The server will restart to refresh routes, so we need to wait and handle connection drops\n const hasChanges = combined.summary.created > 0 || combined.summary.updated > 0\n if (!combined.dry_run && hasChanges) {\n try {\n await this.triggerSchemaRefreshWithRestart()\n } catch (refreshError) {\n // Log warning but don't fail the sync operation\n console.warn('Schema refresh completed with warnings:', refreshError)\n }\n }\n\n // If there were errors during sync, return error with full details\n if (errors.length > 0 || combined.summary.errors > 0) {\n const error = new Error(combined.message) as any\n error.syncResult = combined\n error.details = combined.details.errors\n return { data: combined, error }\n }\n\n return { data: combined, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Create a new migration\n *\n * @param request - Migration configuration\n * @returns Promise resolving to { data, error } tuple with created migration\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.create({\n * namespace: 'myapp',\n * name: '001_create_users',\n * up_sql: 'CREATE TABLE app.users (id UUID PRIMARY KEY, email TEXT)',\n * down_sql: 'DROP TABLE app.users',\n * description: 'Create users table'\n * })\n * ```\n */\n async create(\n request: CreateMigrationRequest\n ): Promise<{ data: Migration | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<Migration>('/api/v1/admin/migrations', request)\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * List migrations in a namespace\n *\n * @param namespace - Migration namespace (default: 'default')\n * @param status - Filter by status: 'pending', 'applied', 'failed', 'rolled_back'\n * @returns Promise resolving to { data, error } tuple with migrations array\n *\n * @example\n * ```typescript\n * // List all migrations\n * const { data, error } = await client.admin.migrations.list('myapp')\n *\n * // List only pending migrations\n * const { data, error } = await client.admin.migrations.list('myapp', 'pending')\n * ```\n */\n async list(\n namespace: string = 'default',\n status?: 'pending' | 'applied' | 'failed' | 'rolled_back'\n ): Promise<{ data: Migration[] | null; error: Error | null }> {\n try {\n const params = new URLSearchParams({ namespace })\n if (status) params.append('status', status)\n\n const data = await this.fetch.get<Migration[]>(\n `/api/v1/admin/migrations?${params.toString()}`\n )\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Get details of a specific migration\n *\n * @param name - Migration name\n * @param namespace - Migration namespace (default: 'default')\n * @returns Promise resolving to { data, error } tuple with migration details\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.get('001_create_users', 'myapp')\n * ```\n */\n async get(\n name: string,\n namespace: string = 'default'\n ): Promise<{ data: Migration | null; error: Error | null }> {\n try {\n const params = new URLSearchParams({ namespace })\n const data = await this.fetch.get<Migration>(\n `/api/v1/admin/migrations/${name}?${params.toString()}`\n )\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Update a migration (only if status is pending)\n *\n * @param name - Migration name\n * @param updates - Fields to update\n * @param namespace - Migration namespace (default: 'default')\n * @returns Promise resolving to { data, error } tuple with updated migration\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.update(\n * '001_create_users',\n * { description: 'Updated description' },\n * 'myapp'\n * )\n * ```\n */\n async update(\n name: string,\n updates: UpdateMigrationRequest,\n namespace: string = 'default'\n ): Promise<{ data: Migration | null; error: Error | null }> {\n try {\n const params = new URLSearchParams({ namespace })\n const data = await this.fetch.put<Migration>(\n `/api/v1/admin/migrations/${name}?${params.toString()}`,\n updates\n )\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Delete a migration (only if status is pending)\n *\n * @param name - Migration name\n * @param namespace - Migration namespace (default: 'default')\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.delete('001_create_users', 'myapp')\n * ```\n */\n async delete(\n name: string,\n namespace: string = 'default'\n ): Promise<{ data: null; error: Error | null }> {\n try {\n const params = new URLSearchParams({ namespace })\n await this.fetch.delete(`/api/v1/admin/migrations/${name}?${params.toString()}`)\n return { data: null, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Apply a specific migration\n *\n * @param name - Migration name\n * @param namespace - Migration namespace (default: 'default')\n * @returns Promise resolving to { data, error } tuple with result message\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.apply('001_create_users', 'myapp')\n * if (data) {\n * console.log(data.message) // \"Migration applied successfully\"\n * }\n * ```\n */\n async apply(\n name: string,\n namespace: string = 'default'\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<{ message: string }>(\n `/api/v1/admin/migrations/${name}/apply`,\n { namespace }\n )\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Rollback a specific migration\n *\n * @param name - Migration name\n * @param namespace - Migration namespace (default: 'default')\n * @returns Promise resolving to { data, error } tuple with result message\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.rollback('001_create_users', 'myapp')\n * ```\n */\n async rollback(\n name: string,\n namespace: string = 'default'\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<{ message: string }>(\n `/api/v1/admin/migrations/${name}/rollback`,\n { namespace }\n )\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Apply all pending migrations in order\n *\n * @param namespace - Migration namespace (default: 'default')\n * @returns Promise resolving to { data, error } tuple with applied/failed counts\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.applyPending('myapp')\n * if (data) {\n * console.log(`Applied: ${data.applied.length}, Failed: ${data.failed.length}`)\n * }\n * ```\n */\n async applyPending(\n namespace: string = 'default'\n ): Promise<{\n data: { message: string; applied: string[]; failed: string[] } | null\n error: Error | null\n }> {\n try {\n const data = await this.fetch.post<{\n message: string\n applied: string[]\n failed: string[]\n }>('/api/v1/admin/migrations/apply-pending', { namespace })\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Get execution history for a migration\n *\n * @param name - Migration name\n * @param namespace - Migration namespace (default: 'default')\n * @param limit - Maximum number of executions to return (default: 50, max: 100)\n * @returns Promise resolving to { data, error } tuple with execution records\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.migrations.getExecutions(\n * '001_create_users',\n * 'myapp',\n * 10\n * )\n * if (data) {\n * data.forEach(exec => {\n * console.log(`${exec.executed_at}: ${exec.action} - ${exec.status}`)\n * })\n * }\n * ```\n */\n async getExecutions(\n name: string,\n namespace: string = 'default',\n limit: number = 50\n ): Promise<{ data: MigrationExecution[] | null; error: Error | null }> {\n try {\n const params = new URLSearchParams({ namespace, limit: limit.toString() })\n const data = await this.fetch.get<MigrationExecution[]>(\n `/api/v1/admin/migrations/${name}/executions?${params.toString()}`\n )\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n}\n","/**\n * Admin Jobs module for managing job functions and executions\n * Provides administrative operations for job lifecycle management\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n JobFunction,\n CreateJobFunctionRequest,\n UpdateJobFunctionRequest,\n Job,\n JobStats,\n JobWorker,\n SyncJobsResult,\n JobFunctionSpec,\n SyncJobsOptions,\n} from \"./types\";\n\n// Optional esbuild import - will be dynamically loaded if available\nlet esbuild: typeof import(\"esbuild\") | null = null;\n\n// Optional fs import for reading deno.json\nlet fs: typeof import(\"fs\") | null = null;\n\n/**\n * Try to load esbuild for client-side bundling\n * Returns true if esbuild is available, false otherwise\n */\nasync function loadEsbuild(): Promise<boolean> {\n if (esbuild) return true;\n try {\n esbuild = await import(\"esbuild\");\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Try to load fs module\n */\nasync function loadFs(): Promise<boolean> {\n if (fs) return true;\n try {\n fs = await import(\"fs\");\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Load import map from a deno.json file\n *\n * @param denoJsonPath - Path to deno.json file\n * @returns Import map object or null if not found\n *\n * @example\n * ```typescript\n * const importMap = await loadImportMap('./deno.json')\n * const bundled = await FluxbaseAdminJobs.bundleCode({\n * code: myCode,\n * importMap,\n * })\n * ```\n */\n/**\n * esbuild plugin that marks Deno-specific imports as external\n * Use this when bundling jobs with esbuild to handle npm:, https://, and jsr: imports\n *\n * @example\n * ```typescript\n * import { denoExternalPlugin } from '@fluxbase/sdk'\n * import * as esbuild from 'esbuild'\n *\n * const result = await esbuild.build({\n * entryPoints: ['./my-job.ts'],\n * bundle: true,\n * plugins: [denoExternalPlugin],\n * // ... other options\n * })\n * ```\n */\nexport const denoExternalPlugin = {\n name: \"deno-external\",\n setup(build: {\n onResolve: (\n opts: { filter: RegExp },\n cb: (args: { path: string }) => { path: string; external: boolean },\n ) => void;\n }) {\n // Mark npm: imports as external - Deno will resolve them at runtime\n build.onResolve({ filter: /^npm:/ }, (args) => ({\n path: args.path,\n external: true,\n }));\n\n // Mark https:// and http:// imports as external\n build.onResolve({ filter: /^https?:\\/\\// }, (args) => ({\n path: args.path,\n external: true,\n }));\n\n // Mark jsr: imports as external (Deno's JSR registry)\n build.onResolve({ filter: /^jsr:/ }, (args) => ({\n path: args.path,\n external: true,\n }));\n },\n};\n\nexport async function loadImportMap(\n denoJsonPath: string,\n): Promise<Record<string, string> | null> {\n const hasFs = await loadFs();\n if (!hasFs || !fs) {\n console.warn(\"fs module not available, cannot load import map\");\n return null;\n }\n\n try {\n const content = fs.readFileSync(denoJsonPath, \"utf-8\");\n const config = JSON.parse(content);\n return config.imports || null;\n } catch (error) {\n console.warn(`Failed to load import map from ${denoJsonPath}:`, error);\n return null;\n }\n}\n\n/**\n * Options for bundling job code\n */\nexport interface BundleOptions {\n /** Entry point code */\n code: string;\n /** External modules to exclude from bundle */\n external?: string[];\n /** Source map generation */\n sourcemap?: boolean;\n /** Minify output */\n minify?: boolean;\n /** Import map from deno.json (maps aliases to npm: or file paths) */\n importMap?: Record<string, string>;\n /** Base directory for resolving relative imports (resolveDir in esbuild) */\n baseDir?: string;\n /** Additional paths to search for node_modules (useful when importing from parent directories) */\n nodePaths?: string[];\n /** Custom define values for esbuild (e.g., { 'process.env.NODE_ENV': '\"production\"' }) */\n define?: Record<string, string>;\n}\n\n/**\n * Result of bundling job code\n */\nexport interface BundleResult {\n /** Bundled code */\n code: string;\n /** Source map (if enabled) */\n sourceMap?: string;\n}\n\n/**\n * Admin Jobs manager for managing background job functions\n * Provides create, update, delete, sync, and monitoring operations\n *\n * @category Admin\n */\nexport class FluxbaseAdminJobs {\n private fetch: FluxbaseFetch;\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch;\n }\n\n /**\n * Create a new job function\n *\n * @param request - Job function configuration and code\n * @returns Promise resolving to { data, error } tuple with created job function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.create({\n * name: 'process-data',\n * code: 'export async function handler(req) { return { success: true } }',\n * enabled: true,\n * timeout_seconds: 300\n * })\n * ```\n */\n async create(\n request: CreateJobFunctionRequest,\n ): Promise<{ data: JobFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<JobFunction>(\n \"/api/v1/admin/jobs/functions\",\n request,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List all namespaces that have job functions\n *\n * @returns Promise resolving to { data, error } tuple with array of namespace strings\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.listNamespaces()\n * if (data) {\n * console.log('Available namespaces:', data)\n * }\n * ```\n */\n async listNamespaces(): Promise<{\n data: string[] | null;\n error: Error | null;\n }> {\n try {\n const response = await this.fetch.get<{ namespaces: string[] }>(\n \"/api/v1/admin/jobs/namespaces\",\n );\n return { data: response.namespaces || [\"default\"], error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List all job functions (admin view)\n *\n * @param namespace - Optional namespace filter\n * @returns Promise resolving to { data, error } tuple with array of job functions\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.list('default')\n * if (data) {\n * console.log('Job functions:', data.map(f => f.name))\n * }\n * ```\n */\n async list(\n namespace?: string,\n ): Promise<{ data: JobFunction[] | null; error: Error | null }> {\n try {\n const params = namespace ? `?namespace=${namespace}` : \"\";\n const data = await this.fetch.get<JobFunction[]>(\n `/api/v1/admin/jobs/functions${params}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get details of a specific job function\n *\n * @param namespace - Namespace\n * @param name - Job function name\n * @returns Promise resolving to { data, error } tuple with job function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.get('default', 'process-data')\n * if (data) {\n * console.log('Job function version:', data.version)\n * }\n * ```\n */\n async get(\n namespace: string,\n name: string,\n ): Promise<{ data: JobFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<JobFunction>(\n `/api/v1/admin/jobs/functions/${namespace}/${name}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Update an existing job function\n *\n * @param namespace - Namespace\n * @param name - Job function name\n * @param updates - Fields to update\n * @returns Promise resolving to { data, error } tuple with updated job function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.update('default', 'process-data', {\n * enabled: false,\n * timeout_seconds: 600\n * })\n * ```\n */\n async update(\n namespace: string,\n name: string,\n updates: UpdateJobFunctionRequest,\n ): Promise<{ data: JobFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.put<JobFunction>(\n `/api/v1/admin/jobs/functions/${namespace}/${name}`,\n updates,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Delete a job function\n *\n * @param namespace - Namespace\n * @param name - Job function name\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.delete('default', 'process-data')\n * ```\n */\n async delete(\n namespace: string,\n name: string,\n ): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.delete(\n `/api/v1/admin/jobs/functions/${namespace}/${name}`,\n );\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List all jobs (executions) across all namespaces (admin view)\n *\n * @param filters - Optional filters (status, namespace, limit, offset)\n * @returns Promise resolving to { data, error } tuple with array of jobs\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.listJobs({\n * status: 'running',\n * namespace: 'default',\n * limit: 50\n * })\n * if (data) {\n * data.forEach(job => {\n * console.log(`${job.job_name}: ${job.status}`)\n * })\n * }\n * ```\n */\n async listJobs(filters?: {\n status?: string;\n namespace?: string;\n limit?: number;\n offset?: number;\n includeResult?: boolean;\n }): Promise<{ data: Job[] | null; error: Error | null }> {\n try {\n const params = new URLSearchParams();\n if (filters?.status) params.append(\"status\", filters.status);\n if (filters?.namespace) params.append(\"namespace\", filters.namespace);\n if (filters?.limit) params.append(\"limit\", filters.limit.toString());\n if (filters?.offset) params.append(\"offset\", filters.offset.toString());\n if (filters?.includeResult) params.append(\"include_result\", \"true\");\n\n const queryString = params.toString();\n const data = await this.fetch.get<Job[]>(\n `/api/v1/admin/jobs/queue${queryString ? `?${queryString}` : \"\"}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get details of a specific job (execution)\n *\n * @param jobId - Job ID\n * @returns Promise resolving to { data, error } tuple with job details\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.getJob('550e8400-e29b-41d4-a716-446655440000')\n * if (data) {\n * console.log(`Job ${data.job_name}: ${data.status}`)\n * }\n * ```\n */\n async getJob(\n jobId: string,\n ): Promise<{ data: Job | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<Job>(\n `/api/v1/admin/jobs/queue/${jobId}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Cancel a running or pending job\n *\n * @param jobId - Job ID\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.cancel('550e8400-e29b-41d4-a716-446655440000')\n * ```\n */\n async cancel(jobId: string): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.post(`/api/v1/admin/jobs/queue/${jobId}/cancel`, {});\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Terminate a running job immediately\n *\n * @param jobId - Job ID\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.terminate('550e8400-e29b-41d4-a716-446655440000')\n * ```\n */\n async terminate(jobId: string): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.post(`/api/v1/admin/jobs/queue/${jobId}/terminate`, {});\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Retry a failed job\n *\n * @param jobId - Job ID\n * @returns Promise resolving to { data, error } tuple with new job\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.retry('550e8400-e29b-41d4-a716-446655440000')\n * ```\n */\n async retry(\n jobId: string,\n ): Promise<{ data: Job | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<Job>(\n `/api/v1/admin/jobs/queue/${jobId}/retry`,\n {},\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get job statistics\n *\n * @param namespace - Optional namespace filter\n * @returns Promise resolving to { data, error } tuple with job stats\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.getStats('default')\n * if (data) {\n * console.log(`Pending: ${data.pending}, Running: ${data.running}`)\n * }\n * ```\n */\n async getStats(\n namespace?: string,\n ): Promise<{ data: JobStats | null; error: Error | null }> {\n try {\n const params = namespace ? `?namespace=${namespace}` : \"\";\n const data = await this.fetch.get<JobStats>(\n `/api/v1/admin/jobs/stats${params}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List active workers\n *\n * @returns Promise resolving to { data, error } tuple with array of workers\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.listWorkers()\n * if (data) {\n * data.forEach(worker => {\n * console.log(`Worker ${worker.id}: ${worker.current_jobs} jobs`)\n * })\n * }\n * ```\n */\n async listWorkers(): Promise<{\n data: JobWorker[] | null;\n error: Error | null;\n }> {\n try {\n const data = await this.fetch.get<JobWorker[]>(\n \"/api/v1/admin/jobs/workers\",\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Sync multiple job functions to a namespace\n *\n * Can sync from:\n * 1. Filesystem (if no jobs provided) - loads from configured jobs directory\n * 2. API payload (if jobs array provided) - syncs provided job specifications\n *\n * Requires service_role or admin authentication.\n *\n * @param options - Sync options including namespace and optional jobs array\n * @returns Promise resolving to { data, error } tuple with sync results\n *\n * @example\n * ```typescript\n * // Sync from filesystem\n * const { data, error } = await client.admin.jobs.sync({ namespace: 'default' })\n *\n * // Sync with pre-bundled code (client-side bundling)\n * const bundled = await FluxbaseAdminJobs.bundleCode({ code: myJobCode })\n * const { data, error } = await client.admin.jobs.sync({\n * namespace: 'default',\n * functions: [{\n * name: 'my-job',\n * code: bundled.code,\n * is_pre_bundled: true,\n * original_code: myJobCode,\n * }],\n * options: {\n * delete_missing: true, // Remove jobs not in this sync\n * dry_run: false, // Preview changes without applying\n * }\n * })\n *\n * if (data) {\n * console.log(`Synced: ${data.summary.created} created, ${data.summary.updated} updated`)\n * }\n * ```\n */\n async sync(\n options: SyncJobsOptions | string,\n ): Promise<{ data: SyncJobsResult | null; error: Error | null }> {\n try {\n // Support legacy string-only namespace argument\n const syncOptions: SyncJobsOptions =\n typeof options === \"string\" ? { namespace: options } : options;\n\n const data = await this.fetch.post<SyncJobsResult>(\n \"/api/v1/admin/jobs/sync\",\n {\n namespace: syncOptions.namespace,\n jobs: syncOptions.functions,\n options: {\n delete_missing: syncOptions.options?.delete_missing ?? false,\n dry_run: syncOptions.options?.dry_run ?? false,\n },\n },\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Sync job functions with automatic client-side bundling\n *\n * This is a convenience method that bundles all job code using esbuild\n * before sending to the server. Requires esbuild as a peer dependency.\n *\n * @param options - Sync options including namespace and jobs array\n * @param bundleOptions - Optional bundling configuration\n * @returns Promise resolving to { data, error } tuple with sync results\n *\n * @example\n * ```typescript\n * const { data, error } = await client.admin.jobs.syncWithBundling({\n * namespace: 'default',\n * functions: [\n * { name: 'process-data', code: processDataCode },\n * { name: 'send-email', code: sendEmailCode },\n * ],\n * options: { delete_missing: true }\n * })\n * ```\n */\n async syncWithBundling(\n options: SyncJobsOptions,\n bundleOptions?: Partial<BundleOptions>,\n ): Promise<{ data: SyncJobsResult | null; error: Error | null }> {\n if (!options.functions || options.functions.length === 0) {\n return this.sync(options);\n }\n\n // Check if esbuild is available\n const hasEsbuild = await loadEsbuild();\n if (!hasEsbuild) {\n return {\n data: null,\n error: new Error(\n \"esbuild is required for client-side bundling. Install it with: npm install esbuild\",\n ),\n };\n }\n\n try {\n // Bundle each function\n const bundledFunctions: JobFunctionSpec[] = await Promise.all(\n options.functions.map(async (fn) => {\n // Skip if already pre-bundled\n if (fn.is_pre_bundled) {\n return fn;\n }\n\n const bundled = await FluxbaseAdminJobs.bundleCode({\n // Apply global bundle options first\n ...bundleOptions,\n // Then override with per-function values (these take priority)\n code: fn.code,\n // Use function's sourceDir for resolving relative imports\n baseDir: fn.sourceDir || bundleOptions?.baseDir,\n // Use function's nodePaths for additional module resolution\n nodePaths: fn.nodePaths || bundleOptions?.nodePaths,\n });\n\n return {\n ...fn,\n code: bundled.code,\n original_code: fn.code,\n is_pre_bundled: true,\n };\n }),\n );\n\n // Sync with pre-bundled code\n return this.sync({\n ...options,\n functions: bundledFunctions,\n });\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Bundle job code using esbuild (client-side)\n *\n * Transforms and bundles TypeScript/JavaScript code into a single file\n * that can be executed by the Fluxbase jobs runtime.\n *\n * Requires esbuild as a peer dependency.\n *\n * @param options - Bundle options including source code\n * @returns Promise resolving to bundled code\n * @throws Error if esbuild is not available\n *\n * @example\n * ```typescript\n * const bundled = await FluxbaseAdminJobs.bundleCode({\n * code: `\n * import { helper } from './utils'\n * export async function handler(req) {\n * return helper(req.payload)\n * }\n * `,\n * minify: true,\n * })\n *\n * // Use bundled code in sync\n * await client.admin.jobs.sync({\n * namespace: 'default',\n * functions: [{\n * name: 'my-job',\n * code: bundled.code,\n * is_pre_bundled: true,\n * }]\n * })\n * ```\n */\n static async bundleCode(options: BundleOptions): Promise<BundleResult> {\n const hasEsbuild = await loadEsbuild();\n if (!hasEsbuild || !esbuild) {\n throw new Error(\n \"esbuild is required for bundling. Install it with: npm install esbuild\",\n );\n }\n\n // Process import map to extract externals and aliases\n const externals = [...(options.external ?? [])];\n const alias: Record<string, string> = {};\n\n if (options.importMap) {\n for (const [key, value] of Object.entries(options.importMap)) {\n // npm: imports should be marked as external - Deno will resolve them at runtime\n if (value.startsWith(\"npm:\")) {\n // Add the import key as external (e.g., \"@streamparser/json\")\n externals.push(key);\n } else if (\n value.startsWith(\"https://\") ||\n value.startsWith(\"http://\")\n ) {\n // URL imports should also be external - Deno will fetch them at runtime\n externals.push(key);\n } else if (\n value.startsWith(\"/\") ||\n value.startsWith(\"./\") ||\n value.startsWith(\"../\")\n ) {\n // Local file paths - create alias for esbuild\n alias[key] = value;\n } else {\n // Other imports (bare specifiers) - mark as external\n externals.push(key);\n }\n }\n }\n\n // Create a plugin to handle Deno-specific imports (npm:, https://, http://)\n const denoExternalPlugin: import(\"esbuild\").Plugin = {\n name: \"deno-external\",\n setup(build) {\n // Mark npm: imports as external\n build.onResolve({ filter: /^npm:/ }, (args) => ({\n path: args.path,\n external: true,\n }));\n\n // Mark https:// and http:// imports as external\n build.onResolve({ filter: /^https?:\\/\\// }, (args) => ({\n path: args.path,\n external: true,\n }));\n\n // Mark jsr: imports as external (Deno's JSR registry)\n build.onResolve({ filter: /^jsr:/ }, (args) => ({\n path: args.path,\n external: true,\n }));\n },\n };\n\n const resolveDir = options.baseDir || process.cwd?.() || \"/\";\n\n const buildOptions: import(\"esbuild\").BuildOptions = {\n stdin: {\n contents: options.code,\n loader: \"ts\",\n resolveDir,\n },\n // Set absWorkingDir for consistent path resolution\n absWorkingDir: resolveDir,\n bundle: true,\n write: false,\n format: \"esm\",\n // Use 'node' platform for better node_modules resolution (Deno supports Node APIs)\n platform: \"node\",\n target: \"esnext\",\n minify: options.minify ?? false,\n sourcemap: options.sourcemap ? \"inline\" : false,\n external: externals,\n plugins: [denoExternalPlugin],\n // Preserve handler export\n treeShaking: true,\n // Resolve .ts, .js, .mjs extensions\n resolveExtensions: [\".ts\", \".tsx\", \".js\", \".mjs\", \".json\"],\n // ESM conditions for better module resolution\n conditions: [\"import\", \"module\"],\n };\n\n // Add alias if we have any\n if (Object.keys(alias).length > 0) {\n buildOptions.alias = alias;\n }\n\n // Add nodePaths for resolving modules from additional directories\n if (options.nodePaths && options.nodePaths.length > 0) {\n buildOptions.nodePaths = options.nodePaths;\n }\n\n // Add custom define values\n if (options.define) {\n buildOptions.define = options.define;\n }\n\n const result = await esbuild.build(buildOptions);\n\n const output = result.outputFiles?.[0];\n if (!output) {\n throw new Error(\"Bundling failed: no output generated\");\n }\n\n return {\n code: output.text,\n sourceMap: options.sourcemap ? output.text : undefined,\n };\n }\n}\n","import type { FluxbaseFetch } from \"./fetch\";\nimport type {\n AdminAuthResponse,\n AdminLoginRequest,\n AdminMeResponse,\n AdminRefreshRequest,\n AdminRefreshResponse,\n AdminSetupRequest,\n AdminSetupStatusResponse,\n DeleteUserResponse,\n EnrichedUser,\n InviteUserRequest,\n InviteUserResponse,\n ListUsersOptions,\n ListUsersResponse,\n ResetUserPasswordResponse,\n DataResponse,\n VoidResponse,\n} from \"./types\";\nimport { wrapAsync, wrapAsyncVoid } from \"./utils/error-handling\";\nimport { FluxbaseSettings, EmailTemplateManager } from \"./settings\";\nimport { DDLManager } from \"./ddl\";\nimport { FluxbaseOAuth } from \"./oauth\";\nimport { ImpersonationManager } from \"./impersonation\";\nimport { FluxbaseManagement } from \"./management\";\nimport { FluxbaseAdminFunctions } from \"./admin-functions\";\nimport { FluxbaseAdminMigrations } from \"./admin-migrations\";\nimport { FluxbaseAdminJobs } from \"./admin-jobs\";\n\n/**\n * Admin client for managing Fluxbase instance\n */\nexport class FluxbaseAdmin {\n private fetch: FluxbaseFetch;\n private adminToken: string | null = null;\n\n /**\n * Settings manager for system and application settings\n */\n public settings: FluxbaseSettings;\n\n /**\n * DDL manager for database schema and table operations\n */\n public ddl: DDLManager;\n\n /**\n * OAuth configuration manager for provider and auth settings\n */\n public oauth: FluxbaseOAuth;\n\n /**\n * Impersonation manager for user impersonation and audit trail\n */\n public impersonation: ImpersonationManager;\n\n /**\n * Management namespace for API keys, webhooks, and invitations\n */\n public management: FluxbaseManagement;\n\n /**\n * Email template manager for customizing authentication and notification emails\n */\n public emailTemplates: EmailTemplateManager;\n\n /**\n * Functions manager for edge function management (create, update, delete, sync)\n */\n public functions: FluxbaseAdminFunctions;\n\n /**\n * Jobs manager for background job management (create, update, delete, sync, monitoring)\n */\n public jobs: FluxbaseAdminJobs;\n\n /**\n * Migrations manager for database migration operations (create, apply, rollback, sync)\n */\n public migrations: FluxbaseAdminMigrations;\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch;\n this.settings = new FluxbaseSettings(fetch);\n this.ddl = new DDLManager(fetch);\n this.oauth = new FluxbaseOAuth(fetch);\n this.impersonation = new ImpersonationManager(fetch);\n this.management = new FluxbaseManagement(fetch);\n this.emailTemplates = new EmailTemplateManager(fetch);\n this.functions = new FluxbaseAdminFunctions(fetch);\n this.jobs = new FluxbaseAdminJobs(fetch);\n this.migrations = new FluxbaseAdminMigrations(fetch);\n }\n\n /**\n * Set admin authentication token\n */\n setToken(token: string) {\n this.adminToken = token;\n this.fetch.setAuthToken(token);\n }\n\n /**\n * Get current admin token\n */\n getToken(): string | null {\n return this.adminToken;\n }\n\n /**\n * Clear admin token\n */\n clearToken() {\n this.adminToken = null;\n this.fetch.setAuthToken(null);\n }\n\n // ============================================================================\n // Admin Authentication\n // ============================================================================\n\n /**\n * Check if initial admin setup is needed\n *\n * @returns Setup status indicating if initial setup is required\n *\n * @example\n * ```typescript\n * const status = await admin.getSetupStatus();\n * if (status.needs_setup) {\n * console.log('Initial setup required');\n * }\n * ```\n */\n async getSetupStatus(): Promise<DataResponse<AdminSetupStatusResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.get<AdminSetupStatusResponse>(\n \"/api/v1/admin/setup/status\",\n );\n });\n }\n\n /**\n * Perform initial admin setup\n *\n * Creates the first admin user and completes initial setup.\n * This endpoint can only be called once.\n *\n * @param email - Admin email address\n * @param password - Admin password (minimum 12 characters)\n * @param name - Admin display name\n * @returns Authentication response with tokens\n *\n * @example\n * ```typescript\n * const response = await admin.setup({\n * email: 'admin@example.com',\n * password: 'SecurePassword123!',\n * name: 'Admin User'\n * });\n *\n * // Store tokens\n * localStorage.setItem('admin_token', response.access_token);\n * ```\n */\n async setup(request: AdminSetupRequest): Promise<DataResponse<AdminAuthResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AdminAuthResponse>(\n \"/api/v1/admin/setup\",\n request,\n );\n this.setToken(response.access_token);\n return response;\n });\n }\n\n /**\n * Admin login\n *\n * Authenticate as an admin user\n *\n * @param email - Admin email\n * @param password - Admin password\n * @returns Authentication response with tokens\n *\n * @example\n * ```typescript\n * const response = await admin.login({\n * email: 'admin@example.com',\n * password: 'password123'\n * });\n *\n * // Token is automatically set in the client\n * console.log('Logged in as:', response.user.email);\n * ```\n */\n async login(request: AdminLoginRequest): Promise<DataResponse<AdminAuthResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AdminAuthResponse>(\n \"/api/v1/admin/login\",\n request,\n );\n this.setToken(response.access_token);\n return response;\n });\n }\n\n /**\n * Refresh admin access token\n *\n * @param refreshToken - Refresh token\n * @returns New access and refresh tokens\n *\n * @example\n * ```typescript\n * const refreshToken = localStorage.getItem('admin_refresh_token');\n * const response = await admin.refreshToken({ refresh_token: refreshToken });\n *\n * // Update stored tokens\n * localStorage.setItem('admin_token', response.access_token);\n * localStorage.setItem('admin_refresh_token', response.refresh_token);\n * ```\n */\n async refreshToken(\n request: AdminRefreshRequest,\n ): Promise<DataResponse<AdminRefreshResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AdminRefreshResponse>(\n \"/api/v1/admin/refresh\",\n request,\n );\n this.setToken(response.access_token);\n return response;\n });\n }\n\n /**\n * Admin logout\n *\n * Invalidates the current admin session\n *\n * @example\n * ```typescript\n * await admin.logout();\n * localStorage.removeItem('admin_token');\n * ```\n */\n async logout(): Promise<VoidResponse> {\n return wrapAsyncVoid(async () => {\n await this.fetch.post<{ message: string }>(\"/api/v1/admin/logout\", {});\n this.clearToken();\n });\n }\n\n /**\n * Get current admin user information\n *\n * @returns Current admin user details\n *\n * @example\n * ```typescript\n * const { user } = await admin.me();\n * console.log('Logged in as:', user.email);\n * console.log('Role:', user.role);\n * ```\n */\n async me(): Promise<DataResponse<AdminMeResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.get<AdminMeResponse>(\"/api/v1/admin/me\");\n });\n }\n\n // ============================================================================\n // User Management\n // ============================================================================\n\n /**\n * List all users\n *\n * @param options - Filter and pagination options\n * @returns List of users with metadata\n *\n * @example\n * ```typescript\n * // List all users\n * const { users, total } = await admin.listUsers();\n *\n * // List with filters\n * const result = await admin.listUsers({\n * exclude_admins: true,\n * search: 'john',\n * limit: 50,\n * type: 'app'\n * });\n * ```\n */\n async listUsers(options: ListUsersOptions = {}): Promise<DataResponse<ListUsersResponse>> {\n return wrapAsync(async () => {\n const params = new URLSearchParams();\n\n if (options.exclude_admins !== undefined) {\n params.append(\"exclude_admins\", String(options.exclude_admins));\n }\n if (options.search) {\n params.append(\"search\", options.search);\n }\n if (options.limit !== undefined) {\n params.append(\"limit\", String(options.limit));\n }\n if (options.type) {\n params.append(\"type\", options.type);\n }\n\n const queryString = params.toString();\n const url = queryString\n ? `/api/v1/admin/users?${queryString}`\n : \"/api/v1/admin/users\";\n\n return await this.fetch.get<ListUsersResponse>(url);\n });\n }\n\n /**\n * Get a user by ID\n *\n * Fetch a single user's details by their user ID\n *\n * @param userId - User ID to fetch\n * @param type - User type ('app' or 'dashboard')\n * @returns User details with metadata\n *\n * @example\n * ```typescript\n * // Get an app user\n * const user = await admin.getUserById('user-123');\n *\n * // Get a dashboard user\n * const dashboardUser = await admin.getUserById('admin-456', 'dashboard');\n * console.log('User email:', dashboardUser.email);\n * console.log('Last login:', dashboardUser.last_login_at);\n * ```\n */\n async getUserById(\n userId: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<EnrichedUser>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}?type=${type}`;\n return await this.fetch.get<EnrichedUser>(url);\n });\n }\n\n /**\n * Invite a new user\n *\n * Creates a new user and optionally sends an invitation email\n *\n * @param request - User invitation details\n * @param type - User type ('app' or 'dashboard')\n * @returns Created user and invitation details\n *\n * @example\n * ```typescript\n * const response = await admin.inviteUser({\n * email: 'newuser@example.com',\n * role: 'user',\n * send_email: true\n * });\n *\n * console.log('User invited:', response.user.email);\n * console.log('Invitation link:', response.invitation_link);\n * ```\n */\n async inviteUser(\n request: InviteUserRequest,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<InviteUserResponse>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/invite?type=${type}`;\n return await this.fetch.post<InviteUserResponse>(url, request);\n });\n }\n\n /**\n * Delete a user\n *\n * Permanently deletes a user and all associated data\n *\n * @param userId - User ID to delete\n * @param type - User type ('app' or 'dashboard')\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await admin.deleteUser('user-uuid');\n * console.log('User deleted');\n * ```\n */\n async deleteUser(\n userId: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<DeleteUserResponse>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}?type=${type}`;\n return await this.fetch.delete<DeleteUserResponse>(url);\n });\n }\n\n /**\n * Update user role\n *\n * Changes a user's role\n *\n * @param userId - User ID\n * @param role - New role\n * @param type - User type ('app' or 'dashboard')\n * @returns Updated user\n *\n * @example\n * ```typescript\n * const user = await admin.updateUserRole('user-uuid', 'admin');\n * console.log('User role updated:', user.role);\n * ```\n */\n async updateUserRole(\n userId: string,\n role: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<EnrichedUser>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}/role?type=${type}`;\n return await this.fetch.patch<EnrichedUser>(url, { role });\n });\n }\n\n /**\n * Reset user password\n *\n * Generates a new password for the user and optionally sends it via email\n *\n * @param userId - User ID\n * @param type - User type ('app' or 'dashboard')\n * @returns Reset confirmation message\n *\n * @example\n * ```typescript\n * const response = await admin.resetUserPassword('user-uuid');\n * console.log(response.message);\n * ```\n */\n async resetUserPassword(\n userId: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<ResetUserPasswordResponse>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}/reset-password?type=${type}`;\n return await this.fetch.post<ResetUserPasswordResponse>(url, {});\n });\n }\n}\n","/**\n * PostgreSQL query builder for Fluxbase SDK\n * Inspired by Supabase's PostgREST client\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n CountType,\n FilterOperator,\n OrderBy,\n PostgrestResponse,\n SelectOptions,\n UpsertOptions,\n} from \"./types\";\n\nexport class QueryBuilder<T = unknown>\n implements PromiseLike<PostgrestResponse<T>>\n{\n private fetch: FluxbaseFetch;\n private table: string;\n private schema?: string;\n private selectQuery: string = \"*\";\n private filters: Array<{\n column: string;\n operator: FilterOperator;\n value: unknown;\n }> = [];\n private orFilters: string[] = [];\n private andFilters: string[] = [];\n private orderBys: OrderBy[] = [];\n private limitValue?: number;\n private offsetValue?: number;\n private singleRow: boolean = false;\n private maybeSingleRow: boolean = false;\n private groupByColumns?: string[];\n private operationType: \"select\" | \"insert\" | \"update\" | \"delete\" = \"select\";\n private countType?: CountType;\n private headOnly: boolean = false;\n private insertData?: Partial<T> | Array<Partial<T>>;\n private updateData?: Partial<T>;\n\n constructor(fetch: FluxbaseFetch, table: string, schema?: string) {\n this.fetch = fetch;\n this.table = table;\n this.schema = schema;\n }\n\n /**\n * Build the API path for this table, including schema if specified\n */\n private buildTablePath(): string {\n return this.schema\n ? `/api/v1/tables/${this.schema}/${this.table}`\n : `/api/v1/tables/${this.table}`;\n }\n\n /**\n * Select columns to return\n * @example select('*')\n * @example select('id, name, email')\n * @example select('id, name, posts(title, content)')\n * @example select('*', { count: 'exact' }) // Get exact count\n * @example select('*', { count: 'exact', head: true }) // Get count only (no data)\n */\n select(columns: string = \"*\", options?: SelectOptions): this {\n this.selectQuery = columns;\n if (options?.count) {\n this.countType = options.count;\n }\n if (options?.head) {\n this.headOnly = true;\n }\n return this;\n }\n\n /**\n * Insert a single row or multiple rows\n */\n insert(data: Partial<T> | Array<Partial<T>>): this {\n this.operationType = \"insert\";\n this.insertData = data;\n return this;\n }\n\n /**\n * Upsert (insert or update) rows (Supabase-compatible)\n * @param data - Row(s) to upsert\n * @param options - Upsert options (onConflict, ignoreDuplicates, defaultToNull)\n */\n async upsert(\n data: Partial<T> | Array<Partial<T>>,\n options?: UpsertOptions,\n ): Promise<PostgrestResponse<T>> {\n const body = Array.isArray(data) ? data : data;\n\n // Build Prefer header based on options\n const preferValues: string[] = [];\n\n if (options?.ignoreDuplicates) {\n preferValues.push(\"resolution=ignore-duplicates\");\n } else {\n preferValues.push(\"resolution=merge-duplicates\");\n }\n\n if (options?.defaultToNull) {\n preferValues.push(\"missing=default\");\n }\n\n const headers: Record<string, string> = {\n Prefer: preferValues.join(\",\"),\n };\n\n // Add onConflict as query parameter if specified\n let path = this.buildTablePath();\n if (options?.onConflict) {\n path += `?on_conflict=${encodeURIComponent(options.onConflict)}`;\n }\n\n const response = await this.fetch.post<T>(path, body, { headers });\n\n return {\n data: response,\n error: null,\n count: Array.isArray(data) ? data.length : 1,\n status: 201,\n statusText: \"Created\",\n };\n }\n\n /**\n * Update rows matching the filters\n */\n update(data: Partial<T>): this {\n this.operationType = \"update\";\n this.updateData = data;\n return this;\n }\n\n /**\n * Delete rows matching the filters\n */\n delete(): this {\n this.operationType = \"delete\";\n return this;\n }\n\n /**\n * Equal to\n */\n eq(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"eq\", value });\n return this;\n }\n\n /**\n * Not equal to\n */\n neq(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"neq\", value });\n return this;\n }\n\n /**\n * Greater than\n */\n gt(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"gt\", value });\n return this;\n }\n\n /**\n * Greater than or equal to\n */\n gte(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"gte\", value });\n return this;\n }\n\n /**\n * Less than\n */\n lt(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"lt\", value });\n return this;\n }\n\n /**\n * Less than or equal to\n */\n lte(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"lte\", value });\n return this;\n }\n\n /**\n * Pattern matching (case-sensitive)\n */\n like(column: string, pattern: string): this {\n this.filters.push({ column, operator: \"like\", value: pattern });\n return this;\n }\n\n /**\n * Pattern matching (case-insensitive)\n */\n ilike(column: string, pattern: string): this {\n this.filters.push({ column, operator: \"ilike\", value: pattern });\n return this;\n }\n\n /**\n * Check if value is null or not null\n */\n is(column: string, value: null | boolean): this {\n this.filters.push({ column, operator: \"is\", value });\n return this;\n }\n\n /**\n * Check if value is in array\n */\n in(column: string, values: unknown[]): this {\n this.filters.push({ column, operator: \"in\", value: values });\n return this;\n }\n\n /**\n * Contains (for arrays and JSONB)\n */\n contains(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"cs\", value });\n return this;\n }\n\n /**\n * Full-text search\n */\n textSearch(column: string, query: string): this {\n this.filters.push({ column, operator: \"fts\", value: query });\n return this;\n }\n\n /**\n * Negate a filter condition (Supabase-compatible)\n * @example not('status', 'eq', 'deleted')\n * @example not('completed_at', 'is', null)\n */\n not(column: string, operator: FilterOperator, value: unknown): this {\n this.filters.push({\n column,\n operator: \"not\" as FilterOperator,\n value: `${operator}.${this.formatValue(value)}`,\n });\n return this;\n }\n\n /**\n * Apply OR logic to filters (Supabase-compatible)\n * @example or('status.eq.active,status.eq.pending')\n * @example or('id.eq.2,name.eq.Han')\n */\n or(filters: string): this {\n this.orFilters.push(filters);\n return this;\n }\n\n /**\n * Apply AND logic to filters (Supabase-compatible)\n * Groups multiple conditions that must all be true\n * @example and('status.eq.active,verified.eq.true')\n * @example and('age.gte.18,age.lte.65')\n */\n and(filters: string): this {\n this.andFilters.push(filters);\n return this;\n }\n\n /**\n * Match multiple columns with exact values (Supabase-compatible)\n * Shorthand for multiple .eq() calls\n * @example match({ id: 1, status: 'active', role: 'admin' })\n */\n match(conditions: Record<string, unknown>): this {\n for (const [column, value] of Object.entries(conditions)) {\n this.eq(column, value);\n }\n return this;\n }\n\n /**\n * Generic filter method using PostgREST syntax (Supabase-compatible)\n * @example filter('name', 'in', '(\"Han\",\"Yoda\")')\n * @example filter('age', 'gte', '18')\n */\n filter(column: string, operator: FilterOperator, value: unknown): this {\n this.filters.push({ column, operator, value });\n return this;\n }\n\n /**\n * Check if column is contained by value (Supabase-compatible)\n * For arrays and JSONB\n * @example containedBy('tags', '[\"news\",\"update\"]')\n */\n containedBy(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"cd\", value });\n return this;\n }\n\n /**\n * Check if arrays have common elements (Supabase-compatible)\n * @example overlaps('tags', '[\"news\",\"sports\"]')\n */\n overlaps(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"ov\", value });\n return this;\n }\n\n // PostGIS Spatial Query Methods\n\n /**\n * Check if geometries intersect (PostGIS ST_Intersects)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test intersection with\n * @example intersects('location', { type: 'Point', coordinates: [-122.4, 37.8] })\n */\n intersects(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_intersects\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Check if geometry A contains geometry B (PostGIS ST_Contains)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test containment\n * @example contains('region', { type: 'Point', coordinates: [-122.4, 37.8] })\n */\n stContains(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_contains\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Check if geometry A is within geometry B (PostGIS ST_Within)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test containment within\n * @example within('point', { type: 'Polygon', coordinates: [[...]] })\n */\n within(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_within\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Check if geometries touch (PostGIS ST_Touches)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test touching\n * @example touches('boundary', { type: 'LineString', coordinates: [[...]] })\n */\n touches(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_touches\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Check if geometries cross (PostGIS ST_Crosses)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test crossing\n * @example crosses('road', { type: 'LineString', coordinates: [[...]] })\n */\n crosses(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_crosses\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Check if geometries spatially overlap (PostGIS ST_Overlaps)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test overlap\n * @example stOverlaps('area', { type: 'Polygon', coordinates: [[...]] })\n */\n stOverlaps(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_overlaps\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Order results\n */\n order(\n column: string,\n options?: { ascending?: boolean; nullsFirst?: boolean },\n ): this {\n this.orderBys.push({\n column,\n direction: options?.ascending === false ? \"desc\" : \"asc\",\n nulls: options?.nullsFirst ? \"first\" : \"last\",\n });\n return this;\n }\n\n /**\n * Limit number of rows returned\n */\n limit(count: number): this {\n this.limitValue = count;\n return this;\n }\n\n /**\n * Skip rows\n */\n offset(count: number): this {\n this.offsetValue = count;\n return this;\n }\n\n /**\n * Return a single row (adds limit(1))\n * Errors if no rows found\n */\n single(): this {\n this.singleRow = true;\n this.limitValue = 1;\n return this;\n }\n\n /**\n * Return a single row or null (adds limit(1))\n * Does not error if no rows found (Supabase-compatible)\n * @example\n * ```typescript\n * // Returns null instead of erroring when no row exists\n * const { data, error } = await client\n * .from('users')\n * .select('*')\n * .eq('id', 999)\n * .maybeSingle()\n * // data will be null if no row found\n * ```\n */\n maybeSingle(): this {\n this.maybeSingleRow = true;\n this.limitValue = 1;\n return this;\n }\n\n /**\n * Range selection (pagination)\n */\n range(from: number, to: number): this {\n this.offsetValue = from;\n this.limitValue = to - from + 1;\n return this;\n }\n\n /**\n * Group results by one or more columns (for use with aggregations)\n *\n * @param columns - Column name(s) to group by\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Group by single column\n * const { data } = await client.from('orders')\n * .count('*')\n * .groupBy('status')\n * .execute()\n *\n * // Group by multiple columns\n * const { data } = await client.from('sales')\n * .sum('amount')\n * .groupBy(['region', 'product_category'])\n * .execute()\n * ```\n *\n * @category Aggregation\n */\n groupBy(columns: string | string[]): this {\n this.groupByColumns = Array.isArray(columns) ? columns : [columns];\n return this;\n }\n\n /**\n * Count rows or a specific column\n *\n * @param column - Column to count (default: '*' for row count)\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Count all rows\n * const { data } = await client.from('users').count().execute()\n * // Returns: { count: 150 }\n *\n * // Count non-null values in a column\n * const { data } = await client.from('orders').count('completed_at').execute()\n *\n * // Count with grouping\n * const { data } = await client.from('products')\n * .count('*')\n * .groupBy('category')\n * .execute()\n * // Returns: [{ category: 'electronics', count: 45 }, { category: 'books', count: 23 }]\n * ```\n *\n * @category Aggregation\n */\n count(column: string = \"*\"): this {\n this.selectQuery = `count(${column})`;\n return this;\n }\n\n /**\n * Calculate the sum of a numeric column\n *\n * @param column - Column to sum\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Sum all prices\n * const { data } = await client.from('products').sum('price').execute()\n * // Returns: { sum_price: 15420.50 }\n *\n * // Sum by category\n * const { data } = await client.from('orders')\n * .sum('total')\n * .groupBy('status')\n * .execute()\n * // Returns: [{ status: 'completed', sum_total: 12500 }, { status: 'pending', sum_total: 3200 }]\n * ```\n *\n * @category Aggregation\n */\n sum(column: string): this {\n this.selectQuery = `sum(${column})`;\n return this;\n }\n\n /**\n * Calculate the average of a numeric column\n *\n * @param column - Column to average\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Average price\n * const { data } = await client.from('products').avg('price').execute()\n * // Returns: { avg_price: 129.99 }\n *\n * // Average by category\n * const { data } = await client.from('products')\n * .avg('price')\n * .groupBy('category')\n * .execute()\n * ```\n *\n * @category Aggregation\n */\n avg(column: string): this {\n this.selectQuery = `avg(${column})`;\n return this;\n }\n\n /**\n * Find the minimum value in a column\n *\n * @param column - Column to find minimum value\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Find lowest price\n * const { data } = await client.from('products').min('price').execute()\n * // Returns: { min_price: 9.99 }\n *\n * // Find earliest date\n * const { data } = await client.from('orders').min('created_at').execute()\n * ```\n *\n * @category Aggregation\n */\n min(column: string): this {\n this.selectQuery = `min(${column})`;\n return this;\n }\n\n /**\n * Find the maximum value in a column\n *\n * @param column - Column to find maximum value\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Find highest price\n * const { data } = await client.from('products').max('price').execute()\n * // Returns: { max_price: 1999.99 }\n *\n * // Find most recent order\n * const { data } = await client.from('orders').max('created_at').execute()\n * ```\n *\n * @category Aggregation\n */\n max(column: string): this {\n this.selectQuery = `max(${column})`;\n return this;\n }\n\n /**\n * Insert multiple rows in a single request (batch insert)\n *\n * This is a convenience method that explicitly shows intent for batch operations.\n * Internally calls `insert()` with an array.\n *\n * @param rows - Array of row objects to insert\n * @returns Promise with the inserted rows\n *\n * @example\n * ```typescript\n * // Insert multiple users at once\n * const { data } = await client.from('users').insertMany([\n * { name: 'Alice', email: 'alice@example.com' },\n * { name: 'Bob', email: 'bob@example.com' },\n * { name: 'Charlie', email: 'charlie@example.com' }\n * ])\n * ```\n *\n * @category Batch Operations\n */\n async insertMany(rows: Array<Partial<T>>): Promise<PostgrestResponse<T>> {\n return this.insert(rows).execute();\n }\n\n /**\n * Update multiple rows matching the filters (batch update)\n *\n * Updates all rows that match the current query filters.\n * This is a convenience method that explicitly shows intent for batch operations.\n *\n * @param data - Data to update matching rows with\n * @returns Promise with the updated rows\n *\n * @example\n * ```typescript\n * // Apply discount to all electronics\n * const { data } = await client.from('products')\n * .eq('category', 'electronics')\n * .updateMany({ discount: 10, updated_at: new Date() })\n *\n * // Mark all pending orders as processing\n * const { data } = await client.from('orders')\n * .eq('status', 'pending')\n * .updateMany({ status: 'processing' })\n * ```\n *\n * @category Batch Operations\n */\n async updateMany(data: Partial<T>): Promise<PostgrestResponse<T>> {\n return this.update(data).execute();\n }\n\n /**\n * Delete multiple rows matching the filters (batch delete)\n *\n * Deletes all rows that match the current query filters.\n * This is a convenience method that explicitly shows intent for batch operations.\n *\n * @returns Promise confirming deletion\n *\n * @example\n * ```typescript\n * // Delete all inactive users\n * await client.from('users')\n * .eq('active', false)\n * .deleteMany()\n *\n * // Delete old logs\n * await client.from('logs')\n * .lt('created_at', '2024-01-01')\n * .deleteMany()\n * ```\n *\n * @category Batch Operations\n */\n async deleteMany(): Promise<PostgrestResponse<null>> {\n return this.delete().execute() as Promise<PostgrestResponse<null>>;\n }\n\n /**\n * Execute the query and return results\n */\n async execute(): Promise<PostgrestResponse<T>> {\n try {\n // Handle INSERT operation\n if (this.operationType === \"insert\") {\n if (!this.insertData) {\n throw new Error(\"Insert data is required for insert operation\");\n }\n const body = Array.isArray(this.insertData)\n ? this.insertData\n : this.insertData;\n const response = await this.fetch.post<T>(this.buildTablePath(), body);\n\n return {\n data: response,\n error: null,\n count: Array.isArray(this.insertData) ? this.insertData.length : 1,\n status: 201,\n statusText: \"Created\",\n };\n }\n\n // Handle UPDATE operation\n if (this.operationType === \"update\") {\n if (!this.updateData) {\n throw new Error(\"Update data is required for update operation\");\n }\n const queryString = this.buildQueryString();\n const path = `${this.buildTablePath()}${queryString}`;\n const response = await this.fetch.patch<T>(path, this.updateData);\n\n return {\n data: response,\n error: null,\n count: null,\n status: 200,\n statusText: \"OK\",\n };\n }\n\n // Handle DELETE operation\n if (this.operationType === \"delete\") {\n const queryString = this.buildQueryString();\n const path = `${this.buildTablePath()}${queryString}`;\n await this.fetch.delete(path);\n\n return {\n data: null,\n error: null,\n count: null,\n status: 204,\n statusText: \"No Content\",\n } as PostgrestResponse<T>;\n }\n\n // Handle SELECT operation (default)\n const queryString = this.buildQueryString();\n const path = `${this.buildTablePath()}${queryString}`;\n\n // When count is requested, use getWithHeaders to access Content-Range header\n if (this.countType) {\n const response = await this.fetch.getWithHeaders<T | T[]>(path);\n const serverCount = this.parseContentRangeCount(response.headers);\n const data = response.data;\n\n // Handle head-only request (only return count, no data)\n if (this.headOnly) {\n return {\n data: null,\n error: null,\n count: serverCount,\n status: response.status,\n statusText: \"OK\",\n };\n }\n\n // Handle single row response with count\n if (this.singleRow) {\n if (Array.isArray(data) && data.length === 0) {\n return {\n data: null,\n error: { message: \"No rows found\", code: \"PGRST116\" },\n count: serverCount ?? 0,\n status: 404,\n statusText: \"Not Found\",\n };\n }\n const singleData = Array.isArray(data) ? data[0] : data;\n return {\n data: singleData as T,\n error: null,\n count: serverCount ?? 1,\n status: 200,\n statusText: \"OK\",\n };\n }\n\n // Handle maybeSingle row response with count\n if (this.maybeSingleRow) {\n if (Array.isArray(data) && data.length === 0) {\n return {\n data: null,\n error: null,\n count: serverCount ?? 0,\n status: 200,\n statusText: \"OK\",\n };\n }\n const singleData = Array.isArray(data) ? data[0] : data;\n return {\n data: singleData as T,\n error: null,\n count: serverCount ?? 1,\n status: 200,\n statusText: \"OK\",\n };\n }\n\n // Normal response with server count\n return {\n data: data as T,\n error: null,\n count: serverCount ?? (Array.isArray(data) ? data.length : null),\n status: 200,\n statusText: \"OK\",\n };\n }\n\n // Standard path without count - use regular get\n const data = await this.fetch.get<T | T[]>(path);\n\n // Handle single row response\n if (this.singleRow) {\n if (Array.isArray(data) && data.length === 0) {\n return {\n data: null,\n error: { message: \"No rows found\", code: \"PGRST116\" },\n count: 0,\n status: 404,\n statusText: \"Not Found\",\n };\n }\n const singleData = Array.isArray(data) ? data[0] : data;\n return {\n data: singleData as T,\n error: null,\n count: 1,\n status: 200,\n statusText: \"OK\",\n };\n }\n\n // Handle maybeSingle row response (returns null instead of error when no rows found)\n if (this.maybeSingleRow) {\n if (Array.isArray(data) && data.length === 0) {\n return {\n data: null,\n error: null,\n count: 0,\n status: 200,\n statusText: \"OK\",\n };\n }\n const singleData = Array.isArray(data) ? data[0] : data;\n return {\n data: singleData as T,\n error: null,\n count: 1,\n status: 200,\n statusText: \"OK\",\n };\n }\n\n return {\n data: data as T,\n error: null,\n count: Array.isArray(data) ? data.length : null,\n status: 200,\n statusText: \"OK\",\n };\n } catch (err) {\n const error = err as Error;\n return {\n data: null,\n error: {\n message: error.message,\n code: \"PGRST000\",\n },\n count: null,\n status: 500,\n statusText: \"Internal Server Error\",\n };\n }\n }\n\n /**\n * Execute the query and throw an error if one occurs (Supabase-compatible)\n * Returns the data directly instead of { data, error } wrapper\n *\n * @throws {Error} If the query fails or returns an error\n * @example\n * ```typescript\n * // Throws error instead of returning { data, error }\n * try {\n * const user = await client\n * .from('users')\n * .select('*')\n * .eq('id', 1)\n * .single()\n * .throwOnError()\n * } catch (error) {\n * console.error('Query failed:', error)\n * }\n * ```\n */\n async throwOnError(): Promise<T> {\n const response = await this.execute();\n\n if (response.error) {\n const error = new Error(response.error.message);\n // Preserve error code if available\n if (response.error.code) {\n (error as any).code = response.error.code;\n }\n throw error;\n }\n\n return response.data as T;\n }\n\n /**\n * Make QueryBuilder awaitable (implements PromiseLike)\n * This allows using `await client.from('table').select()` without calling `.execute()`\n *\n * @example\n * ```typescript\n * // Without .execute() (new way)\n * const { data } = await client.from('users').select('*')\n *\n * // With .execute() (old way, still supported)\n * const { data } = await client.from('users').select('*').execute()\n * ```\n */\n then<TResult1 = PostgrestResponse<T>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResponse<T>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.execute().then(onfulfilled, onrejected);\n }\n\n /**\n * Build the query string from filters, ordering, etc.\n */\n private buildQueryString(): string {\n const params = new URLSearchParams();\n\n // Select\n if (this.selectQuery && this.selectQuery !== \"*\") {\n params.append(\"select\", this.selectQuery);\n }\n\n // Filters\n for (const filter of this.filters) {\n params.append(\n filter.column,\n `${filter.operator}.${this.formatValue(filter.value)}`,\n );\n }\n\n // OR Filters\n for (const orFilter of this.orFilters) {\n params.append(\"or\", `(${orFilter})`);\n }\n\n // AND Filters\n for (const andFilter of this.andFilters) {\n params.append(\"and\", `(${andFilter})`);\n }\n\n // Group By\n if (this.groupByColumns && this.groupByColumns.length > 0) {\n params.append(\"group_by\", this.groupByColumns.join(\",\"));\n }\n\n // Order\n if (this.orderBys.length > 0) {\n const orderStr = this.orderBys\n .map(\n (o) =>\n `${o.column}.${o.direction}${o.nulls ? `.nulls${o.nulls}` : \"\"}`,\n )\n .join(\",\");\n params.append(\"order\", orderStr);\n }\n\n // Limit\n if (this.limitValue !== undefined) {\n params.append(\"limit\", String(this.limitValue));\n }\n\n // Offset\n if (this.offsetValue !== undefined) {\n params.append(\"offset\", String(this.offsetValue));\n }\n\n // Count - request server to return total count in Content-Range header\n if (this.countType) {\n params.append(\"count\", this.countType);\n }\n\n const queryString = params.toString();\n return queryString ? `?${queryString}` : \"\";\n }\n\n /**\n * Format a value for the query string\n */\n private formatValue(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (Array.isArray(value)) {\n return `(${value.map((v) => this.formatValue(v)).join(\",\")})`;\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n return String(value);\n }\n\n /**\n * Parse the Content-Range header to extract the total count\n * Header format: \"0-999/50000\" or \"* /50000\" (when no rows returned)\n */\n private parseContentRangeCount(headers: Headers): number | null {\n const contentRange = headers.get(\"Content-Range\");\n if (!contentRange) {\n return null;\n }\n // Match the total count after the slash: \"0-999/50000\" -> \"50000\"\n const match = contentRange.match(/\\/(\\d+)$/);\n if (match && match[1]) {\n return parseInt(match[1], 10);\n }\n return null;\n }\n}\n","/**\n * Schema-scoped query builder for accessing tables in non-public schemas.\n *\n * @example\n * ```typescript\n * // Query the jobs.execution_logs table\n * const { data } = await client\n * .schema('jobs')\n * .from('execution_logs')\n * .select('*')\n * .execute();\n * ```\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport { QueryBuilder } from \"./query-builder\";\n\nexport class SchemaQueryBuilder {\n constructor(\n private fetch: FluxbaseFetch,\n private schemaName: string,\n ) {}\n\n /**\n * Create a query builder for a table in this schema\n *\n * @param table - The table name (without schema prefix)\n * @returns A query builder instance for constructing and executing queries\n */\n from<T = any>(table: string): QueryBuilder<T> {\n return new QueryBuilder<T>(this.fetch, table, this.schemaName);\n }\n}\n","/**\n * Main Fluxbase client for interacting with the Fluxbase backend.\n *\n * This client provides access to all Fluxbase features including:\n * - Database operations via PostgREST-compatible API\n * - Authentication and user management\n * - Real-time subscriptions via WebSockets\n * - File storage and management\n * - Edge functions for serverless compute\n * - PostgreSQL function calls (RPC)\n *\n * @example\n * ```typescript\n * import { createClient } from '@fluxbase/sdk'\n *\n * const client = createClient({\n * url: 'http://localhost:8080',\n * auth: {\n * token: 'your-jwt-token',\n * autoRefresh: true\n * }\n * })\n *\n * // Query database\n * const { data } = await client.from('users').select('*').execute()\n *\n * // Invoke edge function\n * const { data, error } = await client.functions.invoke('hello-world', {\n * body: { name: 'Alice' }\n * })\n *\n * // Subscribe to realtime changes\n * client.realtime.subscribe('users', (payload) => {\n * console.log('Change:', payload)\n * })\n * ```\n *\n * @category Client\n */\n\nimport { FluxbaseFetch } from \"./fetch\";\nimport { FluxbaseAuth } from \"./auth\";\nimport { FluxbaseRealtime } from \"./realtime\";\nimport { FluxbaseStorage } from \"./storage\";\nimport { FluxbaseFunctions } from \"./functions\";\nimport { FluxbaseJobs } from \"./jobs\";\nimport { FluxbaseAdmin } from \"./admin\";\nimport { FluxbaseManagement } from \"./management\";\nimport { SettingsClient } from \"./settings\";\nimport { QueryBuilder } from \"./query-builder\";\nimport { SchemaQueryBuilder } from \"./schema-query-builder\";\nimport type { FluxbaseClientOptions } from \"./types\";\n\n/**\n * Main Fluxbase client class\n * @category Client\n */\nexport class FluxbaseClient<\n Database = any,\n _SchemaName extends string & keyof Database = any,\n> {\n /** Internal HTTP client for making requests */\n private fetch: FluxbaseFetch;\n\n /** Authentication module for user management */\n public auth: FluxbaseAuth;\n\n /** Realtime module for WebSocket subscriptions */\n public realtime: FluxbaseRealtime;\n\n /** Storage module for file operations */\n public storage: FluxbaseStorage;\n\n /** Functions module for invoking and managing edge functions */\n public functions: FluxbaseFunctions;\n\n /** Jobs module for submitting and monitoring background jobs */\n public jobs: FluxbaseJobs;\n\n /** Admin module for instance management (requires admin authentication) */\n public admin: FluxbaseAdmin;\n\n /** Management module for API keys, webhooks, and invitations */\n public management: FluxbaseManagement;\n\n /** Settings module for reading public application settings (respects RLS policies) */\n public settings: SettingsClient;\n\n /**\n * Create a new Fluxbase client instance\n *\n * @param fluxbaseUrl - The URL of your Fluxbase instance\n * @param fluxbaseKey - The anon key (JWT token with \"anon\" role). Generate using scripts/generate-keys.sh\n * @param options - Additional client configuration options\n *\n * @example\n * ```typescript\n * const client = new FluxbaseClient(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...', // Anon JWT token\n * { timeout: 30000 }\n * )\n * ```\n */\n constructor(\n protected fluxbaseUrl: string,\n protected fluxbaseKey: string,\n options?: FluxbaseClientOptions,\n ) {\n // Prepare headers with anon key\n const headers = {\n apikey: fluxbaseKey,\n Authorization: `Bearer ${fluxbaseKey}`,\n ...options?.headers,\n };\n\n // Initialize HTTP client\n this.fetch = new FluxbaseFetch(fluxbaseUrl, {\n headers,\n timeout: options?.timeout,\n debug: options?.debug,\n });\n\n // Store anon key for auth restoration (when user signs out, restore anon key auth)\n this.fetch.setAnonKey(fluxbaseKey);\n\n // Initialize auth module\n this.auth = new FluxbaseAuth(\n this.fetch,\n options?.auth?.autoRefresh ?? true,\n options?.auth?.persist ?? true,\n );\n\n // Set auth token if provided\n if (options?.auth?.token) {\n this.fetch.setAuthToken(options.auth.token);\n }\n\n // Initialize realtime module\n this.realtime = new FluxbaseRealtime(\n fluxbaseUrl,\n options?.auth?.token || null,\n );\n\n // Initialize storage module\n this.storage = new FluxbaseStorage(this.fetch);\n\n // Initialize functions module\n this.functions = new FluxbaseFunctions(this.fetch);\n\n // Initialize jobs module\n this.jobs = new FluxbaseJobs(this.fetch);\n\n // Initialize admin module\n this.admin = new FluxbaseAdmin(this.fetch);\n\n // Initialize management module\n this.management = new FluxbaseManagement(this.fetch);\n\n // Initialize settings module (public read-only access with RLS)\n this.settings = new SettingsClient(this.fetch);\n\n // Subscribe to auth changes to update realtime token\n this.setupAuthSync();\n }\n\n /**\n * Create a query builder for a database table\n *\n * @param table - The table name (can include schema, e.g., 'public.users')\n * @returns A query builder instance for constructing and executing queries\n *\n * @example\n * ```typescript\n * // Simple select\n * const { data } = await client.from('users').select('*').execute()\n *\n * // With filters\n * const { data } = await client.from('products')\n * .select('id, name, price')\n * .gt('price', 100)\n * .eq('category', 'electronics')\n * .execute()\n *\n * // Insert\n * await client.from('users').insert({ name: 'John', email: 'john@example.com' }).execute()\n * ```\n *\n * @category Database\n */\n from<T = any>(table: string): QueryBuilder<T> {\n return new QueryBuilder<T>(this.fetch, table);\n }\n\n /**\n * Access a specific database schema\n *\n * Use this to query tables in non-public schemas.\n *\n * @param schemaName - The schema name (e.g., 'jobs', 'analytics')\n * @returns A schema query builder for constructing queries on that schema\n *\n * @example\n * ```typescript\n * // Query the jobs.execution_logs table\n * const { data } = await client\n * .schema('jobs')\n * .from('execution_logs')\n * .select('*')\n * .eq('job_id', jobId)\n * .execute()\n *\n * // Insert into a custom schema table\n * await client\n * .schema('analytics')\n * .from('events')\n * .insert({ event_type: 'click', data: {} })\n * .execute()\n * ```\n *\n * @category Database\n */\n schema(schemaName: string): SchemaQueryBuilder {\n return new SchemaQueryBuilder(this.fetch, schemaName);\n }\n\n /**\n * Call a PostgreSQL function (Remote Procedure Call)\n *\n * @param functionName - The name of the PostgreSQL function to call\n * @param params - Optional parameters to pass to the function\n * @returns Promise containing the function result or error\n *\n * @example\n * ```typescript\n * // Call a function without parameters\n * const { data, error } = await client.rpc('get_total_users')\n *\n * // Call a function with parameters\n * const { data, error } = await client.rpc('calculate_discount', {\n * product_id: 123,\n * coupon_code: 'SAVE20'\n * })\n * ```\n *\n * @category Database\n */\n async rpc<T = any>(\n functionName: string,\n params?: Record<string, unknown>,\n ): Promise<{ data: T | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<T>(\n `/api/v1/rpc/${functionName}`,\n params || {},\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Sync auth state with realtime connections\n * @internal\n */\n private setupAuthSync() {\n // When auth token changes, update realtime\n const originalSetAuthToken = this.fetch.setAuthToken.bind(this.fetch);\n this.fetch.setAuthToken = (token: string | null) => {\n originalSetAuthToken(token);\n this.realtime.setAuth(token);\n };\n\n // Set up token refresh callback for realtime connections\n // This is called when WebSocket connections detect an expired token\n this.realtime.setTokenRefreshCallback(async () => {\n const result = await this.auth.refreshSession();\n if (result.error || !result.data?.session) {\n console.error(\"[Fluxbase] Failed to refresh token for realtime:\", result.error);\n return null;\n }\n return result.data.session.access_token;\n });\n }\n\n /**\n * Get the current authentication token\n *\n * @returns The current JWT access token, or null if not authenticated\n *\n * @category Authentication\n */\n getAuthToken(): string | null {\n return this.auth.getAccessToken();\n }\n\n /**\n * Set a new authentication token\n *\n * This updates both the HTTP client and realtime connection with the new token.\n *\n * @param token - The JWT access token to set, or null to clear authentication\n *\n * @category Authentication\n */\n setAuthToken(token: string | null) {\n this.fetch.setAuthToken(token);\n this.realtime.setAuth(token);\n }\n\n /**\n * Create or get a realtime channel (Supabase-compatible)\n *\n * @param name - Channel name\n * @param config - Optional channel configuration\n * @returns RealtimeChannel instance\n *\n * @example\n * ```typescript\n * const channel = client.channel('room-1', {\n * broadcast: { self: true },\n * presence: { key: 'user-123' }\n * })\n * .on('broadcast', { event: 'message' }, (payload) => {\n * console.log('Message:', payload)\n * })\n * .subscribe()\n * ```\n *\n * @category Realtime\n */\n channel(name: string, config?: import(\"./types\").RealtimeChannelConfig) {\n return this.realtime.channel(name, config);\n }\n\n /**\n * Remove a realtime channel (Supabase-compatible)\n *\n * @param channel - The channel to remove\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * const channel = client.channel('room-1')\n * await client.removeChannel(channel)\n * ```\n *\n * @category Realtime\n */\n removeChannel(channel: import(\"./realtime\").RealtimeChannel) {\n return this.realtime.removeChannel(channel);\n }\n\n /**\n * Get the internal HTTP client\n *\n * Use this for advanced scenarios like making custom API calls or admin operations.\n *\n * @returns The internal FluxbaseFetch instance\n *\n * @example\n * ```typescript\n * // Make a custom API call\n * const data = await client.http.get('/api/custom-endpoint')\n * ```\n *\n * @category Advanced\n */\n get http(): FluxbaseFetch {\n return this.fetch;\n }\n}\n\n// Deno type declaration for env access\ndeclare const Deno:\n | {\n env: {\n get(name: string): string | undefined;\n };\n }\n | undefined;\n\n/**\n * Get environment variable (works in Node.js, Deno, and browser with globalThis)\n * @internal\n */\nfunction getEnvVar(name: string): string | undefined {\n // Node.js\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[name];\n }\n // Deno\n if (typeof Deno !== \"undefined\" && Deno?.env) {\n return Deno.env.get(name);\n }\n return undefined;\n}\n\n/**\n * Create a new Fluxbase client instance (Supabase-compatible)\n *\n * This function signature is identical to Supabase's createClient, making migration seamless.\n *\n * When called without arguments (or with undefined values), the function will attempt to\n * read from environment variables:\n * - `FLUXBASE_URL` - The URL of your Fluxbase instance\n * - `FLUXBASE_ANON_KEY` or `FLUXBASE_JOB_TOKEN` or `FLUXBASE_SERVICE_TOKEN` - The API key/token\n *\n * This is useful in:\n * - Server-side environments where env vars are set\n * - Fluxbase job functions where tokens are automatically provided\n * - Edge functions with configured environment\n *\n * @param fluxbaseUrl - The URL of your Fluxbase instance (optional if FLUXBASE_URL env var is set)\n * @param fluxbaseKey - The anon key or JWT token (optional if env var is set)\n * @param options - Optional client configuration\n * @returns A configured Fluxbase client instance with full TypeScript support\n *\n * @example\n * ```typescript\n * import { createClient } from '@fluxbase/sdk'\n *\n * // Initialize with anon key (identical to Supabase)\n * const client = createClient(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' // Anon JWT token\n * )\n *\n * // With additional options\n * const client = createClient(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',\n * { timeout: 30000, debug: true }\n * )\n *\n * // In a Fluxbase job function (reads from env vars automatically)\n * const client = createClient()\n *\n * // With TypeScript database types\n * const client = createClient<Database>(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'\n * )\n * ```\n *\n * @category Client\n */\nexport function createClient<\n Database = any,\n SchemaName extends string & keyof Database = any,\n>(\n fluxbaseUrl?: string,\n fluxbaseKey?: string,\n options?: FluxbaseClientOptions,\n): FluxbaseClient<Database, SchemaName> {\n // Resolve URL from argument or environment variable\n const url =\n fluxbaseUrl ||\n getEnvVar(\"FLUXBASE_URL\") ||\n getEnvVar(\"NEXT_PUBLIC_FLUXBASE_URL\") ||\n getEnvVar(\"VITE_FLUXBASE_URL\");\n\n // Resolve key from argument or environment variables (try multiple common names)\n const key =\n fluxbaseKey ||\n getEnvVar(\"FLUXBASE_ANON_KEY\") ||\n getEnvVar(\"FLUXBASE_SERVICE_TOKEN\") ||\n getEnvVar(\"FLUXBASE_JOB_TOKEN\") ||\n getEnvVar(\"NEXT_PUBLIC_FLUXBASE_ANON_KEY\") ||\n getEnvVar(\"VITE_FLUXBASE_ANON_KEY\");\n\n if (!url) {\n throw new Error(\n \"Fluxbase URL is required. Pass it as the first argument or set FLUXBASE_URL environment variable.\",\n );\n }\n\n if (!key) {\n throw new Error(\n \"Fluxbase key is required. Pass it as the second argument or set FLUXBASE_ANON_KEY environment variable.\",\n );\n }\n\n return new FluxbaseClient<Database, SchemaName>(url, key, options);\n}\n"]}
|