@rindle/api-server 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,9 +1,12 @@
1
- import type { Ast, MutationEnvelope, NamedQuery, Query } from "@rindle/client";
2
- import type { DematerializeInput, DematerializeOutput, MaterializationPolicy, MaterializeInput, MaterializeOutput, MigrateInput, MigrateOutput, MutationRejection, MutationRejectionOutput, QueryOnceInput, QueryOnceOutput, RindleDaemonClient, RowChangeTxn, RowChangeTxnOutput, SqlRead, SqlReadOutput, SqlStatement, SqlTxn, SqlTxnOutput, StreamMode, WireValue } from "@rindle/daemon-client";
1
+ import type { Ast, MutationEnvelope, NamedQuery, Query, Schema } from "@rindle/client";
2
+ import type { ClaimRoomEpochInput, ClaimRoomEpochOutput, DematerializeInput, DematerializeOutput, MaterializationPolicy, MaterializeInput, MaterializeOutput, MigrateInput, MigrateOutput, MutationRejection, MutationRejectionOutput, QueryOnceInput, QueryOnceOutput, RindleDaemonClient, RoomLmidsInput, RoomLmidsOutput, RowChangeTxn, RowChangeTxnOutput, SqlRead, SqlReadOutput, SqlStatement, SqlTxn, SqlTxnOutput, StreamMode, WireValue } from "@rindle/daemon-client";
3
3
  export declare const DEFAULT_RINDLE_API_ROUTES: {
4
4
  readonly query: "/api/rindle/query";
5
5
  readonly read: "/api/rindle/read";
6
6
  readonly mutate: "/api/rindle/mutate";
7
+ readonly applyRowChangeTxn: "/api/rindle/apply-row-change-txn";
8
+ readonly claimRoomEpoch: "/api/rindle/claim-room-epoch";
9
+ readonly roomLmids: "/api/rindle/room-lmids";
7
10
  };
8
11
  export type MaybePromise<T> = T | PromiseLike<T>;
