powersync-bridge 0.0.1-alpha.1 → 0.0.1-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -0
- package/dist/{chunk-KAR4QIIU.js → chunk-WJDQWVO5.js} +2 -5
- package/dist/chunk-WJDQWVO5.js.map +1 -0
- package/dist/index.cjs +298 -92
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +29 -6
- package/dist/index.d.ts +29 -6
- package/dist/index.js +300 -91
- package/dist/index.js.map +1 -1
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-KAR4QIIU.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/clock.ts","../src/keyset.ts","../src/removal.ts","../src/store.ts","../src/query.ts","../src/flagger.ts","../src/freshness.ts","../src/identity.ts","../src/infinite.ts","../src/ondemand.ts","../src/pending.ts","../src/raced.ts","../src/snapshots.ts","../src/bridge.ts","../src/define.ts"],"names":["entry"],"mappings":"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","file":"index.cjs","sourcesContent":["/** Injectable time so the engine is testable with virtual time. */\nexport interface BridgeClock {\n now(): number;\n /** Returns a cancel function. */\n setTimeout(fn: () => void, ms: number): () => void;\n}\n\nexport const realClock: BridgeClock = {\n now: () => Date.now(),\n setTimeout: (fn, ms) => {\n const h = setTimeout(fn, ms);\n return () => clearTimeout(h);\n },\n};\n\n/** Resolves after `ms` on the given clock; rejects if the signal aborts first. */\nexport function delay(clock: BridgeClock, ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason ?? new Error('aborted'));\n const cancel = clock.setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n cancel();\n reject(signal?.reason ?? new Error('aborted'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nexport class TimeoutError extends Error {\n override readonly name = 'TimeoutError';\n}\n\n/** Race a promise against a clock-based timeout. */\nexport async function withTimeout<T>(clock: BridgeClock, p: Promise<T>, ms: number, signal?: AbortSignal): Promise<T> {\n const holder: { cancel?: () => void } = {};\n const timeout = new Promise<never>((_, reject) => {\n holder.cancel = clock.setTimeout(() => reject(new TimeoutError(`timed out after ${ms}ms`)), ms);\n signal?.addEventListener('abort', () => reject(signal.reason ?? new Error('aborted')), { once: true });\n });\n try {\n return await Promise.race([p, timeout]);\n } finally {\n holder.cancel?.();\n }\n}\n","import type { CursorOf, KeyOf, OpaqueCursor, OrderKey, SortDirection } from './types';\n\n/** `id` is always the implicit tiebreaker (§8.3): a scalar key K is treated as [K, 'id']. */\nexport function keyColumns<T>(orderKey: OrderKey<T>): [KeyOf<T>, KeyOf<T>] {\n if (typeof orderKey === 'string') return [orderKey, 'id' as KeyOf<T>];\n return [orderKey[0], orderKey[1]];\n}\n\nexport function idOf(row: unknown): string {\n const r = row as { id?: unknown };\n if (r == null || r.id === undefined || r.id === null) {\n throw new Error('powersync-bridge: every row must have an `id`');\n }\n return String(r.id);\n}\n\nfunction compareValues(a: unknown, b: unknown): number {\n if (a === b) return 0;\n if (a === null || a === undefined) return 1; // nulls last\n if (b === null || b === undefined) return -1;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (typeof a === 'boolean' && typeof b === 'boolean') return Number(a) - Number(b);\n const sa = String(a);\n const sb = String(b);\n return sa < sb ? -1 : sa > sb ? 1 : 0;\n}\n\n/** Comparator over rows for the declared order key + direction. Byte order for strings (SQLite BINARY). */\nexport function rowComparator<T>(orderKey: OrderKey<T>, direction: SortDirection = 'asc'): (a: T, b: T) => number {\n const [k1, k2] = keyColumns(orderKey);\n const sign = direction === 'desc' ? -1 : 1;\n return (a, b) => {\n const c1 = compareValues((a as Record<string, unknown>)[k1], (b as Record<string, unknown>)[k1]);\n if (c1 !== 0) return c1 * sign;\n return compareValues((a as Record<string, unknown>)[k2], (b as Record<string, unknown>)[k2]) * sign;\n };\n}\n\n/** The cursor a row yields, in the definition's cursor shape. */\nexport function cursorOfRow<T, K extends OrderKey<T>>(row: T, orderKey: K): CursorOf<T, K> {\n const r = row as Record<string, unknown>;\n if (typeof orderKey === 'string') return r[orderKey] as CursorOf<T, K>;\n return [r[orderKey[0]], r[orderKey[1]]] as CursorOf<T, K>;\n}\n\n/** Whether `row` sorts strictly after `cursor` in the list's order (i.e. is \"beyond\" it). */\nexport function isAfterCursor<T, K extends OrderKey<T>>(\n row: T,\n cursor: CursorOf<T, K>,\n orderKey: K,\n direction: SortDirection = 'asc',\n): boolean {\n const [k1, k2] = keyColumns(orderKey);\n const r = row as Record<string, unknown>;\n const sign = direction === 'desc' ? -1 : 1;\n const [c1, c2] = typeof orderKey === 'string' ? [cursor, undefined] : (cursor as [unknown, unknown]);\n const d1 = compareValues(r[k1], c1) * sign;\n if (d1 !== 0) return d1 > 0;\n if (c2 === undefined) return false;\n return compareValues(r[k2], c2) * sign > 0;\n}\n\nfunction toBase64(s: string): string {\n if (typeof btoa === 'function') return btoa(unescape(encodeURIComponent(s)));\n return Buffer.from(s, 'utf8').toString('base64');\n}\n\nfunction fromBase64(s: string): string {\n if (typeof atob === 'function') return decodeURIComponent(escape(atob(s)));\n return Buffer.from(s, 'base64').toString('utf8');\n}\n\nexport function encodeCursor(cursor: unknown): OpaqueCursor {\n return toBase64(JSON.stringify(cursor)) as OpaqueCursor;\n}\n\nexport function decodeCursor<C>(opaque: OpaqueCursor): C {\n return JSON.parse(fromBase64(opaque)) as C;\n}\n","import type { BridgeClock } from './clock';\nimport type { BridgeDriver, StreamDescription } from './types';\n\n/**\n * Four-way removal taxonomy (§6.4):\n * filtered — row still exists locally, no longer matches the list query → drop, no tombstone\n * delete — absent, and its producing stream is still tracked before expiry → drop + tombstone\n * eviction — absent, and its stream is gone or past expiry → retain, presentLocally:false\n * retain — classification impossible (predicate threw) → retain\n */\nexport type RemovalClass = 'filtered' | 'delete' | 'eviction' | 'retain';\n\nexport interface RemovalContext<T> {\n readonly driver: BridgeDriver;\n readonly clock: BridgeClock;\n readonly table: string;\n /** Producing stream for a row, when known (partition escalation). */\n readonly provenance: (row: T) => StreamDescription | undefined;\n readonly isInWindow?: ((row: T) => boolean) | undefined;\n}\n\nconst PROBE_CHUNK = 500;\n\nexport async function probePresence(\n driver: BridgeDriver,\n table: string,\n ids: readonly string[],\n): Promise<Set<string>> {\n const present = new Set<string>();\n for (let i = 0; i < ids.length; i += PROBE_CHUNK) {\n const chunk = ids.slice(i, i + PROBE_CHUNK);\n const found = await driver.presentIds(table, chunk);\n for (const id of found) present.add(id);\n }\n return present;\n}\n\nexport async function classifyRemovals<T>(\n ctx: RemovalContext<T>,\n removed: ReadonlyMap<string, T>,\n): Promise<Map<string, RemovalClass>> {\n const out = new Map<string, RemovalClass>();\n const ids = Array.from(removed.keys());\n if (ids.length === 0) return out;\n\n // ONE batched probe per emission (R14).\n const present = await probePresence(ctx.driver, ctx.table, ids);\n const now = ctx.clock.now();\n const status = ctx.driver.syncStatus();\n\n for (const [id, row] of removed) {\n if (present.has(id)) {\n out.set(id, 'filtered');\n continue;\n }\n const stream = ctx.provenance(row);\n if (stream) {\n const st = status.forStream(stream);\n const tracked = st !== undefined;\n const beforeExpiry = st?.active === true || st?.expiresAt === null || (st?.expiresAt !== undefined && st.expiresAt !== null && now < st.expiresAt.getTime());\n out.set(id, tracked && beforeExpiry ? 'delete' : 'eviction');\n continue;\n }\n if (ctx.isInWindow) {\n try {\n out.set(id, ctx.isInWindow(row) ? 'delete' : 'eviction');\n } catch {\n out.set(id, 'retain'); // a throwing predicate is never a delete\n }\n continue;\n }\n // No provenance and no predicate: the row left the synced set while its (auto) stream is\n // live — treat as delete (drop). Retention would mask real deletes.\n out.set(id, 'delete');\n }\n return out;\n}\n","import type { Store } from './types';\n\n/**\n * External store with a stable snapshot for useSyncExternalStore (R10/R11).\n * `replace()` swaps the snapshot and notifies once; `swapRoot()` is what an identity change\n * calls — it is synchronous, so no committed frame can observe the outgoing state (R15).\n */\nexport class SnapshotStore<S> implements Store<S> {\n private snapshot: S;\n private readonly listeners = new Set<() => void>();\n\n constructor(initial: S) {\n this.snapshot = initial;\n }\n\n // React invokes external-store callbacks as standalone functions.\n readonly getSnapshot = (): S => {\n return this.snapshot;\n };\n\n readonly subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n replace(next: S): void {\n if (Object.is(next, this.snapshot)) return;\n this.snapshot = next;\n for (const l of Array.from(this.listeners)) l();\n }\n\n get listenerCount(): number {\n return this.listeners.size;\n }\n}\n\n/** Shallow structural equality for result records so equal reconciles produce no re-render. */\nexport function shallowEqualResult(a: Record<string, unknown>, b: Record<string, unknown>): boolean {\n const ka = Object.keys(a);\n const kb = Object.keys(b);\n if (ka.length !== kb.length) return false;\n for (const k of ka) {\n const va = a[k];\n const vb = b[k];\n if (Array.isArray(va) && Array.isArray(vb)) {\n if (va.length !== vb.length) return false;\n for (let i = 0; i < va.length; i++) if (!Object.is(va[i], vb[i])) return false;\n continue;\n }\n if (va !== null && typeof va === 'object' && vb !== null && typeof vb === 'object') {\n if (!shallowEqualResult(va as Record<string, unknown>, vb as Record<string, unknown>)) return false;\n continue;\n }\n if (!Object.is(va, vb)) return false;\n }\n return true;\n}\n","import { withTimeout } from './clock';\nimport { idOf, keyColumns, rowComparator } from './keyset';\nimport type { PendingWindow } from './pending';\nimport type { RacedDeps } from './raced';\nimport { classifyRemovals } from './removal';\nimport { SnapshotStore, shallowEqualResult } from './store';\nimport type { ListErrors, OrderKey, PagedRow, RowsBuilder, Store } from './types';\n\nexport interface QueryPage<T> {\n readonly cursor: T | undefined;\n readonly limit: number;\n}\n\n/** Query keys include every predicate, identity and permission that can change the result. */\nexport interface InfiniteQueryOptions<T extends { id: string }> {\n readonly queryKey: readonly unknown[];\n readonly query: (page: QueryPage<T>) => RowsBuilder<T>;\n /** Return rows in the same order as SQLite. Honor limit, including its lookahead row. */\n readonly fetchPage: (page: QueryPage<T> & { readonly signal: AbortSignal }) => Promise<readonly T[]>;\n readonly orderBy: OrderKey<T>;\n readonly direction?: 'asc' | 'desc';\n readonly pageSize?: number;\n readonly maxRows?: number;\n readonly staleTime?: number;\n readonly enabled?: boolean;\n readonly table?: string;\n /** Heterogeneous feeds identify each underlying business row for pending-write protection. */\n readonly getRowIdentity?: (row: T) => { table: string; id: string };\n readonly isInWindow?: (row: T) => boolean;\n}\n\n/** Shared by core and React so changing page configuration cannot reuse an incompatible store. */\nexport const infiniteQueryKey = <T extends { id: string }>(options: InfiniteQueryOptions<T>): string =>\n JSON.stringify([\n options.queryKey,\n options.orderBy,\n options.direction ?? 'desc',\n options.pageSize ?? 25,\n options.maxRows ?? 500,\n options.enabled !== false,\n ]);\n\nexport interface InfiniteQueryResult<T> {\n readonly data: T[];\n readonly items: readonly PagedRow<T>[];\n readonly isLoading: boolean;\n readonly isFetching: boolean;\n readonly isFetchingNextPage: boolean;\n readonly hasNextPage: boolean;\n readonly needsOlderWindow: boolean;\n readonly error: Error | undefined;\n readonly errors: ListErrors;\n readonly isError: boolean;\n readonly windowRevision: number;\n}\n\nexport class OfflineError extends Error {\n override readonly name = 'OfflineError';\n constructor() {\n super('Additional records require a connection.');\n }\n}\n\ninterface Page<T> {\n cursor: T | undefined;\n rows: readonly T[];\n end: boolean;\n fetchedAt: number;\n window: PendingWindow;\n}\n\nexport interface QueryDeps extends RacedDeps {\n readonly connectivity: Store<boolean | undefined>;\n}\n\n/** One loaded-range watch and one ordered API cursor chain. Every requested page races both. */\nexport class InfiniteQueryStore<T extends { id: string }> {\n readonly store: SnapshotStore<InfiniteQueryResult<T>>;\n private readonly pageSize: number;\n private readonly maxRows: number;\n private readonly compare: (a: T, b: T) => number;\n private table: string | undefined;\n private target: number;\n private anchor: T | undefined;\n private revision = 0;\n private local = new Map<string, T>();\n private readonly retained = new Map<string, T>();\n private readonly tombstones = new Set<string>();\n private readonly filtered = new Set<string>();\n private readonly inSession = new Set<string>();\n private pages: Page<T>[] = [];\n private localPending = true;\n private localStamp = Number.NEGATIVE_INFINITY;\n private localError: Error | undefined;\n private apiError: Error | undefined;\n private apiPending = false;\n private apiFailed = false;\n private offline: boolean;\n private generation = 0;\n private watchGeneration = 0;\n private lastLocalWatch = 0;\n private refs = 0;\n private ready = false;\n private disposed = false;\n private unwatch: (() => void) | undefined;\n private stops: (() => void)[] = [];\n private request: AbortController | undefined;\n private requestKey: readonly unknown[] | undefined;\n\n constructor(\n private readonly deps: QueryDeps,\n private readonly options: InfiniteQueryOptions<T>,\n ) {\n this.pageSize = options.pageSize ?? 25;\n this.maxRows = options.maxRows ?? 500;\n if (\n !Number.isInteger(this.pageSize) ||\n this.pageSize < 1 ||\n !Number.isInteger(this.maxRows) ||\n this.maxRows < this.pageSize\n )\n throw new Error('powersync-bridge: pageSize must be positive and maxRows must be at least pageSize');\n this.target = this.pageSize;\n this.compare = rowComparator(options.orderBy, options.direction ?? 'desc');\n this.table = options.table;\n this.offline = this.readOffline();\n this.store = new SnapshotStore(this.result());\n }\n\n get isDisposed(): boolean {\n return this.disposed || (this.refs <= 0 && this.unwatch !== undefined);\n }\n retain(): void {\n this.refs += 1;\n if (this.refs !== 1 || this.unwatch || this.options.enabled === false) return;\n this.stops = [\n this.deps.crud.onChange(() => this.render()),\n this.deps.freshness.onCompletion(() => void this.checkpoint()),\n this.deps.driver.onStatusChanged(() => this.networkChanged()),\n this.deps.connectivity.subscribe(() => this.networkChanged()),\n ];\n this.watch();\n void this.deps.crud\n .ready()\n .then(() => {\n this.ready = true;\n this.pump();\n })\n .catch((error: unknown) => {\n if (this.disposed) return;\n this.localPending = false;\n this.localError = error instanceof Error ? error : new Error(String(error));\n this.render();\n });\n }\n release(): void {\n this.refs -= 1;\n if (this.refs <= 0)\n queueMicrotask(() => {\n if (this.refs <= 0) this.dispose();\n });\n }\n swapRoot(): void {\n this.disposed = true;\n this.local.clear();\n this.retained.clear();\n this.clearPages();\n this.render(true);\n }\n dispose(): void {\n this.disposed = true;\n this.generation += 1;\n this.watchGeneration += 1;\n this.cancelRequest();\n this.unwatch?.();\n this.unwatch = undefined;\n for (const stop of this.stops) stop();\n this.stops = [];\n this.clearPages();\n this.local.clear();\n this.retained.clear();\n this.tombstones.clear();\n this.filtered.clear();\n this.inSession.clear();\n this.render(true);\n }\n\n private readOffline(): boolean {\n return (this.deps.connectivity.getSnapshot() ?? this.deps.driver.onlineHint()) === false;\n }\n private cancelRequest(): void {\n this.request?.abort();\n if (this.requestKey) this.deps.snapshots.invalidate(this.requestKey);\n this.requestKey = undefined;\n }\n private networkChanged(): void {\n if (this.disposed) return;\n const offline = this.readOffline();\n const reconnect = this.offline && !offline;\n this.offline = offline;\n if (offline && this.request) {\n this.cancelRequest();\n this.generation += 1;\n this.apiPending = false;\n this.request = undefined;\n }\n if (reconnect) {\n this.apiFailed = false;\n this.apiError = undefined;\n this.pump();\n }\n this.render();\n }\n private identity(row: T): { table: string; id: string } {\n if (this.options.getRowIdentity) return this.options.getRowIdentity(row);\n if (!this.table)\n throw new Error(\n 'powersync-bridge: provide table or getRowIdentity when the adapter cannot infer the business table',\n );\n return { table: this.table, id: idOf(row) };\n }\n private pending(row: T): boolean {\n const { table, id } = this.identity(row);\n return Boolean(\n this.deps.crud.pendingOp(table, id) ||\n this.pages.some((page) => this.deps.crud.pendingOp(table, id, page.window)),\n );\n }\n private localBuilder(): RowsBuilder<T> {\n return this.options.query({ cursor: this.anchor, limit: this.target + 1 });\n }\n private watch(): void {\n this.unwatch?.();\n const token = ++this.watchGeneration;\n const generation = this.generation;\n this.localPending = true;\n let prepared;\n try {\n prepared = this.deps.adapter.prepare(this.localBuilder());\n if (!this.table && prepared.tables.length === 1) this.table = prepared.tables[0];\n if (!this.table && !this.options.getRowIdentity)\n throw new Error(\n 'powersync-bridge: provide table or getRowIdentity when the adapter cannot infer the business table',\n );\n } catch (error) {\n this.localPending = false;\n this.localError = error instanceof Error ? error : new Error(String(error));\n this.render();\n return;\n }\n this.unwatch = this.deps.driver.diffs(prepared).subscribe(\n (diff) => {\n void this.acceptLocal(diff.all, token, generation).catch((error: unknown) => {\n if (token !== this.watchGeneration || generation !== this.generation || this.disposed) return;\n this.localPending = false;\n this.localError = error instanceof Error ? error : new Error(String(error));\n this.render();\n });\n },\n (error) => {\n if (token !== this.watchGeneration || generation !== this.generation || this.disposed) return;\n this.localPending = false;\n this.localError = error;\n this.render();\n },\n );\n this.render();\n }\n private async acceptLocal(rows: readonly T[], token: number, generation: number): Promise<void> {\n await this.deps.crud.resync();\n if (token !== this.watchGeneration || generation !== this.generation || this.disposed) return;\n const previous = this.local;\n const firstEmission = this.lastLocalWatch !== token;\n this.lastLocalWatch = token;\n const next = new Map(rows.map((row) => [idOf(row), row]));\n const removed = new Map<string, T>();\n for (const [id, row] of previous)\n if (!next.has(id)) {\n removed.set(id, row);\n this.tombstones.add(id);\n }\n for (const [id, row] of next) {\n if (\n previous.size &&\n (!firstEmission || previous.has(id)) &&\n JSON.stringify(previous.get(id)) !== JSON.stringify(row) &&\n !this.pending(row)\n )\n this.inSession.add(id);\n this.tombstones.delete(id);\n this.filtered.delete(id);\n this.retained.delete(id);\n }\n this.local = next;\n this.localPending = false;\n this.localError = undefined;\n this.localStamp = this.deps.freshness.freshAtFor(undefined);\n this.render();\n // Probe by business table, including heterogeneous feeds whose display IDs are composite.\n const groups = new Map<string, Map<string, T>>();\n for (const row of removed.values()) {\n const identity = this.identity(row);\n const group = groups.get(identity.table) ?? new Map<string, T>();\n group.set(identity.id, row);\n groups.set(identity.table, group);\n }\n try {\n for (const [table, group] of groups) {\n const classes = await classifyRemovals(\n {\n driver: this.deps.driver,\n clock: this.deps.clock,\n table,\n provenance: () => undefined,\n isInWindow: this.options.isInWindow,\n },\n group,\n );\n if (token !== this.watchGeneration || generation !== this.generation || this.disposed) return;\n for (const row of removed.values()) {\n const identity = this.identity(row);\n if (identity.table !== table || this.local.has(row.id)) continue;\n const classification = classes.get(identity.id);\n if (!classification) continue;\n if (classification === 'delete') this.tombstones.add(row.id);\n else if (classification === 'filtered') {\n this.tombstones.delete(row.id);\n this.filtered.add(row.id);\n } else {\n this.tombstones.delete(row.id);\n this.retained.set(row.id, row);\n }\n }\n }\n } catch (error) {\n // A failed presence probe must not resurrect a deleted or filtered API row.\n if (token !== this.watchGeneration || generation !== this.generation || this.disposed) return;\n this.localError = error instanceof Error ? error : new Error(String(error));\n }\n const retained = [...this.retained.values()].sort(this.compare).slice(0, this.maxRows);\n this.retained.clear();\n for (const row of retained) this.retained.set(row.id, row);\n const known = new Set([\n ...this.local.keys(),\n ...this.retained.keys(),\n ...this.pages.flatMap((page) => page.rows.map((row) => row.id)),\n ]);\n for (const set of [this.inSession, this.tombstones, this.filtered]) {\n if (set.size > this.maxRows * 4) for (const id of set) if (!known.has(id)) set.delete(id);\n }\n this.render();\n }\n private async checkpoint(): Promise<void> {\n if (this.disposed || !this.unwatch) return;\n const token = this.watchGeneration;\n const generation = this.generation;\n try {\n const rows = await this.deps.driver.query(this.deps.adapter.prepare(this.localBuilder()));\n await this.acceptLocal(rows, token, generation);\n } catch (error) {\n if (token !== this.watchGeneration || generation !== this.generation || this.disposed) return;\n this.localError = error instanceof Error ? error : new Error(String(error));\n this.render();\n }\n }\n private clearPages(): void {\n for (const page of this.pages) this.deps.crud.closeWindow(page.window);\n this.pages = [];\n }\n private apiEnd(): boolean {\n return this.pages.at(-1)?.end === true;\n }\n private apiCount(): number {\n return this.pages.reduce((count, page) => count + page.rows.length, 0);\n }\n private apiCursor(): T | undefined {\n const last = this.pages.at(-1)?.rows.at(-1);\n return last ? last : this.anchor;\n }\n private cursorKey(row: T | undefined): readonly unknown[] | undefined {\n if (!row) return undefined;\n const [first, second] = keyColumns(this.options.orderBy);\n return [row[first], row[second]];\n }\n private pump(): void {\n if (\n !this.ready ||\n this.disposed ||\n this.options.enabled === false ||\n this.offline ||\n this.apiPending ||\n this.apiFailed ||\n this.apiEnd()\n )\n return;\n if (!this.table && !this.options.getRowIdentity) return;\n if (this.pages.length >= Math.ceil(this.maxRows / this.pageSize) + 1) return;\n if (this.apiCount() >= this.target && this.entries().length >= this.target) return;\n const cursor = this.apiCursor();\n const generation = this.generation;\n const request = new AbortController();\n this.request = request;\n const window = this.deps.crud.openWindow();\n this.apiPending = true;\n this.render();\n const key = [\n 'powersync-bridge.query',\n this.deps.identityKey,\n this.deps.epoch,\n infiniteQueryKey(this.options),\n this.cursorKey(this.anchor),\n this.revision,\n generation,\n this.cursorKey(cursor),\n ];\n this.requestKey = key;\n void this.deps.snapshots\n .fetch<T>(key, this.options.staleTime ?? 60_000, async (signal) => {\n const abort = () => request.abort();\n signal.addEventListener('abort', abort, { once: true });\n try {\n return await withTimeout(\n this.deps.clock,\n this.options\n .fetchPage({ cursor, limit: this.pageSize + 1, signal: request.signal })\n .then((rows) => ({ rows })),\n 30_000,\n request.signal,\n );\n } finally {\n signal.removeEventListener('abort', abort);\n }\n })\n .then((record) => {\n if (this.disposed || generation !== this.generation || request.signal.aborted) {\n this.deps.crud.closeWindow(window);\n return;\n }\n const rows = [...record.rows];\n for (let index = 1; index < rows.length; index++) {\n const before = rows[index - 1];\n const row = rows[index];\n if (before && row && this.compare(before, row) >= 0)\n throw new Error('powersync-bridge: API rows must use a strict, stable order with an id tiebreaker');\n }\n if (cursor !== undefined && rows.some((row) => this.compare(row, cursor) <= 0))\n throw new Error('powersync-bridge: API page must advance beyond the supplied cursor');\n this.pages.push({\n cursor,\n rows: rows.slice(0, this.pageSize),\n end: rows.length <= this.pageSize,\n fetchedAt: record.fetchedAt,\n window,\n });\n this.apiError = undefined;\n })\n .catch((error: unknown) => {\n this.deps.crud.closeWindow(window);\n if (this.disposed || generation !== this.generation || request.signal.aborted) return;\n this.apiFailed = true;\n this.apiError = error instanceof Error ? error : new Error(String(error));\n request.abort();\n })\n .finally(() => {\n if (generation !== this.generation || this.disposed) return;\n this.apiPending = false;\n this.request = undefined;\n this.requestKey = undefined;\n this.render();\n this.pump();\n });\n }\n\n private entries(): PagedRow<T>[] {\n const api = new Map<string, { row: T; page: Page<T> }>();\n for (const page of this.pages) for (const row of page.rows) api.set(row.id, { row, page });\n const ids = new Set([...this.local.keys(), ...this.retained.keys(), ...api.keys()]);\n const entries: PagedRow<T>[] = [];\n for (const id of ids) {\n if (this.tombstones.has(id) || this.filtered.has(id)) continue;\n const local = this.local.get(id);\n const remote = api.get(id);\n const row = local ?? remote?.row ?? this.retained.get(id);\n if (!row) continue;\n if (this.pending(row)) {\n if (local) entries.push({ row: local, origin: 'local', presentLocally: true });\n continue;\n }\n if (remote) {\n entries.push(\n local && this.localStamp > remote.page.fetchedAt\n ? { row: local, origin: 'local', presentLocally: true }\n : { row: remote.row, origin: 'api', presentLocally: Boolean(local) },\n );\n } else if (local) {\n const covering = this.pages.find((page) => {\n if (page.cursor !== undefined && this.compare(local, page.cursor) <= 0) return false;\n const last = page.rows.at(-1);\n return page.end || Boolean(last && this.compare(local, last) <= 0);\n });\n if (!covering || this.inSession.has(id) || this.localStamp > covering.fetchedAt)\n entries.push({ row: local, origin: 'local', presentLocally: true });\n } else entries.push({ row, origin: 'local', presentLocally: false });\n }\n return entries.sort((a, b) => this.compare(a.row, b.row));\n }\n private result(empty = false): InfiniteQueryResult<T> {\n const enabled = !empty && this.options.enabled !== false;\n const entries = enabled ? this.entries() : [];\n const items = entries.slice(0, this.target);\n const more = entries.length > this.target || !this.apiEnd();\n const missing = items.length < this.target;\n const errors: ListErrors = {};\n if (this.localError) errors.local = this.localError;\n if (this.apiError) errors.api = this.apiError;\n const offlineError = this.offline && missing && !this.localPending ? new OfflineError() : undefined;\n const error =\n enabled && missing && !this.localPending && !this.apiPending\n ? (this.localError ?? this.apiError ?? offlineError)\n : undefined;\n return {\n data: items.map((item) => item.row),\n items,\n isLoading: enabled && items.length === 0 && !error && (this.localPending || this.apiPending),\n isFetching: enabled && (this.localPending || this.apiPending),\n isFetchingNextPage: enabled && this.target > this.pageSize && (this.localPending || this.apiPending),\n hasNextPage: enabled && this.target < this.maxRows && more,\n needsOlderWindow: enabled && items.length >= this.maxRows && more,\n error,\n errors,\n isError: Boolean(error),\n windowRevision: this.revision,\n };\n }\n private render(empty = false): void {\n if (this.disposed && !empty) return;\n const result = this.result(empty);\n if (\n !shallowEqualResult(\n this.store.getSnapshot() as unknown as Record<string, unknown>,\n result as unknown as Record<string, unknown>,\n )\n )\n this.store.replace(result);\n }\n readonly fetchNextPage = (): void => {\n if (this.disposed || this.options.enabled === false || this.target >= this.maxRows) return;\n if (!this.store.getSnapshot().hasNextPage) return;\n this.target = Math.min(this.target + this.pageSize, this.maxRows);\n this.watch();\n this.pump();\n };\n readonly retry = (): void => {\n if (this.disposed || this.options.enabled === false) return;\n this.apiFailed = false;\n this.apiError = undefined;\n this.watch();\n this.pump();\n };\n readonly refresh = (): void => {\n this.reset(this.anchor);\n };\n readonly continueOlder = (): void => {\n const last = this.store.getSnapshot().data.at(-1);\n if (last) this.reset(last);\n };\n private reset(anchor: T | undefined): void {\n if (this.disposed || this.options.enabled === false) return;\n this.generation += 1;\n this.cancelRequest();\n this.request = undefined;\n this.apiPending = false;\n this.apiFailed = false;\n this.apiError = undefined;\n this.localError = undefined;\n this.clearPages();\n this.local.clear();\n this.retained.clear();\n this.inSession.clear();\n this.tombstones.clear();\n this.filtered.clear();\n this.target = this.pageSize;\n this.anchor = anchor;\n this.revision += 1;\n this.watch();\n this.pump();\n }\n}\n","import type { BridgeClock } from './clock';\nimport { probePresence } from './removal';\nimport { SnapshotStore } from './store';\nimport type { BridgeDriver, StreamHandle } from './types';\n\nexport type FlagState = 'idle' | 'flagging' | 'syncing' | 'synced' | 'timeout' | 'error';\n\nexport interface FlaggerConfig {\n /** App-supplied backend call, e.g. POST /sync/flag. */\n readonly requestFlag: (ids: readonly string[]) => Promise<void>;\n /** Stream whose JOIN reads the per-user sync_requests table. */\n readonly stream: string;\n /** Table the flagged rows land in (for presence detection). */\n readonly table: string;\n readonly timeoutMs?: number;\n}\n\nexport interface FlagResult {\n readonly state: FlagState;\n readonly error?: Error;\n}\n\n/**\n * OPTIONAL primitive (§7): client-triggered, per-user server-side flagging. Use only for bucket\n * economy or server-decided membership; `useOnDemandStream` is the default single-row path.\n * `synced` is detected by watching the SPECIFIC requested ids, never by waitForFirstSync.\n */\nexport class AutoSyncFlagStore {\n readonly store = new SnapshotStore<FlagResult>({ status: 'idle' } as unknown as FlagResult);\n private handle: StreamHandle | null = null;\n private unsubStatus: (() => void) | null = null;\n private cancelTimeout: (() => void) | null = null;\n private disposed = false;\n private refs = 0;\n\n constructor(\n private readonly driver: BridgeDriver,\n private readonly clock: BridgeClock,\n private readonly config: FlaggerConfig,\n private readonly ids: readonly string[],\n ) {\n this.store.replace({ state: 'idle' });\n }\n\n retain(): void {\n this.refs += 1;\n if (this.refs === 1) void this.start();\n }\n\n release(): void {\n this.refs -= 1;\n if (this.refs <= 0) this.dispose();\n }\n\n get isDisposed(): boolean {\n return this.disposed;\n }\n\n swapRoot(): void {\n this.store.replace({ state: 'idle' });\n this.disposed = true;\n }\n\n dispose(): void {\n this.disposed = true;\n this.unsubStatus?.();\n this.cancelTimeout?.();\n this.handle?.unsubscribe();\n this.handle = null;\n }\n\n private async start(): Promise<void> {\n this.store.replace({ state: 'flagging' });\n try {\n await this.config.requestFlag(this.ids);\n if (this.disposed) return;\n this.handle = await this.driver.syncStream(this.config.stream, null, {});\n this.store.replace({ state: 'syncing' });\n // timeout ≠ failure: keep the subscription, keep watching\n this.cancelTimeout = this.clock.setTimeout(() => {\n if (!this.disposed && this.store.getSnapshot().state === 'syncing') this.store.replace({ state: 'timeout' });\n }, this.config.timeoutMs ?? 15_000);\n const check = async () => {\n if (this.disposed) return;\n const present = await probePresence(this.driver, this.config.table, this.ids);\n if (!this.disposed && this.ids.every((id) => present.has(id))) {\n this.cancelTimeout?.();\n this.store.replace({ state: 'synced' });\n this.unsubStatus?.();\n }\n };\n this.unsubStatus = this.driver.onStatusChanged(() => void check());\n await check();\n } catch (e) {\n if (!this.disposed) this.store.replace({ state: 'error', error: e instanceof Error ? e : new Error(String(e)) });\n }\n }\n}\n","import type { BridgeDriver, StreamDescription, SyncStatusView } from './types';\n\nexport type Clock = () => number;\n\nexport interface CheckpointCompletion {\n /** Lower-bound stamp of the checkpoint's data position (download start), ms. */\n readonly stamp: number;\n readonly completedAt: number;\n /** Stream this completion was observed on; null for the global status. */\n readonly stream: string | null;\n}\n\nexport function streamKey(desc: StreamDescription): string {\n return `${desc.name}:${desc.params ? JSON.stringify(desc.params) : ''}`;\n}\n\n/**\n * Session-scoped, monotonic, transition-independent freshness (§5.2, R3/R5).\n *\n * stamp(checkpoint_n) = max(observed download start ≤ its completion,\n * completion time of checkpoint n−1,\n * sessionConnectAt when no other bound exists)\n * localFreshAt = max(previous, stamp) — a null observation never lowers it.\n */\nexport class FreshnessTracker {\n private sessionConnectAt: number | null = null;\n private localFreshAt = Number.NEGATIVE_INFINITY;\n private prevCompletionAt: number | null = null;\n private lastDownloadStart: number | null = null;\n private lastSeenSyncedAt: number | null = null;\n private lastDownloading = false;\n private lastConnected = false;\n private lastHasSynced: boolean | undefined = undefined;\n private readonly streamFreshAt = new Map<string, number>();\n private readonly streamSeenSyncedAt = new Map<string, number>();\n private readonly completions: CheckpointCompletion[] = [];\n private readonly completionListeners = new Set<(c: CheckpointCompletion) => void>();\n private readonly clearListeners = new Set<() => void>();\n private unsubscribe: (() => void) | null = null;\n\n constructor(\n private readonly driver: BridgeDriver,\n private readonly clock: Clock,\n ) {}\n\n /** Call once at engine init and again after every identity swap. */\n start(epochStartedAt: number): void {\n this.stop();\n this.reset();\n const status = this.driver.syncStatus();\n this.lastConnected = status.connected;\n this.lastDownloading = status.downloading;\n this.lastHasSynced = status.hasSynced;\n this.lastSeenSyncedAt = status.lastSyncedAt?.getTime() ?? null;\n if (status.connected) this.sessionConnectAt = epochStartedAt;\n // Boot mid-download: provisional bound for the FIRST completion, never applied to localFreshAt now.\n if (status.downloading) {\n this.prevCompletionAt = Math.max(epochStartedAt, this.lastSeenSyncedAt ?? Number.NEGATIVE_INFINITY);\n }\n for (const s of status.syncStreams) {\n if (s.lastSyncedAt) this.streamSeenSyncedAt.set(streamKey(s), s.lastSyncedAt.getTime());\n }\n this.unsubscribe = this.driver.onStatusChanged(() => this.onStatus(this.driver.syncStatus()));\n }\n\n stop(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n }\n\n private reset(): void {\n this.sessionConnectAt = null;\n this.localFreshAt = Number.NEGATIVE_INFINITY;\n this.prevCompletionAt = null;\n this.lastDownloadStart = null;\n this.lastSeenSyncedAt = null;\n this.streamFreshAt.clear();\n this.streamSeenSyncedAt.clear();\n this.completions.length = 0;\n }\n\n get sessionConnectAtMs(): number | null {\n return this.sessionConnectAt;\n }\n\n get localFreshAtMs(): number {\n return this.localFreshAt;\n }\n\n streamFreshAtMs(desc: StreamDescription): number {\n return this.streamFreshAt.get(streamKey(desc)) ?? Number.NEGATIVE_INFINITY;\n }\n\n /** Freshness for a list: the owning stream's stamp when declared, else the global stamp. */\n freshAtFor(stream: StreamDescription | undefined): number {\n if (!stream) return this.localFreshAt;\n return Math.max(this.streamFreshAtMs(stream), this.localFreshAt);\n }\n\n /** \"Answered\" = in-session freshness evidence (R5). */\n isFresh(stream: StreamDescription | undefined): boolean {\n if (this.sessionConnectAt === null) return false;\n return this.freshAtFor(stream) >= this.sessionConnectAt;\n }\n\n onCompletion(l: (c: CheckpointCompletion) => void): () => void {\n this.completionListeners.add(l);\n return () => this.completionListeners.delete(l);\n }\n\n onClear(l: () => void): () => void {\n this.clearListeners.add(l);\n return () => this.clearListeners.delete(l);\n }\n\n private onStatus(status: SyncStatusView): void {\n const now = this.clock();\n\n if (status.connected && !this.lastConnected && this.sessionConnectAt === null) {\n this.sessionConnectAt = now; // FIRST connect of the epoch — never per reconnect (R5)\n }\n this.lastConnected = status.connected;\n\n if (status.downloading && !this.lastDownloading) this.lastDownloadStart = now;\n this.lastDownloading = status.downloading;\n\n const syncedAt = status.lastSyncedAt?.getTime() ?? null;\n if (syncedAt !== null && syncedAt !== this.lastSeenSyncedAt) {\n this.recordCompletion(now, null);\n }\n if (syncedAt !== null) this.lastSeenSyncedAt = syncedAt; // null never lowers anything (R5)\n\n for (const s of status.syncStreams) {\n const key = streamKey(s);\n const at = s.lastSyncedAt?.getTime() ?? null;\n if (at !== null && at !== this.streamSeenSyncedAt.get(key)) {\n this.streamSeenSyncedAt.set(key, at);\n const stamp = this.stampFor(now);\n const prev = this.streamFreshAt.get(key) ?? Number.NEGATIVE_INFINITY;\n this.streamFreshAt.set(key, Math.max(prev, stamp));\n const c: CheckpointCompletion = { stamp: Math.max(prev, stamp), completedAt: now, stream: key };\n for (const l of this.completionListeners) l(c);\n }\n }\n\n if (this.lastHasSynced === true && status.hasSynced !== true) {\n for (const l of this.clearListeners) l();\n }\n this.lastHasSynced = status.hasSynced;\n }\n\n private stampFor(now: number): number {\n const candidates: number[] = [];\n if (this.lastDownloadStart !== null && this.lastDownloadStart <= now) candidates.push(this.lastDownloadStart);\n if (this.prevCompletionAt !== null) candidates.push(this.prevCompletionAt);\n if (candidates.length === 0 && this.sessionConnectAt !== null) candidates.push(this.sessionConnectAt);\n if (candidates.length === 0) return Number.NEGATIVE_INFINITY;\n return Math.max(...candidates);\n }\n\n private recordCompletion(now: number, stream: string | null): void {\n const stamp = this.stampFor(now);\n this.localFreshAt = Math.max(this.localFreshAt, stamp);\n this.prevCompletionAt = now;\n this.lastDownloadStart = null; // consumed; the next stamp derives from this completion\n const c: CheckpointCompletion = { stamp: this.localFreshAt, completedAt: now, stream };\n this.completions.push(c);\n for (const l of this.completionListeners) l(c);\n }\n}\n","/**\n * Identity is DERIVED from the JWT the connector returns, never supplied by the app (R15, [DX]).\n * The key is the canonical JSON of the stable claims — a cache key, not a hash.\n */\n\nexport const DEFAULT_VOLATILE_CLAIMS: readonly string[] = [\n // OIDC volatile set\n 'exp', 'iat', 'nbf', 'jti', 'auth_time', 'at_hash', 'nonce', 'azp',\n // vendor session claims that rotate on refresh\n 'sid', 'session_id', 'rat',\n];\n\nfunction base64UrlToString(input: string): string {\n const b64 = input.replace(/-/g, '+').replace(/_/g, '/');\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4);\n if (typeof atob === 'function') return decodeURIComponent(escape(atob(padded)));\n return Buffer.from(padded, 'base64').toString('utf8');\n}\n\nexport function decodeJwtPayload(token: string): Record<string, unknown> {\n const parts = token.split('.');\n if (parts.length < 2 || !parts[1]) throw new Error('powersync-bridge: token is not a JWT');\n const parsed: unknown = JSON.parse(base64UrlToString(parts[1]));\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('powersync-bridge: JWT payload is not an object');\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction canonical(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(canonical).join(',')}]`;\n if (value !== null && typeof value === 'object') {\n const o = value as Record<string, unknown>;\n return `{${Object.keys(o).sort().map((k) => `${JSON.stringify(k)}:${canonical(o[k])}`).join(',')}}`;\n }\n return JSON.stringify(value);\n}\n\nexport interface IdentityKeyOptions {\n readonly denyList?: readonly string[];\n /** Connection parameters opted in BY KEY (rotating values must be excluded explicitly). */\n readonly connectionParams?: Record<string, unknown>;\n}\n\nexport function identityKeyFromClaims(claims: Record<string, unknown>, opts: IdentityKeyOptions = {}): string {\n const deny = new Set(opts.denyList ?? DEFAULT_VOLATILE_CLAIMS);\n const stable: Record<string, unknown> = {};\n for (const k of Object.keys(claims).sort()) {\n if (!deny.has(k)) stable[k] = claims[k];\n }\n return canonical({ claims: stable, params: opts.connectionParams ?? {} });\n}\n\nexport function identityKeyFromToken(token: string, opts: IdentityKeyOptions = {}): string {\n return identityKeyFromClaims(decodeJwtPayload(token), opts);\n}\n\n/**\n * Tracks the current identity key and the global epoch. `observe()` with an unchanged key is a\n * no-op (token refreshes never churn); a changed key bumps the epoch synchronously and notifies\n * listeners BEFORE returning, so the store-root swap is part of the same synchronous operation.\n */\nexport class IdentityTracker {\n private key: string | null = null;\n private epochCounter = 0;\n private readonly listeners = new Set<(epoch: number, key: string | null) => void>();\n\n get epoch(): number {\n return this.epochCounter;\n }\n\n get currentKey(): string | null {\n return this.key;\n }\n\n observe(key: string | null): boolean {\n if (key === this.key) return false;\n this.key = key;\n this.epochCounter += 1;\n for (const l of this.listeners) l(this.epochCounter, key);\n return true;\n }\n\n /** A clear (hasSynced true → false) is an epoch signal even if the token is unchanged. */\n signalClear(): void {\n this.epochCounter += 1;\n for (const l of this.listeners) l(this.epochCounter, this.key);\n }\n\n onChange(l: (epoch: number, key: string | null) => void): () => void {\n this.listeners.add(l);\n return () => this.listeners.delete(l);\n }\n}\n","import { type BridgeClock, TimeoutError, withTimeout } from './clock';\nimport { streamKey } from './freshness';\nimport { cursorOfRow, idOf, isAfterCursor, rowComparator } from './keyset';\nimport { classifyRemovals } from './removal';\nimport { SnapshotStore, shallowEqualResult } from './store';\nimport type {\n Boundary,\n BoundaryReason,\n BridgeDriver,\n CursorOf,\n InfiniteListDefinition,\n InfiniteListResult,\n ListErrors,\n OrderKey,\n PagedRow,\n PartitionPolicy,\n QueryAdapter,\n RowDiff,\n StreamDescription,\n StreamHandle,\n} from './types';\n\nexport interface InfiniteDeps {\n readonly driver: BridgeDriver;\n readonly adapter: QueryAdapter;\n readonly clock: BridgeClock;\n readonly onEvicted?: ((ids: readonly string[]) => void) | undefined;\n}\n\ninterface Entry<TItem> {\n row: TItem;\n origin: 'local' | 'api';\n presentLocally: boolean;\n}\n\nconst EMPTY: InfiniteListResult<never> = Object.freeze({\n items: Object.freeze([]) as readonly never[],\n boundary: 'more',\n awaitingSync: false,\n loading: false,\n errors: Object.freeze({}),\n warnings: Object.freeze([]) as readonly string[],\n});\n\nexport function emptyInfiniteResult<T>(): InfiniteListResult<T> {\n return EMPTY as InfiniteListResult<T>;\n}\n\nconst DEFAULT_TTL = 300;\nconst DEFAULT_CAP = 3;\nconst DEFAULT_TIMEOUT = 15_000;\nconst DEFAULT_KEEP = 3;\n\n/**\n * The infinite list engine (§6.2): one global id set, a loaded-range local watch, and bounded\n * escalation through equality partitions or API pages.\n */\nexport class InfiniteListStore<TItem, TScope, K extends OrderKey<TItem>, TCursor, TPartition> {\n readonly store = new SnapshotStore<InfiniteListResult<TItem>>(emptyInfiniteResult<TItem>());\n\n private readonly compare: (a: TItem, b: TItem) => number;\n private readonly table: string;\n private readonly abort = new AbortController();\n\n private pages = 1;\n private local = new Map<string, TItem>();\n private lookahead = false;\n private emissionSeen = false;\n private localError: Error | undefined;\n private unsubDiffs: (() => void) | null = null;\n\n private readonly apiRows = new Map<string, TItem>();\n private readonly retained = new Map<string, TItem>();\n private readonly tombstones = new Set<string>();\n\n private readonly subs = new Map<string, StreamHandle>();\n private readonly lru: string[] = [];\n private probeCursor: TPartition | null = null;\n private serverFloor: TPartition | null | undefined = undefined; // undefined = not fetched yet\n private floorRevalidated = false;\n\n private boundary: Boundary = 'more';\n private reason: BoundaryReason | undefined;\n private awaitingSync = false;\n private loading = false;\n private localPagePending = false;\n private errors: ListErrors = {};\n private warnings: string[] = [];\n private errorCount = 0;\n private nextRetryAt = 0;\n\n private disposed = false;\n private refs = 0;\n\n constructor(\n private readonly deps: InfiniteDeps,\n private readonly def: InfiniteListDefinition<TItem, TScope, K, TCursor, TPartition>,\n private readonly scope: TScope,\n ) {\n this.compare = rowComparator<TItem>(def.orderKey, def.direction ?? 'asc');\n this.table = def.table ?? def.id;\n }\n\n retain(): void {\n this.refs += 1;\n if (this.refs === 1 && this.unsubDiffs === null) this.subscribeLocal();\n }\n\n release(): void {\n this.refs -= 1;\n if (this.refs <= 0) queueMicrotask(() => { if (this.refs <= 0) this.dispose(); });\n }\n\n get isDisposed(): boolean {\n return this.disposed || (this.refs <= 0 && this.unsubDiffs !== null);\n }\n\n swapRoot(): void {\n this.store.replace(emptyInfiniteResult<TItem>());\n this.disposed = true;\n }\n\n dispose(): void {\n this.disposed = true;\n this.abort.abort(new Error('disposed'));\n this.unsubDiffs?.();\n this.unsubDiffs = null;\n for (const h of this.subs.values()) h.unsubscribe();\n this.subs.clear();\n this.lru.length = 0;\n this.local.clear();\n this.apiRows.clear();\n this.retained.clear();\n this.tombstones.clear();\n this.store.replace(emptyInfiniteResult<TItem>());\n }\n\n // ---------------------------------------------------------------------------\n\n private subscribeLocal(): void {\n this.unsubDiffs?.();\n const limit = this.pages * this.def.pageSize + 1; // lookahead row\n const builder = this.def.query({ cursor: this.def.initialCursor as TCursor, limit }, this.scope);\n const prepared = this.deps.adapter.prepare(builder);\n this.unsubDiffs = this.deps.driver.diffs(prepared).subscribe(\n (diff) => void this.onDiff(diff),\n (err) => {\n this.localError = err;\n if (this.localPagePending) { this.localPagePending = false; this.loading = false; }\n this.render();\n },\n );\n }\n\n private async onDiff(diff: RowDiff<TItem>): Promise<void> {\n if (this.disposed) return;\n const prev = this.local;\n const next = new Map<string, TItem>();\n const window = this.pages * this.def.pageSize;\n const sorted = [...diff.all].sort(this.compare);\n this.lookahead = sorted.length > window;\n for (const row of sorted.slice(0, window)) {\n const id = idOf(row);\n next.set(id, row);\n this.tombstones.delete(id); // a re-added id retires a list-instance tombstone (R2)\n this.retained.delete(id);\n this.apiRows.delete(id); // local claims the id\n }\n this.local = next;\n this.localError = undefined;\n if (this.localPagePending) { this.localPagePending = false; this.loading = false; }\n this.emissionSeen = true;\n\n const removed = new Map<string, TItem>();\n for (const [id, row] of prev) if (!next.has(id)) removed.set(id, row);\n if (removed.size > 0) await this.applyRemovals(removed);\n this.render();\n }\n\n private provenance(row: TItem): StreamDescription | undefined {\n const pol = this.def.escalate;\n if (pol.kind !== 'partition') return undefined;\n const p = pol.partitionOf(cursorOfRow<TItem, K>(row, this.def.orderKey) as unknown as TCursor);\n if (p === null) return undefined;\n return { name: pol.stream, params: pol.partitionParams(p) };\n }\n\n private async applyRemovals(removed: ReadonlyMap<string, TItem>): Promise<void> {\n const classes = await classifyRemovals(\n { driver: this.deps.driver, clock: this.deps.clock, table: this.table, provenance: (r) => this.provenance(r), isInWindow: this.def.isInWindow },\n removed,\n );\n if (this.disposed) return;\n const evicted: string[] = [];\n for (const [id, cls] of classes) {\n const row = removed.get(id);\n if (!row) continue;\n switch (cls) {\n case 'filtered':\n break;\n case 'delete':\n this.tombstones.add(id);\n break;\n case 'eviction':\n case 'retain':\n this.retained.set(id, row);\n evicted.push(id);\n break;\n }\n }\n if (evicted.length > 0) this.deps.onEvicted?.(evicted); // once per emission\n }\n\n // ---------------------------------------------------------------------------\n\n private lastCursor(): TCursor {\n const all = this.mergedEntries();\n const last = all[all.length - 1];\n if (!last) return this.def.initialCursor as TCursor;\n return cursorOfRow<TItem, K>(last.row, this.def.orderKey) as unknown as TCursor;\n }\n\n /** Explicit user retry clears the backoff (R16). */\n retry(): Promise<void> {\n this.errorCount = 0;\n this.nextRetryAt = 0;\n return this.loadMore();\n }\n\n async loadMore(): Promise<void> {\n if (this.disposed || this.loading || this.boundary === 'end') return;\n if (this.lookahead) {\n this.localPagePending = true;\n this.loading = true;\n this.pages += 1;\n this.boundary = 'more';\n this.reason = undefined;\n this.subscribeLocal();\n this.render();\n return;\n }\n this.loading = true;\n this.render();\n try {\n const pol = this.def.escalate;\n if (pol.kind === 'partition') await this.escalatePartition(pol);\n else if (pol.kind === 'api') await this.escalateApi(pol.fetchPage);\n else await this.escalateOffset(pol.fetchPage);\n } finally {\n this.loading = false;\n this.awaitingSync = false;\n if (!this.disposed) this.render();\n }\n }\n\n private setUnknown(reason: BoundaryReason, err?: Error): void {\n this.boundary = 'unknown';\n this.reason = reason;\n if (err) this.errors = { ...this.errors, stream: err };\n }\n\n private async escalatePartition(pol: PartitionPolicy<TCursor, TPartition>): Promise<void> {\n // Gate: the SYNC socket, for PartitionPolicy only (R16).\n if (!this.deps.driver.syncStatus().connected) return this.setUnknown('offline');\n\n const isBefore = pol.isBefore ?? ((a: TPartition, b: TPartition) => (a as unknown as number | string) < (b as unknown as number | string));\n if (this.serverFloor === undefined && pol.serverFloor) {\n try {\n this.serverFloor = await pol.serverFloor();\n } catch {\n this.serverFloor = null;\n }\n }\n const floor = this.serverFloor ?? pol.floor;\n const cap = pol.partitionCap ?? DEFAULT_CAP;\n const timeoutMs = pol.timeoutMs ?? DEFAULT_TIMEOUT;\n\n // The cursor where escalation STARTED. Rows that land during the wait may already have\n // advanced the live cursor past them (diff emission racing the probe) — the probe must\n // look beyond the cursor we escalated from, never the moving one (F-006).\n const cursor = this.lastCursor();\n let p: TPartition | null;\n if (this.probeCursor !== null) {\n p = pol.nextPartition(this.probeCursor);\n if (p === null) return this.finishEnd(pol);\n } else {\n p = pol.partitionOf(cursor);\n }\n\n for (let probes = 0; ; probes++) {\n if (p === null || isBefore(p, floor)) return this.finishEnd(pol);\n if (probes === cap) return this.setUnknown('partition-cap');\n\n const params = pol.partitionParams(p);\n const key = streamKey({ name: pol.stream, params });\n let handle = this.subs.get(key);\n if (!handle) {\n handle = await this.deps.driver.syncStream(pol.stream, params, { ttl: pol.ttl ?? DEFAULT_TTL });\n this.track(key, handle);\n }\n this.awaitingSync = true;\n this.render();\n try {\n await withTimeout(this.deps.clock, handle.waitForFirstSync(this.abort.signal), timeoutMs, this.abort.signal);\n } catch (e) {\n if (this.disposed) return;\n this.untrack(key);\n return this.setUnknown(e instanceof TimeoutError ? 'timeout' : 'error', e instanceof Error ? e : undefined);\n }\n if (this.disposed) return;\n\n // Re-query beyond the escalation cursor: did rows land?\n const builder = this.def.query({ cursor, limit: this.def.pageSize + 1 }, this.scope);\n const rows = await this.deps.driver.query(this.deps.adapter.prepare(builder), this.abort.signal);\n if (rows.length > 0) {\n this.probeCursor = null;\n this.pages += 1;\n this.boundary = 'more';\n this.reason = undefined;\n this.subscribeLocal();\n return;\n }\n this.probeCursor = p; // proven empty\n this.untrack(key); // empty partitions hold buckets for nothing\n p = pol.nextPartition(p);\n }\n }\n\n private async finishEnd(pol: PartitionPolicy<TCursor, TPartition>): Promise<void> {\n // The floor is a lower bound: re-validate once before trusting 'end' (F3-013).\n if (!this.floorRevalidated && pol.serverFloor) {\n this.floorRevalidated = true;\n try {\n const fresh = await pol.serverFloor();\n if (fresh !== null && fresh !== this.serverFloor) {\n this.serverFloor = fresh;\n this.probeCursor = null;\n return this.escalatePartition(pol);\n }\n } catch {\n // keep the previous floor\n }\n }\n this.boundary = 'end';\n this.reason = undefined;\n }\n\n private track(key: string, handle: StreamHandle): void {\n this.subs.set(key, handle);\n this.lru.push(key);\n const keep = this.def.keepPagesAlive ?? DEFAULT_KEEP;\n while (this.lru.length > keep) {\n const old = this.lru.shift();\n if (old && old !== key) this.untrack(old);\n }\n }\n\n private untrack(key: string): void {\n const h = this.subs.get(key);\n if (h) h.unsubscribe();\n this.subs.delete(key);\n const i = this.lru.indexOf(key);\n if (i >= 0) this.lru.splice(i, 1);\n }\n\n private apiGate(): boolean {\n const now = this.deps.clock.now();\n if (now < this.nextRetryAt) {\n this.setUnknown('offline');\n return false;\n }\n return true;\n }\n\n private apiFailure(err: unknown): void {\n this.errorCount += 1;\n const backoff = Math.min(30_000, 1000 * 2 ** (this.errorCount - 1));\n this.nextRetryAt = this.deps.clock.now() + backoff;\n const e = err instanceof Error ? err : new Error(String(err));\n this.errors = { ...this.errors, api: e };\n this.setUnknown(this.deps.driver.onlineHint() === false ? 'offline' : 'error');\n }\n\n private async escalateApi(fetchPage: (cursor: TCursor, signal: AbortSignal) => Promise<readonly TItem[]>): Promise<void> {\n if (!this.apiGate()) return;\n try {\n const rows = await withTimeout(this.deps.clock, fetchPage(this.lastCursor(), this.abort.signal), this.deps.driver.onlineHint() === false ? 3000 : 30_000, this.abort.signal);\n this.absorbApi(rows);\n } catch (e) {\n if (!this.disposed) this.apiFailure(e);\n }\n }\n\n private async escalateOffset(fetchPage: (offset: number, signal: AbortSignal) => Promise<readonly TItem[]>): Promise<void> {\n if (!this.apiGate()) return;\n const offset = this.mergedEntries().length;\n try {\n const rows = await withTimeout(this.deps.clock, fetchPage(offset, this.abort.signal), 30_000, this.abort.signal);\n const cursor = this.lastCursor();\n // A page that overlaps rows we already hold, or that sorts before our cursor, means the\n // list shifted under the offset (live inserts). Duplicates are dropped; the shift is flagged.\n const shifted = rows.some(\n (r) =>\n this.local.has(idOf(r)) ||\n this.apiRows.has(idOf(r)) ||\n (cursor !== undefined && !isAfterCursor<TItem, K>(r, cursor as unknown as CursorOf<TItem, K>, this.def.orderKey, this.def.direction ?? 'asc')),\n );\n if (shifted && !this.warnings.includes('offset-shift')) this.warnings = [...this.warnings, 'offset-shift'];\n this.absorbApi(rows);\n } catch (e) {\n if (!this.disposed) this.apiFailure(e);\n }\n }\n\n private absorbApi(rows: readonly TItem[]): void {\n const { api: _previousApiError, ...remainingErrors } = this.errors;\n this.errors = remainingErrors;\n this.errorCount = 0;\n this.nextRetryAt = 0;\n let added = 0;\n for (const row of rows) {\n const id = idOf(row);\n if (this.local.has(id) || this.apiRows.has(id) || this.tombstones.has(id)) continue; // id-set dedupe (R13)\n this.apiRows.set(id, row);\n added += 1;\n }\n // API rows extend the loaded range too. Keep the local watch at least this wide, so a\n // later insert cannot push a previously loaded boundary row out of a one-page watch.\n const loadedPages = Math.max(this.pages, Math.ceil(this.mergedEntries().length / this.def.pageSize));\n if (loadedPages > this.pages) {\n this.pages = loadedPages;\n this.subscribeLocal();\n }\n if (rows.length === 0) {\n this.boundary = 'end';\n this.reason = undefined;\n } else {\n this.boundary = 'more';\n this.reason = undefined;\n }\n }\n\n // ---------------------------------------------------------------------------\n\n private mergedEntries(): Entry<TItem>[] {\n const entries: Entry<TItem>[] = [];\n for (const row of this.local.values()) entries.push({ row, origin: 'local', presentLocally: true });\n for (const [id, row] of this.retained) if (!this.local.has(id)) entries.push({ row, origin: 'local', presentLocally: false });\n for (const [id, row] of this.apiRows) if (!this.local.has(id) && !this.retained.has(id)) entries.push({ row, origin: 'api', presentLocally: false });\n entries.sort((a, b) => this.compare(a.row, b.row));\n return entries;\n }\n\n private render(): void {\n if (this.disposed) return;\n const items: PagedRow<TItem>[] = this.mergedEntries().map((e) => ({ row: e.row, origin: e.origin, presentLocally: e.presentLocally }));\n const errors: ListErrors = { ...this.errors };\n if (this.localError) errors.local = this.localError;\n const result: InfiniteListResult<TItem> = {\n items,\n boundary: this.boundary,\n ...(this.reason !== undefined ? { boundaryReason: this.reason } : {}),\n awaitingSync: this.awaitingSync,\n loading: this.loading,\n errors,\n warnings: this.warnings,\n };\n const prev = this.store.getSnapshot();\n if (shallowEqualResult(prev as unknown as Record<string, unknown>, result as unknown as Record<string, unknown>)) return;\n this.store.replace(result);\n }\n}\n","import { type BridgeClock, TimeoutError, withTimeout } from './clock';\nimport { SnapshotStore } from './store';\nimport type { BridgeDriver, OnDemandResult, Params, StreamHandle } from './types';\n\nexport interface OnDemandOptions {\n readonly ttl?: number;\n readonly priority?: 0 | 1 | 2 | 3;\n readonly timeoutMs?: number;\n}\n\n/**\n * The default \"pull one row\" primitive (§7, [DX]): a plain on-demand equality-parameter stream.\n * Held while retained; the TTL keeps rows warm after release.\n */\nexport class OnDemandStreamStore {\n readonly store = new SnapshotStore<OnDemandResult>({ status: 'subscribing' });\n private handle: StreamHandle | null = null;\n private readonly abort = new AbortController();\n private refs = 0;\n private disposed = false;\n\n constructor(\n private readonly driver: BridgeDriver,\n private readonly clock: BridgeClock,\n private readonly name: string,\n private readonly params: Params | null,\n private readonly opts: OnDemandOptions,\n ) {}\n\n retain(): void {\n this.refs += 1;\n if (this.refs === 1) void this.start();\n }\n\n release(): void {\n this.refs -= 1;\n if (this.refs <= 0) this.dispose();\n }\n\n get isDisposed(): boolean {\n return this.disposed;\n }\n\n swapRoot(): void {\n this.store.replace({ status: 'subscribing' });\n this.disposed = true;\n }\n\n dispose(): void {\n this.disposed = true;\n this.abort.abort(new Error('disposed'));\n this.handle?.unsubscribe();\n this.handle = null;\n }\n\n private async start(): Promise<void> {\n if (!this.driver.syncStatus().connected) {\n this.store.replace({ status: 'offline' });\n // still subscribe so it syncs when the socket returns\n }\n try {\n const opts: { ttl?: number; priority?: 0 | 1 | 2 | 3 } = {};\n if (this.opts.ttl !== undefined) opts.ttl = this.opts.ttl;\n if (this.opts.priority !== undefined) opts.priority = this.opts.priority;\n this.handle = await this.driver.syncStream(this.name, this.params, opts);\n if (this.disposed) {\n this.handle.unsubscribe();\n return;\n }\n if (this.driver.syncStatus().connected) this.store.replace({ status: 'syncing' });\n await withTimeout(this.clock, this.handle.waitForFirstSync(this.abort.signal), this.opts.timeoutMs ?? 15_000, this.abort.signal);\n if (!this.disposed) this.store.replace({ status: 'synced' });\n } catch (e) {\n if (this.disposed) return;\n if (e instanceof TimeoutError) this.store.replace({ status: this.driver.syncStatus().connected ? 'timeout' : 'offline' });\n else this.store.replace({ status: 'error', error: e instanceof Error ? e : new Error(String(e)) });\n }\n }\n}\n","import type { CheckpointCompletion, Clock, FreshnessTracker } from './freshness';\nimport type { BridgeDriver, CrudDelta, PendingOpRef } from './types';\n\nexport function refKey(table: string, id: string): string {\n return `${table}\\u0000${id}`;\n}\n\n/**\n * Snapshot-lifetime pending window (§5.2): SEEDED with the live set at requestedAt, then every\n * added AND completed ref observed until the snapshot retires. Never closed at consume.\n */\nexport class PendingWindow {\n private readonly refs = new Map<string, PendingOpRef>();\n private open = true;\n\n constructor(seed: Iterable<PendingOpRef>) {\n for (const r of seed) this.refs.set(refKey(r.table, r.id), r);\n }\n\n observe(delta: CrudDelta): void {\n if (!this.open) return;\n for (const r of delta.added) this.refs.set(refKey(r.table, r.id), r);\n for (const r of delta.completed) this.refs.set(refKey(r.table, r.id), r);\n }\n\n get(table: string, id: string): PendingOpRef | undefined {\n return this.refs.get(refKey(table, id));\n }\n\n close(): void {\n this.open = false;\n this.refs.clear();\n }\n}\n\n/**\n * Identity-scoped engine state (F6-001): the crud-delta mirror (livePending), the open snapshot\n * windows, and `recentlyAcked`. Created at engine init — before any list mounts — and replaced\n * wholesale on identity swap.\n */\nexport class CrudMirror {\n private readonly live = new Map<string, PendingOpRef>();\n private readonly recentlyAcked = new Map<string, { ref: PendingOpRef; ackedAt: number }>();\n private readonly windows = new Set<PendingWindow>();\n private readonly listeners = new Set<() => void>();\n private unsubCrud: (() => void) | null = null;\n private unsubCompletion: (() => void) | null = null;\n private seeded: Promise<void> | null = null;\n\n constructor(\n private readonly driver: BridgeDriver,\n private readonly freshness: FreshnessTracker,\n private readonly clock: Clock,\n ) {}\n\n start(): void {\n this.stop();\n this.live.clear();\n this.recentlyAcked.clear();\n for (const w of this.windows) w.close();\n this.windows.clear();\n this.unsubCrud = this.driver.onCrudChange((delta) => this.apply(delta));\n this.unsubCompletion = this.freshness.onCompletion((c) => this.retireAcked(c));\n this.seeded = this.resync();\n }\n\n stop(): void {\n this.unsubCrud?.();\n this.unsubCompletion?.();\n this.unsubCrud = null;\n this.unsubCompletion = null;\n }\n\n /** Resolves once the initial live set has been read. */\n ready(): Promise<void> {\n return this.seeded ?? Promise.resolve();\n }\n\n /** Re-read the queue and apply the difference as a delta (fallback trigger: every local diff emission). */\n async resync(): Promise<void> {\n const refs = await this.driver.pendingUploadIds();\n const next = new Map<string, PendingOpRef>();\n for (const r of refs) next.set(refKey(r.table, r.id), r);\n const added: PendingOpRef[] = [];\n const completed: PendingOpRef[] = [];\n for (const [k, r] of next) if (this.live.get(k)?.op !== r.op) added.push(r);\n for (const [k, r] of this.live) if (!next.has(k)) completed.push(r);\n if (added.length || completed.length) this.apply({ added, completed });\n }\n\n apply(delta: CrudDelta): void {\n const now = this.clock();\n for (const r of delta.added) this.live.set(refKey(r.table, r.id), r);\n for (const r of delta.completed) {\n const k = refKey(r.table, r.id);\n this.live.delete(k);\n this.recentlyAcked.set(k, { ref: r, ackedAt: now });\n }\n for (const w of this.windows) w.observe(delta);\n for (const l of this.listeners) l();\n }\n\n /** A ref retires only when a checkpoint whose STAMP ≥ ackTime completes (F5-001). */\n private retireAcked(c: CheckpointCompletion): void {\n if (c.stream !== null) return; // per-stream completions do not carry the whole write path\n let changed = false;\n for (const [k, v] of this.recentlyAcked) {\n if (c.stamp >= v.ackedAt) {\n this.recentlyAcked.delete(k);\n changed = true;\n }\n }\n if (changed) for (const l of this.listeners) l();\n }\n\n openWindow(): PendingWindow {\n const w = new PendingWindow(this.live.values());\n this.windows.add(w);\n return w;\n }\n\n closeWindow(w: PendingWindow): void {\n w.close();\n this.windows.delete(w);\n }\n\n /** The three-set union (R1). */\n pendingOp(table: string, id: string, window?: PendingWindow): PendingOpRef | undefined {\n const k = refKey(table, id);\n return this.live.get(k) ?? window?.get(table, id) ?? this.recentlyAcked.get(k)?.ref;\n }\n\n isLivePending(table: string, id: string): boolean {\n return this.live.has(refKey(table, id));\n }\n\n onChange(l: () => void): () => void {\n this.listeners.add(l);\n return () => this.listeners.delete(l);\n }\n}\n","import type { BridgeClock } from './clock';\nimport type { FreshnessTracker } from './freshness';\nimport { cursorOfRow, idOf, rowComparator } from './keyset';\nimport type { CrudMirror, PendingWindow } from './pending';\nimport { classifyRemovals } from './removal';\nimport type { SnapshotCache, SnapshotRecord } from './snapshots';\nimport { SnapshotStore, shallowEqualResult } from './store';\nimport type {\n BridgeDriver,\n ListErrors,\n ListState,\n MeasureSink,\n OrderKey,\n PagedRow,\n PreparedQuery,\n QueryAdapter,\n RaceMeasurement,\n RacedListDefinition,\n RacedListResult,\n RowDiff,\n} from './types';\n\nexport interface RacedDeps {\n readonly driver: BridgeDriver;\n readonly adapter: QueryAdapter;\n readonly crud: CrudMirror;\n readonly freshness: FreshnessTracker;\n readonly snapshots: SnapshotCache;\n readonly clock: BridgeClock;\n readonly epoch: number;\n readonly identityKey: string | null;\n readonly apiLegEnabled: boolean;\n readonly measure: MeasureSink | undefined;\n}\n\ninterface Snap<TItem> {\n readonly rows: Map<string, TItem>;\n readonly record: SnapshotRecord<unknown>;\n readonly window: PendingWindow;\n}\n\ninterface OverlayEntry<TItem> {\n row: TItem;\n origin: 'local' | 'api';\n presentLocally: boolean;\n}\n\nconst EMPTY_RESULT: RacedListResult<never> = Object.freeze({\n items: Object.freeze([]) as readonly never[],\n state: 'pending',\n awaiting: Object.freeze({ local: true, api: true }),\n errors: Object.freeze({}),\n});\n\nexport function emptyRacedResult<T>(): RacedListResult<T> {\n return EMPTY_RESULT as RacedListResult<T>;\n}\n\n/**\n * The raced list engine (§5.2). One instance per (epoch, definition, scope); ref-counted by hooks.\n */\nexport class RacedListStore<TItem, TScope, TApi, K extends OrderKey<TItem>> {\n readonly store = new SnapshotStore<RacedListResult<TItem>>(emptyRacedResult<TItem>());\n\n private readonly compare: (a: TItem, b: TItem) => number;\n private readonly table: string;\n private readonly abort = new AbortController();\n private readonly startedAt: number;\n\n private snap: Snap<TItem> | null = null;\n private snapPending = false;\n private snapError: Error | undefined;\n private snapWindow: PendingWindow | null = null;\n\n private local: Map<string, TItem> | null = null;\n private localError: Error | undefined;\n private emissionSeen = false;\n private readonly inSession = new Set<string>();\n private unsubDiffs: (() => void) | null = null;\n private unsubCrud: (() => void) | null = null;\n private unsubFresh: (() => void) | null = null;\n private prepared: PreparedQuery<TItem> | null = null;\n\n private owned = false;\n private overlay = new Map<string, OverlayEntry<TItem>>();\n private readonly tombstones = new Set<string>();\n\n private disposed = false;\n private refs = 0;\n private measured = false;\n private localMs: number | null = null;\n private apiMs: number | null = null;\n\n constructor(\n private readonly deps: RacedDeps,\n private readonly def: RacedListDefinition<TItem, TScope, TApi, K>,\n private readonly scope: TScope,\n private readonly scopeKey: string,\n ) {\n this.compare = rowComparator<TItem>(def.orderKey, def.direction ?? 'asc');\n this.table = def.table ?? def.id;\n this.startedAt = deps.clock.now();\n }\n\n retain(): void {\n this.refs += 1;\n if (this.refs === 1 && this.unsubDiffs === null) this.start();\n }\n\n release(): void {\n this.refs -= 1;\n if (this.refs <= 0) queueMicrotask(() => { if (this.refs <= 0) this.dispose(); });\n }\n\n get isDisposed(): boolean {\n return this.disposed || (this.refs <= 0 && this.unsubDiffs !== null);\n }\n\n /** Synchronous part of an identity swap: the snapshot becomes empty 'pending' at once (R15). */\n swapRoot(): void {\n this.store.replace(emptyRacedResult<TItem>());\n this.disposed = true;\n }\n\n dispose(): void {\n this.disposed = true;\n this.abort.abort(new Error('disposed'));\n this.unsubDiffs?.();\n this.unsubCrud?.();\n this.unsubFresh?.();\n if (this.snapWindow) this.deps.crud.closeWindow(this.snapWindow);\n this.snapWindow = null;\n this.local?.clear();\n this.local = null;\n this.snap = null;\n this.prepared = null;\n this.overlay.clear();\n this.inSession.clear();\n this.tombstones.clear();\n this.store.replace(emptyRacedResult<TItem>());\n }\n\n // ---------------------------------------------------------------------------\n\n private start(): void {\n const { driver, adapter, crud, freshness } = this.deps;\n const prepared: PreparedQuery<TItem> = adapter.prepare(this.def.query(this.scope));\n this.prepared = prepared;\n this.unsubDiffs = driver.diffs(prepared).subscribe(\n (diff) => void this.onDiff(diff),\n (err) => {\n this.localError = err;\n this.reconcile();\n },\n );\n this.unsubCrud = crud.onChange(() => this.reconcile());\n this.unsubFresh = freshness.onCompletion(() => void this.onCompletion());\n\n if (this.deps.apiLegEnabled) this.startApiLeg();\n this.reconcile();\n }\n\n private startApiLeg(): void {\n const { snapshots, crud } = this.deps;\n const staleTime = this.def.staleTime ?? 10 * 60_000;\n this.snapPending = true;\n // The window is opened at request time and seeded with the live set (F4-001).\n const window = crud.openWindow();\n this.snapWindow = window;\n const key = ['powersync-bridge', this.deps.identityKey, this.deps.epoch, this.def.id, this.scopeKey] as const;\n snapshots\n .fetch<TApi>(key, staleTime, (signal) => {\n const combined = new AbortController();\n const onAbort = () => combined.abort();\n signal.addEventListener('abort', onAbort, { once: true });\n this.abort.signal.addEventListener('abort', onAbort, { once: true });\n return this.def.fetchSnapshot(this.scope, combined.signal);\n })\n .then(\n (record) => {\n if (this.disposed) return;\n this.snapPending = false;\n this.apiMs = this.deps.clock.now() - this.startedAt;\n const rows = new Map<string, TItem>();\n for (const raw of record.rows) {\n const item = this.def.mapApi(raw);\n rows.set(idOf(item), item);\n }\n this.snap = { rows, record, window };\n this.reconcile();\n },\n (err: unknown) => {\n if (this.disposed) return;\n this.snapPending = false;\n this.snapError = err instanceof Error ? err : new Error(String(err));\n crud.closeWindow(window);\n this.snapWindow = null;\n this.reconcile();\n },\n );\n }\n\n /**\n * A checkpoint completed. Status events and diff emissions are separate SDK events with no\n * ordering guarantee; taking ownership on the stale local map would render the pre-checkpoint\n * value for one frame (fresh→old→fresh). Pre-ownership we re-query once, then reconcile.\n */\n private async onCompletion(): Promise<void> {\n if (this.disposed || this.owned || !this.prepared || !this.emissionSeen) {\n this.reconcile();\n return;\n }\n try {\n const rows = await this.deps.driver.query(this.prepared, this.abort.signal);\n if (this.disposed) return;\n const prev = this.local ?? new Map<string, TItem>();\n const next = new Map<string, TItem>();\n for (const row of rows) {\n const id = idOf(row);\n next.set(id, row);\n const before = prev.get(id);\n if ((before === undefined || JSON.stringify(before) !== JSON.stringify(row)) && !this.deps.crud.isLivePending(this.table, id)) {\n this.inSession.add(id);\n this.tombstones.delete(id);\n }\n }\n this.local = next;\n } catch {\n // keep the last emission; the diff stream will catch up\n }\n this.reconcile();\n }\n\n private async onDiff(diff: RowDiff<TItem>): Promise<void> {\n if (this.disposed) return;\n const { crud } = this.deps;\n const prev = this.local;\n const next = new Map<string, TItem>();\n for (const row of diff.all) next.set(idOf(row), row);\n\n if (this.emissionSeen) {\n // Rows added/updated by a diff with no live pending op arrived via sync: in-session (R4).\n for (const row of [...diff.added, ...diff.updated]) {\n const id = idOf(row);\n if (!crud.isLivePending(this.table, id)) this.inSession.add(id);\n this.tombstones.delete(id); // a re-added id retires a list-instance tombstone (R2)\n }\n }\n this.local = next;\n if (!this.emissionSeen) {\n this.emissionSeen = true;\n this.localMs = this.deps.clock.now() - this.startedAt;\n }\n\n // Re-read the queue on every local diff emission (F3-012): a write that matters produced one.\n void crud.resync();\n\n if (this.owned && prev) {\n const removed = new Map<string, TItem>();\n for (const id of diff.removed) {\n const row = prev.get(id);\n if (row) removed.set(id, row);\n }\n if (removed.size > 0) await this.applyRemovals(removed);\n }\n this.reconcile();\n }\n\n private async applyRemovals(removed: ReadonlyMap<string, TItem>): Promise<void> {\n const classes = await classifyRemovals(\n {\n driver: this.deps.driver,\n clock: this.deps.clock,\n table: this.table,\n provenance: () => this.def.stream,\n isInWindow: this.def.isInWindow,\n },\n removed,\n );\n if (this.disposed) return;\n for (const [id, cls] of classes) {\n const entry = this.overlay.get(id);\n switch (cls) {\n case 'filtered':\n this.overlay.delete(id);\n break;\n case 'delete':\n this.overlay.delete(id);\n this.tombstones.add(id);\n break;\n case 'eviction':\n case 'retain':\n if (entry) this.overlay.set(id, { ...entry, presentLocally: false });\n break;\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n\n private reconcile(): void {\n if (this.disposed) return;\n const result = this.owned ? this.renderOwned() : this.renderRace();\n const prev = this.store.getSnapshot();\n if (shallowEqualResult(prev as unknown as Record<string, unknown>, result as unknown as Record<string, unknown>)) return;\n this.store.replace(result);\n this.report(result);\n }\n\n private freshAt(): number {\n return this.deps.freshness.freshAtFor(this.def.stream);\n }\n\n private localFresh(): boolean {\n return this.emissionSeen && this.deps.freshness.isFresh(this.def.stream);\n }\n\n private tryTakeOwnership(): boolean {\n if (this.owned) return true;\n const apiFreshAt = this.snap?.record.fetchedAt ?? Number.NEGATIVE_INFINITY;\n if (!(this.localFresh() && this.freshAt() > apiFreshAt)) return false;\n // Ownership: local owns the list; S and its shields retire wholesale (R2, F4-005).\n this.owned = true;\n const local = this.local ?? new Map<string, TItem>();\n const overlay = new Map<string, OverlayEntry<TItem>>();\n for (const [id, row] of local) overlay.set(id, { row, origin: 'local', presentLocally: true });\n if (this.snap) {\n if (this.def.apiScopeSupersetOfLocal) {\n for (const [id, row] of this.snap.rows) {\n if (!overlay.has(id) && !this.tombstones.has(id)) overlay.set(id, { row, origin: 'api', presentLocally: false });\n }\n }\n this.deps.crud.closeWindow(this.snap.window);\n this.snapWindow = null;\n this.snap = null;\n }\n this.overlay = overlay;\n return true;\n }\n\n private renderOwned(): RacedListResult<TItem> {\n // Post-ownership: diffs apply directly; retained rows keep their presence flag.\n const local = this.local ?? new Map<string, TItem>();\n for (const [id, row] of local) {\n const e = this.overlay.get(id);\n if (e) {\n e.row = row;\n e.origin = 'local';\n e.presentLocally = true;\n } else if (!this.tombstones.has(id)) {\n this.overlay.set(id, { row, origin: 'local', presentLocally: true });\n }\n }\n const items = this.finalize(Array.from(this.overlay.values()));\n return this.build(items, 'converged', { local: false, api: false });\n }\n\n private renderRace(): RacedListResult<TItem> {\n if (this.tryTakeOwnership()) return this.renderOwned();\n\n const { crud } = this.deps;\n const S = this.snap;\n const local = this.local;\n const apiFreshAt = S?.record.fetchedAt ?? Number.NEGATIVE_INFINITY;\n const localFreshAt = this.freshAt();\n const apiFresher = apiFreshAt > localFreshAt;\n\n if (!S && !local) {\n return this.build([], 'pending', { local: !this.emissionSeen, api: this.snapPending });\n }\n if (!S && local && this.def.holdPending === 'pending' && this.snapPending) {\n return this.build([], 'pending', { local: false, api: true });\n }\n\n const entries: OverlayEntry<TItem>[] = [];\n const stale = !S; // rendered from local before any snapshot covered it (R12)\n const ids = new Set<string>([...(S?.rows.keys() ?? []), ...(local?.keys() ?? [])]);\n\n for (const id of ids) {\n const inLocal = local?.get(id);\n const inS = S?.rows.get(id);\n const pending = crud.pendingOp(this.table, id, S?.window);\n\n // 1. pending (three-set union): local state wins unconditionally (R1/R2)\n if (pending) {\n if (inLocal !== undefined) entries.push({ row: inLocal, origin: 'local', presentLocally: true });\n // DELETE absent locally → suppressed; INSERT/UPDATE filtered out locally → not rendered\n continue;\n }\n // 2. in both, not pending → the fresher source wins (R3)\n if (inLocal !== undefined && inS !== undefined) {\n entries.push(apiFresher ? { row: inS, origin: 'api', presentLocally: true } : { row: inLocal, origin: 'local', presentLocally: true });\n continue;\n }\n // 3. local-only, not pending\n if (inLocal !== undefined) {\n if (!S) {\n entries.push({ row: inLocal, origin: 'local', presentLocally: true });\n } else if (this.inSession.has(id)) {\n entries.push({ row: inLocal, origin: 'local', presentLocally: true }); // never quarantined (R4)\n } else if (apiFresher) {\n // pre-session row positively excluded by a fresh snapshot → QUARANTINE (R4)\n } else {\n entries.push({ row: inLocal, origin: 'local', presentLocally: true });\n }\n continue;\n }\n // 4. api-only, not tombstoned\n if (inS !== undefined && !this.tombstones.has(id)) {\n entries.push({ row: inS, origin: 'api', presentLocally: false });\n }\n }\n\n const items = this.finalize(entries, stale);\n const state: ListState = !S ? 'local' : !local ? 'api' : apiFresher ? 'api' : 'local';\n return this.build(items, state, { local: !this.emissionSeen, api: this.snapPending });\n }\n\n private finalize(entries: OverlayEntry<TItem>[], stale = false): PagedRow<TItem>[] {\n entries.sort((a, b) => this.compare(a.row, b.row));\n const limited = entries.slice(0, this.def.limit); // R7: the list is a window\n return limited.map((e) => (stale ? { row: e.row, origin: e.origin, presentLocally: e.presentLocally, stale: true } : { row: e.row, origin: e.origin, presentLocally: e.presentLocally }));\n }\n\n private build(items: PagedRow<TItem>[], state: ListState, awaiting: { local: boolean; api: boolean }): RacedListResult<TItem> {\n const errors: ListErrors = {};\n if (this.localError) errors.local = this.localError;\n if (this.snapError) errors.api = this.snapError;\n return { items, state, awaiting, errors };\n }\n\n private report(result: RacedListResult<TItem>): void {\n const sink = this.deps.measure;\n if (!sink) return;\n if (this.measured && result.state !== 'converged') return;\n if (result.state === 'pending') return;\n this.measured = true;\n const connectAt = this.deps.freshness.sessionConnectAtMs;\n const freshAt = this.deps.freshness.freshAtFor(this.def.stream);\n const m: RaceMeasurement = {\n list: this.def.id,\n winner: this.localMs !== null && (this.apiMs === null || this.localMs <= this.apiMs) ? 'local' : this.apiMs !== null ? 'api' : 'none',\n localMs: this.localMs,\n apiMs: this.apiMs,\n sessionFreshnessMs: connectAt !== null && Number.isFinite(freshAt) && freshAt >= connectAt ? this.deps.clock.now() - connectAt : null,\n rowsRendered: result.items.length,\n source: result.state,\n };\n sink(m);\n }\n\n /** The cursor of the last rendered row — used by raced × infinite composition (R13). */\n lastCursor(): ReturnType<typeof cursorOfRow<TItem, K>> | undefined {\n const items = this.store.getSnapshot().items;\n const last = items[items.length - 1];\n return last ? cursorOfRow<TItem, K>(last.row, this.def.orderKey) : undefined;\n }\n}\n","import type { BridgeClock } from './clock';\n\n/** Minimal TanStack QueryClient surface the bridge relies on (R11: fetchQuery + keying only). */\nexport interface MinimalQueryClient {\n fetchQuery<T>(opts: {\n queryKey: readonly unknown[];\n queryFn: (ctx: { signal: AbortSignal }) => Promise<T>;\n staleTime?: number;\n }): Promise<T>;\n}\n\nexport interface SnapshotRecord<TApi> {\n readonly rows: readonly TApi[];\n readonly asOf: string | undefined;\n readonly requestedAt: number;\n readonly fetchedAt: number;\n}\n\ninterface Entry<TApi> {\n requestedAt: number;\n promise: Promise<SnapshotRecord<TApi>>;\n result: SnapshotRecord<TApi> | null;\n controller: AbortController;\n}\n\n/**\n * One fetch per (identity epoch, queryKey, staleTime window) — mount-triggered only, never a\n * timer (R9). When a TanStack client is supplied it owns dedup + staleness; otherwise an\n * internal cache with identical semantics is used, so core keeps zero required dependencies.\n */\nexport class SnapshotCache {\n private readonly entries = new Map<string, Entry<unknown>>();\n\n constructor(\n private readonly clock: BridgeClock,\n private readonly queryClient: MinimalQueryClient | undefined,\n ) {}\n\n fetch<TApi>(\n key: readonly unknown[],\n staleTime: number,\n fetcher: (signal: AbortSignal) => Promise<{ rows: readonly TApi[]; asOf?: string }>,\n ): Promise<SnapshotRecord<TApi>> {\n const k = JSON.stringify(key);\n const now = this.clock.now();\n const existing = this.entries.get(k) as Entry<TApi> | undefined;\n if (existing && (existing.result === null || now - existing.result.fetchedAt < staleTime)) {\n return existing.promise;\n }\n // Bound completed snapshots across searches/windows. In-flight requests keep their abort path.\n for (const [entryKey, entry] of this.entries) {\n if (entry.result && now - entry.result.fetchedAt >= staleTime) this.entries.delete(entryKey);\n }\n if (this.entries.size >= 64) {\n for (const [entryKey, entry] of this.entries) {\n if (entry.result) { this.entries.delete(entryKey); break; }\n }\n }\n const controller = new AbortController();\n const run = async (signal: AbortSignal): Promise<SnapshotRecord<TApi>> => {\n const res = await fetcher(signal);\n return { rows: res.rows, asOf: res.asOf, requestedAt: now, fetchedAt: this.clock.now() };\n };\n const promise = this.queryClient\n ? this.queryClient.fetchQuery<SnapshotRecord<TApi>>({ queryKey: key, queryFn: ({ signal }) => run(signal), staleTime })\n : run(controller.signal);\n const entry: Entry<TApi> = { requestedAt: now, promise, result: null, controller };\n this.entries.set(k, entry as Entry<unknown>);\n promise.then(\n (r) => {\n entry.result = r;\n },\n () => {\n if (this.entries.get(k) === (entry as Entry<unknown>)) this.entries.delete(k);\n },\n );\n return promise;\n }\n\n /** Cancel every in-flight fetch under a key prefix (identity swap). */\n invalidate(key: readonly unknown[]): void {\n const encoded = JSON.stringify(key);\n this.entries.get(encoded)?.controller.abort(new Error('invalidated'));\n this.entries.delete(encoded);\n }\n\n /** Cancel every in-flight fetch under a key prefix (identity swap). */\n abortAll(prefix: readonly unknown[]): void {\n const p = JSON.stringify(prefix).slice(0, -1); // drop the closing bracket → prefix match\n for (const [k, e] of this.entries) {\n if (k.startsWith(p)) {\n e.controller.abort(new Error('identity changed'));\n this.entries.delete(k);\n }\n }\n }\n\n clear(): void {\n for (const e of this.entries.values()) e.controller.abort(new Error('cleared'));\n this.entries.clear();\n }\n}\n","import { type BridgeClock, realClock } from './clock';\nimport { type FlaggerConfig, AutoSyncFlagStore } from './flagger';\nimport { FreshnessTracker } from './freshness';\nimport { IdentityTracker, type IdentityKeyOptions, identityKeyFromClaims, identityKeyFromToken } from './identity';\nimport { InfiniteListStore } from './infinite';\nimport { type OnDemandOptions, OnDemandStreamStore } from './ondemand';\nimport { CrudMirror } from './pending';\nimport { RacedListStore } from './raced';\nimport { InfiniteQueryStore, infiniteQueryKey, type InfiniteQueryOptions } from './query';\nimport { type MinimalQueryClient, SnapshotCache } from './snapshots';\nimport { SnapshotStore } from './store';\nimport type {\n BridgeDriver,\n InfiniteListDefinition,\n MeasureSink,\n OrderKey,\n Params,\n QueryAdapter,\n RacedListDefinition,\n Store,\n} from './types';\n\nexport type Platform = 'web' | 'native';\nexport type RacePolicy = 'race' | 'local-first';\n\nexport interface PlatformGates {\n readonly native?: RacePolicy;\n readonly web?: RacePolicy;\n}\n\nexport interface BridgeOptions {\n readonly driver: BridgeDriver;\n readonly adapter: QueryAdapter;\n /** TanStack QueryClient — used for fetchQuery + keying only (R11). Optional. */\n readonly queryClient?: MinimalQueryClient;\n readonly platform?: Platform;\n /** Native defaults to local-first (R8); web to race. */\n readonly platformGates?: PlatformGates;\n readonly measure?: { readonly sink: MeasureSink };\n readonly identity?: IdentityKeyOptions;\n readonly clock?: BridgeClock;\n readonly onEvicted?: (listId: string, ids: readonly string[]) => void;\n}\n\n/** The shape of a PowerSync backend connector, structurally (no SDK import in core). */\nexport interface ConnectorLike {\n fetchCredentials(): Promise<{ token: string; endpoint?: string; expiresAt?: Date } | null>;\n uploadData(database: unknown): Promise<void>;\n}\n\ninterface Disposable {\n retain(): void;\n release(): void;\n swapRoot(): void;\n dispose(): void;\n readonly isDisposed: boolean;\n}\n\nfunction detectPlatform(): Platform {\n const nav = (globalThis as { navigator?: { product?: string } }).navigator;\n return nav?.product === 'ReactNative' ? 'native' : 'web';\n}\n\nfunction scopeKeyOf(scope: unknown): string {\n return JSON.stringify(scope ?? null);\n}\n\n/**\n * The bridge: one per app, created once in a plain module before login (§5.1 root object).\n * Owns the identity-scoped engine state (crud-delta mirror, recentlyAcked, freshness) from\n * creation — before any list mounts (F6-001).\n */\nexport class Bridge {\n readonly driver: BridgeDriver;\n readonly adapter: QueryAdapter;\n readonly platform: Platform;\n readonly clock: BridgeClock;\n /** Increments on every identity swap; hooks subscribe to re-acquire their stores. */\n readonly epochStore: Store<number>;\n readonly connectivity = new SnapshotStore<boolean | undefined>(undefined);\n\n private readonly identity = new IdentityTracker();\n private readonly freshness: FreshnessTracker;\n private readonly crud: CrudMirror;\n private readonly snapshots: SnapshotCache;\n private readonly epochSnapshot: SnapshotStore<number>;\n private readonly stores = new Map<string, Disposable>();\n private readonly gates: Required<PlatformGates>;\n private readonly measure: MeasureSink | undefined;\n private readonly identityOpts: IdentityKeyOptions;\n private readonly onEvicted: BridgeOptions['onEvicted'];\n private disposed = false;\n private readonly onNetwork = () => this.setOnline(globalThis.navigator?.onLine);\n\n constructor(opts: BridgeOptions) {\n this.driver = opts.driver;\n this.adapter = opts.adapter;\n this.clock = opts.clock ?? realClock;\n this.platform = opts.platform ?? detectPlatform();\n this.gates = { native: opts.platformGates?.native ?? 'local-first', web: opts.platformGates?.web ?? 'race' };\n this.measure = opts.measure?.sink;\n this.identityOpts = opts.identity ?? {};\n this.onEvicted = opts.onEvicted;\n this.epochSnapshot = new SnapshotStore<number>(0);\n this.epochStore = this.epochSnapshot;\n this.freshness = new FreshnessTracker(this.driver, () => this.clock.now());\n this.crud = new CrudMirror(this.driver, this.freshness, () => this.clock.now());\n this.snapshots = new SnapshotCache(this.clock, opts.queryClient);\n\n this.freshness.start(this.clock.now());\n this.crud.start();\n this.freshness.onClear(() => this.identity.signalClear());\n this.identity.onChange(() => this.swapEpoch());\n globalThis.addEventListener?.('online', this.onNetwork);\n globalThis.addEventListener?.('offline', this.onNetwork);\n }\n\n get epoch(): number {\n return this.identity.epoch;\n }\n\n get identityKey(): string | null {\n return this.identity.currentKey;\n }\n\n setOnline(online: boolean | undefined): void {\n this.connectivity.replace(online);\n }\n\n query<T extends { id: string }>(\n options: InfiniteQueryOptions<T>,\n ): InfiniteQueryStore<T> {\n const key = `query:${this.epoch}:${infiniteQueryKey(options)}`;\n return this.acquire(key, () => new InfiniteQueryStore({\n driver: this.driver, adapter: this.adapter, crud: this.crud,\n freshness: this.freshness, snapshots: this.snapshots, clock: this.clock,\n epoch: this.epoch, identityKey: this.identityKey, apiLegEnabled: true,\n measure: this.measure, connectivity: this.connectivity,\n }, options));\n }\n\n /** Resolves once the initial upload-queue read has landed (tests). */\n ready(): Promise<void> {\n return this.crud.ready();\n }\n\n // ---------------------------------------------------------------------------\n // Identity (R15, [DX])\n // ---------------------------------------------------------------------------\n\n /** Connect THROUGH the bridge so identity is derived from every token the connector produces. */\n wrapConnector<C extends ConnectorLike>(connector: C): C {\n const wrapped = Object.create(connector) as C;\n Object.defineProperty(wrapped, 'fetchCredentials', {\n value: async () => {\n const creds = await connector.fetchCredentials();\n if (creds?.token) this.identity.observe(identityKeyFromToken(creds.token, this.identityOpts));\n return creds;\n },\n configurable: true,\n writable: true,\n });\n Object.defineProperty(wrapped, 'uploadData', {\n value: (db: unknown) => connector.uploadData(db),\n configurable: true,\n writable: true,\n });\n return wrapped;\n }\n\n /** Escape hatch for scope that is not in the token. */\n setIdentity(scope: Record<string, unknown> | null): void {\n this.identity.observe(scope === null ? null : identityKeyFromClaims(scope, this.identityOpts));\n }\n\n /**\n * Identity swap (R15): bump the epoch AND swap every store's root to empty 'pending' in ONE\n * synchronous operation, then tear the rest down asynchronously.\n */\n private swapEpoch(): void {\n const outgoing = Array.from(this.stores.values());\n this.stores.clear();\n for (const s of outgoing) s.swapRoot(); // synchronous: no committed frame can see the old tenant\n this.epochSnapshot.replace(this.identity.epoch);\n // async teardown\n queueMicrotask(() => {\n this.snapshots.clear();\n for (const s of outgoing) s.dispose();\n this.freshness.start(this.clock.now());\n this.crud.start();\n });\n }\n\n // ---------------------------------------------------------------------------\n // Store acquisition (ref-counted; shared across components with the same key)\n // ---------------------------------------------------------------------------\n\n private acquire<T extends Disposable>(key: string, make: () => T): T {\n const existing = this.stores.get(key) as T | undefined;\n if (existing && !existing.isDisposed) return existing;\n const s = make();\n this.stores.set(key, s);\n return s;\n }\n\n private apiLegEnabled(): boolean {\n return this.gates[this.platform] === 'race';\n }\n\n raced<TItem, TScope, TApi, K extends OrderKey<TItem>>(\n def: RacedListDefinition<TItem, TScope, TApi, K>,\n scope: TScope,\n ): RacedListStore<TItem, TScope, TApi, K> {\n const scopeKey = scopeKeyOf(scope);\n const key = `raced:${this.epoch}:${def.id}:${scopeKey}`;\n return this.acquire(key, () =>\n new RacedListStore<TItem, TScope, TApi, K>(\n {\n driver: this.driver,\n adapter: this.adapter,\n crud: this.crud,\n freshness: this.freshness,\n snapshots: this.snapshots,\n clock: this.clock,\n epoch: this.epoch,\n identityKey: this.identityKey,\n apiLegEnabled: this.apiLegEnabled(),\n measure: this.measure,\n },\n def,\n scope,\n scopeKey,\n ),\n );\n }\n\n infinite<TItem, TScope, K extends OrderKey<TItem>, TCursor, TPartition>(\n def: InfiniteListDefinition<TItem, TScope, K, TCursor, TPartition>,\n scope: TScope,\n ): InfiniteListStore<TItem, TScope, K, TCursor, TPartition> {\n const key = `infinite:${this.epoch}:${def.id}:${scopeKeyOf(scope)}`;\n return this.acquire(key, () =>\n new InfiniteListStore<TItem, TScope, K, TCursor, TPartition>(\n {\n driver: this.driver,\n adapter: this.adapter,\n clock: this.clock,\n onEvicted: this.onEvicted ? (ids) => this.onEvicted?.(def.id, ids) : undefined,\n },\n def,\n scope,\n ),\n );\n }\n\n onDemand(name: string, params: Params | null, opts: OnDemandOptions = {}): OnDemandStreamStore {\n const key = `ondemand:${this.epoch}:${name}:${JSON.stringify(params)}`;\n return this.acquire(key, () => new OnDemandStreamStore(this.driver, this.clock, name, params, opts));\n }\n\n autoSync(config: FlaggerConfig, ids: readonly string[]): AutoSyncFlagStore {\n const key = `flag:${this.epoch}:${config.stream}:${JSON.stringify([...ids].sort())}`;\n return this.acquire(key, () => new AutoSyncFlagStore(this.driver, this.clock, config, ids));\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n globalThis.removeEventListener?.('online', this.onNetwork);\n globalThis.removeEventListener?.('offline', this.onNetwork);\n for (const s of this.stores.values()) s.dispose();\n this.stores.clear();\n this.snapshots.clear();\n this.freshness.stop();\n this.crud.stop();\n }\n}\n\nexport function createBridge(opts: BridgeOptions): Bridge {\n return new Bridge(opts);\n}\n","import type { InfiniteListDefinition, OrderKey, RacedListDefinition } from './types';\n\ntype RacedInput<TItem, TScope, TApi, K extends OrderKey<TItem>> = Omit<RacedListDefinition<TItem, TScope, TApi, K>, 'kind'>;\ntype InfiniteInput<TItem, TScope, K extends OrderKey<TItem>, TCursor, TPartition> = Omit<\n InfiniteListDefinition<TItem, TScope, K, TCursor, TPartition>,\n 'kind'\n>;\n\n/**\n * `TItem` is inferred from the query's awaited result (§8.1); `TApi` from `fetchSnapshot`.\n * Definitions close over the app's ORM instance; annotate the scope (and the page argument\n * for infinite lists) so the callback is not context-sensitive.\n */\nexport function defineRacedList<TItem, TScope, TApi, K extends OrderKey<TItem>>(\n input: RacedInput<TItem, TScope, TApi, K>,\n): RacedListDefinition<TItem, TScope, TApi, K> {\n return { kind: 'raced', ...input };\n}\n\nexport function defineInfiniteList<TItem, TScope, K extends OrderKey<TItem>, TCursor, TPartition = string>(\n input: InfiniteInput<TItem, TScope, K, TCursor, TPartition>,\n): InfiniteListDefinition<TItem, TScope, K, TCursor, TPartition> {\n return { kind: 'infinite', ...input };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/clock.ts","../src/keyset.ts","../src/removal.ts","../src/refresh.ts","../src/store.ts","../src/query.ts","../src/flagger.ts","../src/freshness.ts","../src/identity.ts","../src/infinite.ts","../src/ondemand.ts","../src/pending.ts","../src/raced.ts","../src/snapshots.ts","../src/bridge.ts","../src/define.ts"],"names":["entry"],"mappings":"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","file":"index.cjs","sourcesContent":["/** Injectable time so the engine is testable with virtual time. */\nexport interface BridgeClock {\n now(): number;\n /** Returns a cancel function. */\n setTimeout(fn: () => void, ms: number): () => void;\n}\n\nexport const realClock: BridgeClock = {\n now: () => Date.now(),\n setTimeout: (fn, ms) => {\n const h = setTimeout(fn, ms);\n return () => clearTimeout(h);\n },\n};\n\n/** Resolves after `ms` on the given clock; rejects if the signal aborts first. */\nexport function delay(clock: BridgeClock, ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason ?? new Error('aborted'));\n const cancel = clock.setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n cancel();\n reject(signal?.reason ?? new Error('aborted'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nexport class TimeoutError extends Error {\n override readonly name = 'TimeoutError';\n}\n\n/** Race a promise against a clock-based timeout. */\nexport async function withTimeout<T>(clock: BridgeClock, p: Promise<T>, ms: number, signal?: AbortSignal): Promise<T> {\n const holder: { cancel?: () => void } = {};\n const timeout = new Promise<never>((_, reject) => {\n holder.cancel = clock.setTimeout(() => reject(new TimeoutError(`timed out after ${ms}ms`)), ms);\n signal?.addEventListener('abort', () => reject(signal.reason ?? new Error('aborted')), { once: true });\n });\n try {\n return await Promise.race([p, timeout]);\n } finally {\n holder.cancel?.();\n }\n}\n","import type { CursorOf, KeyOf, OpaqueCursor, OrderKey, SortDirection } from './types';\n\n/** `id` is always the implicit tiebreaker (§8.3): a scalar key K is treated as [K, 'id']. */\nexport function keyColumns<T>(orderKey: OrderKey<T>): [KeyOf<T>, KeyOf<T>] {\n if (typeof orderKey === 'string') return [orderKey, 'id' as KeyOf<T>];\n return [orderKey[0], orderKey[1]];\n}\n\nexport function idOf(row: unknown): string {\n const r = row as { id?: unknown };\n if (r == null || r.id === undefined || r.id === null) {\n throw new Error('powersync-bridge: every row must have an `id`');\n }\n return String(r.id);\n}\n\nfunction compareValues(a: unknown, b: unknown): number {\n if (a === b) return 0;\n if (a === null || a === undefined) return 1; // nulls last\n if (b === null || b === undefined) return -1;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (typeof a === 'boolean' && typeof b === 'boolean') return Number(a) - Number(b);\n const sa = String(a);\n const sb = String(b);\n return sa < sb ? -1 : sa > sb ? 1 : 0;\n}\n\n/** Comparator over rows for the declared order key + direction. Byte order for strings (SQLite BINARY). */\nexport function rowComparator<T>(orderKey: OrderKey<T>, direction: SortDirection = 'asc'): (a: T, b: T) => number {\n const [k1, k2] = keyColumns(orderKey);\n const sign = direction === 'desc' ? -1 : 1;\n return (a, b) => {\n const c1 = compareValues((a as Record<string, unknown>)[k1], (b as Record<string, unknown>)[k1]);\n if (c1 !== 0) return c1 * sign;\n return compareValues((a as Record<string, unknown>)[k2], (b as Record<string, unknown>)[k2]) * sign;\n };\n}\n\n/** The cursor a row yields, in the definition's cursor shape. */\nexport function cursorOfRow<T, K extends OrderKey<T>>(row: T, orderKey: K): CursorOf<T, K> {\n const r = row as Record<string, unknown>;\n if (typeof orderKey === 'string') return r[orderKey] as CursorOf<T, K>;\n return [r[orderKey[0]], r[orderKey[1]]] as CursorOf<T, K>;\n}\n\n/** Whether `row` sorts strictly after `cursor` in the list's order (i.e. is \"beyond\" it). */\nexport function isAfterCursor<T, K extends OrderKey<T>>(\n row: T,\n cursor: CursorOf<T, K>,\n orderKey: K,\n direction: SortDirection = 'asc',\n): boolean {\n const [k1, k2] = keyColumns(orderKey);\n const r = row as Record<string, unknown>;\n const sign = direction === 'desc' ? -1 : 1;\n const [c1, c2] = typeof orderKey === 'string' ? [cursor, undefined] : (cursor as [unknown, unknown]);\n const d1 = compareValues(r[k1], c1) * sign;\n if (d1 !== 0) return d1 > 0;\n if (c2 === undefined) return false;\n return compareValues(r[k2], c2) * sign > 0;\n}\n\nfunction toBase64(s: string): string {\n if (typeof btoa === 'function') return btoa(unescape(encodeURIComponent(s)));\n return Buffer.from(s, 'utf8').toString('base64');\n}\n\nfunction fromBase64(s: string): string {\n if (typeof atob === 'function') return decodeURIComponent(escape(atob(s)));\n return Buffer.from(s, 'base64').toString('utf8');\n}\n\nexport function encodeCursor(cursor: unknown): OpaqueCursor {\n return toBase64(JSON.stringify(cursor)) as OpaqueCursor;\n}\n\nexport function decodeCursor<C>(opaque: OpaqueCursor): C {\n return JSON.parse(fromBase64(opaque)) as C;\n}\n","import type { BridgeClock } from './clock';\nimport type { BridgeDriver, StreamDescription } from './types';\n\n/**\n * Four-way removal taxonomy (§6.4):\n * filtered — row still exists locally, no longer matches the list query → drop, no tombstone\n * delete — absent, and its producing stream is still tracked before expiry → drop + tombstone\n * eviction — absent, and its stream is gone or past expiry → retain, presentLocally:false\n * retain — classification impossible (predicate threw) → retain\n */\nexport type RemovalClass = 'filtered' | 'delete' | 'eviction' | 'retain';\n\nexport interface RemovalContext<T> {\n readonly driver: BridgeDriver;\n readonly clock: BridgeClock;\n readonly table: string;\n /** Producing stream for a row, when known (partition escalation). */\n readonly provenance: (row: T) => StreamDescription | undefined;\n readonly isInWindow?: ((row: T) => boolean) | undefined;\n}\n\nconst PROBE_CHUNK = 500;\n\nexport async function probePresence(\n driver: BridgeDriver,\n table: string,\n ids: readonly string[],\n): Promise<Set<string>> {\n const present = new Set<string>();\n for (let i = 0; i < ids.length; i += PROBE_CHUNK) {\n const chunk = ids.slice(i, i + PROBE_CHUNK);\n const found = await driver.presentIds(table, chunk);\n for (const id of found) present.add(id);\n }\n return present;\n}\n\nexport async function classifyRemovals<T>(\n ctx: RemovalContext<T>,\n removed: ReadonlyMap<string, T>,\n): Promise<Map<string, RemovalClass>> {\n const out = new Map<string, RemovalClass>();\n const ids = Array.from(removed.keys());\n if (ids.length === 0) return out;\n\n // ONE batched probe per emission (R14).\n const present = await probePresence(ctx.driver, ctx.table, ids);\n const now = ctx.clock.now();\n const status = ctx.driver.syncStatus();\n\n for (const [id, row] of removed) {\n if (present.has(id)) {\n out.set(id, 'filtered');\n continue;\n }\n const stream = ctx.provenance(row);\n if (stream) {\n const st = status.forStream(stream);\n const tracked = st !== undefined;\n const beforeExpiry = st?.active === true || st?.expiresAt === null || (st?.expiresAt !== undefined && st.expiresAt !== null && now < st.expiresAt.getTime());\n out.set(id, tracked && beforeExpiry ? 'delete' : 'eviction');\n continue;\n }\n if (ctx.isInWindow) {\n try {\n out.set(id, ctx.isInWindow(row) ? 'delete' : 'eviction');\n } catch {\n out.set(id, 'retain'); // a throwing predicate is never a delete\n }\n continue;\n }\n // No provenance and no predicate: the row left the synced set while its (auto) stream is\n // live — treat as delete (drop). Retention would mask real deletes.\n out.set(id, 'delete');\n }\n return out;\n}\n","/** Collapse a burst into one read, with at most one follow-up for changes during that read. */\nexport class CoalescedRefresh {\n private revision = 0;\n private lifecycle = 0;\n private scheduled = false;\n private running = false;\n\n constructor(\n private readonly read: (isCurrent: () => boolean) => Promise<void>,\n private readonly settled: () => void,\n ) {}\n\n get pending(): boolean {\n return this.scheduled || this.running;\n }\n\n request(): void {\n this.revision += 1;\n if (this.pending) return;\n this.scheduled = true;\n const lifecycle = this.lifecycle;\n queueMicrotask(() => {\n if (lifecycle !== this.lifecycle) return;\n this.scheduled = false;\n void this.drain(lifecycle);\n });\n }\n\n /** Fence queued/late work without retaining results or preventing a later resume. */\n cancel(): void {\n this.lifecycle += 1;\n this.scheduled = false;\n this.running = false;\n }\n\n private async drain(lifecycle: number): Promise<void> {\n this.running = true;\n let revision: number;\n try {\n do {\n revision = this.revision;\n await this.read(() => lifecycle === this.lifecycle && revision === this.revision);\n } while (lifecycle === this.lifecycle && revision !== this.revision);\n } finally {\n if (lifecycle === this.lifecycle) {\n this.running = false;\n this.settled();\n }\n }\n }\n}\n\ninterface QueuedRead {\n run(): void;\n cancel(): void;\n}\n\n/** Checkpoint maintenance has one shared slot; first reads and pagination bypass it. */\nexport class BackgroundReads {\n private running = false;\n private readonly queue = new Set<QueuedRead>();\n\n run<T>(read: () => Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) return Promise.reject(signal.reason);\n return new Promise<T>((resolve, reject) => {\n const entry: QueuedRead = {\n cancel: () => {\n if (!this.queue.delete(entry)) return;\n signal.removeEventListener('abort', entry.cancel);\n reject(signal.reason);\n },\n run: () => {\n signal.removeEventListener('abort', entry.cancel);\n this.running = true;\n void Promise.resolve()\n .then(read)\n .then(resolve, reject)\n .finally(() => {\n this.running = false;\n this.drain();\n });\n },\n };\n signal.addEventListener('abort', entry.cancel, { once: true });\n this.queue.add(entry);\n this.drain();\n });\n }\n\n private drain(): void {\n if (this.running) return;\n const next = this.queue.values().next().value;\n if (!next) return;\n this.queue.delete(next);\n next.run();\n }\n}\n","import type { Store } from './types';\n\n/**\n * External store with a stable snapshot for useSyncExternalStore (R10/R11).\n * `replace()` swaps the snapshot and notifies once; `swapRoot()` is what an identity change\n * calls — it is synchronous, so no committed frame can observe the outgoing state (R15).\n */\nexport class SnapshotStore<S> implements Store<S> {\n private snapshot: S;\n private readonly listeners = new Set<() => void>();\n\n constructor(initial: S) {\n this.snapshot = initial;\n }\n\n // React invokes external-store callbacks as standalone functions.\n readonly getSnapshot = (): S => {\n return this.snapshot;\n };\n\n readonly subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n replace(next: S): void {\n if (Object.is(next, this.snapshot)) return;\n this.snapshot = next;\n for (const l of Array.from(this.listeners)) l();\n }\n\n get listenerCount(): number {\n return this.listeners.size;\n }\n}\n\n/** Shallow structural equality for result records so equal reconciles produce no re-render. */\nexport function shallowEqualResult(a: Record<string, unknown>, b: Record<string, unknown>): boolean {\n const ka = Object.keys(a);\n const kb = Object.keys(b);\n if (ka.length !== kb.length) return false;\n for (const k of ka) {\n const va = a[k];\n const vb = b[k];\n if (Array.isArray(va) && Array.isArray(vb)) {\n if (va.length !== vb.length) return false;\n for (let i = 0; i < va.length; i++) if (!Object.is(va[i], vb[i])) return false;\n continue;\n }\n if (va !== null && typeof va === 'object' && vb !== null && typeof vb === 'object') {\n if (!shallowEqualResult(va as Record<string, unknown>, vb as Record<string, unknown>)) return false;\n continue;\n }\n if (!Object.is(va, vb)) return false;\n }\n return true;\n}\n","import { withTimeout } from './clock';\nimport { idOf, keyColumns, rowComparator } from './keyset';\nimport type { PendingWindow } from './pending';\nimport type { RacedDeps } from './raced';\nimport { classifyRemovals } from './removal';\nimport { CoalescedRefresh } from './refresh';\nimport { SnapshotStore, shallowEqualResult } from './store';\nimport type { ListErrors, OrderKey, PagedRow, RowsBuilder, Store } from './types';\n\nexport interface QueryPage<T> {\n readonly cursor: T | undefined;\n readonly limit: number;\n}\n\n/** Query keys include every predicate, identity and permission that can change the result. */\nexport interface InfiniteQueryOptions<T extends { id: string }> {\n readonly queryKey: readonly unknown[];\n readonly query: (page: QueryPage<T>) => RowsBuilder<T>;\n /** Return rows in the same order as SQLite. Honor limit, including its lookahead row. */\n readonly fetchPage: (\n page: QueryPage<T> & { readonly signal: AbortSignal },\n ) => Promise<readonly T[]>;\n readonly orderBy: OrderKey<T>;\n readonly direction?: 'asc' | 'desc';\n readonly pageSize?: number;\n readonly maxRows?: number;\n readonly staleTime?: number;\n readonly enabled?: boolean;\n readonly table?: string;\n /** Heterogeneous feeds identify each underlying business row for pending-write protection. */\n readonly getRowIdentity?: (row: T) => { table: string; id: string };\n readonly isInWindow?: (row: T) => boolean;\n}\n\n/** Shared by core and React so changing page configuration cannot reuse an incompatible store. */\nexport const infiniteQueryKey = <T extends { id: string }>(\n options: InfiniteQueryOptions<T>,\n): string =>\n JSON.stringify([\n options.queryKey,\n options.orderBy,\n options.direction ?? 'desc',\n options.pageSize ?? 25,\n options.maxRows ?? 500,\n options.enabled !== false,\n ]);\n\nexport interface InfiniteQueryResult<T> {\n readonly data: T[];\n readonly items: readonly PagedRow<T>[];\n readonly isLoading: boolean;\n readonly isFetching: boolean;\n readonly isFetchingNextPage: boolean;\n readonly hasNextPage: boolean;\n readonly needsOlderWindow: boolean;\n readonly error: Error | undefined;\n readonly errors: ListErrors;\n readonly isError: boolean;\n readonly windowRevision: number;\n}\n\nexport class OfflineError extends Error {\n override readonly name = 'OfflineError';\n constructor() {\n super('Additional records require a connection.');\n }\n}\n\ninterface Page<T> {\n cursor: T | undefined;\n rows: readonly T[];\n end: boolean;\n fetchedAt: number;\n window: PendingWindow;\n}\n\nexport interface QueryDeps extends RacedDeps {\n readonly connectivity: Store<boolean | undefined>;\n}\n\n/** One loaded-range watch and one ordered API cursor chain. Every requested page races both. */\nexport class InfiniteQueryStore<T extends { id: string }> {\n readonly store: SnapshotStore<InfiniteQueryResult<T>>;\n private readonly pageSize: number;\n private readonly maxRows: number;\n private readonly compare: (a: T, b: T) => number;\n private table: string | undefined;\n private target: number;\n private anchor: T | undefined;\n private revision = 0;\n private local = new Map<string, T>();\n private readonly retained = new Map<string, T>();\n private readonly tombstones = new Set<string>();\n private readonly filtered = new Set<string>();\n private readonly inSession = new Set<string>();\n private pages: Page<T>[] = [];\n private localPending = true;\n private localStamp = Number.NEGATIVE_INFINITY;\n private localError: Error | undefined;\n private apiError: Error | undefined;\n private apiPending = false;\n private apiFailed = false;\n private offline: boolean;\n private generation = 0;\n private watchGeneration = 0;\n private lastLocalWatch = 0;\n private refs = 0;\n private activeRefs = 0;\n private readonly checkpointRefresh: CoalescedRefresh;\n private localAbort = new AbortController();\n private ready = false;\n private disposed = false;\n private unwatch: (() => void) | undefined;\n private stops: (() => void)[] = [];\n private request: AbortController | undefined;\n private requestKey: readonly unknown[] | undefined;\n\n constructor(\n private readonly deps: QueryDeps,\n private readonly options: InfiniteQueryOptions<T>,\n ) {\n this.pageSize = options.pageSize ?? 25;\n this.maxRows = options.maxRows ?? 500;\n if (\n !Number.isInteger(this.pageSize) ||\n this.pageSize < 1 ||\n !Number.isInteger(this.maxRows) ||\n this.maxRows < this.pageSize\n )\n throw new Error(\n 'powersync-bridge: pageSize must be positive and maxRows must be at least pageSize',\n );\n this.target = this.pageSize;\n this.compare = rowComparator(options.orderBy, options.direction ?? 'desc');\n this.table = options.table;\n this.offline = this.readOffline();\n this.store = new SnapshotStore(this.result());\n this.checkpointRefresh = new CoalescedRefresh(\n (isCurrent) => this.checkpoint(isCurrent),\n () => this.render(),\n );\n }\n\n get isDisposed(): boolean {\n return this.disposed || (this.refs <= 0 && this.unwatch !== undefined);\n }\n retain(active = true): void {\n this.refs += 1;\n if (active) this.activeRefs += 1;\n if (this.activeRefs <= 0 || this.unwatch || this.options.enabled === false || this.disposed)\n return;\n this.offline = this.readOffline();\n this.apiFailed = false;\n this.apiError = undefined;\n this.stops = [\n this.deps.crud.onChange(() => this.render()),\n this.deps.freshness.onCompletion((completion) => {\n if (completion.stream === null) this.checkpointRefresh.request();\n }),\n this.deps.driver.onStatusChanged(() => this.networkChanged()),\n this.deps.connectivity.subscribe(() => this.networkChanged()),\n ];\n this.watch();\n void this.deps.crud\n .ready()\n .then(() => {\n this.ready = true;\n this.pump();\n })\n .catch((error: unknown) => {\n if (this.disposed) return;\n this.localPending = false;\n this.localError = error instanceof Error ? error : new Error(String(error));\n this.render();\n });\n }\n release(active = true): void {\n this.refs -= 1;\n if (active) this.activeRefs -= 1;\n queueMicrotask(() => {\n if (this.refs <= 0) this.dispose();\n else if (this.activeRefs <= 0) this.pause();\n });\n }\n swapRoot(): void {\n this.disposed = true;\n this.local.clear();\n this.retained.clear();\n this.clearPages();\n this.render(true);\n }\n dispose(): void {\n this.disposed = true;\n this.pause();\n this.clearPages();\n this.local.clear();\n this.retained.clear();\n this.tombstones.clear();\n this.filtered.clear();\n this.inSession.clear();\n this.render(true);\n }\n private pause(): void {\n this.generation += 1;\n this.watchGeneration += 1;\n this.checkpointRefresh.cancel();\n this.localAbort.abort();\n this.cancelRequest();\n this.request = undefined;\n this.apiPending = false;\n this.unwatch?.();\n this.unwatch = undefined;\n for (const stop of this.stops) stop();\n this.stops = [];\n }\n\n private readOffline(): boolean {\n return (this.deps.connectivity.getSnapshot() ?? this.deps.driver.onlineHint()) === false;\n }\n private cancelRequest(): void {\n this.request?.abort();\n if (this.requestKey) this.deps.snapshots.invalidate(this.requestKey);\n this.requestKey = undefined;\n }\n private networkChanged(): void {\n if (this.disposed) return;\n const offline = this.readOffline();\n const reconnect = this.offline && !offline;\n this.offline = offline;\n if (offline && this.request) {\n this.cancelRequest();\n this.generation += 1;\n this.apiPending = false;\n this.request = undefined;\n this.watch();\n }\n if (reconnect) {\n this.apiFailed = false;\n this.apiError = undefined;\n this.pump();\n }\n this.render();\n }\n private identity(row: T): { table: string; id: string } {\n if (this.options.getRowIdentity) return this.options.getRowIdentity(row);\n if (!this.table)\n throw new Error(\n 'powersync-bridge: provide table or getRowIdentity when the adapter cannot infer the business table',\n );\n return { table: this.table, id: idOf(row) };\n }\n private pending(row: T): boolean {\n const { table, id } = this.identity(row);\n return Boolean(\n this.deps.crud.pendingOp(table, id) ||\n this.pages.some((page) => this.deps.crud.pendingOp(table, id, page.window)),\n );\n }\n private localBuilder(): RowsBuilder<T> {\n return this.options.query({ cursor: this.anchor, limit: this.target + 1 });\n }\n private watch(): void {\n if (this.activeRefs <= 0 || this.disposed) return;\n this.unwatch?.();\n this.localAbort.abort();\n this.localAbort = new AbortController();\n this.checkpointRefresh.cancel();\n const token = ++this.watchGeneration;\n const generation = this.generation;\n this.localPending = true;\n let prepared;\n try {\n prepared = this.deps.adapter.prepare(this.localBuilder());\n if (!this.table && prepared.tables.length === 1) this.table = prepared.tables[0];\n if (!this.table && !this.options.getRowIdentity)\n throw new Error(\n 'powersync-bridge: provide table or getRowIdentity when the adapter cannot infer the business table',\n );\n } catch (error) {\n this.localPending = false;\n this.localError = error instanceof Error ? error : new Error(String(error));\n this.render();\n return;\n }\n this.unwatch = this.deps.driver.diffs(prepared).subscribe(\n (diff) => {\n void this.acceptLocal(diff.all, token, generation).catch((error: unknown) => {\n if (token !== this.watchGeneration || generation !== this.generation || this.disposed)\n return;\n this.localPending = false;\n this.localError = error instanceof Error ? error : new Error(String(error));\n this.render();\n });\n },\n (error) => {\n if (token !== this.watchGeneration || generation !== this.generation || this.disposed)\n return;\n this.localPending = false;\n this.localError = error;\n this.render();\n },\n );\n this.render();\n }\n private async acceptLocal(\n rows: readonly T[],\n token: number,\n generation: number,\n stamp = this.deps.freshness.freshAtFor(undefined),\n isCurrent: () => boolean = () => true,\n ): Promise<void> {\n await this.deps.crud.resync();\n if (\n token !== this.watchGeneration ||\n generation !== this.generation ||\n this.disposed ||\n !isCurrent()\n )\n return;\n const previous = this.local;\n const firstEmission = this.lastLocalWatch !== token;\n this.lastLocalWatch = token;\n const next = new Map(rows.map((row) => [idOf(row), row]));\n const removed = new Map<string, T>();\n for (const [id, row] of previous)\n if (!next.has(id)) {\n removed.set(id, row);\n this.tombstones.add(id);\n }\n for (const [id, row] of next) {\n if (\n previous.size &&\n (!firstEmission || previous.has(id)) &&\n JSON.stringify(previous.get(id)) !== JSON.stringify(row) &&\n !this.pending(row)\n )\n this.inSession.add(id);\n this.tombstones.delete(id);\n this.filtered.delete(id);\n this.retained.delete(id);\n }\n this.local = next;\n this.localPending = false;\n this.localError = undefined;\n this.localStamp = stamp;\n this.render();\n // Probe by business table, including heterogeneous feeds whose display IDs are composite.\n const groups = new Map<string, Map<string, T>>();\n for (const row of removed.values()) {\n const identity = this.identity(row);\n const group = groups.get(identity.table) ?? new Map<string, T>();\n group.set(identity.id, row);\n groups.set(identity.table, group);\n }\n try {\n for (const [table, group] of groups) {\n const classes = await classifyRemovals(\n {\n driver: this.deps.driver,\n clock: this.deps.clock,\n table,\n provenance: () => undefined,\n isInWindow: this.options.isInWindow,\n },\n group,\n );\n if (token !== this.watchGeneration || generation !== this.generation || this.disposed)\n return;\n for (const row of removed.values()) {\n const identity = this.identity(row);\n if (identity.table !== table || this.local.has(row.id)) continue;\n const classification = classes.get(identity.id);\n if (!classification) continue;\n if (classification === 'delete') this.tombstones.add(row.id);\n else if (classification === 'filtered') {\n this.tombstones.delete(row.id);\n this.filtered.add(row.id);\n } else {\n this.tombstones.delete(row.id);\n this.retained.set(row.id, row);\n }\n }\n }\n } catch (error) {\n // A failed presence probe must not resurrect a deleted or filtered API row.\n if (token !== this.watchGeneration || generation !== this.generation || this.disposed) return;\n this.localError = error instanceof Error ? error : new Error(String(error));\n }\n const retained = [...this.retained.values()].sort(this.compare).slice(0, this.maxRows);\n this.retained.clear();\n for (const row of retained) this.retained.set(row.id, row);\n const known = new Set([\n ...this.local.keys(),\n ...this.retained.keys(),\n ...this.pages.flatMap((page) => page.rows.map((row) => row.id)),\n ]);\n for (const set of [this.inSession, this.tombstones, this.filtered]) {\n if (set.size > this.maxRows * 4) for (const id of set) if (!known.has(id)) set.delete(id);\n }\n this.render();\n }\n private async checkpoint(isCurrent: () => boolean): Promise<void> {\n if (this.disposed || !this.unwatch || this.activeRefs <= 0) return;\n const token = this.watchGeneration;\n const generation = this.generation;\n const stamp = this.deps.freshness.freshAtFor(undefined);\n try {\n const signal = this.localAbort.signal;\n const read = () =>\n isCurrent()\n ? this.deps.driver.query(this.deps.adapter.prepare(this.localBuilder()), signal)\n : Promise.resolve(undefined);\n const rows = await (this.deps.backgroundReads\n ? this.deps.backgroundReads.run(read, signal)\n : read());\n if (!rows) return;\n if (!isCurrent()) return;\n await this.acceptLocal(rows, token, generation, stamp, isCurrent);\n } catch (error) {\n if (\n token !== this.watchGeneration ||\n generation !== this.generation ||\n this.disposed ||\n !isCurrent()\n )\n return;\n this.localError = error instanceof Error ? error : new Error(String(error));\n this.render();\n }\n }\n private clearPages(): void {\n for (const page of this.pages) this.deps.crud.closeWindow(page.window);\n this.pages = [];\n }\n private apiEnd(): boolean {\n return this.pages.at(-1)?.end === true;\n }\n private apiCount(): number {\n return this.pages.reduce((count, page) => count + page.rows.length, 0);\n }\n private apiCursor(): T | undefined {\n const last = this.pages.at(-1)?.rows.at(-1);\n return last ? last : this.anchor;\n }\n private cursorKey(row: T | undefined): readonly unknown[] | undefined {\n if (!row) return undefined;\n const [first, second] = keyColumns(this.options.orderBy);\n return [row[first], row[second]];\n }\n private pump(): void {\n if (\n !this.ready ||\n this.activeRefs <= 0 ||\n this.disposed ||\n this.options.enabled === false ||\n this.offline ||\n this.apiPending ||\n this.apiFailed ||\n this.apiEnd()\n )\n return;\n if (!this.table && !this.options.getRowIdentity) return;\n if (this.pages.length >= Math.ceil(this.maxRows / this.pageSize) + 1) return;\n if (this.apiCount() >= this.target && this.entries().length >= this.target) return;\n const cursor = this.apiCursor();\n const generation = this.generation;\n const request = new AbortController();\n this.request = request;\n const window = this.deps.crud.openWindow();\n this.apiPending = true;\n this.render();\n const key = [\n 'powersync-bridge.query',\n this.deps.identityKey,\n this.deps.epoch,\n infiniteQueryKey(this.options),\n this.cursorKey(this.anchor),\n this.revision,\n generation,\n this.cursorKey(cursor),\n ];\n this.requestKey = key;\n void this.deps.snapshots\n .fetch<T>(key, this.options.staleTime ?? 60_000, async (signal) => {\n const abort = () => request.abort();\n signal.addEventListener('abort', abort, { once: true });\n try {\n return await withTimeout(\n this.deps.clock,\n this.options\n .fetchPage({ cursor, limit: this.pageSize + 1, signal: request.signal })\n .then((rows) => ({ rows })),\n 30_000,\n request.signal,\n );\n } finally {\n signal.removeEventListener('abort', abort);\n }\n })\n .then((record) => {\n if (this.disposed || generation !== this.generation || request.signal.aborted) {\n this.deps.crud.closeWindow(window);\n return;\n }\n const rows = [...record.rows];\n for (let index = 1; index < rows.length; index++) {\n const before = rows[index - 1];\n const row = rows[index];\n if (before && row && this.compare(before, row) >= 0)\n throw new Error(\n 'powersync-bridge: API rows must use a strict, stable order with an id tiebreaker',\n );\n }\n if (cursor !== undefined && rows.some((row) => this.compare(row, cursor) <= 0))\n throw new Error('powersync-bridge: API page must advance beyond the supplied cursor');\n this.pages.push({\n cursor,\n rows: rows.slice(0, this.pageSize),\n end: rows.length <= this.pageSize,\n fetchedAt: record.fetchedAt,\n window,\n });\n this.apiError = undefined;\n })\n .catch((error: unknown) => {\n this.deps.crud.closeWindow(window);\n if (this.disposed || generation !== this.generation || request.signal.aborted) return;\n this.apiFailed = true;\n this.apiError = error instanceof Error ? error : new Error(String(error));\n request.abort();\n })\n .finally(() => {\n if (generation !== this.generation || this.disposed) return;\n this.apiPending = false;\n this.request = undefined;\n this.requestKey = undefined;\n this.render();\n this.pump();\n });\n }\n\n private entries(): PagedRow<T>[] {\n const api = new Map<string, { row: T; page: Page<T> }>();\n for (const page of this.pages) for (const row of page.rows) api.set(row.id, { row, page });\n const ids = new Set([...this.local.keys(), ...this.retained.keys(), ...api.keys()]);\n const entries: PagedRow<T>[] = [];\n for (const id of ids) {\n if (this.tombstones.has(id) || this.filtered.has(id)) continue;\n const local = this.local.get(id);\n const remote = api.get(id);\n const row = local ?? remote?.row ?? this.retained.get(id);\n if (!row) continue;\n if (this.pending(row)) {\n if (local) entries.push({ row: local, origin: 'local', presentLocally: true });\n continue;\n }\n if (remote) {\n entries.push(\n local && this.localStamp > remote.page.fetchedAt\n ? { row: local, origin: 'local', presentLocally: true }\n : { row: remote.row, origin: 'api', presentLocally: Boolean(local) },\n );\n } else if (local) {\n const covering = this.pages.find((page) => {\n if (page.cursor !== undefined && this.compare(local, page.cursor) <= 0) return false;\n const last = page.rows.at(-1);\n return page.end || Boolean(last && this.compare(local, last) <= 0);\n });\n if (!covering || this.inSession.has(id) || this.localStamp > covering.fetchedAt)\n entries.push({ row: local, origin: 'local', presentLocally: true });\n } else entries.push({ row, origin: 'local', presentLocally: false });\n }\n return entries.sort((a, b) => this.compare(a.row, b.row));\n }\n private result(empty = false): InfiniteQueryResult<T> {\n const enabled = !empty && this.options.enabled !== false;\n const entries = enabled ? this.entries() : [];\n const items = entries.slice(0, this.target);\n const more = entries.length > this.target || !this.apiEnd();\n const missing = items.length < this.target;\n const errors: ListErrors = {};\n if (this.localError) errors.local = this.localError;\n if (this.apiError) errors.api = this.apiError;\n const offlineError =\n this.offline && missing && !this.localPending ? new OfflineError() : undefined;\n const error =\n enabled && missing && !this.localPending && !this.apiPending\n ? (this.localError ?? this.apiError ?? offlineError)\n : undefined;\n return {\n data: items.map((item) => item.row),\n items,\n isLoading: enabled && items.length === 0 && !error && (this.localPending || this.apiPending),\n isFetching: enabled && (this.localPending || this.apiPending),\n isFetchingNextPage:\n enabled && this.target > this.pageSize && (this.localPending || this.apiPending),\n hasNextPage: enabled && this.target < this.maxRows && more,\n needsOlderWindow: enabled && items.length >= this.maxRows && more,\n error,\n errors,\n isError: Boolean(error),\n windowRevision: this.revision,\n };\n }\n private render(empty = false): void {\n if (this.disposed && !empty) return;\n const result = this.result(empty);\n if (\n !shallowEqualResult(\n this.store.getSnapshot() as unknown as Record<string, unknown>,\n result as unknown as Record<string, unknown>,\n )\n )\n this.store.replace(result);\n }\n readonly fetchNextPage = (): void => {\n if (\n this.disposed ||\n this.activeRefs <= 0 ||\n this.options.enabled === false ||\n this.target >= this.maxRows\n )\n return;\n if (!this.store.getSnapshot().hasNextPage) return;\n this.target = Math.min(this.target + this.pageSize, this.maxRows);\n this.watch();\n this.pump();\n };\n readonly retry = (): void => {\n if (this.disposed || this.activeRefs <= 0 || this.options.enabled === false) return;\n this.apiFailed = false;\n this.apiError = undefined;\n this.watch();\n this.pump();\n };\n readonly refresh = (): void => {\n this.reset(this.anchor);\n };\n readonly continueOlder = (): void => {\n const last = this.store.getSnapshot().data.at(-1);\n if (last) this.reset(last);\n };\n private reset(anchor: T | undefined): void {\n if (this.disposed || this.activeRefs <= 0 || this.options.enabled === false) return;\n this.generation += 1;\n this.cancelRequest();\n this.request = undefined;\n this.apiPending = false;\n this.apiFailed = false;\n this.apiError = undefined;\n this.localError = undefined;\n this.clearPages();\n this.local.clear();\n this.retained.clear();\n this.inSession.clear();\n this.tombstones.clear();\n this.filtered.clear();\n this.target = this.pageSize;\n this.anchor = anchor;\n this.revision += 1;\n this.watch();\n this.pump();\n }\n}\n","import type { BridgeClock } from './clock';\nimport { probePresence } from './removal';\nimport { SnapshotStore } from './store';\nimport type { BridgeDriver, StreamHandle } from './types';\n\nexport type FlagState = 'idle' | 'flagging' | 'syncing' | 'synced' | 'timeout' | 'error';\n\nexport interface FlaggerConfig {\n /** App-supplied backend call, e.g. POST /sync/flag. */\n readonly requestFlag: (ids: readonly string[]) => Promise<void>;\n /** Stream whose JOIN reads the per-user sync_requests table. */\n readonly stream: string;\n /** Table the flagged rows land in (for presence detection). */\n readonly table: string;\n readonly timeoutMs?: number;\n}\n\nexport interface FlagResult {\n readonly state: FlagState;\n readonly error?: Error;\n}\n\n/**\n * OPTIONAL primitive (§7): client-triggered, per-user server-side flagging. Use only for bucket\n * economy or server-decided membership; `useOnDemandStream` is the default single-row path.\n * `synced` is detected by watching the SPECIFIC requested ids, never by waitForFirstSync.\n */\nexport class AutoSyncFlagStore {\n readonly store = new SnapshotStore<FlagResult>({ status: 'idle' } as unknown as FlagResult);\n private handle: StreamHandle | null = null;\n private unsubStatus: (() => void) | null = null;\n private cancelTimeout: (() => void) | null = null;\n private disposed = false;\n private refs = 0;\n\n constructor(\n private readonly driver: BridgeDriver,\n private readonly clock: BridgeClock,\n private readonly config: FlaggerConfig,\n private readonly ids: readonly string[],\n ) {\n this.store.replace({ state: 'idle' });\n }\n\n retain(): void {\n this.refs += 1;\n if (this.refs === 1) void this.start();\n }\n\n release(): void {\n this.refs -= 1;\n if (this.refs <= 0) this.dispose();\n }\n\n get isDisposed(): boolean {\n return this.disposed;\n }\n\n swapRoot(): void {\n this.store.replace({ state: 'idle' });\n this.disposed = true;\n }\n\n dispose(): void {\n this.disposed = true;\n this.unsubStatus?.();\n this.cancelTimeout?.();\n this.handle?.unsubscribe();\n this.handle = null;\n }\n\n private async start(): Promise<void> {\n this.store.replace({ state: 'flagging' });\n try {\n await this.config.requestFlag(this.ids);\n if (this.disposed) return;\n this.handle = await this.driver.syncStream(this.config.stream, null, {});\n this.store.replace({ state: 'syncing' });\n // timeout ≠ failure: keep the subscription, keep watching\n this.cancelTimeout = this.clock.setTimeout(() => {\n if (!this.disposed && this.store.getSnapshot().state === 'syncing') this.store.replace({ state: 'timeout' });\n }, this.config.timeoutMs ?? 15_000);\n const check = async () => {\n if (this.disposed) return;\n const present = await probePresence(this.driver, this.config.table, this.ids);\n if (!this.disposed && this.ids.every((id) => present.has(id))) {\n this.cancelTimeout?.();\n this.store.replace({ state: 'synced' });\n this.unsubStatus?.();\n }\n };\n this.unsubStatus = this.driver.onStatusChanged(() => void check());\n await check();\n } catch (e) {\n if (!this.disposed) this.store.replace({ state: 'error', error: e instanceof Error ? e : new Error(String(e)) });\n }\n }\n}\n","import type { BridgeDriver, StreamDescription, SyncStatusView } from './types';\n\nexport type Clock = () => number;\n\nexport interface CheckpointCompletion {\n /** Lower-bound stamp of the checkpoint's data position (download start), ms. */\n readonly stamp: number;\n readonly completedAt: number;\n /** Stream this completion was observed on; null for the global status. */\n readonly stream: string | null;\n}\n\nexport function streamKey(desc: StreamDescription): string {\n return `${desc.name}:${desc.params ? JSON.stringify(desc.params) : ''}`;\n}\n\n/**\n * Session-scoped, monotonic, transition-independent freshness (§5.2, R3/R5).\n *\n * stamp(checkpoint_n) = max(observed download start ≤ its completion,\n * completion time of checkpoint n−1,\n * sessionConnectAt when no other bound exists)\n * localFreshAt = max(previous, stamp) — a null observation never lowers it.\n */\nexport class FreshnessTracker {\n private sessionConnectAt: number | null = null;\n private localFreshAt = Number.NEGATIVE_INFINITY;\n private prevCompletionAt: number | null = null;\n private lastDownloadStart: number | null = null;\n private lastSeenSyncedAt: number | null = null;\n private lastDownloading = false;\n private lastConnected = false;\n private lastHasSynced: boolean | undefined = undefined;\n private readonly streamFreshAt = new Map<string, number>();\n private readonly streamSeenSyncedAt = new Map<string, number>();\n private readonly completionListeners = new Set<(c: CheckpointCompletion) => void>();\n private readonly clearListeners = new Set<() => void>();\n private unsubscribe: (() => void) | null = null;\n\n constructor(\n private readonly driver: BridgeDriver,\n private readonly clock: Clock,\n ) {}\n\n /** Call once at engine init and again after every identity swap. */\n start(epochStartedAt: number): void {\n this.stop();\n this.reset();\n const status = this.driver.syncStatus();\n this.lastConnected = status.connected;\n this.lastDownloading = status.downloading;\n this.lastHasSynced = status.hasSynced;\n this.lastSeenSyncedAt = status.lastSyncedAt?.getTime() ?? null;\n if (status.connected) this.sessionConnectAt = epochStartedAt;\n // Boot mid-download: provisional bound for the FIRST completion, never applied to localFreshAt now.\n if (status.downloading) {\n this.prevCompletionAt = Math.max(epochStartedAt, this.lastSeenSyncedAt ?? Number.NEGATIVE_INFINITY);\n }\n for (const s of status.syncStreams) {\n if (s.lastSyncedAt) this.streamSeenSyncedAt.set(streamKey(s), s.lastSyncedAt.getTime());\n }\n this.unsubscribe = this.driver.onStatusChanged(() => this.onStatus(this.driver.syncStatus()));\n }\n\n stop(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n }\n\n private reset(): void {\n this.sessionConnectAt = null;\n this.localFreshAt = Number.NEGATIVE_INFINITY;\n this.prevCompletionAt = null;\n this.lastDownloadStart = null;\n this.lastSeenSyncedAt = null;\n this.streamFreshAt.clear();\n this.streamSeenSyncedAt.clear();\n }\n\n get sessionConnectAtMs(): number | null {\n return this.sessionConnectAt;\n }\n\n get localFreshAtMs(): number {\n return this.localFreshAt;\n }\n\n streamFreshAtMs(desc: StreamDescription): number {\n return this.streamFreshAt.get(streamKey(desc)) ?? Number.NEGATIVE_INFINITY;\n }\n\n /** Freshness for a list: the owning stream's stamp when declared, else the global stamp. */\n freshAtFor(stream: StreamDescription | undefined): number {\n if (!stream) return this.localFreshAt;\n return Math.max(this.streamFreshAtMs(stream), this.localFreshAt);\n }\n\n /** \"Answered\" = in-session freshness evidence (R5). */\n isFresh(stream: StreamDescription | undefined): boolean {\n if (this.sessionConnectAt === null) return false;\n return this.freshAtFor(stream) >= this.sessionConnectAt;\n }\n\n onCompletion(l: (c: CheckpointCompletion) => void): () => void {\n this.completionListeners.add(l);\n return () => this.completionListeners.delete(l);\n }\n\n onClear(l: () => void): () => void {\n this.clearListeners.add(l);\n return () => this.clearListeners.delete(l);\n }\n\n private onStatus(status: SyncStatusView): void {\n const now = this.clock();\n\n if (status.connected && !this.lastConnected && this.sessionConnectAt === null) {\n this.sessionConnectAt = now; // FIRST connect of the epoch — never per reconnect (R5)\n }\n this.lastConnected = status.connected;\n\n if (status.downloading && !this.lastDownloading) this.lastDownloadStart = now;\n this.lastDownloading = status.downloading;\n\n const syncedAt = status.lastSyncedAt?.getTime() ?? null;\n if (syncedAt !== null && syncedAt !== this.lastSeenSyncedAt) {\n this.recordCompletion(now, null);\n }\n if (syncedAt !== null) this.lastSeenSyncedAt = syncedAt; // null never lowers anything (R5)\n\n for (const s of status.syncStreams) {\n const key = streamKey(s);\n const at = s.lastSyncedAt?.getTime() ?? null;\n if (at !== null && at !== this.streamSeenSyncedAt.get(key)) {\n this.streamSeenSyncedAt.set(key, at);\n const stamp = this.stampFor(now);\n const prev = this.streamFreshAt.get(key) ?? Number.NEGATIVE_INFINITY;\n this.streamFreshAt.set(key, Math.max(prev, stamp));\n const c: CheckpointCompletion = { stamp: Math.max(prev, stamp), completedAt: now, stream: key };\n for (const l of this.completionListeners) l(c);\n }\n }\n\n if (this.lastHasSynced === true && status.hasSynced !== true) {\n for (const l of this.clearListeners) l();\n }\n this.lastHasSynced = status.hasSynced;\n }\n\n private stampFor(now: number): number {\n const candidates: number[] = [];\n if (this.lastDownloadStart !== null && this.lastDownloadStart <= now) candidates.push(this.lastDownloadStart);\n if (this.prevCompletionAt !== null) candidates.push(this.prevCompletionAt);\n if (candidates.length === 0 && this.sessionConnectAt !== null) candidates.push(this.sessionConnectAt);\n if (candidates.length === 0) return Number.NEGATIVE_INFINITY;\n return Math.max(...candidates);\n }\n\n private recordCompletion(now: number, stream: string | null): void {\n const stamp = this.stampFor(now);\n this.localFreshAt = Math.max(this.localFreshAt, stamp);\n this.prevCompletionAt = now;\n this.lastDownloadStart = null; // consumed; the next stamp derives from this completion\n const c: CheckpointCompletion = { stamp: this.localFreshAt, completedAt: now, stream };\n for (const l of this.completionListeners) l(c);\n }\n}\n","/**\n * Identity is DERIVED from the JWT the connector returns, never supplied by the app (R15, [DX]).\n * The key is the canonical JSON of the stable claims — a cache key, not a hash.\n */\n\nexport const DEFAULT_VOLATILE_CLAIMS: readonly string[] = [\n // OIDC volatile set\n 'exp', 'iat', 'nbf', 'jti', 'auth_time', 'at_hash', 'nonce', 'azp',\n // vendor session claims that rotate on refresh\n 'sid', 'session_id', 'rat',\n];\n\nfunction base64UrlToString(input: string): string {\n const b64 = input.replace(/-/g, '+').replace(/_/g, '/');\n const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4);\n if (typeof atob === 'function') return decodeURIComponent(escape(atob(padded)));\n return Buffer.from(padded, 'base64').toString('utf8');\n}\n\nexport function decodeJwtPayload(token: string): Record<string, unknown> {\n const parts = token.split('.');\n if (parts.length < 2 || !parts[1]) throw new Error('powersync-bridge: token is not a JWT');\n const parsed: unknown = JSON.parse(base64UrlToString(parts[1]));\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('powersync-bridge: JWT payload is not an object');\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction canonical(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(canonical).join(',')}]`;\n if (value !== null && typeof value === 'object') {\n const o = value as Record<string, unknown>;\n return `{${Object.keys(o).sort().map((k) => `${JSON.stringify(k)}:${canonical(o[k])}`).join(',')}}`;\n }\n return JSON.stringify(value);\n}\n\nexport interface IdentityKeyOptions {\n readonly denyList?: readonly string[];\n /** Connection parameters opted in BY KEY (rotating values must be excluded explicitly). */\n readonly connectionParams?: Record<string, unknown>;\n}\n\nexport function identityKeyFromClaims(claims: Record<string, unknown>, opts: IdentityKeyOptions = {}): string {\n const deny = new Set(opts.denyList ?? DEFAULT_VOLATILE_CLAIMS);\n const stable: Record<string, unknown> = {};\n for (const k of Object.keys(claims).sort()) {\n if (!deny.has(k)) stable[k] = claims[k];\n }\n return canonical({ claims: stable, params: opts.connectionParams ?? {} });\n}\n\nexport function identityKeyFromToken(token: string, opts: IdentityKeyOptions = {}): string {\n return identityKeyFromClaims(decodeJwtPayload(token), opts);\n}\n\n/**\n * Tracks the current identity key and the global epoch. `observe()` with an unchanged key is a\n * no-op (token refreshes never churn); a changed key bumps the epoch synchronously and notifies\n * listeners BEFORE returning, so the store-root swap is part of the same synchronous operation.\n */\nexport class IdentityTracker {\n private key: string | null = null;\n private epochCounter = 0;\n private readonly listeners = new Set<(epoch: number, key: string | null) => void>();\n\n get epoch(): number {\n return this.epochCounter;\n }\n\n get currentKey(): string | null {\n return this.key;\n }\n\n observe(key: string | null): boolean {\n if (key === this.key) return false;\n this.key = key;\n this.epochCounter += 1;\n for (const l of this.listeners) l(this.epochCounter, key);\n return true;\n }\n\n /** A clear (hasSynced true → false) is an epoch signal even if the token is unchanged. */\n signalClear(): void {\n this.epochCounter += 1;\n for (const l of this.listeners) l(this.epochCounter, this.key);\n }\n\n onChange(l: (epoch: number, key: string | null) => void): () => void {\n this.listeners.add(l);\n return () => this.listeners.delete(l);\n }\n}\n","import { type BridgeClock, TimeoutError, withTimeout } from './clock';\nimport { streamKey } from './freshness';\nimport { cursorOfRow, idOf, isAfterCursor, rowComparator } from './keyset';\nimport { classifyRemovals } from './removal';\nimport { SnapshotStore, shallowEqualResult } from './store';\nimport type {\n Boundary,\n BoundaryReason,\n BridgeDriver,\n CursorOf,\n InfiniteListDefinition,\n InfiniteListResult,\n ListErrors,\n OrderKey,\n PagedRow,\n PartitionPolicy,\n QueryAdapter,\n RowDiff,\n StreamDescription,\n StreamHandle,\n} from './types';\n\nexport interface InfiniteDeps {\n readonly driver: BridgeDriver;\n readonly adapter: QueryAdapter;\n readonly clock: BridgeClock;\n readonly onEvicted?: ((ids: readonly string[]) => void) | undefined;\n}\n\ninterface Entry<TItem> {\n row: TItem;\n origin: 'local' | 'api';\n presentLocally: boolean;\n}\n\nconst EMPTY: InfiniteListResult<never> = Object.freeze({\n items: Object.freeze([]) as readonly never[],\n boundary: 'more',\n awaitingSync: false,\n loading: false,\n errors: Object.freeze({}),\n warnings: Object.freeze([]) as readonly string[],\n});\n\nexport function emptyInfiniteResult<T>(): InfiniteListResult<T> {\n return EMPTY as InfiniteListResult<T>;\n}\n\nconst DEFAULT_TTL = 300;\nconst DEFAULT_CAP = 3;\nconst DEFAULT_TIMEOUT = 15_000;\nconst DEFAULT_KEEP = 3;\n\n/**\n * The infinite list engine (§6.2): one global id set, a loaded-range local watch, and bounded\n * escalation through equality partitions or API pages.\n */\nexport class InfiniteListStore<TItem, TScope, K extends OrderKey<TItem>, TCursor, TPartition> {\n readonly store = new SnapshotStore<InfiniteListResult<TItem>>(emptyInfiniteResult<TItem>());\n\n private readonly compare: (a: TItem, b: TItem) => number;\n private readonly table: string;\n private readonly abort = new AbortController();\n\n private pages = 1;\n private local = new Map<string, TItem>();\n private lookahead = false;\n private emissionSeen = false;\n private localError: Error | undefined;\n private unsubDiffs: (() => void) | null = null;\n\n private readonly apiRows = new Map<string, TItem>();\n private readonly retained = new Map<string, TItem>();\n private readonly tombstones = new Set<string>();\n\n private readonly subs = new Map<string, StreamHandle>();\n private readonly lru: string[] = [];\n private probeCursor: TPartition | null = null;\n private serverFloor: TPartition | null | undefined = undefined; // undefined = not fetched yet\n private floorRevalidated = false;\n\n private boundary: Boundary = 'more';\n private reason: BoundaryReason | undefined;\n private awaitingSync = false;\n private loading = false;\n private localPagePending = false;\n private errors: ListErrors = {};\n private warnings: string[] = [];\n private errorCount = 0;\n private nextRetryAt = 0;\n\n private disposed = false;\n private refs = 0;\n\n constructor(\n private readonly deps: InfiniteDeps,\n private readonly def: InfiniteListDefinition<TItem, TScope, K, TCursor, TPartition>,\n private readonly scope: TScope,\n ) {\n this.compare = rowComparator<TItem>(def.orderKey, def.direction ?? 'asc');\n this.table = def.table ?? def.id;\n }\n\n retain(): void {\n this.refs += 1;\n if (this.refs === 1 && this.unsubDiffs === null) this.subscribeLocal();\n }\n\n release(): void {\n this.refs -= 1;\n if (this.refs <= 0) queueMicrotask(() => { if (this.refs <= 0) this.dispose(); });\n }\n\n get isDisposed(): boolean {\n return this.disposed || (this.refs <= 0 && this.unsubDiffs !== null);\n }\n\n swapRoot(): void {\n this.store.replace(emptyInfiniteResult<TItem>());\n this.disposed = true;\n }\n\n dispose(): void {\n this.disposed = true;\n this.abort.abort(new Error('disposed'));\n this.unsubDiffs?.();\n this.unsubDiffs = null;\n for (const h of this.subs.values()) h.unsubscribe();\n this.subs.clear();\n this.lru.length = 0;\n this.local.clear();\n this.apiRows.clear();\n this.retained.clear();\n this.tombstones.clear();\n this.store.replace(emptyInfiniteResult<TItem>());\n }\n\n // ---------------------------------------------------------------------------\n\n private subscribeLocal(): void {\n this.unsubDiffs?.();\n const limit = this.pages * this.def.pageSize + 1; // lookahead row\n const builder = this.def.query({ cursor: this.def.initialCursor as TCursor, limit }, this.scope);\n const prepared = this.deps.adapter.prepare(builder);\n this.unsubDiffs = this.deps.driver.diffs(prepared).subscribe(\n (diff) => void this.onDiff(diff),\n (err) => {\n this.localError = err;\n if (this.localPagePending) { this.localPagePending = false; this.loading = false; }\n this.render();\n },\n );\n }\n\n private async onDiff(diff: RowDiff<TItem>): Promise<void> {\n if (this.disposed) return;\n const prev = this.local;\n const next = new Map<string, TItem>();\n const window = this.pages * this.def.pageSize;\n const sorted = [...diff.all].sort(this.compare);\n this.lookahead = sorted.length > window;\n for (const row of sorted.slice(0, window)) {\n const id = idOf(row);\n next.set(id, row);\n this.tombstones.delete(id); // a re-added id retires a list-instance tombstone (R2)\n this.retained.delete(id);\n this.apiRows.delete(id); // local claims the id\n }\n this.local = next;\n this.localError = undefined;\n if (this.localPagePending) { this.localPagePending = false; this.loading = false; }\n this.emissionSeen = true;\n\n const removed = new Map<string, TItem>();\n for (const [id, row] of prev) if (!next.has(id)) removed.set(id, row);\n if (removed.size > 0) await this.applyRemovals(removed);\n this.render();\n }\n\n private provenance(row: TItem): StreamDescription | undefined {\n const pol = this.def.escalate;\n if (pol.kind !== 'partition') return undefined;\n const p = pol.partitionOf(cursorOfRow<TItem, K>(row, this.def.orderKey) as unknown as TCursor);\n if (p === null) return undefined;\n return { name: pol.stream, params: pol.partitionParams(p) };\n }\n\n private async applyRemovals(removed: ReadonlyMap<string, TItem>): Promise<void> {\n const classes = await classifyRemovals(\n { driver: this.deps.driver, clock: this.deps.clock, table: this.table, provenance: (r) => this.provenance(r), isInWindow: this.def.isInWindow },\n removed,\n );\n if (this.disposed) return;\n const evicted: string[] = [];\n for (const [id, cls] of classes) {\n const row = removed.get(id);\n if (!row) continue;\n switch (cls) {\n case 'filtered':\n break;\n case 'delete':\n this.tombstones.add(id);\n break;\n case 'eviction':\n case 'retain':\n this.retained.set(id, row);\n evicted.push(id);\n break;\n }\n }\n if (evicted.length > 0) this.deps.onEvicted?.(evicted); // once per emission\n }\n\n // ---------------------------------------------------------------------------\n\n private lastCursor(): TCursor {\n const all = this.mergedEntries();\n const last = all[all.length - 1];\n if (!last) return this.def.initialCursor as TCursor;\n return cursorOfRow<TItem, K>(last.row, this.def.orderKey) as unknown as TCursor;\n }\n\n /** Explicit user retry clears the backoff (R16). */\n retry(): Promise<void> {\n this.errorCount = 0;\n this.nextRetryAt = 0;\n return this.loadMore();\n }\n\n async loadMore(): Promise<void> {\n if (this.disposed || this.loading || this.boundary === 'end') return;\n if (this.lookahead) {\n this.localPagePending = true;\n this.loading = true;\n this.pages += 1;\n this.boundary = 'more';\n this.reason = undefined;\n this.subscribeLocal();\n this.render();\n return;\n }\n this.loading = true;\n this.render();\n try {\n const pol = this.def.escalate;\n if (pol.kind === 'partition') await this.escalatePartition(pol);\n else if (pol.kind === 'api') await this.escalateApi(pol.fetchPage);\n else await this.escalateOffset(pol.fetchPage);\n } finally {\n this.loading = false;\n this.awaitingSync = false;\n if (!this.disposed) this.render();\n }\n }\n\n private setUnknown(reason: BoundaryReason, err?: Error): void {\n this.boundary = 'unknown';\n this.reason = reason;\n if (err) this.errors = { ...this.errors, stream: err };\n }\n\n private async escalatePartition(pol: PartitionPolicy<TCursor, TPartition>): Promise<void> {\n // Gate: the SYNC socket, for PartitionPolicy only (R16).\n if (!this.deps.driver.syncStatus().connected) return this.setUnknown('offline');\n\n const isBefore = pol.isBefore ?? ((a: TPartition, b: TPartition) => (a as unknown as number | string) < (b as unknown as number | string));\n if (this.serverFloor === undefined && pol.serverFloor) {\n try {\n this.serverFloor = await pol.serverFloor();\n } catch {\n this.serverFloor = null;\n }\n }\n const floor = this.serverFloor ?? pol.floor;\n const cap = pol.partitionCap ?? DEFAULT_CAP;\n const timeoutMs = pol.timeoutMs ?? DEFAULT_TIMEOUT;\n\n // The cursor where escalation STARTED. Rows that land during the wait may already have\n // advanced the live cursor past them (diff emission racing the probe) — the probe must\n // look beyond the cursor we escalated from, never the moving one (F-006).\n const cursor = this.lastCursor();\n let p: TPartition | null;\n if (this.probeCursor !== null) {\n p = pol.nextPartition(this.probeCursor);\n if (p === null) return this.finishEnd(pol);\n } else {\n p = pol.partitionOf(cursor);\n }\n\n for (let probes = 0; ; probes++) {\n if (p === null || isBefore(p, floor)) return this.finishEnd(pol);\n if (probes === cap) return this.setUnknown('partition-cap');\n\n const params = pol.partitionParams(p);\n const key = streamKey({ name: pol.stream, params });\n let handle = this.subs.get(key);\n if (!handle) {\n handle = await this.deps.driver.syncStream(pol.stream, params, { ttl: pol.ttl ?? DEFAULT_TTL });\n this.track(key, handle);\n }\n this.awaitingSync = true;\n this.render();\n try {\n await withTimeout(this.deps.clock, handle.waitForFirstSync(this.abort.signal), timeoutMs, this.abort.signal);\n } catch (e) {\n if (this.disposed) return;\n this.untrack(key);\n return this.setUnknown(e instanceof TimeoutError ? 'timeout' : 'error', e instanceof Error ? e : undefined);\n }\n if (this.disposed) return;\n\n // Re-query beyond the escalation cursor: did rows land?\n const builder = this.def.query({ cursor, limit: this.def.pageSize + 1 }, this.scope);\n const rows = await this.deps.driver.query(this.deps.adapter.prepare(builder), this.abort.signal);\n if (rows.length > 0) {\n this.probeCursor = null;\n this.pages += 1;\n this.boundary = 'more';\n this.reason = undefined;\n this.subscribeLocal();\n return;\n }\n this.probeCursor = p; // proven empty\n this.untrack(key); // empty partitions hold buckets for nothing\n p = pol.nextPartition(p);\n }\n }\n\n private async finishEnd(pol: PartitionPolicy<TCursor, TPartition>): Promise<void> {\n // The floor is a lower bound: re-validate once before trusting 'end' (F3-013).\n if (!this.floorRevalidated && pol.serverFloor) {\n this.floorRevalidated = true;\n try {\n const fresh = await pol.serverFloor();\n if (fresh !== null && fresh !== this.serverFloor) {\n this.serverFloor = fresh;\n this.probeCursor = null;\n return this.escalatePartition(pol);\n }\n } catch {\n // keep the previous floor\n }\n }\n this.boundary = 'end';\n this.reason = undefined;\n }\n\n private track(key: string, handle: StreamHandle): void {\n this.subs.set(key, handle);\n this.lru.push(key);\n const keep = this.def.keepPagesAlive ?? DEFAULT_KEEP;\n while (this.lru.length > keep) {\n const old = this.lru.shift();\n if (old && old !== key) this.untrack(old);\n }\n }\n\n private untrack(key: string): void {\n const h = this.subs.get(key);\n if (h) h.unsubscribe();\n this.subs.delete(key);\n const i = this.lru.indexOf(key);\n if (i >= 0) this.lru.splice(i, 1);\n }\n\n private apiGate(): boolean {\n const now = this.deps.clock.now();\n if (now < this.nextRetryAt) {\n this.setUnknown('offline');\n return false;\n }\n return true;\n }\n\n private apiFailure(err: unknown): void {\n this.errorCount += 1;\n const backoff = Math.min(30_000, 1000 * 2 ** (this.errorCount - 1));\n this.nextRetryAt = this.deps.clock.now() + backoff;\n const e = err instanceof Error ? err : new Error(String(err));\n this.errors = { ...this.errors, api: e };\n this.setUnknown(this.deps.driver.onlineHint() === false ? 'offline' : 'error');\n }\n\n private async escalateApi(fetchPage: (cursor: TCursor, signal: AbortSignal) => Promise<readonly TItem[]>): Promise<void> {\n if (!this.apiGate()) return;\n try {\n const rows = await withTimeout(this.deps.clock, fetchPage(this.lastCursor(), this.abort.signal), this.deps.driver.onlineHint() === false ? 3000 : 30_000, this.abort.signal);\n this.absorbApi(rows);\n } catch (e) {\n if (!this.disposed) this.apiFailure(e);\n }\n }\n\n private async escalateOffset(fetchPage: (offset: number, signal: AbortSignal) => Promise<readonly TItem[]>): Promise<void> {\n if (!this.apiGate()) return;\n const offset = this.mergedEntries().length;\n try {\n const rows = await withTimeout(this.deps.clock, fetchPage(offset, this.abort.signal), 30_000, this.abort.signal);\n const cursor = this.lastCursor();\n // A page that overlaps rows we already hold, or that sorts before our cursor, means the\n // list shifted under the offset (live inserts). Duplicates are dropped; the shift is flagged.\n const shifted = rows.some(\n (r) =>\n this.local.has(idOf(r)) ||\n this.apiRows.has(idOf(r)) ||\n (cursor !== undefined && !isAfterCursor<TItem, K>(r, cursor as unknown as CursorOf<TItem, K>, this.def.orderKey, this.def.direction ?? 'asc')),\n );\n if (shifted && !this.warnings.includes('offset-shift')) this.warnings = [...this.warnings, 'offset-shift'];\n this.absorbApi(rows);\n } catch (e) {\n if (!this.disposed) this.apiFailure(e);\n }\n }\n\n private absorbApi(rows: readonly TItem[]): void {\n const { api: _previousApiError, ...remainingErrors } = this.errors;\n this.errors = remainingErrors;\n this.errorCount = 0;\n this.nextRetryAt = 0;\n let added = 0;\n for (const row of rows) {\n const id = idOf(row);\n if (this.local.has(id) || this.apiRows.has(id) || this.tombstones.has(id)) continue; // id-set dedupe (R13)\n this.apiRows.set(id, row);\n added += 1;\n }\n // API rows extend the loaded range too. Keep the local watch at least this wide, so a\n // later insert cannot push a previously loaded boundary row out of a one-page watch.\n const loadedPages = Math.max(this.pages, Math.ceil(this.mergedEntries().length / this.def.pageSize));\n if (loadedPages > this.pages) {\n this.pages = loadedPages;\n this.subscribeLocal();\n }\n if (rows.length === 0) {\n this.boundary = 'end';\n this.reason = undefined;\n } else {\n this.boundary = 'more';\n this.reason = undefined;\n }\n }\n\n // ---------------------------------------------------------------------------\n\n private mergedEntries(): Entry<TItem>[] {\n const entries: Entry<TItem>[] = [];\n for (const row of this.local.values()) entries.push({ row, origin: 'local', presentLocally: true });\n for (const [id, row] of this.retained) if (!this.local.has(id)) entries.push({ row, origin: 'local', presentLocally: false });\n for (const [id, row] of this.apiRows) if (!this.local.has(id) && !this.retained.has(id)) entries.push({ row, origin: 'api', presentLocally: false });\n entries.sort((a, b) => this.compare(a.row, b.row));\n return entries;\n }\n\n private render(): void {\n if (this.disposed) return;\n const items: PagedRow<TItem>[] = this.mergedEntries().map((e) => ({ row: e.row, origin: e.origin, presentLocally: e.presentLocally }));\n const errors: ListErrors = { ...this.errors };\n if (this.localError) errors.local = this.localError;\n const result: InfiniteListResult<TItem> = {\n items,\n boundary: this.boundary,\n ...(this.reason !== undefined ? { boundaryReason: this.reason } : {}),\n awaitingSync: this.awaitingSync,\n loading: this.loading,\n errors,\n warnings: this.warnings,\n };\n const prev = this.store.getSnapshot();\n if (shallowEqualResult(prev as unknown as Record<string, unknown>, result as unknown as Record<string, unknown>)) return;\n this.store.replace(result);\n }\n}\n","import { type BridgeClock, TimeoutError, withTimeout } from './clock';\nimport { SnapshotStore } from './store';\nimport type { BridgeDriver, OnDemandResult, Params, StreamHandle } from './types';\n\nexport interface OnDemandOptions {\n readonly ttl?: number;\n readonly priority?: 0 | 1 | 2 | 3;\n readonly timeoutMs?: number;\n}\n\n/**\n * The default \"pull one row\" primitive (§7, [DX]): a plain on-demand equality-parameter stream.\n * Held while retained; the TTL keeps rows warm after release.\n */\nexport class OnDemandStreamStore {\n readonly store = new SnapshotStore<OnDemandResult>({ status: 'subscribing' });\n private handle: StreamHandle | null = null;\n private readonly abort = new AbortController();\n private refs = 0;\n private disposed = false;\n\n constructor(\n private readonly driver: BridgeDriver,\n private readonly clock: BridgeClock,\n private readonly name: string,\n private readonly params: Params | null,\n private readonly opts: OnDemandOptions,\n ) {}\n\n retain(): void {\n this.refs += 1;\n if (this.refs === 1) void this.start();\n }\n\n release(): void {\n this.refs -= 1;\n if (this.refs <= 0) this.dispose();\n }\n\n get isDisposed(): boolean {\n return this.disposed;\n }\n\n swapRoot(): void {\n this.store.replace({ status: 'subscribing' });\n this.disposed = true;\n }\n\n dispose(): void {\n this.disposed = true;\n this.abort.abort(new Error('disposed'));\n this.handle?.unsubscribe();\n this.handle = null;\n }\n\n private async start(): Promise<void> {\n if (!this.driver.syncStatus().connected) {\n this.store.replace({ status: 'offline' });\n // still subscribe so it syncs when the socket returns\n }\n try {\n const opts: { ttl?: number; priority?: 0 | 1 | 2 | 3 } = {};\n if (this.opts.ttl !== undefined) opts.ttl = this.opts.ttl;\n if (this.opts.priority !== undefined) opts.priority = this.opts.priority;\n this.handle = await this.driver.syncStream(this.name, this.params, opts);\n if (this.disposed) {\n this.handle.unsubscribe();\n return;\n }\n if (this.driver.syncStatus().connected) this.store.replace({ status: 'syncing' });\n await withTimeout(this.clock, this.handle.waitForFirstSync(this.abort.signal), this.opts.timeoutMs ?? 15_000, this.abort.signal);\n if (!this.disposed) this.store.replace({ status: 'synced' });\n } catch (e) {\n if (this.disposed) return;\n if (e instanceof TimeoutError) this.store.replace({ status: this.driver.syncStatus().connected ? 'timeout' : 'offline' });\n else this.store.replace({ status: 'error', error: e instanceof Error ? e : new Error(String(e)) });\n }\n }\n}\n","import type { CheckpointCompletion, Clock, FreshnessTracker } from './freshness';\nimport type { BridgeDriver, CrudDelta, PendingOpRef } from './types';\n\nexport function refKey(table: string, id: string): string {\n return `${table}\\u0000${id}`;\n}\n\n/**\n * Snapshot-lifetime pending window (§5.2): SEEDED with the live set at requestedAt, then every\n * added AND completed ref observed until the snapshot retires. Never closed at consume.\n */\nexport class PendingWindow {\n private readonly refs = new Map<string, PendingOpRef>();\n private open = true;\n\n constructor(seed: Iterable<PendingOpRef>) {\n for (const r of seed) this.refs.set(refKey(r.table, r.id), r);\n }\n\n observe(delta: CrudDelta): void {\n if (!this.open) return;\n for (const r of delta.added) this.refs.set(refKey(r.table, r.id), r);\n for (const r of delta.completed) this.refs.set(refKey(r.table, r.id), r);\n }\n\n get(table: string, id: string): PendingOpRef | undefined {\n return this.refs.get(refKey(table, id));\n }\n\n close(): void {\n this.open = false;\n this.refs.clear();\n }\n}\n\n/**\n * Identity-scoped engine state (F6-001): the crud-delta mirror (livePending), the open snapshot\n * windows, and `recentlyAcked`. Created at engine init — before any list mounts — and replaced\n * wholesale on identity swap.\n */\nexport class CrudMirror {\n private readonly live = new Map<string, PendingOpRef>();\n private readonly recentlyAcked = new Map<string, { ref: PendingOpRef; ackedAt: number }>();\n private readonly windows = new Set<PendingWindow>();\n private readonly listeners = new Set<() => void>();\n private unsubCrud: (() => void) | null = null;\n private unsubCompletion: (() => void) | null = null;\n private seeded: Promise<void> | null = null;\n\n constructor(\n private readonly driver: BridgeDriver,\n private readonly freshness: FreshnessTracker,\n private readonly clock: Clock,\n ) {}\n\n start(): void {\n this.stop();\n this.live.clear();\n this.recentlyAcked.clear();\n for (const w of this.windows) w.close();\n this.windows.clear();\n this.unsubCrud = this.driver.onCrudChange((delta) => this.apply(delta));\n this.unsubCompletion = this.freshness.onCompletion((c) => this.retireAcked(c));\n this.seeded = this.resync();\n }\n\n stop(): void {\n this.unsubCrud?.();\n this.unsubCompletion?.();\n this.unsubCrud = null;\n this.unsubCompletion = null;\n }\n\n /** Resolves once the initial live set has been read. */\n ready(): Promise<void> {\n return this.seeded ?? Promise.resolve();\n }\n\n /** Re-read the queue and apply the difference as a delta (fallback trigger: every local diff emission). */\n async resync(): Promise<void> {\n const refs = await this.driver.pendingUploadIds();\n const next = new Map<string, PendingOpRef>();\n for (const r of refs) next.set(refKey(r.table, r.id), r);\n const added: PendingOpRef[] = [];\n const completed: PendingOpRef[] = [];\n for (const [k, r] of next) if (this.live.get(k)?.op !== r.op) added.push(r);\n for (const [k, r] of this.live) if (!next.has(k)) completed.push(r);\n if (added.length || completed.length) this.apply({ added, completed });\n }\n\n apply(delta: CrudDelta): void {\n const now = this.clock();\n for (const r of delta.added) this.live.set(refKey(r.table, r.id), r);\n for (const r of delta.completed) {\n const k = refKey(r.table, r.id);\n this.live.delete(k);\n this.recentlyAcked.set(k, { ref: r, ackedAt: now });\n }\n for (const w of this.windows) w.observe(delta);\n for (const l of this.listeners) l();\n }\n\n /** A ref retires only when a checkpoint whose STAMP ≥ ackTime completes (F5-001). */\n private retireAcked(c: CheckpointCompletion): void {\n if (c.stream !== null) return; // per-stream completions do not carry the whole write path\n let changed = false;\n for (const [k, v] of this.recentlyAcked) {\n if (c.stamp >= v.ackedAt) {\n this.recentlyAcked.delete(k);\n changed = true;\n }\n }\n if (changed) for (const l of this.listeners) l();\n }\n\n openWindow(): PendingWindow {\n const w = new PendingWindow(this.live.values());\n this.windows.add(w);\n return w;\n }\n\n closeWindow(w: PendingWindow): void {\n w.close();\n this.windows.delete(w);\n }\n\n /** The three-set union (R1). */\n pendingOp(table: string, id: string, window?: PendingWindow): PendingOpRef | undefined {\n const k = refKey(table, id);\n return this.live.get(k) ?? window?.get(table, id) ?? this.recentlyAcked.get(k)?.ref;\n }\n\n isLivePending(table: string, id: string): boolean {\n return this.live.has(refKey(table, id));\n }\n\n onChange(l: () => void): () => void {\n this.listeners.add(l);\n return () => this.listeners.delete(l);\n }\n}\n","import type { BridgeClock } from './clock';\nimport { streamKey, type FreshnessTracker } from './freshness';\nimport { cursorOfRow, idOf, rowComparator } from './keyset';\nimport type { CrudMirror, PendingWindow } from './pending';\nimport { classifyRemovals } from './removal';\nimport { BackgroundReads, CoalescedRefresh } from './refresh';\nimport type { SnapshotCache, SnapshotRecord } from './snapshots';\nimport { SnapshotStore, shallowEqualResult } from './store';\nimport type {\n BridgeDriver,\n ListErrors,\n ListState,\n MeasureSink,\n OrderKey,\n PagedRow,\n PreparedQuery,\n QueryAdapter,\n RaceMeasurement,\n RacedListDefinition,\n RacedListResult,\n RowDiff,\n} from './types';\n\nexport interface RacedDeps {\n readonly driver: BridgeDriver;\n readonly adapter: QueryAdapter;\n readonly crud: CrudMirror;\n readonly freshness: FreshnessTracker;\n readonly snapshots: SnapshotCache;\n readonly clock: BridgeClock;\n readonly epoch: number;\n readonly identityKey: string | null;\n readonly apiLegEnabled: boolean;\n readonly measure: MeasureSink | undefined;\n readonly backgroundReads?: BackgroundReads;\n}\n\ninterface Snap<TItem> {\n readonly rows: Map<string, TItem>;\n readonly record: SnapshotRecord<unknown>;\n readonly window: PendingWindow;\n}\n\ninterface OverlayEntry<TItem> {\n row: TItem;\n origin: 'local' | 'api';\n presentLocally: boolean;\n}\n\nconst EMPTY_RESULT: RacedListResult<never> = Object.freeze({\n items: Object.freeze([]) as readonly never[],\n state: 'pending',\n awaiting: Object.freeze({ local: true, api: true }),\n errors: Object.freeze({}),\n});\n\nexport function emptyRacedResult<T>(): RacedListResult<T> {\n return EMPTY_RESULT as RacedListResult<T>;\n}\n\n/**\n * The raced list engine (§5.2). One instance per (epoch, definition, scope); ref-counted by hooks.\n */\nexport class RacedListStore<TItem, TScope, TApi, K extends OrderKey<TItem>> {\n readonly store = new SnapshotStore<RacedListResult<TItem>>(emptyRacedResult<TItem>());\n\n private readonly compare: (a: TItem, b: TItem) => number;\n private readonly table: string;\n private abort = new AbortController();\n private observation = 0;\n private readonly checkpointRefresh: CoalescedRefresh;\n private localFreshAt = Number.NEGATIVE_INFINITY;\n private readonly startedAt: number;\n\n private snap: Snap<TItem> | null = null;\n private snapPending = false;\n private snapError: Error | undefined;\n private snapWindow: PendingWindow | null = null;\n\n private local: Map<string, TItem> | null = null;\n private localError: Error | undefined;\n private emissionSeen = false;\n private readonly inSession = new Set<string>();\n private unsubDiffs: (() => void) | null = null;\n private unsubCrud: (() => void) | null = null;\n private unsubFresh: (() => void) | null = null;\n private prepared: PreparedQuery<TItem> | null = null;\n\n private owned = false;\n private overlay = new Map<string, OverlayEntry<TItem>>();\n private readonly tombstones = new Set<string>();\n\n private disposed = false;\n private refs = 0;\n private activeRefs = 0;\n private measured = false;\n private localMs: number | null = null;\n private apiMs: number | null = null;\n\n constructor(\n private readonly deps: RacedDeps,\n private readonly def: RacedListDefinition<TItem, TScope, TApi, K>,\n private readonly scope: TScope,\n private readonly scopeKey: string,\n ) {\n this.compare = rowComparator<TItem>(def.orderKey, def.direction ?? 'asc');\n this.table = def.table ?? def.id;\n this.startedAt = deps.clock.now();\n this.checkpointRefresh = new CoalescedRefresh(\n (isCurrent) => this.onCompletion(isCurrent),\n () => this.reconcile(),\n );\n }\n\n retain(active = true): void {\n this.refs += 1;\n if (active) this.activeRefs += 1;\n if (this.activeRefs > 0 && this.unsubDiffs === null) this.start();\n }\n\n release(active = true): void {\n this.refs -= 1;\n if (active) this.activeRefs -= 1;\n queueMicrotask(() => {\n if (this.refs <= 0) this.dispose();\n else if (this.activeRefs <= 0) this.pause();\n });\n }\n\n get isDisposed(): boolean {\n return this.disposed || (this.refs <= 0 && this.unsubDiffs !== null);\n }\n\n /** Synchronous part of an identity swap: the snapshot becomes empty 'pending' at once (R15). */\n swapRoot(): void {\n this.store.replace(emptyRacedResult<TItem>());\n this.disposed = true;\n }\n\n dispose(): void {\n this.disposed = true;\n this.pause();\n if (this.snapWindow) this.deps.crud.closeWindow(this.snapWindow);\n this.snapWindow = null;\n this.local?.clear();\n this.local = null;\n this.snap = null;\n this.prepared = null;\n this.overlay.clear();\n this.inSession.clear();\n this.tombstones.clear();\n this.store.replace(emptyRacedResult<TItem>());\n }\n\n private pause(): void {\n this.observation += 1;\n this.checkpointRefresh.cancel();\n this.abort.abort(new Error('observer stopped'));\n this.unsubDiffs?.();\n this.unsubCrud?.();\n this.unsubFresh?.();\n this.unsubDiffs = null;\n this.unsubCrud = null;\n this.unsubFresh = null;\n if (this.snapPending) {\n this.deps.snapshots.invalidate(this.snapshotKey());\n if (this.snapWindow) this.deps.crud.closeWindow(this.snapWindow);\n this.snapWindow = this.snap?.window ?? null;\n this.snapPending = false;\n }\n }\n\n // ---------------------------------------------------------------------------\n\n private start(): void {\n if (this.disposed) return;\n this.abort = new AbortController();\n const observation = ++this.observation;\n const { driver, adapter, crud, freshness } = this.deps;\n const prepared: PreparedQuery<TItem> = adapter.prepare(this.def.query(this.scope));\n this.prepared = prepared;\n this.unsubDiffs = driver.diffs(prepared).subscribe(\n (diff) => {\n if (observation === this.observation) void this.onDiff(diff);\n },\n (err) => {\n if (observation !== this.observation) return;\n this.localError = err;\n this.reconcile();\n },\n );\n this.unsubCrud = crud.onChange(() => this.reconcile());\n this.unsubFresh = freshness.onCompletion((completion) => {\n // Unscoped queries only gain freshness from a global checkpoint. Other\n // streams must not enqueue the same aggregate read for each subscription.\n if (\n completion.stream === null ||\n (this.def.stream && completion.stream === streamKey(this.def.stream))\n ) {\n if (!this.owned) this.checkpointRefresh.request();\n }\n });\n\n if (this.deps.apiLegEnabled && !this.owned) this.startApiLeg();\n this.reconcile();\n }\n\n private startApiLeg(): void {\n const observation = this.observation;\n const abort = this.abort;\n const { snapshots, crud } = this.deps;\n const staleTime = this.def.staleTime ?? 10 * 60_000;\n this.snapPending = true;\n // The window is opened at request time and seeded with the live set (F4-001).\n const window = crud.openWindow();\n this.snapWindow = window;\n const key = this.snapshotKey();\n snapshots\n .fetch<TApi>(key, staleTime, (signal) => {\n const combined = new AbortController();\n const onAbort = () => combined.abort();\n signal.addEventListener('abort', onAbort, { once: true });\n abort.signal.addEventListener('abort', onAbort, { once: true });\n return this.def.fetchSnapshot(this.scope, combined.signal).finally(() => {\n signal.removeEventListener('abort', onAbort);\n abort.signal.removeEventListener('abort', onAbort);\n });\n })\n .then(\n (record) => {\n if (this.disposed || observation !== this.observation) return;\n this.snapPending = false;\n this.apiMs = this.deps.clock.now() - this.startedAt;\n const rows = new Map<string, TItem>();\n for (const raw of record.rows) {\n const item = this.def.mapApi(raw);\n rows.set(idOf(item), item);\n }\n if (this.snap) crud.closeWindow(this.snap.window);\n this.snap = { rows, record, window };\n this.reconcile();\n },\n (err: unknown) => {\n if (this.disposed || observation !== this.observation) return;\n this.snapPending = false;\n this.snapError = err instanceof Error ? err : new Error(String(err));\n crud.closeWindow(window);\n this.snapWindow = this.snap?.window ?? null;\n this.reconcile();\n },\n );\n }\n\n private snapshotKey(): readonly unknown[] {\n return ['powersync-bridge', this.deps.identityKey, this.deps.epoch, this.def.id, this.scopeKey];\n }\n\n /**\n * A checkpoint completed. Status events and diff emissions are separate SDK events with no\n * ordering guarantee; taking ownership on the stale local map would render the pre-checkpoint\n * value for one frame (fresh→old→fresh). Pre-ownership we re-query once, then reconcile.\n */\n private async onCompletion(isCurrent: () => boolean): Promise<void> {\n if (this.disposed || this.owned || !this.prepared || this.activeRefs <= 0) return;\n const freshAt = this.deps.freshness.freshAtFor(this.def.stream);\n try {\n const prepared = this.prepared;\n const signal = this.abort.signal;\n const read = () =>\n isCurrent() ? this.deps.driver.query(prepared, signal) : Promise.resolve(undefined);\n const rows = await (this.deps.backgroundReads\n ? this.deps.backgroundReads.run(read, signal)\n : read());\n if (!rows) return;\n if (this.disposed || !isCurrent()) return;\n const prev = this.local ?? new Map<string, TItem>();\n const next = new Map<string, TItem>();\n for (const row of rows) {\n const id = idOf(row);\n next.set(id, row);\n const before = prev.get(id);\n if (\n (before === undefined || JSON.stringify(before) !== JSON.stringify(row)) &&\n !this.deps.crud.isLivePending(this.table, id)\n ) {\n this.inSession.add(id);\n this.tombstones.delete(id);\n }\n }\n this.local = next;\n this.localFreshAt = Math.max(this.localFreshAt, freshAt);\n this.emissionSeen = true;\n this.localError = undefined;\n } catch {\n // keep the last emission; the diff stream will catch up\n }\n this.reconcile();\n }\n\n private async onDiff(diff: RowDiff<TItem>): Promise<void> {\n if (this.disposed || this.activeRefs <= 0) return;\n const observation = this.observation;\n const { crud } = this.deps;\n const prev = this.local;\n const next = new Map<string, TItem>();\n for (const row of diff.all) next.set(idOf(row), row);\n\n if (this.emissionSeen) {\n // Rows added/updated by a diff with no live pending op arrived via sync: in-session (R4).\n for (const row of [...diff.added, ...diff.updated]) {\n const id = idOf(row);\n if (!crud.isLivePending(this.table, id)) this.inSession.add(id);\n this.tombstones.delete(id); // a re-added id retires a list-instance tombstone (R2)\n }\n }\n this.local = next;\n if (!this.checkpointRefresh.pending)\n this.localFreshAt = this.deps.freshness.freshAtFor(this.def.stream);\n if (!this.emissionSeen) {\n this.emissionSeen = true;\n this.localMs = this.deps.clock.now() - this.startedAt;\n }\n\n // Re-read the queue on every local diff emission (F3-012): a write that matters produced one.\n void crud.resync();\n\n if (this.owned && prev) {\n const removed = new Map<string, TItem>();\n // A resumed watch emits a fresh baseline, so its removed[] is empty even\n // when rows disappeared while paused.\n for (const [id, row] of prev) if (!next.has(id)) removed.set(id, row);\n if (removed.size > 0) await this.applyRemovals(removed, observation);\n }\n if (observation !== this.observation) return;\n this.reconcile();\n }\n\n private async applyRemovals(\n removed: ReadonlyMap<string, TItem>,\n observation: number,\n ): Promise<void> {\n const classes = await classifyRemovals(\n {\n driver: this.deps.driver,\n clock: this.deps.clock,\n table: this.table,\n provenance: () => this.def.stream,\n isInWindow: this.def.isInWindow,\n },\n removed,\n );\n if (this.disposed || observation !== this.observation) return;\n for (const [id, cls] of classes) {\n const entry = this.overlay.get(id);\n switch (cls) {\n case 'filtered':\n this.overlay.delete(id);\n break;\n case 'delete':\n this.overlay.delete(id);\n this.tombstones.add(id);\n break;\n case 'eviction':\n case 'retain':\n if (entry) this.overlay.set(id, { ...entry, presentLocally: false });\n break;\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n\n private reconcile(): void {\n if (this.disposed) return;\n const result = this.owned ? this.renderOwned() : this.renderRace();\n const prev = this.store.getSnapshot();\n if (\n shallowEqualResult(\n prev as unknown as Record<string, unknown>,\n result as unknown as Record<string, unknown>,\n )\n )\n return;\n this.store.replace(result);\n this.report(result);\n }\n\n private freshAt(): number {\n return this.localFreshAt;\n }\n\n private localFresh(): boolean {\n const connectedAt = this.deps.freshness.sessionConnectAtMs;\n return this.emissionSeen && connectedAt !== null && this.localFreshAt >= connectedAt;\n }\n\n private tryTakeOwnership(): boolean {\n if (this.owned) return true;\n if (this.checkpointRefresh.pending) return false;\n const apiFreshAt = this.snap?.record.fetchedAt ?? Number.NEGATIVE_INFINITY;\n if (!(this.localFresh() && this.freshAt() > apiFreshAt)) return false;\n // Ownership: local owns the list; S and its shields retire wholesale (R2, F4-005).\n this.owned = true;\n const local = this.local ?? new Map<string, TItem>();\n const overlay = new Map<string, OverlayEntry<TItem>>();\n for (const [id, row] of local) overlay.set(id, { row, origin: 'local', presentLocally: true });\n if (this.snap) {\n if (this.def.apiScopeSupersetOfLocal) {\n for (const [id, row] of this.snap.rows) {\n if (!overlay.has(id) && !this.tombstones.has(id))\n overlay.set(id, { row, origin: 'api', presentLocally: false });\n }\n }\n this.deps.crud.closeWindow(this.snap.window);\n this.snapWindow = null;\n this.snap = null;\n }\n this.overlay = overlay;\n return true;\n }\n\n private renderOwned(): RacedListResult<TItem> {\n // Post-ownership: diffs apply directly; retained rows keep their presence flag.\n const local = this.local ?? new Map<string, TItem>();\n for (const [id, row] of local) {\n const e = this.overlay.get(id);\n if (e) {\n e.row = row;\n e.origin = 'local';\n e.presentLocally = true;\n } else if (!this.tombstones.has(id)) {\n this.overlay.set(id, { row, origin: 'local', presentLocally: true });\n }\n }\n const items = this.finalize(Array.from(this.overlay.values()));\n return this.build(items, 'converged', { local: false, api: false });\n }\n\n private renderRace(): RacedListResult<TItem> {\n if (this.tryTakeOwnership()) return this.renderOwned();\n\n const { crud } = this.deps;\n const S = this.snap;\n const local = this.local;\n const apiFreshAt = S?.record.fetchedAt ?? Number.NEGATIVE_INFINITY;\n const localFreshAt = this.freshAt();\n const apiFresher = apiFreshAt > localFreshAt;\n\n if (!S && !local) {\n return this.build([], 'pending', { local: !this.emissionSeen, api: this.snapPending });\n }\n if (!S && local && this.def.holdPending === 'pending' && this.snapPending) {\n return this.build([], 'pending', { local: false, api: true });\n }\n\n const entries: OverlayEntry<TItem>[] = [];\n const stale = !S; // rendered from local before any snapshot covered it (R12)\n const ids = new Set<string>([...(S?.rows.keys() ?? []), ...(local?.keys() ?? [])]);\n\n for (const id of ids) {\n const inLocal = local?.get(id);\n const inS = S?.rows.get(id);\n const pending = crud.pendingOp(this.table, id, S?.window);\n\n // 1. pending (three-set union): local state wins unconditionally (R1/R2)\n if (pending) {\n if (inLocal !== undefined)\n entries.push({ row: inLocal, origin: 'local', presentLocally: true });\n // DELETE absent locally → suppressed; INSERT/UPDATE filtered out locally → not rendered\n continue;\n }\n // 2. in both, not pending → the fresher source wins (R3)\n if (inLocal !== undefined && inS !== undefined) {\n entries.push(\n apiFresher\n ? { row: inS, origin: 'api', presentLocally: true }\n : { row: inLocal, origin: 'local', presentLocally: true },\n );\n continue;\n }\n // 3. local-only, not pending\n if (inLocal !== undefined) {\n if (!S) {\n entries.push({ row: inLocal, origin: 'local', presentLocally: true });\n } else if (this.inSession.has(id)) {\n entries.push({ row: inLocal, origin: 'local', presentLocally: true }); // never quarantined (R4)\n } else if (apiFresher) {\n // pre-session row positively excluded by a fresh snapshot → QUARANTINE (R4)\n } else {\n entries.push({ row: inLocal, origin: 'local', presentLocally: true });\n }\n continue;\n }\n // 4. api-only, not tombstoned\n if (inS !== undefined && !this.tombstones.has(id)) {\n entries.push({ row: inS, origin: 'api', presentLocally: false });\n }\n }\n\n const items = this.finalize(entries, stale);\n const state: ListState = !S ? 'local' : !local ? 'api' : apiFresher ? 'api' : 'local';\n return this.build(items, state, { local: !this.emissionSeen, api: this.snapPending });\n }\n\n private finalize(entries: OverlayEntry<TItem>[], stale = false): PagedRow<TItem>[] {\n entries.sort((a, b) => this.compare(a.row, b.row));\n const limited = entries.slice(0, this.def.limit); // R7: the list is a window\n return limited.map((e) =>\n stale\n ? { row: e.row, origin: e.origin, presentLocally: e.presentLocally, stale: true }\n : { row: e.row, origin: e.origin, presentLocally: e.presentLocally },\n );\n }\n\n private build(\n items: PagedRow<TItem>[],\n state: ListState,\n awaiting: { local: boolean; api: boolean },\n ): RacedListResult<TItem> {\n const errors: ListErrors = {};\n if (this.localError) errors.local = this.localError;\n if (this.snapError) errors.api = this.snapError;\n return { items, state, awaiting, errors };\n }\n\n private report(result: RacedListResult<TItem>): void {\n const sink = this.deps.measure;\n if (!sink) return;\n if (this.measured && result.state !== 'converged') return;\n if (result.state === 'pending') return;\n this.measured = true;\n const connectAt = this.deps.freshness.sessionConnectAtMs;\n const freshAt = this.deps.freshness.freshAtFor(this.def.stream);\n const m: RaceMeasurement = {\n list: this.def.id,\n winner:\n this.localMs !== null && (this.apiMs === null || this.localMs <= this.apiMs)\n ? 'local'\n : this.apiMs !== null\n ? 'api'\n : 'none',\n localMs: this.localMs,\n apiMs: this.apiMs,\n sessionFreshnessMs:\n connectAt !== null && Number.isFinite(freshAt) && freshAt >= connectAt\n ? this.deps.clock.now() - connectAt\n : null,\n rowsRendered: result.items.length,\n source: result.state,\n };\n sink(m);\n }\n\n /** The cursor of the last rendered row — used by raced × infinite composition (R13). */\n lastCursor(): ReturnType<typeof cursorOfRow<TItem, K>> | undefined {\n const items = this.store.getSnapshot().items;\n const last = items[items.length - 1];\n return last ? cursorOfRow<TItem, K>(last.row, this.def.orderKey) : undefined;\n }\n}\n","import type { BridgeClock } from './clock';\n\n/** Minimal TanStack QueryClient surface the bridge relies on (R11: fetchQuery + keying only). */\nexport interface MinimalQueryClient {\n cancelQueries?(filters: { queryKey: readonly unknown[]; exact: boolean }): Promise<unknown>;\n fetchQuery<T>(opts: {\n queryKey: readonly unknown[];\n queryFn: (ctx: { signal: AbortSignal }) => Promise<T>;\n staleTime?: number;\n }): Promise<T>;\n}\n\nexport interface SnapshotRecord<TApi> {\n readonly rows: readonly TApi[];\n readonly asOf: string | undefined;\n readonly requestedAt: number;\n readonly fetchedAt: number;\n}\n\ninterface Entry<TApi> {\n requestedAt: number;\n promise: Promise<SnapshotRecord<TApi>>;\n result: SnapshotRecord<TApi> | null;\n controller: AbortController;\n}\n\n/**\n * One fetch per (identity epoch, queryKey, staleTime window) — mount-triggered only, never a\n * timer (R9). When a TanStack client is supplied it owns dedup + staleness; otherwise an\n * internal cache with identical semantics is used, so core keeps zero required dependencies.\n */\nexport class SnapshotCache {\n private readonly entries = new Map<string, Entry<unknown>>();\n\n constructor(\n private readonly clock: BridgeClock,\n private readonly queryClient: MinimalQueryClient | undefined,\n ) {}\n\n fetch<TApi>(\n key: readonly unknown[],\n staleTime: number,\n fetcher: (signal: AbortSignal) => Promise<{ rows: readonly TApi[]; asOf?: string }>,\n ): Promise<SnapshotRecord<TApi>> {\n const k = JSON.stringify(key);\n const now = this.clock.now();\n const existing = this.entries.get(k) as Entry<TApi> | undefined;\n if (existing && (existing.result === null || now - existing.result.fetchedAt < staleTime)) {\n return existing.promise;\n }\n // Bound completed snapshots across searches/windows. In-flight requests keep their abort path.\n for (const [entryKey, entry] of this.entries) {\n if (entry.result && now - entry.result.fetchedAt >= staleTime) this.entries.delete(entryKey);\n }\n if (this.entries.size >= 64) {\n for (const [entryKey, entry] of this.entries) {\n if (entry.result) {\n this.entries.delete(entryKey);\n break;\n }\n }\n }\n const controller = new AbortController();\n const run = async (signal: AbortSignal): Promise<SnapshotRecord<TApi>> => {\n const res = await fetcher(signal);\n return { rows: res.rows, asOf: res.asOf, requestedAt: now, fetchedAt: this.clock.now() };\n };\n const promise = this.queryClient\n ? this.queryClient.fetchQuery<SnapshotRecord<TApi>>({\n queryKey: key,\n queryFn: ({ signal }) => run(signal),\n staleTime,\n })\n : run(controller.signal);\n const entry: Entry<TApi> = { requestedAt: now, promise, result: null, controller };\n this.entries.set(k, entry as Entry<unknown>);\n promise.then(\n (r) => {\n entry.result = r;\n },\n () => {\n if (this.entries.get(k) === (entry as Entry<unknown>)) this.entries.delete(k);\n },\n );\n return promise;\n }\n\n /** Cancel every in-flight fetch under a key prefix (identity swap). */\n invalidate(key: readonly unknown[]): void {\n const encoded = JSON.stringify(key);\n this.entries.get(encoded)?.controller.abort(new Error('invalidated'));\n // TanStack owns its in-flight promise; removing only our entry would let a\n // resumed observer reuse the aborted request before that promise settles.\n void this.queryClient?.cancelQueries?.({ queryKey: key, exact: true }).catch(() => {});\n this.entries.delete(encoded);\n }\n\n /** Cancel every in-flight fetch under a key prefix (identity swap). */\n abortAll(prefix: readonly unknown[]): void {\n const p = JSON.stringify(prefix).slice(0, -1); // drop the closing bracket → prefix match\n for (const [k, e] of this.entries) {\n if (k.startsWith(p)) {\n e.controller.abort(new Error('identity changed'));\n this.entries.delete(k);\n }\n }\n }\n\n clear(): void {\n for (const e of this.entries.values()) e.controller.abort(new Error('cleared'));\n this.entries.clear();\n }\n}\n","import { type BridgeClock, realClock } from './clock';\nimport { type FlaggerConfig, AutoSyncFlagStore } from './flagger';\nimport { FreshnessTracker } from './freshness';\nimport {\n IdentityTracker,\n type IdentityKeyOptions,\n identityKeyFromClaims,\n identityKeyFromToken,\n} from './identity';\nimport { InfiniteListStore } from './infinite';\nimport { type OnDemandOptions, OnDemandStreamStore } from './ondemand';\nimport { CrudMirror } from './pending';\nimport { BackgroundReads } from './refresh';\nimport { RacedListStore } from './raced';\nimport { InfiniteQueryStore, infiniteQueryKey, type InfiniteQueryOptions } from './query';\nimport { type MinimalQueryClient, SnapshotCache } from './snapshots';\nimport { SnapshotStore } from './store';\nimport type {\n BridgeDriver,\n InfiniteListDefinition,\n MeasureSink,\n OrderKey,\n Params,\n QueryAdapter,\n RacedListDefinition,\n Store,\n} from './types';\n\nexport type Platform = 'web' | 'native';\nexport type RacePolicy = 'race' | 'local-first';\n\nexport interface PlatformGates {\n readonly native?: RacePolicy;\n readonly web?: RacePolicy;\n}\n\nexport interface BridgeOptions {\n readonly driver: BridgeDriver;\n readonly adapter: QueryAdapter;\n /** TanStack QueryClient — used for fetchQuery + keying only (R11). Optional. */\n readonly queryClient?: MinimalQueryClient;\n readonly platform?: Platform;\n /** Native defaults to local-first (R8); web to race. */\n readonly platformGates?: PlatformGates;\n readonly measure?: { readonly sink: MeasureSink };\n readonly identity?: IdentityKeyOptions;\n readonly clock?: BridgeClock;\n readonly onEvicted?: (listId: string, ids: readonly string[]) => void;\n}\n\n/** The shape of a PowerSync backend connector, structurally (no SDK import in core). */\nexport interface ConnectorLike {\n fetchCredentials(): Promise<{ token: string; endpoint?: string; expiresAt?: Date } | null>;\n uploadData(database: unknown): Promise<void>;\n}\n\ninterface Disposable {\n retain(): void;\n release(): void;\n swapRoot(): void;\n dispose(): void;\n readonly isDisposed: boolean;\n}\n\nfunction detectPlatform(): Platform {\n const nav = (globalThis as { navigator?: { product?: string } }).navigator;\n return nav?.product === 'ReactNative' ? 'native' : 'web';\n}\n\nfunction scopeKeyOf(scope: unknown): string {\n return JSON.stringify(scope ?? null);\n}\n\n/**\n * The bridge: one per app, created once in a plain module before login (§5.1 root object).\n * Owns the identity-scoped engine state (crud-delta mirror, recentlyAcked, freshness) from\n * creation — before any list mounts (F6-001).\n */\nexport class Bridge {\n readonly driver: BridgeDriver;\n readonly adapter: QueryAdapter;\n readonly platform: Platform;\n readonly clock: BridgeClock;\n /** Increments on every identity swap; hooks subscribe to re-acquire their stores. */\n readonly epochStore: Store<number>;\n readonly connectivity = new SnapshotStore<boolean | undefined>(undefined);\n\n private readonly identity = new IdentityTracker();\n private readonly freshness: FreshnessTracker;\n private readonly crud: CrudMirror;\n private readonly snapshots: SnapshotCache;\n private readonly backgroundReads = new BackgroundReads();\n private readonly epochSnapshot: SnapshotStore<number>;\n private readonly stores = new Map<string, Disposable>();\n private readonly gates: Required<PlatformGates>;\n private readonly measure: MeasureSink | undefined;\n private readonly identityOpts: IdentityKeyOptions;\n private readonly onEvicted: BridgeOptions['onEvicted'];\n private disposed = false;\n private readonly onNetwork = () => this.setOnline(globalThis.navigator?.onLine);\n\n constructor(opts: BridgeOptions) {\n this.driver = opts.driver;\n this.adapter = opts.adapter;\n this.clock = opts.clock ?? realClock;\n this.platform = opts.platform ?? detectPlatform();\n this.gates = {\n native: opts.platformGates?.native ?? 'local-first',\n web: opts.platformGates?.web ?? 'race',\n };\n this.measure = opts.measure?.sink;\n this.identityOpts = opts.identity ?? {};\n this.onEvicted = opts.onEvicted;\n this.epochSnapshot = new SnapshotStore<number>(0);\n this.epochStore = this.epochSnapshot;\n this.freshness = new FreshnessTracker(this.driver, () => this.clock.now());\n this.crud = new CrudMirror(this.driver, this.freshness, () => this.clock.now());\n this.snapshots = new SnapshotCache(this.clock, opts.queryClient);\n\n this.freshness.start(this.clock.now());\n this.crud.start();\n this.freshness.onClear(() => this.identity.signalClear());\n this.identity.onChange(() => this.swapEpoch());\n globalThis.addEventListener?.('online', this.onNetwork);\n globalThis.addEventListener?.('offline', this.onNetwork);\n }\n\n get epoch(): number {\n return this.identity.epoch;\n }\n\n get identityKey(): string | null {\n return this.identity.currentKey;\n }\n\n setOnline(online: boolean | undefined): void {\n this.connectivity.replace(online);\n }\n\n query<T extends { id: string }>(options: InfiniteQueryOptions<T>): InfiniteQueryStore<T> {\n const key = `query:${this.epoch}:${infiniteQueryKey(options)}`;\n return this.acquire(\n key,\n () =>\n new InfiniteQueryStore(\n {\n driver: this.driver,\n adapter: this.adapter,\n crud: this.crud,\n freshness: this.freshness,\n snapshots: this.snapshots,\n clock: this.clock,\n epoch: this.epoch,\n identityKey: this.identityKey,\n apiLegEnabled: true,\n measure: this.measure,\n connectivity: this.connectivity,\n backgroundReads: this.backgroundReads,\n },\n options,\n ),\n );\n }\n\n /** Resolves once the initial upload-queue read has landed (tests). */\n ready(): Promise<void> {\n return this.crud.ready();\n }\n\n // ---------------------------------------------------------------------------\n // Identity (R15, [DX])\n // ---------------------------------------------------------------------------\n\n /** Connect THROUGH the bridge so identity is derived from every token the connector produces. */\n wrapConnector<C extends ConnectorLike>(connector: C): C {\n const wrapped = Object.create(connector) as C;\n Object.defineProperty(wrapped, 'fetchCredentials', {\n value: async () => {\n const creds = await connector.fetchCredentials();\n if (creds?.token)\n this.identity.observe(identityKeyFromToken(creds.token, this.identityOpts));\n return creds;\n },\n configurable: true,\n writable: true,\n });\n Object.defineProperty(wrapped, 'uploadData', {\n value: (db: unknown) => connector.uploadData(db),\n configurable: true,\n writable: true,\n });\n return wrapped;\n }\n\n /** Escape hatch for scope that is not in the token. */\n setIdentity(scope: Record<string, unknown> | null): void {\n this.identity.observe(scope === null ? null : identityKeyFromClaims(scope, this.identityOpts));\n }\n\n /**\n * Identity swap (R15): bump the epoch AND swap every store's root to empty 'pending' in ONE\n * synchronous operation, then tear the rest down asynchronously.\n */\n private swapEpoch(): void {\n const outgoing = Array.from(this.stores.values());\n this.stores.clear();\n for (const s of outgoing) s.swapRoot(); // synchronous: no committed frame can see the old tenant\n this.epochSnapshot.replace(this.identity.epoch);\n // async teardown\n queueMicrotask(() => {\n this.snapshots.clear();\n for (const s of outgoing) s.dispose();\n this.freshness.start(this.clock.now());\n this.crud.start();\n });\n }\n\n // ---------------------------------------------------------------------------\n // Store acquisition (ref-counted; shared across components with the same key)\n // ---------------------------------------------------------------------------\n\n private acquire<T extends Disposable>(key: string, make: () => T): T {\n const existing = this.stores.get(key) as T | undefined;\n if (existing && !existing.isDisposed) return existing;\n const s = make();\n this.stores.set(key, s);\n return s;\n }\n\n private apiLegEnabled(): boolean {\n return this.gates[this.platform] === 'race';\n }\n\n raced<TItem, TScope, TApi, K extends OrderKey<TItem>>(\n def: RacedListDefinition<TItem, TScope, TApi, K>,\n scope: TScope,\n ): RacedListStore<TItem, TScope, TApi, K> {\n const scopeKey = scopeKeyOf(scope);\n const key = `raced:${this.epoch}:${def.id}:${scopeKey}`;\n return this.acquire(\n key,\n () =>\n new RacedListStore<TItem, TScope, TApi, K>(\n {\n driver: this.driver,\n adapter: this.adapter,\n crud: this.crud,\n freshness: this.freshness,\n snapshots: this.snapshots,\n clock: this.clock,\n epoch: this.epoch,\n identityKey: this.identityKey,\n apiLegEnabled: this.apiLegEnabled(),\n measure: this.measure,\n backgroundReads: this.backgroundReads,\n },\n def,\n scope,\n scopeKey,\n ),\n );\n }\n\n infinite<TItem, TScope, K extends OrderKey<TItem>, TCursor, TPartition>(\n def: InfiniteListDefinition<TItem, TScope, K, TCursor, TPartition>,\n scope: TScope,\n ): InfiniteListStore<TItem, TScope, K, TCursor, TPartition> {\n const key = `infinite:${this.epoch}:${def.id}:${scopeKeyOf(scope)}`;\n return this.acquire(\n key,\n () =>\n new InfiniteListStore<TItem, TScope, K, TCursor, TPartition>(\n {\n driver: this.driver,\n adapter: this.adapter,\n clock: this.clock,\n onEvicted: this.onEvicted ? (ids) => this.onEvicted?.(def.id, ids) : undefined,\n },\n def,\n scope,\n ),\n );\n }\n\n onDemand(name: string, params: Params | null, opts: OnDemandOptions = {}): OnDemandStreamStore {\n const key = `ondemand:${this.epoch}:${name}:${JSON.stringify(params)}`;\n return this.acquire(\n key,\n () => new OnDemandStreamStore(this.driver, this.clock, name, params, opts),\n );\n }\n\n autoSync(config: FlaggerConfig, ids: readonly string[]): AutoSyncFlagStore {\n const key = `flag:${this.epoch}:${config.stream}:${JSON.stringify([...ids].sort())}`;\n return this.acquire(key, () => new AutoSyncFlagStore(this.driver, this.clock, config, ids));\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n globalThis.removeEventListener?.('online', this.onNetwork);\n globalThis.removeEventListener?.('offline', this.onNetwork);\n for (const s of this.stores.values()) s.dispose();\n this.stores.clear();\n this.snapshots.clear();\n this.freshness.stop();\n this.crud.stop();\n }\n}\n\nexport function createBridge(opts: BridgeOptions): Bridge {\n return new Bridge(opts);\n}\n","import type { InfiniteListDefinition, OrderKey, RacedListDefinition } from './types';\n\ntype RacedInput<TItem, TScope, TApi, K extends OrderKey<TItem>> = Omit<RacedListDefinition<TItem, TScope, TApi, K>, 'kind'>;\ntype InfiniteInput<TItem, TScope, K extends OrderKey<TItem>, TCursor, TPartition> = Omit<\n InfiniteListDefinition<TItem, TScope, K, TCursor, TPartition>,\n 'kind'\n>;\n\n/**\n * `TItem` is inferred from the query's awaited result (§8.1); `TApi` from `fetchSnapshot`.\n * Definitions close over the app's ORM instance; annotate the scope (and the page argument\n * for infinite lists) so the callback is not context-sensitive.\n */\nexport function defineRacedList<TItem, TScope, TApi, K extends OrderKey<TItem>>(\n input: RacedInput<TItem, TScope, TApi, K>,\n): RacedListDefinition<TItem, TScope, TApi, K> {\n return { kind: 'raced', ...input };\n}\n\nexport function defineInfiniteList<TItem, TScope, K extends OrderKey<TItem>, TCursor, TPartition = string>(\n input: InfiniteInput<TItem, TScope, K, TCursor, TPartition>,\n): InfiniteListDefinition<TItem, TScope, K, TCursor, TPartition> {\n return { kind: 'infinite', ...input };\n}\n"]}
|