postbasejs 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ssr/index.ts","../../src/client.ts"],"sourcesContent":["/**\n * postbasejs/ssr\n *\n * SSR-compatible Postbase clients for server environments (Next.js App Router,\n * SvelteKit, Nuxt, etc.) that need to read/write cookies to forward the user's\n * session to the Postbase API so that RLS applies to the authenticated user —\n * not just the anonymous key role.\n *\n * Usage (Next.js App Router):\n *\n * // middleware.ts\n * import { createServerClient } from 'postbasejs/ssr'\n * import { NextResponse } from 'next/server'\n *\n * export async function middleware(req) {\n * const res = NextResponse.next()\n * const postbase = createServerClient(url, anonKey, {\n * cookies: {\n * getAll: () => req.cookies.getAll(),\n * setAll: (cookies) => cookies.forEach(c => res.cookies.set(c.name, c.value, c.options)),\n * }\n * })\n * await postbase.auth.getSession() // refreshes session if needed\n * return res\n * }\n *\n * // Server Component\n * import { cookies } from 'next/headers'\n * const postbase = createServerClient(url, anonKey, {\n * cookies: {\n * getAll: () => cookieStore.getAll(),\n * setAll: () => {}, // read-only in server components\n * }\n * })\n * const { data } = await postbase.from('posts').select('*')\n */\n\nimport { createClient } from \"../client\";\nimport type { PostbaseClient, PostbaseClientOptions, CookieAdapter } from \"../types\";\n\nexport type { PostbaseClient, PostbaseClientOptions, CookieAdapter };\nexport type { AuthUser, Session, AuthResponse, QueryResult, SingleResult } from \"../types\";\n\nexport interface ServerClientOptions extends Omit<PostbaseClientOptions, \"cookies\"> {\n cookies: CookieAdapter;\n}\n\n/**\n * Create a Postbase client for use in server-side environments.\n * Requires a cookie adapter so session cookies can be read and refreshed.\n *\n * The user's session JWT is forwarded with every query, so RLS policies\n * evaluate against the authenticated user rather than the anon role.\n */\nexport function createServerClient(\n url: string,\n key: string,\n options: ServerClientOptions\n): PostbaseClient {\n return createClient(url, key, { ...options, cookies: options.cookies });\n}\n\n/**\n * Create a Postbase client for use in the browser.\n * Handles session persistence in localStorage and automatic token refresh.\n *\n * Use this in Client Components or plain browser JS.\n */\nexport function createBrowserClient(\n url: string,\n key: string,\n options?: Omit<PostbaseClientOptions, \"cookies\">\n): PostbaseClient {\n return createClient(url, key, {\n ...options,\n auth: {\n persistSession: true,\n autoRefreshToken: true,\n detectSessionInUrl: true,\n ...options?.auth,\n },\n });\n}\n\n// Re-export main createClient for convenience\nexport { createClient } from \"../client\";\n","import type {\n PostbaseClient,\n PostbaseClientOptions,\n QueryBuilder,\n QueryResult,\n SingleResult,\n AuthClient,\n AuthAdminClient,\n AuthResponse,\n AuthUser,\n Session,\n AuthChangeEvent,\n StorageClient,\n StorageBucketClient,\n StorageObject,\n Bucket,\n RpcOptions,\n RealtimeChannel,\n RealtimePayload,\n RealtimeEvent,\n Filter,\n FilterOperator,\n SelectOptions,\n InsertBuilder,\n UpdateBuilder,\n DeleteBuilder,\n CookieAdapter,\n} from \"./types\";\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nconst SESSION_STORAGE_KEY = \"postbase_session\";\n\nfunction getStorageKey(options?: PostbaseClientOptions): string {\n return options?.auth?.storageKey ?? SESSION_STORAGE_KEY;\n}\n\nfunction isBrowser(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\n// ─── Query Builder ────────────────────────────────────────────────────────────\n\ninterface QueryState<T> {\n baseUrl: string;\n apiKey: string;\n table: string;\n columns: string;\n selectOptions: SelectOptions;\n filters: Filter[];\n orFilters: string[];\n notFilters: Array<{ column: string; operator: string; value: unknown }>;\n orderBy: Array<{ column: string; ascending?: boolean; nullsFirst?: boolean }>;\n _limit?: number;\n _offset?: number;\n _range?: { from: number; to: number };\n operation: \"select\" | \"insert\" | \"update\" | \"delete\" | \"upsert\";\n insertData?: Partial<T> | Partial<T>[];\n upsertOnConflict?: string;\n updateData?: Partial<T>;\n returning?: string;\n customHeaders?: Record<string, string>;\n cookieAdapter?: CookieAdapter;\n}\n\nasync function executeQuery<T>(state: QueryState<T>): Promise<QueryResult<T>> {\n try {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${state.apiKey}`,\n ...state.customHeaders,\n };\n\n // Forward session cookie as bearer token if using SSR cookie adapter\n if (state.cookieAdapter) {\n const cookies = await state.cookieAdapter.getAll();\n const sessionCookie = cookies.find((c) => c.name.startsWith(\"postbase-session\") || c.name === \"next-auth.session-token\" || c.name === \"__Secure-next-auth.session-token\");\n if (sessionCookie) {\n headers[\"X-Postbase-Session\"] = sessionCookie.value;\n }\n }\n\n const body: Record<string, unknown> = {\n operation: state.operation === \"upsert\" ? \"upsert\" : state.operation,\n table: state.table,\n };\n\n if (state.operation === \"select\") {\n if (state.columns && state.columns !== \"*\") {\n body.columns = state.columns.split(\",\").map((c) => c.trim());\n }\n body.count = state.selectOptions.count;\n body.head = state.selectOptions.head;\n }\n\n if ([\"select\", \"update\", \"delete\"].includes(state.operation)) {\n const filters: Filter[] = [...state.filters];\n if (filters.length) body.filters = filters;\n if (state.orFilters.length) body.orFilters = state.orFilters;\n if (state.notFilters.length) body.notFilters = state.notFilters;\n }\n\n if (state.operation === \"insert\" || state.operation === \"upsert\") {\n body.data = state.insertData;\n if (state.upsertOnConflict) body.onConflict = state.upsertOnConflict;\n }\n\n if (state.operation === \"update\") {\n body.data = state.updateData;\n }\n\n if (state.orderBy.length) body.order = state.orderBy;\n if (state._limit !== undefined) body.limit = state._limit;\n if (state._offset !== undefined) body.offset = state._offset;\n if (state._range) body.range = state._range;\n if (state.returning) body.returning = state.returning;\n\n const res = await fetch(`${state.baseUrl}/api/db/query`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n\n const json = await res.json();\n if (!res.ok) return { data: null, count: null, error: json.error ?? \"Query failed\" };\n return { data: json.data, count: json.count ?? null, error: null };\n } catch (err) {\n return { data: null, count: null, error: String(err) };\n }\n}\n\nclass QueryBuilderImpl<T> implements QueryBuilder<T> {\n private state: QueryState<T>;\n\n constructor(state: QueryState<T>) {\n this.state = state;\n }\n\n private clone(patch: Partial<QueryState<T>>): QueryBuilderImpl<T> {\n return new QueryBuilderImpl<T>({ ...this.state, ...patch });\n }\n\n select(columns = \"*\", options: SelectOptions = {}): QueryBuilderImpl<T> {\n return this.clone({ columns, selectOptions: options, operation: \"select\" });\n }\n\n private addFilter(column: string, operator: FilterOperator, value: unknown): QueryBuilderImpl<T> {\n return this.clone({ filters: [...this.state.filters, { column, operator, value }] });\n }\n\n eq(column: string, value: unknown) { return this.addFilter(column, \"eq\", value); }\n neq(column: string, value: unknown) { return this.addFilter(column, \"neq\", value); }\n gt(column: string, value: unknown) { return this.addFilter(column, \"gt\", value); }\n gte(column: string, value: unknown) { return this.addFilter(column, \"gte\", value); }\n lt(column: string, value: unknown) { return this.addFilter(column, \"lt\", value); }\n lte(column: string, value: unknown) { return this.addFilter(column, \"lte\", value); }\n like(column: string, pattern: string) { return this.addFilter(column, \"like\", pattern); }\n ilike(column: string, pattern: string) { return this.addFilter(column, \"ilike\", pattern); }\n in(column: string, values: unknown[]) { return this.addFilter(column, \"in\", values); }\n is(column: string, value: null | boolean) { return this.addFilter(column, \"is\", value); }\n contains(column: string, value: unknown) { return this.addFilter(column, \"contains\", value); }\n overlaps(column: string, value: unknown[]) { return this.addFilter(column, \"overlaps\", value); }\n textSearch(column: string, query: string, options?: { config?: string }) {\n return this.addFilter(column, \"textSearch\", { query, config: options?.config });\n }\n\n or(filters: string): QueryBuilderImpl<T> {\n return this.clone({ orFilters: [...this.state.orFilters, filters] });\n }\n\n not(column: string, operator: string, value: unknown): QueryBuilderImpl<T> {\n return this.clone({ notFilters: [...this.state.notFilters, { column, operator, value }] });\n }\n\n order(column: string, options?: { ascending?: boolean; nullsFirst?: boolean }): QueryBuilderImpl<T> {\n return this.clone({\n orderBy: [...this.state.orderBy, { column, ascending: options?.ascending, nullsFirst: options?.nullsFirst }],\n });\n }\n\n limit(count: number): QueryBuilderImpl<T> {\n return this.clone({ _limit: count });\n }\n\n offset(count: number): QueryBuilderImpl<T> {\n return this.clone({ _offset: count });\n }\n\n range(from: number, to: number): QueryBuilderImpl<T> {\n return this.clone({ _range: { from, to }, _limit: to - from + 1, _offset: from });\n }\n\n insert(data: Partial<T> | Partial<T>[], options?: { returning?: string }): InsertBuilderImpl<T> {\n return new InsertBuilderImpl<T>({\n ...this.state,\n operation: \"insert\",\n insertData: data,\n returning: options?.returning ?? \"*\",\n });\n }\n\n upsert(data: Partial<T> | Partial<T>[], options?: { onConflict?: string; returning?: string }): InsertBuilderImpl<T> {\n return new InsertBuilderImpl<T>({\n ...this.state,\n operation: \"upsert\",\n insertData: data,\n upsertOnConflict: options?.onConflict,\n returning: options?.returning ?? \"*\",\n });\n }\n\n update(data: Partial<T>): UpdateBuilderImpl<T> {\n return new UpdateBuilderImpl<T>({\n ...this.state,\n operation: \"update\",\n updateData: data,\n returning: \"*\",\n });\n }\n\n delete(): DeleteBuilderImpl<T> {\n return new DeleteBuilderImpl<T>({\n ...this.state,\n operation: \"delete\",\n returning: \"*\",\n });\n }\n\n async single(): Promise<SingleResult<T>> {\n const result = await executeQuery<T>(this.clone({ _limit: 1 }).state);\n if (result.error) return { data: null, error: result.error };\n const rows = result.data ?? [];\n if (rows.length === 0) return { data: null, error: \"No rows returned\" };\n if (rows.length > 1) return { data: null, error: \"Multiple rows returned\" };\n return { data: rows[0], error: null };\n }\n\n async maybeSingle(): Promise<SingleResult<T>> {\n const result = await executeQuery<T>(this.clone({ _limit: 1 }).state);\n if (result.error) return { data: null, error: result.error };\n const rows = result.data ?? [];\n return { data: rows[0] ?? null, error: null };\n }\n\n // Thenable — make the builder awaitable directly\n get then() {\n const promise = executeQuery<T>(this.state);\n return promise.then.bind(promise);\n }\n}\n\nclass InsertBuilderImpl<T> {\n private state: QueryState<T>;\n\n constructor(state: QueryState<T>) {\n this.state = state;\n }\n\n select(columns = \"*\"): InsertBuilderImpl<T> {\n return new InsertBuilderImpl<T>({ ...this.state, returning: columns });\n }\n\n async single(): Promise<SingleResult<T>> {\n const result = await executeQuery<T>(this.state);\n if (result.error) return { data: null, error: result.error };\n const rows = result.data ?? [];\n return { data: rows[0] ?? null, error: null };\n }\n\n get then() {\n const promise = executeQuery<T>(this.state);\n return promise.then.bind(promise);\n }\n}\n\nclass UpdateBuilderImpl<T> {\n private state: QueryState<T>;\n\n constructor(state: QueryState<T>) {\n this.state = state;\n }\n\n private addFilter(column: string, operator: FilterOperator, value: unknown): UpdateBuilderImpl<T> {\n return new UpdateBuilderImpl<T>({ ...this.state, filters: [...this.state.filters, { column, operator, value }] });\n }\n\n eq(column: string, value: unknown) { return this.addFilter(column, \"eq\", value); }\n neq(column: string, value: unknown) { return this.addFilter(column, \"neq\", value); }\n gt(column: string, value: unknown) { return this.addFilter(column, \"gt\", value); }\n gte(column: string, value: unknown) { return this.addFilter(column, \"gte\", value); }\n lt(column: string, value: unknown) { return this.addFilter(column, \"lt\", value); }\n lte(column: string, value: unknown) { return this.addFilter(column, \"lte\", value); }\n in(column: string, values: unknown[]) { return this.addFilter(column, \"in\", values); }\n\n select(columns = \"*\"): UpdateBuilderImpl<T> {\n return new UpdateBuilderImpl<T>({ ...this.state, returning: columns });\n }\n\n async single(): Promise<SingleResult<T>> {\n const result = await executeQuery<T>(this.state);\n if (result.error) return { data: null, error: result.error };\n const rows = result.data ?? [];\n return { data: rows[0] ?? null, error: null };\n }\n\n get then() {\n const promise = executeQuery<T>(this.state);\n return promise.then.bind(promise);\n }\n}\n\nclass DeleteBuilderImpl<T> {\n private state: QueryState<T>;\n\n constructor(state: QueryState<T>) {\n this.state = state;\n }\n\n private addFilter(column: string, operator: FilterOperator, value: unknown): DeleteBuilderImpl<T> {\n return new DeleteBuilderImpl<T>({ ...this.state, filters: [...this.state.filters, { column, operator, value }] });\n }\n\n eq(column: string, value: unknown) { return this.addFilter(column, \"eq\", value); }\n neq(column: string, value: unknown) { return this.addFilter(column, \"neq\", value); }\n gt(column: string, value: unknown) { return this.addFilter(column, \"gt\", value); }\n gte(column: string, value: unknown) { return this.addFilter(column, \"gte\", value); }\n lt(column: string, value: unknown) { return this.addFilter(column, \"lt\", value); }\n lte(column: string, value: unknown) { return this.addFilter(column, \"lte\", value); }\n in(column: string, values: unknown[]) { return this.addFilter(column, \"in\", values); }\n\n select(columns = \"*\"): DeleteBuilderImpl<T> {\n return new DeleteBuilderImpl<T>({ ...this.state, returning: columns });\n }\n\n async single(): Promise<SingleResult<T>> {\n const result = await executeQuery<T>(this.state);\n if (result.error) return { data: null, error: result.error };\n const rows = result.data ?? [];\n return { data: rows[0] ?? null, error: null };\n }\n\n get then() {\n const promise = executeQuery<T>(this.state);\n return promise.then.bind(promise);\n }\n}\n\n// ─── Auth Client ──────────────────────────────────────────────────────────────\n\nfunction createAuthAdmin(baseUrl: string, apiKey: string, customHeaders?: Record<string, string>): AuthAdminClient {\n const headers = () => ({\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n ...customHeaders,\n });\n\n return {\n async listUsers(options) {\n try {\n const url = new URL(`${baseUrl}/api/auth/v1/admin/users`);\n if (options?.page) url.searchParams.set(\"page\", String(options.page));\n if (options?.perPage) url.searchParams.set(\"perPage\", String(options.perPage));\n const res = await fetch(url.toString(), { headers: headers() });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Failed to list users\" };\n return { data: { users: json.users, total: json.total }, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async getUserById(id) {\n try {\n const res = await fetch(`${baseUrl}/api/auth/v1/admin/users/${id}`, { headers: headers() });\n const json = await res.json();\n if (!res.ok) return { data: { user: null }, error: json.error ?? \"User not found\" };\n return { data: { user: json.user }, error: null };\n } catch (err) {\n return { data: { user: null }, error: String(err) };\n }\n },\n\n async createUser(options) {\n try {\n const res = await fetch(`${baseUrl}/api/auth/v1/admin/users`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(options),\n });\n const json = await res.json();\n if (!res.ok) return { data: { user: null }, error: json.error ?? \"Failed to create user\" };\n return { data: { user: json.user }, error: null };\n } catch (err) {\n return { data: { user: null }, error: String(err) };\n }\n },\n\n async updateUserById(id, attributes) {\n try {\n const res = await fetch(`${baseUrl}/api/auth/v1/admin/users/${id}`, {\n method: \"PATCH\",\n headers: headers(),\n body: JSON.stringify(attributes),\n });\n const json = await res.json();\n if (!res.ok) return { data: { user: null }, error: json.error ?? \"Failed to update user\" };\n return { data: { user: json.user }, error: null };\n } catch (err) {\n return { data: { user: null }, error: String(err) };\n }\n },\n\n async deleteUser(id) {\n try {\n const res = await fetch(`${baseUrl}/api/auth/v1/admin/users/${id}`, {\n method: \"DELETE\",\n headers: headers(),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Failed to delete user\" };\n return { data: null, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n };\n}\n\nfunction createAuthClient(\n baseUrl: string,\n apiKey: string,\n options?: PostbaseClientOptions,\n cookieAdapter?: CookieAdapter\n): AuthClient {\n const storageKey = getStorageKey(options);\n const listeners: Array<(event: AuthChangeEvent, session: Session | null) => void> = [];\n let refreshTimer: ReturnType<typeof setTimeout> | null = null;\n let currentSession: Session | null = null;\n\n const customHeaders = options?.global?.headers;\n\n const headers = () => ({\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n ...customHeaders,\n });\n\n function persistSession(session: Session | null): void {\n if (!isBrowser()) return;\n if (options?.auth?.persistSession === false) return;\n if (session) {\n localStorage.setItem(storageKey, JSON.stringify(session));\n } else {\n localStorage.removeItem(storageKey);\n }\n }\n\n function loadPersistedSession(): Session | null {\n if (!isBrowser()) return null;\n if (options?.auth?.persistSession === false) return null;\n try {\n const raw = localStorage.getItem(storageKey);\n if (!raw) return null;\n const session = JSON.parse(raw) as Session;\n // Check expiry\n if (session.expiresAt && Date.now() / 1000 > session.expiresAt) return null;\n return session;\n } catch {\n return null;\n }\n }\n\n function scheduleRefresh(session: Session): void {\n if (!isBrowser()) return;\n if (options?.auth?.autoRefreshToken === false) return;\n if (refreshTimer) clearTimeout(refreshTimer);\n const expiresIn = session.expiresAt - Date.now() / 1000;\n const refreshIn = Math.max((expiresIn - 60) * 1000, 0); // 1 minute before expiry\n refreshTimer = setTimeout(async () => {\n if (session.refreshToken) {\n const result = await authClient.refreshSession(session.refreshToken);\n if (!result.error && result.data.session) {\n notifyListeners(\"TOKEN_REFRESHED\", result.data.session);\n }\n }\n }, refreshIn);\n }\n\n function notifyListeners(event: AuthChangeEvent, session: Session | null): void {\n currentSession = session;\n persistSession(session);\n if (session) scheduleRefresh(session);\n listeners.forEach((fn) => fn(event, session));\n }\n\n const authClient: AuthClient = {\n async signUp({ email, password, options: signUpOptions }) {\n try {\n const res = await fetch(`${baseUrl}/api/auth/v1/signup`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ email, password, data: signUpOptions?.data }),\n });\n const json = await res.json();\n if (!res.ok) return { data: { user: null, session: null }, error: json.error ?? \"Sign up failed\" };\n const session: Session | null = json.session ?? null;\n const user: AuthUser | null = json.user ?? null;\n if (session) notifyListeners(\"SIGNED_IN\", session);\n return { data: { user, session }, error: null };\n } catch (err) {\n return { data: { user: null, session: null }, error: String(err) };\n }\n },\n\n async signInWithPassword({ email, password }) {\n try {\n const res = await fetch(`${baseUrl}/api/auth/v1/token`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ email, password, grant_type: \"password\" }),\n });\n const json = await res.json();\n if (!res.ok) return { data: { user: null, session: null }, error: json.error ?? \"Sign in failed\" };\n const session: Session = json.session;\n const user: AuthUser = json.user;\n notifyListeners(\"SIGNED_IN\", session);\n return { data: { user, session }, error: null };\n } catch (err) {\n return { data: { user: null, session: null }, error: String(err) };\n }\n },\n\n async signInWithOtp({ email, options: otpOptions }) {\n try {\n const res = await fetch(`${baseUrl}/api/auth/v1/otp`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ email, redirectTo: otpOptions?.redirectTo }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"OTP send failed\" };\n return { data: null, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async signInWithOAuth({ provider, options: oauthOptions }) {\n if (!isBrowser()) return;\n const redirectTo = oauthOptions?.redirectTo ?? window.location.href;\n const url = new URL(`${baseUrl}/api/auth/${provider}`);\n url.searchParams.set(\"redirectTo\", redirectTo);\n if (oauthOptions?.scopes) url.searchParams.set(\"scopes\", oauthOptions.scopes);\n window.location.href = url.toString();\n },\n\n async signOut() {\n try {\n const session = currentSession ?? loadPersistedSession();\n await fetch(`${baseUrl}/api/auth/v1/logout`, {\n method: \"POST\",\n headers: {\n ...headers(),\n ...(session ? { \"X-Postbase-Token\": session.accessToken } : {}),\n },\n });\n if (refreshTimer) clearTimeout(refreshTimer);\n notifyListeners(\"SIGNED_OUT\", null);\n return { error: null };\n } catch (err) {\n return { error: String(err) };\n }\n },\n\n async getSession() {\n try {\n // SSR: read from cookie adapter\n if (cookieAdapter) {\n const cookies = await cookieAdapter.getAll();\n const sessionCookie = cookies.find((c) =>\n c.name.startsWith(\"postbase-session\") ||\n c.name === \"next-auth.session-token\" ||\n c.name === \"__Secure-next-auth.session-token\"\n );\n if (!sessionCookie) return { data: { session: null }, error: null };\n // Validate via server\n const res = await fetch(`${baseUrl}/api/auth/v1/session`, {\n headers: { ...headers(), \"X-Postbase-Session\": sessionCookie.value },\n });\n if (!res.ok) return { data: { session: null }, error: null };\n const json = await res.json();\n return { data: { session: json.session ?? null }, error: null };\n }\n\n // Browser: check localStorage\n if (isBrowser()) {\n const persisted = loadPersistedSession();\n if (persisted) {\n currentSession = persisted;\n return { data: { session: persisted }, error: null };\n }\n }\n\n // Fall back to server check\n const res = await fetch(`${baseUrl}/api/auth/v1/session`, { headers: headers() });\n if (!res.ok) return { data: { session: null }, error: null };\n const json = await res.json();\n return { data: { session: json.session ?? null }, error: null };\n } catch (err) {\n return { data: { session: null }, error: String(err) };\n }\n },\n\n async getUser(jwt?: string) {\n try {\n const token = jwt ?? currentSession?.accessToken ?? loadPersistedSession()?.accessToken;\n const res = await fetch(`${baseUrl}/api/auth/v1/user`, {\n headers: {\n ...headers(),\n ...(token ? { \"X-Postbase-Token\": token } : {}),\n },\n });\n const json = await res.json();\n if (!res.ok) return { data: { user: null }, error: json.error ?? \"Failed to get user\" };\n return { data: { user: json.user }, error: null };\n } catch (err) {\n return { data: { user: null }, error: String(err) };\n }\n },\n\n async refreshSession(refreshToken?: string) {\n try {\n const token = refreshToken ?? currentSession?.refreshToken ?? loadPersistedSession()?.refreshToken;\n const res = await fetch(`${baseUrl}/api/auth/v1/token`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ refresh_token: token, grant_type: \"refresh_token\" }),\n });\n const json = await res.json();\n if (!res.ok) return { data: { user: null, session: null }, error: json.error ?? \"Refresh failed\" };\n const session: Session = json.session;\n const user: AuthUser = json.user;\n notifyListeners(\"TOKEN_REFRESHED\", session);\n return { data: { user, session }, error: null };\n } catch (err) {\n return { data: { user: null, session: null }, error: String(err) };\n }\n },\n\n onAuthStateChange(callback) {\n listeners.push(callback);\n\n // Emit current session immediately\n const session = currentSession ?? loadPersistedSession();\n if (session) {\n setTimeout(() => callback(\"SIGNED_IN\", session), 0);\n currentSession = session;\n scheduleRefresh(session);\n }\n\n return {\n data: {\n subscription: {\n unsubscribe() {\n const idx = listeners.indexOf(callback);\n if (idx > -1) listeners.splice(idx, 1);\n },\n },\n },\n };\n },\n\n admin: createAuthAdmin(baseUrl, apiKey, customHeaders),\n };\n\n return authClient;\n}\n\n// ─── Storage Client ───────────────────────────────────────────────────────────\n\nfunction createStorageClient(\n baseUrl: string,\n apiKey: string,\n options?: PostbaseClientOptions\n): StorageClient {\n const customHeaders = options?.global?.headers;\n const headers = () => ({ Authorization: `Bearer ${apiKey}`, ...customHeaders });\n\n function bucketClient(bucket: string): StorageBucketClient {\n return {\n async upload(path, file, uploadOptions) {\n try {\n const form = new FormData();\n form.append(\"file\", file as Blob);\n form.append(\"path\", path);\n if (uploadOptions?.upsert) form.append(\"upsert\", \"true\");\n if (uploadOptions?.cacheControl) form.append(\"cacheControl\", uploadOptions.cacheControl);\n const res = await fetch(`${baseUrl}/api/storage/v1/object/${bucket}/${encodeURIComponent(path)}`, {\n method: uploadOptions?.upsert ? \"PUT\" : \"POST\",\n headers: headers(),\n body: form,\n });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Upload failed\" };\n return { data: { path, fullPath: `${bucket}/${path}` }, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async download(path) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/object/${bucket}/${encodeURIComponent(path)}`, {\n headers: headers(),\n });\n if (!res.ok) return { data: null, error: \"Download failed\" };\n return { data: await res.blob(), error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async remove(paths) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/object/${bucket}`, {\n method: \"DELETE\",\n headers: { ...headers(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ prefixes: paths }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, count: null, error: json.error ?? \"Delete failed\" };\n return { data: json.data, count: json.data?.length ?? null, error: null };\n } catch (err) {\n return { data: null, count: null, error: String(err) };\n }\n },\n\n async list(prefix, listOptions) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/object/list/${bucket}`, {\n method: \"POST\",\n headers: { ...headers(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n prefix: prefix ?? \"\",\n limit: listOptions?.limit ?? 100,\n offset: listOptions?.offset ?? 0,\n sortBy: listOptions?.sortBy,\n }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, count: null, error: json.error ?? \"List failed\" };\n return { data: json.data, count: json.data?.length ?? null, error: null };\n } catch (err) {\n return { data: null, count: null, error: String(err) };\n }\n },\n\n getPublicUrl(path) {\n return {\n data: { publicUrl: `${baseUrl}/api/storage/v1/object/public/${bucket}/${encodeURIComponent(path)}` },\n };\n },\n\n async createSignedUrl(path, expiresIn) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/object/sign/${bucket}/${encodeURIComponent(path)}`, {\n method: \"POST\",\n headers: { ...headers(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ expiresIn }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Sign failed\" };\n return { data: { signedUrl: `${baseUrl}${json.signedUrl}` }, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async move(fromPath, toPath) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/object/move`, {\n method: \"POST\",\n headers: { ...headers(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ bucketId: bucket, sourceKey: fromPath, destinationKey: toPath }),\n });\n const json = await res.json();\n if (!res.ok) return { error: json.error ?? \"Move failed\" };\n return { error: null };\n } catch (err) {\n return { error: String(err) };\n }\n },\n\n async copy(fromPath, toPath) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/object/copy`, {\n method: \"POST\",\n headers: { ...headers(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ bucketId: bucket, sourceKey: fromPath, destinationKey: toPath }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Copy failed\" };\n return { data: { path: toPath }, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n };\n }\n\n return {\n from: bucketClient,\n\n async createBucket(name, bucketOptions) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/bucket`, {\n method: \"POST\",\n headers: { ...headers(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n name,\n id: name,\n public: bucketOptions?.public ?? false,\n file_size_limit: bucketOptions?.fileSizeLimit,\n allowed_mime_types: bucketOptions?.allowedMimeTypes,\n }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Create bucket failed\" };\n return { data: json.data, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async getBucket(id) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/bucket/${id}`, { headers: headers() });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Get bucket failed\" };\n return { data: json.data, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async listBuckets() {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/bucket`, { headers: headers() });\n const json = await res.json();\n if (!res.ok) return { data: null, count: null, error: json.error ?? \"List buckets failed\" };\n return { data: json.data, count: json.data?.length ?? null, error: null };\n } catch (err) {\n return { data: null, count: null, error: String(err) };\n }\n },\n\n async updateBucket(id, bucketOptions) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/bucket/${id}`, {\n method: \"PUT\",\n headers: { ...headers(), \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n public: bucketOptions.public,\n file_size_limit: bucketOptions.fileSizeLimit,\n allowed_mime_types: bucketOptions.allowedMimeTypes,\n }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, error: json.error ?? \"Update bucket failed\" };\n return { data: json.data, error: null };\n } catch (err) {\n return { data: null, error: String(err) };\n }\n },\n\n async deleteBucket(id) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/bucket/${id}`, {\n method: \"DELETE\",\n headers: headers(),\n });\n const json = await res.json();\n if (!res.ok) return { error: json.error ?? \"Delete bucket failed\" };\n return { error: null };\n } catch (err) {\n return { error: String(err) };\n }\n },\n\n async emptyBucket(id) {\n try {\n const res = await fetch(`${baseUrl}/api/storage/v1/bucket/${id}/empty`, {\n method: \"POST\",\n headers: headers(),\n });\n const json = await res.json();\n if (!res.ok) return { error: json.error ?? \"Empty bucket failed\" };\n return { error: null };\n } catch (err) {\n return { error: String(err) };\n }\n },\n };\n}\n\n// ─── Realtime ─────────────────────────────────────────────────────────────────\n\nclass RealtimeChannelImpl implements RealtimeChannel {\n private handlers: Array<{ event: RealtimeEvent; callback: (payload: RealtimePayload) => void }> = [];\n private ws: WebSocket | null = null;\n private statusCallback?: (status: \"SUBSCRIBED\" | \"CLOSED\" | \"CHANNEL_ERROR\") => void;\n\n constructor(\n private baseUrl: string,\n private apiKey: string,\n private channelName: string\n ) {}\n\n on<T = Record<string, unknown>>(\n event: RealtimeEvent,\n callback: (payload: RealtimePayload<T>) => void\n ): RealtimeChannel {\n this.handlers.push({ event, callback: callback as (p: RealtimePayload) => void });\n return this;\n }\n\n subscribe(callback?: (status: \"SUBSCRIBED\" | \"CLOSED\" | \"CHANNEL_ERROR\") => void): RealtimeChannel {\n if (typeof window === \"undefined\") return this;\n this.statusCallback = callback;\n\n const wsUrl = this.baseUrl.replace(/^http/, \"ws\");\n try {\n this.ws = new WebSocket(`${wsUrl}/api/realtime?channel=${encodeURIComponent(this.channelName)}&apikey=${this.apiKey}`);\n\n this.ws.onopen = () => {\n this.statusCallback?.(\"SUBSCRIBED\");\n };\n\n this.ws.onmessage = (event) => {\n try {\n const payload = JSON.parse(event.data) as RealtimePayload;\n this.handlers.forEach(({ event: eventType, callback }) => {\n if (eventType === \"*\" || eventType === payload.eventType) {\n callback(payload);\n }\n });\n } catch {\n // ignore malformed messages\n }\n };\n\n this.ws.onerror = () => {\n this.statusCallback?.(\"CHANNEL_ERROR\");\n };\n\n this.ws.onclose = () => {\n this.statusCallback?.(\"CLOSED\");\n };\n } catch {\n this.statusCallback?.(\"CHANNEL_ERROR\");\n }\n\n return this;\n }\n\n unsubscribe(): void {\n this.ws?.close();\n this.ws = null;\n }\n}\n\n// ─── Main factory ─────────────────────────────────────────────────────────────\n\nconst channels = new Set<RealtimeChannelImpl>();\n\nexport function createClient(\n url: string,\n key: string,\n options?: PostbaseClientOptions\n): PostbaseClient {\n const baseUrl = url.replace(/\\/$/, \"\");\n const cookieAdapter = options?.cookies;\n\n const makeQueryState = <T>(table: string): QueryState<T> => ({\n baseUrl,\n apiKey: key,\n table,\n columns: \"*\",\n selectOptions: {},\n filters: [],\n orFilters: [],\n notFilters: [],\n orderBy: [],\n operation: \"select\",\n customHeaders: options?.global?.headers,\n cookieAdapter,\n });\n\n return {\n url: baseUrl,\n key,\n auth: createAuthClient(baseUrl, key, options, cookieAdapter),\n storage: createStorageClient(baseUrl, key, options),\n\n from<T = Record<string, unknown>>(table: string): QueryBuilder<T> {\n return new QueryBuilderImpl<T>(makeQueryState<T>(table)) as unknown as QueryBuilder<T>;\n },\n\n async rpc<T = Record<string, unknown>>(\n fn: string,\n args?: Record<string, unknown>,\n rpcOptions?: RpcOptions\n ): Promise<QueryResult<T>> {\n try {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${key}`,\n ...options?.global?.headers,\n };\n if (cookieAdapter) {\n const cookies = await cookieAdapter.getAll();\n const sessionCookie = cookies.find((c) =>\n c.name.startsWith(\"postbase-session\") ||\n c.name === \"next-auth.session-token\" ||\n c.name === \"__Secure-next-auth.session-token\"\n );\n if (sessionCookie) headers[\"X-Postbase-Session\"] = sessionCookie.value;\n }\n const res = await fetch(`${baseUrl}/api/rpc/${fn}`, {\n method: rpcOptions?.head ? \"HEAD\" : \"POST\",\n headers,\n body: JSON.stringify({ args: args ?? {}, count: rpcOptions?.count }),\n });\n const json = await res.json();\n if (!res.ok) return { data: null, count: null, error: json.error ?? \"RPC failed\" };\n return { data: json.data, count: json.count ?? null, error: null };\n } catch (err) {\n return { data: null, count: null, error: String(err) };\n }\n },\n\n channel(name: string): RealtimeChannel {\n const ch = new RealtimeChannelImpl(baseUrl, key, name);\n channels.add(ch);\n return ch;\n },\n\n removeChannel(channel: RealtimeChannel): void {\n channel.unsubscribe();\n channels.delete(channel as RealtimeChannelImpl);\n },\n\n removeAllChannels(): void {\n channels.forEach((ch) => ch.unsubscribe());\n channels.clear();\n },\n };\n}\n"],"mappings":"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","names":["res","json","callback"]}