@absolutejs/sync 1.18.0 → 1.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -7,19 +7,19 @@
7
7
  "import { Elysia } from 'elysia';\nimport { SYNC_OPEN_TOPIC } from './reactiveHub';\nimport type { ReactiveEvent, ReactiveHub } from './reactiveHub';\n\nexport type SyncRequestContext = {\n\tquery: Record<string, string | undefined>;\n\trequest: Request;\n};\n\nexport type SyncPluginOptions = {\n\thub: ReactiveHub;\n\t/** Route the SSE stream is served from. Defaults to `/sync`. */\n\tpath?: string;\n\t/**\n\t * Which topics a connection subscribes to. Defaults to a comma-separated\n\t * `?topics=a,b,c` query param. Override to derive topics from the session,\n\t * params, or auth instead of trusting the client.\n\t */\n\tresolveTopics?: (context: SyncRequestContext) => string[];\n\t/**\n\t * Server→client heartbeat comment, so idle proxies don't drop the SSE stream.\n\t * Defaults to 25000ms.\n\t */\n\theartbeatMs?: number;\n};\n\nconst defaultResolveTopics = (context: SyncRequestContext) =>\n\t(context.query.topics ?? '')\n\t\t.split(',')\n\t\t.map((topic) => topic.trim())\n\t\t.filter(Boolean);\n\n/**\n * Elysia plugin that streams {@link ReactiveHub} events to browsers over Server-Sent\n * Events. Mount it once, point {@link createSyncSubscriber} at the same path, and\n * `hub.publish(topic)` from your mutations — subscribed clients are notified the\n * moment data changes, so they can refetch (or read the pushed payload) instead of\n * polling on a timer.\n */\nexport const sync = ({\n\thub,\n\tpath = '/sync',\n\tresolveTopics = defaultResolveTopics,\n\theartbeatMs = 25_000\n}: SyncPluginOptions) =>\n\tnew Elysia({ name: '@absolutejs/sync' }).get(path, (context) => {\n\t\tconst topics = resolveTopics({\n\t\t\tquery: context.query as Record<string, string | undefined>,\n\t\t\trequest: context.request\n\t\t});\n\t\tconst encoder = new TextEncoder();\n\n\t\tconst stream = new ReadableStream<Uint8Array>({\n\t\t\tstart(controller) {\n\t\t\t\tconst write = (chunk: string) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcontroller.enqueue(encoder.encode(chunk));\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// controller already closed by an abort race\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst send = (event: ReactiveEvent) => {\n\t\t\t\t\twrite(`data: ${JSON.stringify(event)}\\n\\n`);\n\t\t\t\t};\n\n\t\t\t\tsend({\n\t\t\t\t\ttopic: SYNC_OPEN_TOPIC,\n\t\t\t\t\tat: Date.now(),\n\t\t\t\t\tpayload: { topics }\n\t\t\t\t});\n\n\t\t\t\tconst unsubscribe =\n\t\t\t\t\ttopics.length > 0 ? hub.subscribe(topics, send) : () => {};\n\t\t\t\tconst heartbeat = setInterval(\n\t\t\t\t\t() => write(': ping\\n\\n'),\n\t\t\t\t\theartbeatMs\n\t\t\t\t);\n\n\t\t\t\tcontext.request.signal.addEventListener(\n\t\t\t\t\t'abort',\n\t\t\t\t\t() => {\n\t\t\t\t\t\tclearInterval(heartbeat);\n\t\t\t\t\t\tunsubscribe();\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// already closed\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true }\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\treturn new Response(stream, {\n\t\t\theaders: {\n\t\t\t\t'cache-control': 'no-cache, no-transform',\n\t\t\t\tconnection: 'keep-alive',\n\t\t\t\t'content-type': 'text/event-stream',\n\t\t\t\t// Tell nginx (and other reverse proxies) not to buffer the\n\t\t\t\t// stream — without this it holds chunks back and the SSE\n\t\t\t\t// connection tears (ERR_INCOMPLETE_CHUNKED_ENCODING).\n\t\t\t\t'x-accel-buffering': 'no'\n\t\t\t}\n\t\t});\n\t});\n",
8
8
  "import { Elysia } from 'elysia';\nimport { createSyncConnection } from './connection';\nimport type { SyncConnection, SyncConnectionStats } from './connection';\nimport type { PresenceHub } from './presence';\nimport type { SyncEngine } from './syncEngine';\nimport type { FrameSerializer } from '../serializer';\nimport { jsonSerializer } from '../serializer';\n\n/**\n * Diagnostic surfaced via {@link SyncSocketOptions.onSlow} when a connection\n * trips the WS backpressure threshold. The host can log, kick, or charge the\n * tenant extra via the meter.\n */\nexport type SlowConnectionEvent = {\n\t/** Stable per-connection id from Elysia's `ws.id`. */\n\twsId: string;\n\t/** Bytes the WS currently has queued waiting to send. */\n\tbufferedAmount: number;\n\t/** Per-connection counters at the moment of detection. */\n\tstats: SyncConnectionStats;\n\t/** Why the event fired. */\n\treason: 'buffer-threshold' | 'send-backpressure';\n};\n\nexport type SyncSocketOptions = {\n\t/** The sync engine whose collections this socket serves. */\n\tengine: SyncEngine;\n\t/** WebSocket route. Defaults to `/sync/ws`. */\n\tpath?: string;\n\t/** Optional presence hub; enables `presence-*` frames on this socket. */\n\tpresence?: PresenceHub;\n\t/**\n\t * Build the per-connection auth context from the upgrade request data\n\t * (`ws.data`: query, headers, cookies, and anything you `derive`d/`resolve`d\n\t * earlier in the chain). Whatever you return is the `ctx` passed to every\n\t * collection's `authorize`/`hydrate`/`match`. Defaults to an empty object.\n\t */\n\tresolveContext?: (\n\t\tdata: Record<string, unknown>\n\t) => unknown | Promise<unknown>;\n\t/**\n\t * Bytes threshold for the per-connection WS send buffer. When\n\t * `ws.getBufferedAmount()` exceeds this, `onSlow` fires once per\n\t * crossing. Default `Infinity` (disabled).\n\t *\n\t * Added in 1.14.0.\n\t */\n\tmaxBufferedBytes?: number;\n\t/**\n\t * Fired when the per-connection WS buffer crosses `maxBufferedBytes`, OR\n\t * when `ws.send()` returns `-1` (Bun's backpressure signal). The signal\n\t * re-arms once the WS reports `drain`. Pair with `closeOnSlow: true` to\n\t * kick slow clients automatically, or use this hook to charge the\n\t * tenant extra via `@absolutejs/metering`.\n\t *\n\t * Added in 1.14.0.\n\t */\n\tonSlow?: (event: SlowConnectionEvent) => void | Promise<void>;\n\t/**\n\t * Close the WS the first time a connection crosses `maxBufferedBytes`\n\t * (or the `-1` send threshold). Default `false`. Client will reconnect\n\t * and re-hydrate.\n\t *\n\t * Added in 1.14.0.\n\t */\n\tcloseOnSlow?: boolean;\n\t/**\n\t * Wire-format serializer (1.16.0). Default `jsonSerializer` —\n\t * preserves the pre-1.16 behavior. Both ends of the connection MUST\n\t * use the same serializer; opt into a binary one (msgpack, cbor, or\n\t * a custom layout) on BOTH this plugin AND the client to cut the\n\t * bandwidth + parse CPU.\n\t */\n\tserializer?: FrameSerializer;\n};\n\ntype TrackedConnection = {\n\tconnection: SyncConnection;\n\tslowSignaled: boolean;\n};\n\n/**\n * Elysia WebSocket plugin for the sync engine. One socket multiplexes any\n * number of collection subscriptions: the client sends `subscribe` /\n * `unsubscribe` frames and receives `snapshot` / `diff` / `error` frames\n * (see {@link createSyncConnection}). Mount once and drive\n * `engine.applyChange` from your mutations.\n *\n * Uses Elysia's first-class `.ws()` rather than a hand-rolled stream — the\n * bidirectional channel carries both subscriptions and mutations, and\n * `ws.send` serializes frames for us.\n *\n * 1.14.0 adds WS-layer slow-client detection — see `maxBufferedBytes` /\n * `onSlow` / `closeOnSlow`.\n */\nexport const syncSocket = ({\n\tengine,\n\tpath = '/sync/ws',\n\tresolveContext,\n\tpresence,\n\tmaxBufferedBytes,\n\tonSlow,\n\tcloseOnSlow = false,\n\tserializer = jsonSerializer\n}: SyncSocketOptions) => {\n\tconst connections = new Map<string, TrackedConnection>();\n\tconst threshold = maxBufferedBytes ?? Infinity;\n\n\tconst fireSlow = (event: SlowConnectionEvent) => {\n\t\tif (!onSlow) return;\n\t\ttry {\n\t\t\tconst ret = onSlow(event);\n\t\t\tif (ret && typeof (ret as Promise<void>).then === 'function') {\n\t\t\t\t(ret as Promise<void>).catch((error) => {\n\t\t\t\t\tconsole.error('[sync/socket] onSlow rejected:', error);\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[sync/socket] onSlow threw:', error);\n\t\t}\n\t};\n\n\treturn new Elysia({ name: '@absolutejs/sync/socket' }).ws(path, {\n\t\tasync open(ws) {\n\t\t\tconst ctx = resolveContext\n\t\t\t\t? await resolveContext(ws.data as Record<string, unknown>)\n\t\t\t\t: {};\n\n\t\t\t// Permissive shape: we read `getBufferedAmount` + `close` if the\n\t\t\t// runtime supports them (Bun's ServerWebSocket does) — fall back\n\t\t\t// silently for test fakes. Accepts both string and Uint8Array\n\t\t\t// payloads (binary serializers via 1.16.0).\n\t\t\tconst bunWs = ws as unknown as {\n\t\t\t\tid: string;\n\t\t\t\tsend: (data: string | Uint8Array | ArrayBuffer) => number;\n\t\t\t\tgetBufferedAmount?: () => number;\n\t\t\t\tclose?: () => void;\n\t\t\t};\n\n\t\t\tconst tracked: TrackedConnection = {\n\t\t\t\tconnection: createSyncConnection({\n\t\t\t\t\tengine,\n\t\t\t\t\tctx,\n\t\t\t\t\tpresence,\n\t\t\t\t\tserializer,\n\t\t\t\t\tsend: (frame) => {\n\t\t\t\t\t\tconst payload = serializer.encodeServer(frame);\n\t\t\t\t\t\tconst ret = bunWs.send(\n\t\t\t\t\t\t\ttypeof payload === 'string' ? payload : (payload as Uint8Array)\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst buffered = bunWs.getBufferedAmount?.() ?? 0;\n\n\t\t\t\t\t\tconst overBuffer = buffered > threshold;\n\t\t\t\t\t\tconst backpressure = ret === -1;\n\t\t\t\t\t\tif ((overBuffer || backpressure) && !tracked.slowSignaled) {\n\t\t\t\t\t\t\ttracked.slowSignaled = true;\n\t\t\t\t\t\t\tfireSlow({\n\t\t\t\t\t\t\t\tbufferedAmount: buffered,\n\t\t\t\t\t\t\t\treason: backpressure ? 'send-backpressure' : 'buffer-threshold',\n\t\t\t\t\t\t\t\tstats: tracked.connection.stats(),\n\t\t\t\t\t\t\t\twsId: bunWs.id\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (closeOnSlow) bunWs.close?.();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn ret;\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tslowSignaled: false\n\t\t\t};\n\t\t\tconnections.set(bunWs.id, tracked);\n\t\t},\n\t\tasync message(ws, message) {\n\t\t\tawait connections.get(ws.id)?.connection.handle(message);\n\t\t},\n\t\tdrain(ws) {\n\t\t\t// WS buffer cleared — re-arm slow-client detection so the next\n\t\t\t// over-threshold event fires onSlow again.\n\t\t\tconst tracked = connections.get(ws.id);\n\t\t\tif (tracked) tracked.slowSignaled = false;\n\t\t},\n\t\tclose(ws) {\n\t\t\tconst tracked = connections.get(ws.id);\n\t\t\tif (tracked) {\n\t\t\t\ttracked.connection.close();\n\t\t\t\tconnections.delete(ws.id);\n\t\t\t}\n\t\t}\n\t});\n};\n",
9
9
  "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",
10
- "import type { PresenceHandle, PresenceHub, PresenceMember } from './presence';\nimport type { Subscription, SyncEngine } from './syncEngine';\nimport type { FrameSerializer } from '../serializer';\nimport { jsonSerializer } from '../serializer';\n\n/**\n * Wire protocol for the sync-engine WebSocket. One connection multiplexes many\n * collection subscriptions, each tagged with a client-chosen `id`.\n */\n\n/** Client → server. */\nexport type ClientFrame =\n\t| {\n\t\t\ttype: 'subscribe';\n\t\t\tid: string;\n\t\t\tcollection: string;\n\t\t\tparams?: unknown;\n\t\t\t/** Resume from a version already applied (catch-up instead of snapshot). */\n\t\t\tsince?: number;\n\t }\n\t| { type: 'unsubscribe'; id: string }\n\t| { type: 'mutate'; mutationId: number; name: string; args?: unknown }\n\t| { type: 'presence-join'; room: string; memberId: string; state: unknown }\n\t| { type: 'presence-set'; room: string; state: unknown }\n\t| { type: 'presence-leave'; room: string };\n\n/** One subscription's delta within a {@link ServerFrame} `frame`. */\nexport type FrameDiff<T = unknown> = {\n\tid: string;\n\tadded: T[];\n\tremoved: T[];\n\tchanged: T[];\n};\n\n/** Server → client. `version` is the change-feed watermark this frame brings. */\nexport type ServerFrame<T = unknown> =\n\t| { type: 'snapshot'; id: string; rows: T[]; version?: number }\n\t| {\n\t\t\ttype: 'diff';\n\t\t\tid: string;\n\t\t\tadded: T[];\n\t\t\tremoved: T[];\n\t\t\tchanged: T[];\n\t\t\tversion?: number;\n\t }\n\t| {\n\t\t\t// One atomic batch (e.g. a transactional mutation) that touched several\n\t\t\t// subscriptions — bundled into one message so the client applies them in\n\t\t\t// a single frame, never showing a torn cross-collection intermediate.\n\t\t\ttype: 'frame';\n\t\t\tversion?: number;\n\t\t\tdiffs: FrameDiff<T>[];\n\t }\n\t| {\n\t\t\t// A presence room changed: members joined, updated state, or left.\n\t\t\ttype: 'presence';\n\t\t\troom: string;\n\t\t\tjoined: PresenceMember<T>[];\n\t\t\tupdated: PresenceMember<T>[];\n\t\t\tleft: string[];\n\t }\n\t| { type: 'error'; id?: string; message: string }\n\t| { type: 'ack'; mutationId: number; result?: unknown }\n\t| { type: 'reject'; mutationId: number; message: string };\n\nexport type SyncConnectionOptions = {\n\tengine: SyncEngine;\n\t/** Resolved auth context for this connection; passed to every subscribe. */\n\tctx: unknown;\n\t/**\n\t * Send a frame to the client (the transport serializes it). May return\n\t * a number — by convention `-1` signals transport-layer backpressure (the\n\t * value Bun's `ws.send()` returns when the WS buffer is full). The\n\t * connection tracks consecutive `-1` returns and surfaces them via\n\t * `connection.stats().slowSendsRecent`. Legacy `void`-returning sends\n\t * keep working unchanged.\n\t *\n\t * NOTE: 1.16.0 — `send` receives the typed `ServerFrame`. The connection\n\t * does NOT pre-serialize; the WS adapter (`syncSocket`) wraps `send` to\n\t * call `serializer.encodeServer(frame)` before `ws.send(...)`. This keeps\n\t * the connection layer transport-agnostic.\n\t */\n\tsend: (frame: ServerFrame) => void | number;\n\t/** Optional presence hub; enables the `presence-*` frames (see createPresenceHub). */\n\tpresence?: PresenceHub;\n\t/**\n\t * Wire-format serializer (1.16.0). Defaults to `jsonSerializer` —\n\t * the historical JSON-over-WS behavior. Both ends of the connection\n\t * MUST use the same serializer; pair this option with the matching\n\t * client-side `serializer` to opt into binary frames.\n\t */\n\tserializer?: FrameSerializer;\n};\n\n/**\n * Connection-level operational counters surfaced via {@link SyncConnection.stats}.\n * Pair with the WS adapter's own backpressure signal for end-to-end slow-client\n * detection.\n */\nexport type SyncConnectionStats = {\n\t/** Active subscriptions on this connection. */\n\tsubscriptionCount: number;\n\t/** Active presence-room memberships on this connection. */\n\tpresenceRoomCount: number;\n\t/** Frames successfully sent (non-backpressure return) since the connection opened. */\n\tframesSent: number;\n\t/** Consecutive `-1` (backpressure) returns from `send` since the last successful send. */\n\tslowSendsRecent: number;\n};\n\nexport type SyncConnection = {\n\t/** Handle one client frame (a parsed object or a raw JSON string). */\n\thandle: (raw: unknown) => Promise<void>;\n\t/** Tear down every subscription on this connection (call on socket close). */\n\tclose: () => void;\n\t/**\n\t * Point-in-time connection counters — subscription count, frames sent, and\n\t * how many consecutive `send` calls came back with the transport's backpressure\n\t * signal. Cheap; safe to call from a metering loop.\n\t *\n\t * Added in 1.14.0.\n\t */\n\tstats: () => SyncConnectionStats;\n};\n\nconst parseFrame = (raw: unknown, serializer: FrameSerializer): ClientFrame | undefined => {\n\t// 1.16.0: hand off the wire decode to the serializer (default JSON).\n\t// The shape validation below is identical regardless of wire format —\n\t// the serializer just produces an object, we walk it for type safety.\n\tlet value: unknown = raw;\n\tif (typeof value === 'string' || value instanceof Uint8Array || value instanceof ArrayBuffer) {\n\t\tvalue = serializer.decode(raw);\n\t\tif (value === null) return undefined;\n\t}\n\tif (typeof value !== 'object' || value === null) {\n\t\treturn undefined;\n\t}\n\tconst frame = value as {\n\t\ttype?: unknown;\n\t\tid?: unknown;\n\t\tcollection?: unknown;\n\t\tparams?: unknown;\n\t\tsince?: unknown;\n\t\tmutationId?: unknown;\n\t\tname?: unknown;\n\t\targs?: unknown;\n\t\troom?: unknown;\n\t\tmemberId?: unknown;\n\t\tstate?: unknown;\n\t};\n\tif (frame.type === 'subscribe') {\n\t\treturn typeof frame.id === 'string' &&\n\t\t\ttypeof frame.collection === 'string'\n\t\t\t? {\n\t\t\t\t\ttype: 'subscribe',\n\t\t\t\t\tid: frame.id,\n\t\t\t\t\tcollection: frame.collection,\n\t\t\t\t\tparams: frame.params,\n\t\t\t\t\tsince:\n\t\t\t\t\t\ttypeof frame.since === 'number'\n\t\t\t\t\t\t\t? frame.since\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'unsubscribe') {\n\t\treturn typeof frame.id === 'string'\n\t\t\t? { type: 'unsubscribe', id: frame.id }\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'mutate') {\n\t\treturn typeof frame.mutationId === 'number' &&\n\t\t\ttypeof frame.name === 'string'\n\t\t\t? {\n\t\t\t\t\ttype: 'mutate',\n\t\t\t\t\tmutationId: frame.mutationId,\n\t\t\t\t\tname: frame.name,\n\t\t\t\t\targs: frame.args\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'presence-join') {\n\t\treturn typeof frame.room === 'string' &&\n\t\t\ttypeof frame.memberId === 'string'\n\t\t\t? {\n\t\t\t\t\ttype: 'presence-join',\n\t\t\t\t\troom: frame.room,\n\t\t\t\t\tmemberId: frame.memberId,\n\t\t\t\t\tstate: frame.state\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'presence-set') {\n\t\treturn typeof frame.room === 'string'\n\t\t\t? { type: 'presence-set', room: frame.room, state: frame.state }\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'presence-leave') {\n\t\treturn typeof frame.room === 'string'\n\t\t\t? { type: 'presence-leave', room: frame.room }\n\t\t\t: undefined;\n\t}\n\treturn undefined;\n};\n\n/**\n * The per-connection protocol handler — transport-agnostic glue between a single\n * client socket and the {@link SyncEngine}. It owns that connection's\n * subscriptions: a `subscribe` frame authorizes + hydrates and replies with a\n * `snapshot`, then streams `diff` frames; `unsubscribe`/`close` release views.\n *\n * Pure (no WebSocket import) so it can be unit-tested with a fake `send`; the\n * Elysia `syncSocket` plugin is the thin adapter that feeds it socket events.\n */\nexport const createSyncConnection = ({\n\tengine,\n\tctx,\n\tsend: rawSend,\n\tpresence,\n\tserializer = jsonSerializer\n}: SyncConnectionOptions): SyncConnection => {\n\tconst subscriptions = new Map<string, Subscription<unknown>>();\n\t// This connection's presence memberships (one per room), torn down on close.\n\tconst presenceRooms = new Map<string, PresenceHandle<unknown>>();\n\n\t// 1.14.0: track transport-layer backpressure. `send` may return -1 (Bun's\n\t// WS backpressure signal) — accumulate consecutive `-1`s so the host can\n\t// detect a slow client; reset to 0 on any non-backpressure return.\n\tlet framesSent = 0;\n\tlet slowSendsRecent = 0;\n\tconst send = (frame: ServerFrame) => {\n\t\tconst ret = rawSend(frame);\n\t\tif (ret === -1) {\n\t\t\tslowSendsRecent += 1;\n\t\t} else {\n\t\t\tframesSent += 1;\n\t\t\tslowSendsRecent = 0;\n\t\t}\n\t};\n\n\t// Diffs from one atomic batch (a mutation, or a single applyChange) arrive via\n\t// onDiff synchronously and share a version. Buffer them and flush as one\n\t// message: a lone diff stays a plain `diff` (so single-collection clients are\n\t// unchanged); several become one `frame` the client applies atomically.\n\tlet pending: FrameDiff[] = [];\n\tlet pendingVersion: number | undefined;\n\tlet flushScheduled = false;\n\n\tconst flush = () => {\n\t\tif (pending.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst diffs = pending;\n\t\tconst version = pendingVersion;\n\t\tpending = [];\n\t\tpendingVersion = undefined;\n\t\tif (diffs.length === 1) {\n\t\t\tconst only = diffs[0]!;\n\t\t\tsend({\n\t\t\t\ttype: 'diff',\n\t\t\t\tid: only.id,\n\t\t\t\tadded: only.added,\n\t\t\t\tremoved: only.removed,\n\t\t\t\tchanged: only.changed,\n\t\t\t\tversion\n\t\t\t});\n\t\t} else {\n\t\t\tsend({ type: 'frame', diffs, version });\n\t\t}\n\t};\n\n\tconst scheduleFlush = () => {\n\t\tif (flushScheduled) {\n\t\t\treturn;\n\t\t}\n\t\tflushScheduled = true;\n\t\tqueueMicrotask(() => {\n\t\t\tflushScheduled = false;\n\t\t\tflush();\n\t\t});\n\t};\n\n\tconst bufferDiff = (diff: FrameDiff, diffVersion: number) => {\n\t\t// A new version means a new batch — flush the previous one first.\n\t\tif (pending.length > 0 && pendingVersion !== diffVersion) {\n\t\t\tflush();\n\t\t}\n\t\tpending.push(diff);\n\t\tpendingVersion = diffVersion;\n\t\tscheduleFlush();\n\t};\n\n\tconst handle = async (raw: unknown) => {\n\t\tconst frame = parseFrame(raw, serializer);\n\t\tif (frame === undefined) {\n\t\t\tsend({ type: 'error', message: 'Malformed sync frame' });\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'mutate') {\n\t\t\ttry {\n\t\t\t\tconst result = await engine.runMutation(\n\t\t\t\t\tframe.name,\n\t\t\t\t\tframe.args,\n\t\t\t\t\tctx\n\t\t\t\t);\n\t\t\t\t// The mutation's diffs were buffered during runMutation; flush them\n\t\t\t\t// (as one frame) before the ack so the ack always arrives after.\n\t\t\t\tflush();\n\t\t\t\tsend({ type: 'ack', mutationId: frame.mutationId, result });\n\t\t\t} catch (error) {\n\t\t\t\tsend({\n\t\t\t\t\ttype: 'reject',\n\t\t\t\t\tmutationId: frame.mutationId,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'unsubscribe') {\n\t\t\tsubscriptions.get(frame.id)?.unsubscribe();\n\t\t\tsubscriptions.delete(frame.id);\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'presence-join') {\n\t\t\tif (presence === undefined) {\n\t\t\t\tsend({ type: 'error', message: 'Presence is not enabled' });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// A re-join replaces the prior membership for this room.\n\t\t\tpresenceRooms.get(frame.room)?.leave();\n\t\t\tconst handle = presence.join(\n\t\t\t\tframe.room,\n\t\t\t\tframe.memberId,\n\t\t\t\tframe.state,\n\t\t\t\t(diff) => {\n\t\t\t\t\tsend({\n\t\t\t\t\t\ttype: 'presence',\n\t\t\t\t\t\troom: frame.room,\n\t\t\t\t\t\tjoined: diff.joined,\n\t\t\t\t\t\tupdated: diff.updated,\n\t\t\t\t\t\tleft: diff.left\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t);\n\t\t\tpresenceRooms.set(frame.room, handle);\n\t\t\t// Initial snapshot to the joiner (peers got a `joined` diff instead).\n\t\t\tsend({\n\t\t\t\ttype: 'presence',\n\t\t\t\troom: frame.room,\n\t\t\t\tjoined: handle.members,\n\t\t\t\tupdated: [],\n\t\t\t\tleft: []\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'presence-set') {\n\t\t\tpresenceRooms.get(frame.room)?.set(frame.state);\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'presence-leave') {\n\t\t\tpresenceRooms.get(frame.room)?.leave();\n\t\t\tpresenceRooms.delete(frame.room);\n\t\t\treturn;\n\t\t}\n\n\t\tif (subscriptions.has(frame.id)) {\n\t\t\tsend({\n\t\t\t\ttype: 'error',\n\t\t\t\tid: frame.id,\n\t\t\t\tmessage: `Subscription id \"${frame.id}\" already in use`\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst subscription = await engine.subscribe({\n\t\t\t\tcollection: frame.collection,\n\t\t\t\tparams: frame.params,\n\t\t\t\tctx,\n\t\t\t\tsince: frame.since,\n\t\t\t\tonDiff: (diff, diffVersion) => {\n\t\t\t\t\tbufferDiff(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: frame.id,\n\t\t\t\t\t\t\tadded: diff.added,\n\t\t\t\t\t\t\tremoved: diff.removed,\n\t\t\t\t\t\t\tchanged: diff.changed\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdiffVersion\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t\tsubscriptions.set(frame.id, subscription);\n\t\t\t// No await between subscribe resolving and this send, so the initial\n\t\t\t// reply always precedes any diff for this subscription.\n\t\t\tif (subscription.catchup !== undefined) {\n\t\t\t\t// Resumed: a catch-up diff applied on top of the client's set.\n\t\t\t\tsend({\n\t\t\t\t\ttype: 'diff',\n\t\t\t\t\tid: frame.id,\n\t\t\t\t\tadded: subscription.catchup.added,\n\t\t\t\t\tremoved: subscription.catchup.removed,\n\t\t\t\t\tchanged: subscription.catchup.changed,\n\t\t\t\t\tversion: subscription.version\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tsend({\n\t\t\t\t\ttype: 'snapshot',\n\t\t\t\t\tid: frame.id,\n\t\t\t\t\trows: subscription.initial,\n\t\t\t\t\tversion: subscription.version\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsend({\n\t\t\t\ttype: 'error',\n\t\t\t\tid: frame.id,\n\t\t\t\tmessage: error instanceof Error ? error.message : String(error)\n\t\t\t});\n\t\t}\n\t};\n\n\tconst close = () => {\n\t\tfor (const subscription of subscriptions.values()) {\n\t\t\tsubscription.unsubscribe();\n\t\t}\n\t\tsubscriptions.clear();\n\t\t// Drop this connection's presence so peers see it leave (auto-cleanup).\n\t\tfor (const handle of presenceRooms.values()) {\n\t\t\thandle.leave();\n\t\t}\n\t\tpresenceRooms.clear();\n\t};\n\n\tconst stats = (): SyncConnectionStats => ({\n\t\tframesSent,\n\t\tpresenceRoomCount: presenceRooms.size,\n\t\tslowSendsRecent,\n\t\tsubscriptionCount: subscriptions.size\n\t});\n\n\treturn { close, handle, stats };\n};\n",
10
+ "import type { PresenceHandle, PresenceHub, PresenceMember } from './presence';\nimport type { Subscription, SyncEngine } from './syncEngine';\nimport type { FrameSerializer } from '../serializer';\nimport { jsonSerializer } from '../serializer';\n\n/**\n * Wire protocol for the sync-engine WebSocket. One connection multiplexes many\n * collection subscriptions, each tagged with a client-chosen `id`.\n */\n\n/** Client → server. */\nexport type ClientFrame =\n\t| {\n\t\t\ttype: 'subscribe';\n\t\t\tid: string;\n\t\t\tcollection: string;\n\t\t\tparams?: unknown;\n\t\t\t/**\n\t\t\t * Resume from a point already applied (catch-up instead of snapshot).\n\t\t\t *\n\t\t\t * Accepts either:\n\t\t\t * - `number` (pre-1.18 legacy) — the version of THIS engine instance.\n\t\t\t * - `string` (1.17.0+ cursor) — an opaque cross-instance resume\n\t\t\t * cursor returned by the server on prior snapshot/diff/frame.\n\t\t\t * The client round-trips it unmodified.\n\t\t\t */\n\t\t\tsince?: number | string;\n\t }\n\t| { type: 'unsubscribe'; id: string }\n\t| { type: 'mutate'; mutationId: number; name: string; args?: unknown }\n\t| { type: 'presence-join'; room: string; memberId: string; state: unknown }\n\t| { type: 'presence-set'; room: string; state: unknown }\n\t| { type: 'presence-leave'; room: string };\n\n/** One subscription's delta within a {@link ServerFrame} `frame`. */\nexport type FrameDiff<T = unknown> = {\n\tid: string;\n\tadded: T[];\n\tremoved: T[];\n\tchanged: T[];\n};\n\n/**\n * Server → client. `version` is THIS engine's local change-feed watermark.\n * `cursor` (1.17.0+) is an opaque cross-instance resume cursor — round-trip\n * it on `subscribe.since` to resume across cluster shards.\n */\nexport type ServerFrame<T = unknown> =\n\t| { type: 'snapshot'; id: string; rows: T[]; version?: number; cursor?: string }\n\t| {\n\t\t\ttype: 'diff';\n\t\t\tid: string;\n\t\t\tadded: T[];\n\t\t\tremoved: T[];\n\t\t\tchanged: T[];\n\t\t\tversion?: number;\n\t\t\tcursor?: string;\n\t }\n\t| {\n\t\t\t// One atomic batch (e.g. a transactional mutation) that touched several\n\t\t\t// subscriptions — bundled into one message so the client applies them in\n\t\t\t// a single frame, never showing a torn cross-collection intermediate.\n\t\t\ttype: 'frame';\n\t\t\tversion?: number;\n\t\t\tcursor?: string;\n\t\t\tdiffs: FrameDiff<T>[];\n\t }\n\t| {\n\t\t\t// A presence room changed: members joined, updated state, or left.\n\t\t\ttype: 'presence';\n\t\t\troom: string;\n\t\t\tjoined: PresenceMember<T>[];\n\t\t\tupdated: PresenceMember<T>[];\n\t\t\tleft: string[];\n\t }\n\t| { type: 'error'; id?: string; message: string }\n\t| { type: 'ack'; mutationId: number; result?: unknown }\n\t| { type: 'reject'; mutationId: number; message: string };\n\nexport type SyncConnectionOptions = {\n\tengine: SyncEngine;\n\t/** Resolved auth context for this connection; passed to every subscribe. */\n\tctx: unknown;\n\t/**\n\t * Send a frame to the client (the transport serializes it). May return\n\t * a number — by convention `-1` signals transport-layer backpressure (the\n\t * value Bun's `ws.send()` returns when the WS buffer is full). The\n\t * connection tracks consecutive `-1` returns and surfaces them via\n\t * `connection.stats().slowSendsRecent`. Legacy `void`-returning sends\n\t * keep working unchanged.\n\t *\n\t * NOTE: 1.16.0 — `send` receives the typed `ServerFrame`. The connection\n\t * does NOT pre-serialize; the WS adapter (`syncSocket`) wraps `send` to\n\t * call `serializer.encodeServer(frame)` before `ws.send(...)`. This keeps\n\t * the connection layer transport-agnostic.\n\t */\n\tsend: (frame: ServerFrame) => void | number;\n\t/** Optional presence hub; enables the `presence-*` frames (see createPresenceHub). */\n\tpresence?: PresenceHub;\n\t/**\n\t * Wire-format serializer (1.16.0). Defaults to `jsonSerializer` —\n\t * the historical JSON-over-WS behavior. Both ends of the connection\n\t * MUST use the same serializer; pair this option with the matching\n\t * client-side `serializer` to opt into binary frames.\n\t */\n\tserializer?: FrameSerializer;\n};\n\n/**\n * Connection-level operational counters surfaced via {@link SyncConnection.stats}.\n * Pair with the WS adapter's own backpressure signal for end-to-end slow-client\n * detection.\n */\nexport type SyncConnectionStats = {\n\t/** Active subscriptions on this connection. */\n\tsubscriptionCount: number;\n\t/** Active presence-room memberships on this connection. */\n\tpresenceRoomCount: number;\n\t/** Frames successfully sent (non-backpressure return) since the connection opened. */\n\tframesSent: number;\n\t/** Consecutive `-1` (backpressure) returns from `send` since the last successful send. */\n\tslowSendsRecent: number;\n};\n\nexport type SyncConnection = {\n\t/** Handle one client frame (a parsed object or a raw JSON string). */\n\thandle: (raw: unknown) => Promise<void>;\n\t/** Tear down every subscription on this connection (call on socket close). */\n\tclose: () => void;\n\t/**\n\t * Point-in-time connection counters — subscription count, frames sent, and\n\t * how many consecutive `send` calls came back with the transport's backpressure\n\t * signal. Cheap; safe to call from a metering loop.\n\t *\n\t * Added in 1.14.0.\n\t */\n\tstats: () => SyncConnectionStats;\n};\n\nconst parseFrame = (raw: unknown, serializer: FrameSerializer): ClientFrame | undefined => {\n\t// 1.16.0: hand off the wire decode to the serializer (default JSON).\n\t// The shape validation below is identical regardless of wire format —\n\t// the serializer just produces an object, we walk it for type safety.\n\tlet value: unknown = raw;\n\tif (typeof value === 'string' || value instanceof Uint8Array || value instanceof ArrayBuffer) {\n\t\tvalue = serializer.decode(raw);\n\t\tif (value === null) return undefined;\n\t}\n\tif (typeof value !== 'object' || value === null) {\n\t\treturn undefined;\n\t}\n\tconst frame = value as {\n\t\ttype?: unknown;\n\t\tid?: unknown;\n\t\tcollection?: unknown;\n\t\tparams?: unknown;\n\t\tsince?: unknown;\n\t\tmutationId?: unknown;\n\t\tname?: unknown;\n\t\targs?: unknown;\n\t\troom?: unknown;\n\t\tmemberId?: unknown;\n\t\tstate?: unknown;\n\t};\n\tif (frame.type === 'subscribe') {\n\t\t// 1.17.0+: `since` accepts a number (legacy local-version) OR an\n\t\t// opaque cursor string. Drop anything else.\n\t\tconst since =\n\t\t\ttypeof frame.since === 'number' || typeof frame.since === 'string'\n\t\t\t\t? frame.since\n\t\t\t\t: undefined;\n\t\treturn typeof frame.id === 'string' &&\n\t\t\ttypeof frame.collection === 'string'\n\t\t\t? {\n\t\t\t\t\ttype: 'subscribe',\n\t\t\t\t\tid: frame.id,\n\t\t\t\t\tcollection: frame.collection,\n\t\t\t\t\tparams: frame.params,\n\t\t\t\t\tsince\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'unsubscribe') {\n\t\treturn typeof frame.id === 'string'\n\t\t\t? { type: 'unsubscribe', id: frame.id }\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'mutate') {\n\t\treturn typeof frame.mutationId === 'number' &&\n\t\t\ttypeof frame.name === 'string'\n\t\t\t? {\n\t\t\t\t\ttype: 'mutate',\n\t\t\t\t\tmutationId: frame.mutationId,\n\t\t\t\t\tname: frame.name,\n\t\t\t\t\targs: frame.args\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'presence-join') {\n\t\treturn typeof frame.room === 'string' &&\n\t\t\ttypeof frame.memberId === 'string'\n\t\t\t? {\n\t\t\t\t\ttype: 'presence-join',\n\t\t\t\t\troom: frame.room,\n\t\t\t\t\tmemberId: frame.memberId,\n\t\t\t\t\tstate: frame.state\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'presence-set') {\n\t\treturn typeof frame.room === 'string'\n\t\t\t? { type: 'presence-set', room: frame.room, state: frame.state }\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'presence-leave') {\n\t\treturn typeof frame.room === 'string'\n\t\t\t? { type: 'presence-leave', room: frame.room }\n\t\t\t: undefined;\n\t}\n\treturn undefined;\n};\n\n/**\n * The per-connection protocol handler — transport-agnostic glue between a single\n * client socket and the {@link SyncEngine}. It owns that connection's\n * subscriptions: a `subscribe` frame authorizes + hydrates and replies with a\n * `snapshot`, then streams `diff` frames; `unsubscribe`/`close` release views.\n *\n * Pure (no WebSocket import) so it can be unit-tested with a fake `send`; the\n * Elysia `syncSocket` plugin is the thin adapter that feeds it socket events.\n */\nexport const createSyncConnection = ({\n\tengine,\n\tctx,\n\tsend: rawSend,\n\tpresence,\n\tserializer = jsonSerializer\n}: SyncConnectionOptions): SyncConnection => {\n\tconst subscriptions = new Map<string, Subscription<unknown>>();\n\t// This connection's presence memberships (one per room), torn down on close.\n\tconst presenceRooms = new Map<string, PresenceHandle<unknown>>();\n\n\t// 1.14.0: track transport-layer backpressure. `send` may return -1 (Bun's\n\t// WS backpressure signal) — accumulate consecutive `-1`s so the host can\n\t// detect a slow client; reset to 0 on any non-backpressure return.\n\tlet framesSent = 0;\n\tlet slowSendsRecent = 0;\n\tconst send = (frame: ServerFrame) => {\n\t\tconst ret = rawSend(frame);\n\t\tif (ret === -1) {\n\t\t\tslowSendsRecent += 1;\n\t\t} else {\n\t\t\tframesSent += 1;\n\t\t\tslowSendsRecent = 0;\n\t\t}\n\t};\n\n\t// Diffs from one atomic batch (a mutation, or a single applyChange) arrive via\n\t// onDiff synchronously and share a version. Buffer them and flush as one\n\t// message: a lone diff stays a plain `diff` (so single-collection clients are\n\t// unchanged); several become one `frame` the client applies atomically.\n\tlet pending: FrameDiff[] = [];\n\tlet pendingVersion: number | undefined;\n\t// 1.18.0: the cursor that came alongside the in-flight diff batch. We\n\t// forward it on the wire so clients can resume across cluster shards.\n\tlet pendingCursor: string | undefined;\n\tlet flushScheduled = false;\n\n\tconst flush = () => {\n\t\tif (pending.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst diffs = pending;\n\t\tconst version = pendingVersion;\n\t\tconst cursor = pendingCursor;\n\t\tpending = [];\n\t\tpendingVersion = undefined;\n\t\tpendingCursor = undefined;\n\t\tif (diffs.length === 1) {\n\t\t\tconst only = diffs[0]!;\n\t\t\tsend({\n\t\t\t\ttype: 'diff',\n\t\t\t\tid: only.id,\n\t\t\t\tadded: only.added,\n\t\t\t\tremoved: only.removed,\n\t\t\t\tchanged: only.changed,\n\t\t\t\tversion,\n\t\t\t\tcursor\n\t\t\t});\n\t\t} else {\n\t\t\tsend({ type: 'frame', diffs, version, cursor });\n\t\t}\n\t};\n\n\tconst scheduleFlush = () => {\n\t\tif (flushScheduled) {\n\t\t\treturn;\n\t\t}\n\t\tflushScheduled = true;\n\t\tqueueMicrotask(() => {\n\t\t\tflushScheduled = false;\n\t\t\tflush();\n\t\t});\n\t};\n\n\tconst bufferDiff = (diff: FrameDiff, diffVersion: number, cursor?: string) => {\n\t\t// A new version means a new batch — flush the previous one first.\n\t\tif (pending.length > 0 && pendingVersion !== diffVersion) {\n\t\t\tflush();\n\t\t}\n\t\tpending.push(diff);\n\t\tpendingVersion = diffVersion;\n\t\t// Cursor for the in-flight batch — same cursor for every diff sharing\n\t\t// `diffVersion` (the engine emits them with one currentCursor() call).\n\t\tif (cursor !== undefined) pendingCursor = cursor;\n\t\tscheduleFlush();\n\t};\n\n\tconst handle = async (raw: unknown) => {\n\t\tconst frame = parseFrame(raw, serializer);\n\t\tif (frame === undefined) {\n\t\t\tsend({ type: 'error', message: 'Malformed sync frame' });\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'mutate') {\n\t\t\ttry {\n\t\t\t\tconst result = await engine.runMutation(\n\t\t\t\t\tframe.name,\n\t\t\t\t\tframe.args,\n\t\t\t\t\tctx\n\t\t\t\t);\n\t\t\t\t// The mutation's diffs were buffered during runMutation; flush them\n\t\t\t\t// (as one frame) before the ack so the ack always arrives after.\n\t\t\t\tflush();\n\t\t\t\tsend({ type: 'ack', mutationId: frame.mutationId, result });\n\t\t\t} catch (error) {\n\t\t\t\tsend({\n\t\t\t\t\ttype: 'reject',\n\t\t\t\t\tmutationId: frame.mutationId,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'unsubscribe') {\n\t\t\tsubscriptions.get(frame.id)?.unsubscribe();\n\t\t\tsubscriptions.delete(frame.id);\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'presence-join') {\n\t\t\tif (presence === undefined) {\n\t\t\t\tsend({ type: 'error', message: 'Presence is not enabled' });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// A re-join replaces the prior membership for this room.\n\t\t\tpresenceRooms.get(frame.room)?.leave();\n\t\t\tconst handle = presence.join(\n\t\t\t\tframe.room,\n\t\t\t\tframe.memberId,\n\t\t\t\tframe.state,\n\t\t\t\t(diff) => {\n\t\t\t\t\tsend({\n\t\t\t\t\t\ttype: 'presence',\n\t\t\t\t\t\troom: frame.room,\n\t\t\t\t\t\tjoined: diff.joined,\n\t\t\t\t\t\tupdated: diff.updated,\n\t\t\t\t\t\tleft: diff.left\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t);\n\t\t\tpresenceRooms.set(frame.room, handle);\n\t\t\t// Initial snapshot to the joiner (peers got a `joined` diff instead).\n\t\t\tsend({\n\t\t\t\ttype: 'presence',\n\t\t\t\troom: frame.room,\n\t\t\t\tjoined: handle.members,\n\t\t\t\tupdated: [],\n\t\t\t\tleft: []\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'presence-set') {\n\t\t\tpresenceRooms.get(frame.room)?.set(frame.state);\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'presence-leave') {\n\t\t\tpresenceRooms.get(frame.room)?.leave();\n\t\t\tpresenceRooms.delete(frame.room);\n\t\t\treturn;\n\t\t}\n\n\t\tif (subscriptions.has(frame.id)) {\n\t\t\tsend({\n\t\t\t\ttype: 'error',\n\t\t\t\tid: frame.id,\n\t\t\t\tmessage: `Subscription id \"${frame.id}\" already in use`\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst subscription = await engine.subscribe({\n\t\t\t\tcollection: frame.collection,\n\t\t\t\tparams: frame.params,\n\t\t\t\tctx,\n\t\t\t\tsince: frame.since,\n\t\t\t\tonDiff: (diff, diffVersion, cursor) => {\n\t\t\t\t\tbufferDiff(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: frame.id,\n\t\t\t\t\t\t\tadded: diff.added,\n\t\t\t\t\t\t\tremoved: diff.removed,\n\t\t\t\t\t\t\tchanged: diff.changed\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdiffVersion,\n\t\t\t\t\t\tcursor\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t\tsubscriptions.set(frame.id, subscription);\n\t\t\t// No await between subscribe resolving and this send, so the initial\n\t\t\t// reply always precedes any diff for this subscription.\n\t\t\tif (subscription.catchup !== undefined) {\n\t\t\t\t// Resumed: a catch-up diff applied on top of the client's set.\n\t\t\t\tsend({\n\t\t\t\t\ttype: 'diff',\n\t\t\t\t\tid: frame.id,\n\t\t\t\t\tadded: subscription.catchup.added,\n\t\t\t\t\tremoved: subscription.catchup.removed,\n\t\t\t\t\tchanged: subscription.catchup.changed,\n\t\t\t\t\tversion: subscription.version,\n\t\t\t\t\tcursor: subscription.cursor\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tsend({\n\t\t\t\t\ttype: 'snapshot',\n\t\t\t\t\tid: frame.id,\n\t\t\t\t\trows: subscription.initial,\n\t\t\t\t\tversion: subscription.version,\n\t\t\t\t\tcursor: subscription.cursor\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsend({\n\t\t\t\ttype: 'error',\n\t\t\t\tid: frame.id,\n\t\t\t\tmessage: error instanceof Error ? error.message : String(error)\n\t\t\t});\n\t\t}\n\t};\n\n\tconst close = () => {\n\t\tfor (const subscription of subscriptions.values()) {\n\t\t\tsubscription.unsubscribe();\n\t\t}\n\t\tsubscriptions.clear();\n\t\t// Drop this connection's presence so peers see it leave (auto-cleanup).\n\t\tfor (const handle of presenceRooms.values()) {\n\t\t\thandle.leave();\n\t\t}\n\t\tpresenceRooms.clear();\n\t};\n\n\tconst stats = (): SyncConnectionStats => ({\n\t\tframesSent,\n\t\tpresenceRoomCount: presenceRooms.size,\n\t\tslowSendsRecent,\n\t\tsubscriptionCount: subscriptions.size\n\t});\n\n\treturn { close, handle, stats };\n};\n",
11
11
  "import type { RowChange, RowKey, ViewDiff } from './types';\n\nexport type EquiJoinOptions<L, R, Out> = {\n\t/** Left row identity. */\n\tleftKey: (left: L) => RowKey;\n\t/** Right row identity. */\n\trightKey: (right: R) => RowKey;\n\t/** Join value on the left (matched against `rightOn`). */\n\tleftOn: (left: L) => RowKey;\n\t/** Join value on the right (matched against `leftOn`). */\n\trightOn: (right: R) => RowKey;\n\t/** Combine a matched pair into an output row. */\n\tselect: (left: L, right: R) => Out;\n\t/**\n\t * Provide to make this a LEFT join: a left row with no matching right emits\n\t * `selectUnmatched(left)` instead of nothing, and is replaced by matched rows\n\t * once a right appears (and reverts when the last right leaves). Omit for an\n\t * inner join.\n\t */\n\tselectUnmatched?: (left: L) => Out;\n\t/**\n\t * Equality used to detect when a matched pair's output value changed.\n\t * Defaults to a shallow compare of own enumerable properties.\n\t */\n\tequals?: (a: Out, b: Out) => boolean;\n};\n\nexport type EquiJoin<L, R, Out> = {\n\t/** Bulk-load both inputs (replaces current state). */\n\thydrate: (left: Iterable<L>, right: Iterable<R>) => void;\n\t/** Apply a change to the left input; returns the output diff. */\n\tapplyLeft: (change: RowChange<L>) => ViewDiff<Out>;\n\t/** Apply a change to the right input; returns the output diff. */\n\tapplyRight: (change: RowChange<R>) => ViewDiff<Out>;\n\t/** Current joined rows. */\n\trows: () => Out[];\n\t/** Number of joined rows. */\n\tsize: () => number;\n};\n\nconst shallowEqual = (a: unknown, b: unknown): boolean => {\n\tif (a === b) {\n\t\treturn true;\n\t}\n\tif (\n\t\ttypeof a !== 'object' ||\n\t\ttypeof b !== 'object' ||\n\t\ta === null ||\n\t\tb === null\n\t) {\n\t\treturn false;\n\t}\n\tconst aKeys = Object.keys(a);\n\tconst bKeys = Object.keys(b);\n\treturn (\n\t\taKeys.length === bKeys.length &&\n\t\taKeys.every(\n\t\t\t(key) =>\n\t\t\t\t(a as Record<string, unknown>)[key] ===\n\t\t\t\t(b as Record<string, unknown>)[key]\n\t\t)\n\t);\n};\n\nconst addToIndex = (\n\tindex: Map<RowKey, Set<RowKey>>,\n\tjoinValue: RowKey,\n\tkey: RowKey\n) => {\n\tlet bucket = index.get(joinValue);\n\tif (bucket === undefined) {\n\t\tbucket = new Set();\n\t\tindex.set(joinValue, bucket);\n\t}\n\tbucket.add(key);\n};\n\nconst removeFromIndex = (\n\tindex: Map<RowKey, Set<RowKey>>,\n\tjoinValue: RowKey,\n\tkey: RowKey\n) => {\n\tconst bucket = index.get(joinValue);\n\tif (bucket === undefined) {\n\t\treturn;\n\t}\n\tbucket.delete(key);\n\tif (bucket.size === 0) {\n\t\tindex.delete(joinValue);\n\t}\n};\n\n/**\n * An incrementally-maintained equi-join (the differential-dataflow core, bounded\n * to a single two-input equality join). Hydrate both sides, then feed each side's\n * row changes through {@link EquiJoin.applyLeft} / `applyRight`: it indexes both\n * inputs by the join value and emits only the `{ added, removed, changed }`\n * joined rows the change affects — touching the matching pairs, not the whole\n * result. Inner by default; pass `selectUnmatched` for a LEFT join.\n *\n * Output rows are keyed internally by the `(leftKey, rightKey)` pair, so it\n * handles many-to-many. The consumer keys the emitted rows by its own key; for a\n * many-to-many join, include both ids in the output so that key is unique\n * (a many-to-one join can key by the left id alone).\n */\nexport const createEquiJoin = <L, R, Out>(\n\toptions: EquiJoinOptions<L, R, Out>\n): EquiJoin<L, R, Out> => {\n\tconst { leftKey, rightKey, leftOn, rightOn, select, selectUnmatched } =\n\t\toptions;\n\tconst equals = options.equals ?? shallowEqual;\n\n\tconst lefts = new Map<RowKey, L>();\n\tconst rights = new Map<RowKey, R>();\n\tconst leftByJoin = new Map<RowKey, Set<RowKey>>();\n\tconst rightByJoin = new Map<RowKey, Set<RowKey>>();\n\tconst output = new Map<string, Out>();\n\t// Output keys each left currently contributes (matched pairs, or its single\n\t// unmatched row in a left join) — so a change recomputes just that left.\n\tconst outByLeft = new Map<RowKey, Set<string>>();\n\n\tconst outKey = (lk: RowKey, rk: RowKey): string => `${lk} ${rk}`;\n\tconst unmatchedKey = (lk: RowKey): string => `${lk} ~`;\n\n\t/** The output rows a single left row currently contributes. */\n\tconst leftOutputs = (lk: RowKey, left: L): Map<string, Out> => {\n\t\tconst result = new Map<string, Out>();\n\t\tconst rks = rightByJoin.get(leftOn(left));\n\t\tif (rks !== undefined && rks.size > 0) {\n\t\t\tfor (const rk of rks) {\n\t\t\t\tconst right = rights.get(rk);\n\t\t\t\tif (right !== undefined) {\n\t\t\t\t\tresult.set(outKey(lk, rk), select(left, right));\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (selectUnmatched !== undefined) {\n\t\t\tresult.set(unmatchedKey(lk), selectUnmatched(left));\n\t\t}\n\t\treturn result;\n\t};\n\n\t/** Diff one left's previous output keys against its freshly-computed set. */\n\tconst reconcileLeft = (\n\t\tlk: RowKey,\n\t\tafter: Map<string, Out>\n\t): ViewDiff<Out> => {\n\t\tconst before = outByLeft.get(lk) ?? new Set<string>();\n\t\tconst added: Out[] = [];\n\t\tconst removed: Out[] = [];\n\t\tconst changed: Out[] = [];\n\t\tfor (const [ok, value] of after) {\n\t\t\tconst previous = output.get(ok);\n\t\t\tif (previous === undefined) {\n\t\t\t\tadded.push(value);\n\t\t\t} else if (!equals(previous, value)) {\n\t\t\t\tchanged.push(value);\n\t\t\t}\n\t\t\toutput.set(ok, value);\n\t\t}\n\t\tfor (const ok of before) {\n\t\t\tif (!after.has(ok)) {\n\t\t\t\tconst previous = output.get(ok);\n\t\t\t\tif (previous !== undefined) {\n\t\t\t\t\tremoved.push(previous);\n\t\t\t\t\toutput.delete(ok);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (after.size === 0) {\n\t\t\toutByLeft.delete(lk);\n\t\t} else {\n\t\t\toutByLeft.set(lk, new Set(after.keys()));\n\t\t}\n\t\treturn { added, removed, changed };\n\t};\n\n\tconst mergeInto = (target: ViewDiff<Out>, diff: ViewDiff<Out>) => {\n\t\ttarget.added.push(...diff.added);\n\t\ttarget.removed.push(...diff.removed);\n\t\ttarget.changed.push(...diff.changed);\n\t};\n\n\treturn {\n\t\thydrate: (left, right) => {\n\t\t\tlefts.clear();\n\t\t\trights.clear();\n\t\t\tleftByJoin.clear();\n\t\t\trightByJoin.clear();\n\t\t\toutput.clear();\n\t\t\toutByLeft.clear();\n\t\t\tfor (const right_ of right) {\n\t\t\t\tconst rk = rightKey(right_);\n\t\t\t\trights.set(rk, right_);\n\t\t\t\taddToIndex(rightByJoin, rightOn(right_), rk);\n\t\t\t}\n\t\t\tfor (const left_ of left) {\n\t\t\t\tconst lk = leftKey(left_);\n\t\t\t\tlefts.set(lk, left_);\n\t\t\t\taddToIndex(leftByJoin, leftOn(left_), lk);\n\t\t\t\tconst outs = leftOutputs(lk, left_);\n\t\t\t\tfor (const [ok, value] of outs) {\n\t\t\t\t\toutput.set(ok, value);\n\t\t\t\t}\n\t\t\t\tif (outs.size > 0) {\n\t\t\t\t\toutByLeft.set(lk, new Set(outs.keys()));\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tapplyLeft: ({ op, row }) => {\n\t\t\tconst lk = leftKey(row);\n\t\t\tconst existing = lefts.get(lk);\n\t\t\tif (existing !== undefined) {\n\t\t\t\tremoveFromIndex(leftByJoin, leftOn(existing), lk);\n\t\t\t}\n\t\t\tif (op === 'delete') {\n\t\t\t\tlefts.delete(lk);\n\t\t\t} else {\n\t\t\t\tlefts.set(lk, row);\n\t\t\t\taddToIndex(leftByJoin, leftOn(row), lk);\n\t\t\t}\n\t\t\tconst after =\n\t\t\t\top === 'delete' ? new Map<string, Out>() : leftOutputs(lk, row);\n\t\t\treturn reconcileLeft(lk, after);\n\t\t},\n\n\t\tapplyRight: ({ op, row }) => {\n\t\t\tconst rk = rightKey(row);\n\t\t\tconst existing = rights.get(rk);\n\t\t\tconst affected = new Set<RowKey>();\n\t\t\tconst addAffected = (joinValue: RowKey) => {\n\t\t\t\tfor (const lk of leftByJoin.get(joinValue) ?? []) {\n\t\t\t\t\taffected.add(lk);\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (existing !== undefined) {\n\t\t\t\taddAffected(rightOn(existing));\n\t\t\t\tremoveFromIndex(rightByJoin, rightOn(existing), rk);\n\t\t\t}\n\t\t\tif (op === 'delete') {\n\t\t\t\trights.delete(rk);\n\t\t\t} else {\n\t\t\t\trights.set(rk, row);\n\t\t\t\taddToIndex(rightByJoin, rightOn(row), rk);\n\t\t\t\taddAffected(rightOn(row));\n\t\t\t}\n\n\t\t\tconst diff: ViewDiff<Out> = { added: [], removed: [], changed: [] };\n\t\t\tfor (const lk of affected) {\n\t\t\t\tconst left = lefts.get(lk);\n\t\t\t\tif (left !== undefined) {\n\t\t\t\t\tmergeInto(diff, reconcileLeft(lk, leftOutputs(lk, left)));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn diff;\n\t\t},\n\n\t\trows: () => [...output.values()],\n\t\tsize: () => output.size\n\t};\n};\n",
12
12
  "import type { RowChange, RowKey, ViewDiff } from './types';\n\nexport type MaterializedViewOptions<T> = {\n\t/** Row identity within the result set. */\n\tkey: (row: T) => RowKey;\n\t/**\n\t * The query's WHERE as a JS predicate: does this row belong in the result\n\t * set? Evaluated on every changed row to decide enter/leave/update. (The\n\t * Drizzle/Prisma adapters can derive this from a query filter.)\n\t */\n\tmatch: (row: T) => boolean;\n\t/**\n\t * Equality used by {@link MaterializedView.reset} to detect changed rows.\n\t * Defaults to a shallow compare of own enumerable properties.\n\t */\n\tequals?: (a: T, b: T) => boolean;\n};\n\nexport type MaterializedView<T> = {\n\t/**\n\t * Replace the result set with `rows` (the initial DB query result). Rows are\n\t * trusted to already satisfy the predicate — the database applied the filter.\n\t */\n\thydrate: (rows: Iterable<T>) => void;\n\t/**\n\t * Apply one row change and return the resulting diff. Empty `added`/`removed`/\n\t * `changed` arrays mean the change did not affect this view.\n\t */\n\tapply: (change: RowChange<T>) => ViewDiff<T>;\n\t/**\n\t * Replace the result set with a fresh query result and return the diff versus\n\t * what the view previously held. Powers the refetch fallback for queries that\n\t * can't be matched incrementally.\n\t */\n\treset: (rows: Iterable<T>) => ViewDiff<T>;\n\t/** Current result set, as an array. */\n\trows: () => T[];\n\t/** Current result-set size. */\n\tsize: () => number;\n};\n\nconst emptyDiff = <T>(): ViewDiff<T> => ({\n\tadded: [],\n\tremoved: [],\n\tchanged: []\n});\n\nconst shallowEqual = (a: unknown, b: unknown): boolean => {\n\tif (a === b) {\n\t\treturn true;\n\t}\n\tif (\n\t\ttypeof a !== 'object' ||\n\t\ttypeof b !== 'object' ||\n\t\ta === null ||\n\t\tb === null\n\t) {\n\t\treturn false;\n\t}\n\tconst aKeys = Object.keys(a);\n\tconst bKeys = Object.keys(b);\n\tif (aKeys.length !== bKeys.length) {\n\t\treturn false;\n\t}\n\treturn aKeys.every(\n\t\t(key) =>\n\t\t\t(a as Record<string, unknown>)[key] ===\n\t\t\t(b as Record<string, unknown>)[key]\n\t);\n};\n\n/** True when a diff carries no changes. */\nexport const isEmptyViewDiff = <T>(diff: ViewDiff<T>): boolean =>\n\tdiff.added.length === 0 &&\n\tdiff.removed.length === 0 &&\n\tdiff.changed.length === 0;\n\n/**\n * A single query's materialized result set, maintained incrementally by\n * predicate matching (the Tier 3 IVM core). Hydrate once from the database, then\n * feed each changed row through {@link MaterializedView.apply}: the view decides\n * whether the row entered, left, stayed-and-changed, or is irrelevant, and\n * returns just that delta — so the server pushes diffs instead of refetching.\n *\n * Scope: single-table filtered queries (no ORDER BY / LIMIT windows — a top-N\n * query should hydrate-and-refetch rather than rely on this view, since a row\n * entering can silently evict another). Joins/aggregations are a later,\n * differential-dataflow engine.\n */\nexport const createMaterializedView = <T>(\n\toptions: MaterializedViewOptions<T>\n): MaterializedView<T> => {\n\tconst { key, match } = options;\n\tconst equals = options.equals ?? shallowEqual;\n\tconst set = new Map<RowKey, T>();\n\n\treturn {\n\t\thydrate: (rows) => {\n\t\t\tset.clear();\n\t\t\tfor (const row of rows) {\n\t\t\t\tset.set(key(row), row);\n\t\t\t}\n\t\t},\n\t\treset: (rows) => {\n\t\t\tconst next = new Map<RowKey, T>();\n\t\t\tconst added: T[] = [];\n\t\t\tconst changed: T[] = [];\n\t\t\tfor (const row of rows) {\n\t\t\t\tconst rowKey = key(row);\n\t\t\t\tnext.set(rowKey, row);\n\t\t\t\tconst previous = set.get(rowKey);\n\t\t\t\tif (previous === undefined) {\n\t\t\t\t\tadded.push(row);\n\t\t\t\t} else if (!equals(previous, row)) {\n\t\t\t\t\tchanged.push(row);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst removed: T[] = [];\n\t\t\tfor (const [rowKey, previous] of set) {\n\t\t\t\tif (!next.has(rowKey)) {\n\t\t\t\t\tremoved.push(previous);\n\t\t\t\t}\n\t\t\t}\n\t\t\tset.clear();\n\t\t\tfor (const [rowKey, row] of next) {\n\t\t\t\tset.set(rowKey, row);\n\t\t\t}\n\t\t\treturn { added, removed, changed };\n\t\t},\n\t\tapply: ({ op, row }) => {\n\t\t\tconst rowKey = key(row);\n\t\t\tconst existing = set.get(rowKey);\n\n\t\t\tif (op === 'delete') {\n\t\t\t\tif (existing === undefined) {\n\t\t\t\t\treturn emptyDiff();\n\t\t\t\t}\n\t\t\t\tset.delete(rowKey);\n\t\t\t\treturn { added: [], removed: [existing], changed: [] };\n\t\t\t}\n\n\t\t\t// insert | update — let the predicate decide membership.\n\t\t\tif (match(row)) {\n\t\t\t\tset.set(rowKey, row);\n\t\t\t\treturn existing === undefined\n\t\t\t\t\t? { added: [row], removed: [], changed: [] }\n\t\t\t\t\t: { added: [], removed: [], changed: [row] };\n\t\t\t}\n\n\t\t\t// No longer matches: it leaves the set if it was in it.\n\t\t\tif (existing !== undefined) {\n\t\t\t\tset.delete(rowKey);\n\t\t\t\treturn { added: [], removed: [existing], changed: [] };\n\t\t\t}\n\t\t\treturn emptyDiff();\n\t\t},\n\t\trows: () => [...set.values()],\n\t\tsize: () => set.size\n\t};\n};\n",
13
13
  "/**\n * Mutation retry policy — opt-in conflict retry for `defineMutation`. Convex\n * auto-retries every mutation on OCC conflict because their handlers are pure\n * deterministic functions; sync handlers are arbitrary user code, so retry is\n * opt-in and the user owns the idempotency contract. When a handler throws a\n * classified-as-retryable error (default: PG serialization failures, codes\n * 40001 / 40P01), the engine discards the buffered changes, awaits a backoff,\n * and re-runs the handler with a fresh transaction.\n */\n\n/** What the engine receives + uses to schedule the next attempt. */\nexport type RetryPolicy = {\n\t/** Inclusive max attempts (1 = no retry). Defaults to 5. */\n\tmaxAttempts?: number;\n\t/** Compute the delay before attempt `n+1` (n is 1-indexed). */\n\tbackoff?: (attempt: number) => number;\n\t/**\n\t * Return `true` for errors that should trigger a retry. Defaults to\n\t * {@link isSerializationFailure} — PG `40001` (serialization_failure) +\n\t * `40P01` (deadlock_detected). Override to add MySQL `1213`, app-level\n\t * \"version conflict\" sentinels, CRDT merge conflicts, etc.\n\t */\n\tisRetryable?: (error: unknown) => boolean;\n\t/**\n\t * Hard ceiling on total elapsed time across all attempts (ms). A\n\t * still-failing mutation past this gives up regardless of `maxAttempts`.\n\t * Defaults to 30_000.\n\t */\n\tmaxElapsedMs?: number;\n};\n\nconst PG_RETRY_CODES = new Set(['40001', '40P01']);\n\n/**\n * Default retryability predicate — Postgres serialization_failure (`40001`)\n * and deadlock_detected (`40P01`). `postgres` (porsager) and `pg` both expose\n * the SQLSTATE on `error.code`. We also accept the codes on a wrapping\n * `error.cause` to be friendly to libraries that wrap errors.\n */\nexport const isSerializationFailure = (error: unknown): boolean => {\n\tif (error === null || typeof error !== 'object') return false;\n\tconst code = (error as { code?: unknown }).code;\n\tif (typeof code === 'string' && PG_RETRY_CODES.has(code)) return true;\n\tconst cause = (error as { cause?: unknown }).cause;\n\tif (cause !== undefined) return isSerializationFailure(cause);\n\n\treturn false;\n};\n\nexport type ExponentialBackoffOptions = {\n\t/** Initial delay (ms). Defaults to 25. */\n\tbaseMs?: number;\n\t/** Multiplier per attempt. Defaults to 2. */\n\tfactor?: number;\n\t/** Hard cap on a single delay (ms). Defaults to 1000. */\n\tmaxMs?: number;\n\t/** Random jitter as a fraction of the computed delay. Defaults to 0.2. */\n\tjitter?: number;\n};\n\n/**\n * Exponential backoff with optional jitter — matches the shape used in\n * `@absolutejs/queue` so a user who's already learned one knows the other.\n *\n * @example\n * defineMutation({\n * name: 'transfer',\n * retry: { maxAttempts: 5, backoff: exponentialBackoff() },\n * handler: async (args, ctx, actions) => { ... }\n * });\n */\nexport const exponentialBackoff =\n\t(options: ExponentialBackoffOptions = {}) =>\n\t(attempt: number): number => {\n\t\tconst base = options.baseMs ?? 25;\n\t\tconst factor = options.factor ?? 2;\n\t\tconst max = options.maxMs ?? 1000;\n\t\tconst jitter = options.jitter ?? 0.2;\n\t\tconst raw = Math.min(max, base * factor ** Math.max(0, attempt - 1));\n\t\tconst spread = raw * jitter;\n\n\t\treturn raw + (Math.random() * 2 - 1) * spread;\n\t};\n\n/** Internal: thrown when retries exhaust without success. Re-throws the\n * underlying error so the caller's existing error handling still works; the\n * `RetriesExhaustedError` form is only used inside the engine for typing. */\nexport class RetriesExhaustedError extends Error {\n\treadonly attempts: number;\n\treadonly elapsedMs: number;\n\treadonly cause: unknown;\n\tconstructor(attempts: number, elapsedMs: number, cause: unknown) {\n\t\tconst message = cause instanceof Error ? cause.message : String(cause);\n\t\tsuper(\n\t\t\t`retries exhausted after ${attempts} attempts (${elapsedMs}ms): ${message}`\n\t\t);\n\t\tthis.name = 'RetriesExhaustedError';\n\t\tthis.attempts = attempts;\n\t\tthis.elapsedMs = elapsedMs;\n\t\tthis.cause = cause;\n\t}\n}\n",
14
14
  "/**\n * Sandboxed mutation runner — executes a string-form mutation handler inside\n * an `@absolutejs/isolated-jsc` Isolate. Use it when the handler source is\n * not fully trusted (multi-tenant PaaS, plugin systems, AI-generated logic),\n * or when you want to cap CPU/memory per mutation defensively.\n *\n * Trade-offs vs an ordinary `handler`:\n *\n * - Handler must be a string. It evaluates inside the isolate's JSC VM, with\n * no access to the host's modules, closures, or globals — only the\n * `args` / `ctx` clones and the `actions` Reference we pass in.\n * - First call per mutation pays an isolated-jsc runner warmup + callable\n * compile. Every subsequent call is served from the runner's keyed\n * callable cache — no per-call eval, no per-call `setGlobal`.\n * - Timeout terminates the isolate (the sandbox runner detects this and\n * lazily re-spawns on the next call). On the FFI backend timeouts throw\n * a TerminationException without killing the isolate; sync's runner\n * treats both shapes the same.\n *\n * **Backend default: `'auto'`** — `'auto'` picks FFI when libJSC is reachable\n * (~300 KB cold heap, interrupt-driven CPU timeouts) and falls back to\n * Worker (~46 MB cold heap, postMessage round-trips) otherwise. Pin to\n * `'worker'` if you specifically need Web APIs (`URL`, `TextEncoder`,\n * `WebSocket`) inside your handler — those live in the Bun-Worker\n * environment, not the bare JSC C API.\n *\n * **Per-call hot path (since isolated-jsc 0.8).** Each mutation owns a\n * `createIsolatedRunner()` instance. The runner applies the `tenant-script`\n * policy, keeps a keyed isolate pool, and caches the wrapped mutation as a\n * precompiled callable. Per call we invoke `runner.call(name, source, args)`\n * with a call id that routes `actions.*` back through a host Reference.\n *\n * The runner is built lazily per-mutation: nothing is spawned until the\n * mutation actually runs for the first time. No engine teardown hook is\n * needed — the OS reaps the workers when the engine's host process exits.\n */\n\n// Type-only import — erased at runtime, so the engine still loads when\n// `@absolutejs/isolated-jsc` isn't installed. The actual module is loaded\n// lazily via dynamic `import()` inside `loadIsolatedJsc`.\nimport type { IsolatedRunner, RunMetrics } from '@absolutejs/isolated-jsc';\nimport type { MutationActions } from './mutation';\n\ntype IsolatedJscModule = typeof import('@absolutejs/isolated-jsc');\n\n/**\n * Per-call metrics record emitted by `sandboxedHandler` when the engine\n * is configured with {@link SyncEngineOptions.handlerMetrics}. One record\n * per invocation, fired AFTER the call completes (success or failure).\n *\n * Use this for per-tenant dashboards (\"which tenant is burning the most\n * CPU?\"), runtime alerting (\"this handler is timing out repeatedly\"),\n * cost attribution, and post-mortem replay of slow / failed mutations.\n *\n * Sample wiring pattern — publish to a sync collection users can\n * subscribe to like any other:\n *\n * ```ts\n * const engine = createSyncEngine({\n * handlerMetrics: (record) => {\n * metricsCollection.insert(record); // your own collection / sink\n * },\n * });\n * ```\n */\nexport type HandlerMetricsRecord = {\n\t/** Globally-unique id for this call (random). Useful as a join key. */\n\tid: string;\n\t/** Name passed to `defineMutation`. */\n\tmutationName: string;\n\t/** Wall-clock duration from call entry to result resolution (ms). */\n\tdurationMs: number;\n\t/**\n\t * CPU time spent inside the JSC sandbox (ms). Comes from\n\t * isolated-jsc runner metrics — does NOT include host-side message-passing\n\t * overhead on the Worker backend. Sub-millisecond runs round to 0.\n\t */\n\tcpuMs: number;\n\t/** isolated-jsc backend that executed the call. */\n\tbackend?: 'ffi' | 'worker';\n\t/**\n\t * Heap size (bytes) measured immediately after the script returned.\n\t * Not the run's peak — a true peak needs continuous polling.\n\t */\n\theapBytes: number;\n\t/** `true` if the handler returned normally; `false` if it threw. */\n\tok: boolean;\n\t/** Error name (`TimeoutError`, `MemoryLimitError`, `Error`, …) on failure. */\n\terrorName?: string;\n\t/** Error message on failure. */\n\terrorMessage?: string;\n\t/** `Date.now()` at the moment the call ended. */\n\ttimestamp: number;\n};\n\n/**\n * Per-call hook invoked once each `sandboxedHandler` invocation finishes\n * (success or failure). Synchronous return is the common case; an async\n * return is awaited but its rejection is swallowed (a metrics hook that\n * crashes must NOT also crash the caller's mutation path).\n */\nexport type HandlerMetricsHook = (\n\trecord: HandlerMetricsRecord\n) => void | Promise<void>;\n\n/**\n * Per-host configuration for an entry in {@link BridgeFetchConfig}.\n * Auth is computed on the host side per call; the secret never enters\n * the sandbox's JSC heap.\n */\nexport type BridgeFetchEndpoint = {\n\t/**\n\t * Header values to add to every request to this host. Static — read\n\t * once at engine construction. Use {@link authorization} for tokens\n\t * that need to be computed per call.\n\t */\n\theaders?: Record<string, string>;\n\t/**\n\t * Compute the `Authorization` header value on each call. Synchronous\n\t * or async. Throwing rejects the in-sandbox call without revealing\n\t * the underlying error (the sandbox sees a generic\n\t * \"authorization callback failed\").\n\t */\n\tauthorization?: () => string | Promise<string>;\n};\n\n/**\n * `actions.fetch(url, init)` allowlist + auth-injection config keyed by\n * hostname. A request whose URL parses to a hostname NOT in this map is\n * rejected before any network call. A request whose hostname IS in the\n * map gets the configured static headers + the computed authorization\n * stitched in on the host side. The sandbox source never sees the auth\n * value.\n *\n * Hostname keys are exact (`'api.example.com'`). The special key `'*'`\n * is a wildcard (use sparingly — it disables allowlisting).\n *\n * ```ts\n * createSyncEngine({\n * bridgeFetch: {\n * 'api.stripe.com': {\n * authorization: () => `Bearer ${process.env.STRIPE_KEY}`,\n * },\n * 'api.openai.com': {\n * authorization: () => `Bearer ${process.env.OPENAI_KEY}`,\n * headers: { 'OpenAI-Beta': 'assistants=v2' },\n * },\n * },\n * });\n * ```\n */\nexport type BridgeFetchConfig = Record<string, BridgeFetchEndpoint>;\n\n/**\n * Response shape `actions.fetch` resolves to inside the sandbox. The\n * body is materialised as text on the host (so it crosses the JSC\n * boundary as a structured-cloned string). Users parse it themselves\n * with `JSON.parse(res.body)` for JSON responses.\n */\nexport type BridgeFetchResponse = {\n\tok: boolean;\n\tstatus: number;\n\tstatusText: string;\n\turl: string;\n\theaders: Record<string, string>;\n\tbody: string;\n};\n\n/** Per-mutation sandbox configuration. */\nexport type SandboxConfig = {\n\t/** Heap memory cap (MB). Default 32. */\n\tmemoryLimit?: number;\n\t/** Wall-clock cap per call (ms). Default 5000. */\n\ttimeout?: number;\n\t/**\n\t * isolated-jsc backend. Defaults to `'auto'` (FFI when libJSC is\n\t * reachable, Worker otherwise). Both backends now run through the same\n\t * `createIsolatedRunner().call()` hot path; the choice trades cold spawn\n\t * (FFI wins ~6×) against Web API availability (Worker only).\n\t *\n\t * Pin to `'worker'` if your handler needs Web APIs (`URL`,\n\t * `TextEncoder`, `WebSocket`) — those live in the Bun-Worker\n\t * environment, not the bare JSC C API.\n\t *\n\t * Pin to `'ffi'` to bypass the auto-probe when you know libJSC is\n\t * reachable (e.g. CI with a known image).\n\t */\n\tbackend?: 'auto' | 'ffi' | 'worker';\n\t/**\n\t * **Escape hatch.** Map of host functions the sandboxed handler may\n\t * call as `unsafeHost.fnName(...args)`. The name is deliberately\n\t * loud: anyone reading the source must see immediately that a\n\t * sandboxed mutation is reaching through to non-deterministic host\n\t * code (third-party API, queue push, email send, anything that\n\t * touches the outside world).\n\t *\n\t * Without this option, the sandbox is hermetic — only `args`,\n\t * `ctx`, and `actions` are reachable. Declare an entry here, name\n\t * it visibly (e.g. `chargeStripe`, `sendSlackPing`), and the engine\n\t * exposes it on the sandbox-side `unsafeHost` Proxy. The fn runs on\n\t * the host; its return value is structured-cloned back across the\n\t * isolate boundary; thrown errors propagate into the sandbox as\n\t * normal JS errors the handler can catch.\n\t *\n\t * The deterministic-mutation guarantees stop at the call site —\n\t * retries WILL re-fire these host fns (they're outside the\n\t * transaction). Treat them as side effects and either make them\n\t * idempotent or pair them with explicit compensation in the\n\t * handler. Convex's actions are the same model; this is the same\n\t * trade.\n\t *\n\t * @example\n\t * ```ts\n\t * defineMutation({\n\t * name: 'payments:checkout',\n\t * sandboxedHandler: `async (args, ctx, actions, unsafeHost) => {\n\t * const order = await actions.insert('orders', { ...args, status: 'pending' });\n\t * const receipt = await unsafeHost.chargeStripe({\n\t * amount: order.amount,\n\t * token: args.token,\n\t * });\n\t * await actions.update('orders', { id: order.id, status: 'paid', receipt });\n\t * return order;\n\t * }`,\n\t * sandbox: {\n\t * unsafeHost: {\n\t * chargeStripe: ({ amount, token }) =>\n\t * stripe.charges.create({ amount, source: token }),\n\t * },\n\t * },\n\t * });\n\t * ```\n\t */\n\t// `any[]` (not `unknown[]`) for ergonomics — consumers write typed\n\t// fns like `(input: { amount: number }) => …` and would otherwise\n\t// have to cast inside every body to satisfy contravariance. The\n\t// sandbox-side dispatch doesn't enforce arg types anyway (they\n\t// cross structured-clone); validate inside the fn.\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tunsafeHost?: Record<string, (...args: any[]) => unknown | Promise<unknown>>;\n};\n\nlet isolatedJscModule: IsolatedJscModule | undefined;\nconst loadIsolatedJsc = async (): Promise<IsolatedJscModule> => {\n\tif (isolatedJscModule !== undefined) return isolatedJscModule;\n\ttry {\n\t\tisolatedJscModule = await import('@absolutejs/isolated-jsc');\n\t\treturn isolatedJscModule;\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t'sandboxedHandler requires the optional peer \"@absolutejs/isolated-jsc\". ' +\n\t\t\t\t'Install it with: bun add @absolutejs/isolated-jsc',\n\t\t\t{ cause: error }\n\t\t);\n\t}\n};\n\n/**\n * Wrap user source as a function expression for `runner.call`. The compiled\n * function takes `(__callId, args, ctx)` — `__callId` keys the\n * per-call `actions` lookup, so the dispatch Reference (installed once\n * per isolate as a global) can route `actions.*` calls back to the\n * correct call's host-side `actions` instance. The in-VM `actions`\n * object is a thin shim that closes the call id over a global\n * `__dispatch` Reference.\n *\n * The wrapper is SYNC. If `userFn` is sync the return is a primitive\n * (FFI's `unwrapResultPromise` short-circuits on `!JSValueIsObject` —\n * zero unwrap evals). If `userFn` is async the return is a Promise and\n * the unwrap pump fires normally.\n */\nconst wrap = (source: string): string => `\n\tfunction (__callId, args, ctx) {\n\t\tconst userFn = (${source});\n\t\tif (typeof userFn !== 'function') {\n\t\t\tthrow new Error(\n\t\t\t\t'sandboxedHandler must evaluate to (args, ctx, actions, unsafeHost) => result; got ' +\n\t\t\t\t\ttypeof userFn\n\t\t\t);\n\t\t}\n\t\tconst actions = {\n\t\t\tinsert: (table, data) => __dispatch(__callId, 'insert', table, data),\n\t\t\tupdate: (table, data) => __dispatch(__callId, 'update', table, data),\n\t\t\tdelete: (table, row) => __dispatch(__callId, 'delete', table, row),\n\t\t\tchange: (collection, change) => __dispatch(__callId, 'change', collection, change),\n\t\t\tnow: () => __dispatch(__callId, 'now'),\n\t\t\tfetch: (url, init) => __dispatch(__callId, 'fetch', url, init)\n\t\t};\n\t\t// Escape hatch — host fns the mutation explicitly opted in to.\n\t\t// The Proxy means every property access is a host call; the\n\t\t// engine throws if the property name isn't declared in the\n\t\t// mutation's sandbox.unsafeHost map.\n\t\tconst unsafeHost = new Proxy({}, {\n\t\t\tget: (_target, fnName) => {\n\t\t\t\tif (typeof fnName !== 'string') return undefined;\n\t\t\t\treturn (...callArgs) =>\n\t\t\t\t\t__dispatch(__callId, 'unsafeHost', fnName, callArgs);\n\t\t\t}\n\t\t});\n\t\treturn userFn(args, ctx, actions, unsafeHost);\n\t}\n`;\n\ntype CompiledMutation = {\n\t/** Per-call actions instances, keyed by callId. Lives for the\n\t * duration of each call. */\n\tcallMap: Map<number, MutationActions>;\n\tnextCallId: number;\n\trunner: IsolatedRunner;\n\tsource: string;\n\ttimeoutMs: number;\n};\n\nconst compile = async (\n\tsource: string,\n\tconfig: SandboxConfig,\n\tbridgeFetch: BridgeFetchConfig | undefined\n): Promise<CompiledMutation> => {\n\tconst { Reference, createIsolatedRunner, resolveIsolatePolicy } =\n\t\tawait loadIsolatedJsc();\n\n\t// Dispatch installed ONCE per runner context as a global. Closes over the\n\t// per-mutation callMap; each in-VM `actions.*` call hands its\n\t// callId back so we look up the right `actions` instance. This is\n\t// concurrent-safe: every call has its own callId → its own slot,\n\t// no shared-mutable-state races.\n\tconst callMap = new Map<number, MutationActions>();\n\tconst unsafeHost = config.unsafeHost;\n\tconst dispatch = new Reference(((\n\t\tcallId: unknown,\n\t\top: unknown,\n\t\t...rest: unknown[]\n\t): Promise<unknown> | unknown => {\n\t\tconst a = callMap.get(callId as number);\n\t\tif (a === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`__dispatch invoked for orphan callId ${String(callId)}`\n\t\t\t);\n\t\t}\n\t\tswitch (op) {\n\t\t\tcase 'insert':\n\t\t\t\treturn a.insert(rest[0] as string, rest[1]);\n\t\t\tcase 'update':\n\t\t\t\treturn a.update(rest[0] as string, rest[1]);\n\t\t\tcase 'delete':\n\t\t\t\treturn a.delete(rest[0] as string, rest[1]);\n\t\t\tcase 'change':\n\t\t\t\treturn a.change(rest[0] as string, rest[1] as never);\n\t\t\tcase 'now':\n\t\t\t\treturn a.now();\n\t\t\tcase 'fetch':\n\t\t\t\treturn runBridgeFetch(\n\t\t\t\t\tbridgeFetch,\n\t\t\t\t\trest[0] as string,\n\t\t\t\t\trest[1] as RequestInit | undefined\n\t\t\t\t);\n\t\t\tcase 'unsafeHost': {\n\t\t\t\tconst fnName = rest[0] as string;\n\t\t\t\tconst callArgs = (rest[1] as unknown[]) ?? [];\n\t\t\t\tif (\n\t\t\t\t\tunsafeHost === undefined ||\n\t\t\t\t\ttypeof unsafeHost[fnName] !== 'function'\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`sandboxedHandler called unsafeHost.${fnName}() but it was not declared in the mutation's sandbox.unsafeHost config. Declare it (and only the host fns you intend to expose) to opt in to the escape hatch.`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn unsafeHost[fnName](...callArgs);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`unknown sandbox action op: ${String(op)}`);\n\t\t}\n\t}) as (...rawArgs: unknown[]) => unknown);\n\n\tconst timeoutMs = config.timeout ?? 5000;\n\tconst sourceToCall = wrap(source);\n\tconst policy = resolveIsolatePolicy('tenant-script', {\n\t\tallowWorkerFallback: true,\n\t\tbackend: config.backend ?? 'auto',\n\t\tmemoryLimit: config.memoryLimit ?? 32,\n\t\ttimeout: timeoutMs\n\t});\n\tconst runner = createIsolatedRunner({\n\t\tglobals: { __dispatch: dispatch },\n\t\tpolicy\n\t});\n\tawait runner.precompile('sandboxedHandler', sourceToCall);\n\n\treturn {\n\t\tcallMap,\n\t\tnextCallId: 1,\n\t\trunner,\n\t\tsource: sourceToCall,\n\t\ttimeoutMs\n\t};\n};\n\n/**\n * Host-side implementation of `actions.fetch(url, init)`. Enforces the\n * `BridgeFetchConfig` allowlist (rejecting otherwise-unknown hostnames\n * before any network call), computes the authorization on the host\n * side (so the secret never crosses into JSC), and returns a\n * structured-cloneable {@link BridgeFetchResponse} the sandbox can\n * pick apart.\n */\nconst runBridgeFetch = async (\n\tconfig: BridgeFetchConfig | undefined,\n\turl: string,\n\tinit: RequestInit | undefined\n): Promise<BridgeFetchResponse> => {\n\tif (config === undefined) {\n\t\tthrow new Error(\n\t\t\t'actions.fetch called but the engine has no `bridgeFetch` config — ' +\n\t\t\t\t'pass `bridgeFetch: { ... }` to createSyncEngine.'\n\t\t);\n\t}\n\tlet parsed: URL;\n\ttry {\n\t\tparsed = new URL(url);\n\t} catch {\n\t\tthrow new Error(`actions.fetch: invalid URL \"${String(url)}\"`);\n\t}\n\tconst endpoint =\n\t\tconfig[parsed.hostname] ??\n\t\t(Object.prototype.hasOwnProperty.call(config, '*')\n\t\t\t? config['*']\n\t\t\t: undefined);\n\tif (endpoint === undefined) {\n\t\tthrow new Error(\n\t\t\t`actions.fetch: hostname \"${parsed.hostname}\" is not allowlisted in bridgeFetch config`\n\t\t);\n\t}\n\tconst headers: Record<string, string> = { ...(endpoint.headers ?? {}) };\n\t// Carry user-supplied headers from the sandbox last so an explicit\n\t// override wins — except we never let the sandbox set Authorization,\n\t// because that would reveal the auth pattern the host injected.\n\tif (init?.headers !== undefined) {\n\t\tconst incoming = init.headers as Record<string, string>;\n\t\tfor (const [name, value] of Object.entries(incoming)) {\n\t\t\tif (name.toLowerCase() === 'authorization') continue;\n\t\t\theaders[name] = value;\n\t\t}\n\t}\n\tif (endpoint.authorization !== undefined) {\n\t\tlet auth: string;\n\t\ttry {\n\t\t\tauth = await endpoint.authorization();\n\t\t} catch {\n\t\t\tthrow new Error('actions.fetch: authorization callback failed');\n\t\t}\n\t\theaders.Authorization = auth;\n\t}\n\tconst response = await fetch(url, { ...init, headers });\n\tconst responseHeaders: Record<string, string> = {};\n\tresponse.headers.forEach((value, name) => {\n\t\tresponseHeaders[name] = value;\n\t});\n\tconst body = await response.text();\n\treturn {\n\t\tbody,\n\t\theaders: responseHeaders,\n\t\tok: response.ok,\n\t\tstatus: response.status,\n\t\tstatusText: response.statusText,\n\t\turl: response.url\n\t};\n};\n\n/**\n * Build a lazy runner for one mutation's sandboxed source. The first call\n * compiles the runner + dispatch Reference + callable;\n * subsequent calls only generate a fresh callId, register the per-call\n * `actions` in the callMap, and invoke `runner.call(...)`. Per-call cost on\n * FFI: one JSObjectCallAsFunction + three cheap primitive packings. No\n * per-call Reference allocation, no setGlobal, no eval.\n *\n * Concurrency-safe by construction: each call has its own callId →\n * its own actions slot in the callMap.\n *\n * If the isolate has been disposed (timeout, memory cap), the next\n * call re-spawns transparently.\n */\nexport const makeSandboxedHandler = (\n\tsource: string,\n\tconfig: SandboxConfig = {},\n\t/**\n\t * Engine-level extras the per-mutation config doesn't carry:\n\t * - `metricsHook` enables per-call telemetry via\n\t * `runner.call(..., { withMetrics: true })` (small cost; off without\n\t * the hook).\n\t * - `bridgeFetch` enables `actions.fetch(url, init)` inside the\n\t * sandbox with host-side allowlist + auth injection.\n\t */\n\tengineExtras?: {\n\t\tmetricsHook?: {\n\t\t\tmutationName: string;\n\t\t\tonMetrics: HandlerMetricsHook;\n\t\t};\n\t\tbridgeFetch?: BridgeFetchConfig;\n\t}\n): ((\n\targs: unknown,\n\tctx: unknown,\n\tactions: MutationActions\n) => Promise<unknown>) => {\n\tlet pending: Promise<CompiledMutation> | undefined;\n\tconst metricsHook = engineExtras?.metricsHook;\n\tconst bridgeFetch = engineExtras?.bridgeFetch;\n\n\tconst getCompiled = async (): Promise<CompiledMutation> => {\n\t\tif (pending !== undefined) {\n\t\t\treturn pending;\n\t\t}\n\t\tpending = compile(source, config, bridgeFetch);\n\t\treturn pending;\n\t};\n\n\treturn async (args, ctx, actions) => {\n\t\tconst compiled = await getCompiled();\n\t\tconst callId = compiled.nextCallId++;\n\t\tcompiled.callMap.set(callId, actions);\n\n\t\t// Fast path: no metrics hook → no per-call overhead.\n\t\tif (metricsHook === undefined) {\n\t\t\ttry {\n\t\t\t\treturn await compiled.runner.call(\n\t\t\t\t\t'sandboxedHandler',\n\t\t\t\t\tcompiled.source,\n\t\t\t\t\t[callId, args, ctx],\n\t\t\t\t\t{ run: { timeout: compiled.timeoutMs } }\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tif (isIsolateDisposalError(error)) {\n\t\t\t\t\tpending = undefined;\n\t\t\t\t\tawait disposeCompiled(compiled);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tcompiled.callMap.delete(callId);\n\t\t\t}\n\t\t}\n\n\t\t// Metrics path: switch to runner metrics so we get backend, cpuMs,\n\t\t// and heapBytes from the isolate side. Errors get a synthesized record\n\t\t// before re-throwing so the caller still sees the error.\n\t\tconst startedAt = performance.now();\n\t\tconst id = makeRandomId();\n\t\ttry {\n\t\t\tconst { result, metrics } = await compiled.runner.call(\n\t\t\t\t'sandboxedHandler',\n\t\t\t\tcompiled.source,\n\t\t\t\t[callId, args, ctx],\n\t\t\t\t{ run: { timeout: compiled.timeoutMs }, withMetrics: true }\n\t\t\t);\n\t\t\tfireMetrics(metricsHook.onMetrics, {\n\t\t\t\tbackend: metrics.backend,\n\t\t\t\tcpuMs: metrics.cpuMs,\n\t\t\t\tdurationMs: performance.now() - startedAt,\n\t\t\t\theapBytes: metrics.heapBytes,\n\t\t\t\tid,\n\t\t\t\tmutationName: metricsHook.mutationName,\n\t\t\t\tok: true,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tif (isIsolateDisposalError(error)) {\n\t\t\t\tpending = undefined;\n\t\t\t\tawait disposeCompiled(compiled);\n\t\t\t}\n\t\t\tfireMetrics(metricsHook.onMetrics, {\n\t\t\t\tcpuMs: 0,\n\t\t\t\tdurationMs: performance.now() - startedAt,\n\t\t\t\terrorMessage:\n\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\terrorName: error instanceof Error ? error.name : 'Error',\n\t\t\t\theapBytes: 0,\n\t\t\t\tid,\n\t\t\t\tmutationName: metricsHook.mutationName,\n\t\t\t\tok: false,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t});\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tcompiled.callMap.delete(callId);\n\t\t}\n\t};\n};\n\nconst makeRandomId = (): string =>\n\t`hm_${Date.now().toString(36)}${Math.random().toString(36).slice(2, 10)}`;\n\nconst isIsolateDisposalError = (error: unknown): boolean =>\n\terror instanceof Error &&\n\t(error.name === 'TimeoutError' ||\n\t\terror.name === 'MemoryLimitError' ||\n\t\terror.name === 'IsolateDisposedError');\n\nconst disposeCompiled = async (compiled: CompiledMutation): Promise<void> => {\n\ttry {\n\t\tawait compiled.runner.dispose();\n\t} catch {\n\t\t// The isolate/pool may already have been torn down by the failing run.\n\t}\n};\n\nconst fireMetrics = (\n\thook: HandlerMetricsHook,\n\trecord: HandlerMetricsRecord\n): void => {\n\tlet outcome: void | Promise<void>;\n\ttry {\n\t\toutcome = hook(record);\n\t} catch {\n\t\t// Hook threw synchronously — swallow. The caller's mutation must\n\t\t// not fail because the metrics sink failed.\n\t\treturn;\n\t}\n\tif (outcome instanceof Promise) {\n\t\toutcome.catch(() => {\n\t\t\t// Async rejection — same policy: swallow.\n\t\t});\n\t}\n};\n",
15
15
  "/**\n * Sync packs — Convex Components without the lock-in. A pack bundles\n * schemas + collections + mutations + scheduled + permissions + readers/\n * writers + CRDT field declarations into one npm-distributable module\n * registered with a single {@link SyncEngine.registerPack} call.\n *\n * See `syncPacks.design.md` for the rationale and the worked examples.\n *\n * Pack design rules (enforced at register time):\n *\n * - A pack declares which tables it `ownsTables`. Two registered packs\n * cannot claim the same table; the host app's directly-registered\n * tables are NOT counted (host registrations always win).\n * - Name construction (namespacing) is the pack's job — each published\n * pack ships as a factory `create<Name>Pack(config)` that builds names\n * from a `tablePrefix` and the host's user/auth context.\n * - Packs compose via the subscription layer (read each other's\n * collections), never via cross-pack `runMutation` calls.\n */\n\nimport type {\n\tCollectionContext,\n\tCollectionDefinition,\n\tJoinCollectionDefinition\n} from './collection';\nimport type { GraphCollectionDefinition } from './graph';\nimport type { MutationDefinition, TableWriter } from './mutation';\nimport type { PermissionsDefinition, TablePermissions } from './permissions';\nimport type { ReactiveQueryDefinition, TableReader } from './reactive';\nimport type { ScheduleDefinition } from './schedule';\nimport type { SchemaDefinition, TableSchema } from './schema';\nimport type { SearchCollectionDefinition } from './search';\nimport type { CrdtMergeable } from '../crdt';\n\n/**\n * Same shape as the engine's per-table CRDT field map (see\n * {@link SyncEngine.registerCrdt}). A pack declares CRDT field types\n * here; the engine wires them on registration.\n */\nexport type CrdtFieldsMap = Record<\n\tstring,\n\tRecord<string, CrdtMergeable<unknown>>\n>;\n\n/**\n * A pack — a self-contained bundle of every registration the engine\n * already accepts. The engine's `registerPack(pack)` dispatches each\n * field to the matching `engine.register*` method. There is no new\n * persistence path; packs are pure composition.\n */\nexport type SyncPack = {\n\t/**\n\t * Pack identifier. Used for devtools labelling and conflict\n\t * diagnostics. Should match the npm package name (e.g.\n\t * \"@absolutejs/sync-pack-presence\").\n\t */\n\tname: string;\n\t/**\n\t * Pack semver. Surfaced in {@link EngineInspection.packs} and in\n\t * conflict diagnostics (e.g. \"table 'comments' is owned by\n\t * sync-pack-comments@2.1.0\").\n\t */\n\tversion: string;\n\t/**\n\t * Tables this pack OWNS. The engine rejects another pack that also\n\t * claims one of these. Direct host registrations (e.g.\n\t * `engine.registerSchema(\"foo\", ...)`) are NOT tracked as ownership,\n\t * so the host can still extend a pack's table or override its\n\t * schema/permissions.\n\t */\n\townsTables: string[];\n\t/**\n\t * Tables this pack reads but does NOT own (e.g. a comments pack\n\t * reads the host's `users` table for author info). Reported in\n\t * {@link EngineInspection.packs}; not enforced unless\n\t * {@link requireDependencies} is `true`.\n\t */\n\treadsTables?: string[];\n\t/**\n\t * When `true`, the engine throws {@link PackMissingDependencyError}\n\t * at register time if any table in `readsTables` has no registered\n\t * reader. Default `false` — host-app reads can be wired lazily.\n\t */\n\trequireDependencies?: boolean;\n\n\tschemas?: SchemaDefinition;\n\tpermissions?: PermissionsDefinition<any>;\n\treaders?: Record<string, TableReader<any>>;\n\twriters?: Record<string, TableWriter<any, any, any>>;\n\tcrdt?: CrdtFieldsMap;\n\n\t// Generic params use `any` (not `unknown`) on purpose: TypeScript's\n\t// function-parameter contravariance would reject a\n\t// `MutationDefinition<{id: string}, ...>` if the slot were\n\t// `MutationDefinition<unknown, ...>`. `any` keeps the slot permissive\n\t// while each `defineMutation` call retains its inferred shape. Same\n\t// shape as the engine's internal maps.\n\tcollections?: CollectionDefinition<any, any, any>[];\n\tjoinCollections?: JoinCollectionDefinition<any, any, any, any, any>[];\n\tgraphCollections?: GraphCollectionDefinition<any, any, any>[];\n\tsearchCollections?: SearchCollectionDefinition<any, any, any>[];\n\treactiveQueries?: ReactiveQueryDefinition<any, any, any>[];\n\n\tmutations?: MutationDefinition<any, any, any>[];\n\tschedules?: ScheduleDefinition[];\n};\n\n/**\n * Pack metadata stored on the engine and surfaced via\n * {@link EngineInspection.packs}.\n */\nexport type RegisteredPack = {\n\tname: string;\n\tversion: string;\n\townsTables: string[];\n\treadsTables: string[];\n};\n\n/**\n * Thrown by {@link SyncEngine.registerPack} when a pack claims a table\n * that another registered pack already owns. The message names both\n * packs and the colliding table so the operator can pick a\n * `tablePrefix`.\n */\nexport class PackTableConflictError extends Error {\n\treadonly table: string;\n\treadonly existingPack: string;\n\treadonly newPack: string;\n\tconstructor(table: string, existingPack: string, newPack: string) {\n\t\tsuper(\n\t\t\t`Pack \"${newPack}\" claims table \"${table}\", but \"${existingPack}\" already owns it. Use a tablePrefix on one of them.`\n\t\t);\n\t\tthis.name = 'PackTableConflictError';\n\t\tthis.table = table;\n\t\tthis.existingPack = existingPack;\n\t\tthis.newPack = newPack;\n\t}\n}\n\n/**\n * Thrown by {@link SyncEngine.registerPack} when a pack has\n * `requireDependencies: true` and at least one table in\n * {@link SyncPack.readsTables} has no registered reader at register\n * time. Pack authors opt into this when their pack cannot function\n * without the host having wired the dependency up front.\n */\nexport class PackMissingDependencyError extends Error {\n\treadonly pack: string;\n\treadonly missingTable: string;\n\tconstructor(pack: string, missingTable: string) {\n\t\tsuper(\n\t\t\t`Pack \"${pack}\" requires a reader for table \"${missingTable}\" but none is registered. Call engine.registerReader(\"${missingTable}\", ...) before engine.registerPack.`\n\t\t);\n\t\tthis.name = 'PackMissingDependencyError';\n\t\tthis.pack = pack;\n\t\tthis.missingTable = missingTable;\n\t}\n}\n\n/**\n * Identity helper. A pack is plain data — the helper exists for type\n * inference, not for runtime behavior.\n *\n * @example\n * export const createPresencePack = (config: PresencePackConfig) =>\n * defineSyncPack({\n * name: '@absolutejs/sync-pack-presence',\n * version: '0.1.0',\n * ownsTables: [resolveTableName('presence', config.tablePrefix)],\n * schemas: { ... },\n * collections: [ ... ],\n * mutations: [ ... ],\n * schedules: [ ... ],\n * });\n */\nexport const defineSyncPack = (pack: SyncPack): SyncPack => pack;\n",
16
16
  "import type { CollectionContext } from './collection';\nimport type { RowKey } from './types';\n\n/**\n * A scored search result: the matched row and its relevance score (higher is\n * more relevant). A search collection sorts hits descending and tags each\n * emitted row with its score (see {@link SEARCH_SCORE_FIELD}).\n */\nexport type SearchHit<T> = { row: T; score: number };\n\n/**\n * An incremental search index over a row set, queried by `Q` (a string for\n * full-text, a vector for similarity). Maintained as rows are added/removed, so\n * the collection that owns it stays live as the corpus changes.\n * {@link createTextIndex} and {@link createVectorIndex} implement it.\n */\nexport type SearchIndex<T, Q> = {\n\t/** Add or replace a row (upsert by key). */\n\tadd: (row: T) => void;\n\t/** Remove a row by key. */\n\tremove: (key: RowKey) => void;\n\t/** Top-`limit` hits for `query`, sorted by descending score. */\n\tsearch: (query: Q, limit: number) => SearchHit<T>[];\n\t/** Number of indexed rows. */\n\tsize: () => number;\n\t/** Drop every indexed row. */\n\tclear: () => void;\n};\n\n/** The field a search collection adds to each emitted row carrying its score. */\nexport const SEARCH_SCORE_FIELD = '_score';\n\nexport type SearchCollectionDefinition<\n\tT,\n\tQuery = string,\n\tCtx = CollectionContext\n> = {\n\t/** Collection name — its identity for subscribe. */\n\tname: string;\n\tkind: 'search';\n\t/** Source table whose committed changes keep the index live. */\n\ttable: string;\n\t/** Build the (empty) index — e.g. `() => createTextIndex({ ... })`. */\n\tindex: () => SearchIndex<T, Query>;\n\t/** The full corpus to index on first subscribe (e.g. a DB read). */\n\tsource: () => Promise<Iterable<T>> | Iterable<T>;\n\t/** Row identity. */\n\tkey: (row: T) => RowKey;\n\t/** Max results returned. Defaults to 20. */\n\tlimit?: number;\n\t/** Access control: return `false` (or throw) to deny the subscription. */\n\tauthorize?: (query: Query, ctx: Ctx) => boolean | Promise<boolean>;\n};\n\n/**\n * Define a live search collection: an index (full-text via {@link createTextIndex}\n * or vector via {@link createVectorIndex}) maintained from a source table's\n * change feed. The subscription's `params` *are* the query — a string for\n * full-text, a vector for similarity. Register it with\n * {@link SyncEngine.registerSearch}; the client receives the ranked top-K as a\n * normal collection, re-ranked live as rows change. Each emitted row carries its\n * relevance under {@link SEARCH_SCORE_FIELD}, so the client can sort by it.\n *\n * The corpus is the whole table; a row-level read permission on the table (see\n * {@link definePermissions}) still filters a caller's hits.\n */\nexport const defineSearchCollection = <\n\tT,\n\tQuery = string,\n\tCtx = CollectionContext\n>(\n\tdefinition: Omit<SearchCollectionDefinition<T, Query, Ctx>, 'kind'>\n): SearchCollectionDefinition<T, Query, Ctx> => ({\n\t...definition,\n\tkind: 'search'\n});\n",
17
- "import type {\n\tCollectionContext,\n\tCollectionDefinition,\n\tJoinCollectionDefinition\n} from './collection';\nimport { createEquiJoin } from './equiJoin';\nimport type { EquiJoin } from './equiJoin';\nimport type { GraphCollectionDefinition, GraphInstance } from './graph';\nimport { createMaterializedView, isEmptyViewDiff } from './materializedView';\nimport type { MaterializedView } from './materializedView';\nimport type {\n\tMutationActions,\n\tMutationDefinition,\n\tTableWriter,\n\tTransactionRunner\n} from './mutation';\nimport type {\n\tReactiveQueryDefinition,\n\tReadHandle,\n\tTableReader\n} from './reactive';\nimport {\n\texponentialBackoff,\n\tisSerializationFailure,\n\tRetriesExhaustedError\n} from './retry';\nimport {\n\ttype BridgeFetchConfig,\n\ttype HandlerMetricsHook,\n\ttype HandlerMetricsRecord,\n\tmakeSandboxedHandler\n} from './sandbox';\nimport type {\n\tPermissionsDefinition,\n\tReadRule,\n\tTablePermissions,\n\tWriteRule\n} from './permissions';\nimport { PackMissingDependencyError, PackTableConflictError } from './pack';\nimport type { RegisteredPack, SyncPack } from './pack';\nimport type { SearchCollectionDefinition, SearchIndex } from './search';\nimport { SEARCH_SCORE_FIELD } from './search';\nimport type { ScheduleDefinition } from './schedule';\nimport type {\n\tCollectionKind,\n\tEngineActivity,\n\tEngineInspection,\n\tEngineMetrics\n} from './devtools';\nimport type { SchemaDefinition, TableSchema } from './schema';\nimport type { CrdtMergeable } from '../crdt';\nimport type { ClusterBus } from './cluster';\nimport type { ChangeSource, RowChange, RowKey, ViewDiff } from './types';\n\n/**\n * Which fields of a `Row` are CRDT values, and the {@link CrdtMergeable} backend\n * (e.g. `rgaText`, or `yjsText` from `@absolutejs/sync-yjs`) used to merge each.\n * Pass to `engine.registerCrdt` so the engine merges those fields on write.\n */\nexport type CrdtFields<Row> = {\n\t[Field in keyof Row]?: CrdtMergeable<Row[Field]>;\n};\n\n/**\n * Thrown when `authorize` denies a subscribe or a mutation. The message names\n * the denied action; the message always starts with \"Not authorized\".\n */\nexport class UnauthorizedError extends Error {\n\tconstructor(subject: string) {\n\t\tsuper(`Not authorized: ${subject}`);\n\t\tthis.name = 'UnauthorizedError';\n\t}\n}\n\n/**\n * Thrown by `engine.subscribe` / `engine.hydrate` (1.15.0+) when the caller's\n * `AbortSignal` fires before the operation reaches a `Subscription` /\n * resolved value. The `name` is `'AbortError'` to match the DOM-standard\n * spelling so existing `catch (error) { if (error.name === 'AbortError') ... }`\n * patterns work unchanged.\n */\nexport class AbortError extends Error {\n\tconstructor(reason?: string) {\n\t\tsuper(reason ?? 'Aborted');\n\t\tthis.name = 'AbortError';\n\t}\n}\n\nconst checkAborted = (signal?: AbortSignal): void => {\n\tif (signal?.aborted) {\n\t\tthrow new AbortError(\n\t\t\tsignal.reason instanceof Error\n\t\t\t\t? signal.reason.message\n\t\t\t\t: typeof signal.reason === 'string'\n\t\t\t\t\t? signal.reason\n\t\t\t\t\t: 'Aborted'\n\t\t);\n\t}\n};\n\nconst linkAbortToUnsubscribe = (\n\tsignal: AbortSignal | undefined,\n\tunsubscribe: () => void\n): void => {\n\tif (signal === undefined) return;\n\tif (signal.aborted) {\n\t\tunsubscribe();\n\t\treturn;\n\t}\n\tconst handler = () => {\n\t\ttry {\n\t\t\tunsubscribe();\n\t\t} catch {\n\t\t\t/* idempotent unsubscribes shouldn't surface here */\n\t\t}\n\t};\n\tsignal.addEventListener('abort', handler, { once: true });\n};\n\n/**\n * Thrown when a mutation's write fails its table's schema (see\n * {@link defineSchema}). The message names the offending field.\n */\nexport class SchemaError extends Error {\n\tconstructor(table: string, fieldName: string) {\n\t\tsuper(`Schema violation on \"${table}\": invalid field \"${fieldName}\"`);\n\t\tthis.name = 'SchemaError';\n\t}\n}\n\nexport type SubscribeArgs<T, P, Ctx> = {\n\t/** Registered collection name. */\n\tcollection: string;\n\t/** Query params (e.g. a filter value); passed to hydrate/match/authorize. */\n\tparams: P;\n\t/** Caller context (e.g. session); passed to hydrate/match/authorize. */\n\tctx: Ctx;\n\t/** Receives every non-empty diff (with its version) after the initial reply. */\n\tonDiff: (diff: ViewDiff<T>, version: number) => void;\n\t/**\n\t * Resume from a version the client already applied. When the change log still\n\t * covers `(since, now]` for a single-table collection, the engine replies with\n\t * a catch-up diff instead of a full snapshot; otherwise it falls back to a\n\t * snapshot.\n\t */\n\tsince?: number;\n\t/**\n\t * Cancellation handle (1.15.0). Two effects:\n\t * 1. If the signal is already aborted when `subscribe` is called, the\n\t * engine throws {@link AbortError} immediately — no authorize, no\n\t * hydrate, no subscription.\n\t * 2. If the signal fires AFTER the subscription is live, the engine\n\t * auto-calls `unsubscribe()`. The consumer never has to thread two\n\t * handles for the same lifetime.\n\t *\n\t * Backwards-compatible — omit `signal` and the engine behaves exactly\n\t * as in pre-1.15.0.\n\t */\n\tsignal?: AbortSignal;\n};\n\nexport type Subscription<T> = {\n\t/** The result set at subscribe time — a snapshot (empty when resuming). */\n\tinitial: T[];\n\t/** Catch-up diff when resuming via `since` (instead of `initial`). */\n\tcatchup?: ViewDiff<T>;\n\t/** The engine version this reply brings the client up to. */\n\tversion: number;\n\t/** Stop receiving diffs and release the view. */\n\tunsubscribe: () => void;\n};\n\nexport type SyncEngine = {\n\t/** Register a collection definition (see {@link defineCollection}). */\n\tregister: <T, P = void, Ctx = CollectionContext>(\n\t\tcollection: CollectionDefinition<T, P, Ctx>\n\t) => void;\n\t/** Register an incremental join collection (see {@link defineJoinCollection}). */\n\tregisterJoin: <L, R, Out, P = void, Ctx = CollectionContext>(\n\t\tcollection: JoinCollectionDefinition<L, R, Out, P, Ctx>\n\t) => void;\n\t/** Register an operator-graph collection (see {@link defineGraphCollection}). */\n\tregisterGraph: <Out, P = void, Ctx = CollectionContext>(\n\t\tcollection: GraphCollectionDefinition<Out, P, Ctx>\n\t) => void;\n\t/**\n\t * Register a live search collection (see {@link defineSearchCollection}): a\n\t * full-text or vector index maintained from a source table's change feed and\n\t * queried by the subscription's params, returning the ranked top-K live.\n\t */\n\tregisterSearch: <T, Query = string, Ctx = CollectionContext>(\n\t\tcollection: SearchCollectionDefinition<T, Query, Ctx>\n\t) => void;\n\t/**\n\t * Register a scheduled function (see {@link defineSchedule}): server-triggered\n\t * work whose `actions` writes go live through the change feed. Wire the cron\n\t * triggers with the `scheduled` Elysia plugin.\n\t */\n\tregisterSchedule: (schedule: ScheduleDefinition) => void;\n\t/**\n\t * Run a registered schedule's handler now: its writes commit (in the\n\t * configured transaction) and emit as one live batch. The `scheduled` plugin\n\t * calls this on each cron fire; call it directly to trigger on demand.\n\t */\n\trunSchedule: (name: string) => Promise<void>;\n\t/** Registered schedules (name + cron pattern) — used by the `scheduled` plugin. */\n\tlistSchedules: () => ScheduleDefinition[];\n\t/**\n\t * Open a live subscription: authorize, hydrate the initial set, and stream\n\t * diffs as changes arrive. Rejects with {@link UnauthorizedError} on deny.\n\t */\n\tsubscribe: <T, P = void, Ctx = CollectionContext>(\n\t\targs: SubscribeArgs<T, P, Ctx>\n\t) => Promise<Subscription<T>>;\n\t/**\n\t * One-shot read: authorize and return a collection's current rows without\n\t * subscribing. Powers an Eden-typed HTTP hydrate route (and SSR). Rejects\n\t * with {@link UnauthorizedError} on deny.\n\t *\n\t * Pass `options.signal` (1.15.0+) to cancel the operation mid-flight —\n\t * the engine throws {@link AbortError} after the next await point if\n\t * the signal has fired.\n\t */\n\thydrate: (\n\t\tcollection: string,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\toptions?: { signal?: AbortSignal }\n\t) => Promise<unknown[]>;\n\t/**\n\t * Feed a committed change to `table` into the engine, fanning the resulting\n\t * diff to every live subscription of every collection that reads that table.\n\t * Call after a mutation, or wire a {@link ChangeSource} via `connectSource`.\n\t * Single-table subscriptions diff the row; multi-table / refetch ones\n\t * re-hydrate.\n\t */\n\tapplyChange: <T>(table: string, change: RowChange<T>) => Promise<void>;\n\t/**\n\t * Connect a change source (e.g. a CDC adapter): its emitted changes flow into\n\t * `applyChange`. Resolves to a disconnect function that stops the source.\n\t */\n\tconnectSource: (source: ChangeSource) => Promise<() => Promise<void>>;\n\t/**\n\t * Join a cluster (see {@link ClusterBus}): broadcast this instance's committed\n\t * changes to peers and apply theirs locally, so subscribers on every instance\n\t * stay live. Resolves to a disconnect function. Run once per instance.\n\t */\n\tconnectCluster: (bus: ClusterBus) => Promise<() => Promise<void>>;\n\t/** Active subscription count, optionally for one collection. */\n\tsubscriptionCount: (collection?: string) => number;\n\t/** Register a mutation definition (see {@link defineMutation}). */\n\tregisterMutation: <Args, Ctx = CollectionContext, Result = unknown>(\n\t\tmutation: MutationDefinition<Args, Ctx, Result>\n\t) => void;\n\t/**\n\t * Register how to persist a `table` (any ORM), so a mutation's\n\t * `actions.insert/update/delete` write to your store and emit the live change\n\t * in one step — you can't write without going live. See {@link TableWriter}.\n\t */\n\tregisterWriter: <Row = unknown, Ctx = CollectionContext, Tx = unknown>(\n\t\ttable: string,\n\t\twriter: TableWriter<Row, Ctx, Tx>\n\t) => void;\n\t/**\n\t * Register a read-set-tracked reactive query (see {@link defineReactiveQuery}):\n\t * it re-runs and re-pushes whenever any table it read changes — no `match`, no\n\t * operator graph, no manual change emission.\n\t */\n\tregisterReactive: <T, P = void, Ctx = CollectionContext>(\n\t\tquery: ReactiveQueryDefinition<T, P, Ctx>\n\t) => void;\n\t/**\n\t * Teach the engine how to read a table for reactive queries' `ctx.db` (any\n\t * ORM). Required for every table a reactive query reads.\n\t */\n\tregisterReader: <Ctx = CollectionContext>(\n\t\ttable: string,\n\t\treader: TableReader<Ctx>\n\t) => void;\n\t/**\n\t * Register declarative, row-level permissions for a `table` (see\n\t * {@link definePermissions}). Read rules filter every row the engine emits for\n\t * the table; write rules gate `actions.insert/update/delete`. Equivalent to a\n\t * `permissions` entry on {@link createSyncEngine}.\n\t */\n\tregisterPermissions: <Row = unknown, Ctx = CollectionContext>(\n\t\ttable: string,\n\t\trules: TablePermissions<Row, Ctx>\n\t) => void;\n\t/**\n\t * Register a `table`'s schema (see {@link defineSchema}): writes are validated\n\t * against it (a bad write rejects the mutation with {@link SchemaError}), and\n\t * its `migrate` lazily upcasts rows on read. Equivalent to a `schemas` entry\n\t * on {@link createSyncEngine}.\n\t */\n\tregisterSchema: <Row = unknown>(\n\t\ttable: string,\n\t\tschema: TableSchema<Row>\n\t) => void;\n\t/**\n\t * Declare which fields on a `table` are CRDT values (see {@link CrdtMergeable}\n\t * — e.g. `rgaText` from `@absolutejs/sync/crdt`, or `yjsText` from\n\t * `@absolutejs/sync-yjs`). The engine then MERGES those fields on\n\t * `actions.insert/update` instead of overwriting them, so concurrent writers\n\t * converge with no clobbering — conflict-free collaborative editing with no\n\t * merge code in your mutation. It also registers a ready-made\n\t * `\"<table>:merge\"` mutation that upserts a row patch, so a client (e.g. the\n\t * `useCollaborativeText` framework hooks) needs no custom server mutation.\n\t */\n\tregisterCrdt: <Row = Record<string, unknown>>(\n\t\ttable: string,\n\t\tfields: CrdtFields<Row>\n\t) => void;\n\t/**\n\t * Apply a table's schema `migrate` to a raw/stored row (identity when there's\n\t * no schema or migration). Use it wherever you read raw rows the engine\n\t * doesn't (e.g. a search collection's `source`); the engine already migrates\n\t * reactive `ctx.db` reads, view hydrates, and the one-shot hydrate.\n\t */\n\tmigrate: <Row = unknown>(table: string, row: Row) => Row;\n\t/**\n\t * Run a registered mutation: authorize, invoke its handler (which writes and\n\t * emits changes via `applyChange`), and resolve with the handler's result.\n\t * Rejects with {@link UnauthorizedError} on deny, or an error for an unknown\n\t * mutation / a handler throw. Drive this from the transport's mutate frame.\n\t */\n\trunMutation: (\n\t\tname: string,\n\t\targs: unknown,\n\t\tctx: unknown\n\t) => Promise<unknown>;\n\t/**\n\t * Atomically run N mutations in a single transaction (sync 1.11+).\n\t * Each `{ name, args }` spec is authorized, then handlers fire in\n\t * order against shared buffered changes. If any handler throws, the\n\t * entire transaction rolls back — no partial commits, no fanned-out\n\t * diffs. On success the accumulated changes apply as ONE live batch\n\t * and the per-mutation results return in order.\n\t *\n\t * No retry policy applies to batches in v0.2; configure per-mutation\n\t * retries on individual `runMutation` calls when atomicity isn't\n\t * needed. A failed batch passes the original error through with no\n\t * wrapping.\n\t *\n\t * Requires `transaction` to be set in {@link SyncEngineOptions} for\n\t * actual DB-level atomicity; without it the batch still buffers\n\t * changes into one fan-out but the underlying adapter writes\n\t * piecemeal.\n\t */\n\trunMutations: (\n\t\tspecs: Array<{ name: string; args: unknown }>,\n\t\tctx: unknown\n\t) => Promise<unknown[]>;\n\t/**\n\t * A point-in-time snapshot of the engine for devtools: registered collections\n\t * (+ kind, tables, live subscription counts), mutations, schedules, readers,\n\t * writers, the change-feed version, and recent changes. See `syncDevtools`.\n\t */\n\tinspect: () => EngineInspection;\n\t/**\n\t * Operator-shaped engine metrics — counters + memory estimates + throughput\n\t * totals since engine start. Distinct from {@link SyncEngine.inspect}: this\n\t * is what a PaaS host scrapes on an interval to answer \"is this engine\n\t * healthy\" and \"what's its resource footprint.\" Feed it to\n\t * `@absolutejs/metering` for per-engine cost attribution.\n\t *\n\t * Added in 1.13.0.\n\t */\n\tmetrics: () => EngineMetrics;\n\t/**\n\t * Subscribe to the live engine activity stream (changes, mutation outcomes,\n\t * subscribe/unsubscribe). Returns an unsubscribe. Powers the devtools feed.\n\t */\n\tonActivity: (listener: (event: EngineActivity) => void) => () => void;\n\t/**\n\t * Outbound CDC stream — yield every committed change as a {@link LoggedChange},\n\t * historical first (entries with `version > since`) then continuously tailing\n\t * live commits. Use it to feed downstream pipelines (Kafka, search indexers,\n\t * audit logs, analytics warehouses).\n\t *\n\t * The iterator is notify-driven (no polling): it parks on a Promise that\n\t * resolves the instant a new commit lands.\n\t *\n\t * If `since` falls before the oldest entry retained in the bounded change\n\t * log, the iterator throws {@link MissedChangesError} so the consumer\n\t * notices the gap instead of silently skipping commits. Resubscribe with\n\t * `since = engine.inspect().recentChanges[0].version` after re-bootstrapping.\n\t *\n\t * If the consumer iterates slower than the engine commits and the in-flight\n\t * buffer overflows (`maxBuffer`, default 10000), the iterator throws\n\t * {@link CdcConsumerSlowError} for the same reason.\n\t *\n\t * @example\n\t * for await (const entry of engine.streamChanges({ since: lastCursor })) {\n\t * await kafka.send('sync.changes', JSON.stringify(entry));\n\t * lastCursor = entry.version;\n\t * }\n\t */\n\tstreamChanges: (\n\t\toptions?: StreamChangesOptions\n\t) => AsyncIterable<LoggedChange>;\n\t/**\n\t * Register a {@link SyncPack} — a self-contained bundle of schemas,\n\t * permissions, readers/writers, collections, mutations, and schedules.\n\t * Dispatches each field to the matching `register*` method. Rejects\n\t * with {@link PackTableConflictError} if the pack claims a table\n\t * another registered pack already owns; with\n\t * {@link PackMissingDependencyError} if `requireDependencies` is set\n\t * and a `readsTables` entry has no registered reader.\n\t *\n\t * See `syncPacks.design.md` for the rationale.\n\t */\n\tregisterPack: (pack: SyncPack) => void;\n};\n\ntype OnDiff = (diff: ViewDiff<unknown>, version: number) => void;\n\ntype JoinState = {\n\top: EquiJoin<unknown, unknown, unknown>;\n\tleftTable: string;\n\trightTable: string;\n\t/** Per-side filters (bound to params/ctx) — a failing change leaves the join. */\n\tleftMatch?: (row: unknown) => boolean;\n\trightMatch?: (row: unknown) => boolean;\n};\n\ntype ActiveSubscription =\n\t| {\n\t\t\tkind: 'view';\n\t\t\tcollection: string;\n\t\t\tview: MaterializedView<unknown>;\n\t\t\t/** Incremental (has a predicate) vs refetch fallback. */\n\t\t\tincremental: boolean;\n\t\t\t/** Re-run the bound hydrate for the refetch fallback. */\n\t\t\trehydrate: () => Promise<Iterable<unknown>>;\n\t\t\t/** Result-row identity (used to net a batch's diffs). */\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'join';\n\t\t\tcollection: string;\n\t\t\tjoin: JoinState;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'graph';\n\t\t\tcollection: string;\n\t\t\tinstance: GraphInstance<unknown>;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'reactive';\n\t\t\tcollection: string;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\t/** Re-run; returns the new rows and the read set (tables/keys/ranges). */\n\t\t\trerun: () => Promise<{\n\t\t\t\trows: unknown[];\n\t\t\t\treadTables: Set<string>;\n\t\t\t\treadKeys: Set<string>;\n\t\t\t\trangeDeps: RangeDep[];\n\t\t\t}>;\n\t\t\t/**\n\t\t\t * Stable key over `(collection, params, ctx)`. Subscriptions sharing\n\t\t\t * the same key are equivalent on the read side, so a single rerun\n\t\t\t * per change batch can serve all of them (see `reactivePairs`).\n\t\t\t */\n\t\t\trerunKey: string;\n\t\t\t/** Current result set, keyed (diffed against the next re-run). */\n\t\t\tcurrent: Map<RowKey, unknown>;\n\t\t\t/** Full-table dependencies (from `db.all`). */\n\t\t\treadTables: Set<string>;\n\t\t\t/** Row-level dependencies `table\\0key` (from `db.get`). */\n\t\t\treadKeys: Set<string>;\n\t\t\t/** Range dependencies (from `db.where`) — predicate + matched keys. */\n\t\t\trangeDeps: RangeDep[];\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'search';\n\t\t\tcollection: string;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\t/** Re-run the search against the (now-updated) shared index. */\n\t\t\trerun: () => unknown[];\n\t\t\t/** Current ranked result set, keyed (diffed against the next re-run). */\n\t\t\tcurrent: Map<RowKey, unknown>;\n\t\t\tonDiff: OnDiff;\n\t };\n\n/** A `db.where` dependency: the predicate plus the keys that matched at read. */\ntype RangeDep = {\n\ttable: string;\n\tpredicate: (row: unknown) => boolean;\n\tkeys: Set<RowKey>;\n};\n\n/**\n * A single committed change as it appears in the engine's change log and on\n * the {@link SyncEngine.streamChanges} CDC stream. Versions are monotonic\n * across the engine: a single mutation that writes N rows emits N entries\n * all sharing the same `version`.\n */\nexport type LoggedChange = {\n\tversion: number;\n\ttable: string;\n\tchange: RowChange<unknown>;\n\t/**\n\t * Wall-clock when this change was logged (Date.now()). Used by the\n\t * engine's time-based retention sweep (`changeLogRetainMs`) and\n\t * surfaced as the change-log age in {@link SyncEngine.metrics}.\n\t * Added in 1.13.0; pre-1.13.0 consumers of `LoggedChange` ignore it.\n\t */\n\tat: number;\n};\n\n/** Thrown by {@link SyncEngine.streamChanges} when `since` is older than the\n * oldest entry retained in the bounded change log (i.e. the consumer was\n * disconnected long enough that the engine has lost the diff). The consumer\n * should re-bootstrap from a fresh hydrate and resume from `availableSince`. */\nexport class MissedChangesError extends Error {\n\treadonly requestedSince: number;\n\treadonly availableSince: number;\n\tconstructor(requestedSince: number, availableSince: number) {\n\t\tsuper(\n\t\t\t`Change log no longer covers version ${requestedSince}; oldest available is ${availableSince}. ` +\n\t\t\t\t`Re-bootstrap and resume from ${availableSince}.`\n\t\t);\n\t\tthis.name = 'MissedChangesError';\n\t\tthis.requestedSince = requestedSince;\n\t\tthis.availableSince = availableSince;\n\t}\n}\n\n/** Options for {@link SyncEngine.streamChanges}. */\nexport type StreamChangesOptions = {\n\t/**\n\t * Last version the consumer has already processed. The stream yields\n\t * entries with `version > since`. Defaults to `0` (replay everything in\n\t * the log, then tail).\n\t */\n\tsince?: number;\n\t/**\n\t * Cancel the stream cleanly. When the signal aborts, the iterator\n\t * resolves to `done` on its next yield and unregisters its subscriber.\n\t */\n\tsignal?: AbortSignal;\n\t/**\n\t * Hard cap on the in-flight buffer for this consumer. If the engine\n\t * commits faster than the consumer iterates and the buffer overflows,\n\t * the stream rejects so the consumer notices instead of silently\n\t * skipping entries. Defaults to 10000.\n\t */\n\tmaxBuffer?: number;\n};\n\n/** Thrown by {@link SyncEngine.streamChanges} when the consumer fell so far\n * behind that the in-flight buffer overflowed. Resubscribe from the last\n * cursor the consumer successfully processed. */\nexport class CdcConsumerSlowError extends Error {\n\treadonly maxBuffer: number;\n\treadonly lastDeliveredVersion: number;\n\tconstructor(maxBuffer: number, lastDeliveredVersion: number) {\n\t\tsuper(\n\t\t\t`CDC stream buffer overflowed (max ${maxBuffer}); consumer fell behind. ` +\n\t\t\t\t`Last delivered version: ${lastDeliveredVersion}. Resubscribe with since=${lastDeliveredVersion}.`\n\t\t);\n\t\tthis.name = 'CdcConsumerSlowError';\n\t\tthis.maxBuffer = maxBuffer;\n\t\tthis.lastDeliveredVersion = lastDeliveredVersion;\n\t}\n}\n\nexport type SyncEngineOptions = {\n\t/**\n\t * How many recent changes to retain for resumable reconnects. A client that\n\t * reconnects within this window gets a catch-up diff; beyond it, a fresh\n\t * snapshot. Defaults to 1024.\n\t */\n\tchangeLogSize?: number;\n\t/**\n\t * Time-based change-log retention: drop entries older than this many ms,\n\t * in addition to the count cap above. Lets a high-throughput engine keep\n\t * a SHORT log (e.g. \"60s of changes\") regardless of count, which both\n\t * bounds memory and bounds the catch-up work on reconnect. Defaults to\n\t * `null` — only the count cap (`changeLogSize`) applies.\n\t *\n\t * Added in 1.13.0.\n\t */\n\tchangeLogRetainMs?: number | null;\n\t/**\n\t * Run every mutation inside your database's transaction (see\n\t * {@link TransactionRunner}): the handler's writes commit all-or-nothing, and\n\t * the engine emits the resulting diff only after the commit. Omit to run\n\t * mutations without a transaction (each writer call is its own DB op).\n\t */\n\ttransaction?: TransactionRunner;\n\t/**\n\t * Declarative, row-level permissions keyed by table (see\n\t * {@link definePermissions}). Read rules filter every row the engine emits;\n\t * write rules gate `actions.insert/update/delete`. Add more later with\n\t * {@link SyncEngine.registerPermissions}. Type the rules at the\n\t * `definePermissions<YourCtx>(...)` call site; the engine accepts any context\n\t * (it threads `ctx` untyped to your rules).\n\t */\n\tpermissions?: PermissionsDefinition<any>;\n\t/**\n\t * Declarative row schemas keyed by table (see {@link defineSchema}): writes\n\t * are validated against them, and `migrate` lazily upcasts rows on read. Add\n\t * more later with {@link SyncEngine.registerSchema}.\n\t */\n\tschemas?: SchemaDefinition;\n\t/**\n\t * Cross-client cache for reactive query results, keyed by\n\t * `(collection, params, ctx)` — equivalent subscribers reuse a single\n\t * cached snapshot on initial subscribe instead of each re-running the\n\t * query body. Per-batch dedup (already in `reactivePairs` since 1.1) is\n\t * unchanged; this adds *cross-batch* sharing.\n\t *\n\t * Entries are invalidated when a write overlaps their read set (same\n\t * `isReactiveAffected` check live subscriptions use), and bounded by an\n\t * LRU + an optional TTL.\n\t *\n\t * Defaults: `{ max: 256, ttlMs: 60_000 }`. Pass `{ max: 0 }` to disable.\n\t */\n\treactiveCache?: {\n\t\tmax?: number;\n\t\tttlMs?: number;\n\t};\n\t/**\n\t * Per-call telemetry for `sandboxedHandler` mutations. When set, every\n\t * sandboxed call fires `onMetrics(record)` after completion with\n\t * `{ id, mutationName, durationMs, cpuMs, heapBytes, ok, errorName,\n\t * errorMessage, timestamp }`. Wire to a sync collection, your\n\t * observability backend, a Drizzle table, anything you want.\n\t *\n\t * Hook failures are swallowed (a misbehaving metrics sink must NOT\n\t * crash the caller's mutation). Adding the hook switches the runner\n\t * to `callable.callWithMetrics`, which is a small per-call cost\n\t * (~0.05 ms) — disable for hot-path mutations that don't need it.\n\t *\n\t * Off by default.\n\t *\n\t * @see {@link HandlerMetricsRecord}\n\t */\n\thandlerMetrics?: HandlerMetricsHook;\n\t/**\n\t * Allowlist + auth-injection map for `actions.fetch(url, init)` calls\n\t * issued from inside a `sandboxedHandler`. Each entry is keyed by\n\t * hostname (`'api.stripe.com'`); the value's `authorization` is a\n\t * sync or async callback computed on the host so the secret never\n\t * crosses into the JSC sandbox. Requests to non-allowlisted hosts\n\t * are rejected before any network call.\n\t *\n\t * Without this set, `actions.fetch` throws \"no bridgeFetch config.\"\n\t * Plain (non-sandboxed) handlers don't use this — they can just call\n\t * `fetch` directly since they run in the host process.\n\t *\n\t * @see {@link BridgeFetchConfig}\n\t */\n\tbridgeFetch?: BridgeFetchConfig;\n};\n\nconst defaultKey = (row: unknown): RowKey => (row as { id: RowKey }).id;\n\nconst shallowEqual = (a: unknown, b: unknown): boolean => {\n\tif (a === b) {\n\t\treturn true;\n\t}\n\tif (\n\t\ttypeof a !== 'object' ||\n\t\ttypeof b !== 'object' ||\n\t\ta === null ||\n\t\tb === null\n\t) {\n\t\treturn false;\n\t}\n\tconst aKeys = Object.keys(a);\n\tconst bKeys = Object.keys(b);\n\treturn (\n\t\taKeys.length === bKeys.length &&\n\t\taKeys.every(\n\t\t\t(k) =>\n\t\t\t\t(a as Record<string, unknown>)[k] ===\n\t\t\t\t(b as Record<string, unknown>)[k]\n\t\t)\n\t);\n};\n\n/**\n * Per-object stable identifier — paired with {@link stableSubKey} so two\n * subscriptions that share the same `(collection, params, ctx)` get the same\n * key and have their reactive rerun deduplicated within a change batch (the\n * fan-out fix in {@link reactivePairs}). Falls back to an incrementing id\n * stored on a WeakMap for values JSON can't represent (functions, classes,\n * cyclic structures), so identity-equal ctxs still share a key while\n * different-identity ones don't accidentally merge.\n */\nconst subKeyIds = new WeakMap<object, string>();\nlet subKeyCounter = 0;\nconst stableValueKey = (value: unknown): string => {\n\tif (value === undefined) return 'u';\n\tif (value === null) return 'n';\n\tconst tag = typeof value;\n\tif (tag === 'string') return `s:${value as string}`;\n\tif (tag === 'number' || tag === 'boolean' || tag === 'bigint') {\n\t\treturn `${tag[0]}:${String(value)}`;\n\t}\n\tif (tag !== 'object') return `${tag[0]}:fn`;\n\ttry {\n\t\t// Stable ordering: sort keys before serialising so { a, b } and { b, a }\n\t\t// produce the same string. JSON.stringify with a replacer keeps it tight.\n\t\treturn `o:${JSON.stringify(value, (_k, v): unknown => {\n\t\t\tif (v === null || typeof v !== 'object' || Array.isArray(v))\n\t\t\t\treturn v;\n\t\t\tconst record = v as Record<string, unknown>;\n\t\t\tconst sorted: Record<string, unknown> = {};\n\t\t\tfor (const key of Object.keys(record).sort()) {\n\t\t\t\tsorted[key] = record[key];\n\t\t\t}\n\n\t\t\treturn sorted;\n\t\t})}`;\n\t} catch {\n\t\t// Cyclic or unserializable — fall back to per-object identity.\n\t\tconst obj = value as object;\n\t\tlet id = subKeyIds.get(obj);\n\t\tif (id === undefined) {\n\t\t\tsubKeyCounter += 1;\n\t\t\tid = `i${subKeyCounter}`;\n\t\t\tsubKeyIds.set(obj, id);\n\t\t}\n\n\t\treturn `i:${id}`;\n\t}\n};\n\nconst stableSubKey = (\n\tcollection: string,\n\tparams: unknown,\n\tctx: unknown\n): string => `${collection}|${stableValueKey(params)}|${stableValueKey(ctx)}`;\n\n/** Shallow-equal ignoring the search score field — used to suppress re-emitting\n * a search result whose only change is BM25 score drift as the corpus grows. */\nconst equalsIgnoringScore = (a: unknown, b: unknown): boolean => {\n\tif (\n\t\ttypeof a !== 'object' ||\n\t\ttypeof b !== 'object' ||\n\t\ta === null ||\n\t\tb === null\n\t) {\n\t\treturn a === b;\n\t}\n\tconst strip = (value: Record<string, unknown>) =>\n\t\tObject.keys(value).filter((k) => k !== SEARCH_SCORE_FIELD);\n\tconst aKeys = strip(a as Record<string, unknown>);\n\tconst bKeys = strip(b as Record<string, unknown>);\n\treturn (\n\t\taKeys.length === bKeys.length &&\n\t\taKeys.every(\n\t\t\t(k) =>\n\t\t\t\t(a as Record<string, unknown>)[k] ===\n\t\t\t\t(b as Record<string, unknown>)[k]\n\t\t)\n\t);\n};\n\n/**\n * The Tier 3 sync engine: a registry of collections plus the view syncer. It is\n * transport-agnostic — `subscribe` returns the initial snapshot and an\n * `onDiff` stream, which an Elysia/SSE layer wires to a connection, and\n * `applyChange` is the change feed you drive from your mutations.\n *\n * Access control is first-class: every subscribe runs the collection's\n * `authorize`, and a collection's `match`/`hydrate` scope rows to the caller, so\n * a change to a row the caller can't see never reaches them.\n */\nexport const createSyncEngine = (\n\toptions: SyncEngineOptions = {}\n): SyncEngine => {\n\t// Heterogeneous registry: `any` here is what lets collections of different\n\t// row/param/context types share one map (the public `register`/`subscribe`\n\t// surface stays fully typed).\n\tconst registry = new Map<\n\t\tstring,\n\t\t| CollectionDefinition<any, any, any>\n\t\t| JoinCollectionDefinition<any, any, any, any, any>\n\t\t| GraphCollectionDefinition<any, any, any>\n\t\t| ReactiveQueryDefinition<any, any, any>\n\t\t| SearchCollectionDefinition<any, any, any>\n\t>();\n\tconst mutations = new Map<string, MutationDefinition<any, any, any>>();\n\t// Lazy sandbox runners keyed by mutation name. Built on first call to a\n\t// mutation that has `sandboxedHandler` set; reused thereafter. Engine has\n\t// no teardown; the OS reaps the isolate workers on process exit.\n\tconst sandboxRunners = new Map<\n\t\tstring,\n\t\t(\n\t\t\targs: unknown,\n\t\t\tctx: unknown,\n\t\t\tactions: MutationActions\n\t\t) => Promise<unknown>\n\t>();\n\tconst writers = new Map<string, TableWriter>();\n\tconst readers = new Map<string, TableReader>();\n\tconst schedules = new Map<string, ScheduleDefinition>();\n\t// Pack registry — table -> owning pack name, and the list of registered\n\t// packs for engine.inspect().packs.\n\tconst packTableOwners = new Map<string, string>();\n\tconst registeredPacks: RegisteredPack[] = [];\n\t// Declarative row-level permissions, keyed by table. Stored with an `unknown`\n\t// context — the engine threads ctx untyped — while the public\n\t// `definePermissions`/`registerPermissions` surface stays fully typed.\n\tconst permissions = new Map<string, TablePermissions<unknown, unknown>>();\n\tfor (const [table, rules] of Object.entries(options.permissions ?? {})) {\n\t\tpermissions.set(table, rules as TablePermissions<unknown, unknown>);\n\t}\n\tconst readRuleFor = (\n\t\ttable: string\n\t): ReadRule<unknown, unknown> | undefined => permissions.get(table)?.read;\n\tconst writeRuleFor = (\n\t\ttable: string,\n\t\top: 'insert' | 'update' | 'delete'\n\t): WriteRule<unknown, unknown> | undefined => {\n\t\tconst rules = permissions.get(table);\n\t\treturn rules?.[op] ?? rules?.write;\n\t};\n\t// Declarative row schemas, keyed by table.\n\tconst schemas = new Map<string, TableSchema<unknown>>();\n\tfor (const [table, schema] of Object.entries(options.schemas ?? {})) {\n\t\tschemas.set(table, schema as TableSchema<unknown>);\n\t}\n\t// CRDT fields, keyed by table: field name -> mergeable backend. Set via\n\t// registerCrdt; consulted in makeActions to merge (not overwrite) on write.\n\tconst crdtFields = new Map<\n\t\tstring,\n\t\tRecord<string, CrdtMergeable<unknown>>\n\t>();\n\t// Validate a write against its table's schema: every field on insert; only\n\t// the supplied fields on update. Throws SchemaError naming the bad field.\n\tconst validateWrite = (\n\t\ttable: string,\n\t\top: 'insert' | 'update',\n\t\trow: unknown\n\t) => {\n\t\tconst schema = schemas.get(table);\n\t\tif (schema === undefined || typeof row !== 'object' || row === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst record = row as Record<string, unknown>;\n\t\tfor (const [fieldName, validate] of Object.entries(schema.fields)) {\n\t\t\tconst present = fieldName in record;\n\t\t\tif (op === 'update' && !present) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!validate(record[fieldName])) {\n\t\t\t\tthrow new SchemaError(table, fieldName);\n\t\t\t}\n\t\t}\n\t};\n\t// Lazily upcast a stored/raw row to the current shape (identity if no migrate).\n\tconst migrateRow = (table: string, row: unknown): unknown => {\n\t\tconst migrate = schemas.get(table)?.migrate;\n\t\treturn migrate ? migrate(row) : row;\n\t};\n\t// Reactive (read-set-tracked) subscriptions, scanned on each change since\n\t// their dependencies (the tables they read) are dynamic, not in tableIndex.\n\tconst reactiveSubs = new Set<\n\t\tExtract<ActiveSubscription, { kind: 'reactive' }>\n\t>();\n\t// Search subscriptions + one shared index per search collection, kept live\n\t// from the source table's change feed (like reactiveSubs, not in tableIndex).\n\tconst searchSubs = new Set<\n\t\tExtract<ActiveSubscription, { kind: 'search' }>\n\t>();\n\tconst searchIndexes = new Map<\n\t\tstring,\n\t\t{\n\t\t\tindex: SearchIndex<unknown, unknown>;\n\t\t\tdefinition: SearchCollectionDefinition<unknown, unknown, unknown>;\n\t\t\thydrated: boolean;\n\t\t}\n\t>();\n\tconst active = new Map<string, Set<ActiveSubscription>>();\n\t// Which collections read each table — so a table change fans to all of them.\n\tconst tableIndex = new Map<string, Set<string>>();\n\n\t// Monotonic change feed: every applyChange bumps `version` and appends to a\n\t// bounded log, so a client can resume from the version it last applied.\n\tconst changeLogSize = options.changeLogSize ?? 1024;\n\tconst changeLogRetainMs = options.changeLogRetainMs ?? null;\n\tconst changeLog: LoggedChange[] = [];\n\tlet version = 0;\n\t// Engine-level counters surfaced via `engine.metrics()` (1.13.0).\n\tconst engineStartedAt = Date.now();\n\tlet mutationsCompleted = 0;\n\tlet mutationsFailed = 0;\n\tlet mutationsRetried = 0;\n\tlet mutationsInFlight = 0;\n\n\t// Cross-client reactive query cache (1.3+). Keyed by stableSubKey, holds\n\t// the result + read set so a fresh subscribe with the same key reuses the\n\t// rerun instead of hitting the DB again. Per-batch dedup (since 1.1) is\n\t// already in `reactivePairs`; this lifts the sharing across batches.\n\t//\n\t// Entries are invalidated when a write overlaps the cached read set (same\n\t// `isReactiveAffected` check live subs use). LRU-bounded; optional TTL.\n\tconst reactiveCacheMax = options.reactiveCache?.max ?? 256;\n\tconst reactiveCacheTtlMs = options.reactiveCache?.ttlMs ?? 60_000;\n\ttype CachedRerun = {\n\t\trerunKey: string;\n\t\trows: unknown[];\n\t\treadTables: Set<string>;\n\t\treadKeys: Set<string>;\n\t\trangeDeps: RangeDep[];\n\t\tversion: number;\n\t\texpiresAt: number;\n\t};\n\t// `Map` preserves insertion order — re-set on access for LRU semantics.\n\tconst cachedReruns = new Map<string, CachedRerun>();\n\tconst touchCacheEntry = (key: string, entry: CachedRerun) => {\n\t\tcachedReruns.delete(key);\n\t\tcachedReruns.set(key, entry);\n\t};\n\tconst readCacheEntry = (key: string): CachedRerun | undefined => {\n\t\tif (reactiveCacheMax <= 0) return undefined;\n\t\tconst entry = cachedReruns.get(key);\n\t\tif (entry === undefined) return undefined;\n\t\tif (reactiveCacheTtlMs > 0 && entry.expiresAt < Date.now()) {\n\t\t\tcachedReruns.delete(key);\n\n\t\t\treturn undefined;\n\t\t}\n\t\ttouchCacheEntry(key, entry);\n\n\t\treturn entry;\n\t};\n\tconst writeCacheEntry = (entry: CachedRerun) => {\n\t\tif (reactiveCacheMax <= 0) return;\n\t\tcachedReruns.set(entry.rerunKey, entry);\n\t\t// LRU eviction: oldest insertion wins out when over budget.\n\t\twhile (cachedReruns.size > reactiveCacheMax) {\n\t\t\tconst oldest = cachedReruns.keys().next().value;\n\t\t\tif (oldest === undefined) break;\n\t\t\tcachedReruns.delete(oldest);\n\t\t}\n\t};\n\t// Devtools activity stream — listeners are notified of changes, mutation\n\t// outcomes, and subscribe/unsubscribe. Cheap (a no-op) when no one's watching.\n\tconst activityListeners = new Set<(event: EngineActivity) => void>();\n\tconst emitActivity = (event: EngineActivity) => {\n\t\tfor (const listener of activityListeners) {\n\t\t\tlistener(event);\n\t\t}\n\t};\n\t// Outbound CDC stream subscribers — `streamChanges()` adds itself here.\n\t// Notifications fire from `logChange` so every appended log entry reaches\n\t// every active streamer atomically with the log push.\n\tconst streamSubscribers = new Set<(entry: LoggedChange) => void>();\n\tconst runInTransaction = options.transaction;\n\t// Cluster fan-out: a unique id so we ignore our own broadcasts, and the bus\n\t// (set by connectCluster) we publish locally-committed changes to.\n\tconst instanceId = globalThis.crypto?.randomUUID?.() ?? `i${Math.random()}`;\n\tlet clusterBus: ClusterBus | undefined;\n\n\tconst broadcast = (\n\t\tchanges: { table: string; change: RowChange<unknown> }[]\n\t) => {\n\t\tif (clusterBus !== undefined && changes.length > 0) {\n\t\t\tvoid clusterBus.publish({ changes, origin: instanceId });\n\t\t}\n\t};\n\n\tconst subsFor = (collection: string) => {\n\t\tlet set = active.get(collection);\n\t\tif (set === undefined) {\n\t\t\tset = new Set();\n\t\t\tactive.set(collection, set);\n\t\t}\n\t\treturn set;\n\t};\n\n\tconst addTableIndex = (table: string, name: string) => {\n\t\tlet set = tableIndex.get(table);\n\t\tif (set === undefined) {\n\t\t\tset = new Set();\n\t\t\ttableIndex.set(table, set);\n\t\t}\n\t\tset.add(name);\n\t};\n\n\t/** A side change that fails its filter becomes a leave (delete from the join). */\n\tconst sideChange = (\n\t\tchange: RowChange<unknown>,\n\t\tmatch?: (row: unknown) => boolean\n\t): RowChange<unknown> =>\n\t\tchange.op !== 'delete' && match !== undefined && !match(change.row)\n\t\t\t? { op: 'delete', row: change.row }\n\t\t\t: change;\n\n\tconst EMPTY_DIFF: ViewDiff<unknown> = {\n\t\tadded: [],\n\t\tremoved: [],\n\t\tchanged: []\n\t};\n\n\t/** Apply one change to a subscription's state and return its diff (no emit). */\n\tconst subscriptionDiff = async (\n\t\tsubscription: ActiveSubscription,\n\t\ttable: string,\n\t\tchange: RowChange<unknown>\n\t): Promise<ViewDiff<unknown>> => {\n\t\tif (subscription.kind === 'graph') {\n\t\t\treturn subscription.instance.applyChange(table, change);\n\t\t}\n\t\tif (subscription.kind === 'join') {\n\t\t\tconst js = subscription.join;\n\t\t\tif (table === js.leftTable) {\n\t\t\t\treturn js.op.applyLeft(sideChange(change, js.leftMatch));\n\t\t\t}\n\t\t\tif (table === js.rightTable) {\n\t\t\t\treturn js.op.applyRight(sideChange(change, js.rightMatch));\n\t\t\t}\n\t\t\treturn EMPTY_DIFF;\n\t\t}\n\t\tif (subscription.kind === 'reactive') {\n\t\t\t// Reactive subs re-run as a whole (see reactivePairs), not per change.\n\t\t\treturn EMPTY_DIFF;\n\t\t}\n\t\tif (subscription.kind === 'search') {\n\t\t\t// Search subs re-rank as a whole (see searchPairs), not per change.\n\t\t\treturn EMPTY_DIFF;\n\t\t}\n\t\tif (subscription.incremental) {\n\t\t\ttry {\n\t\t\t\treturn subscription.view.apply(change);\n\t\t\t} catch {\n\t\t\t\t// The predicate couldn't decide this change (e.g. an operator the\n\t\t\t\t// inferred matcher doesn't support) — degrade to a correct refetch\n\t\t\t\t// rather than a wrong diff.\n\t\t\t\treturn subscription.view.reset(await subscription.rehydrate());\n\t\t\t}\n\t\t}\n\t\treturn subscription.view.reset(await subscription.rehydrate());\n\t};\n\n\t/** Active subscriptions whose collection reads `table`. */\n\tconst subscriptionsForTable = function* (\n\t\ttable: string\n\t): Generator<ActiveSubscription> {\n\t\tconst names = tableIndex.get(table);\n\t\tif (names === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const name of names) {\n\t\t\tconst set = active.get(name);\n\t\t\tif (set === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tyield* set;\n\t\t}\n\t};\n\n\t/**\n\t * Net a batch's per-change diffs by key, relative to the pre-batch state, so a\n\t * mutation that touches the same row twice collapses to one coherent change:\n\t * add-then-remove cancels, add-then-update stays an add, remove-then-add\n\t * becomes a change.\n\t */\n\tconst mergeViewDiffs = (\n\t\tdiffs: ViewDiff<unknown>[],\n\t\tkey: (row: unknown) => RowKey\n\t): ViewDiff<unknown> => {\n\t\ttype Net = { state: 'added' | 'changed' | 'removed'; row: unknown };\n\t\tconst net = new Map<RowKey, Net>();\n\t\tfor (const diff of diffs) {\n\t\t\tfor (const row of diff.removed) {\n\t\t\t\tconst previous = net.get(key(row));\n\t\t\t\tif (previous?.state === 'added') {\n\t\t\t\t\tnet.delete(key(row));\n\t\t\t\t} else {\n\t\t\t\t\tnet.set(key(row), { state: 'removed', row });\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const row of diff.added) {\n\t\t\t\tconst previous = net.get(key(row));\n\t\t\t\tnet.set(key(row), {\n\t\t\t\t\tstate: previous?.state === 'removed' ? 'changed' : 'added',\n\t\t\t\t\trow\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (const row of diff.changed) {\n\t\t\t\tconst previous = net.get(key(row));\n\t\t\t\tnet.set(key(row), {\n\t\t\t\t\tstate: previous?.state === 'added' ? 'added' : 'changed',\n\t\t\t\t\trow\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tconst added: unknown[] = [];\n\t\tconst changed: unknown[] = [];\n\t\tconst removed: unknown[] = [];\n\t\tfor (const { state, row } of net.values()) {\n\t\t\tif (state === 'added') {\n\t\t\t\tadded.push(row);\n\t\t\t} else if (state === 'changed') {\n\t\t\t\tchanged.push(row);\n\t\t\t} else {\n\t\t\t\tremoved.push(row);\n\t\t\t}\n\t\t}\n\t\treturn { added, changed, removed };\n\t};\n\n\ttype ReactiveSub = Extract<ActiveSubscription, { kind: 'reactive' }>;\n\n\tconst depKey = (table: string, key: RowKey): string => `${table} ${key}`;\n\n\t/** The key of a changed row under its table's reader key (if one is set). */\n\tconst changedKeyFor = (\n\t\ttable: string,\n\t\tchange: RowChange<unknown>\n\t): RowKey | undefined => readers.get(table)?.key?.(change.row);\n\n\t/**\n\t * An instrumented read handle: `all` records a full-table dependency; `get`\n\t * records a precise row-key dependency when the table's reader has a `key`\n\t * (else falls back to a table dependency).\n\t */\n\tconst makeReadHandle = (\n\t\tctx: unknown,\n\t\treadTables: Set<string>,\n\t\treadKeys: Set<string>,\n\t\trangeDeps: RangeDep[],\n\t\t// Schedules read unscoped (trusted server code); subscriptions apply rules.\n\t\tapplyRules = true\n\t): ReadHandle => {\n\t\tconst readerFor = (table: string): TableReader => {\n\t\t\tconst reader = readers.get(table);\n\t\t\tif (reader === undefined) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No reader registered for table \"${table}\" — register one with engine.registerReader`\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn reader;\n\t\t};\n\t\tconst ruleFor = (table: string) =>\n\t\t\tapplyRules ? readRuleFor(table) : undefined;\n\n\t\treturn {\n\t\t\tall: async (table) => {\n\t\t\t\treadTables.add(table);\n\t\t\t\t// Migrate raw rows to the current shape, then scope by read rule.\n\t\t\t\tconst rows = [...(await readerFor(table).all(ctx))].map((row) =>\n\t\t\t\t\tmigrateRow(table, row)\n\t\t\t\t);\n\t\t\t\tconst rule = ruleFor(table);\n\t\t\t\treturn (\n\t\t\t\t\trule ? rows.filter((row) => rule(ctx, row)) : rows\n\t\t\t\t) as never[];\n\t\t\t},\n\t\t\tget: async (table, key) => {\n\t\t\t\tconst reader = readerFor(table);\n\t\t\t\tif (reader.get === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Reader for table \"${table}\" has no get(); use db.all() or add get`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (reader.key !== undefined) {\n\t\t\t\t\treadKeys.add(depKey(table, key));\n\t\t\t\t} else {\n\t\t\t\t\treadTables.add(table);\n\t\t\t\t}\n\t\t\t\tconst raw = await reader.get(key, ctx);\n\t\t\t\tconst row =\n\t\t\t\t\traw === undefined ? undefined : migrateRow(table, raw);\n\t\t\t\tconst rule = ruleFor(table);\n\t\t\t\t// A row the caller can't read reads as absent.\n\t\t\t\treturn (\n\t\t\t\t\trule && row !== undefined && !rule(ctx, row)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: row\n\t\t\t\t) as never;\n\t\t\t},\n\t\t\twhere: async (table, predicate) => {\n\t\t\t\tconst reader = readerFor(table);\n\t\t\t\tconst rule = ruleFor(table);\n\t\t\t\t// Fold the read rule into the range predicate, so an unreadable row\n\t\t\t\t// never matches and a visibility flip still re-runs the query.\n\t\t\t\tconst effective = (\n\t\t\t\t\trule\n\t\t\t\t\t\t? (row: unknown) =>\n\t\t\t\t\t\t\t\t(predicate as (r: unknown) => boolean)(row) &&\n\t\t\t\t\t\t\t\trule(ctx, row)\n\t\t\t\t\t\t: (predicate as (row: unknown) => boolean)\n\t\t\t\t) as (row: unknown) => boolean;\n\t\t\t\tconst matched = [...(await reader.all(ctx))]\n\t\t\t\t\t.map((row) => migrateRow(table, row))\n\t\t\t\t\t.filter(effective);\n\t\t\t\tif (reader.key !== undefined) {\n\t\t\t\t\t// Remember which rows matched, so an update/delete that pulls a\n\t\t\t\t\t// row out of the range still re-runs (it's in this key set).\n\t\t\t\t\tconst key = reader.key;\n\t\t\t\t\trangeDeps.push({\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\tpredicate: effective,\n\t\t\t\t\t\tkeys: new Set(matched.map(key))\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treadTables.add(table);\n\t\t\t\t}\n\t\t\t\treturn matched as never[];\n\t\t\t}\n\t\t};\n\t};\n\n\tconst writerFor = (table: string): TableWriter => {\n\t\tconst writer = writers.get(table);\n\t\tif (writer === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`No writer registered for table \"${table}\" — register one with engine.registerWriter, or use actions.change`\n\t\t\t);\n\t\t}\n\t\treturn writer;\n\t};\n\n\t// Load the committed row a write targets (by the table's reader), if any — so\n\t// authorization and CRDT merge both reflect committed state, not the payload.\n\tconst readExisting = async (\n\t\ttable: string,\n\t\tvalue: unknown,\n\t\tctx: unknown\n\t): Promise<unknown> => {\n\t\tconst reader = readers.get(table);\n\t\tif (reader?.get === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst id = reader.key\n\t\t\t? reader.key(value)\n\t\t\t: (value as { id?: RowKey }).id;\n\t\treturn id === undefined ? undefined : reader.get(id, ctx);\n\t};\n\n\t// Enforce a table's declarative write rule before the writer runs (so a deny\n\t// rolls the transaction back). For update/delete, evaluate the rule against the\n\t// *existing* row when a reader can load it — so the check reflects committed\n\t// state, not a client-supplied payload.\n\tconst authorizeWrite = async (\n\t\ttable: string,\n\t\top: 'insert' | 'update' | 'delete',\n\t\tvalue: unknown,\n\t\tctx: unknown\n\t) => {\n\t\tconst rule = writeRuleFor(table, op);\n\t\tif (rule === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tlet subject = value;\n\t\tif (op !== 'insert') {\n\t\t\tconst existing = await readExisting(table, value, ctx);\n\t\t\tif (existing !== undefined) {\n\t\t\t\tsubject = existing;\n\t\t\t}\n\t\t}\n\t\tif (!rule(ctx, subject)) {\n\t\t\tthrow new UnauthorizedError(`${op} on table \"${table}\"`);\n\t\t}\n\t};\n\n\t// Merge a write's CRDT fields into the committed row (so concurrent writers\n\t// converge) instead of overwriting them. A no-op for tables without CRDT\n\t// fields. On insert the base is the empty state; on update it's the stored\n\t// field value. Returns the row patch the writer should persist.\n\tconst mergeCrdtFields = async (\n\t\ttable: string,\n\t\top: 'insert' | 'update',\n\t\tdata: unknown,\n\t\tctx: unknown\n\t): Promise<unknown> => {\n\t\tconst fields = crdtFields.get(table);\n\t\tif (fields === undefined || data === null || typeof data !== 'object') {\n\t\t\treturn data;\n\t\t}\n\t\tconst incoming = data as Record<string, unknown>;\n\t\tconst existing =\n\t\t\top === 'update' ? await readExisting(table, data, ctx) : undefined;\n\t\tconst base =\n\t\t\texisting !== null && typeof existing === 'object'\n\t\t\t\t? (existing as Record<string, unknown>)\n\t\t\t\t: undefined;\n\t\tconst merged: Record<string, unknown> = { ...incoming };\n\t\tfor (const [field, adapter] of Object.entries(fields)) {\n\t\t\tif (incoming[field] === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmerged[field] = adapter.merge(\n\t\t\t\tbase?.[field] ?? adapter.empty(),\n\t\t\t\tincoming[field]\n\t\t\t);\n\t\t}\n\t\treturn merged;\n\t};\n\n\t/**\n\t * Build the write actions a mutation or schedule handler uses, collecting its\n\t * changes into a fresh buffer (so a transaction that retries/rolls back never\n\t * double-emits). `tx` threads to each writer. `enforce` applies write\n\t * permission rules (mutations); schedules run trusted, so they pass `false`.\n\t */\n\tconst makeActions = (tx: unknown, ctx: unknown, enforce: boolean) => {\n\t\tconst buffered: { table: string; change: RowChange<unknown> }[] = [];\n\t\tconst actions: MutationActions = {\n\t\t\tchange: (collection, change) => {\n\t\t\t\tbuffered.push({\n\t\t\t\t\ttable: collection,\n\t\t\t\t\tchange: change as RowChange<unknown>\n\t\t\t\t});\n\t\t\t\treturn Promise.resolve();\n\t\t\t},\n\t\t\tinsert: async (table, data) => {\n\t\t\t\t// Schema is data integrity — validated for trusted schedules too.\n\t\t\t\tvalidateWrite(table, 'insert', data);\n\t\t\t\tif (enforce) {\n\t\t\t\t\tawait authorizeWrite(table, 'insert', data, ctx);\n\t\t\t\t}\n\t\t\t\tconst merged = await mergeCrdtFields(\n\t\t\t\t\ttable,\n\t\t\t\t\t'insert',\n\t\t\t\t\tdata,\n\t\t\t\t\tctx\n\t\t\t\t);\n\t\t\t\tconst row = await writerFor(table).insert(merged, ctx, tx);\n\t\t\t\tbuffered.push({ table, change: { op: 'insert', row } });\n\t\t\t\treturn row;\n\t\t\t},\n\t\t\tupdate: async (table, data) => {\n\t\t\t\tvalidateWrite(table, 'update', data);\n\t\t\t\tif (enforce) {\n\t\t\t\t\tawait authorizeWrite(table, 'update', data, ctx);\n\t\t\t\t}\n\t\t\t\tconst merged = await mergeCrdtFields(\n\t\t\t\t\ttable,\n\t\t\t\t\t'update',\n\t\t\t\t\tdata,\n\t\t\t\t\tctx\n\t\t\t\t);\n\t\t\t\tconst row = await writerFor(table).update(merged, ctx, tx);\n\t\t\t\tbuffered.push({ table, change: { op: 'update', row } });\n\t\t\t\treturn row;\n\t\t\t},\n\t\t\tdelete: async (table, row) => {\n\t\t\t\tif (enforce) {\n\t\t\t\t\tawait authorizeWrite(table, 'delete', row, ctx);\n\t\t\t\t}\n\t\t\t\tawait writerFor(table).delete(row, ctx, tx);\n\t\t\t\tbuffered.push({ table, change: { op: 'delete', row } });\n\t\t\t},\n\t\t\t// Default wall clock. Replay / rebase paths can wrap and pin\n\t\t\t// this; today it's just Date.now().\n\t\t\tnow: () => Date.now()\n\t\t};\n\t\treturn { actions, buffered };\n\t};\n\n\t/** Diff a re-run against a sub's current set; updates `current`. Shared by the\n\t * reactive and search kinds (both re-run wholesale and diff). `equals` decides\n\t * whether a still-present row counts as changed. */\n\tconst diffRerun = (\n\t\tsub: {\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tcurrent: Map<RowKey, unknown>;\n\t\t},\n\t\trows: unknown[],\n\t\tequals: (a: unknown, b: unknown) => boolean = shallowEqual\n\t): ViewDiff<unknown> => {\n\t\tconst next = new Map<RowKey, unknown>();\n\t\tfor (const row of rows) {\n\t\t\tnext.set(sub.key(row), row);\n\t\t}\n\t\tconst added: unknown[] = [];\n\t\tconst removed: unknown[] = [];\n\t\tconst changed: unknown[] = [];\n\t\tfor (const [rowKey, row] of next) {\n\t\t\tconst previous = sub.current.get(rowKey);\n\t\t\tif (previous === undefined) {\n\t\t\t\tadded.push(row);\n\t\t\t} else if (!equals(previous, row)) {\n\t\t\t\tchanged.push(row);\n\t\t\t}\n\t\t}\n\t\tfor (const [rowKey, row] of sub.current) {\n\t\t\tif (!next.has(rowKey)) {\n\t\t\t\tremoved.push(row);\n\t\t\t}\n\t\t}\n\t\tsub.current = next;\n\t\treturn { added, removed, changed };\n\t};\n\n\t/** Re-run every reactive query whose read set intersects the changed tables. */\n\ttype ReactiveChange = {\n\t\ttable: string;\n\t\tkey: RowKey | undefined;\n\t\trow: unknown;\n\t};\n\n\t/** Does a change fall in a range dep — matched now, or a member at last read? */\n\tconst inRange = (dep: RangeDep, change: ReactiveChange): boolean =>\n\t\tdep.table === change.table &&\n\t\t((change.key !== undefined && dep.keys.has(change.key)) ||\n\t\t\tdep.predicate(change.row));\n\n\t/** Does any change in the batch overlap this read set? Used for both live\n\t * sub invalidation and cross-client cache invalidation. */\n\tconst readSetOverlaps = (\n\t\treadTables: Set<string>,\n\t\treadKeys: Set<string>,\n\t\trangeDeps: RangeDep[],\n\t\tchanges: ReactiveChange[]\n\t): boolean =>\n\t\tchanges.some(\n\t\t\t(change) =>\n\t\t\t\treadTables.has(change.table) ||\n\t\t\t\t(change.key !== undefined &&\n\t\t\t\t\treadKeys.has(depKey(change.table, change.key))) ||\n\t\t\t\trangeDeps.some((dep) => inRange(dep, change))\n\t\t);\n\n\t/** Did this batch touch a table, row key, or range the sub read? */\n\tconst isReactiveAffected = (\n\t\tsub: ReactiveSub,\n\t\tchanges: ReactiveChange[]\n\t): boolean =>\n\t\treadSetOverlaps(sub.readTables, sub.readKeys, sub.rangeDeps, changes);\n\n\t/** Drop cached reruns whose read set overlaps this write batch. Cheap walk —\n\t * the cache is bounded by `reactiveCache.max` (default 256). */\n\tconst invalidateCacheForChanges = (changes: ReactiveChange[]) => {\n\t\tif (cachedReruns.size === 0) return;\n\t\tfor (const [key, entry] of cachedReruns) {\n\t\t\tif (\n\t\t\t\treadSetOverlaps(\n\t\t\t\t\tentry.readTables,\n\t\t\t\t\tentry.readKeys,\n\t\t\t\t\tentry.rangeDeps,\n\t\t\t\t\tchanges\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tcachedReruns.delete(key);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst reactivePairs = async (\n\t\tchanges: ReactiveChange[]\n\t): Promise<[ActiveSubscription, ViewDiff<unknown>][]> => {\n\t\t// Drop now-stale cache entries before reruns — otherwise a fresh\n\t\t// subscriber landing during the batch could read the OLD value.\n\t\tinvalidateCacheForChanges(changes);\n\n\t\tconst pairs: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\t// Dedupe: subscriptions sharing the same `(collection, params, ctx)`\n\t\t// only need ONE rerun per change batch. With 1000 subs on the same\n\t\t// query, this drops per-change CPU from O(N) reruns to O(1) — every\n\t\t// sub then diffs the shared result against its own `current` and\n\t\t// receives its own per-sub frame (which the transport still writes\n\t\t// per-WS, see #22 batch-frame fan-out for the next step).\n\t\tconst sharedRuns = new Map<\n\t\t\tstring,\n\t\t\tPromise<Awaited<ReturnType<ReactiveSub['rerun']>>>\n\t\t>();\n\t\tfor (const sub of reactiveSubs) {\n\t\t\tif (!isReactiveAffected(sub, changes)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet runPromise = sharedRuns.get(sub.rerunKey);\n\t\t\tif (runPromise === undefined) {\n\t\t\t\trunPromise = sub.rerun();\n\t\t\t\tsharedRuns.set(sub.rerunKey, runPromise);\n\t\t\t}\n\t\t\tconst { rows, readTables, readKeys, rangeDeps } = await runPromise;\n\t\t\tsub.readTables = readTables;\n\t\t\tsub.readKeys = readKeys;\n\t\t\tsub.rangeDeps = rangeDeps;\n\t\t\tconst diff = diffRerun(sub, rows);\n\t\t\tif (!isEmptyViewDiff(diff)) {\n\t\t\t\tpairs.push([sub, diff]);\n\t\t\t}\n\t\t}\n\t\t// Refresh cache entries with the freshly-computed rows so subsequent\n\t\t// subscribers reuse them without hitting the DB.\n\t\tfor (const [key, runPromise] of sharedRuns) {\n\t\t\trunPromise\n\t\t\t\t.then(({ rows, readTables, readKeys, rangeDeps }) => {\n\t\t\t\t\twriteCacheEntry({\n\t\t\t\t\t\texpiresAt: Date.now() + reactiveCacheTtlMs,\n\t\t\t\t\t\trangeDeps,\n\t\t\t\t\t\treadKeys,\n\t\t\t\t\t\treadTables,\n\t\t\t\t\t\trerunKey: key,\n\t\t\t\t\t\trows,\n\t\t\t\t\t\tversion\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch(() => {\n\t\t\t\t\t// rerun threw — leave cache as-is (already invalidated above)\n\t\t\t\t});\n\t\t}\n\n\t\treturn pairs;\n\t};\n\n\t/** Lazily build + hydrate a search collection's shared index (once). */\n\tconst ensureSearchIndex = async (\n\t\tdefinition: SearchCollectionDefinition<unknown, unknown, unknown>\n\t) => {\n\t\tlet entry = searchIndexes.get(definition.name);\n\t\tif (entry === undefined) {\n\t\t\tentry = { index: definition.index(), definition, hydrated: false };\n\t\t\tsearchIndexes.set(definition.name, entry);\n\t\t}\n\t\tif (!entry.hydrated) {\n\t\t\tfor (const row of await definition.source()) {\n\t\t\t\tentry.index.add(row);\n\t\t\t}\n\t\t\tentry.hydrated = true;\n\t\t}\n\t\treturn entry;\n\t};\n\n\t/**\n\t * Keep search indexes live and re-rank affected search subs: apply each change\n\t * to its collection's index, then re-run every sub whose collection changed.\n\t * Synchronous — the index ops and re-ranks don't touch the DB.\n\t */\n\tconst searchPairs = (\n\t\tchanges: { table: string; change: RowChange<unknown> }[]\n\t): [ActiveSubscription, ViewDiff<unknown>][] => {\n\t\tconst touched = new Set<string>();\n\t\tfor (const { table, change } of changes) {\n\t\t\tfor (const entry of searchIndexes.values()) {\n\t\t\t\tif (!entry.hydrated || entry.definition.table !== table) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (change.op === 'delete') {\n\t\t\t\t\tentry.index.remove(entry.definition.key(change.row));\n\t\t\t\t} else {\n\t\t\t\t\tentry.index.add(change.row);\n\t\t\t\t}\n\t\t\t\ttouched.add(entry.definition.name);\n\t\t\t}\n\t\t}\n\t\tconst pairs: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\tfor (const sub of searchSubs) {\n\t\t\tif (!touched.has(sub.collection)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Ignore pure score drift (BM25 idf shifts as the corpus grows), so a\n\t\t\t// result only re-emits when it enters/leaves or its content changes —\n\t\t\t// not on every unrelated insert.\n\t\t\tconst diff = diffRerun(sub, sub.rerun(), equalsIgnoringScore);\n\t\t\tif (!isEmptyViewDiff(diff)) {\n\t\t\t\tpairs.push([sub, diff]);\n\t\t\t}\n\t\t}\n\t\treturn pairs;\n\t};\n\n\tconst logChange = (changeVersion: number, entry: LoggedChange) => {\n\t\tchangeLog.push(entry);\n\t\t// Count-based cap.\n\t\tif (changeLog.length > changeLogSize) {\n\t\t\tchangeLog.shift();\n\t\t}\n\t\t// Time-based retention (1.13.0): drop entries older than the\n\t\t// configured window. Cheap when the log is small or the head is\n\t\t// fresh — we stop the moment we find a young-enough entry.\n\t\tif (changeLogRetainMs !== null && changeLogRetainMs > 0) {\n\t\t\tconst cutoff = entry.at - changeLogRetainMs;\n\t\t\twhile (changeLog.length > 0 && changeLog[0]!.at < cutoff) {\n\t\t\t\tchangeLog.shift();\n\t\t\t}\n\t\t}\n\t\t// Atomic with the log push — every active CDC streamer sees every\n\t\t// entry exactly once, in version order, with no chance of a missed\n\t\t// commit between phase-1 catch-up and phase-2 tail.\n\t\tfor (const subscriber of streamSubscribers) {\n\t\t\tsubscriber(entry);\n\t\t}\n\t};\n\n\t/** Apply a single committed change at its own version (CDC / direct writes). */\n\tconst applyChange = async (\n\t\ttable: string,\n\t\tchange: RowChange<unknown>,\n\t\tshouldBroadcast = true\n\t) => {\n\t\tversion += 1;\n\t\tconst changeVersion = version;\n\t\tconst at = Date.now();\n\t\tlogChange(changeVersion, { version: changeVersion, table, change, at });\n\t\temitActivity({\n\t\t\ttype: 'change',\n\t\t\tat,\n\t\t\ttable,\n\t\t\top: change.op,\n\t\t\tversion: changeVersion\n\t\t});\n\t\t// Collect, then emit once at the end: reactive re-runs are async, and\n\t\t// emitting before they finish would let the transport flush a partial frame.\n\t\tconst emissions: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\tfor (const subscription of subscriptionsForTable(table)) {\n\t\t\tconst diff = await subscriptionDiff(subscription, table, change);\n\t\t\tif (!isEmptyViewDiff(diff)) {\n\t\t\t\temissions.push([subscription, diff]);\n\t\t\t}\n\t\t}\n\t\temissions.push(\n\t\t\t...(await reactivePairs([\n\t\t\t\t{ table, key: changedKeyFor(table, change), row: change.row }\n\t\t\t]))\n\t\t);\n\t\temissions.push(...searchPairs([{ table, change }]));\n\t\tfor (const [subscription, diff] of emissions) {\n\t\t\tsubscription.onDiff(diff, changeVersion);\n\t\t}\n\t\tif (shouldBroadcast) {\n\t\t\tbroadcast([{ table, change }]);\n\t\t}\n\t};\n\n\t/**\n\t * Apply a set of changes atomically: one version bump for the whole batch and\n\t * a single net-merged diff per affected subscription. Used by mutations so a\n\t * client never renders a torn intermediate state mid-mutation.\n\t */\n\tconst applyChangeBatch = async (\n\t\tchanges: { table: string; change: RowChange<unknown> }[],\n\t\tshouldBroadcast = true\n\t) => {\n\t\tif (changes.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tversion += 1;\n\t\tconst batchVersion = version;\n\t\tconst perSubscription = new Map<\n\t\t\tActiveSubscription,\n\t\t\tViewDiff<unknown>[]\n\t\t>();\n\t\tconst reactiveChanges: ReactiveChange[] = [];\n\t\tconst batchAt = Date.now();\n\t\tfor (const { table, change } of changes) {\n\t\t\tlogChange(batchVersion, { version: batchVersion, table, change, at: batchAt });\n\t\t\temitActivity({\n\t\t\t\ttype: 'change',\n\t\t\t\tat: batchAt,\n\t\t\t\ttable,\n\t\t\t\top: change.op,\n\t\t\t\tversion: batchVersion\n\t\t\t});\n\t\t\treactiveChanges.push({\n\t\t\t\ttable,\n\t\t\t\tkey: changedKeyFor(table, change),\n\t\t\t\trow: change.row\n\t\t\t});\n\t\t\tfor (const subscription of subscriptionsForTable(table)) {\n\t\t\t\t// Apply in order to keep operator state correct; collect to merge.\n\t\t\t\tconst diff = await subscriptionDiff(\n\t\t\t\t\tsubscription,\n\t\t\t\t\ttable,\n\t\t\t\t\tchange\n\t\t\t\t);\n\t\t\t\tconst list = perSubscription.get(subscription);\n\t\t\t\tif (list === undefined) {\n\t\t\t\t\tperSubscription.set(subscription, [diff]);\n\t\t\t\t} else {\n\t\t\t\t\tlist.push(diff);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Gather all emissions before sending any, so the whole batch — view diffs\n\t\t// and reactive re-runs (async) — leaves as one coalesced frame.\n\t\tconst emissions: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\tfor (const [subscription, diffs] of perSubscription) {\n\t\t\tconst merged =\n\t\t\t\tdiffs.length === 1\n\t\t\t\t\t? diffs[0]!\n\t\t\t\t\t: mergeViewDiffs(diffs, subscription.key);\n\t\t\tif (!isEmptyViewDiff(merged)) {\n\t\t\t\temissions.push([subscription, merged]);\n\t\t\t}\n\t\t}\n\t\temissions.push(...(await reactivePairs(reactiveChanges)));\n\t\temissions.push(...searchPairs(changes));\n\t\tfor (const [subscription, diff] of emissions) {\n\t\t\tsubscription.onDiff(diff, batchVersion);\n\t\t}\n\t\tif (shouldBroadcast) {\n\t\t\tbroadcast(changes);\n\t\t}\n\t};\n\n\t/**\n\t * Can we replay `(since, now]` from the log for `tables`? Only when the log\n\t * hasn't been trimmed past `since` (no gap).\n\t */\n\tconst canResume = (since: number, incremental: boolean): boolean => {\n\t\tif (!incremental) {\n\t\t\treturn false; // refetch/join subs can't be replayed precisely\n\t\t}\n\t\tif (since >= version) {\n\t\t\treturn true; // nothing newer to replay\n\t\t}\n\t\tconst oldest = changeLog[0];\n\t\treturn oldest !== undefined && oldest.version <= since + 1;\n\t};\n\n\t/** Build a catch-up diff from the log for one subscription (last op per key wins). */\n\tconst buildCatchup = (\n\t\tsince: number,\n\t\ttables: string[],\n\t\tkey: (row: unknown) => RowKey,\n\t\tmatch: (row: unknown) => boolean\n\t): ViewDiff<unknown> => {\n\t\tconst latest = new Map<\n\t\t\tRowKey,\n\t\t\t{ op: 'upsert' | 'remove'; row: unknown }\n\t\t>();\n\t\tfor (const entry of changeLog) {\n\t\t\tif (entry.version <= since || !tables.includes(entry.table)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst row = entry.change.row;\n\t\t\tconst present =\n\t\t\t\tentry.change.op !== 'delete' && match(row)\n\t\t\t\t\t? 'upsert'\n\t\t\t\t\t: 'remove';\n\t\t\tlatest.set(key(row), { op: present, row });\n\t\t}\n\t\tconst changed: unknown[] = [];\n\t\tconst removed: unknown[] = [];\n\t\tfor (const { op, row } of latest.values()) {\n\t\t\t(op === 'upsert' ? changed : removed).push(row);\n\t\t}\n\t\treturn { added: [], removed, changed };\n\t};\n\n\tconst subscribeJoin = async (\n\t\tcollection: string,\n\t\tdefinition: JoinCollectionDefinition<\n\t\t\tunknown,\n\t\t\tunknown,\n\t\t\tunknown,\n\t\t\tunknown,\n\t\t\tunknown\n\t\t>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst { left, right } = definition;\n\t\tconst op = createEquiJoin<unknown, unknown, unknown>({\n\t\t\tleftKey: left.key,\n\t\t\trightKey: right.key,\n\t\t\tleftOn: left.on,\n\t\t\trightOn: right.on,\n\t\t\tselect: definition.select\n\t\t});\n\t\top.hydrate(\n\t\t\t[...(await left.hydrate(params, ctx))],\n\t\t\t[...(await right.hydrate(params, ctx))]\n\t\t);\n\t\tconst atVersion = version;\n\n\t\tconst subscription: ActiveSubscription = {\n\t\t\tkind: 'join',\n\t\t\tcollection,\n\t\t\tjoin: {\n\t\t\t\top,\n\t\t\t\tleftTable: left.table,\n\t\t\t\trightTable: right.table,\n\t\t\t\tleftMatch: left.match\n\t\t\t\t\t? (row) => left.match!(row, params, ctx)\n\t\t\t\t\t: undefined,\n\t\t\t\trightMatch: right.match\n\t\t\t\t\t? (row) => right.match!(row, params, ctx)\n\t\t\t\t\t: undefined\n\t\t\t},\n\t\t\tkey: definition.key as (row: unknown) => RowKey,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\n\t\treturn {\n\t\t\tinitial: op.rows(),\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst subscribeGraph = async (\n\t\tcollection: string,\n\t\tdefinition: GraphCollectionDefinition<unknown, unknown, unknown>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst instance = definition.query.instantiate(params, ctx);\n\t\tconst initial = await instance.hydrate();\n\t\tconst atVersion = version;\n\t\tconst subscription: ActiveSubscription = {\n\t\t\tkind: 'graph',\n\t\t\tcollection,\n\t\t\tinstance,\n\t\t\tkey: definition.key as (row: unknown) => RowKey,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\t\treturn {\n\t\t\tinitial,\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst subscribeReactive = async (\n\t\tcollection: string,\n\t\tdefinition: ReactiveQueryDefinition<unknown, unknown, unknown>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// Each run gets a fresh read set; the handle records tables + row keys read.\n\t\tconst rerun = async () => {\n\t\t\tconst readTables = new Set<string>();\n\t\t\tconst readKeys = new Set<string>();\n\t\t\tconst rangeDeps: RangeDep[] = [];\n\t\t\tconst db = makeReadHandle(ctx, readTables, readKeys, rangeDeps);\n\t\t\tconst rows = [...(await definition.run({ ctx, db, params }))];\n\t\t\treturn { rangeDeps, readKeys, readTables, rows };\n\t\t};\n\t\tconst rerunKey = stableSubKey(collection, params, ctx);\n\t\t// Cross-client cache hit (1.3+): a previous subscriber with the same\n\t\t// (collection, params, ctx) ran the query body recently and its\n\t\t// result is still valid (no overlapping write since). Reuse it\n\t\t// instead of hitting the DB again. Cache misses fall through to\n\t\t// `rerun()` and populate the cache for the next subscriber.\n\t\tconst cached = readCacheEntry(rerunKey);\n\t\tconst first =\n\t\t\tcached !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\trangeDeps: cached.rangeDeps,\n\t\t\t\t\t\treadKeys: cached.readKeys,\n\t\t\t\t\t\treadTables: cached.readTables,\n\t\t\t\t\t\trows: cached.rows\n\t\t\t\t\t}\n\t\t\t\t: await rerun();\n\t\tif (cached === undefined) {\n\t\t\twriteCacheEntry({\n\t\t\t\texpiresAt: Date.now() + reactiveCacheTtlMs,\n\t\t\t\trangeDeps: first.rangeDeps,\n\t\t\t\treadKeys: first.readKeys,\n\t\t\t\treadTables: first.readTables,\n\t\t\t\trerunKey,\n\t\t\t\trows: first.rows,\n\t\t\t\tversion\n\t\t\t});\n\t\t}\n\t\tconst current = new Map<RowKey, unknown>();\n\t\tfor (const row of first.rows) {\n\t\t\tcurrent.set(definition.key(row), row);\n\t\t}\n\t\tconst atVersion = version;\n\t\tconst subscription: ReactiveSub = {\n\t\t\tkind: 'reactive',\n\t\t\tcollection,\n\t\t\tkey: definition.key,\n\t\t\trerun,\n\t\t\trerunKey,\n\t\t\tcurrent,\n\t\t\treadTables: first.readTables,\n\t\t\treadKeys: first.readKeys,\n\t\t\trangeDeps: first.rangeDeps,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\t\treactiveSubs.add(subscription);\n\t\treturn {\n\t\t\tinitial: first.rows,\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t\treactiveSubs.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst subscribeSearch = async (\n\t\tcollection: string,\n\t\tdefinition: SearchCollectionDefinition<unknown, unknown, unknown>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\t// The subscription params are the query (a string for text, a vector for\n\t\t// similarity).\n\t\tconst query = params;\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(query, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst entry = await ensureSearchIndex(definition);\n\t\tconst limit = definition.limit ?? 20;\n\t\tconst readRule = readRuleFor(definition.table);\n\t\t// Re-rank: top-K from the (shared, live) index, scoped by the read rule,\n\t\t// each row tagged with its score so the client can sort by relevance.\n\t\tconst rerun = (): unknown[] => {\n\t\t\tconst candidates = entry.index.search(\n\t\t\t\tquery,\n\t\t\t\treadRule ? limit * 5 : limit\n\t\t\t);\n\t\t\tconst visible = readRule\n\t\t\t\t? candidates.filter((hit) => readRule(ctx, hit.row))\n\t\t\t\t: candidates;\n\t\t\treturn visible.slice(0, limit).map((hit) => ({\n\t\t\t\t...(hit.row as Record<string, unknown>),\n\t\t\t\t[SEARCH_SCORE_FIELD]: hit.score\n\t\t\t}));\n\t\t};\n\t\tconst initial = rerun();\n\t\tconst current = new Map<RowKey, unknown>();\n\t\tfor (const row of initial) {\n\t\t\tcurrent.set(definition.key(row), row);\n\t\t}\n\t\tconst atVersion = version;\n\t\tconst subscription: Extract<ActiveSubscription, { kind: 'search' }> = {\n\t\t\tkind: 'search',\n\t\t\tcollection,\n\t\t\tkey: definition.key,\n\t\t\trerun,\n\t\t\tcurrent,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\t\tsearchSubs.add(subscription);\n\t\treturn {\n\t\t\tinitial,\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t\tsearchSubs.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst engine: SyncEngine = {\n\t\tregister: (collection) => {\n\t\t\tregistry.set(collection.name, collection);\n\t\t\tfor (const table of collection.tables ?? [collection.name]) {\n\t\t\t\taddTableIndex(table, collection.name);\n\t\t\t}\n\t\t},\n\n\t\tregisterJoin: (collection) => {\n\t\t\tregistry.set(collection.name, collection);\n\t\t\taddTableIndex(collection.left.table, collection.name);\n\t\t\taddTableIndex(collection.right.table, collection.name);\n\t\t},\n\n\t\tregisterGraph: (collection) => {\n\t\t\tregistry.set(collection.name, collection);\n\t\t\tfor (const table of collection.query.tables()) {\n\t\t\t\taddTableIndex(table, collection.name);\n\t\t\t}\n\t\t},\n\n\t\tregisterSearch: (collection) => {\n\t\t\t// Like reactive: not in tableIndex — its index is driven directly by\n\t\t\t// searchPairs off the change feed.\n\t\t\tregistry.set(collection.name, collection);\n\t\t},\n\n\t\tsubscribe: async ({ collection, params, ctx, onDiff, since, signal }) => {\n\t\t\t// (1.15.0) Cheap up-front check — if the consumer already aborted\n\t\t\t// before we got here, throw before any side effect (no authorize,\n\t\t\t// no hydrate, no view materialization).\n\t\t\tcheckAborted(signal);\n\n\t\t\tconst registered = registry.get(collection);\n\t\t\tif (registered === undefined) {\n\t\t\t\tthrow new Error(`Unknown collection \"${collection}\"`);\n\t\t\t}\n\n\t\t\tconst typedOnDiff = onDiff as OnDiff;\n\t\t\tconst subscribeSet = subsFor(collection);\n\n\t\t\t// Wrap the eventual return so we (a) re-check signal after the\n\t\t\t// async setup (catches mid-flight aborts), and (b) auto-call\n\t\t\t// unsubscribe when signal fires after the subscription is live.\n\t\t\tconst wrapReturn = <T>(sub: Subscription<T>): Subscription<T> => {\n\t\t\t\tcheckAborted(signal);\n\t\t\t\tlinkAbortToUnsubscribe(signal, sub.unsubscribe);\n\t\t\t\treturn sub;\n\t\t\t};\n\n\t\t\tconst registeredKind = (registered as { kind?: string }).kind;\n\t\t\tif (registeredKind === 'join') {\n\t\t\t\tconst joined = await subscribeJoin(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as JoinCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(joined) as Subscription<never>;\n\t\t\t}\n\t\t\tif (registeredKind === 'graph') {\n\t\t\t\tconst graphed = await subscribeGraph(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as GraphCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(graphed) as Subscription<never>;\n\t\t\t}\n\t\t\tif (registeredKind === 'reactive') {\n\t\t\t\tconst reactived = await subscribeReactive(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as ReactiveQueryDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(reactived) as Subscription<never>;\n\t\t\t}\n\t\t\tif (registeredKind === 'search') {\n\t\t\t\tconst searched = await subscribeSearch(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as SearchCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(searched) as Subscription<never>;\n\t\t\t}\n\t\t\tconst definition = registered as CollectionDefinition<\n\t\t\t\tunknown,\n\t\t\t\tunknown,\n\t\t\t\tunknown\n\t\t\t>;\n\n\t\t\tif (definition.authorize !== undefined) {\n\t\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\t\tif (!allowed) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst key = definition.key ?? defaultKey;\n\t\t\tconst match = definition.match;\n\t\t\tconst tables = definition.tables ?? [collection];\n\t\t\t// Declarative read rule + schema migration apply to single-table\n\t\t\t// collections (their rows are that table's rows); join/aggregate\n\t\t\t// collections scope via match.\n\t\t\tconst scopedTable = tables.length === 1 ? tables[0]! : undefined;\n\t\t\tconst readRule =\n\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t? readRuleFor(scopedTable)\n\t\t\t\t\t: undefined;\n\t\t\t// Migrate the DB result to the current shape, then filter it through the\n\t\t\t// read rule — so the initial snapshot and the refetch fallback are\n\t\t\t// always current-shape and never include a row the caller can't see.\n\t\t\tconst rehydrate = async () => {\n\t\t\t\tconst raw = [...(await definition.hydrate(params, ctx))];\n\t\t\t\tconst rows =\n\t\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t\t? raw.map((row) => migrateRow(scopedTable, row))\n\t\t\t\t\t\t: raw;\n\t\t\t\treturn readRule\n\t\t\t\t\t? rows.filter((row) => readRule(ctx, row))\n\t\t\t\t\t: rows;\n\t\t\t};\n\t\t\t// Incremental matching only applies to single-table collections; a\n\t\t\t// join/aggregate spanning tables can't match a single row, so it uses\n\t\t\t// the refetch fallback.\n\t\t\tconst incremental = match !== undefined && tables.length === 1;\n\t\t\t// Fold the read rule into the incremental predicate (also used by the\n\t\t\t// catch-up builder), so an unreadable row never enters the view.\n\t\t\tconst boundMatch = incremental\n\t\t\t\t? (row: unknown) =>\n\t\t\t\t\t\tmatch(row, params, ctx) &&\n\t\t\t\t\t\t(readRule ? readRule(ctx, row) : true)\n\t\t\t\t: () => true;\n\t\t\tconst view = createMaterializedView<unknown>({\n\t\t\t\tkey,\n\t\t\t\tmatch: boundMatch\n\t\t\t});\n\n\t\t\t// Resume from the log when possible (catch-up diff); else send a\n\t\t\t// snapshot. The view is hydrated either way so future changes match.\n\t\t\tconst resuming =\n\t\t\t\tsince !== undefined && canResume(since, incremental);\n\t\t\tview.hydrate([...(await rehydrate())]);\n\t\t\tconst atVersion = version;\n\n\t\t\tconst subscription: ActiveSubscription = {\n\t\t\t\tkind: 'view',\n\t\t\t\tcollection,\n\t\t\t\tview,\n\t\t\t\tincremental,\n\t\t\t\trehydrate,\n\t\t\t\tkey,\n\t\t\t\tonDiff: typedOnDiff\n\t\t\t};\n\t\t\tsubscribeSet.add(subscription);\n\n\t\t\tconst unsubscribe = () => {\n\t\t\t\tsubscribeSet.delete(subscription);\n\t\t\t};\n\n\t\t\tif (resuming) {\n\t\t\t\treturn wrapReturn({\n\t\t\t\t\tinitial: [],\n\t\t\t\t\tcatchup: buildCatchup(\n\t\t\t\t\t\tsince,\n\t\t\t\t\t\ttables,\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tboundMatch\n\t\t\t\t\t) as ViewDiff<never>,\n\t\t\t\t\tversion: atVersion,\n\t\t\t\t\tunsubscribe\n\t\t\t\t}) as Subscription<never>;\n\t\t\t}\n\t\t\treturn wrapReturn({\n\t\t\t\tinitial: view.rows() as never[],\n\t\t\t\tversion: atVersion,\n\t\t\t\tunsubscribe\n\t\t\t}) as Subscription<never>;\n\t\t},\n\n\t\thydrate: async (collection, params, ctx, options) => {\n\t\t\tconst signal = options?.signal;\n\t\t\tcheckAborted(signal);\n\t\t\tconst definition = registry.get(collection) as\n\t\t\t\t| CollectionDefinition<unknown, unknown, unknown>\n\t\t\t\t| undefined;\n\t\t\tif (definition === undefined) {\n\t\t\t\tthrow new Error(`Unknown collection \"${collection}\"`);\n\t\t\t}\n\t\t\tif (definition.authorize !== undefined) {\n\t\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\t\tcheckAborted(signal);\n\t\t\t\tif (!allowed) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t`hydrate collection \"${collection}\"`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst raw = [...(await definition.hydrate(params, ctx))];\n\t\t\tcheckAborted(signal);\n\t\t\tconst tables = definition.tables ?? [collection];\n\t\t\tconst scopedTable = tables.length === 1 ? tables[0]! : undefined;\n\t\t\tconst rows =\n\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t? raw.map((row) => migrateRow(scopedTable, row))\n\t\t\t\t\t: raw;\n\t\t\tconst readRule =\n\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t? readRuleFor(scopedTable)\n\t\t\t\t\t: undefined;\n\t\t\treturn readRule ? rows.filter((row) => readRule(ctx, row)) : rows;\n\t\t},\n\n\t\tapplyChange: (table, change) =>\n\t\t\tapplyChange(table, change as RowChange<unknown>),\n\n\t\tconnectSource: async (source) => {\n\t\t\tawait source.start((table, change) => applyChange(table, change));\n\t\t\treturn async () => {\n\t\t\t\tawait source.stop();\n\t\t\t};\n\t\t},\n\n\t\tconnectCluster: async (bus) => {\n\t\t\tconst unsubscribe = await bus.subscribe((message) => {\n\t\t\t\t// Ignore our own broadcasts; apply peers' changes locally without\n\t\t\t\t// re-broadcasting (that would loop).\n\t\t\t\tif (message.origin === instanceId) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvoid applyChangeBatch(message.changes, false);\n\t\t\t});\n\t\t\tclusterBus = bus;\n\n\t\t\treturn async () => {\n\t\t\t\tclusterBus = undefined;\n\t\t\t\tawait unsubscribe();\n\t\t\t};\n\t\t},\n\n\t\tsubscriptionCount: (collection) => {\n\t\t\tif (collection !== undefined) {\n\t\t\t\treturn active.get(collection)?.size ?? 0;\n\t\t\t}\n\t\t\tlet total = 0;\n\t\t\tfor (const set of active.values()) {\n\t\t\t\ttotal += set.size;\n\t\t\t}\n\t\t\treturn total;\n\t\t},\n\n\t\tregisterMutation: (mutation) => {\n\t\t\tif (\n\t\t\t\tmutation.handler === undefined &&\n\t\t\t\tmutation.sandboxedHandler === undefined\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Mutation \"${mutation.name}\" must define either \\`handler\\` or \\`sandboxedHandler\\``\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (\n\t\t\t\tmutation.handler !== undefined &&\n\t\t\t\tmutation.sandboxedHandler !== undefined\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Mutation \"${mutation.name}\" defines both \\`handler\\` and \\`sandboxedHandler\\` — pick one`\n\t\t\t\t);\n\t\t\t}\n\t\t\tmutations.set(mutation.name, mutation);\n\t\t\t// Build the sandbox runner eagerly only if we know the source —\n\t\t\t// the actual isolate spawn is still lazy (inside makeSandboxedHandler).\n\t\t\tif (mutation.sandboxedHandler !== undefined) {\n\t\t\t\tsandboxRunners.set(\n\t\t\t\t\tmutation.name,\n\t\t\t\t\tmakeSandboxedHandler(\n\t\t\t\t\t\tmutation.sandboxedHandler,\n\t\t\t\t\t\tmutation.sandbox,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbridgeFetch: options.bridgeFetch,\n\t\t\t\t\t\t\tmetricsHook:\n\t\t\t\t\t\t\t\toptions.handlerMetrics === undefined\n\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t\t\tmutationName: mutation.name,\n\t\t\t\t\t\t\t\t\t\t\tonMetrics: options.handlerMetrics\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tregisterWriter: (table, writer) => {\n\t\t\twriters.set(table, writer as TableWriter);\n\t\t},\n\n\t\tregisterReactive: (query) => {\n\t\t\tregistry.set(query.name, query);\n\t\t},\n\n\t\tregisterReader: (table, reader) => {\n\t\t\treaders.set(table, reader as TableReader);\n\t\t},\n\n\t\tregisterPermissions: (table, rules) => {\n\t\t\tpermissions.set(table, rules as TablePermissions<unknown, unknown>);\n\t\t},\n\n\t\tregisterSchema: (table, schema) => {\n\t\t\tschemas.set(table, schema as TableSchema<unknown>);\n\t\t},\n\n\t\tregisterCrdt: (table, fields) => {\n\t\t\tcrdtFields.set(\n\t\t\t\ttable,\n\t\t\t\tfields as Record<string, CrdtMergeable<unknown>>\n\t\t\t);\n\t\t\t// A ready-made merge mutation so a client needs no custom server code:\n\t\t\t// upsert the row patch — the CRDT auto-merge in makeActions folds the\n\t\t\t// declared fields into the stored row. Named \"<table>:merge\".\n\t\t\tconst name = `${table}:merge`;\n\t\t\tmutations.set(name, {\n\t\t\t\thandler: async (args, ctx, actions) => {\n\t\t\t\t\tconst existing = await readExisting(table, args, ctx);\n\t\t\t\t\treturn existing === undefined\n\t\t\t\t\t\t? actions.insert(table, args)\n\t\t\t\t\t\t: actions.update(table, args);\n\t\t\t\t},\n\t\t\t\tname\n\t\t\t} as MutationDefinition<unknown, unknown, unknown>);\n\t\t},\n\n\t\tmigrate: (table, row) => migrateRow(table, row) as typeof row,\n\n\t\trunMutation: async (name, args, ctx) => {\n\t\t\tconst mutation = mutations.get(name);\n\t\t\tif (mutation === undefined) {\n\t\t\t\tthrow new Error(`Unknown mutation \"${name}\"`);\n\t\t\t}\n\t\t\tif (mutation.authorize !== undefined) {\n\t\t\t\tconst allowed = await mutation.authorize(args, ctx);\n\t\t\t\tif (!allowed) {\n\t\t\t\t\tthrow new UnauthorizedError(`run mutation \"${name}\"`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Pick the handler shape: in-process function or sandboxed string\n\t\t\t// source (runs inside @absolutejs/isolated-jsc). Sandbox runner is\n\t\t\t// built lazily and pre-cached in registerMutation.\n\t\t\tconst sandboxRunner = sandboxRunners.get(name);\n\t\t\tconst invokeHandler =\n\t\t\t\tsandboxRunner !== undefined\n\t\t\t\t\t? sandboxRunner\n\t\t\t\t\t: (\n\t\t\t\t\t\t\ta: unknown,\n\t\t\t\t\t\t\tc: unknown,\n\t\t\t\t\t\t\tactions: MutationActions\n\t\t\t\t\t\t): Promise<unknown> =>\n\t\t\t\t\t\t\tPromise.resolve(\n\t\t\t\t\t\t\t\t// Non-null assertion: registerMutation guarantees one of\n\t\t\t\t\t\t\t\t// handler/sandboxedHandler is defined.\n\t\t\t\t\t\t\t\tmutation.handler!(a, c, actions)\n\t\t\t\t\t\t\t);\n\n\t\t\t// Run the handler (optionally inside the DB transaction), collecting its\n\t\t\t// changes into a fresh buffer per attempt — so a transaction that retries\n\t\t\t// or rolls back never double-emits or leaks a half-applied batch.\n\t\t\tconst runHandler = async (tx: unknown) => {\n\t\t\t\tconst { actions, buffered } = makeActions(tx, ctx, true);\n\t\t\t\tconst result = await invokeHandler(args, ctx, actions);\n\t\t\t\treturn { buffered, result };\n\t\t\t};\n\n\t\t\t// Resolve the retry policy once per call. When `mutation.retry` is\n\t\t\t// undefined we still go through the loop, but bounded to one\n\t\t\t// attempt with no backoff (cheaper than a separate code path).\n\t\t\tconst retry = mutation.retry;\n\t\t\tconst maxAttempts =\n\t\t\t\tretry === undefined ? 1 : (retry.maxAttempts ?? 5);\n\t\t\tconst isRetryable = retry?.isRetryable ?? isSerializationFailure;\n\t\t\tconst computeDelay = retry?.backoff ?? exponentialBackoff();\n\t\t\tconst maxElapsedMs = retry?.maxElapsedMs ?? 30_000;\n\t\t\tconst startedAt = Date.now();\n\n\t\t\t// Each attempt builds fresh `actions`/`buffered` via the makeActions\n\t\t\t// call inside runHandler, so a retry never inherits half-applied\n\t\t\t// buffered changes from a failed attempt. Transactions reopen too:\n\t\t\t// runInTransaction wraps each individual attempt.\n\t\t\tlet lastError: unknown;\n\t\t\tlet attemptsMade = 0;\n\t\t\tmutationsInFlight += 1;\n\t\t\ttry {\n\t\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\t\tattemptsMade = attempt;\n\t\t\t\ttry {\n\t\t\t\t\tconst { buffered, result } =\n\t\t\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t\t\t? await runInTransaction((tx) => runHandler(tx))\n\t\t\t\t\t\t\t: await runHandler(undefined);\n\t\t\t\t\tawait applyChangeBatch(buffered);\n\t\t\t\t\tmutationsCompleted += 1;\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'mutation',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tstatus: 'ok'\n\t\t\t\t\t});\n\t\t\t\t\treturn result;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlastError = error;\n\t\t\t\t\tconst elapsedMs = Date.now() - startedAt;\n\t\t\t\t\tconst canRetry =\n\t\t\t\t\t\tattempt < maxAttempts &&\n\t\t\t\t\t\tisRetryable(error) &&\n\t\t\t\t\t\telapsedMs < maxElapsedMs;\n\t\t\t\t\tif (!canRetry) break;\n\t\t\t\t\tmutationsRetried += 1;\n\n\t\t\t\t\tconst rawDelay = computeDelay(attempt);\n\t\t\t\t\t// Cap the delay so we don't blow past maxElapsedMs while\n\t\t\t\t\t// sleeping. If the cap would be negative we're already past\n\t\t\t\t\t// the budget; treat as exhausted.\n\t\t\t\t\tconst remaining = maxElapsedMs - elapsedMs;\n\t\t\t\t\tif (remaining <= 0) break;\n\t\t\t\t\tconst delayMs = Math.max(0, Math.min(rawDelay, remaining));\n\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'mutationRetry',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\tdelayMs,\n\t\t\t\t\t\terrorName:\n\t\t\t\t\t\t\terror instanceof Error ? error.name : 'Error',\n\t\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t\t: String(error)\n\t\t\t\t\t});\n\t\t\t\t\tif (delayMs > 0) {\n\t\t\t\t\t\tawait new Promise((resolve) =>\n\t\t\t\t\t\t\tsetTimeout(resolve, delayMs)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmutationsFailed += 1;\n\t\t\temitActivity({\n\t\t\t\ttype: 'mutation',\n\t\t\t\tat: Date.now(),\n\t\t\t\tname,\n\t\t\t\tstatus: 'error'\n\t\t\t});\n\t\t\t// Wrap only when we actually burned through more than one attempt\n\t\t\t// — a non-retryable first-attempt failure passes through with its\n\t\t\t// original error preserved, even if `retry` is configured.\n\t\t\tif (attemptsMade > 1) {\n\t\t\t\tthrow new RetriesExhaustedError(\n\t\t\t\t\tattemptsMade,\n\t\t\t\t\tDate.now() - startedAt,\n\t\t\t\t\tlastError\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow lastError;\n\t\t\t} finally {\n\t\t\t\tmutationsInFlight -= 1;\n\t\t\t}\n\t\t},\n\n\t\trunMutations: async (specs, ctx) => {\n\t\t\t// Empty batch: short-circuit. Don't open a DB tx for nothing —\n\t\t\t// some adapters (PG with auto-commit, MySQL with implicit\n\t\t\t// commit, etc.) count even an empty BEGIN/COMMIT as a real\n\t\t\t// transaction, which is wasteful and noisy in observability.\n\t\t\tif (specs.length === 0) return [];\n\t\t\t// Snapshot the requested mutation names up front so the\n\t\t\t// authorization + handler resolution happens BEFORE we open\n\t\t\t// the DB transaction. A typo'd name aborts cleanly without\n\t\t\t// burning a tx.\n\t\t\tconst resolved = specs.map((spec) => {\n\t\t\t\tconst mutation = mutations.get(spec.name);\n\t\t\t\tif (mutation === undefined) {\n\t\t\t\t\tthrow new Error(`Unknown mutation \"${spec.name}\"`);\n\t\t\t\t}\n\t\t\t\treturn { args: spec.args, mutation, name: spec.name };\n\t\t\t});\n\n\t\t\tconst runBatch = async (tx: unknown) => {\n\t\t\t\tconst results: unknown[] = [];\n\t\t\t\tconst accumulated: {\n\t\t\t\t\ttable: string;\n\t\t\t\t\tchange: RowChange<unknown>;\n\t\t\t\t}[] = [];\n\t\t\t\tfor (const { args, mutation, name } of resolved) {\n\t\t\t\t\tif (mutation.authorize !== undefined) {\n\t\t\t\t\t\tconst allowed = await mutation.authorize(args, ctx);\n\t\t\t\t\t\tif (!allowed) {\n\t\t\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t\t\t`run mutation \"${name}\"`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst sandboxRunner = sandboxRunners.get(name);\n\t\t\t\t\tconst invokeHandler =\n\t\t\t\t\t\tsandboxRunner !== undefined\n\t\t\t\t\t\t\t? sandboxRunner\n\t\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\t\ta: unknown,\n\t\t\t\t\t\t\t\t\tc: unknown,\n\t\t\t\t\t\t\t\t\tactions: MutationActions\n\t\t\t\t\t\t\t\t): Promise<unknown> =>\n\t\t\t\t\t\t\t\t\tPromise.resolve(\n\t\t\t\t\t\t\t\t\t\tmutation.handler!(a, c, actions)\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t// Each handler gets its own `actions`/`buffered` so per-\n\t\t\t\t\t// call validation + crdt merges still work — we collect\n\t\t\t\t\t// the buffered tail into `accumulated` after each\n\t\t\t\t\t// handler returns. If the next handler throws, the\n\t\t\t\t\t// surrounding `runInTransaction` rolls everything back;\n\t\t\t\t\t// applyChangeBatch never runs.\n\t\t\t\t\tconst { actions, buffered } = makeActions(tx, ctx, true);\n\t\t\t\t\tconst result = await invokeHandler(args, ctx, actions);\n\t\t\t\t\tresults.push(result);\n\t\t\t\t\taccumulated.push(...buffered);\n\t\t\t\t}\n\t\t\t\treturn { accumulated, results };\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst { accumulated, results } =\n\t\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t\t? await runInTransaction((tx) => runBatch(tx))\n\t\t\t\t\t\t: await runBatch(undefined);\n\t\t\t\tawait applyChangeBatch(accumulated);\n\t\t\t\temitActivity({\n\t\t\t\t\ttype: 'mutationBatch',\n\t\t\t\t\tat: Date.now(),\n\t\t\t\t\tnames: resolved.map((entry) => entry.name),\n\t\t\t\t\tstatus: 'ok'\n\t\t\t\t});\n\t\t\t\treturn results;\n\t\t\t} catch (error) {\n\t\t\t\temitActivity({\n\t\t\t\t\ttype: 'mutationBatch',\n\t\t\t\t\tat: Date.now(),\n\t\t\t\t\tnames: resolved.map((entry) => entry.name),\n\t\t\t\t\tstatus: 'error'\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\n\t\tregisterSchedule: (schedule) => {\n\t\t\tschedules.set(schedule.name, schedule);\n\t\t},\n\n\t\tlistSchedules: () => [...schedules.values()],\n\n\t\trunSchedule: async (name) => {\n\t\t\tconst schedule = schedules.get(name);\n\t\t\tif (schedule === undefined) {\n\t\t\t\tthrow new Error(`Unknown schedule \"${name}\"`);\n\t\t\t}\n\t\t\t// A schedule reads unscoped and writes without permission checks (it's\n\t\t\t// trusted server code); its writes emit as one live batch like a mutation.\n\t\t\tconst runHandler = async (tx: unknown) => {\n\t\t\t\tconst { actions, buffered } = makeActions(tx, {}, false);\n\t\t\t\tconst db = makeReadHandle({}, new Set(), new Set(), [], false);\n\t\t\t\tawait schedule.run({ actions, db });\n\t\t\t\treturn buffered;\n\t\t\t};\n\n\t\t\tconst retry = schedule.retry;\n\t\t\tconst maxAttempts =\n\t\t\t\tretry === undefined ? 1 : (retry.maxAttempts ?? 5);\n\t\t\tconst isRetryable = retry?.isRetryable ?? isSerializationFailure;\n\t\t\tconst computeDelay = retry?.backoff ?? exponentialBackoff();\n\t\t\tconst maxElapsedMs = retry?.maxElapsedMs ?? 30_000;\n\t\t\tconst startedAt = Date.now();\n\n\t\t\tlet lastError: unknown;\n\t\t\tlet attemptsMade = 0;\n\t\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\t\tattemptsMade = attempt;\n\t\t\t\ttry {\n\t\t\t\t\tconst buffered =\n\t\t\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t\t\t? await runInTransaction((tx) => runHandler(tx))\n\t\t\t\t\t\t\t: await runHandler(undefined);\n\t\t\t\t\tawait applyChangeBatch(buffered);\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'schedule',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tstatus: 'ok'\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlastError = error;\n\t\t\t\t\tconst elapsedMs = Date.now() - startedAt;\n\t\t\t\t\tconst canRetry =\n\t\t\t\t\t\tattempt < maxAttempts &&\n\t\t\t\t\t\tisRetryable(error) &&\n\t\t\t\t\t\telapsedMs < maxElapsedMs;\n\t\t\t\t\tif (!canRetry) break;\n\n\t\t\t\t\tconst rawDelay = computeDelay(attempt);\n\t\t\t\t\tconst remaining = maxElapsedMs - elapsedMs;\n\t\t\t\t\tif (remaining <= 0) break;\n\t\t\t\t\tconst delayMs = Math.max(0, Math.min(rawDelay, remaining));\n\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'scheduleRetry',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\tdelayMs,\n\t\t\t\t\t\terrorName:\n\t\t\t\t\t\t\terror instanceof Error ? error.name : 'Error',\n\t\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t\t: String(error)\n\t\t\t\t\t});\n\t\t\t\t\tif (delayMs > 0) {\n\t\t\t\t\t\tawait new Promise((resolve) =>\n\t\t\t\t\t\t\tsetTimeout(resolve, delayMs)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\temitActivity({\n\t\t\t\ttype: 'schedule',\n\t\t\t\tat: Date.now(),\n\t\t\t\tname,\n\t\t\t\tstatus: 'error'\n\t\t\t});\n\t\t\tif (attemptsMade > 1) {\n\t\t\t\tthrow new RetriesExhaustedError(\n\t\t\t\t\tattemptsMade,\n\t\t\t\t\tDate.now() - startedAt,\n\t\t\t\t\tlastError\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow lastError;\n\t\t},\n\n\t\tregisterPack: (pack) => {\n\t\t\tfor (const table of pack.ownsTables) {\n\t\t\t\tconst existing = packTableOwners.get(table);\n\t\t\t\tif (existing !== undefined) {\n\t\t\t\t\tthrow new PackTableConflictError(\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\texisting,\n\t\t\t\t\t\tpack.name\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.requireDependencies === true) {\n\t\t\t\tfor (const table of pack.readsTables ?? []) {\n\t\t\t\t\tif (!readers.has(table)) {\n\t\t\t\t\t\tthrow new PackMissingDependencyError(pack.name, table);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.schemas !== undefined) {\n\t\t\t\tfor (const [table, schema] of Object.entries(pack.schemas)) {\n\t\t\t\t\tengine.registerSchema(table, schema);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.permissions !== undefined) {\n\t\t\t\tfor (const [table, rules] of Object.entries(pack.permissions)) {\n\t\t\t\t\tengine.registerPermissions(table, rules);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.readers !== undefined) {\n\t\t\t\tfor (const [table, reader] of Object.entries(pack.readers)) {\n\t\t\t\t\tengine.registerReader(table, reader);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.writers !== undefined) {\n\t\t\t\tfor (const [table, writer] of Object.entries(pack.writers)) {\n\t\t\t\t\tengine.registerWriter(table, writer);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.crdt !== undefined) {\n\t\t\t\tfor (const [table, fields] of Object.entries(pack.crdt)) {\n\t\t\t\t\tengine.registerCrdt(table, fields);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const collection of pack.collections ?? []) {\n\t\t\t\tengine.register(collection);\n\t\t\t}\n\t\t\tfor (const collection of pack.joinCollections ?? []) {\n\t\t\t\tengine.registerJoin(collection);\n\t\t\t}\n\t\t\tfor (const collection of pack.graphCollections ?? []) {\n\t\t\t\tengine.registerGraph(collection);\n\t\t\t}\n\t\t\tfor (const collection of pack.searchCollections ?? []) {\n\t\t\t\tengine.registerSearch(collection);\n\t\t\t}\n\t\t\tfor (const query of pack.reactiveQueries ?? []) {\n\t\t\t\tengine.registerReactive(query);\n\t\t\t}\n\t\t\tfor (const mutation of pack.mutations ?? []) {\n\t\t\t\tengine.registerMutation(mutation);\n\t\t\t}\n\t\t\tfor (const schedule of pack.schedules ?? []) {\n\t\t\t\tengine.registerSchedule(schedule);\n\t\t\t}\n\t\t\tfor (const table of pack.ownsTables) {\n\t\t\t\tpackTableOwners.set(table, pack.name);\n\t\t\t}\n\t\t\tregisteredPacks.push({\n\t\t\t\tname: pack.name,\n\t\t\t\tversion: pack.version,\n\t\t\t\townsTables: [...pack.ownsTables],\n\t\t\t\treadsTables: [...(pack.readsTables ?? [])]\n\t\t\t});\n\t\t},\n\n\t\tinspect: () => {\n\t\t\tconst collections = [...registry.entries()].map(([name, def]) => {\n\t\t\t\tconst kind = ((def as { kind?: CollectionKind }).kind ??\n\t\t\t\t\t'view') as CollectionKind;\n\t\t\t\tlet tables: string[] = [];\n\t\t\t\tif (kind === 'join') {\n\t\t\t\t\tconst join = def as JoinCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>;\n\t\t\t\t\ttables = [join.left.table, join.right.table];\n\t\t\t\t} else if (kind === 'graph') {\n\t\t\t\t\ttables = (\n\t\t\t\t\t\tdef as GraphCollectionDefinition<\n\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\tunknown\n\t\t\t\t\t\t>\n\t\t\t\t\t).query.tables();\n\t\t\t\t} else if (kind === 'search') {\n\t\t\t\t\ttables = [\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\tdef as SearchCollectionDefinition<\n\t\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\t\tunknown\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t).table\n\t\t\t\t\t];\n\t\t\t\t} else if (kind === 'view') {\n\t\t\t\t\ttables = (\n\t\t\t\t\t\tdef as CollectionDefinition<unknown, unknown, unknown>\n\t\t\t\t\t).tables ?? [name];\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\tkind,\n\t\t\t\t\ttables,\n\t\t\t\t\tsubscriptions: active.get(name)?.size ?? 0\n\t\t\t\t};\n\t\t\t});\n\t\t\tconst DEVTOOLS_RECENT = 50;\n\t\t\treturn {\n\t\t\t\tversion,\n\t\t\t\tcollections,\n\t\t\t\tmutations: [...mutations.keys()],\n\t\t\t\tschedules: [...schedules.values()].map((schedule) => ({\n\t\t\t\t\tname: schedule.name,\n\t\t\t\t\tpattern: schedule.pattern\n\t\t\t\t})),\n\t\t\t\treaders: [...readers.keys()],\n\t\t\t\twriters: [...writers.keys()],\n\t\t\t\trecentChanges: changeLog\n\t\t\t\t\t.slice(-DEVTOOLS_RECENT)\n\t\t\t\t\t.map((entry) => ({\n\t\t\t\t\t\tversion: entry.version,\n\t\t\t\t\t\ttable: entry.table,\n\t\t\t\t\t\top: entry.change.op\n\t\t\t\t\t})),\n\t\t\t\tpacks: registeredPacks.map((pack) => ({\n\t\t\t\t\tname: pack.name,\n\t\t\t\t\tversion: pack.version,\n\t\t\t\t\townsTables: [...pack.ownsTables],\n\t\t\t\t\treadsTables: [...pack.readsTables]\n\t\t\t\t}))\n\t\t\t};\n\t\t},\n\n\t\tmetrics: () => {\n\t\t\tconst now = Date.now();\n\t\t\tconst byCollection: Record<string, number> = {};\n\t\t\tlet totalSubscriptions = 0;\n\t\t\tfor (const [name, subs] of active) {\n\t\t\t\tbyCollection[name] = subs.size;\n\t\t\t\ttotalSubscriptions += subs.size;\n\t\t\t}\n\t\t\tconst oldest = changeLog[0];\n\t\t\treturn {\n\t\t\t\tat: now,\n\t\t\t\tchangeLog: {\n\t\t\t\t\tcapacity: changeLogSize,\n\t\t\t\t\tentries: changeLog.length,\n\t\t\t\t\toldestAgeMs: oldest ? now - oldest.at : null,\n\t\t\t\t\toldestVersion: oldest ? oldest.version : null,\n\t\t\t\t\tretainMs: changeLogRetainMs\n\t\t\t\t},\n\t\t\t\tmutations: {\n\t\t\t\t\tcompleted: mutationsCompleted,\n\t\t\t\t\tfailed: mutationsFailed,\n\t\t\t\t\tinFlight: mutationsInFlight,\n\t\t\t\t\tretried: mutationsRetried\n\t\t\t\t},\n\t\t\t\treactiveCache: {\n\t\t\t\t\tcapacity: reactiveCacheMax,\n\t\t\t\t\tentries: cachedReruns.size\n\t\t\t\t},\n\t\t\t\tschedules: {\n\t\t\t\t\tregistered: schedules.size\n\t\t\t\t},\n\t\t\t\tsubscriptions: {\n\t\t\t\t\tbyCollection,\n\t\t\t\t\ttotal: totalSubscriptions\n\t\t\t\t},\n\t\t\t\tuptimeMs: now - engineStartedAt,\n\t\t\t\tversion\n\t\t\t};\n\t\t},\n\n\t\tonActivity: (listener) => {\n\t\t\tactivityListeners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tactivityListeners.delete(listener);\n\t\t\t};\n\t\t},\n\n\t\tstreamChanges: ({\n\t\t\tsince = 0,\n\t\t\tsignal,\n\t\t\tmaxBuffer = 10_000\n\t\t}: StreamChangesOptions = {}) => {\n\t\t\t// Detect a gap up front so the consumer's `for await` sees the\n\t\t\t// throw immediately rather than after the first historical entry.\n\t\t\t// (We tolerate `since === 0`, which means \"give me everything in\n\t\t\t// the log\"; the gap check only kicks in for a non-zero cursor.)\n\t\t\tconst oldest = changeLog[0];\n\t\t\tif (\n\t\t\t\tsince > 0 &&\n\t\t\t\toldest !== undefined &&\n\t\t\t\toldest.version > since + 1\n\t\t\t) {\n\t\t\t\tconst err = new MissedChangesError(since, oldest.version);\n\t\t\t\treturn {\n\t\t\t\t\t[Symbol.asyncIterator]() {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tnext: () => Promise.reject(err)\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Register the subscriber BEFORE snapshotting history so a commit\n\t\t\t// landing between the snapshot and the live tail can't be missed.\n\t\t\t// Phase 2 dedupes against `cursor`.\n\t\t\tconst buffer: LoggedChange[] = [];\n\t\t\tlet waiter: (() => void) | null = null;\n\t\t\tlet overflow = false;\n\t\t\tconst wake = () => {\n\t\t\t\tif (waiter !== null) {\n\t\t\t\t\tconst resume = waiter;\n\t\t\t\t\twaiter = null;\n\t\t\t\t\tresume();\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst subscriber = (entry: LoggedChange) => {\n\t\t\t\tif (buffer.length >= maxBuffer) {\n\t\t\t\t\toverflow = true;\n\t\t\t\t\twake();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbuffer.push(entry);\n\t\t\t\twake();\n\t\t\t};\n\t\t\tstreamSubscribers.add(subscriber);\n\n\t\t\tconst onAbort = () => wake();\n\t\t\tsignal?.addEventListener('abort', onAbort, { once: true });\n\n\t\t\tlet lastDelivered = since;\n\n\t\t\treturn {\n\t\t\t\tasync *[Symbol.asyncIterator]() {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Phase 1: historical entries. Copy the array so a\n\t\t\t\t\t\t// concurrent log.shift() (when the ring buffer rotates)\n\t\t\t\t\t\t// can't surprise us mid-iteration.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// A single batched mutation writes N rows that all\n\t\t\t\t\t\t// share one version, so we filter on `entry.version >\n\t\t\t\t\t\t// since` directly (no per-yield cursor bump — that\n\t\t\t\t\t\t// would deliver only the first row of every batch).\n\t\t\t\t\t\tconst history = [...changeLog];\n\t\t\t\t\t\tconst headVersion =\n\t\t\t\t\t\t\thistory.length > 0\n\t\t\t\t\t\t\t\t? history[history.length - 1]!.version\n\t\t\t\t\t\t\t\t: since;\n\t\t\t\t\t\tfor (const entry of history) {\n\t\t\t\t\t\t\tif (signal?.aborted) return;\n\t\t\t\t\t\t\tif (entry.version > since) {\n\t\t\t\t\t\t\t\tlastDelivered = entry.version;\n\t\t\t\t\t\t\t\tyield entry;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Phase 2: live tail. Dedupe against `headVersion`\n\t\t\t\t\t\t// (the head of the log when phase 1 finished): any\n\t\t\t\t\t\t// buffered entry with `version <= headVersion` was\n\t\t\t\t\t\t// already yielded from history (a commit between\n\t\t\t\t\t\t// subscriber registration and the snapshot lands in\n\t\t\t\t\t\t// both the buffer and the snapshot).\n\t\t\t\t\t\twhile (!signal?.aborted) {\n\t\t\t\t\t\t\twhile (buffer.length > 0) {\n\t\t\t\t\t\t\t\tconst entry = buffer.shift()!;\n\t\t\t\t\t\t\t\tif (entry.version > headVersion) {\n\t\t\t\t\t\t\t\t\tlastDelivered = entry.version;\n\t\t\t\t\t\t\t\t\tyield entry;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (overflow) {\n\t\t\t\t\t\t\t\tthrow new CdcConsumerSlowError(\n\t\t\t\t\t\t\t\t\tmaxBuffer,\n\t\t\t\t\t\t\t\t\tlastDelivered\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (signal?.aborted) return;\n\t\t\t\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\t\t\t\twaiter = resolve;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tstreamSubscribers.delete(subscriber);\n\t\t\t\t\t\tsignal?.removeEventListener('abort', onAbort);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n\n\treturn engine;\n};\n",
17
+ "import type {\n\tCollectionContext,\n\tCollectionDefinition,\n\tJoinCollectionDefinition\n} from './collection';\nimport { createEquiJoin } from './equiJoin';\nimport type { EquiJoin } from './equiJoin';\nimport type { GraphCollectionDefinition, GraphInstance } from './graph';\nimport { createMaterializedView, isEmptyViewDiff } from './materializedView';\nimport type { MaterializedView } from './materializedView';\nimport type {\n\tMutationActions,\n\tMutationDefinition,\n\tTableWriter,\n\tTransactionRunner\n} from './mutation';\nimport type {\n\tReactiveQueryDefinition,\n\tReadHandle,\n\tTableReader\n} from './reactive';\nimport {\n\texponentialBackoff,\n\tisSerializationFailure,\n\tRetriesExhaustedError\n} from './retry';\nimport {\n\ttype BridgeFetchConfig,\n\ttype HandlerMetricsHook,\n\ttype HandlerMetricsRecord,\n\tmakeSandboxedHandler\n} from './sandbox';\nimport type {\n\tPermissionsDefinition,\n\tReadRule,\n\tTablePermissions,\n\tWriteRule\n} from './permissions';\nimport { PackMissingDependencyError, PackTableConflictError } from './pack';\nimport type { RegisteredPack, SyncPack } from './pack';\nimport type { SearchCollectionDefinition, SearchIndex } from './search';\nimport { SEARCH_SCORE_FIELD } from './search';\nimport type { ScheduleDefinition } from './schedule';\nimport type {\n\tCollectionKind,\n\tEngineActivity,\n\tEngineInspection,\n\tEngineMetrics\n} from './devtools';\nimport type { SchemaDefinition, TableSchema } from './schema';\nimport type { CrdtMergeable } from '../crdt';\nimport type { ClusterBus } from './cluster';\nimport type { ChangeSource, RowChange, RowKey, ViewDiff } from './types';\n\n/**\n * Which fields of a `Row` are CRDT values, and the {@link CrdtMergeable} backend\n * (e.g. `rgaText`, or `yjsText` from `@absolutejs/sync-yjs`) used to merge each.\n * Pass to `engine.registerCrdt` so the engine merges those fields on write.\n */\nexport type CrdtFields<Row> = {\n\t[Field in keyof Row]?: CrdtMergeable<Row[Field]>;\n};\n\n/**\n * Thrown when `authorize` denies a subscribe or a mutation. The message names\n * the denied action; the message always starts with \"Not authorized\".\n */\nexport class UnauthorizedError extends Error {\n\tconstructor(subject: string) {\n\t\tsuper(`Not authorized: ${subject}`);\n\t\tthis.name = 'UnauthorizedError';\n\t}\n}\n\n/**\n * Thrown by `engine.subscribe` / `engine.hydrate` (1.15.0+) when the caller's\n * `AbortSignal` fires before the operation reaches a `Subscription` /\n * resolved value. The `name` is `'AbortError'` to match the DOM-standard\n * spelling so existing `catch (error) { if (error.name === 'AbortError') ... }`\n * patterns work unchanged.\n */\nexport class AbortError extends Error {\n\tconstructor(reason?: string) {\n\t\tsuper(reason ?? 'Aborted');\n\t\tthis.name = 'AbortError';\n\t}\n}\n\nconst checkAborted = (signal?: AbortSignal): void => {\n\tif (signal?.aborted) {\n\t\tthrow new AbortError(\n\t\t\tsignal.reason instanceof Error\n\t\t\t\t? signal.reason.message\n\t\t\t\t: typeof signal.reason === 'string'\n\t\t\t\t\t? signal.reason\n\t\t\t\t\t: 'Aborted'\n\t\t);\n\t}\n};\n\nconst linkAbortToUnsubscribe = (\n\tsignal: AbortSignal | undefined,\n\tunsubscribe: () => void\n): void => {\n\tif (signal === undefined) return;\n\tif (signal.aborted) {\n\t\tunsubscribe();\n\t\treturn;\n\t}\n\tconst handler = () => {\n\t\ttry {\n\t\t\tunsubscribe();\n\t\t} catch {\n\t\t\t/* idempotent unsubscribes shouldn't surface here */\n\t\t}\n\t};\n\tsignal.addEventListener('abort', handler, { once: true });\n};\n\n/**\n * Thrown when a mutation's write fails its table's schema (see\n * {@link defineSchema}). The message names the offending field.\n */\nexport class SchemaError extends Error {\n\tconstructor(table: string, fieldName: string) {\n\t\tsuper(`Schema violation on \"${table}\": invalid field \"${fieldName}\"`);\n\t\tthis.name = 'SchemaError';\n\t}\n}\n\nexport type SubscribeArgs<T, P, Ctx> = {\n\t/** Registered collection name. */\n\tcollection: string;\n\t/** Query params (e.g. a filter value); passed to hydrate/match/authorize. */\n\tparams: P;\n\t/** Caller context (e.g. session); passed to hydrate/match/authorize. */\n\tctx: Ctx;\n\t/**\n\t * Receives every non-empty diff (with its version) after the initial\n\t * reply. 1.18.0+: a third optional `cursor` argument carries the\n\t * cross-instance resume cursor as of this diff. Callers that ignore\n\t * the 3rd arg keep working unchanged.\n\t */\n\tonDiff: (diff: ViewDiff<T>, version: number, cursor?: string) => void;\n\t/**\n\t * Resume from a point the client already applied. When the change log still\n\t * covers `(since, now]` for a single-table collection, the engine replies\n\t * with a catch-up diff instead of a full snapshot; otherwise it falls back\n\t * to a snapshot.\n\t *\n\t * Accepts `number` (legacy pre-1.17 — interpreted as the version of THIS\n\t * engine instance) or a `string` cursor (1.17.0+ — opaque vector of\n\t * `(instanceId, version)` per origin, returned by the engine on every\n\t * subscription/diff and round-tripped by the client unmodified). Use the\n\t * cursor form for cross-instance resume.\n\t */\n\tsince?: number | string;\n\t/**\n\t * Cancellation handle (1.15.0). Two effects:\n\t * 1. If the signal is already aborted when `subscribe` is called, the\n\t * engine throws {@link AbortError} immediately — no authorize, no\n\t * hydrate, no subscription.\n\t * 2. If the signal fires AFTER the subscription is live, the engine\n\t * auto-calls `unsubscribe()`. The consumer never has to thread two\n\t * handles for the same lifetime.\n\t *\n\t * Backwards-compatible — omit `signal` and the engine behaves exactly\n\t * as in pre-1.15.0.\n\t */\n\tsignal?: AbortSignal;\n};\n\nexport type Subscription<T> = {\n\t/** The result set at subscribe time — a snapshot (empty when resuming). */\n\tinitial: T[];\n\t/** Catch-up diff when resuming via `since` (instead of `initial`). */\n\tcatchup?: ViewDiff<T>;\n\t/** The engine's local version this reply brings the client up to. */\n\tversion: number;\n\t/**\n\t * Opaque cross-instance resume cursor (1.17.0+). Encodes the per-origin\n\t * vector of `(instanceId, version)` the client is now up-to-date with;\n\t * pass it back as `SubscribeArgs.since` on reconnect. Works for resume\n\t * against ANY instance in a cluster, not just the one that issued it —\n\t * the receiving instance decodes the cursor, walks its log for entries\n\t * the client hasn't seen yet, and either replies with a catch-up diff\n\t * or a fresh snapshot.\n\t */\n\tcursor: string;\n\t/** Stop receiving diffs and release the view. */\n\tunsubscribe: () => void;\n};\n\nexport type SyncEngine = {\n\t/** Register a collection definition (see {@link defineCollection}). */\n\tregister: <T, P = void, Ctx = CollectionContext>(\n\t\tcollection: CollectionDefinition<T, P, Ctx>\n\t) => void;\n\t/** Register an incremental join collection (see {@link defineJoinCollection}). */\n\tregisterJoin: <L, R, Out, P = void, Ctx = CollectionContext>(\n\t\tcollection: JoinCollectionDefinition<L, R, Out, P, Ctx>\n\t) => void;\n\t/** Register an operator-graph collection (see {@link defineGraphCollection}). */\n\tregisterGraph: <Out, P = void, Ctx = CollectionContext>(\n\t\tcollection: GraphCollectionDefinition<Out, P, Ctx>\n\t) => void;\n\t/**\n\t * Register a live search collection (see {@link defineSearchCollection}): a\n\t * full-text or vector index maintained from a source table's change feed and\n\t * queried by the subscription's params, returning the ranked top-K live.\n\t */\n\tregisterSearch: <T, Query = string, Ctx = CollectionContext>(\n\t\tcollection: SearchCollectionDefinition<T, Query, Ctx>\n\t) => void;\n\t/**\n\t * Register a scheduled function (see {@link defineSchedule}): server-triggered\n\t * work whose `actions` writes go live through the change feed. Wire the cron\n\t * triggers with the `scheduled` Elysia plugin.\n\t */\n\tregisterSchedule: (schedule: ScheduleDefinition) => void;\n\t/**\n\t * Run a registered schedule's handler now: its writes commit (in the\n\t * configured transaction) and emit as one live batch. The `scheduled` plugin\n\t * calls this on each cron fire; call it directly to trigger on demand.\n\t */\n\trunSchedule: (name: string) => Promise<void>;\n\t/** Registered schedules (name + cron pattern) — used by the `scheduled` plugin. */\n\tlistSchedules: () => ScheduleDefinition[];\n\t/**\n\t * Open a live subscription: authorize, hydrate the initial set, and stream\n\t * diffs as changes arrive. Rejects with {@link UnauthorizedError} on deny.\n\t */\n\tsubscribe: <T, P = void, Ctx = CollectionContext>(\n\t\targs: SubscribeArgs<T, P, Ctx>\n\t) => Promise<Subscription<T>>;\n\t/**\n\t * One-shot read: authorize and return a collection's current rows without\n\t * subscribing. Powers an Eden-typed HTTP hydrate route (and SSR). Rejects\n\t * with {@link UnauthorizedError} on deny.\n\t *\n\t * Pass `options.signal` (1.15.0+) to cancel the operation mid-flight —\n\t * the engine throws {@link AbortError} after the next await point if\n\t * the signal has fired.\n\t */\n\thydrate: (\n\t\tcollection: string,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\toptions?: { signal?: AbortSignal }\n\t) => Promise<unknown[]>;\n\t/**\n\t * Feed a committed change to `table` into the engine, fanning the resulting\n\t * diff to every live subscription of every collection that reads that table.\n\t * Call after a mutation, or wire a {@link ChangeSource} via `connectSource`.\n\t * Single-table subscriptions diff the row; multi-table / refetch ones\n\t * re-hydrate.\n\t */\n\tapplyChange: <T>(table: string, change: RowChange<T>) => Promise<void>;\n\t/**\n\t * Connect a change source (e.g. a CDC adapter): its emitted changes flow into\n\t * `applyChange`. Resolves to a disconnect function that stops the source.\n\t */\n\tconnectSource: (source: ChangeSource) => Promise<() => Promise<void>>;\n\t/**\n\t * Join a cluster (see {@link ClusterBus}): broadcast this instance's committed\n\t * changes to peers and apply theirs locally, so subscribers on every instance\n\t * stay live. Resolves to a disconnect function. Run once per instance.\n\t */\n\tconnectCluster: (bus: ClusterBus) => Promise<() => Promise<void>>;\n\t/** Active subscription count, optionally for one collection. */\n\tsubscriptionCount: (collection?: string) => number;\n\t/** Register a mutation definition (see {@link defineMutation}). */\n\tregisterMutation: <Args, Ctx = CollectionContext, Result = unknown>(\n\t\tmutation: MutationDefinition<Args, Ctx, Result>\n\t) => void;\n\t/**\n\t * Register how to persist a `table` (any ORM), so a mutation's\n\t * `actions.insert/update/delete` write to your store and emit the live change\n\t * in one step — you can't write without going live. See {@link TableWriter}.\n\t */\n\tregisterWriter: <Row = unknown, Ctx = CollectionContext, Tx = unknown>(\n\t\ttable: string,\n\t\twriter: TableWriter<Row, Ctx, Tx>\n\t) => void;\n\t/**\n\t * Register a read-set-tracked reactive query (see {@link defineReactiveQuery}):\n\t * it re-runs and re-pushes whenever any table it read changes — no `match`, no\n\t * operator graph, no manual change emission.\n\t */\n\tregisterReactive: <T, P = void, Ctx = CollectionContext>(\n\t\tquery: ReactiveQueryDefinition<T, P, Ctx>\n\t) => void;\n\t/**\n\t * Teach the engine how to read a table for reactive queries' `ctx.db` (any\n\t * ORM). Required for every table a reactive query reads.\n\t */\n\tregisterReader: <Ctx = CollectionContext>(\n\t\ttable: string,\n\t\treader: TableReader<Ctx>\n\t) => void;\n\t/**\n\t * Register declarative, row-level permissions for a `table` (see\n\t * {@link definePermissions}). Read rules filter every row the engine emits for\n\t * the table; write rules gate `actions.insert/update/delete`. Equivalent to a\n\t * `permissions` entry on {@link createSyncEngine}.\n\t */\n\tregisterPermissions: <Row = unknown, Ctx = CollectionContext>(\n\t\ttable: string,\n\t\trules: TablePermissions<Row, Ctx>\n\t) => void;\n\t/**\n\t * Register a `table`'s schema (see {@link defineSchema}): writes are validated\n\t * against it (a bad write rejects the mutation with {@link SchemaError}), and\n\t * its `migrate` lazily upcasts rows on read. Equivalent to a `schemas` entry\n\t * on {@link createSyncEngine}.\n\t */\n\tregisterSchema: <Row = unknown>(\n\t\ttable: string,\n\t\tschema: TableSchema<Row>\n\t) => void;\n\t/**\n\t * Declare which fields on a `table` are CRDT values (see {@link CrdtMergeable}\n\t * — e.g. `rgaText` from `@absolutejs/sync/crdt`, or `yjsText` from\n\t * `@absolutejs/sync-yjs`). The engine then MERGES those fields on\n\t * `actions.insert/update` instead of overwriting them, so concurrent writers\n\t * converge with no clobbering — conflict-free collaborative editing with no\n\t * merge code in your mutation. It also registers a ready-made\n\t * `\"<table>:merge\"` mutation that upserts a row patch, so a client (e.g. the\n\t * `useCollaborativeText` framework hooks) needs no custom server mutation.\n\t */\n\tregisterCrdt: <Row = Record<string, unknown>>(\n\t\ttable: string,\n\t\tfields: CrdtFields<Row>\n\t) => void;\n\t/**\n\t * Apply a table's schema `migrate` to a raw/stored row (identity when there's\n\t * no schema or migration). Use it wherever you read raw rows the engine\n\t * doesn't (e.g. a search collection's `source`); the engine already migrates\n\t * reactive `ctx.db` reads, view hydrates, and the one-shot hydrate.\n\t */\n\tmigrate: <Row = unknown>(table: string, row: Row) => Row;\n\t/**\n\t * Run a registered mutation: authorize, invoke its handler (which writes and\n\t * emits changes via `applyChange`), and resolve with the handler's result.\n\t * Rejects with {@link UnauthorizedError} on deny, or an error for an unknown\n\t * mutation / a handler throw. Drive this from the transport's mutate frame.\n\t */\n\trunMutation: (\n\t\tname: string,\n\t\targs: unknown,\n\t\tctx: unknown\n\t) => Promise<unknown>;\n\t/**\n\t * Atomically run N mutations in a single transaction (sync 1.11+).\n\t * Each `{ name, args }` spec is authorized, then handlers fire in\n\t * order against shared buffered changes. If any handler throws, the\n\t * entire transaction rolls back — no partial commits, no fanned-out\n\t * diffs. On success the accumulated changes apply as ONE live batch\n\t * and the per-mutation results return in order.\n\t *\n\t * No retry policy applies to batches in v0.2; configure per-mutation\n\t * retries on individual `runMutation` calls when atomicity isn't\n\t * needed. A failed batch passes the original error through with no\n\t * wrapping.\n\t *\n\t * Requires `transaction` to be set in {@link SyncEngineOptions} for\n\t * actual DB-level atomicity; without it the batch still buffers\n\t * changes into one fan-out but the underlying adapter writes\n\t * piecemeal.\n\t */\n\trunMutations: (\n\t\tspecs: Array<{ name: string; args: unknown }>,\n\t\tctx: unknown\n\t) => Promise<unknown[]>;\n\t/**\n\t * A point-in-time snapshot of the engine for devtools: registered collections\n\t * (+ kind, tables, live subscription counts), mutations, schedules, readers,\n\t * writers, the change-feed version, and recent changes. See `syncDevtools`.\n\t */\n\tinspect: () => EngineInspection;\n\t/**\n\t * Operator-shaped engine metrics — counters + memory estimates + throughput\n\t * totals since engine start. Distinct from {@link SyncEngine.inspect}: this\n\t * is what a PaaS host scrapes on an interval to answer \"is this engine\n\t * healthy\" and \"what's its resource footprint.\" Feed it to\n\t * `@absolutejs/metering` for per-engine cost attribution.\n\t *\n\t * Added in 1.13.0.\n\t */\n\tmetrics: () => EngineMetrics;\n\t/**\n\t * Subscribe to the live engine activity stream (changes, mutation outcomes,\n\t * subscribe/unsubscribe). Returns an unsubscribe. Powers the devtools feed.\n\t */\n\tonActivity: (listener: (event: EngineActivity) => void) => () => void;\n\t/**\n\t * Outbound CDC stream — yield every committed change as a {@link LoggedChange},\n\t * historical first (entries with `version > since`) then continuously tailing\n\t * live commits. Use it to feed downstream pipelines (Kafka, search indexers,\n\t * audit logs, analytics warehouses).\n\t *\n\t * The iterator is notify-driven (no polling): it parks on a Promise that\n\t * resolves the instant a new commit lands.\n\t *\n\t * If `since` falls before the oldest entry retained in the bounded change\n\t * log, the iterator throws {@link MissedChangesError} so the consumer\n\t * notices the gap instead of silently skipping commits. Resubscribe with\n\t * `since = engine.inspect().recentChanges[0].version` after re-bootstrapping.\n\t *\n\t * If the consumer iterates slower than the engine commits and the in-flight\n\t * buffer overflows (`maxBuffer`, default 10000), the iterator throws\n\t * {@link CdcConsumerSlowError} for the same reason.\n\t *\n\t * @example\n\t * for await (const entry of engine.streamChanges({ since: lastCursor })) {\n\t * await kafka.send('sync.changes', JSON.stringify(entry));\n\t * lastCursor = entry.version;\n\t * }\n\t */\n\tstreamChanges: (\n\t\toptions?: StreamChangesOptions\n\t) => AsyncIterable<LoggedChange>;\n\t/**\n\t * Register a {@link SyncPack} — a self-contained bundle of schemas,\n\t * permissions, readers/writers, collections, mutations, and schedules.\n\t * Dispatches each field to the matching `register*` method. Rejects\n\t * with {@link PackTableConflictError} if the pack claims a table\n\t * another registered pack already owns; with\n\t * {@link PackMissingDependencyError} if `requireDependencies` is set\n\t * and a `readsTables` entry has no registered reader.\n\t *\n\t * See `syncPacks.design.md` for the rationale.\n\t */\n\tregisterPack: (pack: SyncPack) => void;\n};\n\n/**\n * 1.18.0: `OnDiff` receives an opaque `cursor` string alongside the version.\n * The cursor is the engine's cross-instance resume cursor as of this batch\n * — the connection layer forwards it to the client on the wire so a\n * reconnect can resume across shards. Pre-1.18 callers that ignore the 3rd\n * arg keep working unchanged.\n */\ntype OnDiff = (diff: ViewDiff<unknown>, version: number, cursor?: string) => void;\n\ntype JoinState = {\n\top: EquiJoin<unknown, unknown, unknown>;\n\tleftTable: string;\n\trightTable: string;\n\t/** Per-side filters (bound to params/ctx) — a failing change leaves the join. */\n\tleftMatch?: (row: unknown) => boolean;\n\trightMatch?: (row: unknown) => boolean;\n};\n\ntype ActiveSubscription =\n\t| {\n\t\t\tkind: 'view';\n\t\t\tcollection: string;\n\t\t\tview: MaterializedView<unknown>;\n\t\t\t/** Incremental (has a predicate) vs refetch fallback. */\n\t\t\tincremental: boolean;\n\t\t\t/** Re-run the bound hydrate for the refetch fallback. */\n\t\t\trehydrate: () => Promise<Iterable<unknown>>;\n\t\t\t/** Result-row identity (used to net a batch's diffs). */\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'join';\n\t\t\tcollection: string;\n\t\t\tjoin: JoinState;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'graph';\n\t\t\tcollection: string;\n\t\t\tinstance: GraphInstance<unknown>;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'reactive';\n\t\t\tcollection: string;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\t/** Re-run; returns the new rows and the read set (tables/keys/ranges). */\n\t\t\trerun: () => Promise<{\n\t\t\t\trows: unknown[];\n\t\t\t\treadTables: Set<string>;\n\t\t\t\treadKeys: Set<string>;\n\t\t\t\trangeDeps: RangeDep[];\n\t\t\t}>;\n\t\t\t/**\n\t\t\t * Stable key over `(collection, params, ctx)`. Subscriptions sharing\n\t\t\t * the same key are equivalent on the read side, so a single rerun\n\t\t\t * per change batch can serve all of them (see `reactivePairs`).\n\t\t\t */\n\t\t\trerunKey: string;\n\t\t\t/** Current result set, keyed (diffed against the next re-run). */\n\t\t\tcurrent: Map<RowKey, unknown>;\n\t\t\t/** Full-table dependencies (from `db.all`). */\n\t\t\treadTables: Set<string>;\n\t\t\t/** Row-level dependencies `table\\0key` (from `db.get`). */\n\t\t\treadKeys: Set<string>;\n\t\t\t/** Range dependencies (from `db.where`) — predicate + matched keys. */\n\t\t\trangeDeps: RangeDep[];\n\t\t\tonDiff: OnDiff;\n\t }\n\t| {\n\t\t\tkind: 'search';\n\t\t\tcollection: string;\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\t/** Re-run the search against the (now-updated) shared index. */\n\t\t\trerun: () => unknown[];\n\t\t\t/** Current ranked result set, keyed (diffed against the next re-run). */\n\t\t\tcurrent: Map<RowKey, unknown>;\n\t\t\tonDiff: OnDiff;\n\t };\n\n/** A `db.where` dependency: the predicate plus the keys that matched at read. */\ntype RangeDep = {\n\ttable: string;\n\tpredicate: (row: unknown) => boolean;\n\tkeys: Set<RowKey>;\n};\n\n/**\n * A single committed change as it appears in the engine's change log and on\n * the {@link SyncEngine.streamChanges} CDC stream. Versions are monotonic\n * across the engine: a single mutation that writes N rows emits N entries\n * all sharing the same `version`.\n */\nexport type LoggedChange = {\n\t/** This engine's local monotonic version when the change was logged. */\n\tversion: number;\n\ttable: string;\n\tchange: RowChange<unknown>;\n\t/**\n\t * Wall-clock when this change was logged (Date.now()). Used by the\n\t * engine's time-based retention sweep (`changeLogRetainMs`) and\n\t * surfaced as the change-log age in {@link SyncEngine.metrics}.\n\t * Added in 1.13.0; pre-1.13.0 consumers of `LoggedChange` ignore it.\n\t */\n\tat: number;\n\t/**\n\t * Instance id that originated this change. For locally-committed changes\n\t * this is the engine's own `instanceId`; for cluster-received changes,\n\t * the originating peer's id.\n\t *\n\t * Added in 1.17.0; pre-1.17 consumers ignore it.\n\t */\n\torigin: string;\n\t/**\n\t * The ORIGINATOR's local version at commit time. For locally-committed\n\t * changes this equals `version`; for cluster-received changes, the\n\t * peer's version. Resume cursors (1.17.0+) carry `(origin, originVersion)`\n\t * pairs so a client's last-seen point matches against peer entries this\n\t * engine has logged via the bus.\n\t *\n\t * Added in 1.17.0; pre-1.17 consumers ignore it.\n\t */\n\toriginVersion: number;\n};\n\n/** Thrown by {@link SyncEngine.streamChanges} when `since` is older than the\n * oldest entry retained in the bounded change log (i.e. the consumer was\n * disconnected long enough that the engine has lost the diff). The consumer\n * should re-bootstrap from a fresh hydrate and resume from `availableSince`. */\nexport class MissedChangesError extends Error {\n\treadonly requestedSince: number;\n\treadonly availableSince: number;\n\tconstructor(requestedSince: number, availableSince: number) {\n\t\tsuper(\n\t\t\t`Change log no longer covers version ${requestedSince}; oldest available is ${availableSince}. ` +\n\t\t\t\t`Re-bootstrap and resume from ${availableSince}.`\n\t\t);\n\t\tthis.name = 'MissedChangesError';\n\t\tthis.requestedSince = requestedSince;\n\t\tthis.availableSince = availableSince;\n\t}\n}\n\n/** Options for {@link SyncEngine.streamChanges}. */\nexport type StreamChangesOptions = {\n\t/**\n\t * Last version the consumer has already processed. The stream yields\n\t * entries with `version > since`. Defaults to `0` (replay everything in\n\t * the log, then tail).\n\t */\n\tsince?: number;\n\t/**\n\t * Cancel the stream cleanly. When the signal aborts, the iterator\n\t * resolves to `done` on its next yield and unregisters its subscriber.\n\t */\n\tsignal?: AbortSignal;\n\t/**\n\t * Hard cap on the in-flight buffer for this consumer. If the engine\n\t * commits faster than the consumer iterates and the buffer overflows,\n\t * the stream rejects so the consumer notices instead of silently\n\t * skipping entries. Defaults to 10000.\n\t */\n\tmaxBuffer?: number;\n};\n\n/** Thrown by {@link SyncEngine.streamChanges} when the consumer fell so far\n * behind that the in-flight buffer overflowed. Resubscribe from the last\n * cursor the consumer successfully processed. */\nexport class CdcConsumerSlowError extends Error {\n\treadonly maxBuffer: number;\n\treadonly lastDeliveredVersion: number;\n\tconstructor(maxBuffer: number, lastDeliveredVersion: number) {\n\t\tsuper(\n\t\t\t`CDC stream buffer overflowed (max ${maxBuffer}); consumer fell behind. ` +\n\t\t\t\t`Last delivered version: ${lastDeliveredVersion}. Resubscribe with since=${lastDeliveredVersion}.`\n\t\t);\n\t\tthis.name = 'CdcConsumerSlowError';\n\t\tthis.maxBuffer = maxBuffer;\n\t\tthis.lastDeliveredVersion = lastDeliveredVersion;\n\t}\n}\n\nexport type SyncEngineOptions = {\n\t/**\n\t * Stable identifier for this engine instance. Defaults to a per-process\n\t * random UUID. Pass a stable value (e.g. `${hostname}:${shardId}`) when\n\t * running a fleet of engines behind a cluster bus — 1.17.0+ resume\n\t * cursors carry the originating `instanceId`, so a client that reconnects\n\t * to a different shard can request a catch-up against the original's\n\t * change feed only if that instance's id matches a peer the new shard\n\t * knows about.\n\t */\n\tinstanceId?: string;\n\t/**\n\t * How many recent changes to retain for resumable reconnects. A client that\n\t * reconnects within this window gets a catch-up diff; beyond it, a fresh\n\t * snapshot. Defaults to 1024.\n\t */\n\tchangeLogSize?: number;\n\t/**\n\t * Time-based change-log retention: drop entries older than this many ms,\n\t * in addition to the count cap above. Lets a high-throughput engine keep\n\t * a SHORT log (e.g. \"60s of changes\") regardless of count, which both\n\t * bounds memory and bounds the catch-up work on reconnect. Defaults to\n\t * `null` — only the count cap (`changeLogSize`) applies.\n\t *\n\t * Added in 1.13.0.\n\t */\n\tchangeLogRetainMs?: number | null;\n\t/**\n\t * Run every mutation inside your database's transaction (see\n\t * {@link TransactionRunner}): the handler's writes commit all-or-nothing, and\n\t * the engine emits the resulting diff only after the commit. Omit to run\n\t * mutations without a transaction (each writer call is its own DB op).\n\t */\n\ttransaction?: TransactionRunner;\n\t/**\n\t * Declarative, row-level permissions keyed by table (see\n\t * {@link definePermissions}). Read rules filter every row the engine emits;\n\t * write rules gate `actions.insert/update/delete`. Add more later with\n\t * {@link SyncEngine.registerPermissions}. Type the rules at the\n\t * `definePermissions<YourCtx>(...)` call site; the engine accepts any context\n\t * (it threads `ctx` untyped to your rules).\n\t */\n\tpermissions?: PermissionsDefinition<any>;\n\t/**\n\t * Declarative row schemas keyed by table (see {@link defineSchema}): writes\n\t * are validated against them, and `migrate` lazily upcasts rows on read. Add\n\t * more later with {@link SyncEngine.registerSchema}.\n\t */\n\tschemas?: SchemaDefinition;\n\t/**\n\t * Cross-client cache for reactive query results, keyed by\n\t * `(collection, params, ctx)` — equivalent subscribers reuse a single\n\t * cached snapshot on initial subscribe instead of each re-running the\n\t * query body. Per-batch dedup (already in `reactivePairs` since 1.1) is\n\t * unchanged; this adds *cross-batch* sharing.\n\t *\n\t * Entries are invalidated when a write overlaps their read set (same\n\t * `isReactiveAffected` check live subscriptions use), and bounded by an\n\t * LRU + an optional TTL.\n\t *\n\t * Defaults: `{ max: 256, ttlMs: 60_000 }`. Pass `{ max: 0 }` to disable.\n\t */\n\treactiveCache?: {\n\t\tmax?: number;\n\t\tttlMs?: number;\n\t};\n\t/**\n\t * Per-call telemetry for `sandboxedHandler` mutations. When set, every\n\t * sandboxed call fires `onMetrics(record)` after completion with\n\t * `{ id, mutationName, durationMs, cpuMs, heapBytes, ok, errorName,\n\t * errorMessage, timestamp }`. Wire to a sync collection, your\n\t * observability backend, a Drizzle table, anything you want.\n\t *\n\t * Hook failures are swallowed (a misbehaving metrics sink must NOT\n\t * crash the caller's mutation). Adding the hook switches the runner\n\t * to `callable.callWithMetrics`, which is a small per-call cost\n\t * (~0.05 ms) — disable for hot-path mutations that don't need it.\n\t *\n\t * Off by default.\n\t *\n\t * @see {@link HandlerMetricsRecord}\n\t */\n\thandlerMetrics?: HandlerMetricsHook;\n\t/**\n\t * Allowlist + auth-injection map for `actions.fetch(url, init)` calls\n\t * issued from inside a `sandboxedHandler`. Each entry is keyed by\n\t * hostname (`'api.stripe.com'`); the value's `authorization` is a\n\t * sync or async callback computed on the host so the secret never\n\t * crosses into the JSC sandbox. Requests to non-allowlisted hosts\n\t * are rejected before any network call.\n\t *\n\t * Without this set, `actions.fetch` throws \"no bridgeFetch config.\"\n\t * Plain (non-sandboxed) handlers don't use this — they can just call\n\t * `fetch` directly since they run in the host process.\n\t *\n\t * @see {@link BridgeFetchConfig}\n\t */\n\tbridgeFetch?: BridgeFetchConfig;\n};\n\nconst defaultKey = (row: unknown): RowKey => (row as { id: RowKey }).id;\n\nconst shallowEqual = (a: unknown, b: unknown): boolean => {\n\tif (a === b) {\n\t\treturn true;\n\t}\n\tif (\n\t\ttypeof a !== 'object' ||\n\t\ttypeof b !== 'object' ||\n\t\ta === null ||\n\t\tb === null\n\t) {\n\t\treturn false;\n\t}\n\tconst aKeys = Object.keys(a);\n\tconst bKeys = Object.keys(b);\n\treturn (\n\t\taKeys.length === bKeys.length &&\n\t\taKeys.every(\n\t\t\t(k) =>\n\t\t\t\t(a as Record<string, unknown>)[k] ===\n\t\t\t\t(b as Record<string, unknown>)[k]\n\t\t)\n\t);\n};\n\n/**\n * Per-object stable identifier — paired with {@link stableSubKey} so two\n * subscriptions that share the same `(collection, params, ctx)` get the same\n * key and have their reactive rerun deduplicated within a change batch (the\n * fan-out fix in {@link reactivePairs}). Falls back to an incrementing id\n * stored on a WeakMap for values JSON can't represent (functions, classes,\n * cyclic structures), so identity-equal ctxs still share a key while\n * different-identity ones don't accidentally merge.\n */\nconst subKeyIds = new WeakMap<object, string>();\nlet subKeyCounter = 0;\nconst stableValueKey = (value: unknown): string => {\n\tif (value === undefined) return 'u';\n\tif (value === null) return 'n';\n\tconst tag = typeof value;\n\tif (tag === 'string') return `s:${value as string}`;\n\tif (tag === 'number' || tag === 'boolean' || tag === 'bigint') {\n\t\treturn `${tag[0]}:${String(value)}`;\n\t}\n\tif (tag !== 'object') return `${tag[0]}:fn`;\n\ttry {\n\t\t// Stable ordering: sort keys before serialising so { a, b } and { b, a }\n\t\t// produce the same string. JSON.stringify with a replacer keeps it tight.\n\t\treturn `o:${JSON.stringify(value, (_k, v): unknown => {\n\t\t\tif (v === null || typeof v !== 'object' || Array.isArray(v))\n\t\t\t\treturn v;\n\t\t\tconst record = v as Record<string, unknown>;\n\t\t\tconst sorted: Record<string, unknown> = {};\n\t\t\tfor (const key of Object.keys(record).sort()) {\n\t\t\t\tsorted[key] = record[key];\n\t\t\t}\n\n\t\t\treturn sorted;\n\t\t})}`;\n\t} catch {\n\t\t// Cyclic or unserializable — fall back to per-object identity.\n\t\tconst obj = value as object;\n\t\tlet id = subKeyIds.get(obj);\n\t\tif (id === undefined) {\n\t\t\tsubKeyCounter += 1;\n\t\t\tid = `i${subKeyCounter}`;\n\t\t\tsubKeyIds.set(obj, id);\n\t\t}\n\n\t\treturn `i:${id}`;\n\t}\n};\n\nconst stableSubKey = (\n\tcollection: string,\n\tparams: unknown,\n\tctx: unknown\n): string => `${collection}|${stableValueKey(params)}|${stableValueKey(ctx)}`;\n\n/** Shallow-equal ignoring the search score field — used to suppress re-emitting\n * a search result whose only change is BM25 score drift as the corpus grows. */\nconst equalsIgnoringScore = (a: unknown, b: unknown): boolean => {\n\tif (\n\t\ttypeof a !== 'object' ||\n\t\ttypeof b !== 'object' ||\n\t\ta === null ||\n\t\tb === null\n\t) {\n\t\treturn a === b;\n\t}\n\tconst strip = (value: Record<string, unknown>) =>\n\t\tObject.keys(value).filter((k) => k !== SEARCH_SCORE_FIELD);\n\tconst aKeys = strip(a as Record<string, unknown>);\n\tconst bKeys = strip(b as Record<string, unknown>);\n\treturn (\n\t\taKeys.length === bKeys.length &&\n\t\taKeys.every(\n\t\t\t(k) =>\n\t\t\t\t(a as Record<string, unknown>)[k] ===\n\t\t\t\t(b as Record<string, unknown>)[k]\n\t\t)\n\t);\n};\n\n/**\n * The Tier 3 sync engine: a registry of collections plus the view syncer. It is\n * transport-agnostic — `subscribe` returns the initial snapshot and an\n * `onDiff` stream, which an Elysia/SSE layer wires to a connection, and\n * `applyChange` is the change feed you drive from your mutations.\n *\n * Access control is first-class: every subscribe runs the collection's\n * `authorize`, and a collection's `match`/`hydrate` scope rows to the caller, so\n * a change to a row the caller can't see never reaches them.\n */\nexport const createSyncEngine = (\n\toptions: SyncEngineOptions = {}\n): SyncEngine => {\n\t// Heterogeneous registry: `any` here is what lets collections of different\n\t// row/param/context types share one map (the public `register`/`subscribe`\n\t// surface stays fully typed).\n\tconst registry = new Map<\n\t\tstring,\n\t\t| CollectionDefinition<any, any, any>\n\t\t| JoinCollectionDefinition<any, any, any, any, any>\n\t\t| GraphCollectionDefinition<any, any, any>\n\t\t| ReactiveQueryDefinition<any, any, any>\n\t\t| SearchCollectionDefinition<any, any, any>\n\t>();\n\tconst mutations = new Map<string, MutationDefinition<any, any, any>>();\n\t// Lazy sandbox runners keyed by mutation name. Built on first call to a\n\t// mutation that has `sandboxedHandler` set; reused thereafter. Engine has\n\t// no teardown; the OS reaps the isolate workers on process exit.\n\tconst sandboxRunners = new Map<\n\t\tstring,\n\t\t(\n\t\t\targs: unknown,\n\t\t\tctx: unknown,\n\t\t\tactions: MutationActions\n\t\t) => Promise<unknown>\n\t>();\n\tconst writers = new Map<string, TableWriter>();\n\tconst readers = new Map<string, TableReader>();\n\tconst schedules = new Map<string, ScheduleDefinition>();\n\t// Pack registry — table -> owning pack name, and the list of registered\n\t// packs for engine.inspect().packs.\n\tconst packTableOwners = new Map<string, string>();\n\tconst registeredPacks: RegisteredPack[] = [];\n\t// Declarative row-level permissions, keyed by table. Stored with an `unknown`\n\t// context — the engine threads ctx untyped — while the public\n\t// `definePermissions`/`registerPermissions` surface stays fully typed.\n\tconst permissions = new Map<string, TablePermissions<unknown, unknown>>();\n\tfor (const [table, rules] of Object.entries(options.permissions ?? {})) {\n\t\tpermissions.set(table, rules as TablePermissions<unknown, unknown>);\n\t}\n\tconst readRuleFor = (\n\t\ttable: string\n\t): ReadRule<unknown, unknown> | undefined => permissions.get(table)?.read;\n\tconst writeRuleFor = (\n\t\ttable: string,\n\t\top: 'insert' | 'update' | 'delete'\n\t): WriteRule<unknown, unknown> | undefined => {\n\t\tconst rules = permissions.get(table);\n\t\treturn rules?.[op] ?? rules?.write;\n\t};\n\t// Declarative row schemas, keyed by table.\n\tconst schemas = new Map<string, TableSchema<unknown>>();\n\tfor (const [table, schema] of Object.entries(options.schemas ?? {})) {\n\t\tschemas.set(table, schema as TableSchema<unknown>);\n\t}\n\t// CRDT fields, keyed by table: field name -> mergeable backend. Set via\n\t// registerCrdt; consulted in makeActions to merge (not overwrite) on write.\n\tconst crdtFields = new Map<\n\t\tstring,\n\t\tRecord<string, CrdtMergeable<unknown>>\n\t>();\n\t// Validate a write against its table's schema: every field on insert; only\n\t// the supplied fields on update. Throws SchemaError naming the bad field.\n\tconst validateWrite = (\n\t\ttable: string,\n\t\top: 'insert' | 'update',\n\t\trow: unknown\n\t) => {\n\t\tconst schema = schemas.get(table);\n\t\tif (schema === undefined || typeof row !== 'object' || row === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst record = row as Record<string, unknown>;\n\t\tfor (const [fieldName, validate] of Object.entries(schema.fields)) {\n\t\t\tconst present = fieldName in record;\n\t\t\tif (op === 'update' && !present) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!validate(record[fieldName])) {\n\t\t\t\tthrow new SchemaError(table, fieldName);\n\t\t\t}\n\t\t}\n\t};\n\t// Lazily upcast a stored/raw row to the current shape (identity if no migrate).\n\tconst migrateRow = (table: string, row: unknown): unknown => {\n\t\tconst migrate = schemas.get(table)?.migrate;\n\t\treturn migrate ? migrate(row) : row;\n\t};\n\t// Reactive (read-set-tracked) subscriptions, scanned on each change since\n\t// their dependencies (the tables they read) are dynamic, not in tableIndex.\n\tconst reactiveSubs = new Set<\n\t\tExtract<ActiveSubscription, { kind: 'reactive' }>\n\t>();\n\t// Search subscriptions + one shared index per search collection, kept live\n\t// from the source table's change feed (like reactiveSubs, not in tableIndex).\n\tconst searchSubs = new Set<\n\t\tExtract<ActiveSubscription, { kind: 'search' }>\n\t>();\n\tconst searchIndexes = new Map<\n\t\tstring,\n\t\t{\n\t\t\tindex: SearchIndex<unknown, unknown>;\n\t\t\tdefinition: SearchCollectionDefinition<unknown, unknown, unknown>;\n\t\t\thydrated: boolean;\n\t\t}\n\t>();\n\tconst active = new Map<string, Set<ActiveSubscription>>();\n\t// Which collections read each table — so a table change fans to all of them.\n\tconst tableIndex = new Map<string, Set<string>>();\n\n\t// Monotonic change feed: every applyChange bumps `version` and appends to a\n\t// bounded log, so a client can resume from the version it last applied.\n\tconst changeLogSize = options.changeLogSize ?? 1024;\n\tconst changeLogRetainMs = options.changeLogRetainMs ?? null;\n\tconst changeLog: LoggedChange[] = [];\n\tlet version = 0;\n\t// Engine-level counters surfaced via `engine.metrics()` (1.13.0).\n\tconst engineStartedAt = Date.now();\n\tlet mutationsCompleted = 0;\n\tlet mutationsFailed = 0;\n\tlet mutationsRetried = 0;\n\tlet mutationsInFlight = 0;\n\n\t// Cross-client reactive query cache (1.3+). Keyed by stableSubKey, holds\n\t// the result + read set so a fresh subscribe with the same key reuses the\n\t// rerun instead of hitting the DB again. Per-batch dedup (since 1.1) is\n\t// already in `reactivePairs`; this lifts the sharing across batches.\n\t//\n\t// Entries are invalidated when a write overlaps the cached read set (same\n\t// `isReactiveAffected` check live subs use). LRU-bounded; optional TTL.\n\tconst reactiveCacheMax = options.reactiveCache?.max ?? 256;\n\tconst reactiveCacheTtlMs = options.reactiveCache?.ttlMs ?? 60_000;\n\ttype CachedRerun = {\n\t\trerunKey: string;\n\t\trows: unknown[];\n\t\treadTables: Set<string>;\n\t\treadKeys: Set<string>;\n\t\trangeDeps: RangeDep[];\n\t\tversion: number;\n\t\texpiresAt: number;\n\t};\n\t// `Map` preserves insertion order — re-set on access for LRU semantics.\n\tconst cachedReruns = new Map<string, CachedRerun>();\n\tconst touchCacheEntry = (key: string, entry: CachedRerun) => {\n\t\tcachedReruns.delete(key);\n\t\tcachedReruns.set(key, entry);\n\t};\n\tconst readCacheEntry = (key: string): CachedRerun | undefined => {\n\t\tif (reactiveCacheMax <= 0) return undefined;\n\t\tconst entry = cachedReruns.get(key);\n\t\tif (entry === undefined) return undefined;\n\t\tif (reactiveCacheTtlMs > 0 && entry.expiresAt < Date.now()) {\n\t\t\tcachedReruns.delete(key);\n\n\t\t\treturn undefined;\n\t\t}\n\t\ttouchCacheEntry(key, entry);\n\n\t\treturn entry;\n\t};\n\tconst writeCacheEntry = (entry: CachedRerun) => {\n\t\tif (reactiveCacheMax <= 0) return;\n\t\tcachedReruns.set(entry.rerunKey, entry);\n\t\t// LRU eviction: oldest insertion wins out when over budget.\n\t\twhile (cachedReruns.size > reactiveCacheMax) {\n\t\t\tconst oldest = cachedReruns.keys().next().value;\n\t\t\tif (oldest === undefined) break;\n\t\t\tcachedReruns.delete(oldest);\n\t\t}\n\t};\n\t// Devtools activity stream — listeners are notified of changes, mutation\n\t// outcomes, and subscribe/unsubscribe. Cheap (a no-op) when no one's watching.\n\tconst activityListeners = new Set<(event: EngineActivity) => void>();\n\tconst emitActivity = (event: EngineActivity) => {\n\t\tfor (const listener of activityListeners) {\n\t\t\tlistener(event);\n\t\t}\n\t};\n\t// Outbound CDC stream subscribers — `streamChanges()` adds itself here.\n\t// Notifications fire from `logChange` so every appended log entry reaches\n\t// every active streamer atomically with the log push.\n\tconst streamSubscribers = new Set<(entry: LoggedChange) => void>();\n\tconst runInTransaction = options.transaction;\n\t// Cluster fan-out: a stable id so we ignore our own broadcasts, and the bus\n\t// (set by connectCluster) we publish locally-committed changes to. Pass\n\t// `options.instanceId` for stable cross-process identity (e.g. the\n\t// hostname or a config-supplied UUID) — 1.17.0+ resume cursors travel\n\t// across instances, so the id needs to be stable across restarts if you\n\t// want resume to keep working past a reboot.\n\tconst instanceId =\n\t\toptions.instanceId ??\n\t\tglobalThis.crypto?.randomUUID?.() ??\n\t\t`i${Math.random()}`;\n\tlet clusterBus: ClusterBus | undefined;\n\n\tconst broadcast = (\n\t\tchanges: { table: string; change: RowChange<unknown> }[],\n\t\t// 1.17.0 — the local version at the moment of this broadcast, so\n\t\t// peers can log the changes against `(instanceId, originVersion)`\n\t\t// and serve cross-instance resume from their own log.\n\t\toriginVersion: number\n\t) => {\n\t\tif (clusterBus !== undefined && changes.length > 0) {\n\t\t\tvoid clusterBus.publish({ changes, origin: instanceId, originVersion });\n\t\t}\n\t};\n\n\tconst subsFor = (collection: string) => {\n\t\tlet set = active.get(collection);\n\t\tif (set === undefined) {\n\t\t\tset = new Set();\n\t\t\tactive.set(collection, set);\n\t\t}\n\t\treturn set;\n\t};\n\n\tconst addTableIndex = (table: string, name: string) => {\n\t\tlet set = tableIndex.get(table);\n\t\tif (set === undefined) {\n\t\t\tset = new Set();\n\t\t\ttableIndex.set(table, set);\n\t\t}\n\t\tset.add(name);\n\t};\n\n\t/** A side change that fails its filter becomes a leave (delete from the join). */\n\tconst sideChange = (\n\t\tchange: RowChange<unknown>,\n\t\tmatch?: (row: unknown) => boolean\n\t): RowChange<unknown> =>\n\t\tchange.op !== 'delete' && match !== undefined && !match(change.row)\n\t\t\t? { op: 'delete', row: change.row }\n\t\t\t: change;\n\n\tconst EMPTY_DIFF: ViewDiff<unknown> = {\n\t\tadded: [],\n\t\tremoved: [],\n\t\tchanged: []\n\t};\n\n\t/** Apply one change to a subscription's state and return its diff (no emit). */\n\tconst subscriptionDiff = async (\n\t\tsubscription: ActiveSubscription,\n\t\ttable: string,\n\t\tchange: RowChange<unknown>\n\t): Promise<ViewDiff<unknown>> => {\n\t\tif (subscription.kind === 'graph') {\n\t\t\treturn subscription.instance.applyChange(table, change);\n\t\t}\n\t\tif (subscription.kind === 'join') {\n\t\t\tconst js = subscription.join;\n\t\t\tif (table === js.leftTable) {\n\t\t\t\treturn js.op.applyLeft(sideChange(change, js.leftMatch));\n\t\t\t}\n\t\t\tif (table === js.rightTable) {\n\t\t\t\treturn js.op.applyRight(sideChange(change, js.rightMatch));\n\t\t\t}\n\t\t\treturn EMPTY_DIFF;\n\t\t}\n\t\tif (subscription.kind === 'reactive') {\n\t\t\t// Reactive subs re-run as a whole (see reactivePairs), not per change.\n\t\t\treturn EMPTY_DIFF;\n\t\t}\n\t\tif (subscription.kind === 'search') {\n\t\t\t// Search subs re-rank as a whole (see searchPairs), not per change.\n\t\t\treturn EMPTY_DIFF;\n\t\t}\n\t\tif (subscription.incremental) {\n\t\t\ttry {\n\t\t\t\treturn subscription.view.apply(change);\n\t\t\t} catch {\n\t\t\t\t// The predicate couldn't decide this change (e.g. an operator the\n\t\t\t\t// inferred matcher doesn't support) — degrade to a correct refetch\n\t\t\t\t// rather than a wrong diff.\n\t\t\t\treturn subscription.view.reset(await subscription.rehydrate());\n\t\t\t}\n\t\t}\n\t\treturn subscription.view.reset(await subscription.rehydrate());\n\t};\n\n\t/** Active subscriptions whose collection reads `table`. */\n\tconst subscriptionsForTable = function* (\n\t\ttable: string\n\t): Generator<ActiveSubscription> {\n\t\tconst names = tableIndex.get(table);\n\t\tif (names === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const name of names) {\n\t\t\tconst set = active.get(name);\n\t\t\tif (set === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tyield* set;\n\t\t}\n\t};\n\n\t/**\n\t * Net a batch's per-change diffs by key, relative to the pre-batch state, so a\n\t * mutation that touches the same row twice collapses to one coherent change:\n\t * add-then-remove cancels, add-then-update stays an add, remove-then-add\n\t * becomes a change.\n\t */\n\tconst mergeViewDiffs = (\n\t\tdiffs: ViewDiff<unknown>[],\n\t\tkey: (row: unknown) => RowKey\n\t): ViewDiff<unknown> => {\n\t\ttype Net = { state: 'added' | 'changed' | 'removed'; row: unknown };\n\t\tconst net = new Map<RowKey, Net>();\n\t\tfor (const diff of diffs) {\n\t\t\tfor (const row of diff.removed) {\n\t\t\t\tconst previous = net.get(key(row));\n\t\t\t\tif (previous?.state === 'added') {\n\t\t\t\t\tnet.delete(key(row));\n\t\t\t\t} else {\n\t\t\t\t\tnet.set(key(row), { state: 'removed', row });\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const row of diff.added) {\n\t\t\t\tconst previous = net.get(key(row));\n\t\t\t\tnet.set(key(row), {\n\t\t\t\t\tstate: previous?.state === 'removed' ? 'changed' : 'added',\n\t\t\t\t\trow\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (const row of diff.changed) {\n\t\t\t\tconst previous = net.get(key(row));\n\t\t\t\tnet.set(key(row), {\n\t\t\t\t\tstate: previous?.state === 'added' ? 'added' : 'changed',\n\t\t\t\t\trow\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tconst added: unknown[] = [];\n\t\tconst changed: unknown[] = [];\n\t\tconst removed: unknown[] = [];\n\t\tfor (const { state, row } of net.values()) {\n\t\t\tif (state === 'added') {\n\t\t\t\tadded.push(row);\n\t\t\t} else if (state === 'changed') {\n\t\t\t\tchanged.push(row);\n\t\t\t} else {\n\t\t\t\tremoved.push(row);\n\t\t\t}\n\t\t}\n\t\treturn { added, changed, removed };\n\t};\n\n\ttype ReactiveSub = Extract<ActiveSubscription, { kind: 'reactive' }>;\n\n\tconst depKey = (table: string, key: RowKey): string => `${table} ${key}`;\n\n\t/** The key of a changed row under its table's reader key (if one is set). */\n\tconst changedKeyFor = (\n\t\ttable: string,\n\t\tchange: RowChange<unknown>\n\t): RowKey | undefined => readers.get(table)?.key?.(change.row);\n\n\t/**\n\t * An instrumented read handle: `all` records a full-table dependency; `get`\n\t * records a precise row-key dependency when the table's reader has a `key`\n\t * (else falls back to a table dependency).\n\t */\n\tconst makeReadHandle = (\n\t\tctx: unknown,\n\t\treadTables: Set<string>,\n\t\treadKeys: Set<string>,\n\t\trangeDeps: RangeDep[],\n\t\t// Schedules read unscoped (trusted server code); subscriptions apply rules.\n\t\tapplyRules = true\n\t): ReadHandle => {\n\t\tconst readerFor = (table: string): TableReader => {\n\t\t\tconst reader = readers.get(table);\n\t\t\tif (reader === undefined) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No reader registered for table \"${table}\" — register one with engine.registerReader`\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn reader;\n\t\t};\n\t\tconst ruleFor = (table: string) =>\n\t\t\tapplyRules ? readRuleFor(table) : undefined;\n\n\t\treturn {\n\t\t\tall: async (table) => {\n\t\t\t\treadTables.add(table);\n\t\t\t\t// Migrate raw rows to the current shape, then scope by read rule.\n\t\t\t\tconst rows = [...(await readerFor(table).all(ctx))].map((row) =>\n\t\t\t\t\tmigrateRow(table, row)\n\t\t\t\t);\n\t\t\t\tconst rule = ruleFor(table);\n\t\t\t\treturn (\n\t\t\t\t\trule ? rows.filter((row) => rule(ctx, row)) : rows\n\t\t\t\t) as never[];\n\t\t\t},\n\t\t\tget: async (table, key) => {\n\t\t\t\tconst reader = readerFor(table);\n\t\t\t\tif (reader.get === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Reader for table \"${table}\" has no get(); use db.all() or add get`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (reader.key !== undefined) {\n\t\t\t\t\treadKeys.add(depKey(table, key));\n\t\t\t\t} else {\n\t\t\t\t\treadTables.add(table);\n\t\t\t\t}\n\t\t\t\tconst raw = await reader.get(key, ctx);\n\t\t\t\tconst row =\n\t\t\t\t\traw === undefined ? undefined : migrateRow(table, raw);\n\t\t\t\tconst rule = ruleFor(table);\n\t\t\t\t// A row the caller can't read reads as absent.\n\t\t\t\treturn (\n\t\t\t\t\trule && row !== undefined && !rule(ctx, row)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: row\n\t\t\t\t) as never;\n\t\t\t},\n\t\t\twhere: async (table, predicate) => {\n\t\t\t\tconst reader = readerFor(table);\n\t\t\t\tconst rule = ruleFor(table);\n\t\t\t\t// Fold the read rule into the range predicate, so an unreadable row\n\t\t\t\t// never matches and a visibility flip still re-runs the query.\n\t\t\t\tconst effective = (\n\t\t\t\t\trule\n\t\t\t\t\t\t? (row: unknown) =>\n\t\t\t\t\t\t\t\t(predicate as (r: unknown) => boolean)(row) &&\n\t\t\t\t\t\t\t\trule(ctx, row)\n\t\t\t\t\t\t: (predicate as (row: unknown) => boolean)\n\t\t\t\t) as (row: unknown) => boolean;\n\t\t\t\tconst matched = [...(await reader.all(ctx))]\n\t\t\t\t\t.map((row) => migrateRow(table, row))\n\t\t\t\t\t.filter(effective);\n\t\t\t\tif (reader.key !== undefined) {\n\t\t\t\t\t// Remember which rows matched, so an update/delete that pulls a\n\t\t\t\t\t// row out of the range still re-runs (it's in this key set).\n\t\t\t\t\tconst key = reader.key;\n\t\t\t\t\trangeDeps.push({\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\tpredicate: effective,\n\t\t\t\t\t\tkeys: new Set(matched.map(key))\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treadTables.add(table);\n\t\t\t\t}\n\t\t\t\treturn matched as never[];\n\t\t\t}\n\t\t};\n\t};\n\n\tconst writerFor = (table: string): TableWriter => {\n\t\tconst writer = writers.get(table);\n\t\tif (writer === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`No writer registered for table \"${table}\" — register one with engine.registerWriter, or use actions.change`\n\t\t\t);\n\t\t}\n\t\treturn writer;\n\t};\n\n\t// Load the committed row a write targets (by the table's reader), if any — so\n\t// authorization and CRDT merge both reflect committed state, not the payload.\n\tconst readExisting = async (\n\t\ttable: string,\n\t\tvalue: unknown,\n\t\tctx: unknown\n\t): Promise<unknown> => {\n\t\tconst reader = readers.get(table);\n\t\tif (reader?.get === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst id = reader.key\n\t\t\t? reader.key(value)\n\t\t\t: (value as { id?: RowKey }).id;\n\t\treturn id === undefined ? undefined : reader.get(id, ctx);\n\t};\n\n\t// Enforce a table's declarative write rule before the writer runs (so a deny\n\t// rolls the transaction back). For update/delete, evaluate the rule against the\n\t// *existing* row when a reader can load it — so the check reflects committed\n\t// state, not a client-supplied payload.\n\tconst authorizeWrite = async (\n\t\ttable: string,\n\t\top: 'insert' | 'update' | 'delete',\n\t\tvalue: unknown,\n\t\tctx: unknown\n\t) => {\n\t\tconst rule = writeRuleFor(table, op);\n\t\tif (rule === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tlet subject = value;\n\t\tif (op !== 'insert') {\n\t\t\tconst existing = await readExisting(table, value, ctx);\n\t\t\tif (existing !== undefined) {\n\t\t\t\tsubject = existing;\n\t\t\t}\n\t\t}\n\t\tif (!rule(ctx, subject)) {\n\t\t\tthrow new UnauthorizedError(`${op} on table \"${table}\"`);\n\t\t}\n\t};\n\n\t// Merge a write's CRDT fields into the committed row (so concurrent writers\n\t// converge) instead of overwriting them. A no-op for tables without CRDT\n\t// fields. On insert the base is the empty state; on update it's the stored\n\t// field value. Returns the row patch the writer should persist.\n\tconst mergeCrdtFields = async (\n\t\ttable: string,\n\t\top: 'insert' | 'update',\n\t\tdata: unknown,\n\t\tctx: unknown\n\t): Promise<unknown> => {\n\t\tconst fields = crdtFields.get(table);\n\t\tif (fields === undefined || data === null || typeof data !== 'object') {\n\t\t\treturn data;\n\t\t}\n\t\tconst incoming = data as Record<string, unknown>;\n\t\tconst existing =\n\t\t\top === 'update' ? await readExisting(table, data, ctx) : undefined;\n\t\tconst base =\n\t\t\texisting !== null && typeof existing === 'object'\n\t\t\t\t? (existing as Record<string, unknown>)\n\t\t\t\t: undefined;\n\t\tconst merged: Record<string, unknown> = { ...incoming };\n\t\tfor (const [field, adapter] of Object.entries(fields)) {\n\t\t\tif (incoming[field] === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmerged[field] = adapter.merge(\n\t\t\t\tbase?.[field] ?? adapter.empty(),\n\t\t\t\tincoming[field]\n\t\t\t);\n\t\t}\n\t\treturn merged;\n\t};\n\n\t/**\n\t * Build the write actions a mutation or schedule handler uses, collecting its\n\t * changes into a fresh buffer (so a transaction that retries/rolls back never\n\t * double-emits). `tx` threads to each writer. `enforce` applies write\n\t * permission rules (mutations); schedules run trusted, so they pass `false`.\n\t */\n\tconst makeActions = (tx: unknown, ctx: unknown, enforce: boolean) => {\n\t\tconst buffered: { table: string; change: RowChange<unknown> }[] = [];\n\t\tconst actions: MutationActions = {\n\t\t\tchange: (collection, change) => {\n\t\t\t\tbuffered.push({\n\t\t\t\t\ttable: collection,\n\t\t\t\t\tchange: change as RowChange<unknown>\n\t\t\t\t});\n\t\t\t\treturn Promise.resolve();\n\t\t\t},\n\t\t\tinsert: async (table, data) => {\n\t\t\t\t// Schema is data integrity — validated for trusted schedules too.\n\t\t\t\tvalidateWrite(table, 'insert', data);\n\t\t\t\tif (enforce) {\n\t\t\t\t\tawait authorizeWrite(table, 'insert', data, ctx);\n\t\t\t\t}\n\t\t\t\tconst merged = await mergeCrdtFields(\n\t\t\t\t\ttable,\n\t\t\t\t\t'insert',\n\t\t\t\t\tdata,\n\t\t\t\t\tctx\n\t\t\t\t);\n\t\t\t\tconst row = await writerFor(table).insert(merged, ctx, tx);\n\t\t\t\tbuffered.push({ table, change: { op: 'insert', row } });\n\t\t\t\treturn row;\n\t\t\t},\n\t\t\tupdate: async (table, data) => {\n\t\t\t\tvalidateWrite(table, 'update', data);\n\t\t\t\tif (enforce) {\n\t\t\t\t\tawait authorizeWrite(table, 'update', data, ctx);\n\t\t\t\t}\n\t\t\t\tconst merged = await mergeCrdtFields(\n\t\t\t\t\ttable,\n\t\t\t\t\t'update',\n\t\t\t\t\tdata,\n\t\t\t\t\tctx\n\t\t\t\t);\n\t\t\t\tconst row = await writerFor(table).update(merged, ctx, tx);\n\t\t\t\tbuffered.push({ table, change: { op: 'update', row } });\n\t\t\t\treturn row;\n\t\t\t},\n\t\t\tdelete: async (table, row) => {\n\t\t\t\tif (enforce) {\n\t\t\t\t\tawait authorizeWrite(table, 'delete', row, ctx);\n\t\t\t\t}\n\t\t\t\tawait writerFor(table).delete(row, ctx, tx);\n\t\t\t\tbuffered.push({ table, change: { op: 'delete', row } });\n\t\t\t},\n\t\t\t// Default wall clock. Replay / rebase paths can wrap and pin\n\t\t\t// this; today it's just Date.now().\n\t\t\tnow: () => Date.now()\n\t\t};\n\t\treturn { actions, buffered };\n\t};\n\n\t/** Diff a re-run against a sub's current set; updates `current`. Shared by the\n\t * reactive and search kinds (both re-run wholesale and diff). `equals` decides\n\t * whether a still-present row counts as changed. */\n\tconst diffRerun = (\n\t\tsub: {\n\t\t\tkey: (row: unknown) => RowKey;\n\t\t\tcurrent: Map<RowKey, unknown>;\n\t\t},\n\t\trows: unknown[],\n\t\tequals: (a: unknown, b: unknown) => boolean = shallowEqual\n\t): ViewDiff<unknown> => {\n\t\tconst next = new Map<RowKey, unknown>();\n\t\tfor (const row of rows) {\n\t\t\tnext.set(sub.key(row), row);\n\t\t}\n\t\tconst added: unknown[] = [];\n\t\tconst removed: unknown[] = [];\n\t\tconst changed: unknown[] = [];\n\t\tfor (const [rowKey, row] of next) {\n\t\t\tconst previous = sub.current.get(rowKey);\n\t\t\tif (previous === undefined) {\n\t\t\t\tadded.push(row);\n\t\t\t} else if (!equals(previous, row)) {\n\t\t\t\tchanged.push(row);\n\t\t\t}\n\t\t}\n\t\tfor (const [rowKey, row] of sub.current) {\n\t\t\tif (!next.has(rowKey)) {\n\t\t\t\tremoved.push(row);\n\t\t\t}\n\t\t}\n\t\tsub.current = next;\n\t\treturn { added, removed, changed };\n\t};\n\n\t/** Re-run every reactive query whose read set intersects the changed tables. */\n\ttype ReactiveChange = {\n\t\ttable: string;\n\t\tkey: RowKey | undefined;\n\t\trow: unknown;\n\t};\n\n\t/** Does a change fall in a range dep — matched now, or a member at last read? */\n\tconst inRange = (dep: RangeDep, change: ReactiveChange): boolean =>\n\t\tdep.table === change.table &&\n\t\t((change.key !== undefined && dep.keys.has(change.key)) ||\n\t\t\tdep.predicate(change.row));\n\n\t/** Does any change in the batch overlap this read set? Used for both live\n\t * sub invalidation and cross-client cache invalidation. */\n\tconst readSetOverlaps = (\n\t\treadTables: Set<string>,\n\t\treadKeys: Set<string>,\n\t\trangeDeps: RangeDep[],\n\t\tchanges: ReactiveChange[]\n\t): boolean =>\n\t\tchanges.some(\n\t\t\t(change) =>\n\t\t\t\treadTables.has(change.table) ||\n\t\t\t\t(change.key !== undefined &&\n\t\t\t\t\treadKeys.has(depKey(change.table, change.key))) ||\n\t\t\t\trangeDeps.some((dep) => inRange(dep, change))\n\t\t);\n\n\t/** Did this batch touch a table, row key, or range the sub read? */\n\tconst isReactiveAffected = (\n\t\tsub: ReactiveSub,\n\t\tchanges: ReactiveChange[]\n\t): boolean =>\n\t\treadSetOverlaps(sub.readTables, sub.readKeys, sub.rangeDeps, changes);\n\n\t/** Drop cached reruns whose read set overlaps this write batch. Cheap walk —\n\t * the cache is bounded by `reactiveCache.max` (default 256). */\n\tconst invalidateCacheForChanges = (changes: ReactiveChange[]) => {\n\t\tif (cachedReruns.size === 0) return;\n\t\tfor (const [key, entry] of cachedReruns) {\n\t\t\tif (\n\t\t\t\treadSetOverlaps(\n\t\t\t\t\tentry.readTables,\n\t\t\t\t\tentry.readKeys,\n\t\t\t\t\tentry.rangeDeps,\n\t\t\t\t\tchanges\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tcachedReruns.delete(key);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst reactivePairs = async (\n\t\tchanges: ReactiveChange[]\n\t): Promise<[ActiveSubscription, ViewDiff<unknown>][]> => {\n\t\t// Drop now-stale cache entries before reruns — otherwise a fresh\n\t\t// subscriber landing during the batch could read the OLD value.\n\t\tinvalidateCacheForChanges(changes);\n\n\t\tconst pairs: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\t// Dedupe: subscriptions sharing the same `(collection, params, ctx)`\n\t\t// only need ONE rerun per change batch. With 1000 subs on the same\n\t\t// query, this drops per-change CPU from O(N) reruns to O(1) — every\n\t\t// sub then diffs the shared result against its own `current` and\n\t\t// receives its own per-sub frame (which the transport still writes\n\t\t// per-WS, see #22 batch-frame fan-out for the next step).\n\t\tconst sharedRuns = new Map<\n\t\t\tstring,\n\t\t\tPromise<Awaited<ReturnType<ReactiveSub['rerun']>>>\n\t\t>();\n\t\tfor (const sub of reactiveSubs) {\n\t\t\tif (!isReactiveAffected(sub, changes)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet runPromise = sharedRuns.get(sub.rerunKey);\n\t\t\tif (runPromise === undefined) {\n\t\t\t\trunPromise = sub.rerun();\n\t\t\t\tsharedRuns.set(sub.rerunKey, runPromise);\n\t\t\t}\n\t\t\tconst { rows, readTables, readKeys, rangeDeps } = await runPromise;\n\t\t\tsub.readTables = readTables;\n\t\t\tsub.readKeys = readKeys;\n\t\t\tsub.rangeDeps = rangeDeps;\n\t\t\tconst diff = diffRerun(sub, rows);\n\t\t\tif (!isEmptyViewDiff(diff)) {\n\t\t\t\tpairs.push([sub, diff]);\n\t\t\t}\n\t\t}\n\t\t// Refresh cache entries with the freshly-computed rows so subsequent\n\t\t// subscribers reuse them without hitting the DB.\n\t\tfor (const [key, runPromise] of sharedRuns) {\n\t\t\trunPromise\n\t\t\t\t.then(({ rows, readTables, readKeys, rangeDeps }) => {\n\t\t\t\t\twriteCacheEntry({\n\t\t\t\t\t\texpiresAt: Date.now() + reactiveCacheTtlMs,\n\t\t\t\t\t\trangeDeps,\n\t\t\t\t\t\treadKeys,\n\t\t\t\t\t\treadTables,\n\t\t\t\t\t\trerunKey: key,\n\t\t\t\t\t\trows,\n\t\t\t\t\t\tversion\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch(() => {\n\t\t\t\t\t// rerun threw — leave cache as-is (already invalidated above)\n\t\t\t\t});\n\t\t}\n\n\t\treturn pairs;\n\t};\n\n\t/** Lazily build + hydrate a search collection's shared index (once). */\n\tconst ensureSearchIndex = async (\n\t\tdefinition: SearchCollectionDefinition<unknown, unknown, unknown>\n\t) => {\n\t\tlet entry = searchIndexes.get(definition.name);\n\t\tif (entry === undefined) {\n\t\t\tentry = { index: definition.index(), definition, hydrated: false };\n\t\t\tsearchIndexes.set(definition.name, entry);\n\t\t}\n\t\tif (!entry.hydrated) {\n\t\t\tfor (const row of await definition.source()) {\n\t\t\t\tentry.index.add(row);\n\t\t\t}\n\t\t\tentry.hydrated = true;\n\t\t}\n\t\treturn entry;\n\t};\n\n\t/**\n\t * Keep search indexes live and re-rank affected search subs: apply each change\n\t * to its collection's index, then re-run every sub whose collection changed.\n\t * Synchronous — the index ops and re-ranks don't touch the DB.\n\t */\n\tconst searchPairs = (\n\t\tchanges: { table: string; change: RowChange<unknown> }[]\n\t): [ActiveSubscription, ViewDiff<unknown>][] => {\n\t\tconst touched = new Set<string>();\n\t\tfor (const { table, change } of changes) {\n\t\t\tfor (const entry of searchIndexes.values()) {\n\t\t\t\tif (!entry.hydrated || entry.definition.table !== table) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (change.op === 'delete') {\n\t\t\t\t\tentry.index.remove(entry.definition.key(change.row));\n\t\t\t\t} else {\n\t\t\t\t\tentry.index.add(change.row);\n\t\t\t\t}\n\t\t\t\ttouched.add(entry.definition.name);\n\t\t\t}\n\t\t}\n\t\tconst pairs: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\tfor (const sub of searchSubs) {\n\t\t\tif (!touched.has(sub.collection)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Ignore pure score drift (BM25 idf shifts as the corpus grows), so a\n\t\t\t// result only re-emits when it enters/leaves or its content changes —\n\t\t\t// not on every unrelated insert.\n\t\t\tconst diff = diffRerun(sub, sub.rerun(), equalsIgnoringScore);\n\t\t\tif (!isEmptyViewDiff(diff)) {\n\t\t\t\tpairs.push([sub, diff]);\n\t\t\t}\n\t\t}\n\t\treturn pairs;\n\t};\n\n\tconst logChange = (changeVersion: number, entry: LoggedChange) => {\n\t\tchangeLog.push(entry);\n\t\t// Count-based cap.\n\t\tif (changeLog.length > changeLogSize) {\n\t\t\tchangeLog.shift();\n\t\t}\n\t\t// Time-based retention (1.13.0): drop entries older than the\n\t\t// configured window. Cheap when the log is small or the head is\n\t\t// fresh — we stop the moment we find a young-enough entry.\n\t\tif (changeLogRetainMs !== null && changeLogRetainMs > 0) {\n\t\t\tconst cutoff = entry.at - changeLogRetainMs;\n\t\t\twhile (changeLog.length > 0 && changeLog[0]!.at < cutoff) {\n\t\t\t\tchangeLog.shift();\n\t\t\t}\n\t\t}\n\t\t// Atomic with the log push — every active CDC streamer sees every\n\t\t// entry exactly once, in version order, with no chance of a missed\n\t\t// commit between phase-1 catch-up and phase-2 tail.\n\t\tfor (const subscriber of streamSubscribers) {\n\t\t\tsubscriber(entry);\n\t\t}\n\t};\n\n\t// 1.17.0 cross-instance cursor encode/decode. Opaque to clients —\n\t// shaped as base64-ish JSON internally. The client must round-trip\n\t// what the server returned, unmodified.\n\tconst encodeCursor = (versions: Record<string, number>): string =>\n\t\t// Plain JSON is fine; clients treat it as opaque. We don't base64\n\t\t// because the cursor lives in a JSON payload anyway (snapshot frame).\n\t\tJSON.stringify(versions);\n\tconst decodeCursor = (cursor: string): Record<string, number> | null => {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(cursor);\n\t\t\tif (typeof parsed !== 'object' || parsed === null) return null;\n\t\t\tconst out: Record<string, number> = {};\n\t\t\tfor (const [k, v] of Object.entries(parsed)) {\n\t\t\t\tif (typeof v === 'number') out[k] = v;\n\t\t\t}\n\t\t\treturn out;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t};\n\tconst currentCursor = (): string => {\n\t\t// Snapshot the highest local version + each peer's highest origin\n\t\t// version seen so far. Cheap O(log) — single backwards walk grabs\n\t\t// the most-recent originVersion per peer.\n\t\tconst versions: Record<string, number> = { [instanceId]: version };\n\t\tfor (let i = changeLog.length - 1; i >= 0; i--) {\n\t\t\tconst entry = changeLog[i]!;\n\t\t\tif (versions[entry.origin] === undefined) {\n\t\t\t\tversions[entry.origin] = entry.originVersion;\n\t\t\t}\n\t\t}\n\t\treturn encodeCursor(versions);\n\t};\n\n\t/** Apply a single committed change at its own version (CDC / direct writes). */\n\tconst applyChange = async (\n\t\ttable: string,\n\t\tchange: RowChange<unknown>,\n\t\tshouldBroadcast = true\n\t) => {\n\t\tversion += 1;\n\t\tconst changeVersion = version;\n\t\tconst at = Date.now();\n\t\tlogChange(changeVersion, {\n\t\t\tversion: changeVersion,\n\t\t\ttable,\n\t\t\tchange,\n\t\t\tat,\n\t\t\torigin: instanceId,\n\t\t\toriginVersion: changeVersion\n\t\t});\n\t\temitActivity({\n\t\t\ttype: 'change',\n\t\t\tat,\n\t\t\ttable,\n\t\t\top: change.op,\n\t\t\tversion: changeVersion\n\t\t});\n\t\t// Collect, then emit once at the end: reactive re-runs are async, and\n\t\t// emitting before they finish would let the transport flush a partial frame.\n\t\tconst emissions: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\tfor (const subscription of subscriptionsForTable(table)) {\n\t\t\tconst diff = await subscriptionDiff(subscription, table, change);\n\t\t\tif (!isEmptyViewDiff(diff)) {\n\t\t\t\temissions.push([subscription, diff]);\n\t\t\t}\n\t\t}\n\t\temissions.push(\n\t\t\t...(await reactivePairs([\n\t\t\t\t{ table, key: changedKeyFor(table, change), row: change.row }\n\t\t\t]))\n\t\t);\n\t\temissions.push(...searchPairs([{ table, change }]));\n\t\tconst cursorForBatch = currentCursor();\n\t\tfor (const [subscription, diff] of emissions) {\n\t\t\tsubscription.onDiff(diff, changeVersion, cursorForBatch);\n\t\t}\n\t\tif (shouldBroadcast) {\n\t\t\tbroadcast([{ table, change }], changeVersion);\n\t\t}\n\t};\n\n\t/**\n\t * Apply a set of changes atomically: one version bump for the whole batch and\n\t * a single net-merged diff per affected subscription. Used by mutations so a\n\t * client never renders a torn intermediate state mid-mutation.\n\t */\n\tconst applyChangeBatch = async (\n\t\tchanges: { table: string; change: RowChange<unknown> }[],\n\t\tshouldBroadcast = true,\n\t\t/**\n\t\t * 1.17.0 — peer-relayed batches override the change-log entry's\n\t\t * `origin` + `originVersion` so a cross-instance client cursor can\n\t\t * later match the entry. Local batches leave this `undefined` and\n\t\t * the entry inherits the engine's own identity.\n\t\t */\n\t\tpeerOrigin?: { origin: string; originVersion: number }\n\t) => {\n\t\tif (changes.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tversion += 1;\n\t\tconst batchVersion = version;\n\t\tconst perSubscription = new Map<\n\t\t\tActiveSubscription,\n\t\t\tViewDiff<unknown>[]\n\t\t>();\n\t\tconst reactiveChanges: ReactiveChange[] = [];\n\t\tconst batchAt = Date.now();\n\t\t// 1.17.0: peer-relayed batches override origin/originVersion via\n\t\t// `peerOrigin` (set when applyChangeBatch is called from the cluster\n\t\t// subscribe path). Defaults to this engine's identity.\n\t\tconst batchOrigin = peerOrigin?.origin ?? instanceId;\n\t\tconst batchOriginVersion = peerOrigin?.originVersion ?? batchVersion;\n\t\tfor (const { table, change } of changes) {\n\t\t\tlogChange(batchVersion, {\n\t\t\t\tversion: batchVersion,\n\t\t\t\ttable,\n\t\t\t\tchange,\n\t\t\t\tat: batchAt,\n\t\t\t\torigin: batchOrigin,\n\t\t\t\toriginVersion: batchOriginVersion\n\t\t\t});\n\t\t\temitActivity({\n\t\t\t\ttype: 'change',\n\t\t\t\tat: batchAt,\n\t\t\t\ttable,\n\t\t\t\top: change.op,\n\t\t\t\tversion: batchVersion\n\t\t\t});\n\t\t\treactiveChanges.push({\n\t\t\t\ttable,\n\t\t\t\tkey: changedKeyFor(table, change),\n\t\t\t\trow: change.row\n\t\t\t});\n\t\t\tfor (const subscription of subscriptionsForTable(table)) {\n\t\t\t\t// Apply in order to keep operator state correct; collect to merge.\n\t\t\t\tconst diff = await subscriptionDiff(\n\t\t\t\t\tsubscription,\n\t\t\t\t\ttable,\n\t\t\t\t\tchange\n\t\t\t\t);\n\t\t\t\tconst list = perSubscription.get(subscription);\n\t\t\t\tif (list === undefined) {\n\t\t\t\t\tperSubscription.set(subscription, [diff]);\n\t\t\t\t} else {\n\t\t\t\t\tlist.push(diff);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Gather all emissions before sending any, so the whole batch — view diffs\n\t\t// and reactive re-runs (async) — leaves as one coalesced frame.\n\t\tconst emissions: [ActiveSubscription, ViewDiff<unknown>][] = [];\n\t\tfor (const [subscription, diffs] of perSubscription) {\n\t\t\tconst merged =\n\t\t\t\tdiffs.length === 1\n\t\t\t\t\t? diffs[0]!\n\t\t\t\t\t: mergeViewDiffs(diffs, subscription.key);\n\t\t\tif (!isEmptyViewDiff(merged)) {\n\t\t\t\temissions.push([subscription, merged]);\n\t\t\t}\n\t\t}\n\t\temissions.push(...(await reactivePairs(reactiveChanges)));\n\t\temissions.push(...searchPairs(changes));\n\t\tconst cursorForBatch = currentCursor();\n\t\tfor (const [subscription, diff] of emissions) {\n\t\t\tsubscription.onDiff(diff, batchVersion, cursorForBatch);\n\t\t}\n\t\tif (shouldBroadcast) {\n\t\t\tbroadcast(changes, batchVersion);\n\t\t}\n\t};\n\n\t/**\n\t * Normalize a `since` value (number or cursor string) into a per-origin\n\t * version vector. A bare `number` is treated as legacy 1.16- form — the\n\t * version of THIS instance. A cursor string is the 1.17.0+ multi-origin\n\t * shape encoded by `currentCursor()`.\n\t */\n\tconst normalizeSince = (since: number | string): Record<string, number> | null => {\n\t\tif (typeof since === 'number') {\n\t\t\treturn { [instanceId]: since };\n\t\t}\n\t\treturn decodeCursor(since);\n\t};\n\n\t/**\n\t * Can we replay `(since, now]` from the log for `tables`? With a cursor,\n\t * this is a per-origin coverage check — every entry the client hasn't\n\t * seen MUST be present in our log. Pre-1.16 `number` form matches when\n\t * the local log covers `(since.version, now]`. Returns `false` for\n\t * non-incremental subs (refetch/join/graph/search), since those can't be\n\t * replayed precisely from a row-change log.\n\t */\n\tconst canResume = (since: number | string, incremental: boolean): boolean => {\n\t\tif (!incremental) {\n\t\t\treturn false;\n\t\t}\n\t\tconst sinceVec = normalizeSince(since);\n\t\tif (sinceVec === null) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Walk the log backwards: every entry with `origin === O` and\n\t\t// `originVersion > sinceVec[O]` MUST appear in the log. If the log\n\t\t// has been trimmed past any such entry, we can't catch up.\n\t\t// Per-origin: for each origin O we've seen, check that the oldest\n\t\t// entry with that origin is no newer than `sinceVec[O] + 1`. For\n\t\t// an unknown origin, we fall back to \"no coverage\" (caller gets a\n\t\t// snapshot, just like pre-1.17 behavior).\n\t\tconst oldestPerOrigin = new Map<string, number>();\n\t\tfor (const entry of changeLog) {\n\t\t\tconst current = oldestPerOrigin.get(entry.origin);\n\t\t\tif (current === undefined || entry.originVersion < current) {\n\t\t\t\toldestPerOrigin.set(entry.origin, entry.originVersion);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [origin, lastSeen] of Object.entries(sinceVec)) {\n\t\t\t// Special case: if we've never seen any entry from this origin,\n\t\t\t// but the client claims to have seen up to `lastSeen` from it,\n\t\t\t// we DEFINITELY can't reconstruct — snapshot it.\n\t\t\tif (origin === instanceId) {\n\t\t\t\t// Local origin: standard check.\n\t\t\t\tif (lastSeen >= version) continue; // nothing newer\n\t\t\t\tconst oldestLocal = oldestPerOrigin.get(instanceId);\n\t\t\t\tif (oldestLocal === undefined || oldestLocal > lastSeen + 1) return false;\n\t\t\t} else {\n\t\t\t\t// Peer origin: same check against the peer's entries.\n\t\t\t\tconst oldestPeer = oldestPerOrigin.get(origin);\n\t\t\t\tif (oldestPeer === undefined) {\n\t\t\t\t\t// We've never logged any change from this peer. If the client\n\t\t\t\t\t// has seen entries from this peer, we can't help.\n\t\t\t\t\tif (lastSeen > 0) return false;\n\t\t\t\t} else if (oldestPeer > lastSeen + 1) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t};\n\n\t/**\n\t * Build a catch-up diff from the log for one subscription (last op per\n\t * key wins). Multi-origin aware (1.17.0+): walks every entry whose\n\t * `(origin, originVersion)` is newer than the client's last-seen for\n\t * that origin.\n\t */\n\tconst buildCatchup = (\n\t\tsince: number | string,\n\t\ttables: string[],\n\t\tkey: (row: unknown) => RowKey,\n\t\tmatch: (row: unknown) => boolean\n\t): ViewDiff<unknown> => {\n\t\tconst sinceVec = normalizeSince(since) ?? {};\n\t\tconst latest = new Map<\n\t\t\tRowKey,\n\t\t\t{ op: 'upsert' | 'remove'; row: unknown }\n\t\t>();\n\t\tfor (const entry of changeLog) {\n\t\t\tif (!tables.includes(entry.table)) continue;\n\t\t\t// Skip entries the client has already seen for this origin.\n\t\t\tconst lastSeen = sinceVec[entry.origin];\n\t\t\tif (lastSeen !== undefined && entry.originVersion <= lastSeen) continue;\n\t\t\tconst row = entry.change.row;\n\t\t\tconst present =\n\t\t\t\tentry.change.op !== 'delete' && match(row)\n\t\t\t\t\t? 'upsert'\n\t\t\t\t\t: 'remove';\n\t\t\tlatest.set(key(row), { op: present, row });\n\t\t}\n\t\tconst changed: unknown[] = [];\n\t\tconst removed: unknown[] = [];\n\t\tfor (const { op, row } of latest.values()) {\n\t\t\t(op === 'upsert' ? changed : removed).push(row);\n\t\t}\n\t\treturn { added: [], removed, changed };\n\t};\n\n\tconst subscribeJoin = async (\n\t\tcollection: string,\n\t\tdefinition: JoinCollectionDefinition<\n\t\t\tunknown,\n\t\t\tunknown,\n\t\t\tunknown,\n\t\t\tunknown,\n\t\t\tunknown\n\t\t>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst { left, right } = definition;\n\t\tconst op = createEquiJoin<unknown, unknown, unknown>({\n\t\t\tleftKey: left.key,\n\t\t\trightKey: right.key,\n\t\t\tleftOn: left.on,\n\t\t\trightOn: right.on,\n\t\t\tselect: definition.select\n\t\t});\n\t\top.hydrate(\n\t\t\t[...(await left.hydrate(params, ctx))],\n\t\t\t[...(await right.hydrate(params, ctx))]\n\t\t);\n\t\tconst atVersion = version;\n\n\t\tconst subscription: ActiveSubscription = {\n\t\t\tkind: 'join',\n\t\t\tcollection,\n\t\t\tjoin: {\n\t\t\t\top,\n\t\t\t\tleftTable: left.table,\n\t\t\t\trightTable: right.table,\n\t\t\t\tleftMatch: left.match\n\t\t\t\t\t? (row) => left.match!(row, params, ctx)\n\t\t\t\t\t: undefined,\n\t\t\t\trightMatch: right.match\n\t\t\t\t\t? (row) => right.match!(row, params, ctx)\n\t\t\t\t\t: undefined\n\t\t\t},\n\t\t\tkey: definition.key as (row: unknown) => RowKey,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\n\t\treturn {\n\t\t\tinitial: op.rows(),\n\t\t\tcursor: currentCursor(),\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst subscribeGraph = async (\n\t\tcollection: string,\n\t\tdefinition: GraphCollectionDefinition<unknown, unknown, unknown>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst instance = definition.query.instantiate(params, ctx);\n\t\tconst initial = await instance.hydrate();\n\t\tconst atVersion = version;\n\t\tconst subscription: ActiveSubscription = {\n\t\t\tkind: 'graph',\n\t\t\tcollection,\n\t\t\tinstance,\n\t\t\tkey: definition.key as (row: unknown) => RowKey,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\t\treturn {\n\t\t\tinitial,\n\t\t\tcursor: currentCursor(),\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst subscribeReactive = async (\n\t\tcollection: string,\n\t\tdefinition: ReactiveQueryDefinition<unknown, unknown, unknown>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// Each run gets a fresh read set; the handle records tables + row keys read.\n\t\tconst rerun = async () => {\n\t\t\tconst readTables = new Set<string>();\n\t\t\tconst readKeys = new Set<string>();\n\t\t\tconst rangeDeps: RangeDep[] = [];\n\t\t\tconst db = makeReadHandle(ctx, readTables, readKeys, rangeDeps);\n\t\t\tconst rows = [...(await definition.run({ ctx, db, params }))];\n\t\t\treturn { rangeDeps, readKeys, readTables, rows };\n\t\t};\n\t\tconst rerunKey = stableSubKey(collection, params, ctx);\n\t\t// Cross-client cache hit (1.3+): a previous subscriber with the same\n\t\t// (collection, params, ctx) ran the query body recently and its\n\t\t// result is still valid (no overlapping write since). Reuse it\n\t\t// instead of hitting the DB again. Cache misses fall through to\n\t\t// `rerun()` and populate the cache for the next subscriber.\n\t\tconst cached = readCacheEntry(rerunKey);\n\t\tconst first =\n\t\t\tcached !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\trangeDeps: cached.rangeDeps,\n\t\t\t\t\t\treadKeys: cached.readKeys,\n\t\t\t\t\t\treadTables: cached.readTables,\n\t\t\t\t\t\trows: cached.rows\n\t\t\t\t\t}\n\t\t\t\t: await rerun();\n\t\tif (cached === undefined) {\n\t\t\twriteCacheEntry({\n\t\t\t\texpiresAt: Date.now() + reactiveCacheTtlMs,\n\t\t\t\trangeDeps: first.rangeDeps,\n\t\t\t\treadKeys: first.readKeys,\n\t\t\t\treadTables: first.readTables,\n\t\t\t\trerunKey,\n\t\t\t\trows: first.rows,\n\t\t\t\tversion\n\t\t\t});\n\t\t}\n\t\tconst current = new Map<RowKey, unknown>();\n\t\tfor (const row of first.rows) {\n\t\t\tcurrent.set(definition.key(row), row);\n\t\t}\n\t\tconst atVersion = version;\n\t\tconst subscription: ReactiveSub = {\n\t\t\tkind: 'reactive',\n\t\t\tcollection,\n\t\t\tkey: definition.key,\n\t\t\trerun,\n\t\t\trerunKey,\n\t\t\tcurrent,\n\t\t\treadTables: first.readTables,\n\t\t\treadKeys: first.readKeys,\n\t\t\trangeDeps: first.rangeDeps,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\t\treactiveSubs.add(subscription);\n\t\treturn {\n\t\t\tinitial: first.rows,\n\t\t\tcursor: currentCursor(),\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t\treactiveSubs.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst subscribeSearch = async (\n\t\tcollection: string,\n\t\tdefinition: SearchCollectionDefinition<unknown, unknown, unknown>,\n\t\tparams: unknown,\n\t\tctx: unknown,\n\t\tonDiff: OnDiff,\n\t\tset: Set<ActiveSubscription>\n\t): Promise<Subscription<unknown>> => {\n\t\t// The subscription params are the query (a string for text, a vector for\n\t\t// similarity).\n\t\tconst query = params;\n\t\tif (definition.authorize !== undefined) {\n\t\t\tconst allowed = await definition.authorize(query, ctx);\n\t\t\tif (!allowed) {\n\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst entry = await ensureSearchIndex(definition);\n\t\tconst limit = definition.limit ?? 20;\n\t\tconst readRule = readRuleFor(definition.table);\n\t\t// Re-rank: top-K from the (shared, live) index, scoped by the read rule,\n\t\t// each row tagged with its score so the client can sort by relevance.\n\t\tconst rerun = (): unknown[] => {\n\t\t\tconst candidates = entry.index.search(\n\t\t\t\tquery,\n\t\t\t\treadRule ? limit * 5 : limit\n\t\t\t);\n\t\t\tconst visible = readRule\n\t\t\t\t? candidates.filter((hit) => readRule(ctx, hit.row))\n\t\t\t\t: candidates;\n\t\t\treturn visible.slice(0, limit).map((hit) => ({\n\t\t\t\t...(hit.row as Record<string, unknown>),\n\t\t\t\t[SEARCH_SCORE_FIELD]: hit.score\n\t\t\t}));\n\t\t};\n\t\tconst initial = rerun();\n\t\tconst current = new Map<RowKey, unknown>();\n\t\tfor (const row of initial) {\n\t\t\tcurrent.set(definition.key(row), row);\n\t\t}\n\t\tconst atVersion = version;\n\t\tconst subscription: Extract<ActiveSubscription, { kind: 'search' }> = {\n\t\t\tkind: 'search',\n\t\t\tcollection,\n\t\t\tkey: definition.key,\n\t\t\trerun,\n\t\t\tcurrent,\n\t\t\tonDiff\n\t\t};\n\t\tset.add(subscription);\n\t\tsearchSubs.add(subscription);\n\t\treturn {\n\t\t\tinitial,\n\t\t\tcursor: currentCursor(),\n\t\t\tversion: atVersion,\n\t\t\tunsubscribe: () => {\n\t\t\t\tset.delete(subscription);\n\t\t\t\tsearchSubs.delete(subscription);\n\t\t\t}\n\t\t};\n\t};\n\n\tconst engine: SyncEngine = {\n\t\tregister: (collection) => {\n\t\t\tregistry.set(collection.name, collection);\n\t\t\tfor (const table of collection.tables ?? [collection.name]) {\n\t\t\t\taddTableIndex(table, collection.name);\n\t\t\t}\n\t\t},\n\n\t\tregisterJoin: (collection) => {\n\t\t\tregistry.set(collection.name, collection);\n\t\t\taddTableIndex(collection.left.table, collection.name);\n\t\t\taddTableIndex(collection.right.table, collection.name);\n\t\t},\n\n\t\tregisterGraph: (collection) => {\n\t\t\tregistry.set(collection.name, collection);\n\t\t\tfor (const table of collection.query.tables()) {\n\t\t\t\taddTableIndex(table, collection.name);\n\t\t\t}\n\t\t},\n\n\t\tregisterSearch: (collection) => {\n\t\t\t// Like reactive: not in tableIndex — its index is driven directly by\n\t\t\t// searchPairs off the change feed.\n\t\t\tregistry.set(collection.name, collection);\n\t\t},\n\n\t\tsubscribe: async ({ collection, params, ctx, onDiff, since, signal }) => {\n\t\t\t// (1.15.0) Cheap up-front check — if the consumer already aborted\n\t\t\t// before we got here, throw before any side effect (no authorize,\n\t\t\t// no hydrate, no view materialization).\n\t\t\tcheckAborted(signal);\n\n\t\t\tconst registered = registry.get(collection);\n\t\t\tif (registered === undefined) {\n\t\t\t\tthrow new Error(`Unknown collection \"${collection}\"`);\n\t\t\t}\n\n\t\t\tconst typedOnDiff = onDiff as OnDiff;\n\t\t\tconst subscribeSet = subsFor(collection);\n\n\t\t\t// Wrap the eventual return so we (a) re-check signal after the\n\t\t\t// async setup (catches mid-flight aborts), and (b) auto-call\n\t\t\t// unsubscribe when signal fires after the subscription is live.\n\t\t\tconst wrapReturn = <T>(sub: Subscription<T>): Subscription<T> => {\n\t\t\t\tcheckAborted(signal);\n\t\t\t\tlinkAbortToUnsubscribe(signal, sub.unsubscribe);\n\t\t\t\treturn sub;\n\t\t\t};\n\n\t\t\tconst registeredKind = (registered as { kind?: string }).kind;\n\t\t\tif (registeredKind === 'join') {\n\t\t\t\tconst joined = await subscribeJoin(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as JoinCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(joined) as Subscription<never>;\n\t\t\t}\n\t\t\tif (registeredKind === 'graph') {\n\t\t\t\tconst graphed = await subscribeGraph(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as GraphCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(graphed) as Subscription<never>;\n\t\t\t}\n\t\t\tif (registeredKind === 'reactive') {\n\t\t\t\tconst reactived = await subscribeReactive(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as ReactiveQueryDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(reactived) as Subscription<never>;\n\t\t\t}\n\t\t\tif (registeredKind === 'search') {\n\t\t\t\tconst searched = await subscribeSearch(\n\t\t\t\t\tcollection,\n\t\t\t\t\tregistered as SearchCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t\tparams,\n\t\t\t\t\tctx,\n\t\t\t\t\ttypedOnDiff,\n\t\t\t\t\tsubscribeSet\n\t\t\t\t);\n\t\t\t\treturn wrapReturn(searched) as Subscription<never>;\n\t\t\t}\n\t\t\tconst definition = registered as CollectionDefinition<\n\t\t\t\tunknown,\n\t\t\t\tunknown,\n\t\t\t\tunknown\n\t\t\t>;\n\n\t\t\tif (definition.authorize !== undefined) {\n\t\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\t\tif (!allowed) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t`subscribe to collection \"${collection}\"`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst key = definition.key ?? defaultKey;\n\t\t\tconst match = definition.match;\n\t\t\tconst tables = definition.tables ?? [collection];\n\t\t\t// Declarative read rule + schema migration apply to single-table\n\t\t\t// collections (their rows are that table's rows); join/aggregate\n\t\t\t// collections scope via match.\n\t\t\tconst scopedTable = tables.length === 1 ? tables[0]! : undefined;\n\t\t\tconst readRule =\n\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t? readRuleFor(scopedTable)\n\t\t\t\t\t: undefined;\n\t\t\t// Migrate the DB result to the current shape, then filter it through the\n\t\t\t// read rule — so the initial snapshot and the refetch fallback are\n\t\t\t// always current-shape and never include a row the caller can't see.\n\t\t\tconst rehydrate = async () => {\n\t\t\t\tconst raw = [...(await definition.hydrate(params, ctx))];\n\t\t\t\tconst rows =\n\t\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t\t? raw.map((row) => migrateRow(scopedTable, row))\n\t\t\t\t\t\t: raw;\n\t\t\t\treturn readRule\n\t\t\t\t\t? rows.filter((row) => readRule(ctx, row))\n\t\t\t\t\t: rows;\n\t\t\t};\n\t\t\t// Incremental matching only applies to single-table collections; a\n\t\t\t// join/aggregate spanning tables can't match a single row, so it uses\n\t\t\t// the refetch fallback.\n\t\t\tconst incremental = match !== undefined && tables.length === 1;\n\t\t\t// Fold the read rule into the incremental predicate (also used by the\n\t\t\t// catch-up builder), so an unreadable row never enters the view.\n\t\t\tconst boundMatch = incremental\n\t\t\t\t? (row: unknown) =>\n\t\t\t\t\t\tmatch(row, params, ctx) &&\n\t\t\t\t\t\t(readRule ? readRule(ctx, row) : true)\n\t\t\t\t: () => true;\n\t\t\tconst view = createMaterializedView<unknown>({\n\t\t\t\tkey,\n\t\t\t\tmatch: boundMatch\n\t\t\t});\n\n\t\t\t// Resume from the log when possible (catch-up diff); else send a\n\t\t\t// snapshot. The view is hydrated either way so future changes match.\n\t\t\tconst resuming =\n\t\t\t\tsince !== undefined && canResume(since, incremental);\n\t\t\tview.hydrate([...(await rehydrate())]);\n\t\t\tconst atVersion = version;\n\n\t\t\tconst subscription: ActiveSubscription = {\n\t\t\t\tkind: 'view',\n\t\t\t\tcollection,\n\t\t\t\tview,\n\t\t\t\tincremental,\n\t\t\t\trehydrate,\n\t\t\t\tkey,\n\t\t\t\tonDiff: typedOnDiff\n\t\t\t};\n\t\t\tsubscribeSet.add(subscription);\n\n\t\t\tconst unsubscribe = () => {\n\t\t\t\tsubscribeSet.delete(subscription);\n\t\t\t};\n\n\t\t\tif (resuming) {\n\t\t\t\treturn wrapReturn({\n\t\t\t\t\tinitial: [],\n\t\t\t\t\tcatchup: buildCatchup(\n\t\t\t\t\t\tsince,\n\t\t\t\t\t\ttables,\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tboundMatch\n\t\t\t\t\t) as ViewDiff<never>,\n\t\t\t\t\tcursor: currentCursor(),\n\t\t\t\t\tversion: atVersion,\n\t\t\t\t\tunsubscribe\n\t\t\t\t}) as Subscription<never>;\n\t\t\t}\n\t\t\treturn wrapReturn({\n\t\t\t\tinitial: view.rows() as never[],\n\t\t\t\tcursor: currentCursor(),\n\t\t\t\tversion: atVersion,\n\t\t\t\tunsubscribe\n\t\t\t}) as Subscription<never>;\n\t\t},\n\n\t\thydrate: async (collection, params, ctx, options) => {\n\t\t\tconst signal = options?.signal;\n\t\t\tcheckAborted(signal);\n\t\t\tconst definition = registry.get(collection) as\n\t\t\t\t| CollectionDefinition<unknown, unknown, unknown>\n\t\t\t\t| undefined;\n\t\t\tif (definition === undefined) {\n\t\t\t\tthrow new Error(`Unknown collection \"${collection}\"`);\n\t\t\t}\n\t\t\tif (definition.authorize !== undefined) {\n\t\t\t\tconst allowed = await definition.authorize(params, ctx);\n\t\t\t\tcheckAborted(signal);\n\t\t\t\tif (!allowed) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t`hydrate collection \"${collection}\"`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst raw = [...(await definition.hydrate(params, ctx))];\n\t\t\tcheckAborted(signal);\n\t\t\tconst tables = definition.tables ?? [collection];\n\t\t\tconst scopedTable = tables.length === 1 ? tables[0]! : undefined;\n\t\t\tconst rows =\n\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t? raw.map((row) => migrateRow(scopedTable, row))\n\t\t\t\t\t: raw;\n\t\t\tconst readRule =\n\t\t\t\tscopedTable !== undefined\n\t\t\t\t\t? readRuleFor(scopedTable)\n\t\t\t\t\t: undefined;\n\t\t\treturn readRule ? rows.filter((row) => readRule(ctx, row)) : rows;\n\t\t},\n\n\t\tapplyChange: (table, change) =>\n\t\t\tapplyChange(table, change as RowChange<unknown>),\n\n\t\tconnectSource: async (source) => {\n\t\t\tawait source.start((table, change) => applyChange(table, change));\n\t\t\treturn async () => {\n\t\t\t\tawait source.stop();\n\t\t\t};\n\t\t},\n\n\t\tconnectCluster: async (bus) => {\n\t\t\tconst unsubscribe = await bus.subscribe((message) => {\n\t\t\t\t// Ignore our own broadcasts; apply peers' changes locally without\n\t\t\t\t// re-broadcasting (that would loop).\n\t\t\t\tif (message.origin === instanceId) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// 1.17.0 — log peer changes with their origin + originVersion\n\t\t\t\t// so a client carrying a cross-instance cursor can resume\n\t\t\t\t// against them. Pre-1.17 buses that don't carry originVersion\n\t\t\t\t// default to 0 (any cross-instance resume falls back to a\n\t\t\t\t// snapshot — matches pre-1.17 behavior exactly).\n\t\t\t\tvoid applyChangeBatch(message.changes, false, {\n\t\t\t\t\torigin: message.origin,\n\t\t\t\t\toriginVersion: message.originVersion ?? 0\n\t\t\t\t});\n\t\t\t});\n\t\t\tclusterBus = bus;\n\n\t\t\treturn async () => {\n\t\t\t\tclusterBus = undefined;\n\t\t\t\tawait unsubscribe();\n\t\t\t};\n\t\t},\n\n\t\tsubscriptionCount: (collection) => {\n\t\t\tif (collection !== undefined) {\n\t\t\t\treturn active.get(collection)?.size ?? 0;\n\t\t\t}\n\t\t\tlet total = 0;\n\t\t\tfor (const set of active.values()) {\n\t\t\t\ttotal += set.size;\n\t\t\t}\n\t\t\treturn total;\n\t\t},\n\n\t\tregisterMutation: (mutation) => {\n\t\t\tif (\n\t\t\t\tmutation.handler === undefined &&\n\t\t\t\tmutation.sandboxedHandler === undefined\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Mutation \"${mutation.name}\" must define either \\`handler\\` or \\`sandboxedHandler\\``\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (\n\t\t\t\tmutation.handler !== undefined &&\n\t\t\t\tmutation.sandboxedHandler !== undefined\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Mutation \"${mutation.name}\" defines both \\`handler\\` and \\`sandboxedHandler\\` — pick one`\n\t\t\t\t);\n\t\t\t}\n\t\t\tmutations.set(mutation.name, mutation);\n\t\t\t// Build the sandbox runner eagerly only if we know the source —\n\t\t\t// the actual isolate spawn is still lazy (inside makeSandboxedHandler).\n\t\t\tif (mutation.sandboxedHandler !== undefined) {\n\t\t\t\tsandboxRunners.set(\n\t\t\t\t\tmutation.name,\n\t\t\t\t\tmakeSandboxedHandler(\n\t\t\t\t\t\tmutation.sandboxedHandler,\n\t\t\t\t\t\tmutation.sandbox,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbridgeFetch: options.bridgeFetch,\n\t\t\t\t\t\t\tmetricsHook:\n\t\t\t\t\t\t\t\toptions.handlerMetrics === undefined\n\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t\t\tmutationName: mutation.name,\n\t\t\t\t\t\t\t\t\t\t\tonMetrics: options.handlerMetrics\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tregisterWriter: (table, writer) => {\n\t\t\twriters.set(table, writer as TableWriter);\n\t\t},\n\n\t\tregisterReactive: (query) => {\n\t\t\tregistry.set(query.name, query);\n\t\t},\n\n\t\tregisterReader: (table, reader) => {\n\t\t\treaders.set(table, reader as TableReader);\n\t\t},\n\n\t\tregisterPermissions: (table, rules) => {\n\t\t\tpermissions.set(table, rules as TablePermissions<unknown, unknown>);\n\t\t},\n\n\t\tregisterSchema: (table, schema) => {\n\t\t\tschemas.set(table, schema as TableSchema<unknown>);\n\t\t},\n\n\t\tregisterCrdt: (table, fields) => {\n\t\t\tcrdtFields.set(\n\t\t\t\ttable,\n\t\t\t\tfields as Record<string, CrdtMergeable<unknown>>\n\t\t\t);\n\t\t\t// A ready-made merge mutation so a client needs no custom server code:\n\t\t\t// upsert the row patch — the CRDT auto-merge in makeActions folds the\n\t\t\t// declared fields into the stored row. Named \"<table>:merge\".\n\t\t\tconst name = `${table}:merge`;\n\t\t\tmutations.set(name, {\n\t\t\t\thandler: async (args, ctx, actions) => {\n\t\t\t\t\tconst existing = await readExisting(table, args, ctx);\n\t\t\t\t\treturn existing === undefined\n\t\t\t\t\t\t? actions.insert(table, args)\n\t\t\t\t\t\t: actions.update(table, args);\n\t\t\t\t},\n\t\t\t\tname\n\t\t\t} as MutationDefinition<unknown, unknown, unknown>);\n\t\t},\n\n\t\tmigrate: (table, row) => migrateRow(table, row) as typeof row,\n\n\t\trunMutation: async (name, args, ctx) => {\n\t\t\tconst mutation = mutations.get(name);\n\t\t\tif (mutation === undefined) {\n\t\t\t\tthrow new Error(`Unknown mutation \"${name}\"`);\n\t\t\t}\n\t\t\tif (mutation.authorize !== undefined) {\n\t\t\t\tconst allowed = await mutation.authorize(args, ctx);\n\t\t\t\tif (!allowed) {\n\t\t\t\t\tthrow new UnauthorizedError(`run mutation \"${name}\"`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Pick the handler shape: in-process function or sandboxed string\n\t\t\t// source (runs inside @absolutejs/isolated-jsc). Sandbox runner is\n\t\t\t// built lazily and pre-cached in registerMutation.\n\t\t\tconst sandboxRunner = sandboxRunners.get(name);\n\t\t\tconst invokeHandler =\n\t\t\t\tsandboxRunner !== undefined\n\t\t\t\t\t? sandboxRunner\n\t\t\t\t\t: (\n\t\t\t\t\t\t\ta: unknown,\n\t\t\t\t\t\t\tc: unknown,\n\t\t\t\t\t\t\tactions: MutationActions\n\t\t\t\t\t\t): Promise<unknown> =>\n\t\t\t\t\t\t\tPromise.resolve(\n\t\t\t\t\t\t\t\t// Non-null assertion: registerMutation guarantees one of\n\t\t\t\t\t\t\t\t// handler/sandboxedHandler is defined.\n\t\t\t\t\t\t\t\tmutation.handler!(a, c, actions)\n\t\t\t\t\t\t\t);\n\n\t\t\t// Run the handler (optionally inside the DB transaction), collecting its\n\t\t\t// changes into a fresh buffer per attempt — so a transaction that retries\n\t\t\t// or rolls back never double-emits or leaks a half-applied batch.\n\t\t\tconst runHandler = async (tx: unknown) => {\n\t\t\t\tconst { actions, buffered } = makeActions(tx, ctx, true);\n\t\t\t\tconst result = await invokeHandler(args, ctx, actions);\n\t\t\t\treturn { buffered, result };\n\t\t\t};\n\n\t\t\t// Resolve the retry policy once per call. When `mutation.retry` is\n\t\t\t// undefined we still go through the loop, but bounded to one\n\t\t\t// attempt with no backoff (cheaper than a separate code path).\n\t\t\tconst retry = mutation.retry;\n\t\t\tconst maxAttempts =\n\t\t\t\tretry === undefined ? 1 : (retry.maxAttempts ?? 5);\n\t\t\tconst isRetryable = retry?.isRetryable ?? isSerializationFailure;\n\t\t\tconst computeDelay = retry?.backoff ?? exponentialBackoff();\n\t\t\tconst maxElapsedMs = retry?.maxElapsedMs ?? 30_000;\n\t\t\tconst startedAt = Date.now();\n\n\t\t\t// Each attempt builds fresh `actions`/`buffered` via the makeActions\n\t\t\t// call inside runHandler, so a retry never inherits half-applied\n\t\t\t// buffered changes from a failed attempt. Transactions reopen too:\n\t\t\t// runInTransaction wraps each individual attempt.\n\t\t\tlet lastError: unknown;\n\t\t\tlet attemptsMade = 0;\n\t\t\tmutationsInFlight += 1;\n\t\t\ttry {\n\t\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\t\tattemptsMade = attempt;\n\t\t\t\ttry {\n\t\t\t\t\tconst { buffered, result } =\n\t\t\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t\t\t? await runInTransaction((tx) => runHandler(tx))\n\t\t\t\t\t\t\t: await runHandler(undefined);\n\t\t\t\t\tawait applyChangeBatch(buffered);\n\t\t\t\t\tmutationsCompleted += 1;\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'mutation',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tstatus: 'ok'\n\t\t\t\t\t});\n\t\t\t\t\treturn result;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlastError = error;\n\t\t\t\t\tconst elapsedMs = Date.now() - startedAt;\n\t\t\t\t\tconst canRetry =\n\t\t\t\t\t\tattempt < maxAttempts &&\n\t\t\t\t\t\tisRetryable(error) &&\n\t\t\t\t\t\telapsedMs < maxElapsedMs;\n\t\t\t\t\tif (!canRetry) break;\n\t\t\t\t\tmutationsRetried += 1;\n\n\t\t\t\t\tconst rawDelay = computeDelay(attempt);\n\t\t\t\t\t// Cap the delay so we don't blow past maxElapsedMs while\n\t\t\t\t\t// sleeping. If the cap would be negative we're already past\n\t\t\t\t\t// the budget; treat as exhausted.\n\t\t\t\t\tconst remaining = maxElapsedMs - elapsedMs;\n\t\t\t\t\tif (remaining <= 0) break;\n\t\t\t\t\tconst delayMs = Math.max(0, Math.min(rawDelay, remaining));\n\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'mutationRetry',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\tdelayMs,\n\t\t\t\t\t\terrorName:\n\t\t\t\t\t\t\terror instanceof Error ? error.name : 'Error',\n\t\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t\t: String(error)\n\t\t\t\t\t});\n\t\t\t\t\tif (delayMs > 0) {\n\t\t\t\t\t\tawait new Promise((resolve) =>\n\t\t\t\t\t\t\tsetTimeout(resolve, delayMs)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmutationsFailed += 1;\n\t\t\temitActivity({\n\t\t\t\ttype: 'mutation',\n\t\t\t\tat: Date.now(),\n\t\t\t\tname,\n\t\t\t\tstatus: 'error'\n\t\t\t});\n\t\t\t// Wrap only when we actually burned through more than one attempt\n\t\t\t// — a non-retryable first-attempt failure passes through with its\n\t\t\t// original error preserved, even if `retry` is configured.\n\t\t\tif (attemptsMade > 1) {\n\t\t\t\tthrow new RetriesExhaustedError(\n\t\t\t\t\tattemptsMade,\n\t\t\t\t\tDate.now() - startedAt,\n\t\t\t\t\tlastError\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow lastError;\n\t\t\t} finally {\n\t\t\t\tmutationsInFlight -= 1;\n\t\t\t}\n\t\t},\n\n\t\trunMutations: async (specs, ctx) => {\n\t\t\t// Empty batch: short-circuit. Don't open a DB tx for nothing —\n\t\t\t// some adapters (PG with auto-commit, MySQL with implicit\n\t\t\t// commit, etc.) count even an empty BEGIN/COMMIT as a real\n\t\t\t// transaction, which is wasteful and noisy in observability.\n\t\t\tif (specs.length === 0) return [];\n\t\t\t// Snapshot the requested mutation names up front so the\n\t\t\t// authorization + handler resolution happens BEFORE we open\n\t\t\t// the DB transaction. A typo'd name aborts cleanly without\n\t\t\t// burning a tx.\n\t\t\tconst resolved = specs.map((spec) => {\n\t\t\t\tconst mutation = mutations.get(spec.name);\n\t\t\t\tif (mutation === undefined) {\n\t\t\t\t\tthrow new Error(`Unknown mutation \"${spec.name}\"`);\n\t\t\t\t}\n\t\t\t\treturn { args: spec.args, mutation, name: spec.name };\n\t\t\t});\n\n\t\t\tconst runBatch = async (tx: unknown) => {\n\t\t\t\tconst results: unknown[] = [];\n\t\t\t\tconst accumulated: {\n\t\t\t\t\ttable: string;\n\t\t\t\t\tchange: RowChange<unknown>;\n\t\t\t\t}[] = [];\n\t\t\t\tfor (const { args, mutation, name } of resolved) {\n\t\t\t\t\tif (mutation.authorize !== undefined) {\n\t\t\t\t\t\tconst allowed = await mutation.authorize(args, ctx);\n\t\t\t\t\t\tif (!allowed) {\n\t\t\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t\t\t`run mutation \"${name}\"`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst sandboxRunner = sandboxRunners.get(name);\n\t\t\t\t\tconst invokeHandler =\n\t\t\t\t\t\tsandboxRunner !== undefined\n\t\t\t\t\t\t\t? sandboxRunner\n\t\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\t\ta: unknown,\n\t\t\t\t\t\t\t\t\tc: unknown,\n\t\t\t\t\t\t\t\t\tactions: MutationActions\n\t\t\t\t\t\t\t\t): Promise<unknown> =>\n\t\t\t\t\t\t\t\t\tPromise.resolve(\n\t\t\t\t\t\t\t\t\t\tmutation.handler!(a, c, actions)\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t// Each handler gets its own `actions`/`buffered` so per-\n\t\t\t\t\t// call validation + crdt merges still work — we collect\n\t\t\t\t\t// the buffered tail into `accumulated` after each\n\t\t\t\t\t// handler returns. If the next handler throws, the\n\t\t\t\t\t// surrounding `runInTransaction` rolls everything back;\n\t\t\t\t\t// applyChangeBatch never runs.\n\t\t\t\t\tconst { actions, buffered } = makeActions(tx, ctx, true);\n\t\t\t\t\tconst result = await invokeHandler(args, ctx, actions);\n\t\t\t\t\tresults.push(result);\n\t\t\t\t\taccumulated.push(...buffered);\n\t\t\t\t}\n\t\t\t\treturn { accumulated, results };\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst { accumulated, results } =\n\t\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t\t? await runInTransaction((tx) => runBatch(tx))\n\t\t\t\t\t\t: await runBatch(undefined);\n\t\t\t\tawait applyChangeBatch(accumulated);\n\t\t\t\temitActivity({\n\t\t\t\t\ttype: 'mutationBatch',\n\t\t\t\t\tat: Date.now(),\n\t\t\t\t\tnames: resolved.map((entry) => entry.name),\n\t\t\t\t\tstatus: 'ok'\n\t\t\t\t});\n\t\t\t\treturn results;\n\t\t\t} catch (error) {\n\t\t\t\temitActivity({\n\t\t\t\t\ttype: 'mutationBatch',\n\t\t\t\t\tat: Date.now(),\n\t\t\t\t\tnames: resolved.map((entry) => entry.name),\n\t\t\t\t\tstatus: 'error'\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\n\t\tregisterSchedule: (schedule) => {\n\t\t\tschedules.set(schedule.name, schedule);\n\t\t},\n\n\t\tlistSchedules: () => [...schedules.values()],\n\n\t\trunSchedule: async (name) => {\n\t\t\tconst schedule = schedules.get(name);\n\t\t\tif (schedule === undefined) {\n\t\t\t\tthrow new Error(`Unknown schedule \"${name}\"`);\n\t\t\t}\n\t\t\t// A schedule reads unscoped and writes without permission checks (it's\n\t\t\t// trusted server code); its writes emit as one live batch like a mutation.\n\t\t\tconst runHandler = async (tx: unknown) => {\n\t\t\t\tconst { actions, buffered } = makeActions(tx, {}, false);\n\t\t\t\tconst db = makeReadHandle({}, new Set(), new Set(), [], false);\n\t\t\t\tawait schedule.run({ actions, db });\n\t\t\t\treturn buffered;\n\t\t\t};\n\n\t\t\tconst retry = schedule.retry;\n\t\t\tconst maxAttempts =\n\t\t\t\tretry === undefined ? 1 : (retry.maxAttempts ?? 5);\n\t\t\tconst isRetryable = retry?.isRetryable ?? isSerializationFailure;\n\t\t\tconst computeDelay = retry?.backoff ?? exponentialBackoff();\n\t\t\tconst maxElapsedMs = retry?.maxElapsedMs ?? 30_000;\n\t\t\tconst startedAt = Date.now();\n\n\t\t\tlet lastError: unknown;\n\t\t\tlet attemptsMade = 0;\n\t\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\t\tattemptsMade = attempt;\n\t\t\t\ttry {\n\t\t\t\t\tconst buffered =\n\t\t\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t\t\t? await runInTransaction((tx) => runHandler(tx))\n\t\t\t\t\t\t\t: await runHandler(undefined);\n\t\t\t\t\tawait applyChangeBatch(buffered);\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'schedule',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tstatus: 'ok'\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlastError = error;\n\t\t\t\t\tconst elapsedMs = Date.now() - startedAt;\n\t\t\t\t\tconst canRetry =\n\t\t\t\t\t\tattempt < maxAttempts &&\n\t\t\t\t\t\tisRetryable(error) &&\n\t\t\t\t\t\telapsedMs < maxElapsedMs;\n\t\t\t\t\tif (!canRetry) break;\n\n\t\t\t\t\tconst rawDelay = computeDelay(attempt);\n\t\t\t\t\tconst remaining = maxElapsedMs - elapsedMs;\n\t\t\t\t\tif (remaining <= 0) break;\n\t\t\t\t\tconst delayMs = Math.max(0, Math.min(rawDelay, remaining));\n\n\t\t\t\t\temitActivity({\n\t\t\t\t\t\ttype: 'scheduleRetry',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\tdelayMs,\n\t\t\t\t\t\terrorName:\n\t\t\t\t\t\t\terror instanceof Error ? error.name : 'Error',\n\t\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t\t: String(error)\n\t\t\t\t\t});\n\t\t\t\t\tif (delayMs > 0) {\n\t\t\t\t\t\tawait new Promise((resolve) =>\n\t\t\t\t\t\t\tsetTimeout(resolve, delayMs)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\temitActivity({\n\t\t\t\ttype: 'schedule',\n\t\t\t\tat: Date.now(),\n\t\t\t\tname,\n\t\t\t\tstatus: 'error'\n\t\t\t});\n\t\t\tif (attemptsMade > 1) {\n\t\t\t\tthrow new RetriesExhaustedError(\n\t\t\t\t\tattemptsMade,\n\t\t\t\t\tDate.now() - startedAt,\n\t\t\t\t\tlastError\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow lastError;\n\t\t},\n\n\t\tregisterPack: (pack) => {\n\t\t\tfor (const table of pack.ownsTables) {\n\t\t\t\tconst existing = packTableOwners.get(table);\n\t\t\t\tif (existing !== undefined) {\n\t\t\t\t\tthrow new PackTableConflictError(\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\texisting,\n\t\t\t\t\t\tpack.name\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.requireDependencies === true) {\n\t\t\t\tfor (const table of pack.readsTables ?? []) {\n\t\t\t\t\tif (!readers.has(table)) {\n\t\t\t\t\t\tthrow new PackMissingDependencyError(pack.name, table);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.schemas !== undefined) {\n\t\t\t\tfor (const [table, schema] of Object.entries(pack.schemas)) {\n\t\t\t\t\tengine.registerSchema(table, schema);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.permissions !== undefined) {\n\t\t\t\tfor (const [table, rules] of Object.entries(pack.permissions)) {\n\t\t\t\t\tengine.registerPermissions(table, rules);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.readers !== undefined) {\n\t\t\t\tfor (const [table, reader] of Object.entries(pack.readers)) {\n\t\t\t\t\tengine.registerReader(table, reader);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.writers !== undefined) {\n\t\t\t\tfor (const [table, writer] of Object.entries(pack.writers)) {\n\t\t\t\t\tengine.registerWriter(table, writer);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pack.crdt !== undefined) {\n\t\t\t\tfor (const [table, fields] of Object.entries(pack.crdt)) {\n\t\t\t\t\tengine.registerCrdt(table, fields);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const collection of pack.collections ?? []) {\n\t\t\t\tengine.register(collection);\n\t\t\t}\n\t\t\tfor (const collection of pack.joinCollections ?? []) {\n\t\t\t\tengine.registerJoin(collection);\n\t\t\t}\n\t\t\tfor (const collection of pack.graphCollections ?? []) {\n\t\t\t\tengine.registerGraph(collection);\n\t\t\t}\n\t\t\tfor (const collection of pack.searchCollections ?? []) {\n\t\t\t\tengine.registerSearch(collection);\n\t\t\t}\n\t\t\tfor (const query of pack.reactiveQueries ?? []) {\n\t\t\t\tengine.registerReactive(query);\n\t\t\t}\n\t\t\tfor (const mutation of pack.mutations ?? []) {\n\t\t\t\tengine.registerMutation(mutation);\n\t\t\t}\n\t\t\tfor (const schedule of pack.schedules ?? []) {\n\t\t\t\tengine.registerSchedule(schedule);\n\t\t\t}\n\t\t\tfor (const table of pack.ownsTables) {\n\t\t\t\tpackTableOwners.set(table, pack.name);\n\t\t\t}\n\t\t\tregisteredPacks.push({\n\t\t\t\tname: pack.name,\n\t\t\t\tversion: pack.version,\n\t\t\t\townsTables: [...pack.ownsTables],\n\t\t\t\treadsTables: [...(pack.readsTables ?? [])]\n\t\t\t});\n\t\t},\n\n\t\tinspect: () => {\n\t\t\tconst collections = [...registry.entries()].map(([name, def]) => {\n\t\t\t\tconst kind = ((def as { kind?: CollectionKind }).kind ??\n\t\t\t\t\t'view') as CollectionKind;\n\t\t\t\tlet tables: string[] = [];\n\t\t\t\tif (kind === 'join') {\n\t\t\t\t\tconst join = def as JoinCollectionDefinition<\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>;\n\t\t\t\t\ttables = [join.left.table, join.right.table];\n\t\t\t\t} else if (kind === 'graph') {\n\t\t\t\t\ttables = (\n\t\t\t\t\t\tdef as GraphCollectionDefinition<\n\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\tunknown\n\t\t\t\t\t\t>\n\t\t\t\t\t).query.tables();\n\t\t\t\t} else if (kind === 'search') {\n\t\t\t\t\ttables = [\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\tdef as SearchCollectionDefinition<\n\t\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\t\tunknown,\n\t\t\t\t\t\t\t\tunknown\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t).table\n\t\t\t\t\t];\n\t\t\t\t} else if (kind === 'view') {\n\t\t\t\t\ttables = (\n\t\t\t\t\t\tdef as CollectionDefinition<unknown, unknown, unknown>\n\t\t\t\t\t).tables ?? [name];\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\tkind,\n\t\t\t\t\ttables,\n\t\t\t\t\tsubscriptions: active.get(name)?.size ?? 0\n\t\t\t\t};\n\t\t\t});\n\t\t\tconst DEVTOOLS_RECENT = 50;\n\t\t\treturn {\n\t\t\t\tversion,\n\t\t\t\tcollections,\n\t\t\t\tmutations: [...mutations.keys()],\n\t\t\t\tschedules: [...schedules.values()].map((schedule) => ({\n\t\t\t\t\tname: schedule.name,\n\t\t\t\t\tpattern: schedule.pattern\n\t\t\t\t})),\n\t\t\t\treaders: [...readers.keys()],\n\t\t\t\twriters: [...writers.keys()],\n\t\t\t\trecentChanges: changeLog\n\t\t\t\t\t.slice(-DEVTOOLS_RECENT)\n\t\t\t\t\t.map((entry) => ({\n\t\t\t\t\t\tversion: entry.version,\n\t\t\t\t\t\ttable: entry.table,\n\t\t\t\t\t\top: entry.change.op\n\t\t\t\t\t})),\n\t\t\t\tpacks: registeredPacks.map((pack) => ({\n\t\t\t\t\tname: pack.name,\n\t\t\t\t\tversion: pack.version,\n\t\t\t\t\townsTables: [...pack.ownsTables],\n\t\t\t\t\treadsTables: [...pack.readsTables]\n\t\t\t\t}))\n\t\t\t};\n\t\t},\n\n\t\tmetrics: () => {\n\t\t\tconst now = Date.now();\n\t\t\tconst byCollection: Record<string, number> = {};\n\t\t\tlet totalSubscriptions = 0;\n\t\t\tfor (const [name, subs] of active) {\n\t\t\t\tbyCollection[name] = subs.size;\n\t\t\t\ttotalSubscriptions += subs.size;\n\t\t\t}\n\t\t\tconst oldest = changeLog[0];\n\t\t\treturn {\n\t\t\t\tat: now,\n\t\t\t\tchangeLog: {\n\t\t\t\t\tcapacity: changeLogSize,\n\t\t\t\t\tentries: changeLog.length,\n\t\t\t\t\toldestAgeMs: oldest ? now - oldest.at : null,\n\t\t\t\t\toldestVersion: oldest ? oldest.version : null,\n\t\t\t\t\tretainMs: changeLogRetainMs\n\t\t\t\t},\n\t\t\t\tmutations: {\n\t\t\t\t\tcompleted: mutationsCompleted,\n\t\t\t\t\tfailed: mutationsFailed,\n\t\t\t\t\tinFlight: mutationsInFlight,\n\t\t\t\t\tretried: mutationsRetried\n\t\t\t\t},\n\t\t\t\treactiveCache: {\n\t\t\t\t\tcapacity: reactiveCacheMax,\n\t\t\t\t\tentries: cachedReruns.size\n\t\t\t\t},\n\t\t\t\tschedules: {\n\t\t\t\t\tregistered: schedules.size\n\t\t\t\t},\n\t\t\t\tsubscriptions: {\n\t\t\t\t\tbyCollection,\n\t\t\t\t\ttotal: totalSubscriptions\n\t\t\t\t},\n\t\t\t\tuptimeMs: now - engineStartedAt,\n\t\t\t\tversion\n\t\t\t};\n\t\t},\n\n\t\tonActivity: (listener) => {\n\t\t\tactivityListeners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tactivityListeners.delete(listener);\n\t\t\t};\n\t\t},\n\n\t\tstreamChanges: ({\n\t\t\tsince = 0,\n\t\t\tsignal,\n\t\t\tmaxBuffer = 10_000\n\t\t}: StreamChangesOptions = {}) => {\n\t\t\t// Detect a gap up front so the consumer's `for await` sees the\n\t\t\t// throw immediately rather than after the first historical entry.\n\t\t\t// (We tolerate `since === 0`, which means \"give me everything in\n\t\t\t// the log\"; the gap check only kicks in for a non-zero cursor.)\n\t\t\tconst oldest = changeLog[0];\n\t\t\tif (\n\t\t\t\tsince > 0 &&\n\t\t\t\toldest !== undefined &&\n\t\t\t\toldest.version > since + 1\n\t\t\t) {\n\t\t\t\tconst err = new MissedChangesError(since, oldest.version);\n\t\t\t\treturn {\n\t\t\t\t\t[Symbol.asyncIterator]() {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tnext: () => Promise.reject(err)\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Register the subscriber BEFORE snapshotting history so a commit\n\t\t\t// landing between the snapshot and the live tail can't be missed.\n\t\t\t// Phase 2 dedupes against `cursor`.\n\t\t\tconst buffer: LoggedChange[] = [];\n\t\t\tlet waiter: (() => void) | null = null;\n\t\t\tlet overflow = false;\n\t\t\tconst wake = () => {\n\t\t\t\tif (waiter !== null) {\n\t\t\t\t\tconst resume = waiter;\n\t\t\t\t\twaiter = null;\n\t\t\t\t\tresume();\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst subscriber = (entry: LoggedChange) => {\n\t\t\t\tif (buffer.length >= maxBuffer) {\n\t\t\t\t\toverflow = true;\n\t\t\t\t\twake();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbuffer.push(entry);\n\t\t\t\twake();\n\t\t\t};\n\t\t\tstreamSubscribers.add(subscriber);\n\n\t\t\tconst onAbort = () => wake();\n\t\t\tsignal?.addEventListener('abort', onAbort, { once: true });\n\n\t\t\tlet lastDelivered = since;\n\n\t\t\treturn {\n\t\t\t\tasync *[Symbol.asyncIterator]() {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Phase 1: historical entries. Copy the array so a\n\t\t\t\t\t\t// concurrent log.shift() (when the ring buffer rotates)\n\t\t\t\t\t\t// can't surprise us mid-iteration.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// A single batched mutation writes N rows that all\n\t\t\t\t\t\t// share one version, so we filter on `entry.version >\n\t\t\t\t\t\t// since` directly (no per-yield cursor bump — that\n\t\t\t\t\t\t// would deliver only the first row of every batch).\n\t\t\t\t\t\tconst history = [...changeLog];\n\t\t\t\t\t\tconst headVersion =\n\t\t\t\t\t\t\thistory.length > 0\n\t\t\t\t\t\t\t\t? history[history.length - 1]!.version\n\t\t\t\t\t\t\t\t: since;\n\t\t\t\t\t\tfor (const entry of history) {\n\t\t\t\t\t\t\tif (signal?.aborted) return;\n\t\t\t\t\t\t\tif (entry.version > since) {\n\t\t\t\t\t\t\t\tlastDelivered = entry.version;\n\t\t\t\t\t\t\t\tyield entry;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Phase 2: live tail. Dedupe against `headVersion`\n\t\t\t\t\t\t// (the head of the log when phase 1 finished): any\n\t\t\t\t\t\t// buffered entry with `version <= headVersion` was\n\t\t\t\t\t\t// already yielded from history (a commit between\n\t\t\t\t\t\t// subscriber registration and the snapshot lands in\n\t\t\t\t\t\t// both the buffer and the snapshot).\n\t\t\t\t\t\twhile (!signal?.aborted) {\n\t\t\t\t\t\t\twhile (buffer.length > 0) {\n\t\t\t\t\t\t\t\tconst entry = buffer.shift()!;\n\t\t\t\t\t\t\t\tif (entry.version > headVersion) {\n\t\t\t\t\t\t\t\t\tlastDelivered = entry.version;\n\t\t\t\t\t\t\t\t\tyield entry;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (overflow) {\n\t\t\t\t\t\t\t\tthrow new CdcConsumerSlowError(\n\t\t\t\t\t\t\t\t\tmaxBuffer,\n\t\t\t\t\t\t\t\t\tlastDelivered\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (signal?.aborted) return;\n\t\t\t\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\t\t\t\twaiter = resolve;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tstreamSubscribers.delete(subscriber);\n\t\t\t\t\t\tsignal?.removeEventListener('abort', onAbort);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n\n\treturn engine;\n};\n",
18
18
  "/**\n * `syncCdc` Elysia plugin — exposes {@link SyncEngine.streamChanges} as a\n * Server-Sent Events route. Use this to feed an external CDC consumer\n * (Kafka producer, search indexer, audit pipeline) over plain HTTP, no\n * WebSocket required.\n *\n * Each delivered change becomes one SSE event:\n *\n * id: 1234\n * event: change\n * data: {\"version\":1234,\"table\":\"users\",\"change\":{\"op\":\"insert\",\"row\":{...}}}\n *\n * Consumers track their cursor via the `id` field; on reconnect the browser\n * `EventSource` automatically sends a `Last-Event-ID` header, and this route\n * reads it (or the `?since=N` query param) to resume from the right place.\n *\n * Heartbeats keep the connection alive across idle-proxy timeouts. If the\n * consumer falls so far behind that the engine's in-flight buffer overflows,\n * the engine throws {@link CdcConsumerSlowError}; we forward it as a\n * `error` SSE event so the client knows to resubscribe (vs silently\n * dropping commits).\n */\n\nimport type { Elysia as ElysiaType } from 'elysia';\nimport {\n\tCdcConsumerSlowError,\n\tMissedChangesError,\n\ttype LoggedChange,\n\ttype SyncEngine\n} from './syncEngine';\n\n// Lazy Elysia loader. Elysia is a peer dependency of `@absolutejs/sync`, and\n// callers of `syncCdc` always have it installed (it's an Elysia plugin). The\n// reason for the indirection is that this file lives in the engine subpath\n// barrel (`@absolutejs/sync/engine`), and any top-level `import { Elysia }\n// from 'elysia'` would be hoisted by the bundler so that *every* engine\n// subpath consumer eagerly evaluates Elysia at module load — even consumers\n// that don't use `syncCdc` (e.g. sync packs in `@absolutejs/sync-packs/`).\n// Resolving Elysia on first call instead keeps the engine subpath dependency-\n// free at module-load time.\nlet cachedElysia: typeof ElysiaType | undefined;\nconst loadElysia = (): typeof ElysiaType => {\n\tif (cachedElysia !== undefined) return cachedElysia;\n\t// `require()` resolves synchronously in Bun and Node (via CJS interop),\n\t// runs at *call* time, and the bundler does not hoist it.\n\tconst mod = (require as (id: string) => unknown)('elysia') as {\n\t\tElysia: typeof ElysiaType;\n\t};\n\tcachedElysia = mod.Elysia;\n\treturn cachedElysia;\n};\n\nexport type SyncCdcOptions = {\n\t/** The engine whose change log this route streams. */\n\tengine: SyncEngine;\n\t/** Route path. Defaults to `/sync/cdc`. */\n\tpath?: string;\n\t/** Heartbeat comment interval (ms) so idle proxies don't drop us. Default 25000. */\n\theartbeatMs?: number;\n\t/** Per-stream in-flight buffer cap. Passed to {@link SyncEngine.streamChanges}. Default 10000. */\n\tmaxBuffer?: number;\n};\n\nconst parseSince = (\n\tquery: Record<string, string | undefined>,\n\tlastEventId: string | null\n): number => {\n\tconst raw = query.since ?? lastEventId ?? '0';\n\tconst parsed = Number(raw);\n\treturn Number.isFinite(parsed) && parsed >= 0 ? Math.floor(parsed) : 0;\n};\n\nconst encodeEvent = (\n\tevent: string,\n\tid: number | null,\n\tdata: unknown\n): string => {\n\tconst parts: string[] = [];\n\tif (id !== null) parts.push(`id: ${id}`);\n\tparts.push(`event: ${event}`);\n\tparts.push(`data: ${JSON.stringify(data)}`);\n\treturn `${parts.join('\\n')}\\n\\n`;\n};\n\nexport const syncCdc = ({\n\tengine,\n\tpath = '/sync/cdc',\n\theartbeatMs = 25_000,\n\tmaxBuffer = 10_000\n}: SyncCdcOptions) => {\n\tconst Elysia = loadElysia();\n\treturn new Elysia({ name: '@absolutejs/sync/cdc' }).get(path, (context) => {\n\t\tconst lastEventId = context.request.headers.get('last-event-id');\n\t\tconst since = parseSince(\n\t\t\tcontext.query as Record<string, string | undefined>,\n\t\t\tlastEventId\n\t\t);\n\t\tconst encoder = new TextEncoder();\n\n\t\tconst stream = new ReadableStream<Uint8Array>({\n\t\t\tasync start(controller) {\n\t\t\t\tconst write = (chunk: string) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcontroller.enqueue(encoder.encode(chunk));\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// controller already closed by an abort race\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\twrite(\n\t\t\t\t\tencodeEvent('open', null, {\n\t\t\t\t\t\tsince,\n\t\t\t\t\t\tat: Date.now()\n\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\t\tconst heartbeat = setInterval(\n\t\t\t\t\t() => write(': ping\\n\\n'),\n\t\t\t\t\theartbeatMs\n\t\t\t\t);\n\n\t\t\t\ttry {\n\t\t\t\t\tfor await (const entry of engine.streamChanges({\n\t\t\t\t\t\tsince,\n\t\t\t\t\t\tsignal: context.request.signal,\n\t\t\t\t\t\tmaxBuffer\n\t\t\t\t\t})) {\n\t\t\t\t\t\twrite(\n\t\t\t\t\t\t\tencodeEvent(\n\t\t\t\t\t\t\t\t'change',\n\t\t\t\t\t\t\t\tentry.version,\n\t\t\t\t\t\t\t\tentry satisfies LoggedChange\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (error instanceof MissedChangesError) {\n\t\t\t\t\t\twrite(\n\t\t\t\t\t\t\tencodeEvent('error', null, {\n\t\t\t\t\t\t\t\tname: 'MissedChangesError',\n\t\t\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\t\t\trequestedSince: error.requestedSince,\n\t\t\t\t\t\t\t\tavailableSince: error.availableSince\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (error instanceof CdcConsumerSlowError) {\n\t\t\t\t\t\twrite(\n\t\t\t\t\t\t\tencodeEvent('error', null, {\n\t\t\t\t\t\t\t\tname: 'CdcConsumerSlowError',\n\t\t\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\t\t\tlastDeliveredVersion: error.lastDeliveredVersion\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\twrite(\n\t\t\t\t\t\t\tencodeEvent('error', null, {\n\t\t\t\t\t\t\t\tname:\n\t\t\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t\t\t? error.name\n\t\t\t\t\t\t\t\t\t\t: 'Error',\n\t\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t\t\t\t: String(error)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tclearInterval(heartbeat);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// already closed\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn new Response(stream, {\n\t\t\theaders: {\n\t\t\t\t'cache-control': 'no-cache, no-transform',\n\t\t\t\tconnection: 'keep-alive',\n\t\t\t\t'content-type': 'text/event-stream',\n\t\t\t\t// Tell nginx (and other reverse proxies) not to buffer the\n\t\t\t\t// stream — without this it holds chunks back and the SSE\n\t\t\t\t// connection tears (ERR_INCOMPLETE_CHUNKED_ENCODING).\n\t\t\t\t'x-accel-buffering': 'no'\n\t\t\t}\n\t\t});\n\t});\n};\n",
19
19
  "import { Elysia } from 'elysia';\nimport type { SyncEngine } from './engine/syncEngine';\nimport type { EngineActivity } from './engine/devtools';\n\nexport type SyncDevtoolsOptions = {\n\t/** The engine to inspect. */\n\tengine: SyncEngine;\n\t/** Route the dashboard is served from (its SSE feed is `<path>/stream`). Default `/sync/devtools`. */\n\tpath?: string;\n\t/** Snapshot refresh interval (ms) — keeps subscription counts/version current. Default 2000. */\n\tsnapshotMs?: number;\n};\n\nconst dashboardHtml = (streamPath: string) => `<!doctype html>\n<html lang=\"en\"><head><meta charset=\"utf-8\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n<title>@absolutejs/sync devtools</title>\n<style>\n:root{color-scheme:dark}\nbody{margin:0;font:13px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;background:#0b0e14;color:#cdd6f4}\nheader{padding:12px 16px;border-bottom:1px solid #1c2230;display:flex;align-items:center;gap:12px}\nheader b{color:#89b4fa}\n.ver{margin-left:auto;color:#a6e3a1}\nmain{display:grid;grid-template-columns:1fr 1fr;gap:16px;padding:16px}\nsection{background:#11151f;border:1px solid #1c2230;border-radius:8px;padding:12px;min-width:0}\nh2{margin:0 0 8px;font-size:12px;text-transform:uppercase;letter-spacing:.08em;color:#9399b2}\ntable{width:100%;border-collapse:collapse}\ntd,th{text-align:left;padding:4px 6px;border-bottom:1px solid #1c2230;vertical-align:top}\nth{color:#7f849c;font-weight:600}\n.kind{color:#f9e2af}.tables{color:#94e2d5}.subs{color:#89b4fa;text-align:right}\n.log{grid-column:1/3;max-height:46vh;overflow:auto}\n.row{display:flex;gap:10px;padding:3px 6px;border-bottom:1px solid #161b27}\n.row time{color:#6c7086;flex:0 0 92px}\n.t-change{color:#94e2d5}.t-mutation{color:#cba6f7}.err{color:#f38ba8}\n.pill{padding:0 6px;border-radius:10px;background:#1c2230;flex:0 0 auto}\n.empty{color:#6c7086;padding:6px}\n</style></head>\n<body>\n<header><b>@absolutejs/sync</b> devtools <span id=\"status\" class=\"empty\">connecting…</span><span class=\"ver\">v<span id=\"version\">0</span></span></header>\n<main>\n<section><h2>Collections</h2><table><thead><tr><th>name</th><th>kind</th><th>tables</th><th class=\"subs\">subs</th></tr></thead><tbody id=\"collections\"></tbody></table></section>\n<section><h2>Mutations · Schedules</h2><div id=\"ops\"></div></section>\n<section class=\"log\"><h2>Activity</h2><div id=\"activity\"><div class=\"empty\">waiting for changes &amp; mutations…</div></div></section>\n</main>\n<script>\nconst $=(id)=>document.getElementById(id);\nconst esc=(s)=>String(s).replace(/[&<>]/g,(c)=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));\nconst renderSnapshot=(s)=>{\n $('version').textContent=s.version;\n $('collections').innerHTML=s.collections.length?s.collections.map((c)=>\n '<tr><td>'+esc(c.name)+'</td><td class=\"kind\">'+esc(c.kind)+'</td><td class=\"tables\">'+esc(c.tables.join(', ')||'—')+'</td><td class=\"subs\">'+c.subscriptions+'</td></tr>').join(''):'<tr><td colspan=\"4\" class=\"empty\">none registered</td></tr>';\n $('ops').innerHTML=\n '<p><b>mutations</b> '+(s.mutations.map(esc).join(', ')||'<span class=\"empty\">none</span>')+'</p>'+\n '<p><b>schedules</b> '+(s.schedules.map((x)=>esc(x.name)+' <span class=\"pill\">'+esc(x.pattern)+'</span>').join(' ')||'<span class=\"empty\">none</span>')+'</p>'+\n '<p><b>writers</b> '+(s.writers.map(esc).join(', ')||'<span class=\"empty\">none</span>')+'</p>'+\n '<p><b>readers</b> '+(s.readers.map(esc).join(', ')||'<span class=\"empty\">none</span>')+'</p>';\n};\nlet logged=false;\nconst logActivity=(a)=>{\n const box=$('activity');\n if(!logged){box.innerHTML='';logged=true;}\n const t=new Date(a.at).toLocaleTimeString();\n const line=a.type==='change'\n ?'<span class=\"t-change\">change</span><span class=\"pill\">'+esc(a.table)+'</span>'+esc(a.op)+' <span class=\"empty\">v'+a.version+'</span>'\n :'<span class=\"t-mutation '+(a.status==='error'?'err':'')+'\">mutation</span><span class=\"pill\">'+esc(a.name)+'</span>'+esc(a.status);\n const row=document.createElement('div');row.className='row';\n row.innerHTML='<time>'+t+'</time><div>'+line+'</div>';\n box.prepend(row);\n while(box.childNodes.length>200)box.removeChild(box.lastChild);\n};\nconst src=new EventSource('${streamPath}');\nsrc.addEventListener('open',()=>{$('status').textContent='live';$('status').className='';});\nsrc.addEventListener('error',()=>{$('status').textContent='reconnecting…';$('status').className='empty';});\nsrc.addEventListener('snapshot',(e)=>renderSnapshot(JSON.parse(e.data)));\nsrc.addEventListener('activity',(e)=>logActivity(JSON.parse(e.data)));\n</script></body></html>`;\n\n/**\n * Elysia plugin: a live devtools dashboard for a {@link SyncEngine}. Mount it and\n * open `path` in a browser to watch registered collections (kind, source tables,\n * live subscription counts), mutations, schedules, readers/writers, the\n * change-feed version, and a streaming log of changes + mutation outcomes — over\n * Server-Sent Events. Read-only; safe to leave mounted in dev.\n */\nexport const syncDevtools = ({\n\tengine,\n\tpath = '/sync/devtools',\n\tsnapshotMs = 2000\n}: SyncDevtoolsOptions) => {\n\tconst streamPath = `${path}/stream`;\n\n\treturn new Elysia({ name: '@absolutejs/sync/devtools' })\n\t\t.get(\n\t\t\tpath,\n\t\t\t() =>\n\t\t\t\tnew Response(dashboardHtml(streamPath), {\n\t\t\t\t\theaders: { 'content-type': 'text/html; charset=utf-8' }\n\t\t\t\t})\n\t\t)\n\t\t.get(streamPath, (context) => {\n\t\t\tconst encoder = new TextEncoder();\n\t\t\tconst stream = new ReadableStream<Uint8Array>({\n\t\t\t\tstart(controller) {\n\t\t\t\t\tconst write = (chunk: string) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcontroller.enqueue(encoder.encode(chunk));\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// controller already closed by an abort race\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tconst sendSnapshot = () => {\n\t\t\t\t\t\twrite(\n\t\t\t\t\t\t\t`event: snapshot\\ndata: ${JSON.stringify(engine.inspect())}\\n\\n`\n\t\t\t\t\t\t);\n\t\t\t\t\t};\n\t\t\t\t\tconst sendActivity = (event: EngineActivity) => {\n\t\t\t\t\t\twrite(\n\t\t\t\t\t\t\t`event: activity\\ndata: ${JSON.stringify(event)}\\n\\n`\n\t\t\t\t\t\t);\n\t\t\t\t\t};\n\n\t\t\t\t\tsendSnapshot();\n\t\t\t\t\tconst unsubscribe = engine.onActivity(sendActivity);\n\t\t\t\t\tconst snapshot = setInterval(sendSnapshot, snapshotMs);\n\n\t\t\t\t\tcontext.request.signal.addEventListener(\n\t\t\t\t\t\t'abort',\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tclearInterval(snapshot);\n\t\t\t\t\t\t\tunsubscribe();\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t// already closed\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ once: true }\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn new Response(stream, {\n\t\t\t\theaders: {\n\t\t\t\t\t'cache-control': 'no-cache, no-transform',\n\t\t\t\t\tconnection: 'keep-alive',\n\t\t\t\t\t'content-type': 'text/event-stream',\n\t\t\t\t\t// Tell nginx (and other reverse proxies) not to buffer the\n\t\t\t\t\t// stream — without this it holds chunks back and the SSE\n\t\t\t\t\t// connection tears (ERR_INCOMPLETE_CHUNKED_ENCODING).\n\t\t\t\t\t'x-accel-buffering': 'no'\n\t\t\t\t}\n\t\t\t});\n\t\t});\n};\n",
20
20
  "/**\n * Presence — ephemeral, room-scoped state shared over the live socket (who's\n * online, who's typing, cursor positions). Unlike collections it is **not**\n * persisted: it lives only while a member is joined, and a member's state is\n * removed (and peers notified) the moment it leaves or its connection drops.\n *\n * A `room` is any string (a document id, a channel). Each `member` is one\n * participant (typically one connection) with a `state` it owns and updates;\n * everyone in the room sees the member set and its changes.\n */\n\nexport type PresenceMember<S = unknown> = { id: string; state: S };\n\n/** What changed in a room: members that joined, updated state, or left. */\nexport type PresenceDiff<S = unknown> = {\n\tjoined: PresenceMember<S>[];\n\tupdated: PresenceMember<S>[];\n\tleft: string[];\n};\n\nexport type PresenceHandle<S> = {\n\t/** The room's members at join time (including this one). */\n\tmembers: PresenceMember<S>[];\n\t/** Replace this member's state and notify the rest of the room. */\n\tset: (state: S) => void;\n\t/** Leave the room (remove this member; notify peers). */\n\tleave: () => void;\n};\n\nexport type PresenceHub = {\n\t/**\n\t * Join `room` as `memberId` with `state`; `onDiff` receives every later change\n\t * to the room (not this member's own join). Returns the current members and\n\t * handles to update/leave.\n\t */\n\tjoin: <S>(\n\t\troom: string,\n\t\tmemberId: string,\n\t\tstate: S,\n\t\tonDiff: (diff: PresenceDiff<S>) => void\n\t) => PresenceHandle<S>;\n\t/** Snapshot a room's members without joining. */\n\tmembers: <S = unknown>(room: string) => PresenceMember<S>[];\n\t/** Number of members in a room (0 if none). */\n\tcount: (room: string) => number;\n};\n\ntype RoomMember = {\n\tstate: unknown;\n\tonDiff: (diff: PresenceDiff<unknown>) => void;\n};\n\n/**\n * Create an in-process presence hub. Transport-agnostic (no socket import): the\n * sync connection wires client `presence-*` frames to it and tears down a\n * connection's memberships on close.\n */\nexport const createPresenceHub = (): PresenceHub => {\n\tconst rooms = new Map<string, Map<string, RoomMember>>();\n\n\tconst roomMembers = (room: string): PresenceMember<unknown>[] => {\n\t\tconst members = rooms.get(room);\n\t\tif (members === undefined) {\n\t\t\treturn [];\n\t\t}\n\t\treturn [...members].map(([id, member]) => ({\n\t\t\tid,\n\t\t\tstate: member.state\n\t\t}));\n\t};\n\n\t/** Notify everyone in `room` except the actor that caused the change. */\n\tconst notify = (\n\t\troom: string,\n\t\tdiff: PresenceDiff<unknown>,\n\t\texceptId: string\n\t) => {\n\t\tconst members = rooms.get(room);\n\t\tif (members === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const [id, member] of members) {\n\t\t\tif (id !== exceptId) {\n\t\t\t\tmember.onDiff(diff);\n\t\t\t}\n\t\t}\n\t};\n\n\treturn {\n\t\tjoin: (room, memberId, state, onDiff) => {\n\t\t\tlet members = rooms.get(room);\n\t\t\tif (members === undefined) {\n\t\t\t\tmembers = new Map();\n\t\t\t\trooms.set(room, members);\n\t\t\t}\n\t\t\tmembers.set(memberId, {\n\t\t\t\tstate,\n\t\t\t\tonDiff: onDiff as (diff: PresenceDiff<unknown>) => void\n\t\t\t});\n\t\t\t// Peers learn this member joined; the joiner gets the snapshot instead.\n\t\t\tnotify(\n\t\t\t\troom,\n\t\t\t\t{ joined: [{ id: memberId, state }], updated: [], left: [] },\n\t\t\t\tmemberId\n\t\t\t);\n\t\t\tconst snapshot = roomMembers(room) as PresenceMember<\n\t\t\t\ttypeof state\n\t\t\t>[];\n\n\t\t\treturn {\n\t\t\t\tmembers: snapshot,\n\t\t\t\tset: (next) => {\n\t\t\t\t\tconst current = rooms.get(room)?.get(memberId);\n\t\t\t\t\tif (current === undefined) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tcurrent.state = next;\n\t\t\t\t\tnotify(\n\t\t\t\t\t\troom,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tjoined: [],\n\t\t\t\t\t\t\tupdated: [{ id: memberId, state: next }],\n\t\t\t\t\t\t\tleft: []\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmemberId\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tleave: () => {\n\t\t\t\t\tconst roomNow = rooms.get(room);\n\t\t\t\t\tif (roomNow?.delete(memberId) !== true) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tnotify(\n\t\t\t\t\t\troom,\n\t\t\t\t\t\t{ joined: [], updated: [], left: [memberId] },\n\t\t\t\t\t\tmemberId\n\t\t\t\t\t);\n\t\t\t\t\tif (roomNow.size === 0) {\n\t\t\t\t\t\trooms.delete(room);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\tmembers: (room) => roomMembers(room) as PresenceMember<never>[],\n\t\tcount: (room) => rooms.get(room)?.size ?? 0\n\t};\n};\n"
21
21
  ],
22
- "mappings": "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",
23
- "debugId": "B96A4C67BAC0D9FB64756E2164756E21",
22
+ "mappings": "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",
23
+ "debugId": "8942CF1B0DE51E1664756E2164756E21",
24
24
  "names": []
25
25
  }