@absolutejs/sync 1.14.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/crdt/orSet.ts", "../src/crdt/lwwMap.ts", "../src/crdt/list.ts", "../src/crdt/index.ts", "../src/client/subscriber.ts", "../src/reactiveHub.ts", "../src/client/liveQuery.ts", "../src/client/syncCollection.ts", "../src/client/collaborativeText.ts", "../src/client/presence.ts", "../src/client/syncClient.ts", "../src/client/syncStore.ts"],
3
+ "sources": ["../src/crdt/orSet.ts", "../src/crdt/lwwMap.ts", "../src/crdt/list.ts", "../src/crdt/index.ts", "../src/client/subscriber.ts", "../src/reactiveHub.ts", "../src/client/liveQuery.ts", "../src/serializer.ts", "../src/client/syncCollection.ts", "../src/client/collaborativeText.ts", "../src/client/presence.ts", "../src/client/syncClient.ts", "../src/client/syncStore.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * An observed-remove set (OR-Set) — a CRDT set where concurrent add/remove of an\n * element resolves **add-wins**: each `add` tags the element with a unique tag,\n * and `remove` only retracts the tags it has observed, so a concurrent add (a new\n * tag) survives. State-based: `merge` is union of tags minus removed tags.\n */\n\nconst newTag = (): string => globalThis.crypto.randomUUID();\nconst defaultEquals = <T>(a: T, b: T): boolean => Object.is(a, b);\n\nexport type OrSetState<T> = {\n\t/** Each add: the value plus the unique tag that observed it. */\n\tadds: { value: T; tag: string }[];\n\t/** Tags retracted by `remove`. */\n\tremoved: string[];\n};\n\nexport const orSet = {\n\tcreate: <T>(): OrSetState<T> => ({ adds: [], removed: [] }),\n\n\tadd: <T>(\n\t\tstate: OrSetState<T>,\n\t\tvalue: T,\n\t\ttag = newTag()\n\t): OrSetState<T> => ({\n\t\tadds: [...state.adds, { value, tag }],\n\t\tremoved: state.removed\n\t}),\n\n\t/** Retract every tag currently observed for `value` (add-wins on re-add). */\n\tremove: <T>(\n\t\tstate: OrSetState<T>,\n\t\tvalue: T,\n\t\tequals: (a: T, b: T) => boolean = defaultEquals\n\t): OrSetState<T> => {\n\t\tconst tags = state.adds\n\t\t\t.filter((entry) => equals(entry.value, value))\n\t\t\t.map((entry) => entry.tag);\n\n\t\treturn {\n\t\t\tadds: state.adds,\n\t\t\tremoved: [...new Set([...state.removed, ...tags])]\n\t\t};\n\t},\n\n\thas: <T>(\n\t\tstate: OrSetState<T>,\n\t\tvalue: T,\n\t\tequals: (a: T, b: T) => boolean = defaultEquals\n\t): boolean => {\n\t\tconst removed = new Set(state.removed);\n\n\t\treturn state.adds.some(\n\t\t\t(entry) => equals(entry.value, value) && !removed.has(entry.tag)\n\t\t);\n\t},\n\n\t/** The live, de-duplicated members. */\n\tvalues: <T>(\n\t\tstate: OrSetState<T>,\n\t\tequals: (a: T, b: T) => boolean = defaultEquals\n\t): T[] => {\n\t\tconst removed = new Set(state.removed);\n\t\tconst out: T[] = [];\n\t\tfor (const entry of state.adds) {\n\t\t\tif (\n\t\t\t\t!removed.has(entry.tag) &&\n\t\t\t\t!out.some((value) => equals(value, entry.value))\n\t\t\t) {\n\t\t\t\tout.push(entry.value);\n\t\t\t}\n\t\t}\n\n\t\treturn out;\n\t},\n\n\t/** Union the observed tags and the removed tags (commutative/idempotent). */\n\tmerge: <T>(a: OrSetState<T>, b: OrSetState<T>): OrSetState<T> => {\n\t\tconst byTag = new Map<string, { value: T; tag: string }>();\n\t\tfor (const entry of [...a.adds, ...b.adds]) {\n\t\t\tbyTag.set(entry.tag, entry);\n\t\t}\n\n\t\treturn {\n\t\t\tadds: [...byTag.values()],\n\t\t\tremoved: [...new Set([...a.removed, ...b.removed])]\n\t\t};\n\t}\n};\n",
6
6
  "/**\n * A last-write-wins map (LWW-Map) — a CRDT key→value map. Each key is an\n * independent LWW register: the write (set or delete) with the highest timestamp\n * wins, ties broken by replica id. `delete` is a tombstone so it can lose to a\n * later concurrent `set`. State-based: `merge` is per-key LWW.\n */\n\nexport type LwwMapEntry<V> = {\n\tvalue?: V;\n\tdeleted: boolean;\n\ttimestamp: number;\n\treplica: string;\n};\n\nexport type LwwMapState<V> = Record<string, LwwMapEntry<V>>;\n\nconst pick = <V>(a: LwwMapEntry<V>, b: LwwMapEntry<V>): LwwMapEntry<V> => {\n\tif (b.timestamp > a.timestamp) {\n\t\treturn b;\n\t}\n\tif (b.timestamp < a.timestamp) {\n\t\treturn a;\n\t}\n\treturn b.replica > a.replica ? b : a;\n};\n\nexport const lwwMap = {\n\tcreate: <V>(): LwwMapState<V> => ({}),\n\n\tset: <V>(\n\t\tstate: LwwMapState<V>,\n\t\tkey: string,\n\t\tvalue: V,\n\t\treplica: string,\n\t\ttimestamp = Date.now()\n\t): LwwMapState<V> => ({\n\t\t...state,\n\t\t[key]: { value, deleted: false, timestamp, replica }\n\t}),\n\n\tdelete: <V>(\n\t\tstate: LwwMapState<V>,\n\t\tkey: string,\n\t\treplica: string,\n\t\ttimestamp = Date.now()\n\t): LwwMapState<V> => ({\n\t\t...state,\n\t\t[key]: { value: state[key]?.value, deleted: true, timestamp, replica }\n\t}),\n\n\tget: <V>(state: LwwMapState<V>, key: string): V | undefined => {\n\t\tconst entry = state[key];\n\n\t\treturn entry !== undefined && !entry.deleted ? entry.value : undefined;\n\t},\n\n\thas: <V>(state: LwwMapState<V>, key: string): boolean => {\n\t\tconst entry = state[key];\n\n\t\treturn entry !== undefined && !entry.deleted;\n\t},\n\n\tkeys: <V>(state: LwwMapState<V>): string[] =>\n\t\tObject.keys(state).filter((key) => !state[key]?.deleted),\n\n\tentries: <V>(state: LwwMapState<V>): [string, V][] => {\n\t\tconst out: [string, V][] = [];\n\t\tfor (const [key, entry] of Object.entries(state)) {\n\t\t\tif (!entry.deleted && entry.value !== undefined) {\n\t\t\t\tout.push([key, entry.value]);\n\t\t\t}\n\t\t}\n\n\t\treturn out;\n\t},\n\n\t/** Per-key last-write-wins (commutative/idempotent). */\n\tmerge: <V>(a: LwwMapState<V>, b: LwwMapState<V>): LwwMapState<V> => {\n\t\tconst out: LwwMapState<V> = { ...a };\n\t\tfor (const [key, entry] of Object.entries(b)) {\n\t\t\tconst existing = out[key];\n\t\t\tout[key] = existing === undefined ? entry : pick(existing, entry);\n\t\t}\n\n\t\treturn out;\n\t}\n};\n",
@@ -9,13 +9,14 @@
9
9
  "import type { ReactiveEvent } from '../reactiveHub';\n\nexport type SyncSubscriberOptions = {\n\t/** Topics to subscribe to. A trailing `*` matches by prefix server-side. */\n\ttopics: string[];\n\t/** Called for every reactive event pushed from the server. */\n\tonEvent: (event: ReactiveEvent) => void;\n\t/** SSE endpoint mounted by the {@link sync} plugin. Defaults to `/sync`. */\n\turl?: string;\n\tonOpen?: () => void;\n\tonError?: (event: Event) => void;\n\t/** Send cookies with the SSE request (cross-origin auth). */\n\twithCredentials?: boolean;\n\t/**\n\t * EventSource implementation to use. Defaults to the global one; pass a polyfill\n\t * for non-browser runtimes.\n\t */\n\teventSourceImpl?: typeof EventSource;\n};\n\nexport type SyncSubscriber = {\n\tclose: () => void;\n\t/** The underlying EventSource, for advanced listeners. */\n\tsource: EventSource;\n};\n\n/**\n * Subscribe a browser to the server's {@link ReactiveHub} over SSE. `onEvent` fires\n * whenever a subscribed topic is published — the cue to refetch (or read the pushed\n * payload) instead of polling. EventSource reconnects automatically on transient\n * network drops.\n */\nexport const createSyncSubscriber = ({\n\ttopics,\n\tonEvent,\n\turl = '/sync',\n\tonOpen,\n\tonError,\n\twithCredentials,\n\teventSourceImpl\n}: SyncSubscriberOptions): SyncSubscriber => {\n\tconst Impl = eventSourceImpl ?? globalThis.EventSource;\n\tif (!Impl) {\n\t\tthrow new Error(\n\t\t\t'createSyncSubscriber requires EventSource. Run in a browser or pass eventSourceImpl.'\n\t\t);\n\t}\n\n\tconst params = new URLSearchParams({ topics: topics.join(',') });\n\tconst separator = url.includes('?') ? '&' : '?';\n\tconst source = new Impl(`${url}${separator}${params.toString()}`, {\n\t\twithCredentials: withCredentials ?? false\n\t});\n\n\tsource.onmessage = (event) => {\n\t\ttry {\n\t\t\tonEvent(JSON.parse(event.data) as ReactiveEvent);\n\t\t} catch {\n\t\t\t// ignore heartbeats / non-JSON frames\n\t\t}\n\t};\n\tif (onOpen) {\n\t\tsource.onopen = () => onOpen();\n\t}\n\tif (onError) {\n\t\tsource.onerror = (event) => onError(event);\n\t}\n\n\treturn {\n\t\tclose: () => source.close(),\n\t\tsource\n\t};\n};\n",
10
10
  "/**\n * Topic of the synthetic frame the SSE plugin emits when a stream opens (and\n * re-opens after a reconnect). Clients use it to tell \"the stream connected\"\n * apart from a real data-change event.\n */\nexport const SYNC_OPEN_TOPIC = '@absolutejs/sync:open';\n\nexport type ReactiveEvent<TPayload = unknown> = {\n\ttopic: string;\n\tat: number;\n\tpayload?: TPayload;\n};\n\nexport type ReactiveListener<TPayload = unknown> = (\n\tevent: ReactiveEvent<TPayload>\n) => void;\n\nexport type ReactiveHub = {\n\t/**\n\t * Notify every subscriber of `topic` (and any prefix-wildcard subscriber that\n\t * matches it). Call this from a mutation after the durable write commits.\n\t */\n\tpublish: (topic: string, payload?: unknown) => void;\n\t/**\n\t * Listen on one or more topics. A topic ending in `*` matches every topic that\n\t * starts with the prefix before it (e.g. `voice:session:*`). Returns an\n\t * unsubscribe function.\n\t */\n\tsubscribe: (topics: string[], listener: ReactiveListener) => () => void;\n\t/** Number of active subscribers, optionally for a single exact topic. */\n\tsubscriberCount: (topic?: string) => number;\n};\n\ntype Subscription = {\n\texact: Set<string>;\n\tprefixes: string[];\n\tlistener: ReactiveListener;\n};\n\n/**\n * An in-memory topic pub/sub for reactive, push-on-change updates.\n *\n * The pattern that replaces polling: a query/widget subscribes to the topics its\n * data depends on; a mutation `publish`es those topics after it writes; subscribers\n * are notified immediately and refetch (or receive the pushed payload) — instead of\n * every client hammering the server on a timer.\n *\n * Dependencies are explicit (you name the topics) rather than auto-tracked from a\n * query's read set — deliberately small, with no sandbox or query interception.\n * Pair it with the {@link sync} Elysia plugin to stream events to browsers over SSE.\n */\nexport const createReactiveHub = (): ReactiveHub => {\n\tconst subscriptions = new Set<Subscription>();\n\n\tconst matches = (subscription: Subscription, topic: string) => {\n\t\tif (subscription.exact.has(topic)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn subscription.prefixes.some((prefix) => topic.startsWith(prefix));\n\t};\n\n\treturn {\n\t\tpublish: (topic, payload) => {\n\t\t\tconst event: ReactiveEvent = { topic, at: Date.now(), payload };\n\t\t\tfor (const subscription of subscriptions) {\n\t\t\t\tif (matches(subscription, topic)) {\n\t\t\t\t\tsubscription.listener(event);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tsubscribe: (topics, listener) => {\n\t\t\tconst exact = new Set<string>();\n\t\t\tconst prefixes: string[] = [];\n\t\t\tfor (const topic of topics) {\n\t\t\t\tif (topic.endsWith('*')) {\n\t\t\t\t\tprefixes.push(topic.slice(0, -1));\n\t\t\t\t} else {\n\t\t\t\t\texact.add(topic);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst subscription: Subscription = { exact, prefixes, listener };\n\t\t\tsubscriptions.add(subscription);\n\t\t\treturn () => {\n\t\t\t\tsubscriptions.delete(subscription);\n\t\t\t};\n\t\t},\n\t\tsubscriberCount: (topic) => {\n\t\t\tif (topic === undefined) {\n\t\t\t\treturn subscriptions.size;\n\t\t\t}\n\t\t\tlet count = 0;\n\t\t\tfor (const subscription of subscriptions) {\n\t\t\t\tif (matches(subscription, topic)) {\n\t\t\t\t\tcount += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t}\n\t};\n};\n",
11
11
  "import { SYNC_OPEN_TOPIC } from '../reactiveHub';\nimport type { ReactiveEvent } from '../reactiveHub';\nimport { createSyncSubscriber } from './subscriber';\n\nexport type LiveQueryState<T> = {\n\t/** Latest query result, or `undefined` before the first successful fetch. */\n\tdata: T | undefined;\n\t/** Error from the most recent fetch, or `undefined` if it succeeded. */\n\terror: unknown;\n\t/** `true` until the first result arrives (no data yet). */\n\tloading: boolean;\n\t/** `true` while a (re)fetch is in flight — data may still be present. */\n\tfetching: boolean;\n};\n\nexport type LiveQueryOptions<T> = {\n\t/**\n\t * Topics this query depends on — typically the server's\n\t * `deriveReadTopics(...).topics`. Any event on one of them triggers a\n\t * refetch. A trailing `*` matches by prefix server-side.\n\t */\n\ttopics: string[];\n\t/**\n\t * Runs the read and resolves the query result. Receives an `AbortSignal`\n\t * that fires when a newer fetch supersedes this one or the query is closed.\n\t */\n\tfetcher: (signal: AbortSignal) => Promise<T>;\n\t/** SSE endpoint mounted by the {@link sync} plugin. Defaults to `/sync`. */\n\turl?: string;\n\t/** Send cookies with the SSE request (cross-origin auth). */\n\twithCredentials?: boolean;\n\t/** EventSource implementation; defaults to the global one. */\n\teventSourceImpl?: typeof EventSource;\n\t/**\n\t * Seed data (e.g. from SSR). When provided, the initial fetch is skipped —\n\t * the query trusts this until an event or a manual {@link LiveQuery.refetch}.\n\t */\n\tinitialData?: T;\n\t/**\n\t * Skip the initial fetch and stay idle until the first event or a manual\n\t * refetch. Reconnects still re-hydrate.\n\t */\n\tmanual?: boolean;\n\t/**\n\t * Coalesce a burst of events into one refetch within this window (ms).\n\t * Defaults to 0 — refetch once per event.\n\t */\n\tdebounceMs?: number;\n\t/** Called when a fetch rejects (stale data is retained). */\n\tonError?: (error: unknown) => void;\n};\n\nexport type LiveQuery<T> = {\n\t/** Current state snapshot (stable reference until the next change). */\n\tget: () => LiveQueryState<T>;\n\t/** Subscribe to state changes; returns an unsubscribe. */\n\tsubscribe: (listener: (state: LiveQueryState<T>) => void) => () => void;\n\t/** Force a refetch now. Resolves when this fetch settles. */\n\trefetch: () => Promise<void>;\n\t/** Stop the SSE subscription, cancel any in-flight fetch, drop listeners. */\n\tclose: () => void;\n};\n\n/**\n * A live, self-refreshing query: hydrate once via `fetcher`, then refetch\n * whenever the server publishes one of `topics` — the read half of Tier 2,\n * built on {@link createSyncSubscriber}. Framework-agnostic: `get` + `subscribe`\n * plug straight into React's `useSyncExternalStore` or any equivalent.\n *\n * Pair it with the Drizzle adapter's `deriveReadTopics` (server) and\n * `publishChange`/`publishWhere` (mutations) so a write invalidates exactly the\n * queries that read the changed rows.\n */\nexport const createLiveQuery = <T>(\n\toptions: LiveQueryOptions<T>\n): LiveQuery<T> => {\n\tconst hasSeed = options.initialData !== undefined;\n\tlet state: LiveQueryState<T> = {\n\t\tdata: options.initialData,\n\t\terror: undefined,\n\t\tloading: !options.manual && !hasSeed,\n\t\tfetching: false\n\t};\n\n\tconst listeners = new Set<(state: LiveQueryState<T>) => void>();\n\tconst setState = (patch: Partial<LiveQueryState<T>>) => {\n\t\tstate = { ...state, ...patch };\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(state);\n\t\t}\n\t};\n\n\tlet requestSeq = 0;\n\tlet inFlight: AbortController | undefined;\n\tlet closed = false;\n\n\tconst refetch = async () => {\n\t\tif (closed) {\n\t\t\treturn;\n\t\t}\n\t\tconst seq = (requestSeq += 1);\n\t\tinFlight?.abort();\n\t\tconst controller = new AbortController();\n\t\tinFlight = controller;\n\t\tsetState({ fetching: true });\n\n\t\ttry {\n\t\t\tconst data = await options.fetcher(controller.signal);\n\t\t\tif (seq !== requestSeq) {\n\t\t\t\treturn; // superseded by a newer fetch\n\t\t\t}\n\t\t\tsetState({\n\t\t\t\tdata,\n\t\t\t\terror: undefined,\n\t\t\t\tloading: false,\n\t\t\t\tfetching: false\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (controller.signal.aborted || seq !== requestSeq) {\n\t\t\t\treturn; // aborted or superseded — leave state to the winner\n\t\t\t}\n\t\t\tsetState({ error, loading: false, fetching: false });\n\t\t\toptions.onError?.(error);\n\t\t} finally {\n\t\t\tif (inFlight === controller) {\n\t\t\t\tinFlight = undefined;\n\t\t\t}\n\t\t}\n\t};\n\n\tlet debounceTimer: ReturnType<typeof setTimeout> | undefined;\n\tconst scheduleRefetch = () => {\n\t\tif (closed) {\n\t\t\treturn;\n\t\t}\n\t\tif (!options.debounceMs) {\n\t\t\tvoid refetch();\n\t\t\treturn;\n\t\t}\n\t\tif (debounceTimer !== undefined) {\n\t\t\treturn; // a refetch is already queued for this window\n\t\t}\n\t\tdebounceTimer = setTimeout(() => {\n\t\t\tdebounceTimer = undefined;\n\t\t\tvoid refetch();\n\t\t}, options.debounceMs);\n\t};\n\n\tlet opened = false;\n\tconst onEvent = (event: ReactiveEvent) => {\n\t\tif (event.topic === SYNC_OPEN_TOPIC) {\n\t\t\t// First open is the initial connect (already hydrated); a later open\n\t\t\t// is a reconnect, so re-hydrate to catch events missed while down.\n\t\t\tif (opened) {\n\t\t\t\tscheduleRefetch();\n\t\t\t}\n\t\t\topened = true;\n\t\t\treturn;\n\t\t}\n\t\tscheduleRefetch();\n\t};\n\n\tconst subscriber = createSyncSubscriber({\n\t\ttopics: options.topics,\n\t\tonEvent,\n\t\turl: options.url,\n\t\twithCredentials: options.withCredentials,\n\t\teventSourceImpl: options.eventSourceImpl\n\t});\n\n\tif (!options.manual && !hasSeed) {\n\t\tvoid refetch();\n\t}\n\n\tconst close = () => {\n\t\tif (closed) {\n\t\t\treturn;\n\t\t}\n\t\tclosed = true;\n\t\tsubscriber.close();\n\t\tinFlight?.abort();\n\t\tif (debounceTimer !== undefined) {\n\t\t\tclearTimeout(debounceTimer);\n\t\t\tdebounceTimer = undefined;\n\t\t}\n\t\tlisteners.clear();\n\t};\n\n\treturn {\n\t\tget: () => state,\n\t\tsubscribe: (listener) => {\n\t\t\tlisteners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t};\n\t\t},\n\t\trefetch,\n\t\tclose\n\t};\n};\n\n/**\n * A small default `fetcher`: GET `url` and parse JSON. Forwards the live query's\n * abort signal and throws on a non-2xx response.\n *\n * @example\n * createLiveQuery({ topics, fetcher: jsonFetcher<User[]>('/api/users') })\n */\nexport const jsonFetcher =\n\t<T>(url: string, init?: RequestInit) =>\n\tasync (signal: AbortSignal): Promise<T> => {\n\t\tconst response = await fetch(url, { ...init, signal });\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`${response.status} ${response.statusText}`);\n\t\t}\n\t\treturn (await response.json()) as T;\n\t};\n",
12
- "import type { ServerFrame } from '../engine/connection';\nimport type { RowKey } from '../engine/types';\n\nexport type { ServerFrame } from '../engine/connection';\n\nexport type SyncCollectionStatus = 'connecting' | 'ready' | 'closed';\n\nexport type SyncCollectionState<T> = {\n\t/** Visible rows: the server state with pending optimistic mutations applied. */\n\tdata: T[];\n\t/** Connection/sync status. */\n\tstatus: SyncCollectionStatus;\n\t/** Last error message from the server, or `undefined`. */\n\terror: unknown;\n};\n\n/** A working set a mutation's optimistic effect edits in place. */\nexport type OptimisticDraft<T> = {\n\t/** Insert or replace a row by key. */\n\tset: (row: T) => void;\n\t/** Remove a row by key. */\n\tdelete: (key: RowKey) => void;\n};\n\nexport type MutateOptions<T> = {\n\t/** Registered server mutation name. */\n\tname: string;\n\t/** Arguments forwarded to the mutation handler. */\n\targs?: unknown;\n\t/**\n\t * Apply this mutation's effect to the local set immediately for instant UI.\n\t * Reverted automatically if the server rejects it. Omit for a non-optimistic\n\t * mutation (UI updates only once the authoritative diff arrives).\n\t */\n\toptimistic?: (draft: OptimisticDraft<T>) => void;\n};\n\n/** A pending mutation persisted for replay across reloads. */\nexport type PendingMutationRecord = {\n\tmutationId: number;\n\tname: string;\n\targs: unknown;\n};\n\n/**\n * Durable storage for the pending-mutation queue, so unconfirmed mutations\n * survive a page reload (offline). The queue is replayed when the socket\n * connects; records are dropped as they're acked.\n */\nexport type MutationStorage = {\n\tload: () => PendingMutationRecord[] | Promise<PendingMutationRecord[]>;\n\tsave: (records: PendingMutationRecord[]) => void | Promise<void>;\n};\n\n/**\n * A {@link MutationStorage} backed by `localStorage` under `key`. No-ops where\n * `localStorage` is unavailable (e.g. SSR).\n */\nexport const localStorageMutationStorage = (key: string): MutationStorage => ({\n\tload: () => {\n\t\tconst raw = globalThis.localStorage?.getItem(key);\n\t\treturn raw ? (JSON.parse(raw) as PendingMutationRecord[]) : [];\n\t},\n\tsave: (records) => {\n\t\tglobalThis.localStorage?.setItem(key, JSON.stringify(records));\n\t}\n});\n\n/**\n * A persisted snapshot of a collection's server-authoritative rows plus the\n * change-feed `version` they were current as of — the cursor used to resume on\n * the next connect (catch-up diff if the server's changelog still covers it, a\n * fresh snapshot otherwise).\n */\nexport type CollectionCacheSnapshot<T> = {\n\trows: T[];\n\tversion: number;\n};\n\n/**\n * Durable local cache of a collection's confirmed rows, so reads are instant on\n * reload and available offline (local-first). Distinct from {@link\n * MutationStorage}, which persists *unconfirmed writes*: the cache is the\n * read side, the queue is the write side. On startup the cache hydrates the\n * collection before the socket connects; the engine then resumes from the\n * cached `version`.\n */\nexport type CollectionCache<T> = {\n\tload: () =>\n\t\t| CollectionCacheSnapshot<T>\n\t\t| undefined\n\t\t| Promise<CollectionCacheSnapshot<T> | undefined>;\n\tsave: (snapshot: CollectionCacheSnapshot<T>) => void | Promise<void>;\n\t/** Drop the cached snapshot (optional). */\n\tclear?: () => void | Promise<void>;\n};\n\n/**\n * A {@link CollectionCache} backed by `localStorage` under `key`. Synchronous\n * and capped (~5MB); fine for small collections. No-ops where `localStorage`\n * is unavailable (e.g. SSR). For larger sets use {@link indexedDbCollectionCache}.\n */\nexport const localStorageCollectionCache = <T>(\n\tkey: string\n): CollectionCache<T> => ({\n\tload: () => {\n\t\tconst raw = globalThis.localStorage?.getItem(key);\n\t\treturn raw\n\t\t\t? (JSON.parse(raw) as CollectionCacheSnapshot<T>)\n\t\t\t: undefined;\n\t},\n\tsave: (snapshot) => {\n\t\tglobalThis.localStorage?.setItem(key, JSON.stringify(snapshot));\n\t},\n\tclear: () => {\n\t\tglobalThis.localStorage?.removeItem(key);\n\t}\n});\n\nconst openIndexedDb = (\n\tdatabaseName: string,\n\tstoreName: string\n): Promise<IDBDatabase> =>\n\tnew Promise((resolve, reject) => {\n\t\tconst request = globalThis.indexedDB.open(databaseName, 1);\n\t\trequest.onupgradeneeded = () => {\n\t\t\trequest.result.createObjectStore(storeName);\n\t\t};\n\t\trequest.onsuccess = () => resolve(request.result);\n\t\trequest.onerror = () => reject(request.error);\n\t});\n\n/**\n * A {@link CollectionCache} backed by IndexedDB — the durable, large-capacity\n * local-first store. Asynchronous; one row per collection `key` in a shared\n * object store. No-ops (resolving to `undefined`) where `indexedDB` is\n * unavailable (e.g. SSR), so the collection falls back to the server snapshot.\n */\nexport const indexedDbCollectionCache = <T>({\n\tkey,\n\tdatabaseName = 'absolutejs-sync',\n\tstoreName = 'collections'\n}: {\n\t/** Distinct entry name within the store (e.g. the collection + params). */\n\tkey: string;\n\t/** IndexedDB database name. Defaults to `absolutejs-sync`. */\n\tdatabaseName?: string;\n\t/** Object-store name. Defaults to `collections`. */\n\tstoreName?: string;\n}): CollectionCache<T> => {\n\tlet handle: Promise<IDBDatabase> | undefined;\n\tconst database = () => {\n\t\thandle ??= openIndexedDb(databaseName, storeName);\n\t\treturn handle;\n\t};\n\tconst withStore = async <R>(\n\t\tmode: IDBTransactionMode,\n\t\trun: (store: IDBObjectStore) => IDBRequest\n\t): Promise<R | undefined> => {\n\t\tif (globalThis.indexedDB === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst db = await database();\n\t\treturn new Promise<R>((resolve, reject) => {\n\t\t\tconst request = run(\n\t\t\t\tdb.transaction(storeName, mode).objectStore(storeName)\n\t\t\t);\n\t\t\trequest.onsuccess = () => resolve(request.result as R);\n\t\t\trequest.onerror = () => reject(request.error);\n\t\t});\n\t};\n\n\treturn {\n\t\tload: () =>\n\t\t\twithStore<CollectionCacheSnapshot<T>>('readonly', (store) =>\n\t\t\t\tstore.get(key)\n\t\t\t),\n\t\tsave: async (snapshot) => {\n\t\t\tawait withStore('readwrite', (store) => store.put(snapshot, key));\n\t\t},\n\t\tclear: async () => {\n\t\t\tawait withStore('readwrite', (store) => store.delete(key));\n\t\t}\n\t};\n};\n\nexport type SyncCollectionOptions<T> = {\n\t/** WebSocket URL of the {@link syncSocket} endpoint (e.g. `ws://host/sync/ws`). */\n\turl: string;\n\t/** Registered collection name to subscribe to. */\n\tcollection: string;\n\t/** Query params forwarded to the server collection's hydrate/match/authorize. */\n\tparams?: unknown;\n\t/** Row identity, used to apply diffs and optimistic edits. Defaults to `row.id`. */\n\tkey?: (row: T) => RowKey;\n\t/** WebSocket implementation; defaults to the global one (pass for tests/SSR). */\n\twebSocketImpl?: typeof WebSocket;\n\t/**\n\t * Base reconnect delay (ms), doubled each attempt up to `maxReconnectMs`.\n\t * Set 0 to disable auto-reconnect. Defaults to 500.\n\t */\n\treconnectMs?: number;\n\t/** Maximum reconnect backoff (ms). Defaults to 10000. */\n\tmaxReconnectMs?: number;\n\t/**\n\t * Persist the pending-mutation queue so it survives a reload (offline) and\n\t * replays on connect. See {@link localStorageMutationStorage}.\n\t */\n\tstorage?: MutationStorage;\n\t/**\n\t * Persist confirmed rows locally for instant reads on reload and offline\n\t * (local-first). Hydrated before the socket connects; the engine then\n\t * resumes from the cached version (catch-up diff, or a fresh snapshot if the\n\t * server's changelog no longer covers it). See {@link\n\t * localStorageCollectionCache} / {@link indexedDbCollectionCache}.\n\t */\n\tcache?: CollectionCache<T>;\n\t/** Called with each server error message. */\n\tonError?: (error: unknown) => void;\n};\n\nexport type SyncCollection<T> = {\n\t/** Current state snapshot (stable reference until the next change). */\n\tget: () => SyncCollectionState<T>;\n\t/** Subscribe to state changes; returns an unsubscribe. */\n\tsubscribe: (\n\t\tlistener: (state: SyncCollectionState<T>) => void\n\t) => () => void;\n\t/**\n\t * Run a server mutation, optionally applying it optimistically. Resolves with\n\t * the server's result on ack, rejects (and rolls back) on reject. Pending\n\t * mutations are replayed when the socket reconnects, so they survive a drop.\n\t */\n\tmutate: <R = unknown>(options: MutateOptions<T>) => Promise<R>;\n\t/**\n\t * Force-close the underlying WebSocket without tearing down state. The\n\t * auto-reconnect loop fires after `reconnectMs`; the collection's\n\t * `appliedVersion` is preserved so the resumed subscribe carries `since`\n\t * and the engine replies with a catch-up diff (or a fresh snapshot if\n\t * the change log no longer covers the gap).\n\t *\n\t * Useful for simulating an offline blip in tests and benches that need\n\t * to measure resume cost specifically (vs cold-hydration on a fresh\n\t * collection). No-op if the collection has been `close()`d.\n\t */\n\tdisconnect: () => void;\n\t/** Unsubscribe on the server, close the socket, and stop reconnecting. */\n\tclose: () => void;\n};\n\n// One store subscribes to exactly one collection, so a fixed frame id suffices.\nconst SUBSCRIPTION_ID = 's';\n\ntype PendingMutation<T> = {\n\tmutationId: number;\n\tname: string;\n\targs: unknown;\n\toptimistic?: (draft: OptimisticDraft<T>) => void;\n\tresolve: (result: unknown) => void;\n\treject: (error: unknown) => void;\n};\n\n/**\n * A live collection backed by the WebSocket sync engine. Reads: connect,\n * subscribe, apply the server's snapshot then row-level diffs, re-sync on\n * reconnect. Writes: {@link SyncCollection.mutate} applies an optimistic overlay\n * immediately, sends the mutation, and reconciles on ack (drop the overlay — the\n * authoritative diff already arrived) or reject (roll back). Framework-agnostic\n * (`get` + `subscribe`).\n *\n * Mutations are replayed on reconnect, so make server mutations idempotent —\n * delivery is at-least-once if an ack is lost across a drop.\n */\nexport const createSyncCollection = <T>(\n\toptions: SyncCollectionOptions<T>\n): SyncCollection<T> => {\n\tconst key = options.key ?? ((row: T) => (row as { id: RowKey }).id);\n\tconst reconnectMs = options.reconnectMs ?? 500;\n\tconst maxReconnectMs = options.maxReconnectMs ?? 10_000;\n\tconst Impl = options.webSocketImpl ?? globalThis.WebSocket;\n\tif (!Impl) {\n\t\tthrow new Error(\n\t\t\t'createSyncCollection requires WebSocket. Run in a browser or pass webSocketImpl.'\n\t\t);\n\t}\n\n\t// Server-authoritative rows; `pending` is the optimistic overlay on top.\n\tconst confirmed = new Map<RowKey, T>();\n\tconst pending: PendingMutation<T>[] = [];\n\tlet mutationSeq = 0;\n\n\tlet state: SyncCollectionState<T> = {\n\t\tdata: [],\n\t\tstatus: 'connecting',\n\t\terror: undefined\n\t};\n\tconst listeners = new Set<(state: SyncCollectionState<T>) => void>();\n\tconst setState = (patch: Partial<SyncCollectionState<T>>) => {\n\t\tstate = { ...state, ...patch };\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(state);\n\t\t}\n\t};\n\n\t/** Recompute visible rows = confirmed + pending optimistic effects. */\n\tconst recompute = (patch: Partial<SyncCollectionState<T>> = {}) => {\n\t\tconst working = new Map(confirmed);\n\t\tconst draft: OptimisticDraft<T> = {\n\t\t\tset: (row) => working.set(key(row), row),\n\t\t\tdelete: (rowKey) => working.delete(rowKey)\n\t\t};\n\t\tfor (const mutation of pending) {\n\t\t\tmutation.optimistic?.(draft);\n\t\t}\n\t\tsetState({ ...patch, data: [...working.values()] });\n\t};\n\n\tlet socket: WebSocket | undefined;\n\tlet connected = false;\n\tlet closed = false;\n\tlet attempt = 0;\n\tlet reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n\t// Highest change-feed version applied; sent as `since` to resume on reconnect.\n\tlet appliedVersion = 0;\n\n\tconst persist = () => {\n\t\tvoid options.storage?.save(\n\t\t\tpending.map((mutation) => ({\n\t\t\t\tmutationId: mutation.mutationId,\n\t\t\t\tname: mutation.name,\n\t\t\t\targs: mutation.args\n\t\t\t}))\n\t\t);\n\t};\n\n\t// Coalesce a burst of confirmed changes (a frame of diffs) into one cache\n\t// write per tick. Persists only the server-authoritative set — never the\n\t// optimistic overlay (those live in the mutation queue instead).\n\tlet cacheScheduled = false;\n\tconst persistCache = () => {\n\t\tif (options.cache === undefined || cacheScheduled) {\n\t\t\treturn;\n\t\t}\n\t\tcacheScheduled = true;\n\t\tqueueMicrotask(() => {\n\t\t\tcacheScheduled = false;\n\t\t\tvoid options.cache?.save({\n\t\t\t\trows: [...confirmed.values()],\n\t\t\t\tversion: appliedVersion\n\t\t\t});\n\t\t});\n\t};\n\n\tconst settlePending = (mutationId: number) => {\n\t\tconst index = pending.findIndex(\n\t\t\t(mutation) => mutation.mutationId === mutationId\n\t\t);\n\t\tif (index === -1) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst [mutation] = pending.splice(index, 1);\n\t\tpersist();\n\t\treturn mutation;\n\t};\n\n\tconst applyFrame = (frame: ServerFrame<T>) => {\n\t\tif (frame.type === 'snapshot') {\n\t\t\tconfirmed.clear();\n\t\t\tfor (const row of frame.rows) {\n\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t}\n\t\t\tif (frame.version !== undefined) {\n\t\t\t\tappliedVersion = frame.version;\n\t\t\t}\n\t\t\tpersistCache();\n\t\t\trecompute({ status: 'ready', error: undefined });\n\t\t} else if (frame.type === 'diff') {\n\t\t\tfor (const row of frame.removed) {\n\t\t\t\tconfirmed.delete(key(row));\n\t\t\t}\n\t\t\tfor (const row of frame.added) {\n\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t}\n\t\t\tfor (const row of frame.changed) {\n\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t}\n\t\t\tif (frame.version !== undefined) {\n\t\t\t\tappliedVersion = Math.max(appliedVersion, frame.version);\n\t\t\t}\n\t\t\tpersistCache();\n\t\t\t// A diff only arrives once subscribed — including the catch-up diff a\n\t\t\t// resume replies with — so receiving one means we're live.\n\t\t\trecompute({ status: 'ready', error: undefined });\n\t\t} else if (frame.type === 'error') {\n\t\t\tsetState({ error: frame.message });\n\t\t\toptions.onError?.(frame.message);\n\t\t} else if (frame.type === 'ack') {\n\t\t\t// The authoritative diff already arrived (ordered before the ack), so\n\t\t\t// dropping the overlay leaves the confirmed row in place — no flicker.\n\t\t\tconst mutation = settlePending(frame.mutationId);\n\t\t\tif (mutation !== undefined) {\n\t\t\t\trecompute();\n\t\t\t\tmutation.resolve(frame.result);\n\t\t\t}\n\t\t} else if (frame.type === 'reject') {\n\t\t\t// roll the optimistic overlay back.\n\t\t\tconst mutation = settlePending(frame.mutationId);\n\t\t\tif (mutation !== undefined) {\n\t\t\t\trecompute();\n\t\t\t\tmutation.reject(new Error(String(frame.message)));\n\t\t\t}\n\t\t}\n\t\t// A `frame` (multi-collection batch) never reaches a single-collection\n\t\t// store — that's the multiplexed createSyncClient's job — so ignore it.\n\t};\n\n\tconst sendMutate = (mutation: PendingMutation<T>) => {\n\t\tif (connected) {\n\t\t\tsocket?.send(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\ttype: 'mutate',\n\t\t\t\t\tmutationId: mutation.mutationId,\n\t\t\t\t\tname: mutation.name,\n\t\t\t\t\targs: mutation.args\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t};\n\n\tconst connect = () => {\n\t\tif (closed) {\n\t\t\treturn;\n\t\t}\n\t\tsetState({ status: 'connecting' });\n\t\tconst ws = new Impl(options.url);\n\t\tsocket = ws;\n\t\tws.onopen = () => {\n\t\t\tattempt = 0;\n\t\t\tconnected = true;\n\t\t\tws.send(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\ttype: 'subscribe',\n\t\t\t\t\tid: SUBSCRIPTION_ID,\n\t\t\t\t\tcollection: options.collection,\n\t\t\t\t\tparams: options.params,\n\t\t\t\t\t// Resume from what we've applied (catch-up instead of snapshot).\n\t\t\t\t\tsince: appliedVersion > 0 ? appliedVersion : undefined\n\t\t\t\t})\n\t\t\t);\n\t\t\t// Replay anything still pending across the (re)connect.\n\t\t\tfor (const mutation of pending) {\n\t\t\t\tsendMutate(mutation);\n\t\t\t}\n\t\t};\n\t\tws.onmessage = (event) => {\n\t\t\ttry {\n\t\t\t\tapplyFrame(JSON.parse(event.data as string) as ServerFrame<T>);\n\t\t\t} catch {\n\t\t\t\t// ignore non-JSON frames\n\t\t\t}\n\t\t};\n\t\tws.onclose = () => {\n\t\t\tconnected = false;\n\t\t\tif (closed || reconnectMs <= 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst delay = Math.min(reconnectMs * 2 ** attempt, maxReconnectMs);\n\t\t\tattempt += 1;\n\t\t\treconnectTimer = setTimeout(connect, delay);\n\t\t};\n\t};\n\n\t// Reload recovery: re-queue persisted unconfirmed mutations so they replay on\n\t// connect. They carry no optimistic effect or promise (the resumed/snapshot\n\t// state is authoritative); resending produces the diffs that bring them in.\n\tconst hydratePersisted = async () => {\n\t\tif (options.storage === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tconst records = await options.storage.load();\n\t\tfor (const record of records) {\n\t\t\tif (pending.some((m) => m.mutationId === record.mutationId)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tpending.push({\n\t\t\t\tmutationId: record.mutationId,\n\t\t\t\tname: record.name,\n\t\t\t\targs: record.args,\n\t\t\t\tresolve: () => {},\n\t\t\t\treject: () => {}\n\t\t\t});\n\t\t\tmutationSeq = Math.max(mutationSeq, record.mutationId);\n\t\t}\n\t\tif (connected) {\n\t\t\tfor (const mutation of pending) {\n\t\t\t\tsendMutate(mutation);\n\t\t\t}\n\t\t}\n\t};\n\n\t// Local-first: load cached rows + version before connecting, so reads are\n\t// instant on reload and available offline. The subscribe then resumes from\n\t// the cached version — a catch-up diff if the server's changelog still\n\t// covers it, else a fresh snapshot that replaces the stale cache.\n\tconst hydrateCache = async () => {\n\t\tif (options.cache === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tlet snapshot: CollectionCacheSnapshot<T> | undefined;\n\t\ttry {\n\t\t\tsnapshot = await options.cache.load();\n\t\t} catch {\n\t\t\treturn; // corrupt/unavailable cache: fall back to the server snapshot\n\t\t}\n\t\t// Don't clobber server data if a frame somehow already landed.\n\t\tif (snapshot === undefined || appliedVersion > 0) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const row of snapshot.rows) {\n\t\t\tconfirmed.set(key(row), row);\n\t\t}\n\t\tappliedVersion = snapshot.version;\n\t\trecompute(); // show cached rows immediately (status stays 'connecting')\n\t};\n\n\tif (options.cache === undefined) {\n\t\t// No cache: preserve the original connect-then-hydrate ordering/timing.\n\t\tconnect();\n\t\tvoid hydratePersisted();\n\t} else {\n\t\t// Cache: hydrate reads + queued writes first, then connect so the\n\t\t// subscribe carries the cached resume version.\n\t\tvoid (async () => {\n\t\t\tawait hydrateCache();\n\t\t\tawait hydratePersisted();\n\t\t\tconnect();\n\t\t})();\n\t}\n\n\treturn {\n\t\tget: () => state,\n\t\tsubscribe: (listener) => {\n\t\t\tlisteners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t};\n\t\t},\n\t\tmutate: <R = unknown>(mutateOptions: MutateOptions<T>) =>\n\t\t\tnew Promise<R>((resolve, reject) => {\n\t\t\t\tconst mutation: PendingMutation<T> = {\n\t\t\t\t\tmutationId: (mutationSeq += 1),\n\t\t\t\t\tname: mutateOptions.name,\n\t\t\t\t\targs: mutateOptions.args,\n\t\t\t\t\toptimistic: mutateOptions.optimistic,\n\t\t\t\t\tresolve: (result) => resolve(result as R),\n\t\t\t\t\treject\n\t\t\t\t};\n\t\t\t\tpending.push(mutation);\n\t\t\t\tpersist();\n\t\t\t\trecompute(); // apply the optimistic overlay immediately\n\t\t\t\tsendMutate(mutation);\n\t\t\t}),\n\t\tdisconnect: () => {\n\t\t\t// Force-close the WS without tearing down state. The existing\n\t\t\t// `ws.onclose` handler schedules a reconnect via the auto-\n\t\t\t// reconnect loop (unless the collection has been `close()`d).\n\t\t\t// `appliedVersion` is preserved, so the resumed subscribe carries\n\t\t\t// `since` and the engine sends a catch-up diff (or snapshot if\n\t\t\t// the change log can't cover the gap).\n\t\t\tif (closed || socket === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tsocket.close();\n\t\t\t} catch {\n\t\t\t\t// already closing/closed\n\t\t\t}\n\t\t},\n\t\tclose: () => {\n\t\t\tif (closed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tclosed = true;\n\t\t\tconnected = false;\n\t\t\tif (reconnectTimer !== undefined) {\n\t\t\t\tclearTimeout(reconnectTimer);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tsocket?.send(\n\t\t\t\t\tJSON.stringify({ type: 'unsubscribe', id: SUBSCRIPTION_ID })\n\t\t\t\t);\n\t\t\t\tsocket?.close();\n\t\t\t} catch {\n\t\t\t\t// socket already closing/closed\n\t\t\t}\n\t\t\t// Fail any still-pending mutations so their promises don't hang.\n\t\t\tfor (const mutation of pending.splice(0)) {\n\t\t\t\tmutation.reject(new Error('sync collection closed'));\n\t\t\t}\n\t\t\tpersist();\n\t\t\tsetState({ status: 'closed' });\n\t\t\tlisteners.clear();\n\t\t}\n\t};\n};\n",
12
+ "import type { ClientFrame, ServerFrame } from './engine/connection';\n\n/**\n * Wire-format adapter (1.16.0). The engine and client default to JSON, but\n * for high-throughput deployments — a customer pushing 1 MB initial\n * snapshots, a tenant fan-out hitting 100k frames/sec — a binary serializer\n * (msgpack, cbor, or a custom tagged layout) cuts both bandwidth and\n * parse-side CPU.\n *\n * Both ends of the connection MUST use the same serializer. The default\n * `jsonSerializer` keeps every existing client + server pair working\n * unchanged; opt in to a different one on BOTH `syncSocket` and the client\n * lib to gain the win.\n *\n * The serializer only handles the wire format. Frame-shape validation\n * stays in the engine (`parseFrame` in connection.ts) — it runs on the\n * decoded object, so the same validation works for JSON, msgpack, etc.\n */\nexport type FrameSerializer = {\n\t/** Server→client: encode an outgoing `ServerFrame` for transport. */\n\tencodeServer: (frame: ServerFrame) => string | ArrayBufferLike | Uint8Array;\n\t/** Client→server: encode an outgoing `ClientFrame` for transport. */\n\tencodeClient: (frame: ClientFrame) => string | ArrayBufferLike | Uint8Array;\n\t/**\n\t * Deserialize a wire payload into a raw object. Return `null` for\n\t * unparseable input — the engine's validation step turns that into\n\t * a protocol error.\n\t */\n\tdecode: (raw: unknown) => unknown;\n};\n\n/**\n * Default JSON serializer — what `@absolutejs/sync` has always shipped.\n * Strings go through `JSON.parse`; already-parsed objects pass through\n * (some WS adapters auto-decode). `Uint8Array` / `ArrayBuffer` get\n * UTF-8 decoded first (binary WS frames carrying JSON text).\n */\nexport const jsonSerializer: FrameSerializer = {\n\tdecode: (raw: unknown): unknown => {\n\t\tif (typeof raw === 'string') {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(raw);\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\tif (raw instanceof Uint8Array) {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(new TextDecoder().decode(raw));\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\tif (raw instanceof ArrayBuffer) {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(new TextDecoder().decode(new Uint8Array(raw)));\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\treturn raw;\n\t},\n\tencodeClient: (frame: ClientFrame): string => JSON.stringify(frame),\n\tencodeServer: (frame: ServerFrame): string => JSON.stringify(frame)\n};\n",
13
+ "import type { ServerFrame } from '../engine/connection';\nimport type { RowKey } from '../engine/types';\nimport { jsonSerializer, type FrameSerializer } from '../serializer';\n\nexport type { ServerFrame } from '../engine/connection';\n\nexport type SyncCollectionStatus = 'connecting' | 'ready' | 'closed';\n\nexport type SyncCollectionState<T> = {\n\t/** Visible rows: the server state with pending optimistic mutations applied. */\n\tdata: T[];\n\t/** Connection/sync status. */\n\tstatus: SyncCollectionStatus;\n\t/** Last error message from the server, or `undefined`. */\n\terror: unknown;\n};\n\n/** A working set a mutation's optimistic effect edits in place. */\nexport type OptimisticDraft<T> = {\n\t/** Insert or replace a row by key. */\n\tset: (row: T) => void;\n\t/** Remove a row by key. */\n\tdelete: (key: RowKey) => void;\n};\n\nexport type MutateOptions<T> = {\n\t/** Registered server mutation name. */\n\tname: string;\n\t/** Arguments forwarded to the mutation handler. */\n\targs?: unknown;\n\t/**\n\t * Apply this mutation's effect to the local set immediately for instant UI.\n\t * Reverted automatically if the server rejects it. Omit for a non-optimistic\n\t * mutation (UI updates only once the authoritative diff arrives).\n\t */\n\toptimistic?: (draft: OptimisticDraft<T>) => void;\n};\n\n/** A pending mutation persisted for replay across reloads. */\nexport type PendingMutationRecord = {\n\tmutationId: number;\n\tname: string;\n\targs: unknown;\n};\n\n/**\n * Durable storage for the pending-mutation queue, so unconfirmed mutations\n * survive a page reload (offline). The queue is replayed when the socket\n * connects; records are dropped as they're acked.\n */\nexport type MutationStorage = {\n\tload: () => PendingMutationRecord[] | Promise<PendingMutationRecord[]>;\n\tsave: (records: PendingMutationRecord[]) => void | Promise<void>;\n};\n\n/**\n * A {@link MutationStorage} backed by `localStorage` under `key`. No-ops where\n * `localStorage` is unavailable (e.g. SSR).\n */\nexport const localStorageMutationStorage = (key: string): MutationStorage => ({\n\tload: () => {\n\t\tconst raw = globalThis.localStorage?.getItem(key);\n\t\treturn raw ? (JSON.parse(raw) as PendingMutationRecord[]) : [];\n\t},\n\tsave: (records) => {\n\t\tglobalThis.localStorage?.setItem(key, JSON.stringify(records));\n\t}\n});\n\n/**\n * A persisted snapshot of a collection's server-authoritative rows plus the\n * change-feed `version` they were current as of — the cursor used to resume on\n * the next connect (catch-up diff if the server's changelog still covers it, a\n * fresh snapshot otherwise).\n */\nexport type CollectionCacheSnapshot<T> = {\n\trows: T[];\n\tversion: number;\n};\n\n/**\n * Durable local cache of a collection's confirmed rows, so reads are instant on\n * reload and available offline (local-first). Distinct from {@link\n * MutationStorage}, which persists *unconfirmed writes*: the cache is the\n * read side, the queue is the write side. On startup the cache hydrates the\n * collection before the socket connects; the engine then resumes from the\n * cached `version`.\n */\nexport type CollectionCache<T> = {\n\tload: () =>\n\t\t| CollectionCacheSnapshot<T>\n\t\t| undefined\n\t\t| Promise<CollectionCacheSnapshot<T> | undefined>;\n\tsave: (snapshot: CollectionCacheSnapshot<T>) => void | Promise<void>;\n\t/** Drop the cached snapshot (optional). */\n\tclear?: () => void | Promise<void>;\n};\n\n/**\n * A {@link CollectionCache} backed by `localStorage` under `key`. Synchronous\n * and capped (~5MB); fine for small collections. No-ops where `localStorage`\n * is unavailable (e.g. SSR). For larger sets use {@link indexedDbCollectionCache}.\n */\nexport const localStorageCollectionCache = <T>(\n\tkey: string\n): CollectionCache<T> => ({\n\tload: () => {\n\t\tconst raw = globalThis.localStorage?.getItem(key);\n\t\treturn raw\n\t\t\t? (JSON.parse(raw) as CollectionCacheSnapshot<T>)\n\t\t\t: undefined;\n\t},\n\tsave: (snapshot) => {\n\t\tglobalThis.localStorage?.setItem(key, JSON.stringify(snapshot));\n\t},\n\tclear: () => {\n\t\tglobalThis.localStorage?.removeItem(key);\n\t}\n});\n\nconst openIndexedDb = (\n\tdatabaseName: string,\n\tstoreName: string\n): Promise<IDBDatabase> =>\n\tnew Promise((resolve, reject) => {\n\t\tconst request = globalThis.indexedDB.open(databaseName, 1);\n\t\trequest.onupgradeneeded = () => {\n\t\t\trequest.result.createObjectStore(storeName);\n\t\t};\n\t\trequest.onsuccess = () => resolve(request.result);\n\t\trequest.onerror = () => reject(request.error);\n\t});\n\n/**\n * A {@link CollectionCache} backed by IndexedDB — the durable, large-capacity\n * local-first store. Asynchronous; one row per collection `key` in a shared\n * object store. No-ops (resolving to `undefined`) where `indexedDB` is\n * unavailable (e.g. SSR), so the collection falls back to the server snapshot.\n */\nexport const indexedDbCollectionCache = <T>({\n\tkey,\n\tdatabaseName = 'absolutejs-sync',\n\tstoreName = 'collections'\n}: {\n\t/** Distinct entry name within the store (e.g. the collection + params). */\n\tkey: string;\n\t/** IndexedDB database name. Defaults to `absolutejs-sync`. */\n\tdatabaseName?: string;\n\t/** Object-store name. Defaults to `collections`. */\n\tstoreName?: string;\n}): CollectionCache<T> => {\n\tlet handle: Promise<IDBDatabase> | undefined;\n\tconst database = () => {\n\t\thandle ??= openIndexedDb(databaseName, storeName);\n\t\treturn handle;\n\t};\n\tconst withStore = async <R>(\n\t\tmode: IDBTransactionMode,\n\t\trun: (store: IDBObjectStore) => IDBRequest\n\t): Promise<R | undefined> => {\n\t\tif (globalThis.indexedDB === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst db = await database();\n\t\treturn new Promise<R>((resolve, reject) => {\n\t\t\tconst request = run(\n\t\t\t\tdb.transaction(storeName, mode).objectStore(storeName)\n\t\t\t);\n\t\t\trequest.onsuccess = () => resolve(request.result as R);\n\t\t\trequest.onerror = () => reject(request.error);\n\t\t});\n\t};\n\n\treturn {\n\t\tload: () =>\n\t\t\twithStore<CollectionCacheSnapshot<T>>('readonly', (store) =>\n\t\t\t\tstore.get(key)\n\t\t\t),\n\t\tsave: async (snapshot) => {\n\t\t\tawait withStore('readwrite', (store) => store.put(snapshot, key));\n\t\t},\n\t\tclear: async () => {\n\t\t\tawait withStore('readwrite', (store) => store.delete(key));\n\t\t}\n\t};\n};\n\nexport type SyncCollectionOptions<T> = {\n\t/** WebSocket URL of the {@link syncSocket} endpoint (e.g. `ws://host/sync/ws`). */\n\turl: string;\n\t/** Registered collection name to subscribe to. */\n\tcollection: string;\n\t/** Query params forwarded to the server collection's hydrate/match/authorize. */\n\tparams?: unknown;\n\t/** Row identity, used to apply diffs and optimistic edits. Defaults to `row.id`. */\n\tkey?: (row: T) => RowKey;\n\t/** WebSocket implementation; defaults to the global one (pass for tests/SSR). */\n\twebSocketImpl?: typeof WebSocket;\n\t/**\n\t * Base reconnect delay (ms), doubled each attempt up to `maxReconnectMs`.\n\t * Set 0 to disable auto-reconnect. Defaults to 500.\n\t */\n\treconnectMs?: number;\n\t/** Maximum reconnect backoff (ms). Defaults to 10000. */\n\tmaxReconnectMs?: number;\n\t/**\n\t * Persist the pending-mutation queue so it survives a reload (offline) and\n\t * replays on connect. See {@link localStorageMutationStorage}.\n\t */\n\tstorage?: MutationStorage;\n\t/**\n\t * Persist confirmed rows locally for instant reads on reload and offline\n\t * (local-first). Hydrated before the socket connects; the engine then\n\t * resumes from the cached version (catch-up diff, or a fresh snapshot if the\n\t * server's changelog no longer covers it). See {@link\n\t * localStorageCollectionCache} / {@link indexedDbCollectionCache}.\n\t */\n\tcache?: CollectionCache<T>;\n\t/** Called with each server error message. */\n\tonError?: (error: unknown) => void;\n\t/**\n\t * Wire-format serializer (1.16.0). Defaults to `jsonSerializer`. MUST\n\t * match the server's `syncSocket` serializer.\n\t */\n\tserializer?: FrameSerializer;\n};\n\nexport type SyncCollection<T> = {\n\t/** Current state snapshot (stable reference until the next change). */\n\tget: () => SyncCollectionState<T>;\n\t/** Subscribe to state changes; returns an unsubscribe. */\n\tsubscribe: (\n\t\tlistener: (state: SyncCollectionState<T>) => void\n\t) => () => void;\n\t/**\n\t * Run a server mutation, optionally applying it optimistically. Resolves with\n\t * the server's result on ack, rejects (and rolls back) on reject. Pending\n\t * mutations are replayed when the socket reconnects, so they survive a drop.\n\t */\n\tmutate: <R = unknown>(options: MutateOptions<T>) => Promise<R>;\n\t/**\n\t * Force-close the underlying WebSocket without tearing down state. The\n\t * auto-reconnect loop fires after `reconnectMs`; the collection's\n\t * `appliedVersion` is preserved so the resumed subscribe carries `since`\n\t * and the engine replies with a catch-up diff (or a fresh snapshot if\n\t * the change log no longer covers the gap).\n\t *\n\t * Useful for simulating an offline blip in tests and benches that need\n\t * to measure resume cost specifically (vs cold-hydration on a fresh\n\t * collection). No-op if the collection has been `close()`d.\n\t */\n\tdisconnect: () => void;\n\t/** Unsubscribe on the server, close the socket, and stop reconnecting. */\n\tclose: () => void;\n};\n\n// One store subscribes to exactly one collection, so a fixed frame id suffices.\nconst SUBSCRIPTION_ID = 's';\n\ntype PendingMutation<T> = {\n\tmutationId: number;\n\tname: string;\n\targs: unknown;\n\toptimistic?: (draft: OptimisticDraft<T>) => void;\n\tresolve: (result: unknown) => void;\n\treject: (error: unknown) => void;\n};\n\n/**\n * A live collection backed by the WebSocket sync engine. Reads: connect,\n * subscribe, apply the server's snapshot then row-level diffs, re-sync on\n * reconnect. Writes: {@link SyncCollection.mutate} applies an optimistic overlay\n * immediately, sends the mutation, and reconciles on ack (drop the overlay — the\n * authoritative diff already arrived) or reject (roll back). Framework-agnostic\n * (`get` + `subscribe`).\n *\n * Mutations are replayed on reconnect, so make server mutations idempotent —\n * delivery is at-least-once if an ack is lost across a drop.\n */\nexport const createSyncCollection = <T>(\n\toptions: SyncCollectionOptions<T>\n): SyncCollection<T> => {\n\tconst key = options.key ?? ((row: T) => (row as { id: RowKey }).id);\n\tconst reconnectMs = options.reconnectMs ?? 500;\n\tconst maxReconnectMs = options.maxReconnectMs ?? 10_000;\n\tconst serializer: FrameSerializer = options.serializer ?? jsonSerializer;\n\tconst Impl = options.webSocketImpl ?? globalThis.WebSocket;\n\tif (!Impl) {\n\t\tthrow new Error(\n\t\t\t'createSyncCollection requires WebSocket. Run in a browser or pass webSocketImpl.'\n\t\t);\n\t}\n\n\t// Server-authoritative rows; `pending` is the optimistic overlay on top.\n\tconst confirmed = new Map<RowKey, T>();\n\tconst pending: PendingMutation<T>[] = [];\n\tlet mutationSeq = 0;\n\n\tlet state: SyncCollectionState<T> = {\n\t\tdata: [],\n\t\tstatus: 'connecting',\n\t\terror: undefined\n\t};\n\tconst listeners = new Set<(state: SyncCollectionState<T>) => void>();\n\tconst setState = (patch: Partial<SyncCollectionState<T>>) => {\n\t\tstate = { ...state, ...patch };\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(state);\n\t\t}\n\t};\n\n\t/** Recompute visible rows = confirmed + pending optimistic effects. */\n\tconst recompute = (patch: Partial<SyncCollectionState<T>> = {}) => {\n\t\tconst working = new Map(confirmed);\n\t\tconst draft: OptimisticDraft<T> = {\n\t\t\tset: (row) => working.set(key(row), row),\n\t\t\tdelete: (rowKey) => working.delete(rowKey)\n\t\t};\n\t\tfor (const mutation of pending) {\n\t\t\tmutation.optimistic?.(draft);\n\t\t}\n\t\tsetState({ ...patch, data: [...working.values()] });\n\t};\n\n\tlet socket: WebSocket | undefined;\n\tlet connected = false;\n\tlet closed = false;\n\tlet attempt = 0;\n\tlet reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n\t// Highest change-feed version applied; sent as `since` to resume on reconnect.\n\tlet appliedVersion = 0;\n\n\tconst persist = () => {\n\t\tvoid options.storage?.save(\n\t\t\tpending.map((mutation) => ({\n\t\t\t\tmutationId: mutation.mutationId,\n\t\t\t\tname: mutation.name,\n\t\t\t\targs: mutation.args\n\t\t\t}))\n\t\t);\n\t};\n\n\t// Coalesce a burst of confirmed changes (a frame of diffs) into one cache\n\t// write per tick. Persists only the server-authoritative set — never the\n\t// optimistic overlay (those live in the mutation queue instead).\n\tlet cacheScheduled = false;\n\tconst persistCache = () => {\n\t\tif (options.cache === undefined || cacheScheduled) {\n\t\t\treturn;\n\t\t}\n\t\tcacheScheduled = true;\n\t\tqueueMicrotask(() => {\n\t\t\tcacheScheduled = false;\n\t\t\tvoid options.cache?.save({\n\t\t\t\trows: [...confirmed.values()],\n\t\t\t\tversion: appliedVersion\n\t\t\t});\n\t\t});\n\t};\n\n\tconst settlePending = (mutationId: number) => {\n\t\tconst index = pending.findIndex(\n\t\t\t(mutation) => mutation.mutationId === mutationId\n\t\t);\n\t\tif (index === -1) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst [mutation] = pending.splice(index, 1);\n\t\tpersist();\n\t\treturn mutation;\n\t};\n\n\tconst applyFrame = (frame: ServerFrame<T>) => {\n\t\tif (frame.type === 'snapshot') {\n\t\t\tconfirmed.clear();\n\t\t\tfor (const row of frame.rows) {\n\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t}\n\t\t\tif (frame.version !== undefined) {\n\t\t\t\tappliedVersion = frame.version;\n\t\t\t}\n\t\t\tpersistCache();\n\t\t\trecompute({ status: 'ready', error: undefined });\n\t\t} else if (frame.type === 'diff') {\n\t\t\tfor (const row of frame.removed) {\n\t\t\t\tconfirmed.delete(key(row));\n\t\t\t}\n\t\t\tfor (const row of frame.added) {\n\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t}\n\t\t\tfor (const row of frame.changed) {\n\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t}\n\t\t\tif (frame.version !== undefined) {\n\t\t\t\tappliedVersion = Math.max(appliedVersion, frame.version);\n\t\t\t}\n\t\t\tpersistCache();\n\t\t\t// A diff only arrives once subscribed — including the catch-up diff a\n\t\t\t// resume replies with — so receiving one means we're live.\n\t\t\trecompute({ status: 'ready', error: undefined });\n\t\t} else if (frame.type === 'error') {\n\t\t\tsetState({ error: frame.message });\n\t\t\toptions.onError?.(frame.message);\n\t\t} else if (frame.type === 'ack') {\n\t\t\t// The authoritative diff already arrived (ordered before the ack), so\n\t\t\t// dropping the overlay leaves the confirmed row in place — no flicker.\n\t\t\tconst mutation = settlePending(frame.mutationId);\n\t\t\tif (mutation !== undefined) {\n\t\t\t\trecompute();\n\t\t\t\tmutation.resolve(frame.result);\n\t\t\t}\n\t\t} else if (frame.type === 'reject') {\n\t\t\t// roll the optimistic overlay back.\n\t\t\tconst mutation = settlePending(frame.mutationId);\n\t\t\tif (mutation !== undefined) {\n\t\t\t\trecompute();\n\t\t\t\tmutation.reject(new Error(String(frame.message)));\n\t\t\t}\n\t\t}\n\t\t// A `frame` (multi-collection batch) never reaches a single-collection\n\t\t// store — that's the multiplexed createSyncClient's job — so ignore it.\n\t};\n\n\tconst wsSend = (payload: string | ArrayBufferLike | Uint8Array) => {\n\t\tsocket?.send(payload as string);\n\t};\n\n\tconst sendMutate = (mutation: PendingMutation<T>) => {\n\t\tif (connected) {\n\t\t\twsSend(serializer.encodeClient({\n\t\t\t\ttype: 'mutate',\n\t\t\t\tmutationId: mutation.mutationId,\n\t\t\t\tname: mutation.name,\n\t\t\t\targs: mutation.args\n\t\t\t}));\n\t\t}\n\t};\n\n\tconst connect = () => {\n\t\tif (closed) {\n\t\t\treturn;\n\t\t}\n\t\tsetState({ status: 'connecting' });\n\t\tconst ws = new Impl(options.url);\n\t\tsocket = ws;\n\t\tws.onopen = () => {\n\t\t\tattempt = 0;\n\t\t\tconnected = true;\n\t\t\tws.send(serializer.encodeClient({\n\t\t\t\ttype: 'subscribe',\n\t\t\t\tid: SUBSCRIPTION_ID,\n\t\t\t\tcollection: options.collection,\n\t\t\t\tparams: options.params,\n\t\t\t\t// Resume from what we've applied (catch-up instead of snapshot).\n\t\t\t\tsince: appliedVersion > 0 ? appliedVersion : undefined\n\t\t\t}) as string);\n\t\t\t// Replay anything still pending across the (re)connect.\n\t\t\tfor (const mutation of pending) {\n\t\t\t\tsendMutate(mutation);\n\t\t\t}\n\t\t};\n\t\tws.onmessage = (event) => {\n\t\t\ttry {\n\t\t\t\tconst decoded = serializer.decode(event.data);\n\t\t\t\tif (decoded !== null && typeof decoded === 'object') {\n\t\t\t\t\tapplyFrame(decoded as ServerFrame<T>);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// ignore non-JSON frames\n\t\t\t}\n\t\t};\n\t\tws.onclose = () => {\n\t\t\tconnected = false;\n\t\t\tif (closed || reconnectMs <= 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst delay = Math.min(reconnectMs * 2 ** attempt, maxReconnectMs);\n\t\t\tattempt += 1;\n\t\t\treconnectTimer = setTimeout(connect, delay);\n\t\t};\n\t};\n\n\t// Reload recovery: re-queue persisted unconfirmed mutations so they replay on\n\t// connect. They carry no optimistic effect or promise (the resumed/snapshot\n\t// state is authoritative); resending produces the diffs that bring them in.\n\tconst hydratePersisted = async () => {\n\t\tif (options.storage === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tconst records = await options.storage.load();\n\t\tfor (const record of records) {\n\t\t\tif (pending.some((m) => m.mutationId === record.mutationId)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tpending.push({\n\t\t\t\tmutationId: record.mutationId,\n\t\t\t\tname: record.name,\n\t\t\t\targs: record.args,\n\t\t\t\tresolve: () => {},\n\t\t\t\treject: () => {}\n\t\t\t});\n\t\t\tmutationSeq = Math.max(mutationSeq, record.mutationId);\n\t\t}\n\t\tif (connected) {\n\t\t\tfor (const mutation of pending) {\n\t\t\t\tsendMutate(mutation);\n\t\t\t}\n\t\t}\n\t};\n\n\t// Local-first: load cached rows + version before connecting, so reads are\n\t// instant on reload and available offline. The subscribe then resumes from\n\t// the cached version — a catch-up diff if the server's changelog still\n\t// covers it, else a fresh snapshot that replaces the stale cache.\n\tconst hydrateCache = async () => {\n\t\tif (options.cache === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tlet snapshot: CollectionCacheSnapshot<T> | undefined;\n\t\ttry {\n\t\t\tsnapshot = await options.cache.load();\n\t\t} catch {\n\t\t\treturn; // corrupt/unavailable cache: fall back to the server snapshot\n\t\t}\n\t\t// Don't clobber server data if a frame somehow already landed.\n\t\tif (snapshot === undefined || appliedVersion > 0) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const row of snapshot.rows) {\n\t\t\tconfirmed.set(key(row), row);\n\t\t}\n\t\tappliedVersion = snapshot.version;\n\t\trecompute(); // show cached rows immediately (status stays 'connecting')\n\t};\n\n\tif (options.cache === undefined) {\n\t\t// No cache: preserve the original connect-then-hydrate ordering/timing.\n\t\tconnect();\n\t\tvoid hydratePersisted();\n\t} else {\n\t\t// Cache: hydrate reads + queued writes first, then connect so the\n\t\t// subscribe carries the cached resume version.\n\t\tvoid (async () => {\n\t\t\tawait hydrateCache();\n\t\t\tawait hydratePersisted();\n\t\t\tconnect();\n\t\t})();\n\t}\n\n\treturn {\n\t\tget: () => state,\n\t\tsubscribe: (listener) => {\n\t\t\tlisteners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t};\n\t\t},\n\t\tmutate: <R = unknown>(mutateOptions: MutateOptions<T>) =>\n\t\t\tnew Promise<R>((resolve, reject) => {\n\t\t\t\tconst mutation: PendingMutation<T> = {\n\t\t\t\t\tmutationId: (mutationSeq += 1),\n\t\t\t\t\tname: mutateOptions.name,\n\t\t\t\t\targs: mutateOptions.args,\n\t\t\t\t\toptimistic: mutateOptions.optimistic,\n\t\t\t\t\tresolve: (result) => resolve(result as R),\n\t\t\t\t\treject\n\t\t\t\t};\n\t\t\t\tpending.push(mutation);\n\t\t\t\tpersist();\n\t\t\t\trecompute(); // apply the optimistic overlay immediately\n\t\t\t\tsendMutate(mutation);\n\t\t\t}),\n\t\tdisconnect: () => {\n\t\t\t// Force-close the WS without tearing down state. The existing\n\t\t\t// `ws.onclose` handler schedules a reconnect via the auto-\n\t\t\t// reconnect loop (unless the collection has been `close()`d).\n\t\t\t// `appliedVersion` is preserved, so the resumed subscribe carries\n\t\t\t// `since` and the engine sends a catch-up diff (or snapshot if\n\t\t\t// the change log can't cover the gap).\n\t\t\tif (closed || socket === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tsocket.close();\n\t\t\t} catch {\n\t\t\t\t// already closing/closed\n\t\t\t}\n\t\t},\n\t\tclose: () => {\n\t\t\tif (closed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tclosed = true;\n\t\t\tconnected = false;\n\t\t\tif (reconnectTimer !== undefined) {\n\t\t\t\tclearTimeout(reconnectTimer);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\twsSend(serializer.encodeClient({\n\t\t\t\t\ttype: 'unsubscribe',\n\t\t\t\t\tid: SUBSCRIPTION_ID\n\t\t\t\t}));\n\t\t\t\tsocket?.close();\n\t\t\t} catch {\n\t\t\t\t// socket already closing/closed\n\t\t\t}\n\t\t\t// Fail any still-pending mutations so their promises don't hang.\n\t\t\tfor (const mutation of pending.splice(0)) {\n\t\t\t\tmutation.reject(new Error('sync collection closed'));\n\t\t\t}\n\t\t\tpersist();\n\t\t\tsetState({ status: 'closed' });\n\t\t\tlisteners.clear();\n\t\t}\n\t};\n};\n",
13
14
  "import { createSyncCollection } from './syncCollection';\nimport type { SyncCollectionStatus } from './syncCollection';\nimport { createTextCrdt } from '../crdt';\nimport type { CrdtText, TextState } from '../crdt';\nimport type { RowKey } from '../engine/types';\n\n/**\n * Options for a live collaborative-text binding. It subscribes to a sync\n * collection, tracks one row's CRDT field, and merges remote edits into a local\n * replica — so the visible text reflects everyone's edits and converges. Edits\n * are sent through the engine's auto-registered `\"<collection>:merge\"` mutation\n * (override with `mutation`), which merges instead of overwriting.\n */\nexport type CollaborativeTextOptions<State = TextState> = {\n\t/** The sync WebSocket URL (same one your collections use). */\n\turl: string;\n\t/** Collection (and table) name holding the document rows. */\n\tcollection: string;\n\t/** Which row to edit (its key value). */\n\tid: RowKey;\n\t/** The row field holding the CRDT state. */\n\tfield: string;\n\t/** The row's key field name (defaults to `\"id\"`). */\n\tkeyField?: string;\n\t/** Mutation to send edits through (defaults to `\"<collection>:merge\"`). */\n\tmutation?: string;\n\t/** This client's replica id (defaults to a random UUID). */\n\treplica?: string;\n\t/**\n\t * CRDT backend factory (defaults to the first-party RGA `createTextCrdt`).\n\t * Pass e.g. `(replica) => createYjsText(replica)` from `@absolutejs/sync-yjs`\n\t * — it must match the backend the server registered for this field.\n\t */\n\tcreate?: (replica: string) => CrdtText<State>;\n};\n\nexport type CollaborativeTextState = {\n\t/** The current merged, visible text. */\n\ttext: string;\n\t/** The underlying collection's connection status. */\n\tstatus: SyncCollectionStatus;\n};\n\nexport type CollaborativeText = {\n\tget: () => CollaborativeTextState;\n\tsubscribe: (run: (state: CollaborativeTextState) => void) => () => void;\n\t/** Reconcile the local text to `next` and broadcast the merged state. */\n\tsetText: (next: string) => void;\n\t/** Stable anchor for a caret at visible `index` — broadcast it (e.g. via\n\t * presence) for collaborative cursors that survive concurrent edits. */\n\tanchorAt: (index: number) => string | null;\n\t/** Current visible index of a caret anchored after `anchor`. */\n\tindexOfAnchor: (anchor: string | null) => number;\n\tclose: () => void;\n};\n\n/**\n * Framework-agnostic controller behind the `useCollaborativeText` bindings. Opens\n * a {@link createSyncCollection}, so create it on the client only (the framework\n * wrappers do this in an effect / on mount).\n */\nexport const createCollaborativeText = <State = TextState>(\n\toptions: CollaborativeTextOptions<State>\n): CollaborativeText => {\n\tconst keyField = options.keyField ?? 'id';\n\tconst mutation = options.mutation ?? `${options.collection}:merge`;\n\tconst replica = options.replica ?? globalThis.crypto.randomUUID();\n\tconst make =\n\t\toptions.create ??\n\t\t((id: string) => createTextCrdt(id) as unknown as CrdtText<State>);\n\tconst crdt = make(replica);\n\n\tlet current: CollaborativeTextState = { status: 'connecting', text: '' };\n\tconst subscribers = new Set<(state: CollaborativeTextState) => void>();\n\tconst emit = () => {\n\t\tfor (const run of subscribers) {\n\t\t\trun(current);\n\t\t}\n\t};\n\n\tconst collection = createSyncCollection<Record<string, unknown>>({\n\t\tcollection: options.collection,\n\t\tkey: (row) => row[keyField] as RowKey,\n\t\turl: options.url\n\t});\n\n\tconst apply = (state: {\n\t\tdata: Record<string, unknown>[];\n\t\tstatus: SyncCollectionStatus;\n\t}) => {\n\t\tlet { text } = current;\n\t\tconst row = state.data.find(\n\t\t\t(candidate) => candidate[keyField] === options.id\n\t\t);\n\t\tconst fieldState = row?.[options.field];\n\t\tif (fieldState !== undefined) {\n\t\t\t// Idempotent for our own echoes; folds in other replicas' edits.\n\t\t\tcrdt.merge(fieldState as State);\n\t\t\ttext = crdt.text();\n\t\t}\n\t\tcurrent = { status: state.status, text };\n\t\temit();\n\t};\n\tapply(collection.get());\n\tconst unsubscribe = collection.subscribe(apply);\n\n\treturn {\n\t\tget: () => current,\n\t\tsubscribe(run) {\n\t\t\tsubscribers.add(run);\n\t\t\trun(current);\n\n\t\t\treturn () => {\n\t\t\t\tsubscribers.delete(run);\n\t\t\t};\n\t\t},\n\t\tsetText(next) {\n\t\t\tcrdt.setText(next);\n\t\t\tcurrent = { status: current.status, text: next };\n\t\t\temit();\n\t\t\t// Upload only this edit's ops when the backend supports delta-state\n\t\t\t// (O(edit)); otherwise the full state. The server merges either the\n\t\t\t// same way (union) and keeps full state for late-joiner hydration.\n\t\t\tconst payload = crdt.takeDelta ? crdt.takeDelta() : crdt.state();\n\t\t\tvoid collection.mutate({\n\t\t\t\targs: { [keyField]: options.id, [options.field]: payload },\n\t\t\t\tname: mutation\n\t\t\t});\n\t\t},\n\t\tanchorAt: (index) => crdt.anchorAt?.(index) ?? null,\n\t\tindexOfAnchor: (anchor) => crdt.indexOfAnchor?.(anchor) ?? 0,\n\t\tclose() {\n\t\t\tunsubscribe();\n\t\t\tcollection.close();\n\t\t\tsubscribers.clear();\n\t\t}\n\t};\n};\n",
14
- "import type { PresenceMember } from '../engine/presence';\n\nexport type { PresenceMember } from '../engine/presence';\n\nexport type PresenceClientOptions<S> = {\n\t/** WebSocket URL of the {@link syncSocket} endpoint (e.g. `ws://host/sync/ws`). */\n\turl: string;\n\t/** Presence room to join (e.g. a document id or channel). */\n\troom: string;\n\t/** This member's initial state (e.g. `{ name, typing: false }`). */\n\tstate: S;\n\t/** Stable id for this member; defaults to a random one per client. */\n\tmemberId?: string;\n\t/** WebSocket implementation; defaults to the global one. */\n\twebSocketImpl?: typeof WebSocket;\n\t/** Initial reconnect backoff (ms); doubles per attempt. Defaults to 500. */\n\treconnectMs?: number;\n\t/** Max reconnect backoff (ms). Defaults to 10000. */\n\tmaxReconnectMs?: number;\n};\n\nexport type PresenceClient<S> = {\n\t/** This member's id. */\n\tid: string;\n\t/** Current members in the room (including this one). */\n\tget: () => PresenceMember<S>[];\n\t/** Subscribe to member changes; returns an unsubscribe. */\n\tsubscribe: (listener: (members: PresenceMember<S>[]) => void) => () => void;\n\t/** Update this member's own state (e.g. set `typing: true`). */\n\tset: (state: S) => void;\n\t/** Leave the room and close the socket. */\n\tclose: () => void;\n};\n\n/**\n * Browser client for {@link createPresenceHub} presence: join a room, see who's\n * present (and their state — typing, cursor…), and publish your own. Opens its\n * own small socket to the sync endpoint and re-joins on reconnect.\n * Framework-agnostic (`get` + `subscribe`, ready for `useSyncExternalStore`).\n */\nexport const createPresence = <S>(\n\toptions: PresenceClientOptions<S>\n): PresenceClient<S> => {\n\tconst reconnectMs = options.reconnectMs ?? 500;\n\tconst maxReconnectMs = options.maxReconnectMs ?? 10_000;\n\tconst Impl = options.webSocketImpl ?? globalThis.WebSocket;\n\tif (!Impl) {\n\t\tthrow new Error(\n\t\t\t'createPresence requires WebSocket. Run in a browser or pass webSocketImpl.'\n\t\t);\n\t}\n\tconst id =\n\t\toptions.memberId ??\n\t\tglobalThis.crypto?.randomUUID?.() ??\n\t\t`m${Math.random()}`;\n\n\tconst members = new Map<string, S>();\n\tlet state = options.state;\n\tlet snapshot: PresenceMember<S>[] = [];\n\tconst listeners = new Set<(members: PresenceMember<S>[]) => void>();\n\n\tconst emit = () => {\n\t\tsnapshot = [...members].map(([memberId, memberState]) => ({\n\t\t\tid: memberId,\n\t\t\tstate: memberState\n\t\t}));\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(snapshot);\n\t\t}\n\t};\n\n\tlet socket: WebSocket | undefined;\n\tlet connected = false;\n\tlet closed = false;\n\tlet attempt = 0;\n\tlet reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n\n\tconst send = (frame: unknown) => {\n\t\tif (connected) {\n\t\t\tsocket?.send(JSON.stringify(frame));\n\t\t}\n\t};\n\n\tconst connect = () => {\n\t\tif (closed) {\n\t\t\treturn;\n\t\t}\n\t\tconst ws = new Impl(options.url);\n\t\tsocket = ws;\n\t\tws.onopen = () => {\n\t\t\tattempt = 0;\n\t\t\tconnected = true;\n\t\t\tws.send(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\ttype: 'presence-join',\n\t\t\t\t\troom: options.room,\n\t\t\t\t\tmemberId: id,\n\t\t\t\t\tstate\n\t\t\t\t})\n\t\t\t);\n\t\t};\n\t\tws.onmessage = (event) => {\n\t\t\tlet frame: {\n\t\t\t\ttype?: string;\n\t\t\t\troom?: string;\n\t\t\t\tjoined?: PresenceMember<S>[];\n\t\t\t\tupdated?: PresenceMember<S>[];\n\t\t\t\tleft?: string[];\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tframe = JSON.parse(event.data as string);\n\t\t\t} catch {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (frame.type !== 'presence' || frame.room !== options.room) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (const member of frame.joined ?? []) {\n\t\t\t\tmembers.set(member.id, member.state);\n\t\t\t}\n\t\t\tfor (const member of frame.updated ?? []) {\n\t\t\t\tmembers.set(member.id, member.state);\n\t\t\t}\n\t\t\tfor (const memberId of frame.left ?? []) {\n\t\t\t\tmembers.delete(memberId);\n\t\t\t}\n\t\t\temit();\n\t\t};\n\t\tws.onclose = () => {\n\t\t\tconnected = false;\n\t\t\tif (closed || reconnectMs <= 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst delay = Math.min(reconnectMs * 2 ** attempt, maxReconnectMs);\n\t\t\tattempt += 1;\n\t\t\treconnectTimer = setTimeout(connect, delay);\n\t\t};\n\t};\n\n\tconnect();\n\n\treturn {\n\t\tid,\n\t\tget: () => snapshot,\n\t\tsubscribe: (listener) => {\n\t\t\tlisteners.add(listener);\n\t\t\tlistener(snapshot);\n\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t};\n\t\t},\n\t\tset: (next) => {\n\t\t\tstate = next;\n\t\t\tsend({ type: 'presence-set', room: options.room, state: next });\n\t\t},\n\t\tclose: () => {\n\t\t\tclosed = true;\n\t\t\tif (reconnectTimer !== undefined) {\n\t\t\t\tclearTimeout(reconnectTimer);\n\t\t\t}\n\t\t\tsend({ type: 'presence-leave', room: options.room });\n\t\t\tsocket?.close();\n\t\t\tmembers.clear();\n\t\t}\n\t};\n};\n",
15
- "import type { ServerFrame } from '../engine/connection';\nimport type { RowKey } from '../engine/types';\nimport type {\n\tMutateOptions,\n\tOptimisticDraft,\n\tSyncCollectionState,\n\tSyncCollectionStatus\n} from './syncCollection';\n\nexport type SyncClientOptions = {\n\t/** WebSocket URL of the {@link syncSocket} endpoint (e.g. `ws://host/sync/ws`). */\n\turl: string;\n\t/** WebSocket implementation; defaults to the global one (pass for tests/SSR). */\n\twebSocketImpl?: typeof WebSocket;\n\t/** Initial reconnect backoff (ms); doubles per attempt. Defaults to 500. */\n\treconnectMs?: number;\n\t/** Max reconnect backoff (ms). Defaults to 10000. */\n\tmaxReconnectMs?: number;\n\t/** Called with the message of any server `error` frame. */\n\tonError?: (message: unknown) => void;\n};\n\nexport type SyncCollectionHandleOptions<T> = {\n\t/** Registered collection name to subscribe to. */\n\tcollection: string;\n\t/** Query params forwarded to the server collection. */\n\tparams?: unknown;\n\t/** Row identity. Defaults to `row.id`. */\n\tkey?: (row: T) => RowKey;\n};\n\nexport type SyncCollectionHandle<T> = {\n\t/** Current state snapshot (stable until the next change). */\n\tget: () => SyncCollectionState<T>;\n\t/** Subscribe to state changes; returns an unsubscribe. */\n\tsubscribe: (\n\t\tlistener: (state: SyncCollectionState<T>) => void\n\t) => () => void;\n\t/** Run a server mutation, optionally applying it optimistically. */\n\tmutate: <R = unknown>(options: MutateOptions<T>) => Promise<R>;\n\t/** Unsubscribe this collection (the socket stays open for others). */\n\tclose: () => void;\n};\n\nexport type SyncClient = {\n\t/** Subscribe to a collection over the shared socket. */\n\tcollection: <T>(\n\t\toptions: SyncCollectionHandleOptions<T>\n\t) => SyncCollectionHandle<T>;\n\t/**\n\t * Force-close the underlying WebSocket without tearing down state. The\n\t * auto-reconnect loop fires after `reconnectMs`; each entry's\n\t * `appliedVersion` is preserved so the resumed connection's subscribe\n\t * carries `since` and the engine replies with a catch-up diff (or a\n\t * fresh snapshot if the change log no longer covers the gap).\n\t *\n\t * Useful for simulating an offline blip in tests and for benches that\n\t * measure catch-up cost specifically (vs cold-hydration on a fresh\n\t * client). No-op if the socket is already closed.\n\t */\n\tdisconnect: () => void;\n\t/** Close the socket and every handle. */\n\tclose: () => void;\n};\n\ntype PendingMutation = {\n\tmutationId: number;\n\tname: string;\n\targs: unknown;\n\toptimistic?: (draft: OptimisticDraft<unknown>) => void;\n\tresolve: (result: unknown) => void;\n\treject: (error: unknown) => void;\n};\n\ntype Entry = {\n\tid: string;\n\tcollection: string;\n\tparams: unknown;\n\tkey: (row: unknown) => RowKey;\n\tconfirmed: Map<RowKey, unknown>;\n\tpending: PendingMutation[];\n\tstate: SyncCollectionState<unknown>;\n\tlisteners: Set<(state: SyncCollectionState<unknown>) => void>;\n\tappliedVersion: number;\n\tclosed: boolean;\n};\n\n/**\n * A multiplexed sync client: one WebSocket serving many live collections. Its\n * reason to exist over per-collection {@link createSyncCollection} is the\n * **consistent frame** — when one atomic mutation touches several collections,\n * the server bundles the diffs into a single `frame` and this client applies\n * them all (to every collection's confirmed state) before notifying any\n * listener, so a view reading multiple collections never paints a torn\n * intermediate where one moved and the other hasn't.\n *\n * Reads: subscribe, apply snapshot then diffs/frames, resume on reconnect.\n * Writes: per-collection optimistic overlay, reconciled on ack/reject and\n * replayed on reconnect (make server mutations idempotent).\n */\nexport const createSyncClient = (options: SyncClientOptions): SyncClient => {\n\tconst reconnectMs = options.reconnectMs ?? 500;\n\tconst maxReconnectMs = options.maxReconnectMs ?? 10_000;\n\tconst Impl = options.webSocketImpl ?? globalThis.WebSocket;\n\tif (!Impl) {\n\t\tthrow new Error(\n\t\t\t'createSyncClient requires WebSocket. Run in a browser or pass webSocketImpl.'\n\t\t);\n\t}\n\n\tconst entries = new Map<string, Entry>();\n\tconst mutationOwner = new Map<number, Entry>();\n\tlet nextEntryId = 0;\n\tlet mutationSeq = 0;\n\n\tlet socket: WebSocket | undefined;\n\tlet connected = false;\n\tlet closed = false;\n\tlet attempt = 0;\n\tlet reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n\n\tconst notify = (entry: Entry) => {\n\t\tfor (const listener of entry.listeners) {\n\t\t\tlistener(entry.state);\n\t\t}\n\t};\n\n\t/** Recompute one entry's visible state (confirmed + optimistic), no notify. */\n\tconst rebuild = (\n\t\tentry: Entry,\n\t\tpatch: Partial<SyncCollectionState<unknown>> = {}\n\t) => {\n\t\tconst working = new Map(entry.confirmed);\n\t\tconst draft: OptimisticDraft<unknown> = {\n\t\t\tset: (row) => working.set(entry.key(row), row),\n\t\t\tdelete: (rowKey) => working.delete(rowKey)\n\t\t};\n\t\tfor (const mutation of entry.pending) {\n\t\t\tmutation.optimistic?.(draft);\n\t\t}\n\t\tentry.state = {\n\t\t\t...entry.state,\n\t\t\t...patch,\n\t\t\tdata: [...working.values()]\n\t\t};\n\t};\n\n\tconst recompute = (\n\t\tentry: Entry,\n\t\tpatch: Partial<SyncCollectionState<unknown>> = {}\n\t) => {\n\t\trebuild(entry, patch);\n\t\tnotify(entry);\n\t};\n\n\tconst applyDiffToConfirmed = (\n\t\tentry: Entry,\n\t\tdiff: { added: unknown[]; removed: unknown[]; changed: unknown[] }\n\t) => {\n\t\tfor (const row of diff.removed) {\n\t\t\tentry.confirmed.delete(entry.key(row));\n\t\t}\n\t\tfor (const row of diff.added) {\n\t\t\tentry.confirmed.set(entry.key(row), row);\n\t\t}\n\t\tfor (const row of diff.changed) {\n\t\t\tentry.confirmed.set(entry.key(row), row);\n\t\t}\n\t};\n\n\tconst settlePending = (mutationId: number) => {\n\t\tconst entry = mutationOwner.get(mutationId);\n\t\tmutationOwner.delete(mutationId);\n\t\tif (entry === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst index = entry.pending.findIndex(\n\t\t\t(mutation) => mutation.mutationId === mutationId\n\t\t);\n\t\tif (index === -1) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst [mutation] = entry.pending.splice(index, 1);\n\t\treturn { entry, mutation: mutation! };\n\t};\n\n\tconst applyFrame = (frame: ServerFrame) => {\n\t\tif (frame.type === 'snapshot') {\n\t\t\tconst entry = entries.get(frame.id);\n\t\t\tif (entry === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tentry.confirmed.clear();\n\t\t\tfor (const row of frame.rows) {\n\t\t\t\tentry.confirmed.set(entry.key(row), row);\n\t\t\t}\n\t\t\tif (frame.version !== undefined) {\n\t\t\t\tentry.appliedVersion = frame.version;\n\t\t\t}\n\t\t\trecompute(entry, { status: 'ready', error: undefined });\n\t\t} else if (frame.type === 'diff') {\n\t\t\tconst entry = entries.get(frame.id);\n\t\t\tif (entry === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tapplyDiffToConfirmed(entry, frame);\n\t\t\tif (frame.version !== undefined) {\n\t\t\t\tentry.appliedVersion = Math.max(\n\t\t\t\t\tentry.appliedVersion,\n\t\t\t\t\tframe.version\n\t\t\t\t);\n\t\t\t}\n\t\t\trecompute(entry);\n\t\t} else if (frame.type === 'frame') {\n\t\t\t// The consistent frame: update every affected collection's confirmed\n\t\t\t// state first, then notify — so no listener observes a partial batch.\n\t\t\tconst affected = new Set<Entry>();\n\t\t\tfor (const diff of frame.diffs) {\n\t\t\t\tconst entry = entries.get(diff.id);\n\t\t\t\tif (entry === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tapplyDiffToConfirmed(entry, diff);\n\t\t\t\tif (frame.version !== undefined) {\n\t\t\t\t\tentry.appliedVersion = Math.max(\n\t\t\t\t\t\tentry.appliedVersion,\n\t\t\t\t\t\tframe.version\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// Update state now, but defer notifying until every collection in\n\t\t\t\t// the frame is updated — so no listener observes a partial batch.\n\t\t\t\trebuild(entry);\n\t\t\t\taffected.add(entry);\n\t\t\t}\n\t\t\tfor (const entry of affected) {\n\t\t\t\tnotify(entry);\n\t\t\t}\n\t\t} else if (frame.type === 'error') {\n\t\t\tif (frame.id !== undefined) {\n\t\t\t\tconst entry = entries.get(frame.id);\n\t\t\t\tif (entry !== undefined) {\n\t\t\t\t\trecompute(entry, { error: frame.message });\n\t\t\t\t}\n\t\t\t}\n\t\t\toptions.onError?.(frame.message);\n\t\t} else if (frame.type === 'ack') {\n\t\t\tconst settled = settlePending(frame.mutationId);\n\t\t\tif (settled !== undefined) {\n\t\t\t\trecompute(settled.entry);\n\t\t\t\tsettled.mutation.resolve(frame.result);\n\t\t\t}\n\t\t} else if (frame.type === 'reject') {\n\t\t\tconst settled = settlePending(frame.mutationId);\n\t\t\tif (settled !== undefined) {\n\t\t\t\trecompute(settled.entry);\n\t\t\t\tsettled.mutation.reject(new Error(String(frame.message)));\n\t\t\t}\n\t\t}\n\t};\n\n\tconst sendSubscribe = (entry: Entry) => {\n\t\tsocket?.send(\n\t\t\tJSON.stringify({\n\t\t\t\ttype: 'subscribe',\n\t\t\t\tid: entry.id,\n\t\t\t\tcollection: entry.collection,\n\t\t\t\tparams: entry.params,\n\t\t\t\tsince:\n\t\t\t\t\tentry.appliedVersion > 0 ? entry.appliedVersion : undefined\n\t\t\t})\n\t\t);\n\t};\n\n\tconst sendMutate = (mutation: PendingMutation) => {\n\t\tif (connected) {\n\t\t\tsocket?.send(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\ttype: 'mutate',\n\t\t\t\t\tmutationId: mutation.mutationId,\n\t\t\t\t\tname: mutation.name,\n\t\t\t\t\targs: mutation.args\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t};\n\n\tconst connect = () => {\n\t\tif (closed) {\n\t\t\treturn;\n\t\t}\n\t\tconst ws = new Impl(options.url);\n\t\tsocket = ws;\n\t\tws.onopen = () => {\n\t\t\tattempt = 0;\n\t\t\tconnected = true;\n\t\t\tfor (const entry of entries.values()) {\n\t\t\t\tsendSubscribe(entry);\n\t\t\t}\n\t\t\tfor (const entry of entries.values()) {\n\t\t\t\tfor (const mutation of entry.pending) {\n\t\t\t\t\tsendMutate(mutation);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tws.onmessage = (event) => {\n\t\t\ttry {\n\t\t\t\tapplyFrame(JSON.parse(event.data as string) as ServerFrame);\n\t\t\t} catch {\n\t\t\t\t// ignore non-JSON frames\n\t\t\t}\n\t\t};\n\t\tws.onclose = () => {\n\t\t\tconnected = false;\n\t\t\tif (closed || reconnectMs <= 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst delay = Math.min(reconnectMs * 2 ** attempt, maxReconnectMs);\n\t\t\tattempt += 1;\n\t\t\treconnectTimer = setTimeout(connect, delay);\n\t\t};\n\t};\n\n\tconnect();\n\n\tconst collection = <T>(\n\t\thandleOptions: SyncCollectionHandleOptions<T>\n\t): SyncCollectionHandle<T> => {\n\t\tconst entryId = `c${nextEntryId}`;\n\t\tnextEntryId += 1;\n\t\tconst entry: Entry = {\n\t\t\tid: entryId,\n\t\t\tcollection: handleOptions.collection,\n\t\t\tparams: handleOptions.params,\n\t\t\tkey:\n\t\t\t\t(handleOptions.key as ((row: unknown) => RowKey) | undefined) ??\n\t\t\t\t((row: unknown) => (row as { id: RowKey }).id),\n\t\t\tconfirmed: new Map(),\n\t\t\tpending: [],\n\t\t\tstate: { data: [], status: 'connecting', error: undefined },\n\t\t\tlisteners: new Set(),\n\t\t\tappliedVersion: 0,\n\t\t\tclosed: false\n\t\t};\n\t\tentries.set(entryId, entry);\n\t\tif (connected) {\n\t\t\tsendSubscribe(entry);\n\t\t}\n\n\t\treturn {\n\t\t\tget: () => entry.state as SyncCollectionState<T>,\n\t\t\tsubscribe: (listener) => {\n\t\t\t\tconst typed = listener as (\n\t\t\t\t\tstate: SyncCollectionState<unknown>\n\t\t\t\t) => void;\n\t\t\t\tentry.listeners.add(typed);\n\t\t\t\tlistener(entry.state as SyncCollectionState<T>);\n\t\t\t\treturn () => {\n\t\t\t\t\tentry.listeners.delete(typed);\n\t\t\t\t};\n\t\t\t},\n\t\t\tmutate: <R = unknown>(mutateOptions: MutateOptions<T>) =>\n\t\t\t\tnew Promise<R>((resolve, reject) => {\n\t\t\t\t\tmutationSeq += 1;\n\t\t\t\t\tconst mutation: PendingMutation = {\n\t\t\t\t\t\tmutationId: mutationSeq,\n\t\t\t\t\t\tname: mutateOptions.name,\n\t\t\t\t\t\targs: mutateOptions.args,\n\t\t\t\t\t\toptimistic: mutateOptions.optimistic as\n\t\t\t\t\t\t\t| ((draft: OptimisticDraft<unknown>) => void)\n\t\t\t\t\t\t\t| undefined,\n\t\t\t\t\t\tresolve: (result) => resolve(result as R),\n\t\t\t\t\t\treject\n\t\t\t\t\t};\n\t\t\t\t\tentry.pending.push(mutation);\n\t\t\t\t\tmutationOwner.set(mutation.mutationId, entry);\n\t\t\t\t\trecompute(entry);\n\t\t\t\t\tsendMutate(mutation);\n\t\t\t\t}),\n\t\t\tclose: () => {\n\t\t\t\tif (entry.closed) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tentry.closed = true;\n\t\t\t\tentries.delete(entryId);\n\t\t\t\tif (connected) {\n\t\t\t\t\tsocket?.send(\n\t\t\t\t\t\tJSON.stringify({ type: 'unsubscribe', id: entryId })\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t};\n\n\tconst close = () => {\n\t\tclosed = true;\n\t\tif (reconnectTimer !== undefined) {\n\t\t\tclearTimeout(reconnectTimer);\n\t\t}\n\t\tsocket?.close();\n\t\tentries.clear();\n\t\tmutationOwner.clear();\n\t};\n\n\tconst disconnect = () => {\n\t\t// Force-close the WS without tearing down state. The existing\n\t\t// `ws.onclose` handler schedules a reconnect via the auto-reconnect\n\t\t// loop (unless the whole client has been `close()`d). Each entry's\n\t\t// `appliedVersion` survives, so the resumed subscribe carries `since`\n\t\t// and the engine sends a catch-up diff (or a snapshot if the gap is\n\t\t// too large for the change log).\n\t\tif (closed || socket === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tsocket.close();\n\t};\n\n\treturn { collection, close, disconnect };\n};\n\nexport type { SyncCollectionState, SyncCollectionStatus };\n",
16
- "import type { ServerFrame } from '../engine/connection';\nimport type { RowKey } from '../engine/types';\nimport type { MutationStorage, PendingMutationRecord } from './syncCollection';\n\nexport type SyncStoreStatus = 'connecting' | 'ready' | 'closed';\n\nexport type SyncStoreState<Row> = {\n\t/** Visible rows: confirmed server state with pending optimistic edits applied. */\n\tdata: Row[];\n\tstatus: SyncStoreStatus;\n\terror: unknown;\n};\n\n/** A working set a mutation's optimistic effect edits in place. */\nexport type OptimisticDraft<Row> = {\n\tset: (row: Row) => void;\n\tdelete: (key: RowKey) => void;\n};\n\n/** A map of named server mutations — typically Eden calls. */\nexport type MutationMap = Record<string, (args: never) => Promise<unknown>>;\n\nexport type MutateOptions<Row> = {\n\t/** Apply the mutation's effect locally for instant UI (rolled back on reject). */\n\toptimistic?: (draft: OptimisticDraft<Row>) => void;\n};\n\nexport type SyncStoreOptions<Row, M extends MutationMap> = {\n\t/** WebSocket URL of the {@link syncSocket} endpoint. */\n\turl: string;\n\t/** Collection name to subscribe to for diffs. */\n\tcollection: string;\n\t/** Query params forwarded to the server collection. */\n\tparams?: unknown;\n\t/**\n\t * Typed read — typically an Eden call (`() => unwrapEden(api.sync.orders.get(...))`).\n\t * It is the source of the `Row` **type**, gives an eager first paint, and is\n\t * reusable for SSR. Live confirmed state then comes from the WS snapshot.\n\t */\n\thydrate?: () => Promise<Row[]>;\n\t/** Seed rows (e.g. from SSR); shown immediately, refreshed by the WS snapshot. */\n\tinitialData?: Row[];\n\t/** Typed server mutations (Eden calls). Enables `store.mutate(name, args, ...)`. */\n\tmutations?: M;\n\t/** Row identity. Defaults to `row.id`. */\n\tkey?: (row: Row) => RowKey;\n\twebSocketImpl?: typeof WebSocket;\n\treconnectMs?: number;\n\tmaxReconnectMs?: number;\n\t/**\n\t * After the server confirms a mutation, drop its optimistic overlay this long\n\t * after if no diff has reflected it (covers mutations that don't touch this\n\t * collection). Defaults to 3000.\n\t */\n\treconcileGraceMs?: number;\n\t/** Persist the pending-mutation queue across reloads (offline). */\n\tstorage?: MutationStorage;\n\tonError?: (error: unknown) => void;\n};\n\nexport type SyncStore<Row, M extends MutationMap> = {\n\tget: () => SyncStoreState<Row>;\n\tsubscribe: (listener: (state: SyncStoreState<Row>) => void) => () => void;\n\t/**\n\t * Run a named server mutation, optionally applying it optimistically. Resolves\n\t * with the server's result; rolls back and rejects if the server rejects it.\n\t * While offline (socket down) it stays queued and retries on reconnect.\n\t */\n\tmutate: <K extends keyof M>(\n\t\tname: K,\n\t\targs: Parameters<M[K]>[0],\n\t\toptions?: MutateOptions<Row>\n\t) => Promise<Awaited<ReturnType<M[K]>>>;\n\t/** Re-run `hydrate` and refresh confirmed state. */\n\trefetch: () => Promise<void>;\n\tclose: () => void;\n};\n\nconst SUBSCRIPTION_ID = 's';\n\ntype Pending<Row> = {\n\tid: number;\n\tname: string;\n\targs: unknown;\n\t/** Keys this mutation's optimistic effect touched, and how. */\n\ttouched: Map<RowKey, 'set' | 'delete'>;\n\toptimistic?: (draft: OptimisticDraft<Row>) => void;\n\tsettled: boolean;\n\tinFlight: boolean;\n\tresolve: (value: unknown) => void;\n\treject: (error: unknown) => void;\n\tgraceTimer?: ReturnType<typeof setTimeout>;\n};\n\n/**\n * A generic, Eden-fed live collection store (the typed Tier 3 client). Confirmed\n * state is maintained from the WS snapshot + diffs; mutations run over your typed\n * transport (Eden), apply an optimistic overlay, and reconcile against the diffs.\n * Types come entirely from the `hydrate`/`mutations` you pass — no `<T>`.\n */\nexport const syncStore = <Row, M extends MutationMap = MutationMap>(\n\toptions: SyncStoreOptions<Row, M>\n): SyncStore<Row, M> => {\n\tconst key = options.key ?? ((row: Row) => (row as { id: RowKey }).id);\n\tconst reconnectMs = options.reconnectMs ?? 500;\n\tconst maxReconnectMs = options.maxReconnectMs ?? 10_000;\n\tconst reconcileGraceMs = options.reconcileGraceMs ?? 3000;\n\tconst mutations = options.mutations ?? ({} as M);\n\tconst Impl = options.webSocketImpl ?? globalThis.WebSocket;\n\tif (!Impl) {\n\t\tthrow new Error(\n\t\t\t'syncStore requires WebSocket. Run in a browser or pass webSocketImpl.'\n\t\t);\n\t}\n\n\tconst confirmed = new Map<RowKey, Row>();\n\tconst pending: Pending<Row>[] = [];\n\tlet mutationSeq = 0;\n\n\tlet state: SyncStoreState<Row> = {\n\t\tdata: options.initialData ? [...options.initialData] : [],\n\t\tstatus: 'connecting',\n\t\terror: undefined\n\t};\n\tif (options.initialData) {\n\t\tfor (const row of options.initialData) {\n\t\t\tconfirmed.set(key(row), row);\n\t\t}\n\t}\n\n\tconst listeners = new Set<(state: SyncStoreState<Row>) => void>();\n\tconst setState = (patch: Partial<SyncStoreState<Row>>) => {\n\t\tstate = { ...state, ...patch };\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(state);\n\t\t}\n\t};\n\tconst recompute = (patch: Partial<SyncStoreState<Row>> = {}) => {\n\t\tconst working = new Map(confirmed);\n\t\tconst draft: OptimisticDraft<Row> = {\n\t\t\tset: (row) => working.set(key(row), row),\n\t\t\tdelete: (rowKey) => working.delete(rowKey)\n\t\t};\n\t\tfor (const mutation of pending) {\n\t\t\tmutation.optimistic?.(draft);\n\t\t}\n\t\tsetState({ ...patch, data: [...working.values()] });\n\t};\n\n\tconst persist = () => {\n\t\tvoid options.storage?.save(\n\t\t\tpending.map((mutation) => ({\n\t\t\t\tmutationId: mutation.id,\n\t\t\t\tname: mutation.name,\n\t\t\t\targs: mutation.args\n\t\t\t}))\n\t\t);\n\t};\n\n\tconst dropPending = (mutation: Pending<Row>) => {\n\t\tconst index = pending.indexOf(mutation);\n\t\tif (index !== -1) {\n\t\t\tpending.splice(index, 1);\n\t\t}\n\t\tif (mutation.graceTimer !== undefined) {\n\t\t\tclearTimeout(mutation.graceTimer);\n\t\t}\n\t};\n\n\t/** Drop settled overlays whose touched keys are now reflected in confirmed. */\n\tconst reconcileSettled = () => {\n\t\tlet changed = false;\n\t\tfor (const mutation of [...pending]) {\n\t\t\tif (!mutation.settled) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet reflected = true;\n\t\t\tfor (const [rowKey, kind] of mutation.touched) {\n\t\t\t\tconst present = confirmed.has(rowKey);\n\t\t\t\tif (kind === 'set' ? !present : present) {\n\t\t\t\t\treflected = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (reflected) {\n\t\t\t\tdropPending(mutation);\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\t\tif (changed) {\n\t\t\trecompute();\n\t\t}\n\t};\n\n\tlet socket: WebSocket | undefined;\n\tlet connected = false;\n\tlet closed = false;\n\tlet attempt = 0;\n\tlet reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n\t// Highest change-feed version applied; sent as `since` to resume on reconnect.\n\tlet appliedVersion = 0;\n\n\tconst applyFrame = (frame: ServerFrame<Row>) => {\n\t\tif (frame.type === 'snapshot') {\n\t\t\tconfirmed.clear();\n\t\t\tfor (const row of frame.rows) {\n\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t}\n\t\t\tif (frame.version !== undefined) {\n\t\t\t\tappliedVersion = frame.version;\n\t\t\t}\n\t\t\trecompute({ status: 'ready', error: undefined });\n\t\t\treconcileSettled();\n\t\t} else if (frame.type === 'diff') {\n\t\t\tfor (const row of frame.removed) {\n\t\t\t\tconfirmed.delete(key(row));\n\t\t\t}\n\t\t\tfor (const row of frame.added) {\n\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t}\n\t\t\tfor (const row of frame.changed) {\n\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t}\n\t\t\tif (frame.version !== undefined) {\n\t\t\t\tappliedVersion = Math.max(appliedVersion, frame.version);\n\t\t\t}\n\t\t\trecompute();\n\t\t\treconcileSettled();\n\t\t} else if (frame.type === 'error') {\n\t\t\tsetState({ error: frame.message });\n\t\t\toptions.onError?.(frame.message);\n\t\t}\n\t\t// ack/reject frames are unused here — mutations run over the typed transport.\n\t};\n\n\tconst runMutation = async (mutation: Pending<Row>) => {\n\t\tif (mutation.inFlight || mutation.settled) {\n\t\t\treturn;\n\t\t}\n\t\tconst run = mutations[mutation.name];\n\t\tif (run === undefined) {\n\t\t\tdropPending(mutation);\n\t\t\trecompute();\n\t\t\tmutation.reject(new Error(`Unknown mutation \"${mutation.name}\"`));\n\t\t\treturn;\n\t\t}\n\t\tmutation.inFlight = true;\n\t\ttry {\n\t\t\tconst result = await (run as (args: unknown) => Promise<unknown>)(\n\t\t\t\tmutation.args\n\t\t\t);\n\t\t\tmutation.inFlight = false;\n\t\t\tmutation.settled = true;\n\t\t\tmutation.resolve(result);\n\t\t\tpersist();\n\t\t\treconcileSettled();\n\t\t\t// If the diff hasn't reflected it yet, drop the overlay after a grace.\n\t\t\tif (pending.includes(mutation)) {\n\t\t\t\tmutation.graceTimer = setTimeout(() => {\n\t\t\t\t\tdropPending(mutation);\n\t\t\t\t\trecompute();\n\t\t\t\t}, reconcileGraceMs);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tmutation.inFlight = false;\n\t\t\tif (connected) {\n\t\t\t\t// Server is reachable → a real rejection: roll back.\n\t\t\t\tdropPending(mutation);\n\t\t\t\trecompute();\n\t\t\t\tpersist();\n\t\t\t\tmutation.reject(error);\n\t\t\t} else {\n\t\t\t\t// Offline → keep queued; retry on reconnect.\n\t\t\t\toptions.onError?.(error);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst connect = () => {\n\t\tif (closed) {\n\t\t\treturn;\n\t\t}\n\t\tsetState({ status: 'connecting' });\n\t\tconst ws = new Impl(options.url);\n\t\tsocket = ws;\n\t\tws.onopen = () => {\n\t\t\tattempt = 0;\n\t\t\tconnected = true;\n\t\t\tws.send(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\ttype: 'subscribe',\n\t\t\t\t\tid: SUBSCRIPTION_ID,\n\t\t\t\t\tcollection: options.collection,\n\t\t\t\t\tparams: options.params,\n\t\t\t\t\t// Resume from what we've applied (catch-up instead of snapshot).\n\t\t\t\t\tsince: appliedVersion > 0 ? appliedVersion : undefined\n\t\t\t\t})\n\t\t\t);\n\t\t\t// Retry mutations that failed/queued while offline.\n\t\t\tfor (const mutation of pending) {\n\t\t\t\tif (!mutation.settled && !mutation.inFlight) {\n\t\t\t\t\tvoid runMutation(mutation);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tws.onmessage = (event) => {\n\t\t\ttry {\n\t\t\t\tapplyFrame(\n\t\t\t\t\tJSON.parse(event.data as string) as ServerFrame<Row>\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\t// ignore non-JSON frames\n\t\t\t}\n\t\t};\n\t\tws.onclose = () => {\n\t\t\tconnected = false;\n\t\t\tif (closed || reconnectMs <= 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst delay = Math.min(reconnectMs * 2 ** attempt, maxReconnectMs);\n\t\t\tattempt += 1;\n\t\t\treconnectTimer = setTimeout(connect, delay);\n\t\t};\n\t};\n\n\tconst eagerHydrate = async () => {\n\t\tif (\n\t\t\toptions.hydrate === undefined ||\n\t\t\toptions.initialData !== undefined\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst rows = await options.hydrate();\n\t\t\t// Don't clobber a WS snapshot that already arrived.\n\t\t\tif (state.status !== 'ready') {\n\t\t\t\tconfirmed.clear();\n\t\t\t\tfor (const row of rows) {\n\t\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t\t}\n\t\t\t\trecompute({ status: 'ready' });\n\t\t\t}\n\t\t} catch (error) {\n\t\t\toptions.onError?.(error);\n\t\t}\n\t};\n\n\tconst hydratePersisted = async () => {\n\t\tif (options.storage === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tconst records = await options.storage.load();\n\t\tfor (const record of records as PendingMutationRecord[]) {\n\t\t\tif (pending.some((m) => m.id === record.mutationId)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tpending.push({\n\t\t\t\tid: record.mutationId,\n\t\t\t\tname: record.name,\n\t\t\t\targs: record.args,\n\t\t\t\ttouched: new Map(),\n\t\t\t\tsettled: false,\n\t\t\t\tinFlight: false,\n\t\t\t\tresolve: () => {},\n\t\t\t\treject: () => {}\n\t\t\t});\n\t\t\tmutationSeq = Math.max(mutationSeq, record.mutationId);\n\t\t}\n\t\tif (connected) {\n\t\t\tfor (const mutation of pending) {\n\t\t\t\tvoid runMutation(mutation);\n\t\t\t}\n\t\t}\n\t};\n\n\tconnect();\n\tvoid eagerHydrate();\n\tvoid hydratePersisted();\n\n\tconst collectTouched = (\n\t\toptimistic?: (draft: OptimisticDraft<Row>) => void\n\t) => {\n\t\tconst touched = new Map<RowKey, 'set' | 'delete'>();\n\t\toptimistic?.({\n\t\t\tset: (row) => touched.set(key(row), 'set'),\n\t\t\tdelete: (rowKey) => touched.set(rowKey, 'delete')\n\t\t});\n\t\treturn touched;\n\t};\n\n\treturn {\n\t\tget: () => state,\n\t\tsubscribe: (listener) => {\n\t\t\tlisteners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t};\n\t\t},\n\t\tmutate: ((name, args, mutateOptions) =>\n\t\t\tnew Promise((resolve, reject) => {\n\t\t\t\tconst mutation: Pending<Row> = {\n\t\t\t\t\tid: (mutationSeq += 1),\n\t\t\t\t\tname: name as string,\n\t\t\t\t\targs,\n\t\t\t\t\ttouched: collectTouched(mutateOptions?.optimistic),\n\t\t\t\t\toptimistic: mutateOptions?.optimistic,\n\t\t\t\t\tsettled: false,\n\t\t\t\t\tinFlight: false,\n\t\t\t\t\tresolve: resolve as (value: unknown) => void,\n\t\t\t\t\treject\n\t\t\t\t};\n\t\t\t\tpending.push(mutation);\n\t\t\t\tpersist();\n\t\t\t\trecompute();\n\t\t\t\tvoid runMutation(mutation);\n\t\t\t})) as SyncStore<Row, M>['mutate'],\n\t\trefetch: async () => {\n\t\t\tif (options.hydrate === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst rows = await options.hydrate();\n\t\t\tconfirmed.clear();\n\t\t\tfor (const row of rows) {\n\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t}\n\t\t\trecompute({ status: 'ready' });\n\t\t},\n\t\tclose: () => {\n\t\t\tif (closed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tclosed = true;\n\t\t\tconnected = false;\n\t\t\tif (reconnectTimer !== undefined) {\n\t\t\t\tclearTimeout(reconnectTimer);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tsocket?.send(\n\t\t\t\t\tJSON.stringify({ type: 'unsubscribe', id: SUBSCRIPTION_ID })\n\t\t\t\t);\n\t\t\t\tsocket?.close();\n\t\t\t} catch {\n\t\t\t\t// already closing\n\t\t\t}\n\t\t\tfor (const mutation of pending.splice(0)) {\n\t\t\t\tif (mutation.graceTimer !== undefined) {\n\t\t\t\t\tclearTimeout(mutation.graceTimer);\n\t\t\t\t}\n\t\t\t\tmutation.reject(new Error('sync store closed'));\n\t\t\t}\n\t\t\tpersist();\n\t\t\tsetState({ status: 'closed' });\n\t\t\tlisteners.clear();\n\t\t}\n\t};\n};\n\n/**\n * Unwrap an Eden treaty response (`{ data, error }`) to its data, throwing the\n * error. Use it to feed Eden calls to {@link syncStore}'s `hydrate`/`mutations`:\n * `hydrate: () => unwrapEden(api.sync.orders.get({ query }))`.\n */\nexport const unwrapEden = async <T>(\n\tresponse: Promise<{ data: T | null; error?: unknown }>\n): Promise<T> => {\n\tconst { data, error } = await response;\n\tif (error !== null && error !== undefined) {\n\t\tthrow error;\n\t}\n\treturn data as T;\n};\n"
15
+ "import type { PresenceMember } from '../engine/presence';\nimport { jsonSerializer, type FrameSerializer } from '../serializer';\n\nexport type { PresenceMember } from '../engine/presence';\n\nexport type PresenceClientOptions<S> = {\n\t/** WebSocket URL of the {@link syncSocket} endpoint (e.g. `ws://host/sync/ws`). */\n\turl: string;\n\t/** Presence room to join (e.g. a document id or channel). */\n\troom: string;\n\t/** This member's initial state (e.g. `{ name, typing: false }`). */\n\tstate: S;\n\t/** Stable id for this member; defaults to a random one per client. */\n\tmemberId?: string;\n\t/** WebSocket implementation; defaults to the global one. */\n\twebSocketImpl?: typeof WebSocket;\n\t/** Initial reconnect backoff (ms); doubles per attempt. Defaults to 500. */\n\treconnectMs?: number;\n\t/** Max reconnect backoff (ms). Defaults to 10000. */\n\tmaxReconnectMs?: number;\n\t/**\n\t * Wire-format serializer (1.16.0). Defaults to `jsonSerializer`. MUST\n\t * match the server's `syncSocket` serializer.\n\t */\n\tserializer?: FrameSerializer;\n};\n\nexport type PresenceClient<S> = {\n\t/** This member's id. */\n\tid: string;\n\t/** Current members in the room (including this one). */\n\tget: () => PresenceMember<S>[];\n\t/** Subscribe to member changes; returns an unsubscribe. */\n\tsubscribe: (listener: (members: PresenceMember<S>[]) => void) => () => void;\n\t/** Update this member's own state (e.g. set `typing: true`). */\n\tset: (state: S) => void;\n\t/** Leave the room and close the socket. */\n\tclose: () => void;\n};\n\n/**\n * Browser client for {@link createPresenceHub} presence: join a room, see who's\n * present (and their state — typing, cursor…), and publish your own. Opens its\n * own small socket to the sync endpoint and re-joins on reconnect.\n * Framework-agnostic (`get` + `subscribe`, ready for `useSyncExternalStore`).\n */\nexport const createPresence = <S>(\n\toptions: PresenceClientOptions<S>\n): PresenceClient<S> => {\n\tconst reconnectMs = options.reconnectMs ?? 500;\n\tconst maxReconnectMs = options.maxReconnectMs ?? 10_000;\n\tconst serializer: FrameSerializer = options.serializer ?? jsonSerializer;\n\tconst Impl = options.webSocketImpl ?? globalThis.WebSocket;\n\tif (!Impl) {\n\t\tthrow new Error(\n\t\t\t'createPresence requires WebSocket. Run in a browser or pass webSocketImpl.'\n\t\t);\n\t}\n\tconst id =\n\t\toptions.memberId ??\n\t\tglobalThis.crypto?.randomUUID?.() ??\n\t\t`m${Math.random()}`;\n\n\tconst members = new Map<string, S>();\n\tlet state = options.state;\n\tlet snapshot: PresenceMember<S>[] = [];\n\tconst listeners = new Set<(members: PresenceMember<S>[]) => void>();\n\n\tconst emit = () => {\n\t\tsnapshot = [...members].map(([memberId, memberState]) => ({\n\t\t\tid: memberId,\n\t\t\tstate: memberState\n\t\t}));\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(snapshot);\n\t\t}\n\t};\n\n\tlet socket: WebSocket | undefined;\n\tlet connected = false;\n\tlet closed = false;\n\tlet attempt = 0;\n\tlet reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n\n\tconst send = (frame: unknown) => {\n\t\tif (connected) {\n\t\t\t// Presence sends are presence-* ClientFrames; the serializer\n\t\t\t// validates structurally on encode.\n\t\t\tsocket?.send(\n\t\t\t\tserializer.encodeClient(frame as Parameters<FrameSerializer['encodeClient']>[0]) as string\n\t\t\t);\n\t\t}\n\t};\n\n\tconst connect = () => {\n\t\tif (closed) {\n\t\t\treturn;\n\t\t}\n\t\tconst ws = new Impl(options.url);\n\t\tsocket = ws;\n\t\tws.onopen = () => {\n\t\t\tattempt = 0;\n\t\t\tconnected = true;\n\t\t\tws.send(serializer.encodeClient({\n\t\t\t\ttype: 'presence-join',\n\t\t\t\troom: options.room,\n\t\t\t\tmemberId: id,\n\t\t\t\tstate\n\t\t\t}) as string);\n\t\t};\n\t\tws.onmessage = (event) => {\n\t\t\tlet frame: {\n\t\t\t\ttype?: string;\n\t\t\t\troom?: string;\n\t\t\t\tjoined?: PresenceMember<S>[];\n\t\t\t\tupdated?: PresenceMember<S>[];\n\t\t\t\tleft?: string[];\n\t\t\t};\n\t\t\tconst decoded = serializer.decode(event.data);\n\t\t\tif (decoded === null || typeof decoded !== 'object') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tframe = decoded as typeof frame;\n\t\t\tif (frame.type !== 'presence' || frame.room !== options.room) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (const member of frame.joined ?? []) {\n\t\t\t\tmembers.set(member.id, member.state);\n\t\t\t}\n\t\t\tfor (const member of frame.updated ?? []) {\n\t\t\t\tmembers.set(member.id, member.state);\n\t\t\t}\n\t\t\tfor (const memberId of frame.left ?? []) {\n\t\t\t\tmembers.delete(memberId);\n\t\t\t}\n\t\t\temit();\n\t\t};\n\t\tws.onclose = () => {\n\t\t\tconnected = false;\n\t\t\tif (closed || reconnectMs <= 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst delay = Math.min(reconnectMs * 2 ** attempt, maxReconnectMs);\n\t\t\tattempt += 1;\n\t\t\treconnectTimer = setTimeout(connect, delay);\n\t\t};\n\t};\n\n\tconnect();\n\n\treturn {\n\t\tid,\n\t\tget: () => snapshot,\n\t\tsubscribe: (listener) => {\n\t\t\tlisteners.add(listener);\n\t\t\tlistener(snapshot);\n\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t};\n\t\t},\n\t\tset: (next) => {\n\t\t\tstate = next;\n\t\t\tsend({ type: 'presence-set', room: options.room, state: next });\n\t\t},\n\t\tclose: () => {\n\t\t\tclosed = true;\n\t\t\tif (reconnectTimer !== undefined) {\n\t\t\t\tclearTimeout(reconnectTimer);\n\t\t\t}\n\t\t\tsend({ type: 'presence-leave', room: options.room });\n\t\t\tsocket?.close();\n\t\t\tmembers.clear();\n\t\t}\n\t};\n};\n",
16
+ "import type { ServerFrame } from '../engine/connection';\nimport type { RowKey } from '../engine/types';\nimport type {\n\tMutateOptions,\n\tOptimisticDraft,\n\tSyncCollectionState,\n\tSyncCollectionStatus\n} from './syncCollection';\nimport { jsonSerializer, type FrameSerializer } from '../serializer';\n\nexport type SyncClientOptions = {\n\t/** WebSocket URL of the {@link syncSocket} endpoint (e.g. `ws://host/sync/ws`). */\n\turl: string;\n\t/** WebSocket implementation; defaults to the global one (pass for tests/SSR). */\n\twebSocketImpl?: typeof WebSocket;\n\t/** Initial reconnect backoff (ms); doubles per attempt. Defaults to 500. */\n\treconnectMs?: number;\n\t/** Max reconnect backoff (ms). Defaults to 10000. */\n\tmaxReconnectMs?: number;\n\t/** Called with the message of any server `error` frame. */\n\tonError?: (message: unknown) => void;\n\t/**\n\t * Wire-format serializer (1.16.0). Defaults to `jsonSerializer` — the\n\t * historical JSON-over-WS behavior. MUST match the server's `syncSocket`\n\t * serializer; opt into a binary one (msgpack, cbor, custom) on both\n\t * ends to cut bandwidth + parse CPU on large snapshots.\n\t */\n\tserializer?: FrameSerializer;\n};\n\nexport type SyncCollectionHandleOptions<T> = {\n\t/** Registered collection name to subscribe to. */\n\tcollection: string;\n\t/** Query params forwarded to the server collection. */\n\tparams?: unknown;\n\t/** Row identity. Defaults to `row.id`. */\n\tkey?: (row: T) => RowKey;\n};\n\nexport type SyncCollectionHandle<T> = {\n\t/** Current state snapshot (stable until the next change). */\n\tget: () => SyncCollectionState<T>;\n\t/** Subscribe to state changes; returns an unsubscribe. */\n\tsubscribe: (\n\t\tlistener: (state: SyncCollectionState<T>) => void\n\t) => () => void;\n\t/** Run a server mutation, optionally applying it optimistically. */\n\tmutate: <R = unknown>(options: MutateOptions<T>) => Promise<R>;\n\t/** Unsubscribe this collection (the socket stays open for others). */\n\tclose: () => void;\n};\n\nexport type SyncClient = {\n\t/** Subscribe to a collection over the shared socket. */\n\tcollection: <T>(\n\t\toptions: SyncCollectionHandleOptions<T>\n\t) => SyncCollectionHandle<T>;\n\t/**\n\t * Force-close the underlying WebSocket without tearing down state. The\n\t * auto-reconnect loop fires after `reconnectMs`; each entry's\n\t * `appliedVersion` is preserved so the resumed connection's subscribe\n\t * carries `since` and the engine replies with a catch-up diff (or a\n\t * fresh snapshot if the change log no longer covers the gap).\n\t *\n\t * Useful for simulating an offline blip in tests and for benches that\n\t * measure catch-up cost specifically (vs cold-hydration on a fresh\n\t * client). No-op if the socket is already closed.\n\t */\n\tdisconnect: () => void;\n\t/** Close the socket and every handle. */\n\tclose: () => void;\n};\n\ntype PendingMutation = {\n\tmutationId: number;\n\tname: string;\n\targs: unknown;\n\toptimistic?: (draft: OptimisticDraft<unknown>) => void;\n\tresolve: (result: unknown) => void;\n\treject: (error: unknown) => void;\n};\n\ntype Entry = {\n\tid: string;\n\tcollection: string;\n\tparams: unknown;\n\tkey: (row: unknown) => RowKey;\n\tconfirmed: Map<RowKey, unknown>;\n\tpending: PendingMutation[];\n\tstate: SyncCollectionState<unknown>;\n\tlisteners: Set<(state: SyncCollectionState<unknown>) => void>;\n\tappliedVersion: number;\n\tclosed: boolean;\n};\n\n/**\n * A multiplexed sync client: one WebSocket serving many live collections. Its\n * reason to exist over per-collection {@link createSyncCollection} is the\n * **consistent frame** — when one atomic mutation touches several collections,\n * the server bundles the diffs into a single `frame` and this client applies\n * them all (to every collection's confirmed state) before notifying any\n * listener, so a view reading multiple collections never paints a torn\n * intermediate where one moved and the other hasn't.\n *\n * Reads: subscribe, apply snapshot then diffs/frames, resume on reconnect.\n * Writes: per-collection optimistic overlay, reconciled on ack/reject and\n * replayed on reconnect (make server mutations idempotent).\n */\nexport const createSyncClient = (options: SyncClientOptions): SyncClient => {\n\tconst reconnectMs = options.reconnectMs ?? 500;\n\tconst maxReconnectMs = options.maxReconnectMs ?? 10_000;\n\tconst serializer: FrameSerializer = options.serializer ?? jsonSerializer;\n\tconst Impl = options.webSocketImpl ?? globalThis.WebSocket;\n\tif (!Impl) {\n\t\tthrow new Error(\n\t\t\t'createSyncClient requires WebSocket. Run in a browser or pass webSocketImpl.'\n\t\t);\n\t}\n\n\tconst entries = new Map<string, Entry>();\n\tconst mutationOwner = new Map<number, Entry>();\n\tlet nextEntryId = 0;\n\tlet mutationSeq = 0;\n\n\tlet socket: WebSocket | undefined;\n\tlet connected = false;\n\tlet closed = false;\n\tlet attempt = 0;\n\tlet reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n\n\tconst notify = (entry: Entry) => {\n\t\tfor (const listener of entry.listeners) {\n\t\t\tlistener(entry.state);\n\t\t}\n\t};\n\n\t/** Recompute one entry's visible state (confirmed + optimistic), no notify. */\n\tconst rebuild = (\n\t\tentry: Entry,\n\t\tpatch: Partial<SyncCollectionState<unknown>> = {}\n\t) => {\n\t\tconst working = new Map(entry.confirmed);\n\t\tconst draft: OptimisticDraft<unknown> = {\n\t\t\tset: (row) => working.set(entry.key(row), row),\n\t\t\tdelete: (rowKey) => working.delete(rowKey)\n\t\t};\n\t\tfor (const mutation of entry.pending) {\n\t\t\tmutation.optimistic?.(draft);\n\t\t}\n\t\tentry.state = {\n\t\t\t...entry.state,\n\t\t\t...patch,\n\t\t\tdata: [...working.values()]\n\t\t};\n\t};\n\n\tconst recompute = (\n\t\tentry: Entry,\n\t\tpatch: Partial<SyncCollectionState<unknown>> = {}\n\t) => {\n\t\trebuild(entry, patch);\n\t\tnotify(entry);\n\t};\n\n\tconst applyDiffToConfirmed = (\n\t\tentry: Entry,\n\t\tdiff: { added: unknown[]; removed: unknown[]; changed: unknown[] }\n\t) => {\n\t\tfor (const row of diff.removed) {\n\t\t\tentry.confirmed.delete(entry.key(row));\n\t\t}\n\t\tfor (const row of diff.added) {\n\t\t\tentry.confirmed.set(entry.key(row), row);\n\t\t}\n\t\tfor (const row of diff.changed) {\n\t\t\tentry.confirmed.set(entry.key(row), row);\n\t\t}\n\t};\n\n\tconst settlePending = (mutationId: number) => {\n\t\tconst entry = mutationOwner.get(mutationId);\n\t\tmutationOwner.delete(mutationId);\n\t\tif (entry === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst index = entry.pending.findIndex(\n\t\t\t(mutation) => mutation.mutationId === mutationId\n\t\t);\n\t\tif (index === -1) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst [mutation] = entry.pending.splice(index, 1);\n\t\treturn { entry, mutation: mutation! };\n\t};\n\n\tconst applyFrame = (frame: ServerFrame) => {\n\t\tif (frame.type === 'snapshot') {\n\t\t\tconst entry = entries.get(frame.id);\n\t\t\tif (entry === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tentry.confirmed.clear();\n\t\t\tfor (const row of frame.rows) {\n\t\t\t\tentry.confirmed.set(entry.key(row), row);\n\t\t\t}\n\t\t\tif (frame.version !== undefined) {\n\t\t\t\tentry.appliedVersion = frame.version;\n\t\t\t}\n\t\t\trecompute(entry, { status: 'ready', error: undefined });\n\t\t} else if (frame.type === 'diff') {\n\t\t\tconst entry = entries.get(frame.id);\n\t\t\tif (entry === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tapplyDiffToConfirmed(entry, frame);\n\t\t\tif (frame.version !== undefined) {\n\t\t\t\tentry.appliedVersion = Math.max(\n\t\t\t\t\tentry.appliedVersion,\n\t\t\t\t\tframe.version\n\t\t\t\t);\n\t\t\t}\n\t\t\trecompute(entry);\n\t\t} else if (frame.type === 'frame') {\n\t\t\t// The consistent frame: update every affected collection's confirmed\n\t\t\t// state first, then notify — so no listener observes a partial batch.\n\t\t\tconst affected = new Set<Entry>();\n\t\t\tfor (const diff of frame.diffs) {\n\t\t\t\tconst entry = entries.get(diff.id);\n\t\t\t\tif (entry === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tapplyDiffToConfirmed(entry, diff);\n\t\t\t\tif (frame.version !== undefined) {\n\t\t\t\t\tentry.appliedVersion = Math.max(\n\t\t\t\t\t\tentry.appliedVersion,\n\t\t\t\t\t\tframe.version\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// Update state now, but defer notifying until every collection in\n\t\t\t\t// the frame is updated — so no listener observes a partial batch.\n\t\t\t\trebuild(entry);\n\t\t\t\taffected.add(entry);\n\t\t\t}\n\t\t\tfor (const entry of affected) {\n\t\t\t\tnotify(entry);\n\t\t\t}\n\t\t} else if (frame.type === 'error') {\n\t\t\tif (frame.id !== undefined) {\n\t\t\t\tconst entry = entries.get(frame.id);\n\t\t\t\tif (entry !== undefined) {\n\t\t\t\t\trecompute(entry, { error: frame.message });\n\t\t\t\t}\n\t\t\t}\n\t\t\toptions.onError?.(frame.message);\n\t\t} else if (frame.type === 'ack') {\n\t\t\tconst settled = settlePending(frame.mutationId);\n\t\t\tif (settled !== undefined) {\n\t\t\t\trecompute(settled.entry);\n\t\t\t\tsettled.mutation.resolve(frame.result);\n\t\t\t}\n\t\t} else if (frame.type === 'reject') {\n\t\t\tconst settled = settlePending(frame.mutationId);\n\t\t\tif (settled !== undefined) {\n\t\t\t\trecompute(settled.entry);\n\t\t\t\tsettled.mutation.reject(new Error(String(frame.message)));\n\t\t\t}\n\t\t}\n\t};\n\n\tconst wsSend = (payload: string | ArrayBufferLike | Uint8Array) => {\n\t\t// Native WebSocket.send accepts string | ArrayBufferLike | Blob | ArrayBufferView.\n\t\tsocket?.send(payload as string);\n\t};\n\n\tconst sendSubscribe = (entry: Entry) => {\n\t\twsSend(serializer.encodeClient({\n\t\t\ttype: 'subscribe',\n\t\t\tid: entry.id,\n\t\t\tcollection: entry.collection,\n\t\t\tparams: entry.params,\n\t\t\tsince:\n\t\t\t\tentry.appliedVersion > 0 ? entry.appliedVersion : undefined\n\t\t}));\n\t};\n\n\tconst sendMutate = (mutation: PendingMutation) => {\n\t\tif (connected) {\n\t\t\twsSend(serializer.encodeClient({\n\t\t\t\ttype: 'mutate',\n\t\t\t\tmutationId: mutation.mutationId,\n\t\t\t\tname: mutation.name,\n\t\t\t\targs: mutation.args\n\t\t\t}));\n\t\t}\n\t};\n\n\tconst connect = () => {\n\t\tif (closed) {\n\t\t\treturn;\n\t\t}\n\t\tconst ws = new Impl(options.url);\n\t\tsocket = ws;\n\t\tws.onopen = () => {\n\t\t\tattempt = 0;\n\t\t\tconnected = true;\n\t\t\tfor (const entry of entries.values()) {\n\t\t\t\tsendSubscribe(entry);\n\t\t\t}\n\t\t\tfor (const entry of entries.values()) {\n\t\t\t\tfor (const mutation of entry.pending) {\n\t\t\t\t\tsendMutate(mutation);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tws.onmessage = (event) => {\n\t\t\ttry {\n\t\t\t\tconst decoded = serializer.decode(event.data);\n\t\t\t\tif (decoded !== null && typeof decoded === 'object') {\n\t\t\t\t\tapplyFrame(decoded as ServerFrame);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// ignore unparseable frames\n\t\t\t}\n\t\t};\n\t\tws.onclose = () => {\n\t\t\tconnected = false;\n\t\t\tif (closed || reconnectMs <= 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst delay = Math.min(reconnectMs * 2 ** attempt, maxReconnectMs);\n\t\t\tattempt += 1;\n\t\t\treconnectTimer = setTimeout(connect, delay);\n\t\t};\n\t};\n\n\tconnect();\n\n\tconst collection = <T>(\n\t\thandleOptions: SyncCollectionHandleOptions<T>\n\t): SyncCollectionHandle<T> => {\n\t\tconst entryId = `c${nextEntryId}`;\n\t\tnextEntryId += 1;\n\t\tconst entry: Entry = {\n\t\t\tid: entryId,\n\t\t\tcollection: handleOptions.collection,\n\t\t\tparams: handleOptions.params,\n\t\t\tkey:\n\t\t\t\t(handleOptions.key as ((row: unknown) => RowKey) | undefined) ??\n\t\t\t\t((row: unknown) => (row as { id: RowKey }).id),\n\t\t\tconfirmed: new Map(),\n\t\t\tpending: [],\n\t\t\tstate: { data: [], status: 'connecting', error: undefined },\n\t\t\tlisteners: new Set(),\n\t\t\tappliedVersion: 0,\n\t\t\tclosed: false\n\t\t};\n\t\tentries.set(entryId, entry);\n\t\tif (connected) {\n\t\t\tsendSubscribe(entry);\n\t\t}\n\n\t\treturn {\n\t\t\tget: () => entry.state as SyncCollectionState<T>,\n\t\t\tsubscribe: (listener) => {\n\t\t\t\tconst typed = listener as (\n\t\t\t\t\tstate: SyncCollectionState<unknown>\n\t\t\t\t) => void;\n\t\t\t\tentry.listeners.add(typed);\n\t\t\t\tlistener(entry.state as SyncCollectionState<T>);\n\t\t\t\treturn () => {\n\t\t\t\t\tentry.listeners.delete(typed);\n\t\t\t\t};\n\t\t\t},\n\t\t\tmutate: <R = unknown>(mutateOptions: MutateOptions<T>) =>\n\t\t\t\tnew Promise<R>((resolve, reject) => {\n\t\t\t\t\tmutationSeq += 1;\n\t\t\t\t\tconst mutation: PendingMutation = {\n\t\t\t\t\t\tmutationId: mutationSeq,\n\t\t\t\t\t\tname: mutateOptions.name,\n\t\t\t\t\t\targs: mutateOptions.args,\n\t\t\t\t\t\toptimistic: mutateOptions.optimistic as\n\t\t\t\t\t\t\t| ((draft: OptimisticDraft<unknown>) => void)\n\t\t\t\t\t\t\t| undefined,\n\t\t\t\t\t\tresolve: (result) => resolve(result as R),\n\t\t\t\t\t\treject\n\t\t\t\t\t};\n\t\t\t\t\tentry.pending.push(mutation);\n\t\t\t\t\tmutationOwner.set(mutation.mutationId, entry);\n\t\t\t\t\trecompute(entry);\n\t\t\t\t\tsendMutate(mutation);\n\t\t\t\t}),\n\t\t\tclose: () => {\n\t\t\t\tif (entry.closed) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tentry.closed = true;\n\t\t\t\tentries.delete(entryId);\n\t\t\t\tif (connected) {\n\t\t\t\t\twsSend(serializer.encodeClient({\n\t\t\t\t\t\ttype: 'unsubscribe',\n\t\t\t\t\t\tid: entryId\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t};\n\n\tconst close = () => {\n\t\tclosed = true;\n\t\tif (reconnectTimer !== undefined) {\n\t\t\tclearTimeout(reconnectTimer);\n\t\t}\n\t\tsocket?.close();\n\t\tentries.clear();\n\t\tmutationOwner.clear();\n\t};\n\n\tconst disconnect = () => {\n\t\t// Force-close the WS without tearing down state. The existing\n\t\t// `ws.onclose` handler schedules a reconnect via the auto-reconnect\n\t\t// loop (unless the whole client has been `close()`d). Each entry's\n\t\t// `appliedVersion` survives, so the resumed subscribe carries `since`\n\t\t// and the engine sends a catch-up diff (or a snapshot if the gap is\n\t\t// too large for the change log).\n\t\tif (closed || socket === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tsocket.close();\n\t};\n\n\treturn { collection, close, disconnect };\n};\n\nexport type { SyncCollectionState, SyncCollectionStatus };\n",
17
+ "import type { ServerFrame } from '../engine/connection';\nimport type { RowKey } from '../engine/types';\nimport type { MutationStorage, PendingMutationRecord } from './syncCollection';\nimport { jsonSerializer, type FrameSerializer } from '../serializer';\n\nexport type SyncStoreStatus = 'connecting' | 'ready' | 'closed';\n\nexport type SyncStoreState<Row> = {\n\t/** Visible rows: confirmed server state with pending optimistic edits applied. */\n\tdata: Row[];\n\tstatus: SyncStoreStatus;\n\terror: unknown;\n};\n\n/** A working set a mutation's optimistic effect edits in place. */\nexport type OptimisticDraft<Row> = {\n\tset: (row: Row) => void;\n\tdelete: (key: RowKey) => void;\n};\n\n/** A map of named server mutations — typically Eden calls. */\nexport type MutationMap = Record<string, (args: never) => Promise<unknown>>;\n\nexport type MutateOptions<Row> = {\n\t/** Apply the mutation's effect locally for instant UI (rolled back on reject). */\n\toptimistic?: (draft: OptimisticDraft<Row>) => void;\n};\n\nexport type SyncStoreOptions<Row, M extends MutationMap> = {\n\t/** WebSocket URL of the {@link syncSocket} endpoint. */\n\turl: string;\n\t/** Collection name to subscribe to for diffs. */\n\tcollection: string;\n\t/** Query params forwarded to the server collection. */\n\tparams?: unknown;\n\t/**\n\t * Typed read — typically an Eden call (`() => unwrapEden(api.sync.orders.get(...))`).\n\t * It is the source of the `Row` **type**, gives an eager first paint, and is\n\t * reusable for SSR. Live confirmed state then comes from the WS snapshot.\n\t */\n\thydrate?: () => Promise<Row[]>;\n\t/** Seed rows (e.g. from SSR); shown immediately, refreshed by the WS snapshot. */\n\tinitialData?: Row[];\n\t/** Typed server mutations (Eden calls). Enables `store.mutate(name, args, ...)`. */\n\tmutations?: M;\n\t/** Row identity. Defaults to `row.id`. */\n\tkey?: (row: Row) => RowKey;\n\twebSocketImpl?: typeof WebSocket;\n\treconnectMs?: number;\n\tmaxReconnectMs?: number;\n\t/**\n\t * After the server confirms a mutation, drop its optimistic overlay this long\n\t * after if no diff has reflected it (covers mutations that don't touch this\n\t * collection). Defaults to 3000.\n\t */\n\treconcileGraceMs?: number;\n\t/** Persist the pending-mutation queue across reloads (offline). */\n\tstorage?: MutationStorage;\n\tonError?: (error: unknown) => void;\n\t/**\n\t * Wire-format serializer (1.16.0). Defaults to `jsonSerializer`. MUST\n\t * match the server's `syncSocket` serializer.\n\t */\n\tserializer?: FrameSerializer;\n};\n\nexport type SyncStore<Row, M extends MutationMap> = {\n\tget: () => SyncStoreState<Row>;\n\tsubscribe: (listener: (state: SyncStoreState<Row>) => void) => () => void;\n\t/**\n\t * Run a named server mutation, optionally applying it optimistically. Resolves\n\t * with the server's result; rolls back and rejects if the server rejects it.\n\t * While offline (socket down) it stays queued and retries on reconnect.\n\t */\n\tmutate: <K extends keyof M>(\n\t\tname: K,\n\t\targs: Parameters<M[K]>[0],\n\t\toptions?: MutateOptions<Row>\n\t) => Promise<Awaited<ReturnType<M[K]>>>;\n\t/** Re-run `hydrate` and refresh confirmed state. */\n\trefetch: () => Promise<void>;\n\tclose: () => void;\n};\n\nconst SUBSCRIPTION_ID = 's';\n\ntype Pending<Row> = {\n\tid: number;\n\tname: string;\n\targs: unknown;\n\t/** Keys this mutation's optimistic effect touched, and how. */\n\ttouched: Map<RowKey, 'set' | 'delete'>;\n\toptimistic?: (draft: OptimisticDraft<Row>) => void;\n\tsettled: boolean;\n\tinFlight: boolean;\n\tresolve: (value: unknown) => void;\n\treject: (error: unknown) => void;\n\tgraceTimer?: ReturnType<typeof setTimeout>;\n};\n\n/**\n * A generic, Eden-fed live collection store (the typed Tier 3 client). Confirmed\n * state is maintained from the WS snapshot + diffs; mutations run over your typed\n * transport (Eden), apply an optimistic overlay, and reconcile against the diffs.\n * Types come entirely from the `hydrate`/`mutations` you pass — no `<T>`.\n */\nexport const syncStore = <Row, M extends MutationMap = MutationMap>(\n\toptions: SyncStoreOptions<Row, M>\n): SyncStore<Row, M> => {\n\tconst key = options.key ?? ((row: Row) => (row as { id: RowKey }).id);\n\tconst reconnectMs = options.reconnectMs ?? 500;\n\tconst maxReconnectMs = options.maxReconnectMs ?? 10_000;\n\tconst reconcileGraceMs = options.reconcileGraceMs ?? 3000;\n\tconst mutations = options.mutations ?? ({} as M);\n\tconst serializer: FrameSerializer = options.serializer ?? jsonSerializer;\n\tconst Impl = options.webSocketImpl ?? globalThis.WebSocket;\n\tif (!Impl) {\n\t\tthrow new Error(\n\t\t\t'syncStore requires WebSocket. Run in a browser or pass webSocketImpl.'\n\t\t);\n\t}\n\n\tconst confirmed = new Map<RowKey, Row>();\n\tconst pending: Pending<Row>[] = [];\n\tlet mutationSeq = 0;\n\n\tlet state: SyncStoreState<Row> = {\n\t\tdata: options.initialData ? [...options.initialData] : [],\n\t\tstatus: 'connecting',\n\t\terror: undefined\n\t};\n\tif (options.initialData) {\n\t\tfor (const row of options.initialData) {\n\t\t\tconfirmed.set(key(row), row);\n\t\t}\n\t}\n\n\tconst listeners = new Set<(state: SyncStoreState<Row>) => void>();\n\tconst setState = (patch: Partial<SyncStoreState<Row>>) => {\n\t\tstate = { ...state, ...patch };\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(state);\n\t\t}\n\t};\n\tconst recompute = (patch: Partial<SyncStoreState<Row>> = {}) => {\n\t\tconst working = new Map(confirmed);\n\t\tconst draft: OptimisticDraft<Row> = {\n\t\t\tset: (row) => working.set(key(row), row),\n\t\t\tdelete: (rowKey) => working.delete(rowKey)\n\t\t};\n\t\tfor (const mutation of pending) {\n\t\t\tmutation.optimistic?.(draft);\n\t\t}\n\t\tsetState({ ...patch, data: [...working.values()] });\n\t};\n\n\tconst persist = () => {\n\t\tvoid options.storage?.save(\n\t\t\tpending.map((mutation) => ({\n\t\t\t\tmutationId: mutation.id,\n\t\t\t\tname: mutation.name,\n\t\t\t\targs: mutation.args\n\t\t\t}))\n\t\t);\n\t};\n\n\tconst dropPending = (mutation: Pending<Row>) => {\n\t\tconst index = pending.indexOf(mutation);\n\t\tif (index !== -1) {\n\t\t\tpending.splice(index, 1);\n\t\t}\n\t\tif (mutation.graceTimer !== undefined) {\n\t\t\tclearTimeout(mutation.graceTimer);\n\t\t}\n\t};\n\n\t/** Drop settled overlays whose touched keys are now reflected in confirmed. */\n\tconst reconcileSettled = () => {\n\t\tlet changed = false;\n\t\tfor (const mutation of [...pending]) {\n\t\t\tif (!mutation.settled) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet reflected = true;\n\t\t\tfor (const [rowKey, kind] of mutation.touched) {\n\t\t\t\tconst present = confirmed.has(rowKey);\n\t\t\t\tif (kind === 'set' ? !present : present) {\n\t\t\t\t\treflected = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (reflected) {\n\t\t\t\tdropPending(mutation);\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\t\tif (changed) {\n\t\t\trecompute();\n\t\t}\n\t};\n\n\tlet socket: WebSocket | undefined;\n\tlet connected = false;\n\tlet closed = false;\n\tlet attempt = 0;\n\tlet reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n\t// Highest change-feed version applied; sent as `since` to resume on reconnect.\n\tlet appliedVersion = 0;\n\n\tconst applyFrame = (frame: ServerFrame<Row>) => {\n\t\tif (frame.type === 'snapshot') {\n\t\t\tconfirmed.clear();\n\t\t\tfor (const row of frame.rows) {\n\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t}\n\t\t\tif (frame.version !== undefined) {\n\t\t\t\tappliedVersion = frame.version;\n\t\t\t}\n\t\t\trecompute({ status: 'ready', error: undefined });\n\t\t\treconcileSettled();\n\t\t} else if (frame.type === 'diff') {\n\t\t\tfor (const row of frame.removed) {\n\t\t\t\tconfirmed.delete(key(row));\n\t\t\t}\n\t\t\tfor (const row of frame.added) {\n\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t}\n\t\t\tfor (const row of frame.changed) {\n\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t}\n\t\t\tif (frame.version !== undefined) {\n\t\t\t\tappliedVersion = Math.max(appliedVersion, frame.version);\n\t\t\t}\n\t\t\trecompute();\n\t\t\treconcileSettled();\n\t\t} else if (frame.type === 'error') {\n\t\t\tsetState({ error: frame.message });\n\t\t\toptions.onError?.(frame.message);\n\t\t}\n\t\t// ack/reject frames are unused here — mutations run over the typed transport.\n\t};\n\n\tconst runMutation = async (mutation: Pending<Row>) => {\n\t\tif (mutation.inFlight || mutation.settled) {\n\t\t\treturn;\n\t\t}\n\t\tconst run = mutations[mutation.name];\n\t\tif (run === undefined) {\n\t\t\tdropPending(mutation);\n\t\t\trecompute();\n\t\t\tmutation.reject(new Error(`Unknown mutation \"${mutation.name}\"`));\n\t\t\treturn;\n\t\t}\n\t\tmutation.inFlight = true;\n\t\ttry {\n\t\t\tconst result = await (run as (args: unknown) => Promise<unknown>)(\n\t\t\t\tmutation.args\n\t\t\t);\n\t\t\tmutation.inFlight = false;\n\t\t\tmutation.settled = true;\n\t\t\tmutation.resolve(result);\n\t\t\tpersist();\n\t\t\treconcileSettled();\n\t\t\t// If the diff hasn't reflected it yet, drop the overlay after a grace.\n\t\t\tif (pending.includes(mutation)) {\n\t\t\t\tmutation.graceTimer = setTimeout(() => {\n\t\t\t\t\tdropPending(mutation);\n\t\t\t\t\trecompute();\n\t\t\t\t}, reconcileGraceMs);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tmutation.inFlight = false;\n\t\t\tif (connected) {\n\t\t\t\t// Server is reachable → a real rejection: roll back.\n\t\t\t\tdropPending(mutation);\n\t\t\t\trecompute();\n\t\t\t\tpersist();\n\t\t\t\tmutation.reject(error);\n\t\t\t} else {\n\t\t\t\t// Offline → keep queued; retry on reconnect.\n\t\t\t\toptions.onError?.(error);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst connect = () => {\n\t\tif (closed) {\n\t\t\treturn;\n\t\t}\n\t\tsetState({ status: 'connecting' });\n\t\tconst ws = new Impl(options.url);\n\t\tsocket = ws;\n\t\tws.onopen = () => {\n\t\t\tattempt = 0;\n\t\t\tconnected = true;\n\t\t\tws.send(serializer.encodeClient({\n\t\t\t\ttype: 'subscribe',\n\t\t\t\tid: SUBSCRIPTION_ID,\n\t\t\t\tcollection: options.collection,\n\t\t\t\tparams: options.params,\n\t\t\t\t// Resume from what we've applied (catch-up instead of snapshot).\n\t\t\t\tsince: appliedVersion > 0 ? appliedVersion : undefined\n\t\t\t}) as string);\n\t\t\t// Retry mutations that failed/queued while offline.\n\t\t\tfor (const mutation of pending) {\n\t\t\t\tif (!mutation.settled && !mutation.inFlight) {\n\t\t\t\t\tvoid runMutation(mutation);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tws.onmessage = (event) => {\n\t\t\ttry {\n\t\t\t\tconst decoded = serializer.decode(event.data);\n\t\t\t\tif (decoded !== null && typeof decoded === 'object') {\n\t\t\t\t\tapplyFrame(decoded as ServerFrame<Row>);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// ignore unparseable frames\n\t\t\t}\n\t\t};\n\t\tws.onclose = () => {\n\t\t\tconnected = false;\n\t\t\tif (closed || reconnectMs <= 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst delay = Math.min(reconnectMs * 2 ** attempt, maxReconnectMs);\n\t\t\tattempt += 1;\n\t\t\treconnectTimer = setTimeout(connect, delay);\n\t\t};\n\t};\n\n\tconst eagerHydrate = async () => {\n\t\tif (\n\t\t\toptions.hydrate === undefined ||\n\t\t\toptions.initialData !== undefined\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst rows = await options.hydrate();\n\t\t\t// Don't clobber a WS snapshot that already arrived.\n\t\t\tif (state.status !== 'ready') {\n\t\t\t\tconfirmed.clear();\n\t\t\t\tfor (const row of rows) {\n\t\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t\t}\n\t\t\t\trecompute({ status: 'ready' });\n\t\t\t}\n\t\t} catch (error) {\n\t\t\toptions.onError?.(error);\n\t\t}\n\t};\n\n\tconst hydratePersisted = async () => {\n\t\tif (options.storage === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tconst records = await options.storage.load();\n\t\tfor (const record of records as PendingMutationRecord[]) {\n\t\t\tif (pending.some((m) => m.id === record.mutationId)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tpending.push({\n\t\t\t\tid: record.mutationId,\n\t\t\t\tname: record.name,\n\t\t\t\targs: record.args,\n\t\t\t\ttouched: new Map(),\n\t\t\t\tsettled: false,\n\t\t\t\tinFlight: false,\n\t\t\t\tresolve: () => {},\n\t\t\t\treject: () => {}\n\t\t\t});\n\t\t\tmutationSeq = Math.max(mutationSeq, record.mutationId);\n\t\t}\n\t\tif (connected) {\n\t\t\tfor (const mutation of pending) {\n\t\t\t\tvoid runMutation(mutation);\n\t\t\t}\n\t\t}\n\t};\n\n\tconnect();\n\tvoid eagerHydrate();\n\tvoid hydratePersisted();\n\n\tconst collectTouched = (\n\t\toptimistic?: (draft: OptimisticDraft<Row>) => void\n\t) => {\n\t\tconst touched = new Map<RowKey, 'set' | 'delete'>();\n\t\toptimistic?.({\n\t\t\tset: (row) => touched.set(key(row), 'set'),\n\t\t\tdelete: (rowKey) => touched.set(rowKey, 'delete')\n\t\t});\n\t\treturn touched;\n\t};\n\n\treturn {\n\t\tget: () => state,\n\t\tsubscribe: (listener) => {\n\t\t\tlisteners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t};\n\t\t},\n\t\tmutate: ((name, args, mutateOptions) =>\n\t\t\tnew Promise((resolve, reject) => {\n\t\t\t\tconst mutation: Pending<Row> = {\n\t\t\t\t\tid: (mutationSeq += 1),\n\t\t\t\t\tname: name as string,\n\t\t\t\t\targs,\n\t\t\t\t\ttouched: collectTouched(mutateOptions?.optimistic),\n\t\t\t\t\toptimistic: mutateOptions?.optimistic,\n\t\t\t\t\tsettled: false,\n\t\t\t\t\tinFlight: false,\n\t\t\t\t\tresolve: resolve as (value: unknown) => void,\n\t\t\t\t\treject\n\t\t\t\t};\n\t\t\t\tpending.push(mutation);\n\t\t\t\tpersist();\n\t\t\t\trecompute();\n\t\t\t\tvoid runMutation(mutation);\n\t\t\t})) as SyncStore<Row, M>['mutate'],\n\t\trefetch: async () => {\n\t\t\tif (options.hydrate === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst rows = await options.hydrate();\n\t\t\tconfirmed.clear();\n\t\t\tfor (const row of rows) {\n\t\t\t\tconfirmed.set(key(row), row);\n\t\t\t}\n\t\t\trecompute({ status: 'ready' });\n\t\t},\n\t\tclose: () => {\n\t\t\tif (closed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tclosed = true;\n\t\t\tconnected = false;\n\t\t\tif (reconnectTimer !== undefined) {\n\t\t\t\tclearTimeout(reconnectTimer);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tsocket?.send(\n\t\t\t\t\tserializer.encodeClient({\n\t\t\t\t\t\ttype: 'unsubscribe',\n\t\t\t\t\t\tid: SUBSCRIPTION_ID\n\t\t\t\t\t}) as string\n\t\t\t\t);\n\t\t\t\tsocket?.close();\n\t\t\t} catch {\n\t\t\t\t// already closing\n\t\t\t}\n\t\t\tfor (const mutation of pending.splice(0)) {\n\t\t\t\tif (mutation.graceTimer !== undefined) {\n\t\t\t\t\tclearTimeout(mutation.graceTimer);\n\t\t\t\t}\n\t\t\t\tmutation.reject(new Error('sync store closed'));\n\t\t\t}\n\t\t\tpersist();\n\t\t\tsetState({ status: 'closed' });\n\t\t\tlisteners.clear();\n\t\t}\n\t};\n};\n\n/**\n * Unwrap an Eden treaty response (`{ data, error }`) to its data, throwing the\n * error. Use it to feed Eden calls to {@link syncStore}'s `hydrate`/`mutations`:\n * `hydrate: () => unwrapEden(api.sync.orders.get({ query }))`.\n */\nexport const unwrapEden = async <T>(\n\tresponse: Promise<{ data: T | null; error?: unknown }>\n): Promise<T> => {\n\tconst { data, error } = await response;\n\tif (error !== null && error !== undefined) {\n\t\tthrow error;\n\t}\n\treturn data as T;\n};\n"
17
18
  ],
