@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 +160 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +305 -8
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +414 -9
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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(
|
|
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(
|
|
435
|
+
return reject(backend, input.envelope, String(err?.message ?? err));
|
|
205
436
|
}
|
|
206
|
-
const output = await
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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(
|
|
368
|
-
const output = await
|
|
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.
|
|
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.
|
|
29
|
-
"@rindle/daemon-client": "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(
|
|
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(
|
|
797
|
+
return reject(backend, input.envelope, String((err as Error)?.message ?? err));
|
|
457
798
|
}
|
|
458
|
-
const output = await
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
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
|
-
|
|
1037
|
+
backend: MutationBackend,
|
|
633
1038
|
envelope: MutationEnvelope,
|
|
634
1039
|
reason: string,
|
|
635
1040
|
): Promise<PushMutationResponse> {
|
|
636
|
-
const output = await
|
|
1041
|
+
const output = await backend.reject({ envelope, reason });
|
|
637
1042
|
return { accepted: false, rejected: true, reason, output };
|
|
638
1043
|
}
|
|
639
1044
|
|