@absolutejs/sync 0.15.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -1
- package/dist/engine/index.js +47 -2
- package/dist/engine/index.js.map +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -29,7 +29,8 @@ queries are matched incrementally; joins (inner and left), aggregations, and
|
|
|
29
29
|
top-N ordering are maintained incrementally through a composable operator graph
|
|
30
30
|
(`query(...).filter().join().leftJoin().groupBy().orderBy()`).
|
|
31
31
|
|
|
32
|
-
> Status:
|
|
32
|
+
> Status: **1.0** — public API frozen across all subpaths. See
|
|
33
|
+
> [`CHANGELOG.md`](./CHANGELOG.md). Tier 1 (hub, SSE plugin, browser subscriber,
|
|
33
34
|
> write-behind cache), Tier 2 (Drizzle + Prisma topic adapters, `createLiveQuery`),
|
|
34
35
|
> and Tier 3 (sync engine: collections, WebSocket diff transport, optimistic
|
|
35
36
|
> mutations + offline queue, a local-first client cache, declarative row-level
|
|
@@ -467,6 +468,23 @@ Conflict-free replicated data types — pure, **zero-dependency**, and isomorphi
|
|
|
467
468
|
| `drizzleCollection({ name, table, where, find, ... })` (drizzle) | Same one-`where`→hydrate+matcher, for Drizzle. |
|
|
468
469
|
| `matchesDrizzleWhere(table, where, row)` (drizzle) | Evaluate a Drizzle SQL `where` against a row (the matcher). |
|
|
469
470
|
|
|
471
|
+
## Benchmarks
|
|
472
|
+
|
|
473
|
+
Run `bun run bench/run.ts`. Highlights (Bun 1.3, full results + methodology in
|
|
474
|
+
[`docs/benchmarks.md`](./docs/benchmarks.md)):
|
|
475
|
+
|
|
476
|
+
- **Delta uploads scale flat.** One keystroke on a 10,000-char doc: a full-state
|
|
477
|
+
upload is ~877 KB; the delta is ~105 bytes — an **8,350×** reduction (and ~84×
|
|
478
|
+
even at 100 chars). The server keeps full state, so late joiners still hydrate
|
|
479
|
+
in one shot.
|
|
480
|
+
- **~50,000 mutations/sec** (write + emit) locally; diff fan-out is linear in
|
|
481
|
+
subscriber count.
|
|
482
|
+
- **Tombstone compaction** halves a delete-heavy document's stored state.
|
|
483
|
+
|
|
484
|
+
`docs/benchmarks.md` also has an architectural comparison with Convex and Zero —
|
|
485
|
+
the short version: live queries, optimistic writes, and conflict-free editing
|
|
486
|
+
**without adopting a new backend** (it rides your own DB/ORM/server).
|
|
487
|
+
|
|
470
488
|
## License
|
|
471
489
|
|
|
472
490
|
MIT
|
package/dist/engine/index.js
CHANGED
|
@@ -1065,6 +1065,44 @@ var shallowEqual4 = (a, b) => {
|
|
|
1065
1065
|
const bKeys = Object.keys(b);
|
|
1066
1066
|
return aKeys.length === bKeys.length && aKeys.every((k) => a[k] === b[k]);
|
|
1067
1067
|
};
|
|
1068
|
+
var subKeyIds = new WeakMap;
|
|
1069
|
+
var subKeyCounter = 0;
|
|
1070
|
+
var stableValueKey = (value) => {
|
|
1071
|
+
if (value === undefined)
|
|
1072
|
+
return "u";
|
|
1073
|
+
if (value === null)
|
|
1074
|
+
return "n";
|
|
1075
|
+
const tag = typeof value;
|
|
1076
|
+
if (tag === "string")
|
|
1077
|
+
return `s:${value}`;
|
|
1078
|
+
if (tag === "number" || tag === "boolean" || tag === "bigint") {
|
|
1079
|
+
return `${tag[0]}:${String(value)}`;
|
|
1080
|
+
}
|
|
1081
|
+
if (tag !== "object")
|
|
1082
|
+
return `${tag[0]}:fn`;
|
|
1083
|
+
try {
|
|
1084
|
+
return `o:${JSON.stringify(value, (_k, v) => {
|
|
1085
|
+
if (v === null || typeof v !== "object" || Array.isArray(v))
|
|
1086
|
+
return v;
|
|
1087
|
+
const record = v;
|
|
1088
|
+
const sorted = {};
|
|
1089
|
+
for (const key of Object.keys(record).sort()) {
|
|
1090
|
+
sorted[key] = record[key];
|
|
1091
|
+
}
|
|
1092
|
+
return sorted;
|
|
1093
|
+
})}`;
|
|
1094
|
+
} catch {
|
|
1095
|
+
const obj = value;
|
|
1096
|
+
let id = subKeyIds.get(obj);
|
|
1097
|
+
if (id === undefined) {
|
|
1098
|
+
subKeyCounter += 1;
|
|
1099
|
+
id = `i${subKeyCounter}`;
|
|
1100
|
+
subKeyIds.set(obj, id);
|
|
1101
|
+
}
|
|
1102
|
+
return `i:${id}`;
|
|
1103
|
+
}
|
|
1104
|
+
};
|
|
1105
|
+
var stableSubKey = (collection, params, ctx) => `${collection}|${stableValueKey(params)}|${stableValueKey(ctx)}`;
|
|
1068
1106
|
var equalsIgnoringScore = (a, b) => {
|
|
1069
1107
|
if (typeof a !== "object" || typeof b !== "object" || a === null || b === null) {
|
|
1070
1108
|
return a === b;
|
|
@@ -1408,11 +1446,17 @@ var createSyncEngine = (options = {}) => {
|
|
|
1408
1446
|
const isReactiveAffected = (sub, changes) => changes.some((change) => sub.readTables.has(change.table) || change.key !== undefined && sub.readKeys.has(depKey(change.table, change.key)) || sub.rangeDeps.some((dep) => inRange(dep, change)));
|
|
1409
1447
|
const reactivePairs = async (changes) => {
|
|
1410
1448
|
const pairs = [];
|
|
1449
|
+
const sharedRuns = new Map;
|
|
1411
1450
|
for (const sub of reactiveSubs) {
|
|
1412
1451
|
if (!isReactiveAffected(sub, changes)) {
|
|
1413
1452
|
continue;
|
|
1414
1453
|
}
|
|
1415
|
-
|
|
1454
|
+
let runPromise = sharedRuns.get(sub.rerunKey);
|
|
1455
|
+
if (runPromise === undefined) {
|
|
1456
|
+
runPromise = sub.rerun();
|
|
1457
|
+
sharedRuns.set(sub.rerunKey, runPromise);
|
|
1458
|
+
}
|
|
1459
|
+
const { rows, readTables, readKeys, rangeDeps } = await runPromise;
|
|
1416
1460
|
sub.readTables = readTables;
|
|
1417
1461
|
sub.readKeys = readKeys;
|
|
1418
1462
|
sub.rangeDeps = rangeDeps;
|
|
@@ -1665,6 +1709,7 @@ var createSyncEngine = (options = {}) => {
|
|
|
1665
1709
|
collection,
|
|
1666
1710
|
key: definition.key,
|
|
1667
1711
|
rerun,
|
|
1712
|
+
rerunKey: stableSubKey(collection, params, ctx),
|
|
1668
1713
|
current,
|
|
1669
1714
|
readTables: first.readTables,
|
|
1670
1715
|
readKeys: first.readKeys,
|
|
@@ -2291,5 +2336,5 @@ export {
|
|
|
2291
2336
|
SEARCH_SCORE_FIELD
|
|
2292
2337
|
};
|
|
2293
2338
|
|
|
2294
|
-
//# debugId=
|
|
2339
|
+
//# debugId=4154536B9F3F3F5A64756E2164756E21
|
|
2295
2340
|
//# sourceMappingURL=index.js.map
|
package/dist/engine/index.js.map
CHANGED
|
@@ -18,12 +18,12 @@
|
|
|
18
18
|
"import type { RowKey } from './types';\nimport type { SearchHit, SearchIndex } from './search';\n\n/**\n * An incremental vector index for semantic / similarity search — the embeddings\n * half of the search surface (see {@link createTextIndex} for keyword search).\n * Pure and dependency-free: an exact (brute-force) k-NN over in-memory vectors,\n * maintained as rows are added/removed, so a {@link defineSearchCollection}\n * stays live. Pairs naturally with `@absolutejs/ai` / `@absolutejs/rag` for RAG\n * retrieval on your own data. Exact search is O(n·d) per query — fine for tens\n * of thousands of vectors; for more, back it with pgvector and a real ANN index.\n */\n\n/** Similarity metric. `cosine`/`dot` rank higher = closer; `euclidean` too (negated distance). */\nexport type VectorMetric = 'cosine' | 'dot' | 'euclidean';\n\nexport type VectorIndexOptions<T> = {\n\t/** Row identity. */\n\tkey: (row: T) => RowKey;\n\t/** Extract a row's embedding vector. */\n\tembedding: (row: T) => number[];\n\t/** Similarity metric. Defaults to `cosine`. */\n\tmetric?: VectorMetric;\n};\n\ntype Entry<T> = { row: T; vec: number[]; norm: number };\n\nconst dot = (first: number[], second: number[]): number => {\n\tconst length = Math.min(first.length, second.length);\n\tlet sum = 0;\n\tfor (let index = 0; index < length; index += 1) {\n\t\tsum += first[index]! * second[index]!;\n\t}\n\treturn sum;\n};\n\nconst normOf = (vec: number[]): number => Math.sqrt(dot(vec, vec));\n\nconst euclidean = (first: number[], second: number[]): number => {\n\tconst length = Math.max(first.length, second.length);\n\tlet sum = 0;\n\tfor (let index = 0; index < length; index += 1) {\n\t\tconst delta = (first[index] ?? 0) - (second[index] ?? 0);\n\t\tsum += delta * delta;\n\t}\n\treturn Math.sqrt(sum);\n};\n\n/**\n * Build an incremental vector index over rows of `T`. Implements the\n * {@link SearchIndex} interface (queried by a query vector), so it plugs\n * straight into a search collection.\n */\nexport const createVectorIndex = <T>(\n\toptions: VectorIndexOptions<T>\n): SearchIndex<T, number[]> => {\n\tconst { key, embedding } = options;\n\tconst metric = options.metric ?? 'cosine';\n\tconst entries = new Map<RowKey, Entry<T>>();\n\n\tconst score = (\n\t\tquery: number[],\n\t\tqueryNorm: number,\n\t\tentry: Entry<T>\n\t): number => {\n\t\tif (metric === 'dot') {\n\t\t\treturn dot(query, entry.vec);\n\t\t}\n\t\tif (metric === 'euclidean') {\n\t\t\treturn -euclidean(query, entry.vec);\n\t\t}\n\t\t// cosine: dot / (|q|·|v|); a zero vector has no direction → score 0.\n\t\tconst denominator = queryNorm * entry.norm;\n\t\treturn denominator === 0 ? 0 : dot(query, entry.vec) / denominator;\n\t};\n\n\treturn {\n\t\tadd: (row) => {\n\t\t\tconst vec = embedding(row);\n\t\t\tentries.set(key(row), { row, vec, norm: normOf(vec) });\n\t\t},\n\t\tremove: (rowKey) => {\n\t\t\tentries.delete(rowKey);\n\t\t},\n\t\tsearch: (query, limit): SearchHit<T>[] => {\n\t\t\tconst queryNorm = normOf(query);\n\t\t\treturn [...entries.values()]\n\t\t\t\t.map((entry) => ({\n\t\t\t\t\trow: entry.row,\n\t\t\t\t\tscore: score(query, queryNorm, entry)\n\t\t\t\t}))\n\t\t\t\t.sort((first, second) => second.score - first.score)\n\t\t\t\t.slice(0, limit);\n\t\t},\n\t\tsize: () => entries.size,\n\t\tclear: () => {\n\t\t\tentries.clear();\n\t\t}\n\t};\n};\n",
|
|
19
19
|
"import type { MutationActions } from './mutation';\nimport type { ReadHandle } from './reactive';\n\n/**\n * Scheduled functions — server-triggered work whose effects flow through the\n * change feed, so what a schedule writes goes live to subscribers with no extra\n * wiring. The engine owns running them (and making them reactive); the trigger\n * is `@elysiajs/cron` via the `scheduled` plugin — cron decides *when*, the\n * engine makes the effect *live*. For durable, retryable work, a schedule can\n * call into `@absolutejs/queue` (cron enqueues; the queue guarantees it runs).\n */\n\n/** What a scheduled function's `run` receives — read current state, write live. */\nexport type ScheduleContext = {\n\t/** Read through registered table readers (unscoped — schedules are trusted). */\n\tdb: ReadHandle;\n\t/**\n\t * Persist + emit changes, exactly like a mutation handler: every\n\t * insert/update/delete goes live as one atomic batch. Write permission rules\n\t * are not applied (a schedule is trusted server code).\n\t */\n\tactions: MutationActions;\n};\n\nexport type ScheduleDefinition = {\n\t/** Schedule name — its identity (the cron job is registered under it). */\n\tname: string;\n\t/**\n\t * Cron pattern (`@elysiajs/cron` / croner syntax; the optional 6th leading\n\t * field is seconds), e.g. `'0 8 * * 1'` (Mondays 08:00) or `'*\\/5 * * * * *'`\n\t * (every 5 seconds).\n\t */\n\tpattern: string;\n\t/** The work to run on each fire. Writes via `ctx.actions` go live. */\n\trun: (ctx: ScheduleContext) => Promise<void> | void;\n};\n\n/**\n * Define a scheduled function. Identity at runtime (for type inference). Register\n * it with {@link SyncEngine.registerSchedule} and wire the triggers with the\n * `scheduled` Elysia plugin.\n */\nexport const defineSchedule = (\n\tdefinition: ScheduleDefinition\n): ScheduleDefinition => definition;\n",
|
|
20
20
|
"import type { CollectionContext } from './collection';\nimport type { RowChange } from './types';\n\n/**\n * How to persist a table — register one with {@link SyncEngine.registerWriter} so\n * `insert`/`update`/`delete` on the mutation actions write to your store (any\n * ORM) and emit the live change in one step. Each function returns the stored\n * row so the emitted diff carries DB-generated fields (ids, timestamps).\n *\n * The third argument is the transaction handle from the engine's\n * {@link TransactionRunner} (or `undefined` if none is configured) — write\n * through it so a mutation's writes commit all-or-nothing.\n */\nexport type TableWriter<Row = any, Ctx = unknown, Tx = unknown> = {\n\tinsert: (data: any, ctx: Ctx, tx: Tx) => Promise<Row> | Row;\n\tupdate: (data: any, ctx: Ctx, tx: Tx) => Promise<Row> | Row;\n\t/** Persist the delete; receives the row/identifier passed to `actions.delete`. */\n\tdelete: (row: any, ctx: Ctx, tx: Tx) => Promise<unknown> | unknown;\n};\n\n/**\n * Runs a function inside your database's transaction, threading the transaction\n * handle to each {@link TableWriter}, so a mutation's writes commit\n * all-or-nothing and the engine emits its diff only after the commit. Configure\n * it on {@link createSyncEngine}. Examples:\n *\n * `(run) => db.transaction(run)` // Drizzle\n * `(run) => prisma.$transaction(run)` // Prisma\n */\nexport type TransactionRunner = <R>(\n\trun: (tx: unknown) => Promise<R>\n) => Promise<R>;\n\n/**\n * Actions a mutation handler uses to write and publish changes.\n *\n * Prefer `insert`/`update`/`delete`: they persist via the table's registered\n * {@link TableWriter} and emit the live change in one fused call, so you can't\n * forget to go live (and the change always reflects the stored row). `change` is\n * the lower-level escape hatch for when you wrote some other way.\n */\nexport type MutationActions = {\n\t/** Persist a new row to `table` and emit it. Returns the stored row. */\n\tinsert: <Row = unknown>(table: string, data: unknown) => Promise<Row>;\n\t/** Persist an update to `table` and emit it. Returns the stored row. */\n\tupdate: <Row = unknown>(table: string, data: unknown) => Promise<Row>;\n\t/** Persist a delete to `table` (pass the row or its key) and emit it. */\n\tdelete: (table: string, row: unknown) => Promise<void>;\n\t/** Escape hatch: emit a change you persisted yourself (no writer call). */\n\tchange: <T>(collection: string, change: RowChange<T>) => Promise<void>;\n};\n\nexport type MutationHandler<Args, Ctx, Result> = (\n\targs: Args,\n\tctx: Ctx,\n\tactions: MutationActions\n) => Promise<Result> | Result;\n\nexport type MutationDefinition<\n\tArgs = unknown,\n\tCtx = CollectionContext,\n\tResult = unknown\n> = {\n\t/** Mutation name the client invokes. */\n\tname: string;\n\t/** Access control: return false (or throw) to reject the mutation. */\n\tauthorize?: (args: Args, ctx: Ctx) => boolean | Promise<boolean>;\n\t/**\n\t * Apply the mutation: write to your durable store, then call\n\t * `actions.change(...)` for each affected row. Return value (e.g. the created\n\t * record) is sent back to the caller in the ack.\n\t */\n\thandler: MutationHandler<Args, Ctx, Result>;\n};\n\n/**\n * Define a server mutation. Identity at runtime — it exists for type inference\n * (args/ctx/result flow through). Register it with {@link SyncEngine.registerMutation}\n * and invoke it from the client; the engine authorizes, runs the handler, fans\n * the resulting diffs to subscribers, and acks the caller.\n */\nexport const defineMutation = <\n\tArgs = unknown,\n\tCtx = CollectionContext,\n\tResult = unknown\n>(\n\tdefinition: MutationDefinition<Args, Ctx, Result>\n): MutationDefinition<Args, Ctx, Result> => definition;\n",
|
|
21
|
-
"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 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};\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/** 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\ntype LoggedChange = {\n\tversion: number;\n\ttable: string;\n\tchange: RowChange<unknown>;\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};\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/** 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\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\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\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/** 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\tchanges.some(\n\t\t\t(change) =>\n\t\t\t\tsub.readTables.has(change.table) ||\n\t\t\t\t(change.key !== undefined &&\n\t\t\t\t\tsub.readKeys.has(depKey(change.table, change.key))) ||\n\t\t\t\tsub.rangeDeps.some((dep) => inRange(dep, change))\n\t\t);\n\n\tconst reactivePairs = async (\n\t\tchanges: ReactiveChange[]\n\t): Promise<[ActiveSubscription, ViewDiff<unknown>][]> => {\n\t\tconst pairs: [ActiveSubscription, ViewDiff<unknown>][] = [];\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\tconst { rows, readTables, readKeys, rangeDeps } = await sub.rerun();\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\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};\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 first = await rerun();\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\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\tmutations.set(mutation.name, mutation);\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// 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 mutation.handler(args, ctx, actions);\n\t\t\t\treturn { buffered, result };\n\t\t\t};\n\n\t\t\t// Emit only after the transaction commits, so subscribers never see a\n\t\t\t// change that later rolls back.\n\t\t\ttry {\n\t\t\t\tconst { buffered, result } =\n\t\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t\t? await runInTransaction((tx) => runHandler(tx))\n\t\t\t\t\t\t: await runHandler(undefined);\n\t\t\t\tawait applyChangeBatch(buffered);\n\t\t\t\temitActivity({\n\t\t\t\t\ttype: 'mutation',\n\t\t\t\t\tat: Date.now(),\n\t\t\t\t\tname,\n\t\t\t\t\tstatus: 'ok'\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\temitActivity({\n\t\t\t\t\ttype: 'mutation',\n\t\t\t\t\tat: Date.now(),\n\t\t\t\t\tname,\n\t\t\t\t\tstatus: 'error'\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\n\t\tregisterSchedule: (schedule) => {\n\t\t\tschedules.set(schedule.name, schedule);\n\t\t},\n\n\t\tlistSchedules: () => [...schedules.values()],\n\n\t\trunSchedule: async (name) => {\n\t\t\tconst schedule = schedules.get(name);\n\t\t\tif (schedule === undefined) {\n\t\t\t\tthrow new Error(`Unknown schedule \"${name}\"`);\n\t\t\t}\n\t\t\t// A schedule reads unscoped and writes without permission checks (it's\n\t\t\t// trusted server code); its writes emit as one live batch like a mutation.\n\t\t\tconst runHandler = async (tx: unknown) => {\n\t\t\t\tconst { actions, buffered } = makeActions(tx, {}, false);\n\t\t\t\tconst db = makeReadHandle({}, new Set(), new Set(), [], false);\n\t\t\t\tawait schedule.run({ actions, db });\n\t\t\t\treturn buffered;\n\t\t\t};\n\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\t};\n};\n",
|
|
21
|
+
"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 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};\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\ntype LoggedChange = {\n\tversion: number;\n\ttable: string;\n\tchange: RowChange<unknown>;\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};\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)) return 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\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\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\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/** 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\tchanges.some(\n\t\t\t(change) =>\n\t\t\t\tsub.readTables.has(change.table) ||\n\t\t\t\t(change.key !== undefined &&\n\t\t\t\t\tsub.readKeys.has(depKey(change.table, change.key))) ||\n\t\t\t\tsub.rangeDeps.some((dep) => inRange(dep, change))\n\t\t);\n\n\tconst reactivePairs = async (\n\t\tchanges: ReactiveChange[]\n\t): Promise<[ActiveSubscription, ViewDiff<unknown>][]> => {\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\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};\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 first = await rerun();\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: stableSubKey(collection, params, ctx),\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\tmutations.set(mutation.name, mutation);\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// 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 mutation.handler(args, ctx, actions);\n\t\t\t\treturn { buffered, result };\n\t\t\t};\n\n\t\t\t// Emit only after the transaction commits, so subscribers never see a\n\t\t\t// change that later rolls back.\n\t\t\ttry {\n\t\t\t\tconst { buffered, result } =\n\t\t\t\t\trunInTransaction !== undefined\n\t\t\t\t\t\t? await runInTransaction((tx) => runHandler(tx))\n\t\t\t\t\t\t: await runHandler(undefined);\n\t\t\t\tawait applyChangeBatch(buffered);\n\t\t\t\temitActivity({\n\t\t\t\t\ttype: 'mutation',\n\t\t\t\t\tat: Date.now(),\n\t\t\t\t\tname,\n\t\t\t\t\tstatus: 'ok'\n\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\temitActivity({\n\t\t\t\t\ttype: 'mutation',\n\t\t\t\t\tat: Date.now(),\n\t\t\t\t\tname,\n\t\t\t\t\tstatus: 'error'\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\n\t\tregisterSchedule: (schedule) => {\n\t\t\tschedules.set(schedule.name, schedule);\n\t\t},\n\n\t\tlistSchedules: () => [...schedules.values()],\n\n\t\trunSchedule: async (name) => {\n\t\t\tconst schedule = schedules.get(name);\n\t\t\tif (schedule === undefined) {\n\t\t\t\tthrow new Error(`Unknown schedule \"${name}\"`);\n\t\t\t}\n\t\t\t// A schedule reads unscoped and writes without permission checks (it's\n\t\t\t// trusted server code); its writes emit as one live batch like a mutation.\n\t\t\tconst runHandler = async (tx: unknown) => {\n\t\t\t\tconst { actions, buffered } = makeActions(tx, {}, false);\n\t\t\t\tconst db = makeReadHandle({}, new Set(), new Set(), [], false);\n\t\t\t\tawait schedule.run({ actions, db });\n\t\t\t\treturn buffered;\n\t\t\t};\n\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\t};\n};\n",
|
|
22
22
|
"/**\n * Declarative, dependency-free row schemas keyed by table. The engine validates\n * a mutation's writes against the schema before they're persisted (a bad write\n * is rejected, like a permission deny), and lazily **migrates** rows on read —\n * so changing a shape needs no up-front database migration. Field validators are\n * plain `(value) => boolean` functions; the `field` kit covers the common cases.\n */\n\n/** Validates one field's value. Optionality is encoded by the validator (see `field.optional`). */\nexport type FieldValidator = (value: unknown) => boolean;\n\nexport type TableSchema<Row = unknown> = {\n\t/** Per-field validators. On insert every field is checked; on update, only\n\t * the fields present in the payload. Extra fields not listed here are allowed. */\n\tfields: Record<string, FieldValidator>;\n\t/** Schema version, for documentation/migration bookkeeping. Default 1. */\n\tversion?: number;\n\t/** Upcast a stored/raw row to the current shape — applied lazily on reads. */\n\tmigrate?: (row: Row) => Row;\n};\n\n/** A `table` → {@link TableSchema} map. */\nexport type SchemaDefinition = Record<string, TableSchema<any>>;\n\n/**\n * Define table schemas. Identity at runtime (for type inference). Pass to\n * `createSyncEngine({ schemas })` or register with `engine.registerSchema`.\n */\nexport const defineSchema = <S extends SchemaDefinition>(schemas: S): S =>\n\tschemas;\n\nconst isFiniteNumber = (value: unknown): value is number =>\n\ttypeof value === 'number' && Number.isFinite(value);\n\n/** A small validator kit. Compose with `field.optional` / `field.array` / `field.enum`. */\nexport const field = {\n\tstring: ((value) => typeof value === 'string') as FieldValidator,\n\tnumber: isFiniteNumber as FieldValidator,\n\tboolean: ((value) => typeof value === 'boolean') as FieldValidator,\n\t/** Any defined value. */\n\tany: (() => true) as FieldValidator,\n\t/** Allow `undefined` (the field may be omitted), else delegate to `inner`. */\n\toptional:\n\t\t(inner: FieldValidator): FieldValidator =>\n\t\t(value) =>\n\t\t\tvalue === undefined || inner(value),\n\t/** An array whose every element satisfies `inner`. */\n\tarray:\n\t\t(inner: FieldValidator): FieldValidator =>\n\t\t(value) =>\n\t\t\tArray.isArray(value) && value.every(inner),\n\t/** One of the given literal values. */\n\tenum:\n\t\t(...values: unknown[]): FieldValidator =>\n\t\t(value) =>\n\t\t\tvalues.includes(value)\n};\n",
|
|
23
23
|
"import type { CollectionDefinition } from './collection';\nimport type { MutationDefinition } from './mutation';\nimport type { SyncEngine } from './syncEngine';\n\n/**\n * Eden-native HTTP route helpers (Tier 3). These turn a typed collection /\n * mutation definition into a plain Elysia route handler — so hydrate and mutate\n * are ordinary Elysia routes that Eden types end to end, with TypeBox validating\n * the params/body. The live diff stream stays on the WebSocket (`syncSocket`).\n *\n * They import no Elysia: each returns `(context) => Promise<...>`, which you pass\n * to `.get` / `.post` with a TypeBox `query` / `body` schema. The handler's\n * return type carries the row / result type, so `treaty<typeof app>()` infers it.\n */\n\n/** The slice of an Elysia route context these helpers read. */\nexport type SyncRouteContext = {\n\tquery: unknown;\n\tbody: unknown;\n\t[key: string]: unknown;\n};\n\nconst emptyContext = () => ({});\n\n/**\n * Build a GET handler that hydrates `collection` — authorize, then return its\n * current rows. The handler returns `Promise<Row[]>`, so Eden infers the row\n * type from the collection definition; the route's TypeBox `query` schema\n * validates and types the params.\n *\n * @example\n * .get('/sync/orders', hydrateRoute(engine, ordersCollection, (c) => ({ userId: c.userId })),\n * { query: t.Object({ userId: t.Numeric() }) })\n */\nexport const hydrateRoute = <Row, Params, Ctx>(\n\tengine: SyncEngine,\n\tcollection: CollectionDefinition<Row, Params, Ctx>,\n\tresolveContext: (\n\t\tcontext: SyncRouteContext\n\t) => Ctx = emptyContext as () => Ctx\n) => {\n\treturn async (context: SyncRouteContext): Promise<Row[]> => {\n\t\tconst rows = await engine.hydrate(\n\t\t\tcollection.name,\n\t\t\tcontext.query as Params,\n\t\t\tresolveContext(context)\n\t\t);\n\t\treturn rows as Row[];\n\t};\n};\n\n/**\n * Build a POST handler that runs `mutation`. The handler returns\n * `Promise<Result>`, so Eden infers the result type; the route's TypeBox `body`\n * schema validates and types the args.\n *\n * @example\n * .post('/sync/createOrder', mutateRoute(engine, createOrder, (c) => ({ userId: c.userId })),\n * { body: t.Object({ total: t.Number() }) })\n */\nexport const mutateRoute = <Args, Ctx, Result>(\n\tengine: SyncEngine,\n\tmutation: MutationDefinition<Args, Ctx, Result>,\n\tresolveContext: (\n\t\tcontext: SyncRouteContext\n\t) => Ctx = emptyContext as () => Ctx\n) => {\n\treturn async (context: SyncRouteContext): Promise<Result> => {\n\t\tconst result = await engine.runMutation(\n\t\t\tmutation.name,\n\t\t\tcontext.body as Args,\n\t\t\tresolveContext(context)\n\t\t);\n\t\treturn result as Result;\n\t};\n};\n",
|
|
24
24
|
"import type { PresenceHandle, PresenceHub, PresenceMember } from './presence';\nimport type { Subscription, SyncEngine } from './syncEngine';\n\n/**\n * Wire protocol for the sync-engine WebSocket. One connection multiplexes many\n * collection subscriptions, each tagged with a client-chosen `id`.\n */\n\n/** Client → server. */\nexport type ClientFrame =\n\t| {\n\t\t\ttype: 'subscribe';\n\t\t\tid: string;\n\t\t\tcollection: string;\n\t\t\tparams?: unknown;\n\t\t\t/** Resume from a version already applied (catch-up instead of snapshot). */\n\t\t\tsince?: number;\n\t }\n\t| { type: 'unsubscribe'; id: string }\n\t| { type: 'mutate'; mutationId: number; name: string; args?: unknown }\n\t| { type: 'presence-join'; room: string; memberId: string; state: unknown }\n\t| { type: 'presence-set'; room: string; state: unknown }\n\t| { type: 'presence-leave'; room: string };\n\n/** One subscription's delta within a {@link ServerFrame} `frame`. */\nexport type FrameDiff<T = unknown> = {\n\tid: string;\n\tadded: T[];\n\tremoved: T[];\n\tchanged: T[];\n};\n\n/** Server → client. `version` is the change-feed watermark this frame brings. */\nexport type ServerFrame<T = unknown> =\n\t| { type: 'snapshot'; id: string; rows: T[]; version?: number }\n\t| {\n\t\t\ttype: 'diff';\n\t\t\tid: string;\n\t\t\tadded: T[];\n\t\t\tremoved: T[];\n\t\t\tchanged: T[];\n\t\t\tversion?: number;\n\t }\n\t| {\n\t\t\t// One atomic batch (e.g. a transactional mutation) that touched several\n\t\t\t// subscriptions — bundled into one message so the client applies them in\n\t\t\t// a single frame, never showing a torn cross-collection intermediate.\n\t\t\ttype: 'frame';\n\t\t\tversion?: number;\n\t\t\tdiffs: FrameDiff<T>[];\n\t }\n\t| {\n\t\t\t// A presence room changed: members joined, updated state, or left.\n\t\t\ttype: 'presence';\n\t\t\troom: string;\n\t\t\tjoined: PresenceMember<T>[];\n\t\t\tupdated: PresenceMember<T>[];\n\t\t\tleft: string[];\n\t }\n\t| { type: 'error'; id?: string; message: string }\n\t| { type: 'ack'; mutationId: number; result?: unknown }\n\t| { type: 'reject'; mutationId: number; message: string };\n\nexport type SyncConnectionOptions = {\n\tengine: SyncEngine;\n\t/** Resolved auth context for this connection; passed to every subscribe. */\n\tctx: unknown;\n\t/** Send a frame to the client (the transport serializes it). */\n\tsend: (frame: ServerFrame) => void;\n\t/** Optional presence hub; enables the `presence-*` frames (see createPresenceHub). */\n\tpresence?: PresenceHub;\n};\n\nexport type SyncConnection = {\n\t/** Handle one client frame (a parsed object or a raw JSON string). */\n\thandle: (raw: unknown) => Promise<void>;\n\t/** Tear down every subscription on this connection (call on socket close). */\n\tclose: () => void;\n};\n\nconst parseFrame = (raw: unknown): ClientFrame | undefined => {\n\tlet value: unknown = raw;\n\tif (typeof value === 'string') {\n\t\ttry {\n\t\t\tvalue = JSON.parse(value);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\tif (typeof value !== 'object' || value === null) {\n\t\treturn undefined;\n\t}\n\tconst frame = value as {\n\t\ttype?: unknown;\n\t\tid?: unknown;\n\t\tcollection?: unknown;\n\t\tparams?: unknown;\n\t\tsince?: unknown;\n\t\tmutationId?: unknown;\n\t\tname?: unknown;\n\t\targs?: unknown;\n\t\troom?: unknown;\n\t\tmemberId?: unknown;\n\t\tstate?: unknown;\n\t};\n\tif (frame.type === 'subscribe') {\n\t\treturn typeof frame.id === 'string' &&\n\t\t\ttypeof frame.collection === 'string'\n\t\t\t? {\n\t\t\t\t\ttype: 'subscribe',\n\t\t\t\t\tid: frame.id,\n\t\t\t\t\tcollection: frame.collection,\n\t\t\t\t\tparams: frame.params,\n\t\t\t\t\tsince:\n\t\t\t\t\t\ttypeof frame.since === 'number'\n\t\t\t\t\t\t\t? frame.since\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'unsubscribe') {\n\t\treturn typeof frame.id === 'string'\n\t\t\t? { type: 'unsubscribe', id: frame.id }\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'mutate') {\n\t\treturn typeof frame.mutationId === 'number' &&\n\t\t\ttypeof frame.name === 'string'\n\t\t\t? {\n\t\t\t\t\ttype: 'mutate',\n\t\t\t\t\tmutationId: frame.mutationId,\n\t\t\t\t\tname: frame.name,\n\t\t\t\t\targs: frame.args\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'presence-join') {\n\t\treturn typeof frame.room === 'string' &&\n\t\t\ttypeof frame.memberId === 'string'\n\t\t\t? {\n\t\t\t\t\ttype: 'presence-join',\n\t\t\t\t\troom: frame.room,\n\t\t\t\t\tmemberId: frame.memberId,\n\t\t\t\t\tstate: frame.state\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'presence-set') {\n\t\treturn typeof frame.room === 'string'\n\t\t\t? { type: 'presence-set', room: frame.room, state: frame.state }\n\t\t\t: undefined;\n\t}\n\tif (frame.type === 'presence-leave') {\n\t\treturn typeof frame.room === 'string'\n\t\t\t? { type: 'presence-leave', room: frame.room }\n\t\t\t: undefined;\n\t}\n\treturn undefined;\n};\n\n/**\n * The per-connection protocol handler — transport-agnostic glue between a single\n * client socket and the {@link SyncEngine}. It owns that connection's\n * subscriptions: a `subscribe` frame authorizes + hydrates and replies with a\n * `snapshot`, then streams `diff` frames; `unsubscribe`/`close` release views.\n *\n * Pure (no WebSocket import) so it can be unit-tested with a fake `send`; the\n * Elysia `syncSocket` plugin is the thin adapter that feeds it socket events.\n */\nexport const createSyncConnection = ({\n\tengine,\n\tctx,\n\tsend,\n\tpresence\n}: SyncConnectionOptions): SyncConnection => {\n\tconst subscriptions = new Map<string, Subscription<unknown>>();\n\t// This connection's presence memberships (one per room), torn down on close.\n\tconst presenceRooms = new Map<string, PresenceHandle<unknown>>();\n\n\t// Diffs from one atomic batch (a mutation, or a single applyChange) arrive via\n\t// onDiff synchronously and share a version. Buffer them and flush as one\n\t// message: a lone diff stays a plain `diff` (so single-collection clients are\n\t// unchanged); several become one `frame` the client applies atomically.\n\tlet pending: FrameDiff[] = [];\n\tlet pendingVersion: number | undefined;\n\tlet flushScheduled = false;\n\n\tconst flush = () => {\n\t\tif (pending.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst diffs = pending;\n\t\tconst version = pendingVersion;\n\t\tpending = [];\n\t\tpendingVersion = undefined;\n\t\tif (diffs.length === 1) {\n\t\t\tconst only = diffs[0]!;\n\t\t\tsend({\n\t\t\t\ttype: 'diff',\n\t\t\t\tid: only.id,\n\t\t\t\tadded: only.added,\n\t\t\t\tremoved: only.removed,\n\t\t\t\tchanged: only.changed,\n\t\t\t\tversion\n\t\t\t});\n\t\t} else {\n\t\t\tsend({ type: 'frame', diffs, version });\n\t\t}\n\t};\n\n\tconst scheduleFlush = () => {\n\t\tif (flushScheduled) {\n\t\t\treturn;\n\t\t}\n\t\tflushScheduled = true;\n\t\tqueueMicrotask(() => {\n\t\t\tflushScheduled = false;\n\t\t\tflush();\n\t\t});\n\t};\n\n\tconst bufferDiff = (diff: FrameDiff, diffVersion: number) => {\n\t\t// A new version means a new batch — flush the previous one first.\n\t\tif (pending.length > 0 && pendingVersion !== diffVersion) {\n\t\t\tflush();\n\t\t}\n\t\tpending.push(diff);\n\t\tpendingVersion = diffVersion;\n\t\tscheduleFlush();\n\t};\n\n\tconst handle = async (raw: unknown) => {\n\t\tconst frame = parseFrame(raw);\n\t\tif (frame === undefined) {\n\t\t\tsend({ type: 'error', message: 'Malformed sync frame' });\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'mutate') {\n\t\t\ttry {\n\t\t\t\tconst result = await engine.runMutation(\n\t\t\t\t\tframe.name,\n\t\t\t\t\tframe.args,\n\t\t\t\t\tctx\n\t\t\t\t);\n\t\t\t\t// The mutation's diffs were buffered during runMutation; flush them\n\t\t\t\t// (as one frame) before the ack so the ack always arrives after.\n\t\t\t\tflush();\n\t\t\t\tsend({ type: 'ack', mutationId: frame.mutationId, result });\n\t\t\t} catch (error) {\n\t\t\t\tsend({\n\t\t\t\t\ttype: 'reject',\n\t\t\t\t\tmutationId: frame.mutationId,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'unsubscribe') {\n\t\t\tsubscriptions.get(frame.id)?.unsubscribe();\n\t\t\tsubscriptions.delete(frame.id);\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'presence-join') {\n\t\t\tif (presence === undefined) {\n\t\t\t\tsend({ type: 'error', message: 'Presence is not enabled' });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// A re-join replaces the prior membership for this room.\n\t\t\tpresenceRooms.get(frame.room)?.leave();\n\t\t\tconst handle = presence.join(\n\t\t\t\tframe.room,\n\t\t\t\tframe.memberId,\n\t\t\t\tframe.state,\n\t\t\t\t(diff) => {\n\t\t\t\t\tsend({\n\t\t\t\t\t\ttype: 'presence',\n\t\t\t\t\t\troom: frame.room,\n\t\t\t\t\t\tjoined: diff.joined,\n\t\t\t\t\t\tupdated: diff.updated,\n\t\t\t\t\t\tleft: diff.left\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t);\n\t\t\tpresenceRooms.set(frame.room, handle);\n\t\t\t// Initial snapshot to the joiner (peers got a `joined` diff instead).\n\t\t\tsend({\n\t\t\t\ttype: 'presence',\n\t\t\t\troom: frame.room,\n\t\t\t\tjoined: handle.members,\n\t\t\t\tupdated: [],\n\t\t\t\tleft: []\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'presence-set') {\n\t\t\tpresenceRooms.get(frame.room)?.set(frame.state);\n\t\t\treturn;\n\t\t}\n\n\t\tif (frame.type === 'presence-leave') {\n\t\t\tpresenceRooms.get(frame.room)?.leave();\n\t\t\tpresenceRooms.delete(frame.room);\n\t\t\treturn;\n\t\t}\n\n\t\tif (subscriptions.has(frame.id)) {\n\t\t\tsend({\n\t\t\t\ttype: 'error',\n\t\t\t\tid: frame.id,\n\t\t\t\tmessage: `Subscription id \"${frame.id}\" already in use`\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst subscription = await engine.subscribe({\n\t\t\t\tcollection: frame.collection,\n\t\t\t\tparams: frame.params,\n\t\t\t\tctx,\n\t\t\t\tsince: frame.since,\n\t\t\t\tonDiff: (diff, diffVersion) => {\n\t\t\t\t\tbufferDiff(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: frame.id,\n\t\t\t\t\t\t\tadded: diff.added,\n\t\t\t\t\t\t\tremoved: diff.removed,\n\t\t\t\t\t\t\tchanged: diff.changed\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdiffVersion\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t\tsubscriptions.set(frame.id, subscription);\n\t\t\t// No await between subscribe resolving and this send, so the initial\n\t\t\t// reply always precedes any diff for this subscription.\n\t\t\tif (subscription.catchup !== undefined) {\n\t\t\t\t// Resumed: a catch-up diff applied on top of the client's set.\n\t\t\t\tsend({\n\t\t\t\t\ttype: 'diff',\n\t\t\t\t\tid: frame.id,\n\t\t\t\t\tadded: subscription.catchup.added,\n\t\t\t\t\tremoved: subscription.catchup.removed,\n\t\t\t\t\tchanged: subscription.catchup.changed,\n\t\t\t\t\tversion: subscription.version\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tsend({\n\t\t\t\t\ttype: 'snapshot',\n\t\t\t\t\tid: frame.id,\n\t\t\t\t\trows: subscription.initial,\n\t\t\t\t\tversion: subscription.version\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsend({\n\t\t\t\ttype: 'error',\n\t\t\t\tid: frame.id,\n\t\t\t\tmessage: error instanceof Error ? error.message : String(error)\n\t\t\t});\n\t\t}\n\t};\n\n\tconst close = () => {\n\t\tfor (const subscription of subscriptions.values()) {\n\t\t\tsubscription.unsubscribe();\n\t\t}\n\t\tsubscriptions.clear();\n\t\t// Drop this connection's presence so peers see it leave (auto-cleanup).\n\t\tfor (const handle of presenceRooms.values()) {\n\t\t\thandle.leave();\n\t\t}\n\t\tpresenceRooms.clear();\n\t};\n\n\treturn { handle, close };\n};\n"
|
|
25
25
|
],
|
|
26
|
-
"mappings": "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",
|
|
27
|
-
"debugId": "
|
|
26
|
+
"mappings": "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",
|
|
27
|
+
"debugId": "4154536B9F3F3F5A64756E2164756E21",
|
|
28
28
|
"names": []
|
|
29
29
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@absolutejs/sync",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Lightweight reactive-push and write-behind-cache primitives for Elysia and the AbsoluteJS ecosystem — kill polling and keep a remote store off your hot path, without adopting a whole sync-engine backend.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|