9
12
  export interface ApiContext<User> {
@@ -90,6 +93,36 @@ export interface QueryReadResponse {
90
93
  * so the booting client opens its ws to the same warm follower. Absent ⇒ single-daemon. */
91
94
  wsEndpoint?: string;
92
95
  }
96
+ /** One mutation's collected effects, handed to a {@link MutationBackend} as ONE atomic unit. */
97
+ export interface MutationApplyInput {
98
+ envelope: MutationEnvelope;
99
+ /** What the mutator emitted, in order. */
100
+ statements: readonly SqlStatement[];
101
+ /** Present when the mutator returned a full `SqlTxn` carrying one. */
102
+ idempotencyKey?: string;
103
+ }
104
+ /**
105
+ * Where a mutation's statements go, and who stamps `lmid` — the seam that makes the mutator
106
+ * authoring surface backend-agnostic (`BYO-POSTGRES-LMID-CONTRACT-DESIGN.md` §6). Two impls ship:
107
+ * {@link daemonBackend} (today's behavior — the daemon's co-transactional stamp; the default) and
108
+ * {@link postgresBackend} (BYO-Postgres: the same guarantees discharged in one PG transaction,
109
+ * confirmation riding the CDC loop back down).
110
+ *
111
+ * Both methods advance the client's `last_mutation_id`; that is the load-bearing invariant:
112
+ * - `apply` runs the statements AND advances `lmid` to `envelope.mid` in the SAME atomic unit
113
+ * (OPTIMISTIC-WRITES-DESIGN.md §8.2) — never in a second transaction.
114
+ * - `reject` applies NO data but STILL advances `lmid` past `envelope.mid` (§2.4 — the sharp
115
+ * edge: without it the client's pending queue never drains and the optimistic stack wedges).
116
+ * - A backend/infrastructure failure THROWS from either — it is never reported as a user
117
+ * rejection (the client retries; mid dedup absorbs any applied prefix).
118
+ */
119
+ export interface MutationBackend {
120
+ apply(input: MutationApplyInput): Promise<SqlTxnOutput>;
121
+ reject(input: {
122
+ envelope: MutationEnvelope;
123
+ reason: string;
124
+ }): Promise<unknown>;
125
+ }
93
126
  export interface PushMutationRequest<User> {
94
127
  user: User;
95
128
  envelope: MutationEnvelope;
@@ -114,6 +147,17 @@ export interface RindleApiRoutes {
114
147
  query: string;
115
148
  read: string;
116
149
  mutate: string;
150
+ applyRowChangeTxn: string;
151
+ claimRoomEpoch: string;
152
+ roomLmids: string;
153
+ }
154
+ /** A room-host reply the transport writes VERBATIM (`status` + JSON `body`): the
155
+ * daemon's fence/conflict/identity semantics ride specific statuses and body shapes
156
+ * the room's `httpAuthority` decodes, so this endpoint trio can't run through the
157
+ * throw-on-error result shapes the viewer endpoints use. */
158
+ export interface RoomHostResponse {
159
+ status: number;
160
+ body: unknown;
117
161
  }
118
162
  /** A named query to keep permanently materialized (warm with zero subscribers). */
119
163
  export interface PinnedQuery {
@@ -129,11 +173,20 @@ export interface PinFanout {
129
173
  }
130
174
  export interface RindleApiServerOptions<User> {
131
175
  daemon: RindleDaemonClient;
176
+ /** Where mutations are applied and `lmid` is stamped ({@link MutationBackend}). Default:
177
+ * `daemonBackend(daemon)` — exactly today's behavior. Pass `postgresBackend(...)` when
178
+ * Postgres is the source of truth (the daemon leg then serves only the read side). */
179
+ backend?: MutationBackend;
132
180
  queries?: ApiQueries<User>;
133
181
  runQuery?: RunQuery<User>;
134
182
  mutators?: ApiMutators<User>;
135
183
  authorizeQuery?: Authorizer<AuthorizeQueryInput<User>>;
136
184
  authorizeMutation?: Authorizer<AuthorizeMutationInput<User>>;
185
+ /** The room write-authority gate (§5.3.1): validates the caller is a placed room —
186
+ * the epoch-bound flush credential rides `context.request`, and what it means is
187
+ * the app's to define. The room endpoints are DISABLED (403) until this is set:
188
+ * hosting a write authority is an explicit opt-in, never a default. */
189
+ authorizeRoom?: Authorizer<ApiContext<User>>;
137
190
  routes?: Partial<RindleApiRoutes>;
138
191
  mode?: StreamMode;
139
192
  materializationPolicy?: MaterializationPolicy | ((input: QueryLeaseRequest<User>) => MaybePromise<MaterializationPolicy>);
@@ -196,6 +249,15 @@ export interface RindleApiServer<User> {
196
249
  handleReadJson(body: unknown, context: ApiContext<User>): Promise<QueryReadResponse>;
197
250
  /** Accepts `{envelope}` (one) or `{envelopes: [...]}` (an in-order batch → array reply). */
198
251
  handleMutateJson(body: unknown, context: ApiContext<User>): Promise<PushMutationResponse | PushMutationResponse[]>;
252
+ /** The room's flush (§5.3.1): gate on `authorizeRoom`, forward the txn to the write
253
+ * authority, and pass the store's verdict through VERBATIM — `200 {applied, cv}`,
254
+ * `409 {error:"fenced"|"conflict", …}`, or the loud identity `500`. Write
255
+ * `status` + `body` as-is; the room's `httpAuthority` decodes them. */
256
+ handleApplyRowChangeTxnJson(body: unknown, context: ApiContext<User>): Promise<RoomHostResponse>;
257
+ /** Claim the next placement epoch for a doc (§2.5), same gate + envelope. */
258
+ handleClaimRoomEpochJson(body: unknown, context: ApiContext<User>): Promise<RoomHostResponse>;
259
+ /** The room's boot probe (§3.3), same gate + envelope. */
260
+ handleRoomLmidsJson(body: unknown, context: ApiContext<User>): Promise<RoomHostResponse>;
199
261
  }
200
262
  export type RindleApiErrorCode = "bad-request" | "forbidden" | "not-found" | "rejected";
201
263
  export declare class RindleApiError extends Error {
@@ -228,11 +290,70 @@ export declare class SplitDaemonClient implements RindleDaemonClient {
228
290
  executeSqlRead(input: SqlRead): Promise<SqlReadOutput>;
229
291
  rejectMutation(input: MutationRejection): Promise<MutationRejectionOutput>;
230
292
  applyRowChangeTxn(input: RowChangeTxn): Promise<RowChangeTxnOutput>;
293
+ claimRoomEpoch(input: ClaimRoomEpochInput): Promise<ClaimRoomEpochOutput>;
294
+ roomLmids(input: RoomLmidsInput): Promise<RoomLmidsOutput>;
231
295
  migrate(input: MigrateInput): Promise<MigrateOutput>;
232
296
  materialize(input: MaterializeInput): Promise<MaterializeOutput>;
233
297
  query(input: QueryOnceInput): Promise<QueryOnceOutput>;
234
298
  dematerialize(input: DematerializeInput): Promise<DematerializeOutput>;
235
299
  }
300
+ /**
301
+ * Today's behavior as a {@link MutationBackend}: ship the statements + envelope to the daemon,
302
+ * whose `/execute-sql-txn` path stamps `lmid` co-transactionally (and `/reject-mutation` advances
303
+ * it past a rejected mid). This is the default backend — existing users never see a change.
304
+ */
305
+ export declare function daemonBackend(daemon: RindleDaemonClient): MutationBackend;
306
+ /** The query surface a {@link PostgresPlugger} transaction exposes. `exec` runs one statement;
307
+ * `query` returns rows keyed by column name (read-your-own-writes inside the txn). */
308
+ export interface PgQuery {
309
+ exec(sql: string, params?: unknown[]): Promise<void>;
310
+ query(sql: string, params?: unknown[]): Promise<Array<Record<string, unknown>>>;
311
+ }
312
+ /** The thin driver adapter that keeps `pg` / `postgres.js` out of this package's dependencies
313
+ * (`BYO-POSTGRES-LMID-CONTRACT-DESIGN.md` §6.2): run `fn` inside ONE transaction — commit on
314
+ * resolve, roll back on throw. {@link pgPoolPlugger} adapts a node-postgres `Pool`. */
315
+ export interface PostgresPlugger {
316
+ transaction<T>(fn: (q: PgQuery) => Promise<T>): Promise<T>;
317
+ }
318
+ export interface PostgresBackendOptions {
319
+ /** Rewrite each MUTATOR statement's SQL before it runs (never the lmid upsert). The intended
320
+ * use is dialect bridging for a dual-topology app whose mutators are written SQLite-style:
321
+ * pass {@link questionToDollarParams} to convert `?` placeholders to `$1..$n`. */
322
+ rewriteSql?: (sql: string) => string;
323
+ }
324
+ /**
325
+ * The BYO-Postgres {@link MutationBackend} (`BYO-POSTGRES-LMID-CONTRACT-DESIGN.md` §6.3): one PG
326
+ * transaction runs the mutator's statements and ALWAYS upserts `_rindle_client_mutations` —
327
+ * the upsert sits outside any acceptance guard by construction, so the §2.4 footgun (a rejection
328
+ * that forgets to advance `lmid` and wedges the client's pending queue) cannot be written.
329
+ *
330
+ * Confirmation does NOT come from this call's response: the lmid row rides the same PG commit
331
+ * through CDC → relay → follower and reaches the client in the same coherent release as the
332
+ * data (§8.2 relocated upstream). A rejection's `reason` still returns on the HTTP reply, but
333
+ * nothing rejection-shaped travels the replication path — the optimistic prediction snaps back
334
+ * when the advanced `lmid` arrives.
335
+ */
336
+ export declare function postgresBackend(plugger: PostgresPlugger, opts?: PostgresBackendOptions): MutationBackend;
337
+ /** The slice of a node-postgres `Pool` the plugger needs — structural, so `pg` stays a
338
+ * dependency of the APP, never of this package. */
339
+ export interface PgPoolLike {
340
+ connect(): Promise<{
341
+ query(sql: string, params?: unknown[]): Promise<{
342
+ rows: Array<Record<string, unknown>>;
343
+ }>;
344
+ release(err?: unknown): void;
345
+ }>;
346
+ }
347
+ /** Adapt a node-postgres `Pool` (or anything pool-shaped) to a {@link PostgresPlugger}:
348
+ * one client per transaction, `BEGIN`/`COMMIT` bracketing, `ROLLBACK` + rethrow on failure. */
349
+ export declare function pgPoolPlugger(pool: PgPoolLike): PostgresPlugger;
350
+ /**
351
+ * Rewrite SQLite-style `?` positional placeholders to Postgres `$1..$n`, for mutators written
352
+ * once and run against either backend (pass as {@link PostgresBackendOptions.rewriteSql}).
353
+ * Skips `'…'` string literals (with `''` escapes), `"…"` quoted identifiers, `--` line comments,
354
+ * and non-nested C-style block comments. Do not mix `?` and `$n` styles in one statement.
355
+ */
356
+ export declare function questionToDollarParams(sql: string): string;
236
357
  export declare function defineApiQueries<User, Q extends ApiQueries<User>>(queries: Q): Q;
237
358
  /**
238
359
  * Register a list of co-located client {@link NamedQuery `defineQuery`} values as the server's query
@@ -255,5 +376,42 @@ export declare function defineApiQueries<User, Q extends ApiQueries<User>>(queri
255
376
  export declare function registerQueries<User>(queries: readonly NamedQuery<any, any, any>[]): ApiQueries<User>;
256
377
  export declare function defineApiMutators<User, M extends ApiMutators<User>>(mutators: M): M;
257
378
  export declare function queryResultToAst(result: ApiQueryResult): Ast;
379
+ /** One exemplar invocation for {@link dumpQueryShapes} — the `args`/`user` a query is built with.
380
+ * Literal values never matter to the dump (shapes are deduped with literals stripped); what an
381
+ * exemplar buys is BRANCH coverage, so supply one per code path a query function can take
382
+ * (an optional filter present/absent, each enum axis, …). */
383
+ export interface ShapeExemplar<User = unknown> {
384
+ args?: unknown;
385
+ user?: User;
386
+ }
387
+ /** The query-shapes document `rindle indices suggest` consumes: the app's synced tables (name +
388
+ * primary key) and one wire AST per structurally distinct shape a registered query can build. */
389
+ export interface QueryShapesDoc {
390
+ tables: Array<{
391
+ name: string;
392
+ primaryKey: string[];
393
+ }>;
394
+ queries: Array<{
395
+ name: string;
396
+ ast: Ast;
397
+ }>;
398
+ }
399
+ /**
400
+ * Dump every registered named query's wire AST — feeder 1 ("exemplar enumeration") of
401
+ * `rindle indices suggest` (docs/INDEXING.md applied mechanically to the query set).
402
+ *
403
+ * Because named queries are FUNCTIONS of `(args, ctx)`, one query can build structurally
404
+ * different ASTs on different args; each exemplar invocation contributes its shape, and shapes
405
+ * that differ only in literal values (a limit, a filter string) dedupe to one entry. A query
406
+ * with no configured exemplars is invoked once with no args. The registry is the app's whole
407
+ * server-side query surface, so the resulting document is the complete static shape set —
408
+ * modulo arg-value-dependent branches, which need an exemplar (or runtime shape recording) to
409
+ * surface.
410
+ */
411
+ export declare function dumpQueryShapes<User>(opts: {
412
+ schema: Schema;
413
+ queries: ApiQueries<User>;
414
+ exemplars?: Partial<Record<string, ReadonlyArray<ShapeExemplar<User>>>>;
415
+ }): Promise<QueryShapesDoc>;
258
416
  export declare function createRindleApiServer<User = unknown>(opts: RindleApiServerOptions<User>): RindleApiServer<User>;
259
417
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,7 +1,13 @@
1
+ import { DaemonHttpError } from "@rindle/daemon-client";
1
2
  export const DEFAULT_RINDLE_API_ROUTES = {
2
3
  query: "/api/rindle/query",
3
4
  read: "/api/rindle/read",
4
5
  mutate: "/api/rindle/mutate",
6
+ // The room write-authority host (RINDLE-REALTIME-DESIGN.md §5.3.1): the room's
7
+ // SOLE flush counterpart — the store's own handler is private ingress behind these.
8
+ applyRowChangeTxn: "/api/rindle/apply-row-change-txn",
9
+ claimRoomEpoch: "/api/rindle/claim-room-epoch",
10
+ roomLmids: "/api/rindle/room-lmids",
5
11
  };
6
12
  export class RindleApiError extends Error {
7
13
  code;
@@ -54,6 +60,18 @@ export class SplitDaemonClient {
54
60
  applyRowChangeTxn(input) {
55
61
  return this.writes.applyRowChangeTxn(input);
56
62
  }
63
+ claimRoomEpoch(input) {
64
+ const claim = this.writes.claimRoomEpoch?.bind(this.writes);
65
+ if (!claim)
66
+ return Promise.reject(new Error("the write master lacks claimRoomEpoch"));
67
+ return claim(input);
68
+ }
69
+ roomLmids(input) {
70
+ const lmids = this.writes.roomLmids?.bind(this.writes);
71
+ if (!lmids)
72
+ return Promise.reject(new Error("the write master lacks roomLmids"));
73
+ return lmids(input);
74
+ }
57
75
  migrate(input) {
58
76
  return this.writes.migrate(input);
59
77
  }
@@ -68,6 +86,142 @@ export class SplitDaemonClient {
68
86
  return this.reads.dematerialize(input);
69
87
  }
70
88
  }
89
+ /**
90
+ * Today's behavior as a {@link MutationBackend}: ship the statements + envelope to the daemon,
91
+ * whose `/execute-sql-txn` path stamps `lmid` co-transactionally (and `/reject-mutation` advances
92
+ * it past a rejected mid). This is the default backend — existing users never see a change.
93
+ */
94
+ export function daemonBackend(daemon) {
95
+ return {
96
+ apply({ envelope, statements, idempotencyKey }) {
97
+ const txn = { statements: [...statements], clientID: envelope.clientID, mid: envelope.mid };
98
+ if (idempotencyKey !== undefined)
99
+ txn.idempotencyKey = idempotencyKey;
100
+ return daemon.executeSqlTxn(txn);
101
+ },
102
+ reject({ envelope, reason }) {
103
+ return daemon.rejectMutation({ clientID: envelope.clientID, mid: envelope.mid, reason });
104
+ },
105
+ };
106
+ }
107
+ /** The §2.3 upsert, verbatim from the contract: monotonic via GREATEST, keyed by client. The
108
+ * identifiers are lowercase so quoting is cosmetic, but quote-everything is the repo's PG rule. */
109
+ const LMID_UPSERT = `INSERT INTO "_rindle_client_mutations" ("client_id", "last_mutation_id")
110
+ VALUES ($1, $2)
111
+ ON CONFLICT ("client_id") DO UPDATE
112
+ SET "last_mutation_id" = GREATEST("_rindle_client_mutations"."last_mutation_id", EXCLUDED."last_mutation_id")`;
113
+ /**
114
+ * The BYO-Postgres {@link MutationBackend} (`BYO-POSTGRES-LMID-CONTRACT-DESIGN.md` §6.3): one PG
115
+ * transaction runs the mutator's statements and ALWAYS upserts `_rindle_client_mutations` —
116
+ * the upsert sits outside any acceptance guard by construction, so the §2.4 footgun (a rejection
117
+ * that forgets to advance `lmid` and wedges the client's pending queue) cannot be written.
118
+ *
119
+ * Confirmation does NOT come from this call's response: the lmid row rides the same PG commit
120
+ * through CDC → relay → follower and reaches the client in the same coherent release as the
121
+ * data (§8.2 relocated upstream). A rejection's `reason` still returns on the HTTP reply, but
122
+ * nothing rejection-shaped travels the replication path — the optimistic prediction snaps back
123
+ * when the advanced `lmid` arrives.
124
+ */
125
+ export function postgresBackend(plugger, opts = {}) {
126
+ const rewrite = opts.rewriteSql ?? ((sql) => sql);
127
+ const applyInTxn = (envelope, statements) => plugger.transaction(async (q) => {
128
+ for (const s of statements)
129
+ await q.exec(rewrite(s.sql), (s.params ?? []));
130
+ // ALWAYS — accepted or rejected — in this same transaction (§2.2, §2.4).
131
+ await q.exec(LMID_UPSERT, [envelope.clientID, envelope.mid]);
132
+ return { applied: true, lmidAdvances: [{ clientID: envelope.clientID, lmid: envelope.mid }] };
133
+ });
134
+ return {
135
+ apply: ({ envelope, statements }) => applyInTxn(envelope, statements),
136
+ reject: ({ envelope }) => applyInTxn(envelope, []),
137
+ };
138
+ }
139
+ /** Adapt a node-postgres `Pool` (or anything pool-shaped) to a {@link PostgresPlugger}:
140
+ * one client per transaction, `BEGIN`/`COMMIT` bracketing, `ROLLBACK` + rethrow on failure. */
141
+ export function pgPoolPlugger(pool) {
142
+ return {
143
+ async transaction(fn) {
144
+ const client = await pool.connect();
145
+ try {
146
+ await client.query("BEGIN");
147
+ const q = {
148
+ exec: async (sql, params) => {
149
+ await client.query(sql, params);
150
+ },
151
+ query: async (sql, params) => (await client.query(sql, params)).rows,
152
+ };
153
+ const out = await fn(q);
154
+ await client.query("COMMIT");
155
+ return out;
156
+ }
157
+ catch (err) {
158
+ try {
159
+ await client.query("ROLLBACK");
160
+ }
161
+ catch {
162
+ // the connection may already be unusable; the original error is the one that matters
163
+ }
164
+ throw err;
165
+ }
166
+ finally {
167
+ client.release();
168
+ }
169
+ },
170
+ };
171
+ }
172
+ /**
173
+ * Rewrite SQLite-style `?` positional placeholders to Postgres `$1..$n`, for mutators written
174
+ * once and run against either backend (pass as {@link PostgresBackendOptions.rewriteSql}).
175
+ * Skips `'…'` string literals (with `''` escapes), `"…"` quoted identifiers, `--` line comments,
176
+ * and non-nested C-style block comments. Do not mix `?` and `$n` styles in one statement.
177
+ */
178
+ export function questionToDollarParams(sql) {
179
+ let out = "";
180
+ let n = 0;
181
+ let i = 0;
182
+ while (i < sql.length) {
183
+ const c = sql[i];
184
+ if (c === "?") {
185
+ out += `$${++n}`;
186
+ i += 1;
187
+ }
188
+ else if (c === "'" || c === '"') {
189
+ // consume the quoted span; a doubled quote is an escape inside it
190
+ const quote = c;
191
+ let j = i + 1;
192
+ while (j < sql.length) {
193
+ if (sql[j] === quote) {
194
+ if (sql[j + 1] === quote)
195
+ j += 2;
196
+ else
197
+ break;
198
+ }
199
+ else {
200
+ j += 1;
201
+ }
202
+ }
203
+ out += sql.slice(i, j + 1);
204
+ i = j + 1;
205
+ }
206
+ else if (c === "-" && sql[i + 1] === "-") {
207
+ const end = sql.indexOf("\n", i);
208
+ const j = end === -1 ? sql.length : end;
209
+ out += sql.slice(i, j);
210
+ i = j;
211
+ }
212
+ else if (c === "/" && sql[i + 1] === "*") {
213
+ const end = sql.indexOf("*/", i + 2);
214
+ const j = end === -1 ? sql.length : end + 2;
215
+ out += sql.slice(i, j);
216
+ i = j;
217
+ }
218
+ else {
219
+ out += c;
220
+ i += 1;
221
+ }
222
+ }
223
+ return out;
224
+ }
71
225
  export function defineApiQueries(queries) {
72
226
  return queries;
73
227
  }
@@ -108,9 +262,86 @@ export function queryResultToAst(result) {
108
262
  }
109
263
  return result;
110
264
  }
265
+ /**
266
+ * Dump every registered named query's wire AST — feeder 1 ("exemplar enumeration") of
267
+ * `rindle indices suggest` (docs/INDEXING.md applied mechanically to the query set).
268
+ *
269
+ * Because named queries are FUNCTIONS of `(args, ctx)`, one query can build structurally
270
+ * different ASTs on different args; each exemplar invocation contributes its shape, and shapes
271
+ * that differ only in literal values (a limit, a filter string) dedupe to one entry. A query
272
+ * with no configured exemplars is invoked once with no args. The registry is the app's whole
273
+ * server-side query surface, so the resulting document is the complete static shape set —
274
+ * modulo arg-value-dependent branches, which need an exemplar (or runtime shape recording) to
275
+ * surface.
276
+ */
277
+ export async function dumpQueryShapes(opts) {
278
+ const tables = Object.values(opts.schema.tables)
279
+ // Local-only tables live in the browser's memory source, never a TableSource — no indexes.
280
+ .filter((t) => t.local !== true)
281
+ .map((t) => ({ name: t.name, primaryKey: [...t.primaryKey] }))
282
+ .sort((a, b) => a.name.localeCompare(b.name));
283
+ const queries = [];
284
+ for (const [name, query] of Object.entries(opts.queries).sort(([a], [b]) => a.localeCompare(b))) {
285
+ const seen = new Set();
286
+ for (const ex of opts.exemplars?.[name] ?? [{}]) {
287
+ const ast = queryResultToAst(await query({ user: ex.user }, ex.args));
288
+ const key = JSON.stringify(normalizeShape(ast));
289
+ if (seen.has(key))
290
+ continue;
291
+ seen.add(key);
292
+ queries.push({ name: seen.size > 1 ? `${name}#${seen.size}` : name, ast });
293
+ }
294
+ }
295
+ return { tables, queries };
296
+ }
297
+ /** The literal-stripped structure of an AST — the dedupe key for {@link dumpQueryShapes}. */
298
+ function normalizeShape(ast) {
299
+ return {
300
+ table: ast.table,
301
+ where: ast.where && normalizeCondition(ast.where),
302
+ related: ast.related?.map((r) => ({
303
+ correlation: r.correlation,
304
+ subquery: normalizeShape(r.subquery),
305
+ })),
306
+ orderBy: ast.orderBy,
307
+ limit: ast.limit !== undefined,
308
+ start: ast.start
309
+ ? { keys: Object.keys(ast.start.row).sort(), exclusive: ast.start.exclusive }
310
+ : undefined,
311
+ aggregate: ast.aggregate,
312
+ groupBy: ast.groupBy,
313
+ having: ast.having && normalizeCondition(ast.having),
314
+ one: ast.one,
315
+ };
316
+ }
317
+ function normalizeCondition(c) {
318
+ switch (c.type) {
319
+ case "simple":
320
+ return {
321
+ type: c.type,
322
+ op: c.op,
323
+ left: c.left,
324
+ right: c.right.type === "literal" ? { type: "literal" } : c.right,
325
+ };
326
+ case "and":
327
+ case "or":
328
+ return { type: c.type, conditions: c.conditions.map(normalizeCondition) };
329
+ case "correlatedSubquery":
330
+ return {
331
+ type: c.type,
332
+ op: c.op,
333
+ related: {
334
+ correlation: c.related.correlation,
335
+ subquery: normalizeShape(c.related.subquery),
336
+ },
337
+ };
338
+ }
339
+ }
111
340
  export function createRindleApiServer(opts) {
112
341
  const routes = { ...DEFAULT_RINDLE_API_ROUTES, ...opts.routes };
113
342
  const mode = opts.mode ?? "normalized";
343
+ // The mutation seam — defaulting to the daemon's co-transactional lmid stamp (unchanged behavior).
344
+ const backend = opts.backend ?? daemonBackend(opts.daemon);
114
345
  // Names that are ALSO configured pins — a lease for one is forced to a `pinned` policy (the lazy
115
346
  // floor, §4.1) so the first viewer to route to a follower warms it for late joiners.
116
347
  const pinnedNames = new Set((opts.pinnedQueries ?? []).map((p) => p.name));
@@ -183,7 +414,7 @@ export function createRindleApiServer(opts) {
183
414
  const context = { user: input.user, request: input.request };
184
415
  const mutator = opts.mutators?.[input.envelope.name];
185
416
  if (!mutator)
186
- return reject(opts.daemon, input.envelope, `unknown mutator: ${input.envelope.name}`);
417
+ return reject(backend, input.envelope, `unknown mutator: ${input.envelope.name}`);
187
418
  let sql;
188
419
  try {
189
420
  await assertAuthorized(opts.authorizeMutation, {
@@ -201,12 +432,12 @@ export function createRindleApiServer(opts) {
201
432
  sql = mutationResultToSqlTxn(result, tx);
202
433
  }
203
434
  catch (err) {
204
- return reject(opts.daemon, input.envelope, String(err?.message ?? err));
435
+ return reject(backend, input.envelope, String(err?.message ?? err));
205
436
  }
206
- const output = await opts.daemon.executeSqlTxn({
207
- ...sql,
208
- clientID: input.envelope.clientID,
209
- mid: input.envelope.mid,
437
+ const output = await backend.apply({
438
+ envelope: input.envelope,
439
+ statements: sql.statements,
440
+ idempotencyKey: sql.idempotencyKey,
210
441
  });
211
442
  return { accepted: true, rejected: false, output };
212
443
  };
@@ -267,6 +498,29 @@ export function createRindleApiServer(opts) {
267
498
  throw new Error(`assertPins: ${failures.length} failed — ${failures.join("; ")}`);
268
499
  }
269
500
  };
501
+ // The room write-authority gate (§5.3.1): endpoints are disabled until the app
502
+ // opts in with `authorizeRoom` — hosting an authority is never a default.
503
+ const roomGate = async (context) => {
504
+ if (!opts.authorizeRoom) {
505
+ throw new RindleApiError("forbidden", "room authority not configured", 403);
506
+ }
507
+ await assertAuthorized(opts.authorizeRoom, context);
508
+ };
509
+ // The store's verdict rides specific statuses + body shapes (fence / conflict /
510
+ // identity) the room decodes — pass a daemon HTTP error through VERBATIM.
511
+ const daemonVerdict = (e) => {
512
+ if (e instanceof DaemonHttpError) {
513
+ let body;
514
+ try {
515
+ body = JSON.parse(e.body);
516
+ }
517
+ catch {
518
+ body = { error: e.body };
519
+ }
520
+ return { status: e.status, body };
521
+ }
522
+ throw e;
523
+ };
270
524
  return {
271
525
  routes,
272
526
  createQueryLease,
@@ -274,6 +528,49 @@ export function createRindleApiServer(opts) {
274
528
  assertPins,
275
529
  pushMutation,
276
530
  pushMutations,
531
+ handleApplyRowChangeTxnJson: async (body, context) => {
532
+ await roomGate(context);
533
+ const msg = parseObject(body, "row-change txn");
534
+ try {
535
+ const out = await opts.daemon.applyRowChangeTxn(msg);
536
+ return { status: 200, body: out };
537
+ }
538
+ catch (e) {
539
+ return daemonVerdict(e);
540
+ }
541
+ },
542
+ handleClaimRoomEpochJson: async (body, context) => {
543
+ await roomGate(context);
544
+ const msg = parseObject(body, "claim-room-epoch request");
545
+ const doc = parseString(msg.doc, "doc");
546
+ const claim = opts.daemon.claimRoomEpoch?.bind(opts.daemon);
547
+ if (!claim) {
548
+ throw new Error("the configured daemon client does not implement claimRoomEpoch");
549
+ }
550
+ try {
551
+ return { status: 200, body: await claim({ doc }) };
552
+ }
553
+ catch (e) {
554
+ return daemonVerdict(e);
555
+ }
556
+ },
557
+ handleRoomLmidsJson: async (body, context) => {
558
+ await roomGate(context);
559
+ const msg = parseObject(body, "room-lmids request");
560
+ if (!Array.isArray(msg.clients) || msg.clients.some((c) => typeof c !== "string")) {
561
+ throw new RindleApiError("bad-request", "clients must be an array of strings", 400);
562
+ }
563
+ const lmids = opts.daemon.roomLmids?.bind(opts.daemon);
564
+ if (!lmids) {
565
+ throw new Error("the configured daemon client does not implement roomLmids");
566
+ }
567
+ try {
568
+ return { status: 200, body: await lmids({ clients: msg.clients }) };
569
+ }
570
+ catch (e) {
571
+ return daemonVerdict(e);
572
+ }
573
+ },
277
574
  handleQueryJson: (body, context) => {
278
575
  const msg = parseObject(body, "query request");
279
576
  return createQueryLease({
@@ -364,8 +661,8 @@ function queryLeaseResponse(out) {
364
661
  function errMessage(reason) {
365
662
  return String(reason?.message ?? reason);
366
663
  }
367
- async function reject(daemon, envelope, reason) {
368
- const output = await daemon.rejectMutation({ clientID: envelope.clientID, mid: envelope.mid, reason });
664
+ async function reject(backend, envelope, reason) {
665
+ const output = await backend.reject({ envelope, reason });
369
666
  return { accepted: false, rejected: true, reason, output };
370
667
  }
371
668
  function parseObject(value, label) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rindle/api-server",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -25,8 +25,8 @@
25
25
  "README.md"
26
26
  ],
27
27
  "dependencies": {
28
- "@rindle/client": "0.2.0",
29
- "@rindle/daemon-client": "0.2.0"
28
+ "@rindle/client": "0.3.1",
29
+ "@rindle/daemon-client": "0.3.1"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/node": "^22.10.0",
package/src/index.ts CHANGED
@@ -1,5 +1,8 @@
1
- import type { Ast, MutationEnvelope, NamedQuery, Query } from "@rindle/client";
1
+ import type { Ast, Condition, MutationEnvelope, NamedQuery, Query, Schema } from "@rindle/client";
2
+ import { DaemonHttpError } from "@rindle/daemon-client";
2
3
  import type {
4
+ ClaimRoomEpochInput,
5
+ ClaimRoomEpochOutput,
3
6
  DematerializeInput,
4
7
  DematerializeOutput,
5
8
  MaterializationPolicy,
@@ -12,6 +15,8 @@ import type {
12
15
  QueryOnceInput,
13
16
  QueryOnceOutput,
14
17
  RindleDaemonClient,
18
+ RoomLmidsInput,
19
+ RoomLmidsOutput,
15
20
  RowChangeTxn,
16
21
  RowChangeTxnOutput,
17
22
  SqlRead,
@@ -27,6 +32,11 @@ export const DEFAULT_RINDLE_API_ROUTES = {
27
32
  query: "/api/rindle/query",
28
33
  read: "/api/rindle/read",
29
34
  mutate: "/api/rindle/mutate",
35
+ // The room write-authority host (RINDLE-REALTIME-DESIGN.md §5.3.1): the room's
36
+ // SOLE flush counterpart — the store's own handler is private ingress behind these.
37
+ applyRowChangeTxn: "/api/rindle/apply-row-change-txn",
38
+ claimRoomEpoch: "/api/rindle/claim-room-epoch",
39
+ roomLmids: "/api/rindle/room-lmids",
30
40
  } as const;
31
41
 
32
42
  export type MaybePromise<T> = T | PromiseLike<T>;
@@ -130,6 +140,35 @@ export interface QueryReadResponse {
130
140
  wsEndpoint?: string;
131
141
  }
132
142
 
143
+ /** One mutation's collected effects, handed to a {@link MutationBackend} as ONE atomic unit. */
144
+ export interface MutationApplyInput {
145
+ envelope: MutationEnvelope;
146
+ /** What the mutator emitted, in order. */
147
+ statements: readonly SqlStatement[];
148
+ /** Present when the mutator returned a full `SqlTxn` carrying one. */
149
+ idempotencyKey?: string;
150
+ }
151
+
152
+ /**
153
+ * Where a mutation's statements go, and who stamps `lmid` — the seam that makes the mutator
154
+ * authoring surface backend-agnostic (`BYO-POSTGRES-LMID-CONTRACT-DESIGN.md` §6). Two impls ship:
155
+ * {@link daemonBackend} (today's behavior — the daemon's co-transactional stamp; the default) and
156
+ * {@link postgresBackend} (BYO-Postgres: the same guarantees discharged in one PG transaction,
157
+ * confirmation riding the CDC loop back down).
158
+ *
159
+ * Both methods advance the client's `last_mutation_id`; that is the load-bearing invariant:
160
+ * - `apply` runs the statements AND advances `lmid` to `envelope.mid` in the SAME atomic unit
161
+ * (OPTIMISTIC-WRITES-DESIGN.md §8.2) — never in a second transaction.
162
+ * - `reject` applies NO data but STILL advances `lmid` past `envelope.mid` (§2.4 — the sharp
163
+ * edge: without it the client's pending queue never drains and the optimistic stack wedges).
164
+ * - A backend/infrastructure failure THROWS from either — it is never reported as a user
165
+ * rejection (the client retries; mid dedup absorbs any applied prefix).
166
+ */
167
+ export interface MutationBackend {
168
+ apply(input: MutationApplyInput): Promise<SqlTxnOutput>;
169
+ reject(input: { envelope: MutationEnvelope; reason: string }): Promise<unknown>;
170
+ }
171
+
133
172
  export interface PushMutationRequest<User> {
134
173
  user: User;
135
174
  envelope: MutationEnvelope;
@@ -150,6 +189,18 @@ export interface RindleApiRoutes {
150
189
  query: string;
151
190
  read: string;
152
191
  mutate: string;
192
+ applyRowChangeTxn: string;
193
+ claimRoomEpoch: string;
194
+ roomLmids: string;
195
+ }
196
+
197
+ /** A room-host reply the transport writes VERBATIM (`status` + JSON `body`): the
198
+ * daemon's fence/conflict/identity semantics ride specific statuses and body shapes
199
+ * the room's `httpAuthority` decodes, so this endpoint trio can't run through the
200
+ * throw-on-error result shapes the viewer endpoints use. */
201
+ export interface RoomHostResponse {
202
+ status: number;
203
+ body: unknown;
153
204
  }
154
205
 
155
206
  /** A named query to keep permanently materialized (warm with zero subscribers). */
@@ -168,11 +219,20 @@ export interface PinFanout {
168
219
 
169
220
  export interface RindleApiServerOptions<User> {
170
221
  daemon: RindleDaemonClient;
222
+ /** Where mutations are applied and `lmid` is stamped ({@link MutationBackend}). Default:
223
+ * `daemonBackend(daemon)` — exactly today's behavior. Pass `postgresBackend(...)` when
224
+ * Postgres is the source of truth (the daemon leg then serves only the read side). */
225
+ backend?: MutationBackend;
171
226
  queries?: ApiQueries<User>;
172
227
  runQuery?: RunQuery<User>;
173
228
  mutators?: ApiMutators<User>;
174
229
  authorizeQuery?: Authorizer<AuthorizeQueryInput<User>>;
175
230
  authorizeMutation?: Authorizer<AuthorizeMutationInput<User>>;
231
+ /** The room write-authority gate (§5.3.1): validates the caller is a placed room —
232
+ * the epoch-bound flush credential rides `context.request`, and what it means is
233
+ * the app's to define. The room endpoints are DISABLED (403) until this is set:
234
+ * hosting a write authority is an explicit opt-in, never a default. */
235
+ authorizeRoom?: Authorizer<ApiContext<User>>;
176
236
  routes?: Partial<RindleApiRoutes>;
177
237
  mode?: StreamMode;
178
238
  materializationPolicy?:
@@ -241,6 +301,18 @@ export interface RindleApiServer<User> {
241
301
  body: unknown,
242
302
  context: ApiContext<User>,
243
303
  ): Promise<PushMutationResponse | PushMutationResponse[]>;
304
+ /** The room's flush (§5.3.1): gate on `authorizeRoom`, forward the txn to the write
305
+ * authority, and pass the store's verdict through VERBATIM — `200 {applied, cv}`,
306
+ * `409 {error:"fenced"|"conflict", …}`, or the loud identity `500`. Write
307
+ * `status` + `body` as-is; the room's `httpAuthority` decodes them. */
308
+ handleApplyRowChangeTxnJson(
309
+ body: unknown,
310
+ context: ApiContext<User>,
311
+ ): Promise<RoomHostResponse>;
312
+ /** Claim the next placement epoch for a doc (§2.5), same gate + envelope. */
313
+ handleClaimRoomEpochJson(body: unknown, context: ApiContext<User>): Promise<RoomHostResponse>;
314
+ /** The room's boot probe (§3.3), same gate + envelope. */
315
+ handleRoomLmidsJson(body: unknown, context: ApiContext<User>): Promise<RoomHostResponse>;
244
316
  }
245
317
 
246
318
  export type RindleApiErrorCode = "bad-request" | "forbidden" | "not-found" | "rejected";
@@ -300,6 +372,16 @@ export class SplitDaemonClient implements RindleDaemonClient {
300
372
  applyRowChangeTxn(input: RowChangeTxn): Promise<RowChangeTxnOutput> {
301
373
  return this.writes.applyRowChangeTxn(input);
302
374
  }
375
+ claimRoomEpoch(input: ClaimRoomEpochInput): Promise<ClaimRoomEpochOutput> {
376
+ const claim = this.writes.claimRoomEpoch?.bind(this.writes);
377
+ if (!claim) return Promise.reject(new Error("the write master lacks claimRoomEpoch"));
378
+ return claim(input);
379
+ }
380
+ roomLmids(input: RoomLmidsInput): Promise<RoomLmidsOutput> {
381
+ const lmids = this.writes.roomLmids?.bind(this.writes);
382
+ if (!lmids) return Promise.reject(new Error("the write master lacks roomLmids"));
383
+ return lmids(input);
384
+ }
303
385
  migrate(input: MigrateInput): Promise<MigrateOutput> {
304
386
  return this.writes.migrate(input);
305
387
  }
@@ -316,6 +398,166 @@ export class SplitDaemonClient implements RindleDaemonClient {
316
398
  }
317
399
  }
318
400
 
401
+ /**
402
+ * Today's behavior as a {@link MutationBackend}: ship the statements + envelope to the daemon,
403
+ * whose `/execute-sql-txn` path stamps `lmid` co-transactionally (and `/reject-mutation` advances
404
+ * it past a rejected mid). This is the default backend — existing users never see a change.
405
+ */
406
+ export function daemonBackend(daemon: RindleDaemonClient): MutationBackend {
407
+ return {
408
+ apply({ envelope, statements, idempotencyKey }) {
409
+ const txn: SqlTxn = { statements: [...statements], clientID: envelope.clientID, mid: envelope.mid };
410
+ if (idempotencyKey !== undefined) txn.idempotencyKey = idempotencyKey;
411
+ return daemon.executeSqlTxn(txn);
412
+ },
413
+ reject({ envelope, reason }) {
414
+ return daemon.rejectMutation({ clientID: envelope.clientID, mid: envelope.mid, reason });
415
+ },
416
+ };
417
+ }
418
+
419
+ /** The query surface a {@link PostgresPlugger} transaction exposes. `exec` runs one statement;
420
+ * `query` returns rows keyed by column name (read-your-own-writes inside the txn). */
421
+ export interface PgQuery {
422
+ exec(sql: string, params?: unknown[]): Promise<void>;
423
+ query(sql: string, params?: unknown[]): Promise<Array<Record<string, unknown>>>;
424
+ }
425
+
426
+ /** The thin driver adapter that keeps `pg` / `postgres.js` out of this package's dependencies
427
+ * (`BYO-POSTGRES-LMID-CONTRACT-DESIGN.md` §6.2): run `fn` inside ONE transaction — commit on
428
+ * resolve, roll back on throw. {@link pgPoolPlugger} adapts a node-postgres `Pool`. */
429
+ export interface PostgresPlugger {
430
+ transaction<T>(fn: (q: PgQuery) => Promise<T>): Promise<T>;
431
+ }
432
+
433
+ export interface PostgresBackendOptions {
434
+ /** Rewrite each MUTATOR statement's SQL before it runs (never the lmid upsert). The intended
435
+ * use is dialect bridging for a dual-topology app whose mutators are written SQLite-style:
436
+ * pass {@link questionToDollarParams} to convert `?` placeholders to `$1..$n`. */
437
+ rewriteSql?: (sql: string) => string;
438
+ }
439
+
440
+ /** The §2.3 upsert, verbatim from the contract: monotonic via GREATEST, keyed by client. The
441
+ * identifiers are lowercase so quoting is cosmetic, but quote-everything is the repo's PG rule. */
442
+ const LMID_UPSERT = `INSERT INTO "_rindle_client_mutations" ("client_id", "last_mutation_id")
443
+ VALUES ($1, $2)
444
+ ON CONFLICT ("client_id") DO UPDATE
445
+ SET "last_mutation_id" = GREATEST("_rindle_client_mutations"."last_mutation_id", EXCLUDED."last_mutation_id")`;
446
+
447
+ /**
448
+ * The BYO-Postgres {@link MutationBackend} (`BYO-POSTGRES-LMID-CONTRACT-DESIGN.md` §6.3): one PG
449
+ * transaction runs the mutator's statements and ALWAYS upserts `_rindle_client_mutations` —
450
+ * the upsert sits outside any acceptance guard by construction, so the §2.4 footgun (a rejection
451
+ * that forgets to advance `lmid` and wedges the client's pending queue) cannot be written.
452
+ *
453
+ * Confirmation does NOT come from this call's response: the lmid row rides the same PG commit
454
+ * through CDC → relay → follower and reaches the client in the same coherent release as the
455
+ * data (§8.2 relocated upstream). A rejection's `reason` still returns on the HTTP reply, but
456
+ * nothing rejection-shaped travels the replication path — the optimistic prediction snaps back
457
+ * when the advanced `lmid` arrives.
458
+ */
459
+ export function postgresBackend(plugger: PostgresPlugger, opts: PostgresBackendOptions = {}): MutationBackend {
460
+ const rewrite = opts.rewriteSql ?? ((sql: string) => sql);
461
+ const applyInTxn = (envelope: MutationEnvelope, statements: readonly SqlStatement[]): Promise<SqlTxnOutput> =>
462
+ plugger.transaction(async (q) => {
463
+ for (const s of statements) await q.exec(rewrite(s.sql), (s.params ?? []) as unknown[]);
464
+ // ALWAYS — accepted or rejected — in this same transaction (§2.2, §2.4).
465
+ await q.exec(LMID_UPSERT, [envelope.clientID, envelope.mid]);
466
+ return { applied: true, lmidAdvances: [{ clientID: envelope.clientID, lmid: envelope.mid }] };
467
+ });
468
+ return {
469
+ apply: ({ envelope, statements }) => applyInTxn(envelope, statements),
470
+ reject: ({ envelope }) => applyInTxn(envelope, []),
471
+ };
472
+ }
473
+
474
+ /** The slice of a node-postgres `Pool` the plugger needs — structural, so `pg` stays a
475
+ * dependency of the APP, never of this package. */
476
+ export interface PgPoolLike {
477
+ connect(): Promise<{
478
+ query(sql: string, params?: unknown[]): Promise<{ rows: Array<Record<string, unknown>> }>;
479
+ release(err?: unknown): void;
480
+ }>;
481
+ }
482
+
483
+ /** Adapt a node-postgres `Pool` (or anything pool-shaped) to a {@link PostgresPlugger}:
484
+ * one client per transaction, `BEGIN`/`COMMIT` bracketing, `ROLLBACK` + rethrow on failure. */
485
+ export function pgPoolPlugger(pool: PgPoolLike): PostgresPlugger {
486
+ return {
487
+ async transaction<T>(fn: (q: PgQuery) => Promise<T>): Promise<T> {
488
+ const client = await pool.connect();
489
+ try {
490
+ await client.query("BEGIN");
491
+ const q: PgQuery = {
492
+ exec: async (sql, params) => {
493
+ await client.query(sql, params);
494
+ },
495
+ query: async (sql, params) => (await client.query(sql, params)).rows,
496
+ };
497
+ const out = await fn(q);
498
+ await client.query("COMMIT");
499
+ return out;
500
+ } catch (err) {
501
+ try {
502
+ await client.query("ROLLBACK");
503
+ } catch {
504
+ // the connection may already be unusable; the original error is the one that matters
505
+ }
506
+ throw err;
507
+ } finally {
508
+ client.release();
509
+ }
510
+ },
511
+ };
512
+ }
513
+
514
+ /**
515
+ * Rewrite SQLite-style `?` positional placeholders to Postgres `$1..$n`, for mutators written
516
+ * once and run against either backend (pass as {@link PostgresBackendOptions.rewriteSql}).
517
+ * Skips `'…'` string literals (with `''` escapes), `"…"` quoted identifiers, `--` line comments,
518
+ * and non-nested C-style block comments. Do not mix `?` and `$n` styles in one statement.
519
+ */
520
+ export function questionToDollarParams(sql: string): string {
521
+ let out = "";
522
+ let n = 0;
523
+ let i = 0;
524
+ while (i < sql.length) {
525
+ const c = sql[i];
526
+ if (c === "?") {
527
+ out += `$${++n}`;
528
+ i += 1;
529
+ } else if (c === "'" || c === '"') {
530
+ // consume the quoted span; a doubled quote is an escape inside it
531
+ const quote = c;
532
+ let j = i + 1;
533
+ while (j < sql.length) {
534
+ if (sql[j] === quote) {
535
+ if (sql[j + 1] === quote) j += 2;
536
+ else break;
537
+ } else {
538
+ j += 1;
539
+ }
540
+ }
541
+ out += sql.slice(i, j + 1);
542
+ i = j + 1;
543
+ } else if (c === "-" && sql[i + 1] === "-") {
544
+ const end = sql.indexOf("\n", i);
545
+ const j = end === -1 ? sql.length : end;
546
+ out += sql.slice(i, j);
547
+ i = j;
548
+ } else if (c === "/" && sql[i + 1] === "*") {
549
+ const end = sql.indexOf("*/", i + 2);
550
+ const j = end === -1 ? sql.length : end + 2;
551
+ out += sql.slice(i, j);
552
+ i = j;
553
+ } else {
554
+ out += c;
555
+ i += 1;
556
+ }
557
+ }
558
+ return out;
559
+ }
560
+
319
561
  export function defineApiQueries<User, Q extends ApiQueries<User>>(queries: Q): Q {
320
562
  return queries;
321
563
  }
@@ -360,9 +602,108 @@ export function queryResultToAst(result: ApiQueryResult): Ast {
360
602
  return result as Ast;
361
603
  }
362
604
 
605
+ /** One exemplar invocation for {@link dumpQueryShapes} — the `args`/`user` a query is built with.
606
+ * Literal values never matter to the dump (shapes are deduped with literals stripped); what an
607
+ * exemplar buys is BRANCH coverage, so supply one per code path a query function can take
608
+ * (an optional filter present/absent, each enum axis, …). */
609
+ export interface ShapeExemplar<User = unknown> {
610
+ args?: unknown;
611
+ user?: User;
612
+ }
613
+
614
+ /** The query-shapes document `rindle indices suggest` consumes: the app's synced tables (name +
615
+ * primary key) and one wire AST per structurally distinct shape a registered query can build. */
616
+ export interface QueryShapesDoc {
617
+ tables: Array<{ name: string; primaryKey: string[] }>;
618
+ queries: Array<{ name: string; ast: Ast }>;
619
+ }
620
+
621
+ /**
622
+ * Dump every registered named query's wire AST — feeder 1 ("exemplar enumeration") of
623
+ * `rindle indices suggest` (docs/INDEXING.md applied mechanically to the query set).
624
+ *
625
+ * Because named queries are FUNCTIONS of `(args, ctx)`, one query can build structurally
626
+ * different ASTs on different args; each exemplar invocation contributes its shape, and shapes
627
+ * that differ only in literal values (a limit, a filter string) dedupe to one entry. A query
628
+ * with no configured exemplars is invoked once with no args. The registry is the app's whole
629
+ * server-side query surface, so the resulting document is the complete static shape set —
630
+ * modulo arg-value-dependent branches, which need an exemplar (or runtime shape recording) to
631
+ * surface.
632
+ */
633
+ export async function dumpQueryShapes<User>(opts: {
634
+ schema: Schema;
635
+ queries: ApiQueries<User>;
636
+ exemplars?: Partial<Record<string, ReadonlyArray<ShapeExemplar<User>>>>;
637
+ }): Promise<QueryShapesDoc> {
638
+ const tables = Object.values(opts.schema.tables)
639
+ // Local-only tables live in the browser's memory source, never a TableSource — no indexes.
640
+ .filter((t) => t.local !== true)
641
+ .map((t) => ({ name: t.name, primaryKey: [...t.primaryKey] }))
642
+ .sort((a, b) => a.name.localeCompare(b.name));
643
+ const queries: QueryShapesDoc["queries"] = [];
644
+ for (const [name, query] of Object.entries(opts.queries).sort(([a], [b]) => a.localeCompare(b))) {
645
+ const seen = new Set<string>();
646
+ for (const ex of opts.exemplars?.[name] ?? [{}]) {
647
+ const ast = queryResultToAst(await query({ user: ex.user as User }, ex.args));
648
+ const key = JSON.stringify(normalizeShape(ast));
649
+ if (seen.has(key)) continue;
650
+ seen.add(key);
651
+ queries.push({ name: seen.size > 1 ? `${name}#${seen.size}` : name, ast });
652
+ }
653
+ }
654
+ return { tables, queries };
655
+ }
656
+
657
+ /** The literal-stripped structure of an AST — the dedupe key for {@link dumpQueryShapes}. */
658
+ function normalizeShape(ast: Ast): Record<string, unknown> {
659
+ return {
660
+ table: ast.table,
661
+ where: ast.where && normalizeCondition(ast.where),
662
+ related: ast.related?.map((r) => ({
663
+ correlation: r.correlation,
664
+ subquery: normalizeShape(r.subquery),
665
+ })),
666
+ orderBy: ast.orderBy,
667
+ limit: ast.limit !== undefined,
668
+ start: ast.start
669
+ ? { keys: Object.keys(ast.start.row).sort(), exclusive: ast.start.exclusive }
670
+ : undefined,
671
+ aggregate: ast.aggregate,
672
+ groupBy: ast.groupBy,
673
+ having: ast.having && normalizeCondition(ast.having),
674
+ one: ast.one,
675
+ };
676
+ }
677
+
678
+ function normalizeCondition(c: Condition): unknown {
679
+ switch (c.type) {
680
+ case "simple":
681
+ return {
682
+ type: c.type,
683
+ op: c.op,
684
+ left: c.left,
685
+ right: c.right.type === "literal" ? { type: "literal" } : c.right,
686
+ };
687
+ case "and":
688
+ case "or":
689
+ return { type: c.type, conditions: c.conditions.map(normalizeCondition) };
690
+ case "correlatedSubquery":
691
+ return {
692
+ type: c.type,
693
+ op: c.op,
694
+ related: {
695
+ correlation: c.related.correlation,
696
+ subquery: normalizeShape(c.related.subquery),
697
+ },
698
+ };
699
+ }
700
+ }
701
+
363
702
  export function createRindleApiServer<User = unknown>(opts: RindleApiServerOptions<User>): RindleApiServer<User> {
364
703
  const routes = { ...DEFAULT_RINDLE_API_ROUTES, ...opts.routes };
365
704
  const mode = opts.mode ?? "normalized";
705
+ // The mutation seam — defaulting to the daemon's co-transactional lmid stamp (unchanged behavior).
706
+ const backend = opts.backend ?? daemonBackend(opts.daemon);
366
707
  // Names that are ALSO configured pins — a lease for one is forced to a `pinned` policy (the lazy
367
708
  // floor, §4.1) so the first viewer to route to a follower warms it for late joiners.
368
709
  const pinnedNames = new Set((opts.pinnedQueries ?? []).map((p) => p.name));
@@ -436,7 +777,7 @@ export function createRindleApiServer<User = unknown>(opts: RindleApiServerOptio
436
777
  const pushMutation = async (input: PushMutationRequest<User>): Promise<PushMutationResponse> => {
437
778
  const context: ApiContext<User> = { user: input.user, request: input.request };
438
779
  const mutator = opts.mutators?.[input.envelope.name];
439
- if (!mutator) return reject(opts.daemon, input.envelope, `unknown mutator: ${input.envelope.name}`);
780
+ if (!mutator) return reject(backend, input.envelope, `unknown mutator: ${input.envelope.name}`);
440
781
  let sql: Pick<SqlTxn, "statements" | "idempotencyKey">;
441
782
  try {
442
783
  await assertAuthorized(opts.authorizeMutation, {
@@ -453,12 +794,12 @@ export function createRindleApiServer<User = unknown>(opts: RindleApiServerOptio
453
794
  });
454
795
  sql = mutationResultToSqlTxn(result, tx);
455
796
  } catch (err) {
456
- return reject(opts.daemon, input.envelope, String((err as Error)?.message ?? err));
797
+ return reject(backend, input.envelope, String((err as Error)?.message ?? err));
457
798
  }
458
- const output = await opts.daemon.executeSqlTxn({
459
- ...sql,
460
- clientID: input.envelope.clientID,
461
- mid: input.envelope.mid,
799
+ const output = await backend.apply({
800
+ envelope: input.envelope,
801
+ statements: sql.statements,
802
+ idempotencyKey: sql.idempotencyKey,
462
803
  });
463
804
  return { accepted: true, rejected: false, output };
464
805
  };
@@ -518,6 +859,30 @@ export function createRindleApiServer<User = unknown>(opts: RindleApiServerOptio
518
859
  }
519
860
  };
520
861
 
862
+ // The room write-authority gate (§5.3.1): endpoints are disabled until the app
863
+ // opts in with `authorizeRoom` — hosting an authority is never a default.
864
+ const roomGate = async (context: ApiContext<User>): Promise<void> => {
865
+ if (!opts.authorizeRoom) {
866
+ throw new RindleApiError("forbidden", "room authority not configured", 403);
867
+ }
868
+ await assertAuthorized(opts.authorizeRoom, context);
869
+ };
870
+
871
+ // The store's verdict rides specific statuses + body shapes (fence / conflict /
872
+ // identity) the room decodes — pass a daemon HTTP error through VERBATIM.
873
+ const daemonVerdict = (e: unknown): RoomHostResponse => {
874
+ if (e instanceof DaemonHttpError) {
875
+ let body: unknown;
876
+ try {
877
+ body = JSON.parse(e.body);
878
+ } catch {
879
+ body = { error: e.body };
880
+ }
881
+ return { status: e.status, body };
882
+ }
883
+ throw e;
884
+ };
885
+
521
886
  return {
522
887
  routes,
523
888
  createQueryLease,
@@ -525,6 +890,46 @@ export function createRindleApiServer<User = unknown>(opts: RindleApiServerOptio
525
890
  assertPins,
526
891
  pushMutation,
527
892
  pushMutations,
893
+ handleApplyRowChangeTxnJson: async (body, context) => {
894
+ await roomGate(context);
895
+ const msg = parseObject(body, "row-change txn");
896
+ try {
897
+ const out = await opts.daemon.applyRowChangeTxn(msg as unknown as RowChangeTxn);
898
+ return { status: 200, body: out };
899
+ } catch (e) {
900
+ return daemonVerdict(e);
901
+ }
902
+ },
903
+ handleClaimRoomEpochJson: async (body, context) => {
904
+ await roomGate(context);
905
+ const msg = parseObject(body, "claim-room-epoch request");
906
+ const doc = parseString(msg.doc, "doc");
907
+ const claim = opts.daemon.claimRoomEpoch?.bind(opts.daemon);
908
+ if (!claim) {
909
+ throw new Error("the configured daemon client does not implement claimRoomEpoch");
910
+ }
911
+ try {
912
+ return { status: 200, body: await claim({ doc }) };
913
+ } catch (e) {
914
+ return daemonVerdict(e);
915
+ }
916
+ },
917
+ handleRoomLmidsJson: async (body, context) => {
918
+ await roomGate(context);
919
+ const msg = parseObject(body, "room-lmids request");
920
+ if (!Array.isArray(msg.clients) || msg.clients.some((c) => typeof c !== "string")) {
921
+ throw new RindleApiError("bad-request", "clients must be an array of strings", 400);
922
+ }
923
+ const lmids = opts.daemon.roomLmids?.bind(opts.daemon);
924
+ if (!lmids) {
925
+ throw new Error("the configured daemon client does not implement roomLmids");
926
+ }
927
+ try {
928
+ return { status: 200, body: await lmids({ clients: msg.clients as string[] }) };
929
+ } catch (e) {
930
+ return daemonVerdict(e);
931
+ }
932
+ },
528
933
  handleQueryJson: (body, context) => {
529
934
  const msg = parseObject(body, "query request");
530
935
  return createQueryLease({
@@ -629,11 +1034,11 @@ function errMessage(reason: unknown): string {
629
1034
  }
630
1035
 
631
1036
  async function reject(
632
- daemon: RindleDaemonClient,
1037
+ backend: MutationBackend,
633
1038
  envelope: MutationEnvelope,
634
1039
  reason: string,
635
1040
  ): Promise<PushMutationResponse> {
636
- const output = await daemon.rejectMutation({ clientID: envelope.clientID, mid: envelope.mid, reason });
1041
+ const output = await backend.reject({ envelope, reason });
637
1042
  return { accepted: false, rejected: true, reason, output };
638
1043
  }
639
1044