@absolutejs/sync 1.7.6 → 1.7.7
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/engine/index.js +7 -3
- package/dist/engine/index.js.map +5 -5
- package/dist/engine/mutation.d.ts +22 -0
- package/dist/index.js +7 -3
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -11,13 +11,13 @@
|
|
|
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
|
-
"/**\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 isolate spawn + compile (~3–25 ms\n * depending on backend). Every subsequent call is a single\n * `JSObjectCallAsFunction` (FFI) or one postMessage (Worker) — no\n * 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 1.7.4 / isolated-jsc 0.6).** Each mutation is\n * compiled to a {@link Callable} once — a precompiled function expression\n * the sandbox owns by reference. Per call we invoke\n * `callable.call([args, ctx, dispatch])` where `dispatch` is a Reference\n * that bridges `actions.*` back to the host. No globals, no eval per call,\n * no shared-slot serialization machinery.\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 {\n\tCallable,\n\tContext,\n\tIsolate\n} 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 * `Script.runWithMetrics` — 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/**\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/** 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 the same\n\t * `Context.compileCallable`-based hot path; the choice trades cold\n\t * spawn (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};\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 `compileCallable`. The\n * compiled 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) => 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};\n\t\treturn userFn(args, ctx, actions);\n\t}\n`;\n\ntype CompiledMutation = {\n\tcallable: Callable;\n\t/** Per-call actions instances, keyed by callId. Lives for the\n\t * duration of each call. */\n\tcallMap: Map<number, MutationActions>;\n\tcontext: Context;\n\tisolate: Isolate;\n\tnextCallId: number;\n\ttimeoutMs: number;\n};\n\nconst compile = async (\n\tsource: string,\n\tconfig: SandboxConfig\n): Promise<CompiledMutation> => {\n\tconst { createIsolate, Reference } = await loadIsolatedJsc();\n\tconst isolate = await createIsolate({\n\t\tbackend: config.backend ?? 'auto',\n\t\tmemoryLimit: config.memoryLimit ?? 32\n\t});\n\tconst context = await isolate.createContext();\n\n\t// Dispatch installed ONCE per isolate 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 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\tdefault:\n\t\t\t\tthrow new Error(`unknown sandbox action op: ${String(op)}`);\n\t\t}\n\t}) as (...rawArgs: unknown[]) => unknown);\n\tawait context.setGlobal('__dispatch', dispatch);\n\n\tconst callable = await context.compileCallable(wrap(source));\n\treturn {\n\t\tcallable,\n\t\tcallMap,\n\t\tcontext,\n\t\tisolate,\n\t\tnextCallId: 1,\n\t\ttimeoutMs: config.timeout ?? 5000\n\t};\n};\n\n/**\n * Build a lazy runner for one mutation's sandboxed source. The first call\n * compiles the isolate + context + dispatch Reference + callable;\n * subsequent calls only generate a fresh callId, register the per-call\n * `actions` in the callMap, and invoke `callable.call([callId, args,\n * ctx])`. Per-call cost on FFI: one JSObjectCallAsFunction + three\n * cheap primitive packings. No per-call Reference allocation, no\n * 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 * Optional hook + tagging. When `onMetrics` is supplied, every call\n\t * uses `callable.callWithMetrics` (slightly costlier) and fires the\n\t * hook on completion. Without it, the cheap `callable.call` path is\n\t * used and nothing changes vs the pre-1.7.6 contract.\n\t *\n\t * `mutationName` only matters when `onMetrics` is set — it's the\n\t * `mutationName` field of the emitted record.\n\t */\n\tmetricsHook?: {\n\t\tmutationName: string;\n\t\tonMetrics: HandlerMetricsHook;\n\t}\n): ((\n\targs: unknown,\n\tctx: unknown,\n\tactions: MutationActions\n) => Promise<unknown>) => {\n\tlet pending: Promise<CompiledMutation> | undefined;\n\n\tconst getCompiled = async (): Promise<CompiledMutation> => {\n\t\tif (pending !== undefined) {\n\t\t\tconst compiled = await pending;\n\t\t\tif (!compiled.isolate.isDisposed) return compiled;\n\t\t\tpending = undefined; // dead — re-spawn below\n\t\t}\n\t\tpending = compile(source, config);\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.callable.call([callId, args, ctx], {\n\t\t\t\t\ttimeout: compiled.timeoutMs\n\t\t\t\t});\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 `callWithMetrics` so we get cpuMs +\n\t\t// heapBytes from the isolate side. Errors get a synthesized\n\t\t// record 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.callable.callWithMetrics(\n\t\t\t\t[callId, args, ctx],\n\t\t\t\t{ timeout: compiled.timeoutMs }\n\t\t\t);\n\t\t\tfireMetrics(metricsHook.onMetrics, {\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\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 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",
|
|
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 isolate spawn + compile (~3–25 ms\n * depending on backend). Every subsequent call is a single\n * `JSObjectCallAsFunction` (FFI) or one postMessage (Worker) — no\n * 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 1.7.4 / isolated-jsc 0.6).** Each mutation is\n * compiled to a {@link Callable} once — a precompiled function expression\n * the sandbox owns by reference. Per call we invoke\n * `callable.call([args, ctx, dispatch])` where `dispatch` is a Reference\n * that bridges `actions.*` back to the host. No globals, no eval per call,\n * no shared-slot serialization machinery.\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 {\n\tCallable,\n\tContext,\n\tIsolate\n} 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 * `Script.runWithMetrics` — 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/**\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/** 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 the same\n\t * `Context.compileCallable`-based hot path; the choice trades cold\n\t * spawn (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};\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 `compileCallable`. The\n * compiled 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) => 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};\n\t\treturn userFn(args, ctx, actions);\n\t}\n`;\n\ntype CompiledMutation = {\n\tcallable: Callable;\n\t/** Per-call actions instances, keyed by callId. Lives for the\n\t * duration of each call. */\n\tcallMap: Map<number, MutationActions>;\n\tcontext: Context;\n\tisolate: Isolate;\n\tnextCallId: number;\n\ttimeoutMs: number;\n};\n\nconst compile = async (\n\tsource: string,\n\tconfig: SandboxConfig\n): Promise<CompiledMutation> => {\n\tconst { createIsolate, Reference } = await loadIsolatedJsc();\n\tconst isolate = await createIsolate({\n\t\tbackend: config.backend ?? 'auto',\n\t\tmemoryLimit: config.memoryLimit ?? 32\n\t});\n\tconst context = await isolate.createContext();\n\n\t// Dispatch installed ONCE per isolate 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 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\tdefault:\n\t\t\t\tthrow new Error(`unknown sandbox action op: ${String(op)}`);\n\t\t}\n\t}) as (...rawArgs: unknown[]) => unknown);\n\tawait context.setGlobal('__dispatch', dispatch);\n\n\tconst callable = await context.compileCallable(wrap(source));\n\treturn {\n\t\tcallable,\n\t\tcallMap,\n\t\tcontext,\n\t\tisolate,\n\t\tnextCallId: 1,\n\t\ttimeoutMs: config.timeout ?? 5000\n\t};\n};\n\n/**\n * Build a lazy runner for one mutation's sandboxed source. The first call\n * compiles the isolate + context + dispatch Reference + callable;\n * subsequent calls only generate a fresh callId, register the per-call\n * `actions` in the callMap, and invoke `callable.call([callId, args,\n * ctx])`. Per-call cost on FFI: one JSObjectCallAsFunction + three\n * cheap primitive packings. No per-call Reference allocation, no\n * 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 * Optional hook + tagging. When `onMetrics` is supplied, every call\n\t * uses `callable.callWithMetrics` (slightly costlier) and fires the\n\t * hook on completion. Without it, the cheap `callable.call` path is\n\t * used and nothing changes vs the pre-1.7.6 contract.\n\t *\n\t * `mutationName` only matters when `onMetrics` is set — it's the\n\t * `mutationName` field of the emitted record.\n\t */\n\tmetricsHook?: {\n\t\tmutationName: string;\n\t\tonMetrics: HandlerMetricsHook;\n\t}\n): ((\n\targs: unknown,\n\tctx: unknown,\n\tactions: MutationActions\n) => Promise<unknown>) => {\n\tlet pending: Promise<CompiledMutation> | undefined;\n\n\tconst getCompiled = async (): Promise<CompiledMutation> => {\n\t\tif (pending !== undefined) {\n\t\t\tconst compiled = await pending;\n\t\t\tif (!compiled.isolate.isDisposed) return compiled;\n\t\t\tpending = undefined; // dead — re-spawn below\n\t\t}\n\t\tpending = compile(source, config);\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.callable.call([callId, args, ctx], {\n\t\t\t\t\ttimeout: compiled.timeoutMs\n\t\t\t\t});\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 `callWithMetrics` so we get cpuMs +\n\t\t// heapBytes from the isolate side. Errors get a synthesized\n\t\t// record 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.callable.callWithMetrics(\n\t\t\t\t[callId, args, ctx],\n\t\t\t\t{ timeout: compiled.timeoutMs }\n\t\t\t);\n\t\t\tfireMetrics(metricsHook.onMetrics, {\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\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 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
|
"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",
|
|
16
|
-
"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 HandlerMetricsHook,\n\ttype HandlerMetricsRecord,\n\tmakeSandboxedHandler\n} from './sandbox';\nimport type {\n\tPermissionsDefinition,\n\tReadRule,\n\tTablePermissions,\n\tWriteRule\n} from './permissions';\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} 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 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};\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\thydrate: (\n\t\tcollection: string,\n\t\tparams: unknown,\n\t\tctx: unknown\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 * 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 * 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};\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};\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 * 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};\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// 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 changeLog: LoggedChange[] = [];\n\tlet version = 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};\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\tif (changeLog.length > changeLogSize) {\n\t\t\tchangeLog.shift();\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\tlogChange(changeVersion, { version: changeVersion, table, change });\n\t\temitActivity({\n\t\t\ttype: 'change',\n\t\t\tat: Date.now(),\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\tfor (const { table, change } of changes) {\n\t\t\tlogChange(batchVersion, { version: batchVersion, table, change });\n\t\t\temitActivity({\n\t\t\t\ttype: 'change',\n\t\t\t\tat: Date.now(),\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\treturn {\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 }) => {\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\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 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 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 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 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 {\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};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tinitial: view.rows() as never[],\n\t\t\t\tversion: atVersion,\n\t\t\t\tunsubscribe\n\t\t\t};\n\t\t},\n\n\t\thydrate: async (collection, params, ctx) => {\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\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\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\toptions.handlerMetrics === undefined\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\tmutationName: mutation.name,\n\t\t\t\t\t\t\t\t\tonMetrics: options.handlerMetrics\n\t\t\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\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\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\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\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},\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\t\t\tconst buffered =\n\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t? await runInTransaction((tx) => runHandler(tx))\n\t\t\t\t\t: await runHandler(undefined);\n\t\t\tawait applyChangeBatch(buffered);\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};\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",
|
|
16
|
+
"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 HandlerMetricsHook,\n\ttype HandlerMetricsRecord,\n\tmakeSandboxedHandler\n} from './sandbox';\nimport type {\n\tPermissionsDefinition,\n\tReadRule,\n\tTablePermissions,\n\tWriteRule\n} from './permissions';\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} 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 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};\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\thydrate: (\n\t\tcollection: string,\n\t\tparams: unknown,\n\t\tctx: unknown\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 * 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 * 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};\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};\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 * 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};\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// 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 changeLog: LoggedChange[] = [];\n\tlet version = 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\tif (changeLog.length > changeLogSize) {\n\t\t\tchangeLog.shift();\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\tlogChange(changeVersion, { version: changeVersion, table, change });\n\t\temitActivity({\n\t\t\ttype: 'change',\n\t\t\tat: Date.now(),\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\tfor (const { table, change } of changes) {\n\t\t\tlogChange(batchVersion, { version: batchVersion, table, change });\n\t\t\temitActivity({\n\t\t\t\ttype: 'change',\n\t\t\t\tat: Date.now(),\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\treturn {\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 }) => {\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\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 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 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 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 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 {\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};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tinitial: view.rows() as never[],\n\t\t\t\tversion: atVersion,\n\t\t\t\tunsubscribe\n\t\t\t};\n\t\t},\n\n\t\thydrate: async (collection, params, ctx) => {\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\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\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\toptions.handlerMetrics === undefined\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\tmutationName: mutation.name,\n\t\t\t\t\t\t\t\t\tonMetrics: options.handlerMetrics\n\t\t\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\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\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\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\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},\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\t\t\tconst buffered =\n\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t? await runInTransaction((tx) => runHandler(tx))\n\t\t\t\t\t: await runHandler(undefined);\n\t\t\tawait applyChangeBatch(buffered);\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};\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",
|
|
17
17
|
"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 & mutations…</div></div></section>\n</main>\n<script>\nconst $=(id)=>document.getElementById(id);\nconst esc=(s)=>String(s).replace(/[&<>]/g,(c)=>({'&':'&','<':'<','>':'>'}[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}\n\t\t\t});\n\t\t});\n};\n",
|
|
18
18
|
"/**\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"
|
|
19
19
|
],
|
|
20
|
-
"mappings": "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",
|
|
21
|
-
"debugId": "
|
|
20
|
+
"mappings": "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",
|
|
21
|
+
"debugId": "0583BD887ED853F264756E2164756E21",
|
|
22
22
|
"names": []
|
|
23
23
|
}
|