@ichibase/client 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/core.ts","../src/postgrest.ts","../src/mongo.ts","../src/functions.ts","../src/auth.ts","../src/realtime.ts","../src/storage-adapter.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// @ichibase/core — shared types + helpers for the SDK family.\n//\n// Service packages (@ichibase/postgrest, @ichibase/mongo, etc.) import\n// from here. Customers typically don't import core directly — they go\n// through a service package or the meta @ichibase/edge.\n\n// ───────────────────────────────────────────────────────────────────\n// Public types\n// ───────────────────────────────────────────────────────────────────\n\n/**\n * Configuration shared by every service package. All fields are\n * optional — when running inside an ichibase Edge Function, sane\n * defaults are read from env (ICHIBASE_PROJECT_URL +\n * ICHIBASE_SERVICE_KEY / ICHIBASE_ANON_KEY).\n */\nexport interface IchibaseConfig {\n /** Base URL like `https://abc.ichibase.net`. Defaults to ICHIBASE_PROJECT_URL. */\n url?: string;\n /** API key: ich_pub_<jwt> (anon) or ich_admin_<jwt> (service). Defaults to ICHIBASE_SERVICE_KEY then ICHIBASE_ANON_KEY. */\n key?: string;\n /** Optional fetch override (testing). Defaults to globalThis.fetch. */\n fetch?: typeof fetch;\n}\n\n/** Resolved config — same shape but every field is concrete. */\nexport interface ResolvedConfig {\n url: string;\n key: string;\n fetchFn: typeof fetch;\n}\n\nexport interface IchibaseError {\n code: string;\n detail?: string;\n /** HTTP status. */\n status: number;\n}\n\nexport type Result<T> = { data: T; error: null } | { data: null; error: IchibaseError };\n\n// ───────────────────────────────────────────────────────────────────\n// Env reader — handles Deno + Node + Bun\n// ───────────────────────────────────────────────────────────────────\n\nexport function envGet(name: string): string | undefined {\n // Deno\n const dEnv = (globalThis as { Deno?: { env?: { get(k: string): string | undefined } } }).Deno;\n if (dEnv?.env?.get) return dEnv.env.get(name);\n // Node / Bun\n const nodeEnv = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process?.env;\n if (nodeEnv) return nodeEnv[name];\n return undefined;\n}\n\n// ───────────────────────────────────────────────────────────────────\n// URL + body helpers\n// ───────────────────────────────────────────────────────────────────\n\nexport function urlJoin(base: string, path: string): string {\n return base.replace(/\\/$/, '') + (path.startsWith('/') ? path : '/' + path);\n}\n\nexport async function parseBody(res: Response): Promise<unknown> {\n const text = await res.text();\n if (!text) return null;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nexport async function asResult<T>(res: Response): Promise<Result<T>> {\n if (res.ok) {\n return { data: (await parseBody(res)) as T, error: null };\n }\n const body = (await parseBody(res)) as { code?: string; detail?: string; message?: string } | null;\n return {\n data: null,\n error: {\n code: body?.code ?? `http_${res.status}`,\n detail: body?.detail ?? body?.message ?? `HTTP ${res.status}`,\n status: res.status,\n },\n };\n}\n\n// ───────────────────────────────────────────────────────────────────\n// Config resolution\n// ───────────────────────────────────────────────────────────────────\n\n/**\n * Resolve a service-package config:\n * 1. Use whatever the caller passed\n * 2. Fall back to env (works inside Edge Functions automatically)\n *\n * Throws if neither produces a usable url + key — fast failure beats\n * a confusing fetch error 10 stack frames in.\n */\nexport function resolveConfig(opts: IchibaseConfig = {}): ResolvedConfig {\n const url = opts.url ?? envGet('ICHIBASE_PROJECT_URL');\n const key = opts.key ?? envGet('ICHIBASE_SERVICE_KEY') ?? envGet('ICHIBASE_ANON_KEY');\n if (!url) {\n throw new Error('ichibase: missing url (pass opts.url or set ICHIBASE_PROJECT_URL)');\n }\n if (!key) {\n throw new Error('ichibase: missing key (pass opts.key or set ICHIBASE_SERVICE_KEY / ICHIBASE_ANON_KEY)');\n }\n return {\n url,\n key,\n fetchFn: opts.fetch ?? globalThis.fetch.bind(globalThis),\n };\n}\n\n// ───────────────────────────────────────────────────────────────────\n// Generic fetch wrapper — every service package's call layer ends\n// here. Returns a Result<T>, never throws on HTTP errors.\n// ───────────────────────────────────────────────────────────────────\n\nexport interface HttpCallOptions {\n method?: string;\n /** Bearer to use; defaults to caller-side default. */\n bearer?: string;\n /** JSON body — set Content-Type automatically. */\n body?: unknown;\n /** Extra headers (do NOT pass Authorization here — use `bearer`). */\n headers?: Record<string, string>;\n}\n\nexport async function httpCall<T>(\n fetchFn: typeof fetch,\n url: string,\n opts: HttpCallOptions = {},\n): Promise<Result<T>> {\n const headers: Record<string, string> = { ...opts.headers };\n if (opts.bearer) headers['Authorization'] = `Bearer ${opts.bearer}`;\n if (opts.body !== undefined) headers['Content-Type'] = 'application/json';\n const res = await fetchFn(url, {\n method: opts.method ?? (opts.body !== undefined ? 'POST' : 'GET'),\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n });\n return asResult<T>(res);\n}\n","// @ichibase/postgrest — full-coverage PostgREST builder for ichibase.\n//\n// Chainable PostgREST query builder. Awaiting any chain triggers the\n// HTTP request (PromiseLike). Shape modifiers (single, maybeSingle,\n// csv, count) change the type of the resolved value so customers\n// keep a real, statically-checked Result<T>.\n//\n// Auth uses Bearer with the SDK's key (or a per-user access token via\n// .asUser()).\n\nimport {\n type IchibaseConfig,\n type Result,\n asResult,\n parseBody,\n resolveConfig,\n urlJoin,\n} from './core.js';\n\n// ───────────────────────────────────────────────────────────────────\n// Internal state — shared by every method on a chain\n// ───────────────────────────────────────────────────────────────────\n\ntype Method = 'GET' | 'POST' | 'PATCH' | 'DELETE' | 'HEAD';\n\ninterface BuilderState {\n base: string;\n key: string;\n table: string;\n fetchFn: typeof fetch;\n /** Encoded \"col=op.val\" pieces. */\n filters: string[];\n body?: unknown;\n method?: Method;\n returnRepresentation?: boolean;\n /** PostgREST \"object+json\" Accept — enforce exactly-one. */\n acceptSingle?: boolean;\n /** Return first row of an array or null; no server-side enforcement. */\n acceptMaybeSingle?: boolean;\n /** Return CSV text instead of JSON. */\n acceptCsv?: boolean;\n /** Count mode for Prefer header. Also makes the result a {rows,count}. */\n countMode?: 'exact' | 'planned' | 'estimated';\n /** Upsert resolution. */\n upsertResolution?: 'merge-duplicates' | 'ignore-duplicates';\n /** Columns for on_conflict on upsert. */\n onConflict?: string;\n /** HTTP Range header values (server returns 206 + Content-Range). */\n rangeFrom?: number;\n rangeTo?: number;\n /** Non-public schema name (Accept-Profile / Content-Profile header). */\n schemaName?: string;\n /** Free-form headers the caller wants to override. */\n extraHeaders?: Record<string, string>;\n}\n\n// ───────────────────────────────────────────────────────────────────\n// QueryBuilder — generic over T (row type) and R (resolved value shape).\n// Shape modifiers re-type the builder so awaiting returns the right thing.\n// ───────────────────────────────────────────────────────────────────\n\n/** What `.count()` resolves to. */\nexport interface CountedResult<T> {\n rows: T[];\n count: number;\n}\n\n/** PostgREST filter operators usable with `not()` / `filter()` escape hatches. */\nexport type FilterOp =\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'like'\n | 'ilike'\n | 'match'\n | 'imatch'\n | 'in'\n | 'is'\n | 'isdistinct'\n | 'fts'\n | 'plfts'\n | 'phfts'\n | 'wfts'\n | 'cs'\n | 'cd'\n | 'ov'\n | 'sl'\n | 'sr'\n | 'nxr'\n | 'nxl'\n | 'adj';\n\nexport class QueryBuilder<T, R = T[]> implements PromiseLike<Result<R>> {\n // deno-lint-ignore no-explicit-any\n constructor(private state: BuilderState) {}\n\n // ── Eq family ─────────────────────────────────────────────────────\n\n eq(col: string, val: unknown): this {\n return this.appendFilter(col, 'eq', val);\n }\n neq(col: string, val: unknown): this {\n return this.appendFilter(col, 'neq', val);\n }\n gt(col: string, val: unknown): this {\n return this.appendFilter(col, 'gt', val);\n }\n gte(col: string, val: unknown): this {\n return this.appendFilter(col, 'gte', val);\n }\n lt(col: string, val: unknown): this {\n return this.appendFilter(col, 'lt', val);\n }\n lte(col: string, val: unknown): this {\n return this.appendFilter(col, 'lte', val);\n }\n\n // ── Pattern / text search ─────────────────────────────────────────\n\n like(col: string, pattern: string): this {\n return this.appendFilter(col, 'like', pattern);\n }\n ilike(col: string, pattern: string): this {\n return this.appendFilter(col, 'ilike', pattern);\n }\n /** Full-text search (PostgreSQL @@). `mode` picks the parser. */\n fts(col: string, query: string, opts: { config?: string; type?: 'plain' | 'phrase' | 'websearch' } = {}): this {\n const op = opts.type === 'phrase' ? 'phfts' : opts.type === 'websearch' ? 'wfts' : 'plfts';\n const cfg = opts.config ? `(${opts.config})` : '';\n this.state.filters.push(`${col}=${op}${cfg}.${encodeURIComponent(query)}`);\n return this;\n }\n\n // ── Membership / null / boolean ───────────────────────────────────\n\n in(col: string, values: unknown[]): this {\n this.state.filters.push(\n `${col}=in.(${values.map((v) => encodeURIComponent(String(v))).join(',')})`,\n );\n return this;\n }\n /** is.null, is.true, is.false, is.unknown */\n is(col: string, val: null | boolean | 'unknown'): this {\n const v = val === null ? 'null' : val === 'unknown' ? 'unknown' : String(val);\n this.state.filters.push(`${col}=is.${v}`);\n return this;\n }\n\n // ── Array / range operators ───────────────────────────────────────\n\n /** array/jsonb `@>` — col contains the given values. */\n contains(col: string, val: unknown): this {\n return this.appendFilter(col, 'cs', this.formatArrayOrJson(val));\n }\n /** `<@` — col is contained by the given values. */\n containedBy(col: string, val: unknown): this {\n return this.appendFilter(col, 'cd', this.formatArrayOrJson(val));\n }\n /** `&&` — arrays/ranges overlap. */\n overlaps(col: string, val: unknown): this {\n return this.appendFilter(col, 'ov', this.formatArrayOrJson(val));\n }\n /** Range strictly left of (`<<`). */\n rangeLt(col: string, val: string): this {\n return this.appendFilter(col, 'sl', val);\n }\n /** Range strictly right of (`>>`). */\n rangeGt(col: string, val: string): this {\n return this.appendFilter(col, 'sr', val);\n }\n /** Range does not extend to the right of (`&<`). */\n rangeLte(col: string, val: string): this {\n return this.appendFilter(col, 'nxr', val);\n }\n /** Range does not extend to the left of (`&>`). */\n rangeGte(col: string, val: string): this {\n return this.appendFilter(col, 'nxl', val);\n }\n /** Adjacent ranges (`-|-`). */\n rangeAdjacent(col: string, val: string): this {\n return this.appendFilter(col, 'adj', val);\n }\n\n // ── Logical / negation ────────────────────────────────────────────\n\n /** Negate a filter: `not(col, 'gt', 18)` → `col=not.gt.18`. */\n not(col: string, op: FilterOp, val: unknown): this {\n this.state.filters.push(`${col}=not.${op}.${encodeURIComponent(String(val))}`);\n return this;\n }\n /**\n * Logical OR. Pass a comma-separated filter string in PostgREST syntax:\n * .or('age.gt.18,status.eq.active')\n * .or('and(status.eq.paid,total.gt.100),user_id.eq.42')\n */\n or(filters: string): this {\n this.state.filters.push(`or=(${encodeURIComponent(filters)})`);\n return this;\n }\n /** Logical AND group (rarely needed — multiple chained filters are already ANDed). */\n and(filters: string): this {\n this.state.filters.push(`and=(${encodeURIComponent(filters)})`);\n return this;\n }\n /** Multiple eq() in one call: `.match({ status: 'paid', user_id: 42 })`. */\n match(query: Record<string, unknown>): this {\n for (const [k, v] of Object.entries(query)) this.eq(k, v);\n return this;\n }\n /** Escape hatch — any column/op/value combo PostgREST supports. */\n filter(col: string, op: FilterOp, val: unknown): this {\n return this.appendFilter(col, op, val);\n }\n\n // ── Ordering & paging ─────────────────────────────────────────────\n\n order(col: string, opts: { ascending?: boolean; nullsFirst?: boolean } = {}): this {\n const dir = opts.ascending === false ? 'desc' : 'asc';\n const nulls = opts.nullsFirst === true ? '.nullsfirst' : opts.nullsFirst === false ? '.nullslast' : '';\n this.state.filters.push(`order=${encodeURIComponent(col + '.' + dir + nulls)}`);\n return this;\n }\n limit(n: number): this {\n this.state.filters.push(`limit=${n}`);\n return this;\n }\n offset(n: number): this {\n this.state.filters.push(`offset=${n}`);\n return this;\n }\n /**\n * HTTP Range pagination — `from` and `to` are inclusive 0-based.\n * Server returns 206 + Content-Range: from-to/total.\n * Pairs naturally with `.count()`.\n */\n range(from: number, to: number): this {\n this.state.rangeFrom = from;\n this.state.rangeTo = to;\n return this;\n }\n\n // ── Column projection & embeds ────────────────────────────────────\n\n /**\n * Pick columns and embed related resources:\n * .select('id, total, customer:profiles(name, email)')\n * Defaults to '*'.\n */\n select(cols = '*'): this {\n this.state.method = this.state.method ?? 'GET';\n this.state.filters.push(`select=${encodeURIComponent(cols)}`);\n return this;\n }\n\n // ── Schema (for non-public) ───────────────────────────────────────\n\n /** Target a non-public schema for this call. */\n schema(name: string): this {\n this.state.schemaName = name;\n return this;\n }\n\n // ── Write ops ─────────────────────────────────────────────────────\n\n insert(rows: Record<string, unknown> | Record<string, unknown>[]): this {\n this.state.method = 'POST';\n this.state.body = Array.isArray(rows) ? rows : [rows];\n return this;\n }\n /**\n * INSERT ... ON CONFLICT ... DO UPDATE / DO NOTHING.\n * .upsert([row1, row2], { onConflict: 'email' })\n * .upsert(row, { onConflict: 'id', ignoreDuplicates: true })\n */\n upsert(\n rows: Record<string, unknown> | Record<string, unknown>[],\n opts: { onConflict?: string; ignoreDuplicates?: boolean } = {},\n ): this {\n this.state.method = 'POST';\n this.state.body = Array.isArray(rows) ? rows : [rows];\n this.state.upsertResolution = opts.ignoreDuplicates ? 'ignore-duplicates' : 'merge-duplicates';\n if (opts.onConflict) this.state.onConflict = opts.onConflict;\n return this;\n }\n update(values: Record<string, unknown>): this {\n this.state.method = 'PATCH';\n this.state.body = values;\n return this;\n }\n delete(): this {\n this.state.method = 'DELETE';\n return this;\n }\n /** Mark write op to return the affected row(s). */\n returning(): this {\n this.state.returnRepresentation = true;\n return this;\n }\n\n // ── Shape modifiers (re-type the resolved value) ──────────────────\n\n /**\n * Expect exactly one row — server returns 406 otherwise.\n * After this, the result data is T (not T[]).\n */\n single(): QueryBuilder<T, T> {\n this.state.acceptSingle = true;\n return this as unknown as QueryBuilder<T, T>;\n }\n /**\n * Expect zero or one row — never errors on shape.\n * After this, the result data is T | null.\n */\n maybeSingle(): QueryBuilder<T, T | null> {\n this.state.acceptMaybeSingle = true;\n this.state.filters.push('limit=1');\n return this as unknown as QueryBuilder<T, T | null>;\n }\n /** Return CSV text instead of JSON rows. */\n csv(): QueryBuilder<T, string> {\n this.state.acceptCsv = true;\n return this as unknown as QueryBuilder<T, string>;\n }\n /**\n * Include the total row count in the result. The resolved value\n * becomes `{ rows: T[]; count: number }` — count is the size of\n * the FULL result set ignoring limit/offset/range.\n * `mode='exact'` is accurate (slow on big tables);\n * `'planned'` uses the planner estimate;\n * `'estimated'` uses planner then exact-counts only if small.\n */\n count(mode: 'exact' | 'planned' | 'estimated' = 'exact'): QueryBuilder<T, CountedResult<T>> {\n this.state.countMode = mode;\n return this as unknown as QueryBuilder<T, CountedResult<T>>;\n }\n\n // ── Misc ──────────────────────────────────────────────────────────\n\n /** Add an arbitrary header to the request (e.g. `Prefer: missing=null`). */\n setHeader(name: string, value: string): this {\n this.state.extraHeaders = { ...(this.state.extraHeaders ?? {}), [name]: value };\n return this;\n }\n /** HEAD request — no body returned. Pair with `.count()` to fetch just a total. */\n head(): this {\n this.state.method = 'HEAD';\n return this;\n }\n\n // ── Thenable ──────────────────────────────────────────────────────\n\n then<TR1 = Result<R>, TR2 = never>(\n onFulfilled?: ((value: Result<R>) => TR1 | PromiseLike<TR1>) | null,\n onRejected?: ((reason: unknown) => TR2 | PromiseLike<TR2>) | null,\n ): PromiseLike<TR1 | TR2> {\n return this.execute().then(onFulfilled, onRejected);\n }\n\n // ── Internals ─────────────────────────────────────────────────────\n\n private appendFilter(col: string, op: string, val: unknown): this {\n this.state.filters.push(`${col}=${op}.${encodeURIComponent(String(val))}`);\n return this;\n }\n\n private formatArrayOrJson(val: unknown): string {\n if (Array.isArray(val)) return `{${val.map((v) => String(v)).join(',')}}`;\n if (typeof val === 'object' && val !== null) return JSON.stringify(val);\n return String(val);\n }\n\n private buildHeaders(): Record<string, string> {\n const h: Record<string, string> = { 'Authorization': `Bearer ${this.state.key}` };\n if (this.state.body !== undefined) h['Content-Type'] = 'application/json';\n\n if (this.state.acceptSingle) h['Accept'] = 'application/vnd.pgrst.object+json';\n else if (this.state.acceptCsv) h['Accept'] = 'text/csv';\n\n const prefer: string[] = [];\n if (this.state.returnRepresentation) prefer.push('return=representation');\n if (this.state.countMode) prefer.push(`count=${this.state.countMode}`);\n if (this.state.upsertResolution) prefer.push(`resolution=${this.state.upsertResolution}`);\n if (prefer.length) h['Prefer'] = prefer.join(',');\n\n if (this.state.rangeFrom !== undefined && this.state.rangeTo !== undefined) {\n h['Range'] = `${this.state.rangeFrom}-${this.state.rangeTo}`;\n h['Range-Unit'] = 'items';\n }\n\n if (this.state.schemaName) {\n const m = this.state.method ?? 'GET';\n if (m === 'GET' || m === 'HEAD') h['Accept-Profile'] = this.state.schemaName;\n else h['Content-Profile'] = this.state.schemaName;\n }\n\n if (this.state.extraHeaders) Object.assign(h, this.state.extraHeaders);\n return h;\n }\n\n private async execute(): Promise<Result<R>> {\n const method = this.state.method ?? 'GET';\n const filters = [...this.state.filters];\n if (this.state.onConflict) filters.push(`on_conflict=${encodeURIComponent(this.state.onConflict)}`);\n const qs = filters.length ? '?' + filters.join('&') : '';\n const url = urlJoin(this.state.base, `/postgres/${this.state.table}${qs}`);\n const headers = this.buildHeaders();\n const res = await this.state.fetchFn(url, {\n method,\n headers,\n body: this.state.body !== undefined ? JSON.stringify(this.state.body) : undefined,\n });\n\n // CSV: text payload.\n if (this.state.acceptCsv) {\n if (!res.ok) return (await asResult<unknown>(res)) as Result<R>;\n return { data: (await res.text()) as unknown as R, error: null };\n }\n\n // count: parse Content-Range \"0-99/12345\".\n if (this.state.countMode) {\n const contentRange = res.headers.get('Content-Range');\n const total = contentRange?.split('/')[1];\n const count = total && total !== '*' ? parseInt(total, 10) : 0;\n // HEAD: rows are empty, only the count matters.\n if (method === 'HEAD') {\n if (!res.ok) return (await asResult<unknown>(res)) as Result<R>;\n return { data: { rows: [], count } as unknown as R, error: null };\n }\n const inner = await asResult<T[]>(res);\n if (inner.error) return inner as unknown as Result<R>;\n return { data: { rows: inner.data, count } as unknown as R, error: null };\n }\n\n // maybeSingle: empty array → null, otherwise first element.\n if (this.state.acceptMaybeSingle) {\n if (!res.ok) return (await asResult<unknown>(res)) as Result<R>;\n const body = await parseBody(res);\n if (Array.isArray(body)) {\n return { data: ((body[0] as unknown) ?? null) as R, error: null };\n }\n return { data: (body ?? null) as R, error: null };\n }\n\n // single: PostgREST already returned the singleton — pass through.\n return await asResult<R>(res);\n }\n}\n\n// ───────────────────────────────────────────────────────────────────\n// Top-level client\n// ───────────────────────────────────────────────────────────────────\n\nexport class Postgrest {\n constructor(\n private readonly url: string,\n private readonly key: string,\n private readonly fetchFn: typeof fetch,\n ) {}\n\n /** Start a query against a table or view. */\n from<T = Record<string, unknown>>(table: string): QueryBuilder<T> {\n return new QueryBuilder<T>({\n base: this.url,\n key: this.key,\n table,\n fetchFn: this.fetchFn,\n filters: [],\n });\n }\n\n /**\n * Call a stored procedure (PostgREST RPC). Returns whatever the\n * function returns — set the generic to type it. Pass `count:'exact'`\n * if you want a total in the same envelope.\n */\n async rpc<T = unknown>(\n fnName: string,\n args: Record<string, unknown> = {},\n opts: { schema?: string; count?: 'exact' | 'planned' | 'estimated'; head?: boolean } = {},\n ): Promise<Result<T>> {\n const url = urlJoin(this.url, `/postgres/rpc/${fnName}`);\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this.key}`,\n 'Content-Type': 'application/json',\n };\n const prefer: string[] = [];\n if (opts.count) prefer.push(`count=${opts.count}`);\n if (prefer.length) headers['Prefer'] = prefer.join(',');\n if (opts.schema) headers['Content-Profile'] = opts.schema;\n const res = await this.fetchFn(url, {\n method: opts.head ? 'HEAD' : 'POST',\n headers,\n body: opts.head ? undefined : JSON.stringify(args),\n });\n return await asResult<T>(res);\n }\n\n /** Return a new Postgrest authenticated as a specific end-user (RLS applies). */\n asUser(accessToken: string): Postgrest {\n return new Postgrest(this.url, accessToken, this.fetchFn);\n }\n}\n\nexport function createPostgrest(opts: IchibaseConfig = {}): Postgrest {\n const cfg = resolveConfig(opts);\n return new Postgrest(cfg.url, cfg.key, cfg.fetchFn);\n}\n","// @ichibase/mongo — Mongo gateway client.\n//\n// Talks to the project's mongo-svc over HTTP. No native MongoDB\n// driver is bundled — perfect for Edge Function cold-start budgets.\n\nimport {\n type IchibaseConfig,\n type Result,\n asResult,\n envGet,\n resolveConfig,\n urlJoin,\n} from './core.js';\n\n/** Per-collection client. */\nexport class MongoCollection {\n constructor(\n private base: string,\n private key: string,\n private collection: string,\n private fetchFn: typeof fetch,\n private userToken?: string,\n ) {}\n\n private async op<T>(\n op: string,\n body: Record<string, unknown>,\n query?: Record<string, string>,\n ): Promise<Result<T>> {\n let url = urlJoin(this.base, `/mongo/v1/${op}/${this.collection}`);\n if (query) {\n const qs = new URLSearchParams(query).toString();\n if (qs) url += (url.includes('?') ? '&' : '?') + qs;\n }\n // mongo-gate wants the project key in the `apikey` header (the\n // publishable/secret key carries the anon/service_role). `Authorization:\n // Bearer` is reserved for the OPTIONAL end-user JWT, set via asUser().\n const headers: Record<string, string> = {\n 'apikey': this.key,\n 'Content-Type': 'application/json',\n };\n if (this.userToken) headers['Authorization'] = `Bearer ${this.userToken}`;\n const res = await this.fetchFn(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n });\n return asResult<T>(res);\n }\n\n // Build the realtime query suffix for a write. `realtime: false` tells the\n // gateway to skip the realtime emit for THIS write (honoured only for\n // service_role / admin keys server-side). undefined/true emits as normal.\n private rt(realtime?: boolean): Record<string, string> | undefined {\n return realtime === false ? { realtime: 'false' } : undefined;\n }\n\n find(\n filter: Record<string, unknown> = {},\n opts: {\n projection?: Record<string, 0 | 1>;\n sort?: Record<string, 1 | -1>;\n limit?: number;\n skip?: number;\n } = {},\n ): Promise<Result<Record<string, unknown>[]>> {\n return this.op<Record<string, unknown>[]>('find', { filter, ...opts });\n }\n\n findOne(filter: Record<string, unknown> = {}): Promise<Result<Record<string, unknown> | null>> {\n return this.op<Record<string, unknown> | null>('findOne', { filter });\n }\n\n insertOne(\n doc: Record<string, unknown>,\n opts: { realtime?: boolean } = {},\n ): Promise<Result<{ insertedId: string }>> {\n return this.op<{ insertedId: string }>('insertOne', { doc }, this.rt(opts.realtime));\n }\n\n insertMany(\n docs: Record<string, unknown>[],\n opts: { realtime?: boolean } = {},\n ): Promise<Result<{ insertedIds: string[] }>> {\n return this.op<{ insertedIds: string[] }>('insertMany', { docs }, this.rt(opts.realtime));\n }\n\n updateOne(\n filter: Record<string, unknown>,\n update: Record<string, unknown>,\n opts: { upsert?: boolean; realtime?: boolean } = {},\n ): Promise<Result<{ matched: number; modified: number; upsertedId?: string }>> {\n const { realtime, ...rest } = opts;\n return this.op<{ matched: number; modified: number; upsertedId?: string }>(\n 'updateOne',\n { filter, update, ...rest },\n this.rt(realtime),\n );\n }\n\n updateMany(\n filter: Record<string, unknown>,\n update: Record<string, unknown>,\n opts: { realtime?: boolean } = {},\n ): Promise<Result<{ matched: number; modified: number }>> {\n return this.op<{ matched: number; modified: number }>(\n 'updateMany',\n { filter, update },\n this.rt(opts.realtime),\n );\n }\n\n deleteOne(\n filter: Record<string, unknown>,\n opts: { realtime?: boolean } = {},\n ): Promise<Result<{ deleted: number }>> {\n return this.op<{ deleted: number }>('deleteOne', { filter }, this.rt(opts.realtime));\n }\n\n deleteMany(\n filter: Record<string, unknown>,\n opts: { realtime?: boolean } = {},\n ): Promise<Result<{ deleted: number }>> {\n return this.op<{ deleted: number }>('deleteMany', { filter }, this.rt(opts.realtime));\n }\n\n count(filter: Record<string, unknown> = {}): Promise<Result<{ count: number }>> {\n return this.op<{ count: number }>('count', { filter });\n }\n\n aggregate(pipeline: Record<string, unknown>[]): Promise<Result<Record<string, unknown>[]>> {\n return this.op<Record<string, unknown>[]>('aggregate', { pipeline });\n }\n\n // ── Phase 2 (v0.3.x) operations ────────────────────────────────\n\n /**\n * Atomic find-and-update. Returns the matched document (post-update\n * by default; pass `returnDocument: 'before'` for the pre-update\n * snapshot). Honours upsert; on upsert with no match the returned\n * doc is null.\n *\n * await users.findOneAndUpdate(\n * { _id: 1 },\n * { $inc: { visits: 1 } },\n * { returnDocument: 'after' },\n * );\n */\n findOneAndUpdate(\n filter: Record<string, unknown>,\n update: Record<string, unknown>,\n opts: {\n projection?: Record<string, 0 | 1>;\n sort?: Record<string, 1 | -1>;\n upsert?: boolean;\n /** Default 'after'. Picks which snapshot of the doc to return. */\n returnDocument?: 'before' | 'after';\n realtime?: boolean;\n } = {},\n ): Promise<Result<{ doc: Record<string, unknown> | null }>> {\n return this.op<{ doc: Record<string, unknown> | null }>('findOneAndUpdate', {\n filter,\n update,\n ...(opts.projection ? { projection: opts.projection } : {}),\n ...(opts.sort ? { sort: opts.sort } : {}),\n ...(opts.upsert !== undefined ? { upsert: opts.upsert } : {}),\n ...(opts.returnDocument ? { return_document: opts.returnDocument } : {}),\n }, this.rt(opts.realtime));\n }\n\n /** Atomic find-and-delete. Returns the deleted document or null. */\n findOneAndDelete(\n filter: Record<string, unknown>,\n opts: {\n projection?: Record<string, 0 | 1>;\n sort?: Record<string, 1 | -1>;\n realtime?: boolean;\n } = {},\n ): Promise<Result<{ doc: Record<string, unknown> | null }>> {\n return this.op<{ doc: Record<string, unknown> | null }>('findOneAndDelete', {\n filter,\n ...(opts.projection ? { projection: opts.projection } : {}),\n ...(opts.sort ? { sort: opts.sort } : {}),\n }, this.rt(opts.realtime));\n }\n\n /**\n * Replace a single matched document with a full replacement.\n * Unlike updateOne, the body is the new document — no $set / $inc.\n * Keys starting with `$` are rejected.\n */\n replaceOne(\n filter: Record<string, unknown>,\n replacement: Record<string, unknown>,\n opts: { upsert?: boolean; realtime?: boolean } = {},\n ): Promise<Result<{ matched: number; modified: number; upserted: number; upserted_id?: unknown }>> {\n return this.op<{ matched: number; modified: number; upserted: number; upserted_id?: unknown }>(\n 'replaceOne',\n { filter, replacement, ...(opts.upsert !== undefined ? { upsert: opts.upsert } : {}) },\n this.rt(opts.realtime),\n );\n }\n\n /**\n * Batched write — multiple ops in one HTTP round trip. Each op is\n * one of insertOne / updateOne / updateMany / replaceOne /\n * deleteOne / deleteMany. The whole batch shares one policy check.\n *\n * await users.bulkWrite([\n * { op: 'insertOne', doc: { name: 'a' } },\n * { op: 'updateOne', filter: { _id: 1 }, update: { $set: { name: 'b' } } },\n * { op: 'deleteOne', filter: { _id: 2 } },\n * ]);\n *\n * Set `ordered: true` to stop on first error; default is unordered\n * (continue past errors). Subject to your plan's mongo_max_docs cap.\n */\n bulkWrite(\n ops: BulkWriteOp[],\n opts: { ordered?: boolean; realtime?: boolean } = {},\n ): Promise<Result<{\n inserted: number;\n matched: number;\n modified: number;\n deleted: number;\n upserted: number;\n upserted_ids: Record<string, unknown>;\n }>> {\n return this.op<{\n inserted: number;\n matched: number;\n modified: number;\n deleted: number;\n upserted: number;\n upserted_ids: Record<string, unknown>;\n }>('bulkWrite', {\n ops,\n ...(opts.ordered !== undefined ? { ordered: opts.ordered } : {}),\n }, this.rt(opts.realtime));\n }\n\n /**\n * Distinct values of a field across docs matching filter.\n *\n * await events.distinct('category', { tenant_id: 'acme' });\n * // → { data: { values: ['ui', 'api', 'cron'], truncated: false } }\n */\n distinct(\n field: string,\n filter: Record<string, unknown> = {},\n ): Promise<Result<{ values: unknown[]; truncated: boolean }>> {\n return this.op<{ values: unknown[]; truncated: boolean }>('distinct', { field, filter });\n }\n}\n\n// ───────────────────────────────────────────────────────────────────\n// bulkWrite op shapes — exported so callers get static typing on the\n// operation discriminator field.\n// ───────────────────────────────────────────────────────────────────\n\nexport type BulkWriteOp =\n | { op: 'insertOne'; doc: Record<string, unknown> }\n | { op: 'updateOne'; filter: Record<string, unknown>; update: Record<string, unknown>; upsert?: boolean }\n | { op: 'updateMany'; filter: Record<string, unknown>; update: Record<string, unknown>; upsert?: boolean }\n | { op: 'replaceOne'; filter: Record<string, unknown>; replacement: Record<string, unknown>; upsert?: boolean }\n | { op: 'deleteOne'; filter: Record<string, unknown> }\n | { op: 'deleteMany'; filter: Record<string, unknown> };\n\n/** Top-level mongo client. Use `.collection(name)`. */\nexport class Mongo {\n constructor(\n private readonly base: string,\n private readonly key: string,\n private readonly fetchFn: typeof fetch,\n private readonly userToken?: string,\n ) {}\n\n /**\n * Return a Mongo client that acts AS the signed-in end user: their JWT is\n * sent as `Authorization: Bearer`, so your `_mongo_policy` and realtime rules\n * see the real `$auth.uid` / role. The project key still gates anon vs\n * service_role. Pass the access token you got from ichibase auth.\n */\n asUser(token: string): Mongo {\n return new Mongo(this.base, this.key, this.fetchFn, token);\n }\n\n collection(name: string): MongoCollection {\n return new MongoCollection(this.base, this.key, name, this.fetchFn, this.userToken);\n }\n}\n\n/**\n * Factory. Honours `ICHIBASE_MONGO_URL` if set (internal gateway in\n * Edge Functions), else uses the project base URL.\n */\nexport function createMongo(opts: IchibaseConfig = {}): Mongo {\n const cfg = resolveConfig(opts);\n const base = envGet('ICHIBASE_MONGO_URL') ?? cfg.url;\n return new Mongo(base, cfg.key, cfg.fetchFn);\n}\n","// @ichibase/client — Edge Functions invoke helper. Saves you writing a raw\n// fetch to /functions/<name>: it sets the apikey, attaches the signed-in user's\n// token, JSON-encodes the body, and returns a typed Result.\n\nimport { type Result, asResult, urlJoin } from './core.js';\n\nexport interface InvokeOptions {\n /** HTTP method. Defaults to POST. */\n method?: string;\n /**\n * Request body. A string / Blob / FormData / ArrayBuffer / typed array is\n * sent as-is; anything else is JSON-encoded (with Content-Type json).\n */\n body?: unknown;\n /** Extra headers (don't set Authorization here — sign in instead). */\n headers?: Record<string, string>;\n /** Extra path appended after the function name, e.g. '/items/42'. */\n path?: string;\n}\n\nexport class Functions {\n constructor(\n private base: string,\n private key: string, // project (anon) key — sent as the `apikey` header\n private fetchFn: typeof fetch,\n private userToken?: string, // end-user access token (Authorization: Bearer)\n ) {}\n\n /** Return a Functions client that calls AS a specific end user. */\n asUser(accessToken: string): Functions {\n return new Functions(this.base, this.key, this.fetchFn, accessToken);\n }\n\n /**\n * Invoke an Edge Function by name.\n *\n * const { data, error } = await ichi.functions.invoke('hello', { body: { name: 'world' } });\n */\n async invoke<T = unknown>(name: string, opts: InvokeOptions = {}): Promise<Result<T>> {\n const url = urlJoin(this.base, `/functions/${name}${opts.path ?? ''}`);\n const headers: Record<string, string> = { apikey: this.key, ...opts.headers };\n if (this.userToken) headers['Authorization'] = `Bearer ${this.userToken}`;\n\n let body: BodyInit | undefined;\n const b = opts.body;\n if (b !== undefined) {\n const isRaw =\n typeof b === 'string' ||\n b instanceof ArrayBuffer ||\n ArrayBuffer.isView(b) ||\n (typeof Blob !== 'undefined' && b instanceof Blob) ||\n (typeof FormData !== 'undefined' && b instanceof FormData);\n if (isRaw) {\n body = b as BodyInit;\n } else {\n body = JSON.stringify(b);\n if (!('Content-Type' in headers)) headers['Content-Type'] = 'application/json';\n }\n }\n\n const res = await this.fetchFn(url, {\n method: opts.method ?? 'POST',\n headers,\n body,\n });\n return asResult<T>(res);\n }\n}\n","// @ichibase/auth — auth client for ichibase projects.\n//\n// Wraps /auth/* endpoints on the project's auth-svc. Token storage\n// is the caller's job — this SDK is stateless.\n\nimport {\n type IchibaseConfig,\n type Result,\n asResult,\n resolveConfig,\n urlJoin,\n} from './core.js';\n\n// ── Response types — exported so callers can write typed handlers ─\n\nexport interface SignupResult {\n user_id: string;\n email: string;\n needs_verification: boolean;\n}\n\nexport interface LoginResult {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n user: { id: string; email: string };\n}\n\nexport interface RefreshResult {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n}\n\nexport interface UserProfile {\n id: string;\n email: string;\n verified_at: string | null;\n}\n\n/** Auth client. */\nexport class Auth {\n constructor(\n private base: string,\n private key: string,\n private fetchFn: typeof fetch,\n ) {}\n\n private call<T>(\n path: string,\n opts: { method?: string; body?: unknown; auth?: string } = {},\n ): Promise<Result<T>> {\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${opts.auth ?? this.key}`,\n };\n if (opts.body !== undefined) headers['Content-Type'] = 'application/json';\n return this.fetchFn(urlJoin(this.base, `/auth${path}`), {\n method: opts.method ?? 'POST',\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n }).then((res) => asResult<T>(res));\n }\n\n signup(input: { email: string; password: string }): Promise<Result<SignupResult>> {\n return this.call<SignupResult>('/signup', { body: input });\n }\n\n login(input: { email: string; password: string }): Promise<Result<LoginResult>> {\n return this.call<LoginResult>('/login', { body: input });\n }\n\n refresh(refresh_token: string): Promise<Result<RefreshResult>> {\n return this.call<RefreshResult>('/refresh', { body: { refresh_token } });\n }\n\n /** Get the user identified by the given access token (or the SDK's key if none given). */\n getUser(accessToken?: string): Promise<Result<UserProfile>> {\n return this.call<UserProfile>('/me', { method: 'GET', auth: accessToken });\n }\n\n logout(refresh_token: string, accessToken: string): Promise<Result<unknown>> {\n return this.call<unknown>('/logout', { body: { refresh_token }, auth: accessToken });\n }\n\n logoutAll(accessToken: string): Promise<Result<unknown>> {\n return this.call<unknown>('/logout-all', { auth: accessToken });\n }\n\n requestPasswordReset(email: string): Promise<Result<{ sent: boolean }>> {\n return this.call<{ sent: boolean }>('/password-reset/request', { body: { email } });\n }\n\n confirmPasswordReset(token: string, new_password: string): Promise<Result<{ reset: boolean }>> {\n return this.call<{ reset: boolean }>('/password-reset/confirm', {\n body: { token, new_password },\n });\n }\n\n verifyEmail(token: string): Promise<Result<{ verified: boolean }>> {\n return this.call<{ verified: boolean }>('/verify-email', { body: { token } });\n }\n\n verifyEmailOtp(email: string, code: string): Promise<Result<{ verified: boolean }>> {\n return this.call<{ verified: boolean }>('/verify-email/otp', { body: { email, code } });\n }\n\n resendVerification(email: string): Promise<Result<{ sent: boolean }>> {\n return this.call<{ sent: boolean }>('/verify-email/resend', { body: { email } });\n }\n\n // ── Phase 2 (v0.3.x) — bearer-authed profile + session mgmt ──────\n\n /**\n * Update the user's metadata JSONB. **Full replacement** — to merge,\n * read `getUser()` first and pass the merged object.\n *\n * await auth.updateUser(accessToken, { metadata: { theme: 'dark', tz: 'UTC' } });\n *\n * Server enforces an 8 KB cap on the encoded metadata.\n */\n updateUser(\n accessToken: string,\n patch: { metadata: Record<string, unknown> },\n ): Promise<Result<UpdatedUser>> {\n return this.call<UpdatedUser>('/me', {\n method: 'PATCH',\n body: { metadata: patch.metadata },\n auth: accessToken,\n });\n }\n\n /**\n * Change the user's password. Requires the current password — does\n * NOT use a reset token (that's `confirmPasswordReset`). On success,\n * existing access tokens KEEP working (short TTL); call `refresh()`\n * after to mint a new pair if you want a fresh access token.\n *\n * Returns `{ changed: true, hint: '...' }`.\n */\n changePassword(\n accessToken: string,\n currentPassword: string,\n newPassword: string,\n ): Promise<Result<{ changed: boolean; hint: string }>> {\n return this.call<{ changed: boolean; hint: string }>('/change-password', {\n body: { current_password: currentPassword, new_password: newPassword },\n auth: accessToken,\n });\n }\n\n /**\n * List the user's active refresh-token sessions (one row per\n * device / login). Returns up to 100, ordered by most-recently-used.\n * Each row includes the user-agent + IP captured at login so the\n * user can identify devices.\n */\n listSessions(accessToken: string): Promise<Result<{ sessions: SessionInfo[] }>> {\n return this.call<{ sessions: SessionInfo[] }>('/sessions', {\n method: 'GET',\n auth: accessToken,\n });\n }\n\n /**\n * Revoke a single session by its id. Idempotent — revoking a\n * session that's already revoked returns `{ revoked: true }`.\n * The session must belong to the bearer user (404 otherwise).\n */\n revokeSession(\n accessToken: string,\n sessionId: string,\n ): Promise<Result<{ revoked: boolean }>> {\n return this.call<{ revoked: boolean }>(`/sessions/${encodeURIComponent(sessionId)}/revoke`, {\n auth: accessToken,\n });\n }\n}\n\n// ── Phase 2 response types ─────────────────────────────────────────\n\nexport interface UpdatedUser {\n id: string;\n email: string;\n email_verified: boolean;\n created_at: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface SessionInfo {\n id: string;\n user_agent: string | null;\n ip: string | null;\n issued_at: string;\n last_used_at: string;\n expires_at: string;\n}\n\nexport function createAuth(opts: IchibaseConfig = {}): Auth {\n const cfg = resolveConfig(opts);\n return new Auth(cfg.url, cfg.key, cfg.fetchFn);\n}\n","// Realtime client — one WebSocket per IchibaseClient, multiplexing many\n// subscriptions. Speaks the ichibase realtime wire protocol (one JSON object\n// per text frame). Works anywhere `WebSocket` is global (browser, React\n// Native, Deno, Node 22+, Bun).\n//\n// Wire protocol (client → server): subscribe | unsubscribe | broadcast |\n// presence | token | ping. (server → client): subscribed | change | broadcast\n// | presence_state | presence_diff | error | pong | closing | token_refreshed.\n\nexport type ChangeEvent = 'INSERT' | 'UPDATE' | 'DELETE';\nexport type MongoChangeEvent = 'insert' | 'update' | 'delete';\n\n/** A row/document change frame delivered to a postgres/mongo subscriber. */\nexport interface ChangeMessage {\n type: 'change';\n event: ChangeEvent | MongoChangeEvent;\n table?: string;\n collection?: string;\n /** The new row/document (absent on DELETE for some engines). */\n record?: Record<string, unknown>;\n /** The previous row, when the engine captures it (UPDATE/DELETE). */\n old?: Record<string, unknown>;\n}\n\n/** A broadcast message on a channel. */\nexport interface BroadcastMessage {\n type: 'broadcast';\n channel: string;\n event?: string;\n payload: unknown;\n /** user id of the sender (empty for anonymous). */\n from?: string;\n}\n\n/** Presence snapshot / diff. */\nexport interface PresenceMessage {\n type: 'presence_state' | 'presence_diff';\n channel?: string;\n presences?: Record<string, { uid: string; state?: unknown }>;\n joins?: Record<string, { uid: string; state?: unknown }>;\n leaves?: Record<string, { uid: string; state?: unknown }>;\n}\n\nexport type RealtimeMessage = ChangeMessage | BroadcastMessage | PresenceMessage;\n\nexport interface PostgresSubscribeOptions {\n kind: 'postgres';\n /** `public.orders` or just `orders` (defaults to the public schema). */\n table: string;\n events?: ChangeEvent[];\n /** Optional client-side narrowing (rule grammar). */\n filter?: unknown;\n}\nexport interface MongoSubscribeOptions {\n kind: 'mongo';\n collection: string;\n events?: MongoChangeEvent[];\n filter?: unknown;\n}\nexport interface BroadcastSubscribeOptions {\n kind: 'broadcast';\n channel: string;\n /** Also track presence on this channel. */\n presence?: boolean;\n /** Initial presence state to publish on join. */\n state?: Record<string, unknown>;\n}\nexport type SubscribeOptions =\n | PostgresSubscribeOptions\n | MongoSubscribeOptions\n | BroadcastSubscribeOptions;\n\n/** Handle to one live subscription. */\nexport interface Subscription {\n /** Stop this subscription. */\n unsubscribe(): void;\n /** Publish to the channel (broadcast subscriptions only). */\n send(event: string, payload: unknown): void;\n /** Update this connection's presence state (broadcast + presence only). */\n track(state: Record<string, unknown>): void;\n}\n\ninterface InternalSub {\n ref: string;\n opts: SubscribeOptions;\n handler: (msg: RealtimeMessage) => void;\n}\n\nexport interface RealtimeOptions {\n /** Base project URL, e.g. https://abc.ichibase.net. */\n url: string;\n /** Returns the current bearer (user access token, or the anon key). */\n getToken: () => string | undefined;\n /** Override the WebSocket constructor (testing / non-global envs). */\n WebSocketImpl?: typeof WebSocket;\n}\n\nconst HEARTBEAT_MS = 25_000;\nconst RECONNECT_BASE_MS = 1_000;\nconst RECONNECT_MAX_MS = 15_000;\n\nexport class RealtimeClient {\n private url: string;\n private getToken: () => string | undefined;\n private WS: typeof WebSocket;\n private ws: WebSocket | null = null;\n private subs = new Map<string, InternalSub>();\n private refSeq = 0;\n private connecting = false;\n private closedByUser = false;\n private reconnectAttempts = 0;\n private heartbeat: ReturnType<typeof setInterval> | null = null;\n private outbox: string[] = [];\n\n constructor(opts: RealtimeOptions) {\n this.url = opts.url.replace(/\\/$/, '');\n this.getToken = opts.getToken;\n const impl = opts.WebSocketImpl ?? (globalThis as { WebSocket?: typeof WebSocket }).WebSocket;\n if (!impl) {\n throw new Error('ichibase realtime: no global WebSocket — pass opts.WebSocketImpl');\n }\n this.WS = impl;\n }\n\n /** Subscribe to postgres/mongo changes or a broadcast channel. */\n subscribe(opts: SubscribeOptions, handler: (msg: RealtimeMessage) => void): Subscription {\n const ref = `s${++this.refSeq}`;\n this.subs.set(ref, { ref, opts, handler });\n this.ensureConnected();\n if (this.isOpen()) this.sendSubscribe(ref);\n\n return {\n unsubscribe: () => {\n this.subs.delete(ref);\n if (this.isOpen()) this.send({ type: 'unsubscribe', ref });\n if (this.subs.size === 0) this.disconnect();\n },\n send: (event, payload) => {\n if (opts.kind !== 'broadcast') throw new Error('send() is broadcast-only');\n this.send({ type: 'broadcast', channel: opts.channel, event, payload });\n },\n track: (state) => {\n if (opts.kind !== 'broadcast') throw new Error('track() is broadcast-only');\n this.send({ type: 'presence', channel: opts.channel, state });\n },\n };\n }\n\n /** Close the socket and drop all subscriptions. */\n disconnect(): void {\n this.closedByUser = true;\n this.stopHeartbeat();\n this.ws?.close();\n this.ws = null;\n }\n\n // ── internals ──────────────────────────────────────────────────────\n private isOpen(): boolean {\n return this.ws?.readyState === this.WS.OPEN;\n }\n\n private ensureConnected(): void {\n if (this.ws || this.connecting) return;\n this.closedByUser = false;\n this.connecting = true;\n const token = this.getToken();\n const wsUrl =\n this.url.replace(/^http/, 'ws') + '/realtime' + (token ? `?token=${encodeURIComponent(token)}` : '');\n const ws = new this.WS(wsUrl);\n this.ws = ws;\n\n ws.onopen = () => {\n this.connecting = false;\n this.reconnectAttempts = 0;\n // (Re)subscribe everything and flush anything queued while offline.\n for (const ref of this.subs.keys()) this.sendSubscribe(ref);\n for (const raw of this.outbox.splice(0)) ws.send(raw);\n this.startHeartbeat();\n };\n ws.onmessage = (ev: MessageEvent) => this.onFrame(ev.data);\n ws.onclose = () => {\n this.connecting = false;\n this.stopHeartbeat();\n this.ws = null;\n if (!this.closedByUser && this.subs.size > 0) this.scheduleReconnect();\n };\n ws.onerror = () => {\n // onclose follows; reconnect handled there.\n };\n }\n\n private scheduleReconnect(): void {\n const delay = Math.min(RECONNECT_BASE_MS * 2 ** this.reconnectAttempts, RECONNECT_MAX_MS);\n this.reconnectAttempts += 1;\n setTimeout(() => {\n if (!this.closedByUser && this.subs.size > 0) this.ensureConnected();\n }, delay);\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.heartbeat = setInterval(() => this.send({ type: 'ping' }), HEARTBEAT_MS);\n }\n private stopHeartbeat(): void {\n if (this.heartbeat) clearInterval(this.heartbeat);\n this.heartbeat = null;\n }\n\n private sendSubscribe(ref: string): void {\n const s = this.subs.get(ref);\n if (!s) return;\n const o = s.opts;\n const msg: Record<string, unknown> = { type: 'subscribe', ref, kind: o.kind };\n if (o.kind === 'postgres') {\n msg.table = o.table;\n if (o.events) msg.events = o.events;\n if (o.filter !== undefined) msg.filter = o.filter;\n } else if (o.kind === 'mongo') {\n msg.collection = o.collection;\n if (o.events) msg.events = o.events;\n if (o.filter !== undefined) msg.filter = o.filter;\n } else {\n msg.channel = o.channel;\n if (o.presence) msg.presence = true;\n if (o.state) msg.state = o.state;\n }\n this.send(msg);\n }\n\n private send(msg: Record<string, unknown>): void {\n const raw = JSON.stringify(msg);\n if (this.isOpen()) this.ws!.send(raw);\n else this.outbox.push(raw);\n }\n\n private onFrame(data: unknown): void {\n if (typeof data !== 'string') return;\n let m: Record<string, unknown>;\n try {\n m = JSON.parse(data) as Record<string, unknown>;\n } catch {\n return;\n }\n const type = m.type as string;\n if (type === 'pong' || type === 'subscribed' || type === 'unsubscribed' || type === 'token_refreshed') {\n return;\n }\n // Route data frames to matching subscriptions.\n if (type === 'change') {\n for (const s of this.subs.values()) {\n if (\n (s.opts.kind === 'postgres' && m.table === qualify(s.opts.table)) ||\n (s.opts.kind === 'mongo' && m.collection === s.opts.collection)\n ) {\n s.handler(m as unknown as ChangeMessage);\n }\n }\n } else if (type === 'broadcast') {\n for (const s of this.subs.values()) {\n if (s.opts.kind === 'broadcast' && m.channel === s.opts.channel) {\n s.handler(m as unknown as BroadcastMessage);\n }\n }\n } else if (type === 'presence_state' || type === 'presence_diff') {\n for (const s of this.subs.values()) {\n if (s.opts.kind === 'broadcast' && (m.channel === s.opts.channel || m.channel === undefined)) {\n s.handler(m as unknown as PresenceMessage);\n }\n }\n }\n }\n}\n\nfunction qualify(table: string): string {\n return table.includes('.') ? table : `public.${table}`;\n}\n","// Pluggable persistence for the auth session. The SDK keeps the session in\n// memory (so token reads are synchronous) and mirrors it here so it survives a\n// reload. Browsers pass `localStorage`; React Native passes an AsyncStorage- or\n// expo-secure-store-style adapter; Node/tests get the in-memory default.\n\nexport interface SessionStorage {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem(key: string): void | Promise<void>;\n}\n\n/** In-memory adapter (default) — session is lost on reload. */\nexport class MemoryStorage implements SessionStorage {\n private m = new Map<string, string>();\n getItem(key: string): string | null {\n return this.m.has(key) ? this.m.get(key)! : null;\n }\n setItem(key: string, value: string): void {\n this.m.set(key, value);\n }\n removeItem(key: string): void {\n this.m.delete(key);\n }\n}\n","// IchibaseClient — the single client a frontend app uses. Anon key only.\n//\n// import { createClient } from '@ichibase/client';\n// const ichi = createClient('https://abc.ichibase.net', 'ich_pub_…');\n// const { data } = await ichi.from('posts').select('*');\n// await ichi.auth.login({ email, password }); // now acts AS the user\n// ichi.realtime.subscribe({ kind: 'postgres', table: 'posts' }, console.log);\n//\n// One config + one session shared across postgres / auth / mongo /\n// realtime. After login, data calls automatically use the user's access token\n// so your RLS / policies / realtime rules see them; logged out, they use the\n// publishable anon key (role = anon).\n\nimport type { IchibaseConfig, Result } from './core.js';\nimport { Postgrest } from './postgrest.js';\nimport { Mongo } from './mongo.js';\nimport { Functions } from './functions.js';\nimport {\n Auth,\n type LoginResult,\n type SignupResult,\n type RefreshResult,\n type UserProfile,\n} from './auth.js';\nimport { RealtimeClient } from './realtime.js';\nimport { MemoryStorage, type SessionStorage } from './storage-adapter.js';\n\nexport interface Session {\n access_token: string;\n refresh_token: string;\n /** Epoch seconds when the access token expires (best-effort, from expires_in). */\n expires_at?: number;\n user?: { id: string; email: string };\n}\n\nexport type AuthEvent = 'SIGNED_IN' | 'SIGNED_OUT' | 'TOKEN_REFRESHED';\n\nexport interface ClientOptions {\n /** Custom fetch (SSR, testing). Defaults to globalThis.fetch. */\n fetch?: typeof fetch;\n /** Where to persist the session. Browsers pass `localStorage`. */\n storage?: SessionStorage;\n /** Key under which the session is persisted. */\n storageKey?: string;\n /** WebSocket constructor for realtime (non-global envs). */\n WebSocketImpl?: typeof WebSocket;\n}\n\nconst DEFAULT_STORAGE_KEY = 'ichibase.session';\n\n/** Auth surface with session management layered over the stateless Auth client. */\nclass SessionAuth {\n constructor(\n private inner: Auth,\n private client: IchibaseClient,\n ) {}\n\n async signup(input: { email: string; password: string }): Promise<Result<SignupResult>> {\n return this.inner.signup(input);\n }\n\n async login(input: { email: string; password: string }): Promise<Result<LoginResult>> {\n const res = await this.inner.login(input);\n if (res.data) {\n await this.client._setSession(\n {\n access_token: res.data.access_token,\n refresh_token: res.data.refresh_token,\n expires_at: expiresAt(res.data.expires_in),\n user: res.data.user,\n },\n 'SIGNED_IN',\n );\n }\n return res;\n }\n\n async refresh(): Promise<Result<RefreshResult>> {\n const s = this.client.getSession();\n if (!s) return { data: null, error: { code: 'no_session', detail: 'not logged in', status: 401 } };\n const res = await this.inner.refresh(s.refresh_token);\n if (res.data) {\n await this.client._setSession(\n {\n access_token: res.data.access_token,\n refresh_token: res.data.refresh_token,\n expires_at: expiresAt(res.data.expires_in),\n user: s.user,\n },\n 'TOKEN_REFRESHED',\n );\n }\n return res;\n }\n\n /** Current signed-in user (from the live access token), or null. */\n async getUser(): Promise<UserProfile | null> {\n const s = this.client.getSession();\n if (!s) return null;\n const res = await this.inner.getUser(s.access_token);\n return res.data;\n }\n\n async logout(): Promise<void> {\n const s = this.client.getSession();\n if (s) await this.inner.logout(s.refresh_token, s.access_token).catch(() => {});\n await this.client._setSession(null, 'SIGNED_OUT');\n }\n\n requestPasswordReset(email: string) {\n return this.inner.requestPasswordReset(email);\n }\n confirmPasswordReset(token: string, newPassword: string) {\n return this.inner.confirmPasswordReset(token, newPassword);\n }\n verifyEmail(token: string) {\n return this.inner.verifyEmail(token);\n }\n verifyEmailOtp(email: string, code: string) {\n return this.inner.verifyEmailOtp(email, code);\n }\n resendVerification(email: string) {\n return this.inner.resendVerification(email);\n }\n\n /** Hydrate the session from the storage adapter (call once at startup for async adapters). */\n async loadSession(): Promise<Session | null> {\n return this.client._loadSession();\n }\n /** Set the session directly (e.g. from your own SSR cookie). */\n async setSession(session: Session | null): Promise<void> {\n await this.client._setSession(session, session ? 'SIGNED_IN' : 'SIGNED_OUT');\n }\n}\n\nexport class IchibaseClient {\n readonly url: string;\n /** Auth surface with session management. */\n readonly auth: SessionAuth;\n\n private anonKey: string;\n private fetchFn: typeof fetch;\n private sessionStore: SessionStorage;\n private storageKey: string;\n private session: Session | null = null;\n private listeners = new Set<(e: AuthEvent, s: Session | null) => void>();\n private _realtime: RealtimeClient | null = null;\n private wsImpl?: typeof WebSocket;\n\n constructor(url: string, anonKey: string, opts: ClientOptions = {}) {\n if (!url) throw new Error('ichibase: url is required');\n if (!anonKey) throw new Error('ichibase: anon key is required');\n // This is the CLIENT SDK — it must never carry the secret/service key.\n if (anonKey.startsWith('ich_admin_')) {\n throw new Error(\n 'ichibase: @ichibase/client is anon-key only. ich_admin_ (service) keys bypass RLS — never ship them to a client. Use them server-side via the JSR SDKs.',\n );\n }\n this.url = url.replace(/\\/$/, '');\n this.anonKey = anonKey;\n this.fetchFn = opts.fetch ?? globalThis.fetch.bind(globalThis);\n this.sessionStore = opts.storage ?? new MemoryStorage();\n this.storageKey = opts.storageKey ?? DEFAULT_STORAGE_KEY;\n this.wsImpl = opts.WebSocketImpl;\n this.auth = new SessionAuth(new Auth(this.url, this.anonKey, this.fetchFn), this);\n\n // Auto-hydrate from a SYNCHRONOUS adapter (e.g. localStorage). Async\n // adapters (AsyncStorage) require an explicit `await auth.loadSession()`.\n try {\n const raw = this.sessionStore.getItem(this.storageKey);\n if (typeof raw === 'string') this.session = parseSession(raw);\n } catch {\n /* ignore */\n }\n }\n\n /** The bearer to send on data-plane calls: the user token if signed in, else the anon key. */\n private bearer(): string {\n return this.session?.access_token ?? this.anonKey;\n }\n\n private cfg(key: string): IchibaseConfig {\n return { url: this.url, key, fetch: this.fetchFn };\n }\n\n // ── PostgREST ──────────────────────────────────────────────────────\n /** Start a PostgREST query against a table or view. */\n from<T = Record<string, unknown>>(table: string) {\n return new Postgrest(this.url, this.bearer(), this.fetchFn).from<T>(table);\n }\n /** Call a Postgres stored procedure (RPC). */\n rpc<T = unknown>(fn: string, args?: Record<string, unknown>, opts?: { schema?: string; count?: 'exact' | 'planned' | 'estimated'; head?: boolean }) {\n return new Postgrest(this.url, this.bearer(), this.fetchFn).rpc<T>(fn, args, opts);\n }\n\n // ── Storage ────────────────────────────────────────────────────────\n // Intentionally NOT exposed on the client. Storage tokens / presigned\n // upload URLs are minted server-side by the project owner (Edge Function +\n // service key) and handed to users — never minted from a client. See the\n // Storage docs. Public files are read directly from cdn.ichibase.net.\n\n // ── Mongo ──────────────────────────────────────────────────────────\n /** Mongo data client (apikey = anon; user token attached when signed in). */\n get mongo(): Mongo {\n const m = new Mongo(this.url, this.anonKey, this.fetchFn);\n return this.session ? m.asUser(this.session.access_token) : m;\n }\n\n // ── Edge Functions ─────────────────────────────────────────────────\n /** Invoke your deployed Edge Functions: `ichi.functions.invoke('name', { body })`. */\n get functions(): Functions {\n const f = new Functions(this.url, this.anonKey, this.fetchFn);\n return this.session ? f.asUser(this.session.access_token) : f;\n }\n\n // ── Realtime ───────────────────────────────────────────────────────\n get realtime(): RealtimeClient {\n if (!this._realtime) {\n this._realtime = new RealtimeClient({\n url: this.url,\n getToken: () => this.bearer(),\n WebSocketImpl: this.wsImpl,\n });\n }\n return this._realtime;\n }\n\n // ── Session ────────────────────────────────────────────────────────\n getSession(): Session | null {\n return this.session;\n }\n /** Subscribe to auth state changes. Returns an unsubscribe fn. */\n onAuthStateChange(cb: (event: AuthEvent, session: Session | null) => void): () => void {\n this.listeners.add(cb);\n return () => this.listeners.delete(cb);\n }\n\n /** @internal */\n async _setSession(session: Session | null, event: AuthEvent): Promise<void> {\n this.session = session;\n try {\n if (session) await this.sessionStore.setItem(this.storageKey, JSON.stringify(session));\n else await this.sessionStore.removeItem(this.storageKey);\n } catch {\n /* persistence is best-effort */\n }\n for (const l of this.listeners) l(event, session);\n }\n\n /** @internal */\n async _loadSession(): Promise<Session | null> {\n try {\n const raw = await this.sessionStore.getItem(this.storageKey);\n this.session = typeof raw === 'string' ? parseSession(raw) : null;\n } catch {\n this.session = null;\n }\n return this.session;\n }\n}\n\nexport function createClient(url: string, anonKey: string, opts?: ClientOptions): IchibaseClient {\n return new IchibaseClient(url, anonKey, opts);\n}\n\nfunction expiresAt(expiresIn: number | undefined): number | undefined {\n if (!expiresIn) return undefined;\n return Math.floor(Date.now() / 1000) + expiresIn;\n}\n\nfunction parseSession(raw: string): Session | null {\n try {\n const s = JSON.parse(raw) as Session;\n return s && typeof s.access_token === 'string' ? s : null;\n } catch {\n return null;\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@ichibase/client",
3
+ "version": "0.1.0",
4
+ "description": "Official client-side SDK for ichibase — Postgres, Mongo, Auth, Storage & Realtime from the browser, React Native, Deno, Node & Bun. Anon key only.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "ichibase",
8
+ "homepage": "https://ichibase.com/docs",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/AliKales/ichibase-client.git"
12
+ },
13
+ "keywords": [
14
+ "ichibase",
15
+ "baas",
16
+ "postgres",
17
+ "mongodb",
18
+ "auth",
19
+ "storage",
20
+ "realtime",
21
+ "supabase-alternative",
22
+ "react-native"
23
+ ],
24
+ "sideEffects": false,
25
+ "main": "./dist/index.cjs",
26
+ "module": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "types": "./dist/index.d.ts",
31
+ "import": "./dist/index.js",
32
+ "require": "./dist/index.cjs"
33
+ }
34
+ },
35
+ "files": [
36
+ "dist",
37
+ "README.md",
38
+ "LICENSE"
39
+ ],
40
+ "engines": {
41
+ "node": ">=18"
42
+ },
43
+ "scripts": {
44
+ "build": "tsup",
45
+ "typecheck": "tsc --noEmit",
46
+ "prepublishOnly": "npm run typecheck && npm run build"
47
+ },
48
+ "devDependencies": {
49
+ "tsup": "^8.3.5",
50
+ "typescript": "^5.7.2"
51
+ },
52
+ "publishConfig": {
53
+ "access": "public"
54
+ }
55
+ }