18
- "mappings": "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",
19
- "debugId": "DCCBD8141688B4C064756E2164756E21",
19
+ "mappings": "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",
20
+ "debugId": "91907A0D295C48AD64756E2164756E21",
20
21
  "names": []
21
22
  }
@@ -1,4 +1,5 @@
1
1
  import type { PresenceMember } from '../engine/presence';
2
+ import { type FrameSerializer } from '../serializer';
2
3
  export type { PresenceMember } from '../engine/presence';
3
4
  export type PresenceClientOptions<S> = {
4
5
  /** WebSocket URL of the {@link syncSocket} endpoint (e.g. `ws://host/sync/ws`). */
@@ -15,6 +16,11 @@ export type PresenceClientOptions<S> = {
15
16
  reconnectMs?: number;
16
17
  /** Max reconnect backoff (ms). Defaults to 10000. */
17
18
  maxReconnectMs?: number;
19
+ /**
20
+ * Wire-format serializer (1.16.0). Defaults to `jsonSerializer`. MUST
21
+ * match the server's `syncSocket` serializer.
22
+ */
23
+ serializer?: FrameSerializer;
18
24
  };
19
25
  export type PresenceClient<S> = {
20
26
  /** This member's id. */
@@ -1,5 +1,6 @@
1
1
  import type { RowKey } from '../engine/types';
2
2
  import type { MutateOptions, SyncCollectionState, SyncCollectionStatus } from './syncCollection';
3
+ import { type FrameSerializer } from '../serializer';
3
4
  export type SyncClientOptions = {
4
5
  /** WebSocket URL of the {@link syncSocket} endpoint (e.g. `ws://host/sync/ws`). */
5
6
  url: string;
@@ -11,6 +12,13 @@ export type SyncClientOptions = {
11
12
  maxReconnectMs?: number;
12
13
  /** Called with the message of any server `error` frame. */
13
14
  onError?: (message: unknown) => void;
15
+ /**
16
+ * Wire-format serializer (1.16.0). Defaults to `jsonSerializer` — the
17
+ * historical JSON-over-WS behavior. MUST match the server's `syncSocket`
18
+ * serializer; opt into a binary one (msgpack, cbor, custom) on both
19
+ * ends to cut bandwidth + parse CPU on large snapshots.
20
+ */
21
+ serializer?: FrameSerializer;
14
22
  };
15
23
  export type SyncCollectionHandleOptions<T> = {
16
24
  /** Registered collection name to subscribe to. */
@@ -1,4 +1,5 @@
1
1
  import type { RowKey } from '../engine/types';
2
+ import { type FrameSerializer } from '../serializer';
2
3
  export type { ServerFrame } from '../engine/connection';
3
4
  export type SyncCollectionStatus = 'connecting' | 'ready' | 'closed';
4
5
  export type SyncCollectionState<T> = {
@@ -125,6 +126,11 @@ export type SyncCollectionOptions<T> = {
125
126
  cache?: CollectionCache<T>;
126
127
  /** Called with each server error message. */
127
128
  onError?: (error: unknown) => void;
129
+ /**
130
+ * Wire-format serializer (1.16.0). Defaults to `jsonSerializer`. MUST
131
+ * match the server's `syncSocket` serializer.
132
+ */
133
+ serializer?: FrameSerializer;
128
134
  };
129
135
  export type SyncCollection<T> = {
130
136
  /** Current state snapshot (stable reference until the next change). */