@absolutejs/sync 0.3.0 → 0.4.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 CHANGED
@@ -32,8 +32,9 @@ top-N ordering are maintained incrementally through a composable operator graph
32
32
  > Status: early (`0.0.1`). Tier 1 (hub, SSE plugin, browser subscriber,
33
33
  > write-behind cache), Tier 2 (Drizzle + Prisma topic adapters, `createLiveQuery`),
34
34
  > and Tier 3 (sync engine: collections, WebSocket diff transport, optimistic
35
- > mutations + offline queue, CDC for Postgres/MySQL/SQLite, incremental
36
- > aggregations + joins, and a declarative operator graph) are in place.
35
+ > mutations + offline queue, a local-first client cache, declarative row-level
36
+ > permissions, CDC for Postgres/MySQL/SQLite, incremental aggregations + joins,
37
+ > and a declarative operator graph) are in place.
37
38
  > Everything ships as subpaths of this one package.
38
39
 
39
40
  ## Install
@@ -229,6 +230,24 @@ await orders.mutate({
229
230
  server's changelog still covers it, a fresh snapshot otherwise).
230
231
  - **Access control is mandatory.** Each collection's `authorize` gates subscribe and
231
232
  its filter scopes rows, so a change to a row a caller can't see never reaches them.
233
+ - **Declarative permissions.** Instead of restating a row filter across `authorize`,
234
+ `hydrate`, and `match`, register row-level rules once with `definePermissions` and
235
+ the engine enforces them: `read` rules filter every row emitted (initial snapshot,
236
+ incremental diff, catch-up, one-shot hydrate, and a reactive query's `ctx.db`
237
+ reads); `insert`/`update`/`delete`/`write` rules gate the mutation actions. For
238
+ `update`/`delete` the rule is checked against the _existing_ row (loaded via the
239
+ table's reader), so it can't be spoofed by the client payload.
240
+
241
+ ```ts
242
+ const engine = createSyncEngine({
243
+ permissions: definePermissions<{ userId: number }>({
244
+ tasks: {
245
+ read: (ctx, row) => row.userId === ctx.userId, // see only your rows
246
+ write: (ctx, row) => row.userId === ctx.userId // touch only your rows
247
+ }
248
+ })
249
+ });
250
+ ```
232
251
 
233
252
  ## Write-behind cache — keep a remote store off your hot path
234
253
 
@@ -323,6 +342,7 @@ mutate({
323
342
  | `query(source).filter().map().join().leftJoin().groupBy().orderBy()` | Declarative incremental query builder (the operator graph). |
324
343
  | `defineGraphCollection({ name, query, key, authorize? })` | Run a `query` as a live collection. |
325
344
  | `defineReactiveQuery({ name, run, key })` + `registerReactive` / `registerReader` | Read-set-tracked query: `run(ctx)` reads via `ctx.db` (`all`/`get`/`where`) and re-runs only when the rows/ranges it read change — no `match`, no manual emit. |
345
+ | `definePermissions({ [table]: { read?, insert?, update?, delete?, write? } })` | Declarative row-level access control. Pass as `createSyncEngine({ permissions })` or `registerPermissions(table, rules)`. Read rules filter every row emitted; write rules gate `actions.insert/update/delete`. |
326
346
 
327
347
  ### `@absolutejs/sync/postgres`
328
348
 
@@ -30,6 +30,8 @@ export { defineReactiveQuery } from './reactive';
30
30
  export type { ReactiveQueryContext, ReactiveQueryDefinition, ReadHandle, TableReader } from './reactive';
31
31
  export { defineGraphCollection, query } from './graph';
32
32
  export type { GraphCollectionDefinition, GraphInstance, GraphSource, GroupByOptions, JoinOptions, OrderByQueryOptions, Query } from './graph';
33
+ export { definePermissions } from './permissions';
34
+ export type { PermissionsDefinition, ReadRule, TablePermissions, WriteRule } from './permissions';
33
35
  export { defineMutation } from './mutation';
34
36
  export type { MutationActions, MutationDefinition, MutationHandler, TableWriter, TransactionRunner } from './mutation';
35
37
  export { createSyncEngine, UnauthorizedError } from './syncEngine';
@@ -883,6 +883,8 @@ var makeQuery = (source, steps) => {
883
883
  };
884
884
  var query = (source) => makeQuery(source, []);
885
885
  var defineGraphCollection = (definition) => ({ ...definition, kind: "graph" });
886
+ // src/engine/permissions.ts
887
+ var definePermissions = (permissions) => permissions;
886
888
  // src/engine/mutation.ts
887
889
  var defineMutation = (definition) => definition;
888
890
  // src/engine/syncEngine.ts
@@ -909,6 +911,15 @@ var createSyncEngine = (options = {}) => {
909
911
  const mutations = new Map;
910
912
  const writers = new Map;
911
913
  const readers = new Map;
914
+ const permissions = new Map;
915
+ for (const [table, rules] of Object.entries(options.permissions ?? {})) {
916
+ permissions.set(table, rules);
917
+ }
918
+ const readRuleFor = (table) => permissions.get(table)?.read;
919
+ const writeRuleFor = (table, op) => {
920
+ const rules = permissions.get(table);
921
+ return rules?.[op] ?? rules?.write;
922
+ };
912
923
  const reactiveSubs = new Set;
913
924
  const active = new Map;
914
925
  const tableIndex = new Map;
@@ -1037,7 +1048,9 @@ var createSyncEngine = (options = {}) => {
1037
1048
  return {
1038
1049
  all: async (table) => {
1039
1050
  readTables.add(table);
1040
- return [...await readerFor(table).all(ctx)];
1051
+ const rows = [...await readerFor(table).all(ctx)];
1052
+ const rule = readRuleFor(table);
1053
+ return rule ? rows.filter((row) => rule(ctx, row)) : rows;
1041
1054
  },
1042
1055
  get: async (table, key) => {
1043
1056
  const reader = readerFor(table);
@@ -1049,16 +1062,20 @@ var createSyncEngine = (options = {}) => {
1049
1062
  } else {
1050
1063
  readTables.add(table);
1051
1064
  }
1052
- return await reader.get(key, ctx);
1065
+ const row = await reader.get(key, ctx);
1066
+ const rule = readRuleFor(table);
1067
+ return rule && row !== undefined && !rule(ctx, row) ? undefined : row;
1053
1068
  },
1054
1069
  where: async (table, predicate) => {
1055
1070
  const reader = readerFor(table);
1056
- const matched = [...await reader.all(ctx)].filter(predicate);
1071
+ const rule = readRuleFor(table);
1072
+ const effective = rule ? (row) => predicate(row) && rule(ctx, row) : predicate;
1073
+ const matched = [...await reader.all(ctx)].filter(effective);
1057
1074
  if (reader.key !== undefined) {
1058
1075
  const key = reader.key;
1059
1076
  rangeDeps.push({
1060
1077
  table,
1061
- predicate,
1078
+ predicate: effective,
1062
1079
  keys: new Set(matched.map(key))
1063
1080
  });
1064
1081
  } else {
@@ -1359,11 +1376,12 @@ var createSyncEngine = (options = {}) => {
1359
1376
  }
1360
1377
  }
1361
1378
  const key = definition.key ?? defaultKey;
1362
- const rehydrate = async () => definition.hydrate(params, ctx);
1363
1379
  const match = definition.match;
1364
1380
  const tables = definition.tables ?? [collection];
1381
+ const readRule = tables.length === 1 ? readRuleFor(tables[0]) : undefined;
1382
+ const rehydrate = readRule ? async () => [...await definition.hydrate(params, ctx)].filter((row) => readRule(ctx, row)) : async () => definition.hydrate(params, ctx);
1365
1383
  const incremental = match !== undefined && tables.length === 1;
1366
- const boundMatch = incremental ? (row) => match(row, params, ctx) : () => true;
1384
+ const boundMatch = incremental ? (row) => match(row, params, ctx) && (readRule ? readRule(ctx, row) : true) : () => true;
1367
1385
  const view = createMaterializedView({
1368
1386
  key,
1369
1387
  match: boundMatch
@@ -1409,7 +1427,10 @@ var createSyncEngine = (options = {}) => {
1409
1427
  throw new UnauthorizedError(`hydrate collection "${collection}"`);
1410
1428
  }
1411
1429
  }
1412
- return [...await definition.hydrate(params, ctx)];
1430
+ const rows = [...await definition.hydrate(params, ctx)];
1431
+ const tables = definition.tables ?? [collection];
1432
+ const readRule = tables.length === 1 ? readRuleFor(tables[0]) : undefined;
1433
+ return readRule ? rows.filter((row) => readRule(ctx, row)) : rows;
1413
1434
  },
1414
1435
  applyChange: (table, change) => applyChange(table, change),
1415
1436
  connectSource: async (source) => {
@@ -1453,6 +1474,9 @@ var createSyncEngine = (options = {}) => {
1453
1474
  registerReader: (table, reader) => {
1454
1475
  readers.set(table, reader);
1455
1476
  },
1477
+ registerPermissions: (table, rules) => {
1478
+ permissions.set(table, rules);
1479
+ },
1456
1480
  runMutation: async (name, args, ctx) => {
1457
1481
  const mutation = mutations.get(name);
1458
1482
  if (mutation === undefined) {
@@ -1471,6 +1495,28 @@ var createSyncEngine = (options = {}) => {
1471
1495
  }
1472
1496
  return writer;
1473
1497
  };
1498
+ const authorizeWrite = async (table, op, value) => {
1499
+ const rule = writeRuleFor(table, op);
1500
+ if (rule === undefined) {
1501
+ return;
1502
+ }
1503
+ let subject = value;
1504
+ if (op !== "insert") {
1505
+ const reader = readers.get(table);
1506
+ if (reader?.get !== undefined) {
1507
+ const id = reader.key ? reader.key(value) : value.id;
1508
+ if (id !== undefined) {
1509
+ const existing = await reader.get(id, ctx);
1510
+ if (existing !== undefined) {
1511
+ subject = existing;
1512
+ }
1513
+ }
1514
+ }
1515
+ }
1516
+ if (!rule(ctx, subject)) {
1517
+ throw new UnauthorizedError(`${op} on table "${table}"`);
1518
+ }
1519
+ };
1474
1520
  const runHandler = async (tx) => {
1475
1521
  const buffered2 = [];
1476
1522
  const actions = {
@@ -1482,16 +1528,19 @@ var createSyncEngine = (options = {}) => {
1482
1528
  return Promise.resolve();
1483
1529
  },
1484
1530
  insert: async (table, data) => {
1531
+ await authorizeWrite(table, "insert", data);
1485
1532
  const row = await writerFor(table).insert(data, ctx, tx);
1486
1533
  buffered2.push({ table, change: { op: "insert", row } });
1487
1534
  return row;
1488
1535
  },
1489
1536
  update: async (table, data) => {
1537
+ await authorizeWrite(table, "update", data);
1490
1538
  const row = await writerFor(table).update(data, ctx, tx);
1491
1539
  buffered2.push({ table, change: { op: "update", row } });
1492
1540
  return row;
1493
1541
  },
1494
1542
  delete: async (table, row) => {
1543
+ await authorizeWrite(table, "delete", row);
1495
1544
  await writerFor(table).delete(row, ctx, tx);
1496
1545
  buffered2.push({ table, change: { op: "delete", row } });
1497
1546
  }
@@ -1753,6 +1802,7 @@ export {
1753
1802
  fromRowChange,
1754
1803
  filterOp,
1755
1804
  defineReactiveQuery,
1805
+ definePermissions,
1756
1806
  defineMutation,
1757
1807
  defineJoinCollection,
1758
1808
  defineGraphCollection,
@@ -1770,5 +1820,5 @@ export {
1770
1820
  UnauthorizedError
1771
1821
  };
1772
1822
 
1773
- //# debugId=4ADB152722C87EA464756E2164756E21
1823
+ //# debugId=04C93A0AB37B69AD64756E2164756E21
1774
1824
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/engine/materializedView.ts", "../src/engine/aggregate.ts", "../src/engine/equiJoin.ts", "../src/engine/dataflow.ts", "../src/engine/pollingSource.ts", "../src/engine/cluster.ts", "../src/engine/presence.ts", "../src/engine/collection.ts", "../src/engine/reactive.ts", "../src/engine/graph.ts", "../src/engine/mutation.ts", "../src/engine/syncEngine.ts", "../src/engine/routes.ts", "../src/engine/connection.ts"],
3
+ "sources": ["../src/engine/materializedView.ts", "../src/engine/aggregate.ts", "../src/engine/equiJoin.ts", "../src/engine/dataflow.ts", "../src/engine/pollingSource.ts", "../src/engine/cluster.ts", "../src/engine/presence.ts", "../src/engine/collection.ts", "../src/engine/reactive.ts", "../src/engine/graph.ts", "../src/engine/permissions.ts", "../src/engine/mutation.ts", "../src/engine/syncEngine.ts", "../src/engine/routes.ts", "../src/engine/connection.ts"],
4
4
  "sourcesContent": [
5
5
  "import type { RowChange, RowKey, ViewDiff } from './types';\n\nexport type MaterializedViewOptions<T> = {\n\t/** Row identity within the result set. */\n\tkey: (row: T) => RowKey;\n\t/**\n\t * The query's WHERE as a JS predicate: does this row belong in the result\n\t * set? Evaluated on every changed row to decide enter/leave/update. (The\n\t * Drizzle/Prisma adapters can derive this from a query filter.)\n\t */\n\tmatch: (row: T) => boolean;\n\t/**\n\t * Equality used by {@link MaterializedView.reset} to detect changed rows.\n\t * Defaults to a shallow compare of own enumerable properties.\n\t */\n\tequals?: (a: T, b: T) => boolean;\n};\n\nexport type MaterializedView<T> = {\n\t/**\n\t * Replace the result set with `rows` (the initial DB query result). Rows are\n\t * trusted to already satisfy the predicate — the database applied the filter.\n\t */\n\thydrate: (rows: Iterable<T>) => void;\n\t/**\n\t * Apply one row change and return the resulting diff. Empty `added`/`removed`/\n\t * `changed` arrays mean the change did not affect this view.\n\t */\n\tapply: (change: RowChange<T>) => ViewDiff<T>;\n\t/**\n\t * Replace the result set with a fresh query result and return the diff versus\n\t * what the view previously held. Powers the refetch fallback for queries that\n\t * can't be matched incrementally.\n\t */\n\treset: (rows: Iterable<T>) => ViewDiff<T>;\n\t/** Current result set, as an array. */\n\trows: () => T[];\n\t/** Current result-set size. */\n\tsize: () => number;\n};\n\nconst emptyDiff = <T>(): ViewDiff<T> => ({\n\tadded: [],\n\tremoved: [],\n\tchanged: []\n});\n\nconst shallowEqual = (a: unknown, b: unknown): boolean => {\n\tif (a === b) {\n\t\treturn true;\n\t}\n\tif (\n\t\ttypeof a !== 'object' ||\n\t\ttypeof b !== 'object' ||\n\t\ta === null ||\n\t\tb === null\n\t) {\n\t\treturn false;\n\t}\n\tconst aKeys = Object.keys(a);\n\tconst bKeys = Object.keys(b);\n\tif (aKeys.length !== bKeys.length) {\n\t\treturn false;\n\t}\n\treturn aKeys.every(\n\t\t(key) =>\n\t\t\t(a as Record<string, unknown>)[key] ===\n\t\t\t(b as Record<string, unknown>)[key]\n\t);\n};\n\n/** True when a diff carries no changes. */\nexport const isEmptyViewDiff = <T>(diff: ViewDiff<T>): boolean =>\n\tdiff.added.length === 0 &&\n\tdiff.removed.length === 0 &&\n\tdiff.changed.length === 0;\n\n/**\n * A single query's materialized result set, maintained incrementally by\n * predicate matching (the Tier 3 IVM core). Hydrate once from the database, then\n * feed each changed row through {@link MaterializedView.apply}: the view decides\n * whether the row entered, left, stayed-and-changed, or is irrelevant, and\n * returns just that delta — so the server pushes diffs instead of refetching.\n *\n * Scope: single-table filtered queries (no ORDER BY / LIMIT windows — a top-N\n * query should hydrate-and-refetch rather than rely on this view, since a row\n * entering can silently evict another). Joins/aggregations are a later,\n * differential-dataflow engine.\n */\nexport const createMaterializedView = <T>(\n\toptions: MaterializedViewOptions<T>\n): MaterializedView<T> => {\n\tconst { key, match } = options;\n\tconst equals = options.equals ?? shallowEqual;\n\tconst set = new Map<RowKey, T>();\n\n\treturn {\n\t\thydrate: (rows) => {\n\t\t\tset.clear();\n\t\t\tfor (const row of rows) {\n\t\t\t\tset.set(key(row), row);\n\t\t\t}\n\t\t},\n\t\treset: (rows) => {\n\t\t\tconst next = new Map<RowKey, T>();\n\t\t\tconst added: T[] = [];\n\t\t\tconst changed: T[] = [];\n\t\t\tfor (const row of rows) {\n\t\t\t\tconst rowKey = key(row);\n\t\t\t\tnext.set(rowKey, row);\n\t\t\t\tconst previous = set.get(rowKey);\n\t\t\t\tif (previous === undefined) {\n\t\t\t\t\tadded.push(row);\n\t\t\t\t} else if (!equals(previous, row)) {\n\t\t\t\t\tchanged.push(row);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst removed: T[] = [];\n\t\t\tfor (const [rowKey, previous] of set) {\n\t\t\t\tif (!next.has(rowKey)) {\n\t\t\t\t\tremoved.push(previous);\n\t\t\t\t}\n\t\t\t}\n\t\t\tset.clear();\n\t\t\tfor (const [rowKey, row] of next) {\n\t\t\t\tset.set(rowKey, row);\n\t\t\t}\n\t\t\treturn { added, removed, changed };\n\t\t},\n\t\tapply: ({ op, row }) => {\n\t\t\tconst rowKey = key(row);\n\t\t\tconst existing = set.get(rowKey);\n\n\t\t\tif (op === 'delete') {\n\t\t\t\tif (existing === undefined) {\n\t\t\t\t\treturn emptyDiff();\n\t\t\t\t}\n\t\t\t\tset.delete(rowKey);\n\t\t\t\treturn { added: [], removed: [existing], changed: [] };\n\t\t\t}\n\n\t\t\t// insert | update — let the predicate decide membership.\n\t\t\tif (match(row)) {\n\t\t\t\tset.set(rowKey, row);\n\t\t\t\treturn existing === undefined\n\t\t\t\t\t? { added: [row], removed: [], changed: [] }\n\t\t\t\t\t: { added: [], removed: [], changed: [row] };\n\t\t\t}\n\n\t\t\t// No longer matches: it leaves the set if it was in it.\n\t\t\tif (existing !== undefined) {\n\t\t\t\tset.delete(rowKey);\n\t\t\t\treturn { added: [], removed: [existing], changed: [] };\n\t\t\t}\n\t\t\treturn emptyDiff();\n\t\t},\n\t\trows: () => [...set.values()],\n\t\tsize: () => set.size\n\t};\n};\n",
6
6
  "import type { RowChange, RowKey } from './types';\n\nexport type AggregateOptions<T> = {\n\t/** Row identity — used to track each row's contribution across updates. */\n\tkey: (row: T) => RowKey;\n\t/** Group rows by this key. Omit to aggregate everything into one group (`''`). */\n\tgroupBy?: (row: T) => RowKey;\n\t/**\n\t * Numeric value to aggregate for `sum`/`avg`/`min`/`max`. Omit for a\n\t * count-only aggregate (sum stays 0, min/max stay undefined).\n\t */\n\tvalue?: (row: T) => number;\n};\n\n/** Maintained summary for one group. */\nexport type AggregateGroup = {\n\tgroup: RowKey;\n\tcount: number;\n\tsum: number;\n\t/** `sum / count`, or 0 when the group is empty. */\n\tavg: number;\n\tmin: number | undefined;\n\tmax: number | undefined;\n};\n\nexport type Aggregate<T> = {\n\t/** Bulk-load the initial rows (replaces current state). */\n\thydrate: (rows: Iterable<T>) => void;\n\t/** Fold one row change into the running aggregates. */\n\tapply: (change: RowChange<T>) => void;\n\t/** Current summary for every non-empty group. */\n\tgroups: () => AggregateGroup[];\n\t/** Current summary for one group, or `undefined` if empty. */\n\tgroup: (group: RowKey) => AggregateGroup | undefined;\n};\n\ntype GroupState = {\n\tcount: number;\n\tsum: number;\n\t/** Multiset of values, so removing the current min/max stays correct. */\n\tvalueCounts: Map<number, number>;\n\tmin: number | undefined;\n\tmax: number | undefined;\n};\n\nconst newGroupState = (): GroupState => ({\n\tcount: 0,\n\tsum: 0,\n\tvalueCounts: new Map(),\n\tmin: undefined,\n\tmax: undefined\n});\n\nconst recomputeExtremes = (state: GroupState) => {\n\tif (state.valueCounts.size === 0) {\n\t\tstate.min = undefined;\n\t\tstate.max = undefined;\n\t\treturn;\n\t}\n\tlet min = Infinity;\n\tlet max = -Infinity;\n\tfor (const value of state.valueCounts.keys()) {\n\t\tif (value < min) {\n\t\t\tmin = value;\n\t\t}\n\t\tif (value > max) {\n\t\t\tmax = value;\n\t\t}\n\t}\n\tstate.min = min;\n\tstate.max = max;\n};\n\nconst summarize = (group: RowKey, state: GroupState): AggregateGroup => ({\n\tgroup,\n\tcount: state.count,\n\tsum: state.sum,\n\tavg: state.count > 0 ? state.sum / state.count : 0,\n\tmin: state.min,\n\tmax: state.max\n});\n\n/**\n * An incrementally-maintained aggregation — the DD-lite for `count`/`sum`/`avg`/\n * `min`/`max`, optionally grouped. Feed it the change feed (insert/update/delete)\n * and it updates each group's summary in place: count/sum/avg are O(1); min/max\n * use a value multiset so removing the current extremum recomputes correctly\n * (O(distinct values) only when the extremum leaves).\n *\n * Per-row contributions are tracked by `key`, so updates (including a row moving\n * between groups) and deletes adjust the right group without re-scanning. Use it\n * server-side over the engine's change feed, or client-side over collection\n * diffs.\n */\nexport const createAggregate = <T>(\n\toptions: AggregateOptions<T>\n): Aggregate<T> => {\n\tconst { key, groupBy, value } = options;\n\tconst groups = new Map<RowKey, GroupState>();\n\t// Each row's last (group, value), so updates/deletes adjust the right group.\n\t// `value` is undefined for a count-only aggregate (no value extractor).\n\tconst contributions = new Map<\n\t\tRowKey,\n\t\t{ group: RowKey; value: number | undefined }\n\t>();\n\n\tconst add = (group: RowKey, contribution: number | undefined) => {\n\t\tlet state = groups.get(group);\n\t\tif (state === undefined) {\n\t\t\tstate = newGroupState();\n\t\t\tgroups.set(group, state);\n\t\t}\n\t\tstate.count += 1;\n\t\tif (contribution === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tstate.sum += contribution;\n\t\tstate.valueCounts.set(\n\t\t\tcontribution,\n\t\t\t(state.valueCounts.get(contribution) ?? 0) + 1\n\t\t);\n\t\tstate.min =\n\t\t\tstate.min === undefined\n\t\t\t\t? contribution\n\t\t\t\t: Math.min(state.min, contribution);\n\t\tstate.max =\n\t\t\tstate.max === undefined\n\t\t\t\t? contribution\n\t\t\t\t: Math.max(state.max, contribution);\n\t};\n\n\tconst remove = (group: RowKey, contribution: number | undefined) => {\n\t\tconst state = groups.get(group);\n\t\tif (state === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tstate.count -= 1;\n\t\tif (contribution !== undefined) {\n\t\t\tstate.sum -= contribution;\n\t\t\tconst remaining = (state.valueCounts.get(contribution) ?? 0) - 1;\n\t\t\tif (remaining <= 0) {\n\t\t\t\tstate.valueCounts.delete(contribution);\n\t\t\t\tif (contribution === state.min || contribution === state.max) {\n\t\t\t\t\trecomputeExtremes(state);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tstate.valueCounts.set(contribution, remaining);\n\t\t\t}\n\t\t}\n\t\tif (state.count <= 0) {\n\t\t\tgroups.delete(group);\n\t\t}\n\t};\n\n\tconst apply = (change: RowChange<T>) => {\n\t\tconst rowKey = key(change.row);\n\t\tconst previous = contributions.get(rowKey);\n\n\t\tif (change.op === 'delete') {\n\t\t\tif (previous !== undefined) {\n\t\t\t\tremove(previous.group, previous.value);\n\t\t\t\tcontributions.delete(rowKey);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst group = groupBy ? groupBy(change.row) : '';\n\t\tconst contribution = value ? value(change.row) : undefined;\n\t\tif (previous !== undefined) {\n\t\t\tremove(previous.group, previous.value);\n\t\t}\n\t\tadd(group, contribution);\n\t\tcontributions.set(rowKey, { group, value: contribution });\n\t};\n\n\treturn {\n\t\thydrate: (rows) => {\n\t\t\tgroups.clear();\n\t\t\tcontributions.clear();\n\t\t\tfor (const row of rows) {\n\t\t\t\tapply({ op: 'insert', row });\n\t\t\t}\n\t\t},\n\t\tapply,\n\t\tgroups: () =>\n\t\t\t[...groups.entries()].map(([group, state]) =>\n\t\t\t\tsummarize(group, state)\n\t\t\t),\n\t\tgroup: (group) => {\n\t\t\tconst state = groups.get(group);\n\t\t\treturn state === undefined ? undefined : summarize(group, state);\n\t\t}\n\t};\n};\n",
@@ -12,12 +12,13 @@
12
12
  "import type { RowKey } from './types';\n\n/**\n * App-provided context for a subscription — typically the authenticated session\n * (user id, roles). Passed to `authorize`, `hydrate`, and `match` so a\n * collection can scope its rows to the caller.\n */\nexport type CollectionContext = Record<string, unknown>;\n\nexport type CollectionDefinition<T, P = void, Ctx = CollectionContext> = {\n\t/** Collection name — its identity for subscribe (e.g. `orders`). */\n\tname: string;\n\t/**\n\t * Source tables this collection reads. A committed change to any of them\n\t * updates the collection. Defaults to `[name]`. List several for a join /\n\t * aggregate collection — which uses the refetch fallback, since a single\n\t * table's row can't be matched into a multi-table result.\n\t */\n\ttables?: string[];\n\t/**\n\t * Fetch the initial result set from your database (any ORM). Receives the\n\t * subscription's params and context so it can filter to the caller.\n\t */\n\thydrate: (params: P, ctx: Ctx) => Promise<Iterable<T>> | Iterable<T>;\n\t/** Row identity. Defaults to `row.id`. */\n\tkey?: (row: T) => RowKey;\n\t/**\n\t * The query's filter as a JS predicate, for incremental matching. Omit to use\n\t * the refetch fallback (re-hydrate on every change to the collection).\n\t *\n\t * It MUST encode the same row filter as `hydrate`/`authorize`: a change that\n\t * the predicate accepts is pushed to the subscriber, so a too-loose predicate\n\t * leaks rows. (Deriving `match` from the same filter as `hydrate` keeps the\n\t * two in lockstep — the planned adapter convenience.)\n\t */\n\tmatch?: (row: T, params: P, ctx: Ctx) => boolean;\n\t/**\n\t * Access control: return `false` (or throw) to deny the subscription. Runs\n\t * before `hydrate`. Without it a collection is world-readable, so treat it as\n\t * mandatory for any non-public data.\n\t */\n\tauthorize?: (params: P, ctx: Ctx) => boolean | Promise<boolean>;\n};\n\n/**\n * Define a syncable collection. Identity at runtime — it exists for type\n * inference, so `params`/`ctx`/row types flow through `hydrate`/`match`/\n * `authorize` without restating them. Register it with a {@link SyncEngine}.\n */\nexport const defineCollection = <T, P = void, Ctx = CollectionContext>(\n\tdefinition: CollectionDefinition<T, P, Ctx>\n): CollectionDefinition<T, P, Ctx> => definition;\n\n/** One input of a join collection. */\nexport type JoinSide<Row, P, Ctx> = {\n\t/** Source table name (the change feed routes its changes to this side). */\n\ttable: string;\n\t/** Fetch this side's rows for the subscription (scoped to the caller). */\n\thydrate: (params: P, ctx: Ctx) => Promise<Iterable<Row>> | Iterable<Row>;\n\t/** Row identity within this side. */\n\tkey: (row: Row) => RowKey;\n\t/** Join value — matched for equality against the other side's `on`. */\n\ton: (row: Row) => RowKey;\n\t/**\n\t * Access/predicate filter for incremental changes on this side. A changed row\n\t * that fails it is treated as a leave (removed from the join), so a row that\n\t * becomes invisible drops out. Omit only for an unscoped side.\n\t */\n\tmatch?: (row: Row, params: P, ctx: Ctx) => boolean;\n};\n\n/**\n * A collection that is the incremental inner equi-join of two tables. The engine\n * maintains it with an {@link createEquiJoin} operator — a change to either side\n * moves only the affected pairs, instead of re-hydrating the whole join.\n */\nexport type JoinCollectionDefinition<\n\tL,\n\tR,\n\tOut,\n\tP = void,\n\tCtx = CollectionContext\n> = {\n\tname: string;\n\tkind: 'join';\n\tleft: JoinSide<L, P, Ctx>;\n\tright: JoinSide<R, P, Ctx>;\n\t/** Combine a matched pair into an output row. */\n\tselect: (left: L, right: R) => Out;\n\t/** Output row identity (must be unique per emitted row). */\n\tkey: (out: Out) => RowKey;\n\t/** Access control; return false (or throw) to deny the subscription. */\n\tauthorize?: (params: P, ctx: Ctx) => boolean | Promise<boolean>;\n};\n\n/**\n * Define an incremental equi-join collection (see {@link JoinCollectionDefinition}).\n * For a many-to-one join the output can key by the left id; for many-to-many,\n * include both ids in the output and key on the pair.\n */\nexport const defineJoinCollection = <\n\tL,\n\tR,\n\tOut,\n\tP = void,\n\tCtx = CollectionContext\n>(\n\tdefinition: Omit<JoinCollectionDefinition<L, R, Out, P, Ctx>, 'kind'>\n): JoinCollectionDefinition<L, R, Out, P, Ctx> => ({\n\t...definition,\n\tkind: 'join'\n});\n",
13
13
  "import type { CollectionContext } from './collection';\nimport type { RowKey } from './types';\n\n/**\n * Read-set tracking — the reactor. You write a plain query function that reads\n * through an instrumented `ctx.db`; the engine records which tables it touched\n * and re-runs it (diffing old vs new) whenever any of those tables change. No\n * hand-written `match`, no operator graph, no manual change emission for reads:\n * write a query, it stays live. This is the BYO-database analogue of Convex's\n * automatic read-set tracking — it works on your own DB because your reads go\n * through the registered {@link TableReader}s.\n *\n * Granularity is table-level for now (a query that read a table re-runs on any\n * change to it) — the full developer experience, and always correct; key/range\n * precision is a later optimization.\n */\n\n/** How to read a table for reactive queries — register with `registerReader`. */\nexport type TableReader<Ctx = unknown> = {\n\t/** All rows of the table (the common case; filter in JS in your query). */\n\tall: (ctx: Ctx) => Promise<Iterable<unknown>> | Iterable<unknown>;\n\t/** Optional point lookup by key. */\n\tget?: (key: RowKey, ctx: Ctx) => Promise<unknown> | unknown;\n\t/**\n\t * Row identity. Provide it to unlock **key-level** read tracking: a query that\n\t * only `db.get`s specific rows re-runs solely when one of *those* rows changes\n\t * (matched via this `key`), not on every change to the table. Omit and `get`\n\t * falls back to a table-level dependency (coarser, still correct).\n\t */\n\tkey?: (row: unknown) => RowKey;\n};\n\n/** The instrumented data handle passed to a reactive query — reads are tracked. */\nexport type ReadHandle = {\n\t/** Read all rows of `table` (records a full-table dependency). */\n\tall: <T = unknown>(table: string) => Promise<T[]>;\n\t/** Read one row of `table` by key (records a row-key dependency). */\n\tget: <T = unknown>(table: string, key: RowKey) => Promise<T | undefined>;\n\t/**\n\t * Read the rows of `table` matching `predicate` (records a **range**\n\t * dependency): the query re-runs only when a change matches the predicate now\n\t * or was in the matched set before — not on every change to the table. Needs\n\t * the table's reader to declare a `key`; without one it falls back to a\n\t * full-table dependency. Prefer this over `all().filter(...)` for precision.\n\t */\n\twhere: <T = unknown>(\n\t\ttable: string,\n\t\tpredicate: (row: T) => boolean\n\t) => Promise<T[]>;\n};\n\nexport type ReactiveQueryContext<P, Ctx> = {\n\t/** Tracked reads — anything you read here becomes a live dependency. */\n\tdb: ReadHandle;\n\tparams: P;\n\tctx: Ctx;\n};\n\nexport type ReactiveQueryDefinition<T, P = void, Ctx = CollectionContext> = {\n\tname: string;\n\tkind: 'reactive';\n\t/** Compute the result set by reading through `ctx.db`; re-run on change. */\n\trun: (context: ReactiveQueryContext<P, Ctx>) => Promise<T[]> | T[];\n\t/** Result-row identity (used to diff re-runs). */\n\tkey: (row: T) => RowKey;\n\t/** Access control; return false (or throw) to deny the subscription. */\n\tauthorize?: (params: P, ctx: Ctx) => boolean | Promise<boolean>;\n};\n\n/**\n * Define a reactive query: a function that reads through `ctx.db` and is kept\n * live automatically by read-set tracking. Register it with\n * {@link SyncEngine.registerReactive} (and the tables it reads with\n * `registerReader`).\n */\nexport const defineReactiveQuery = <T, P = void, Ctx = CollectionContext>(\n\tdefinition: Omit<ReactiveQueryDefinition<T, P, Ctx>, 'kind'>\n): ReactiveQueryDefinition<T, P, Ctx> => ({ ...definition, kind: 'reactive' });\n",
14
14
  "import type { AggregateGroup } from './aggregate';\nimport type { CollectionContext } from './collection';\nimport {\n\taggregateOp,\n\tfilterOp,\n\tjoinNode,\n\tmapOp,\n\tmaterialize,\n\torderByOp\n} from './dataflow';\nimport type { Change, JoinNode, Operator } from './dataflow';\nimport type { RowChange, RowKey, ViewDiff } from './types';\n\n/**\n * Declarative incremental queries — the front door to the operator graph. Build a\n * pipeline with {@link query} (`source → filter → map → join → groupBy`); the\n * engine instantiates it per subscription, hydrates each source, and routes each\n * table's changes through the wired operators, emitting result diffs.\n */\n\n/** A table this query reads. */\nexport type GraphSource<Row, P = void, Ctx = CollectionContext> = {\n\ttable: string;\n\thydrate: (params: P, ctx: Ctx) => Promise<Iterable<Row>> | Iterable<Row>;\n\tkey: (row: Row) => RowKey;\n\t/** Scope incremental changes (a row that fails it leaves). */\n\tmatch?: (row: Row, params: P, ctx: Ctx) => boolean;\n};\n\nexport type JoinOptions<Left, Right, Out> = {\n\t/** Join value on the left (current) stream. */\n\ton: (left: Left) => RowKey;\n\t/** Join value on the right source. */\n\trightOn: (right: Right) => RowKey;\n\t/** Combine a matched pair. */\n\tselect: (left: Left, right: Right) => Out;\n\t/**\n\t * Provide to make this a LEFT join: output for a left row with no matching\n\t * right (e.g. a user with zero orders). Omit for an inner join.\n\t */\n\tselectUnmatched?: (left: Left) => Out;\n\t/** Output row identity (unique per pair). */\n\tkey: (out: Out) => RowKey;\n};\n\nexport type GroupByOptions<Row> = {\n\t/** Input row identity (to track contributions). */\n\tkey: (row: Row) => RowKey;\n\tgroupBy?: (row: Row) => RowKey;\n\tvalue?: (row: Row) => number;\n};\n\nexport type OrderByQueryOptions<Row> = {\n\t/** Row identity. */\n\tkey: (row: Row) => RowKey;\n\t/** Sort comparator (ascending). */\n\tcompare: (a: Row, b: Row) => number;\n\t/** Keep at most this many rows (top-N). */\n\tlimit?: number;\n\t/** Skip this many from the front (pagination). */\n\toffset?: number;\n};\n\n/** A live, instantiated graph for one subscription. */\nexport type GraphInstance<Out> = {\n\ttables: string[];\n\thydrate: () => Promise<Out[]>;\n\tapplyChange: (table: string, change: RowChange<unknown>) => ViewDiff<Out>;\n};\n\n// `any` throughout the internals: a graph chains heterogeneously-typed stages;\n// the public Query/GraphSource surface stays fully typed.\ntype AnySource = GraphSource<any, any, any>;\n\ntype Plan = { source: AnySource; steps: AnyStep[] };\n\ntype AnyStep =\n\t| { kind: 'filter'; predicate: (row: any, p: any, ctx: any) => boolean }\n\t| {\n\t\t\tkind: 'map';\n\t\t\ttransform: (row: any) => any;\n\t\t\trekey?: (row: any) => RowKey;\n\t }\n\t// A join's right input is itself a (sub)query plan — a base table is just a\n\t// plan with no steps, so a join can combine two derived streams.\n\t| ({ kind: 'join'; rightPlan: Plan } & JoinOptions<any, any, any>)\n\t| ({ kind: 'aggregate' } & GroupByOptions<any>)\n\t| ({ kind: 'orderBy' } & OrderByQueryOptions<any>);\n\n/** Plan behind each Query, so a Query can be passed as a join's right input. */\nconst PLANS = new WeakMap<object, Plan>();\n\nconst planTables = (plan: Plan): string[] => {\n\tconst tables = [plan.source.table];\n\tfor (const step of plan.steps) {\n\t\tif (step.kind === 'join') {\n\t\t\ttables.push(...planTables(step.rightPlan));\n\t\t}\n\t}\n\treturn [...new Set(tables)];\n};\n\nexport type Query<Row, P = void, Ctx = CollectionContext> = {\n\tfilter: (\n\t\tpredicate: (row: Row, params: P, ctx: Ctx) => boolean\n\t) => Query<Row, P, Ctx>;\n\tmap: <Out>(\n\t\ttransform: (row: Row) => Out,\n\t\trekey?: (row: Out) => RowKey\n\t) => Query<Out, P, Ctx>;\n\tjoin: <Right, Out>(\n\t\tright: GraphSource<Right, P, Ctx> | Query<Right, P, Ctx>,\n\t\toptions: JoinOptions<Row, Right, Out>\n\t) => Query<Out, P, Ctx>;\n\t/**\n\t * LEFT join: like {@link join} but keeps left rows with no match, emitting\n\t * `selectUnmatched(left)` for them (required, so the intent is explicit).\n\t */\n\tleftJoin: <Right, Out>(\n\t\tright: GraphSource<Right, P, Ctx> | Query<Right, P, Ctx>,\n\t\toptions: JoinOptions<Row, Right, Out> & {\n\t\t\tselectUnmatched: (left: Row) => Out;\n\t\t}\n\t) => Query<Out, P, Ctx>;\n\tgroupBy: (options: GroupByOptions<Row>) => Query<AggregateGroup, P, Ctx>;\n\torderBy: (options: OrderByQueryOptions<Row>) => Query<Row, P, Ctx>;\n\t/** Source tables this query reads. */\n\ttables: () => string[];\n\t/** Instantiate the graph for one subscription's params/ctx. */\n\tinstantiate: (params: P, ctx: Ctx) => GraphInstance<Row>;\n};\n\n/** A graph that emits a change stream (no materialization) — recursive: a join's\n * right is itself a StreamGraph, so subqueries nest. */\ntype StreamGraph = {\n\ttables: string[];\n\toutKey: (row: any) => RowKey;\n\thydrateStream: () => Promise<Change<any>[]>;\n\tapplyStream: (table: string, change: RowChange<unknown>) => Change<any>[];\n};\n\ntype Stage =\n\t| { kind: 'op'; op: Operator<any, any> }\n\t| { kind: 'join'; node: JoinNode<any, any, any>; right: StreamGraph };\n\n/** How a table's change enters the graph (root's left, or a join's right input). */\ntype Entry = {\n\tstageIndex: number;\n\tside: 'left' | 'right';\n\tproduce: (change: RowChange<unknown>) => Change<any>[];\n};\n\nconst instantiateStream = (\n\tsource: AnySource,\n\tsteps: AnyStep[],\n\tparams: any,\n\tctx: any\n): StreamGraph => {\n\tconst stages: Stage[] = [];\n\tlet currentKey: (row: any) => RowKey = source.key;\n\n\tfor (const step of steps) {\n\t\tif (step.kind === 'filter') {\n\t\t\tconst predicate = step.predicate;\n\t\t\tstages.push({\n\t\t\t\tkind: 'op',\n\t\t\t\top: filterOp((row) => predicate(row, params, ctx))\n\t\t\t});\n\t\t} else if (step.kind === 'map') {\n\t\t\tstages.push({ kind: 'op', op: mapOp(step.transform, step.rekey) });\n\t\t\tif (step.rekey) {\n\t\t\t\tcurrentKey = step.rekey;\n\t\t\t}\n\t\t} else if (step.kind === 'join') {\n\t\t\tconst right = instantiateStream(\n\t\t\t\tstep.rightPlan.source,\n\t\t\t\tstep.rightPlan.steps,\n\t\t\t\tparams,\n\t\t\t\tctx\n\t\t\t);\n\t\t\tstages.push({\n\t\t\t\tkind: 'join',\n\t\t\t\tnode: joinNode({\n\t\t\t\t\tleftKey: currentKey,\n\t\t\t\t\trightKey: right.outKey,\n\t\t\t\t\tleftOn: step.on,\n\t\t\t\t\trightOn: step.rightOn,\n\t\t\t\t\tselect: step.select,\n\t\t\t\t\tselectUnmatched: step.selectUnmatched,\n\t\t\t\t\tkey: step.key\n\t\t\t\t}),\n\t\t\t\tright\n\t\t\t});\n\t\t\tcurrentKey = step.key;\n\t\t} else if (step.kind === 'aggregate') {\n\t\t\tstages.push({\n\t\t\t\tkind: 'op',\n\t\t\t\top: aggregateOp({\n\t\t\t\t\tkey: step.key,\n\t\t\t\t\tgroupBy: step.groupBy,\n\t\t\t\t\tvalue: step.value\n\t\t\t\t})\n\t\t\t});\n\t\t\tcurrentKey = (group: AggregateGroup) => group.group;\n\t\t} else {\n\t\t\tstages.push({\n\t\t\t\tkind: 'op',\n\t\t\t\top: orderByOp({\n\t\t\t\t\tkey: step.key,\n\t\t\t\t\tcompare: step.compare,\n\t\t\t\t\tlimit: step.limit,\n\t\t\t\t\toffset: step.offset\n\t\t\t\t})\n\t\t\t});\n\t\t\t// orderBy preserves rows (and their identity), just windows them.\n\t\t\tcurrentKey = step.key;\n\t\t}\n\t}\n\n\tconst propagate = (\n\t\tchanges: Change<any>[],\n\t\tfromStage: number,\n\t\tside: 'left' | 'right'\n\t): Change<any>[] => {\n\t\tlet cs = changes;\n\t\tfor (let i = fromStage; i < stages.length; i += 1) {\n\t\t\tconst stage = stages[i]!;\n\t\t\tif (stage.kind === 'join') {\n\t\t\t\tcs =\n\t\t\t\t\ti === fromStage && side === 'right'\n\t\t\t\t\t\t? stage.node.pushRight(cs)\n\t\t\t\t\t\t: stage.node.pushLeft(cs);\n\t\t\t} else {\n\t\t\t\tcs = stage.op.push(cs);\n\t\t\t}\n\t\t}\n\t\treturn cs;\n\t};\n\n\tconst sourceChange = (change: RowChange<unknown>): Change<any> => {\n\t\tconst key = source.key(change.row);\n\t\tif (\n\t\t\tchange.op === 'delete' ||\n\t\t\t(source.match !== undefined &&\n\t\t\t\t!source.match(change.row, params, ctx))\n\t\t) {\n\t\t\treturn { op: 'delete', key, row: change.row };\n\t\t}\n\t\treturn { op: 'upsert', key, row: change.row };\n\t};\n\n\tconst entries = new Map<string, Entry[]>();\n\tconst addEntry = (table: string, entry: Entry) => {\n\t\tconst list = entries.get(table);\n\t\tif (list === undefined) {\n\t\t\tentries.set(table, [entry]);\n\t\t} else {\n\t\t\tlist.push(entry);\n\t\t}\n\t};\n\t// The root source feeds the left of stage 0.\n\taddEntry(source.table, {\n\t\tstageIndex: 0,\n\t\tside: 'left',\n\t\tproduce: (change) => [sourceChange(change)]\n\t});\n\t// Each join's right subgraph feeds that join's right; route every sub-table.\n\tstages.forEach((stage, index) => {\n\t\tif (stage.kind === 'join') {\n\t\t\tfor (const table of stage.right.tables) {\n\t\t\t\taddEntry(table, {\n\t\t\t\t\tstageIndex: index,\n\t\t\t\t\tside: 'right',\n\t\t\t\t\tproduce: (change) =>\n\t\t\t\t\t\t(stage as { right: StreamGraph }).right.applyStream(\n\t\t\t\t\t\t\ttable,\n\t\t\t\t\t\t\tchange\n\t\t\t\t\t\t)\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n\n\treturn {\n\t\ttables: planTables({ source, steps }),\n\t\toutKey: currentKey,\n\t\thydrateStream: async () => {\n\t\t\t// Prime each join's right (recursively hydrating its subgraph) first.\n\t\t\tfor (let i = 0; i < stages.length; i += 1) {\n\t\t\t\tconst stage = stages[i]!;\n\t\t\t\tif (stage.kind === 'join') {\n\t\t\t\t\tpropagate(await stage.right.hydrateStream(), i, 'right');\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst rootRows = [...(await source.hydrate(params, ctx))];\n\t\t\treturn propagate(\n\t\t\t\trootRows.map((row) => ({\n\t\t\t\t\top: 'upsert' as const,\n\t\t\t\t\tkey: source.key(row),\n\t\t\t\t\trow\n\t\t\t\t})),\n\t\t\t\t0,\n\t\t\t\t'left'\n\t\t\t);\n\t\t},\n\t\tapplyStream: (table, change) => {\n\t\t\tconst list = entries.get(table);\n\t\t\tif (list === undefined) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst out: Change<any>[] = [];\n\t\t\tfor (const entry of list) {\n\t\t\t\tout.push(\n\t\t\t\t\t...propagate(\n\t\t\t\t\t\tentry.produce(change),\n\t\t\t\t\t\tentry.stageIndex,\n\t\t\t\t\t\tentry.side\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn out;\n\t\t}\n\t};\n};\n\nconst instantiate = (\n\tsource: AnySource,\n\tsteps: AnyStep[],\n\tparams: any,\n\tctx: any\n): GraphInstance<any> => {\n\tconst graph = instantiateStream(source, steps, params, ctx);\n\tconst sink = materialize<any>(graph.outKey);\n\treturn {\n\t\ttables: graph.tables,\n\t\thydrate: async () => {\n\t\t\tsink.apply(await graph.hydrateStream());\n\t\t\treturn sink.rows();\n\t\t},\n\t\tapplyChange: (table, change) =>\n\t\t\tsink.apply(graph.applyStream(table, change))\n\t};\n};\n\nconst makeQuery = <Row, P, Ctx>(\n\tsource: AnySource,\n\tsteps: AnyStep[]\n): Query<Row, P, Ctx> => {\n\t// `right` is a base source or a sub-Query; normalize to a plan, then append a\n\t// join step (inner or left — `selectUnmatched` in `options` decides).\n\tconst addJoin = <Right, Out>(\n\t\tright: GraphSource<Right, P, Ctx> | Query<Right, P, Ctx>,\n\t\toptions: JoinOptions<Row, Right, Out>\n\t): Query<Out, P, Ctx> => {\n\t\tconst rightPlan = PLANS.get(right as object) ?? {\n\t\t\tsource: right as AnySource,\n\t\t\tsteps: []\n\t\t};\n\t\treturn makeQuery(source, [\n\t\t\t...steps,\n\t\t\t{ kind: 'join', rightPlan, ...options }\n\t\t]);\n\t};\n\tconst queryInstance: Query<Row, P, Ctx> = {\n\t\tfilter: (predicate) =>\n\t\t\tmakeQuery(source, [...steps, { kind: 'filter', predicate }]),\n\t\tmap: (transform, rekey) =>\n\t\t\tmakeQuery(source, [...steps, { kind: 'map', transform, rekey }]),\n\t\tjoin: (right, options) => addJoin(right, options),\n\t\tleftJoin: (right, options) => addJoin(right, options),\n\t\tgroupBy: (options) =>\n\t\t\tmakeQuery(source, [...steps, { kind: 'aggregate', ...options }]),\n\t\torderBy: (options) =>\n\t\t\tmakeQuery(source, [...steps, { kind: 'orderBy', ...options }]),\n\t\ttables: () => planTables({ source, steps }),\n\t\tinstantiate: (params, ctx) =>\n\t\t\tinstantiate(source, steps, params, ctx) as GraphInstance<Row>\n\t};\n\tPLANS.set(queryInstance, { source, steps });\n\treturn queryInstance;\n};\n\n/** Start a query from a source table. */\nexport const query = <Row, P = void, Ctx = CollectionContext>(\n\tsource: GraphSource<Row, P, Ctx>\n): Query<Row, P, Ctx> => makeQuery(source, []);\n\n/** A collection backed by an incremental operator graph (see {@link query}). */\nexport type GraphCollectionDefinition<\n\tOut,\n\tP = void,\n\tCtx = CollectionContext\n> = {\n\tname: string;\n\tkind: 'graph';\n\tquery: Query<Out, P, Ctx>;\n\tauthorize?: (params: P, ctx: Ctx) => boolean | Promise<boolean>;\n\t/** Output row identity (used by the engine/transport to key result rows). */\n\tkey: (out: Out) => RowKey;\n};\n\n/** Define a collection whose result is maintained by an operator graph. */\nexport const defineGraphCollection = <Out, P = void, Ctx = CollectionContext>(\n\tdefinition: Omit<GraphCollectionDefinition<Out, P, Ctx>, 'kind'>\n): GraphCollectionDefinition<Out, P, Ctx> => ({ ...definition, kind: 'graph' });\n",
15
+ "import type { CollectionContext } from './collection';\n\n/**\n * Declarative, row-level access control keyed by table — the engine enforces it,\n * so a rule lives in one place instead of being restated across a collection's\n * `authorize` (gate), `hydrate` (DB filter), and `match` (incremental filter).\n * This is the BYO-database analogue of Convex/Zero permissions: plain predicate\n * functions over `(ctx, row)`, applied uniformly to reads and writes.\n */\n\n/**\n * A row-level read rule: may `ctx` see `row`? Return `true` to allow. The engine\n * applies it to every row it would emit for the table — the initial snapshot, an\n * incremental diff, a catch-up diff, and the one-shot hydrate — and to the reads\n * a reactive query makes through `ctx.db`. So a row a caller can't see never\n * reaches them, even if the collection's `hydrate`/`match` are too loose.\n */\nexport type ReadRule<Row = unknown, Ctx = CollectionContext> = (\n\tctx: Ctx,\n\trow: Row\n) => boolean;\n\n/**\n * A row-level write rule: may `ctx` perform this write? Return `true` to allow; a\n * `false` rejects the mutation with `UnauthorizedError`, rolling back its\n * transaction. For `insert` the rule sees the row being created. For\n * `update`/`delete` it sees the *existing* row when the table has a reader with\n * `get` (so the check can't be spoofed by the client payload), otherwise the row\n * passed to the action.\n */\nexport type WriteRule<Row = unknown, Ctx = CollectionContext> = (\n\tctx: Ctx,\n\trow: Row\n) => boolean;\n\n/** Declarative permissions for one table's rows. An omitted rule allows. */\nexport type TablePermissions<Row = unknown, Ctx = CollectionContext> = {\n\t/** Who may read a row — filters every row the engine emits for this table. */\n\tread?: ReadRule<Row, Ctx>;\n\t/** Who may insert a row. Falls back to {@link TablePermissions.write}. */\n\tinsert?: WriteRule<Row, Ctx>;\n\t/** Who may update a row. Falls back to {@link TablePermissions.write}. */\n\tupdate?: WriteRule<Row, Ctx>;\n\t/** Who may delete a row. Falls back to {@link TablePermissions.write}. */\n\tdelete?: WriteRule<Row, Ctx>;\n\t/** Default write rule for any of insert/update/delete without a specific one. */\n\twrite?: WriteRule<Row, Ctx>;\n};\n\n/** A `table` → {@link TablePermissions} map. */\nexport type PermissionsDefinition<Ctx = CollectionContext> = Record<\n\tstring,\n\t// `any` row type per table: the map is heterogeneous, like the engine registry.\n\tTablePermissions<any, Ctx>\n>;\n\n/**\n * Define declarative, row-level permissions keyed by table. Identity at runtime —\n * it exists for type inference. Pass to `createSyncEngine({ permissions })` or\n * register incrementally with `engine.registerPermissions(table, rules)`.\n *\n * Scope: read rules are enforced for single-table `view` collections and for the\n * reads a reactive query makes through `ctx.db`; join/graph collections scope via\n * their own `hydrate`/`match`. Write rules are enforced in\n * `actions.insert/update/delete` (not the low-level `actions.change`).\n */\nexport const definePermissions = <Ctx = CollectionContext>(\n\tpermissions: PermissionsDefinition<Ctx>\n): PermissionsDefinition<Ctx> => permissions;\n",
15
16
  "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",
16
- "import type {\n\tCollectionContext,\n\tCollectionDefinition,\n\tJoinCollectionDefinition\n} from './collection';\nimport { createEquiJoin } from './equiJoin';\nimport type { EquiJoin } from './equiJoin';\nimport type { GraphCollectionDefinition, GraphInstance } from './graph';\nimport { createMaterializedView, isEmptyViewDiff } from './materializedView';\nimport type { MaterializedView } from './materializedView';\nimport type {\n\tMutationActions,\n\tMutationDefinition,\n\tTableWriter,\n\tTransactionRunner\n} from './mutation';\nimport type {\n\tReactiveQueryDefinition,\n\tReadHandle,\n\tTableReader\n} from './reactive';\nimport type { ClusterBus } from './cluster';\nimport type { ChangeSource, RowChange, RowKey, ViewDiff } from './types';\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\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 * 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 * 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};\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\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};\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 * 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>();\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\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\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\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.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): 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\n\t\treturn {\n\t\t\tall: async (table) => {\n\t\t\t\treadTables.add(table);\n\t\t\t\treturn [...(await readerFor(table).all(ctx))] 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\treturn (await reader.get(key, ctx)) 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 matched = [...(await reader.all(ctx))].filter(\n\t\t\t\t\tpredicate as (row: unknown) => boolean\n\t\t\t\t);\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: predicate as (row: unknown) => boolean,\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\t/** Diff a reactive query's re-run against its current set; updates `current`. */\n\tconst diffRerun = (\n\t\tsub: ReactiveSub,\n\t\trows: unknown[]\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 (!shallowEqual(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\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\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\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\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\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\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\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\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 rehydrate = async () => definition.hydrate(params, ctx);\n\t\t\tconst match = definition.match;\n\t\t\tconst tables = definition.tables ?? [collection];\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\tconst boundMatch = incremental\n\t\t\t\t? (row: unknown) => match(row, params, ctx)\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\treturn [...(await definition.hydrate(params, ctx))];\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\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\t\t\tconst writerFor = (table: string): TableWriter => {\n\t\t\t\tconst writer = writers.get(table);\n\t\t\t\tif (writer === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`No writer registered for table \"${table}\" — register one with engine.registerWriter, or use actions.change`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn writer;\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. The\n\t\t\t// `tx` handle threads through to each writer.\n\t\t\tconst runHandler = async (tx: unknown) => {\n\t\t\t\tconst buffered: {\n\t\t\t\t\ttable: string;\n\t\t\t\t\tchange: RowChange<unknown>;\n\t\t\t\t}[] = [];\n\t\t\t\tconst actions: MutationActions = {\n\t\t\t\t\tchange: (collection, change) => {\n\t\t\t\t\t\tbuffered.push({\n\t\t\t\t\t\t\ttable: collection,\n\t\t\t\t\t\t\tchange: change as RowChange<unknown>\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn Promise.resolve();\n\t\t\t\t\t},\n\t\t\t\t\tinsert: async (table, data) => {\n\t\t\t\t\t\tconst row = await writerFor(table).insert(\n\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\ttx\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbuffered.push({ table, change: { op: 'insert', row } });\n\t\t\t\t\t\treturn row;\n\t\t\t\t\t},\n\t\t\t\t\tupdate: async (table, data) => {\n\t\t\t\t\t\tconst row = await writerFor(table).update(\n\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\ttx\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbuffered.push({ table, change: { op: 'update', row } });\n\t\t\t\t\t\treturn row;\n\t\t\t\t\t},\n\t\t\t\t\tdelete: async (table, row) => {\n\t\t\t\t\t\tawait writerFor(table).delete(row, ctx, tx);\n\t\t\t\t\t\tbuffered.push({ table, change: { op: 'delete', row } });\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst handlerResult = await mutation.handler(\n\t\t\t\t\targs,\n\t\t\t\t\tctx,\n\t\t\t\t\tactions\n\t\t\t\t);\n\t\t\t\treturn { buffered, result: handlerResult };\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\tconst { buffered, result } =\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\treturn result;\n\t\t}\n\t};\n};\n",
17
+ "import type {\n\tCollectionContext,\n\tCollectionDefinition,\n\tJoinCollectionDefinition\n} from './collection';\nimport { createEquiJoin } from './equiJoin';\nimport type { EquiJoin } from './equiJoin';\nimport type { GraphCollectionDefinition, GraphInstance } from './graph';\nimport { createMaterializedView, isEmptyViewDiff } from './materializedView';\nimport type { MaterializedView } from './materializedView';\nimport type {\n\tMutationActions,\n\tMutationDefinition,\n\tTableWriter,\n\tTransactionRunner\n} from './mutation';\nimport type {\n\tReactiveQueryDefinition,\n\tReadHandle,\n\tTableReader\n} from './reactive';\nimport type {\n\tPermissionsDefinition,\n\tReadRule,\n\tTablePermissions,\n\tWriteRule\n} from './permissions';\nimport type { ClusterBus } from './cluster';\nimport type { ChangeSource, RowChange, RowKey, ViewDiff } from './types';\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\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 * 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 * 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};\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\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};\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 * 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>();\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\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// 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\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\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.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): 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\n\t\treturn {\n\t\t\tall: async (table) => {\n\t\t\t\treadTables.add(table);\n\t\t\t\tconst rows = [...(await readerFor(table).all(ctx))];\n\t\t\t\tconst rule = readRuleFor(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 row = await reader.get(key, ctx);\n\t\t\t\tconst rule = readRuleFor(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 = readRuleFor(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))].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\t/** Diff a reactive query's re-run against its current set; updates `current`. */\n\tconst diffRerun = (\n\t\tsub: ReactiveSub,\n\t\trows: unknown[]\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 (!shallowEqual(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\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\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\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\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\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\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\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\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 applies to single-table collections (its rows\n\t\t\t// are that table's rows); join/aggregate collections scope via match.\n\t\t\tconst readRule =\n\t\t\t\ttables.length === 1 ? readRuleFor(tables[0]!) : undefined;\n\t\t\t// Filter the DB result through the read rule, so the initial snapshot\n\t\t\t// and the refetch fallback never include a row the caller can't see —\n\t\t\t// regardless of what hydrate returns.\n\t\t\tconst rehydrate = readRule\n\t\t\t\t? async () =>\n\t\t\t\t\t\t[...(await definition.hydrate(params, ctx))].filter(\n\t\t\t\t\t\t\t(row) => readRule(ctx, row)\n\t\t\t\t\t\t)\n\t\t\t\t: async () => definition.hydrate(params, ctx);\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 rows = [...(await definition.hydrate(params, ctx))];\n\t\t\tconst tables = definition.tables ?? [collection];\n\t\t\tconst readRule =\n\t\t\t\ttables.length === 1 ? readRuleFor(tables[0]!) : 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\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\t\t\tconst writerFor = (table: string): TableWriter => {\n\t\t\t\tconst writer = writers.get(table);\n\t\t\t\tif (writer === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`No writer registered for table \"${table}\" — register one with engine.registerWriter, or use actions.change`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn writer;\n\t\t\t};\n\n\t\t\t// Enforce the table's declarative write rule before the writer runs (so\n\t\t\t// a deny rolls the transaction back). For update/delete, evaluate the\n\t\t\t// rule against the *existing* row when a reader can load it — so the\n\t\t\t// check reflects committed state, not a client-supplied payload.\n\t\t\tconst authorizeWrite = async (\n\t\t\t\ttable: string,\n\t\t\t\top: 'insert' | 'update' | 'delete',\n\t\t\t\tvalue: unknown\n\t\t\t) => {\n\t\t\t\tconst rule = writeRuleFor(table, op);\n\t\t\t\tif (rule === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlet subject = value;\n\t\t\t\tif (op !== 'insert') {\n\t\t\t\t\tconst reader = readers.get(table);\n\t\t\t\t\tif (reader?.get !== undefined) {\n\t\t\t\t\t\tconst id = reader.key\n\t\t\t\t\t\t\t? reader.key(value)\n\t\t\t\t\t\t\t: (value as { id?: RowKey }).id;\n\t\t\t\t\t\tif (id !== undefined) {\n\t\t\t\t\t\t\tconst existing = await reader.get(id, ctx);\n\t\t\t\t\t\t\tif (existing !== undefined) {\n\t\t\t\t\t\t\t\tsubject = existing;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!rule(ctx, subject)) {\n\t\t\t\t\tthrow new UnauthorizedError(`${op} on table \"${table}\"`);\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. The\n\t\t\t// `tx` handle threads through to each writer.\n\t\t\tconst runHandler = async (tx: unknown) => {\n\t\t\t\tconst buffered: {\n\t\t\t\t\ttable: string;\n\t\t\t\t\tchange: RowChange<unknown>;\n\t\t\t\t}[] = [];\n\t\t\t\tconst actions: MutationActions = {\n\t\t\t\t\tchange: (collection, change) => {\n\t\t\t\t\t\tbuffered.push({\n\t\t\t\t\t\t\ttable: collection,\n\t\t\t\t\t\t\tchange: change as RowChange<unknown>\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn Promise.resolve();\n\t\t\t\t\t},\n\t\t\t\t\tinsert: async (table, data) => {\n\t\t\t\t\t\tawait authorizeWrite(table, 'insert', data);\n\t\t\t\t\t\tconst row = await writerFor(table).insert(\n\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\ttx\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbuffered.push({ table, change: { op: 'insert', row } });\n\t\t\t\t\t\treturn row;\n\t\t\t\t\t},\n\t\t\t\t\tupdate: async (table, data) => {\n\t\t\t\t\t\tawait authorizeWrite(table, 'update', data);\n\t\t\t\t\t\tconst row = await writerFor(table).update(\n\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\ttx\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbuffered.push({ table, change: { op: 'update', row } });\n\t\t\t\t\t\treturn row;\n\t\t\t\t\t},\n\t\t\t\t\tdelete: async (table, row) => {\n\t\t\t\t\t\tawait authorizeWrite(table, 'delete', row);\n\t\t\t\t\t\tawait writerFor(table).delete(row, ctx, tx);\n\t\t\t\t\t\tbuffered.push({ table, change: { op: 'delete', row } });\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst handlerResult = await mutation.handler(\n\t\t\t\t\targs,\n\t\t\t\t\tctx,\n\t\t\t\t\tactions\n\t\t\t\t);\n\t\t\t\treturn { buffered, result: handlerResult };\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\tconst { buffered, result } =\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\treturn result;\n\t\t}\n\t};\n};\n",
17
18
  "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",
18
19
  "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"
19
20
  ],
20
- "mappings": "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",
21
- "debugId": "4ADB152722C87EA464756E2164756E21",
21
+ "mappings": "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",
22
+ "debugId": "04C93A0AB37B69AD64756E2164756E21",
22
23
  "names": []
23
24
  }
@@ -0,0 +1,51 @@
1
+ import type { CollectionContext } from './collection';
2
+ /**
3
+ * Declarative, row-level access control keyed by table — the engine enforces it,
4
+ * so a rule lives in one place instead of being restated across a collection's
5
+ * `authorize` (gate), `hydrate` (DB filter), and `match` (incremental filter).
6
+ * This is the BYO-database analogue of Convex/Zero permissions: plain predicate
7
+ * functions over `(ctx, row)`, applied uniformly to reads and writes.
8
+ */
9
+ /**
10
+ * A row-level read rule: may `ctx` see `row`? Return `true` to allow. The engine
11
+ * applies it to every row it would emit for the table — the initial snapshot, an
12
+ * incremental diff, a catch-up diff, and the one-shot hydrate — and to the reads
13
+ * a reactive query makes through `ctx.db`. So a row a caller can't see never
14
+ * reaches them, even if the collection's `hydrate`/`match` are too loose.
15
+ */
16
+ export type ReadRule<Row = unknown, Ctx = CollectionContext> = (ctx: Ctx, row: Row) => boolean;
17
+ /**
18
+ * A row-level write rule: may `ctx` perform this write? Return `true` to allow; a
19
+ * `false` rejects the mutation with `UnauthorizedError`, rolling back its
20
+ * transaction. For `insert` the rule sees the row being created. For
21
+ * `update`/`delete` it sees the *existing* row when the table has a reader with
22
+ * `get` (so the check can't be spoofed by the client payload), otherwise the row
23
+ * passed to the action.
24
+ */
25
+ export type WriteRule<Row = unknown, Ctx = CollectionContext> = (ctx: Ctx, row: Row) => boolean;
26
+ /** Declarative permissions for one table's rows. An omitted rule allows. */
27
+ export type TablePermissions<Row = unknown, Ctx = CollectionContext> = {
28
+ /** Who may read a row — filters every row the engine emits for this table. */
29
+ read?: ReadRule<Row, Ctx>;
30
+ /** Who may insert a row. Falls back to {@link TablePermissions.write}. */
31
+ insert?: WriteRule<Row, Ctx>;
32
+ /** Who may update a row. Falls back to {@link TablePermissions.write}. */
33
+ update?: WriteRule<Row, Ctx>;
34
+ /** Who may delete a row. Falls back to {@link TablePermissions.write}. */
35
+ delete?: WriteRule<Row, Ctx>;
36
+ /** Default write rule for any of insert/update/delete without a specific one. */
37
+ write?: WriteRule<Row, Ctx>;
38
+ };
39
+ /** A `table` → {@link TablePermissions} map. */
40
+ export type PermissionsDefinition<Ctx = CollectionContext> = Record<string, TablePermissions<any, Ctx>>;
41
+ /**
42
+ * Define declarative, row-level permissions keyed by table. Identity at runtime —
43
+ * it exists for type inference. Pass to `createSyncEngine({ permissions })` or
44
+ * register incrementally with `engine.registerPermissions(table, rules)`.
45
+ *
46
+ * Scope: read rules are enforced for single-table `view` collections and for the
47
+ * reads a reactive query makes through `ctx.db`; join/graph collections scope via
48
+ * their own `hydrate`/`match`. Write rules are enforced in
49
+ * `actions.insert/update/delete` (not the low-level `actions.change`).
50
+ */
51
+ export declare const definePermissions: <Ctx = CollectionContext>(permissions: PermissionsDefinition<Ctx>) => PermissionsDefinition<Ctx>;
@@ -2,6 +2,7 @@ import type { CollectionContext, CollectionDefinition, JoinCollectionDefinition
2
2
  import type { GraphCollectionDefinition } from './graph';
3
3
  import type { MutationDefinition, TableWriter, TransactionRunner } from './mutation';
4
4
  import type { ReactiveQueryDefinition, TableReader } from './reactive';
5
+ import type { PermissionsDefinition, TablePermissions } from './permissions';
5
6
  import type { ClusterBus } from './cluster';
6
7
  import type { ChangeSource, RowChange, ViewDiff } from './types';
7
8
  /**
@@ -96,6 +97,13 @@ export type SyncEngine = {
96
97
  * ORM). Required for every table a reactive query reads.
97
98
  */
98
99
  registerReader: <Ctx = CollectionContext>(table: string, reader: TableReader<Ctx>) => void;
100
+ /**
101
+ * Register declarative, row-level permissions for a `table` (see
102
+ * {@link definePermissions}). Read rules filter every row the engine emits for
103
+ * the table; write rules gate `actions.insert/update/delete`. Equivalent to a
104
+ * `permissions` entry on {@link createSyncEngine}.
105
+ */
106
+ registerPermissions: <Row = unknown, Ctx = CollectionContext>(table: string, rules: TablePermissions<Row, Ctx>) => void;
99
107
  /**
100
108
  * Run a registered mutation: authorize, invoke its handler (which writes and
101
109
  * emits changes via `applyChange`), and resolve with the handler's result.
@@ -118,6 +126,15 @@ export type SyncEngineOptions = {
118
126
  * mutations without a transaction (each writer call is its own DB op).
119
127
  */
120
128
  transaction?: TransactionRunner;
129
+ /**
130
+ * Declarative, row-level permissions keyed by table (see
131
+ * {@link definePermissions}). Read rules filter every row the engine emits;
132
+ * write rules gate `actions.insert/update/delete`. Add more later with
133
+ * {@link SyncEngine.registerPermissions}. Type the rules at the
134
+ * `definePermissions<YourCtx>(...)` call site; the engine accepts any context
135
+ * (it threads `ctx` untyped to your rules).
136
+ */
137
+ permissions?: PermissionsDefinition<any>;
121
138
  };
122
139
  /**
123
140
  * The Tier 3 sync engine: a registry of collections plus the view syncer. It is
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/sync",
3
- "version": "0.3.0",
3
+ "version": "0.4.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",