@rindle/api-server 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -60
- package/dist/index.d.ts +90 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +225 -12
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +328 -13
package/README.md
CHANGED
|
@@ -1,73 +1,44 @@
|
|
|
1
1
|
# @rindle/api-server
|
|
2
2
|
|
|
3
|
-
Framework-neutral helpers for
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
- `POST /api/rindle/mutate`
|
|
10
|
-
|
|
11
|
-
`read` is the one-shot read path (`handleReadJson`): it parses a default `{ name, args }` body and
|
|
12
|
-
runs the query once for a server-rendered/SSR read, holding a short-lived lease (`readIdleTtlMs`)
|
|
13
|
-
unless the browser's follow-up `subscribe` lands first. `query` mints the subscription lease and
|
|
14
|
-
`mutate` runs named mutators.
|
|
15
|
-
|
|
16
|
-
The API server remains the application authority. It authenticates requests, optionally runs the
|
|
17
|
-
SDK authorizer hooks, resolves named queries to ASTs, and runs named mutators. The daemon only sees
|
|
18
|
-
approved ASTs and approved write/rejection records.
|
|
19
|
-
|
|
20
|
-
A query is defined **once** with `defineQuery` (in `@rindle/client`), co-located with the component
|
|
21
|
-
that reads it, and the same value is registered here. `registerQueries` turns the list of those
|
|
22
|
-
co-located queries into the server's query surface — it re-runs each query's validator on the
|
|
23
|
-
untrusted wire args and builds the authoritative AST, so client and server resolve a byte-identical
|
|
24
|
-
query:
|
|
3
|
+
Framework-neutral helpers for your app's **authority tier** in a daemon-backed Rindle
|
|
4
|
+
deployment. Stateless and transport-agnostic: it authenticates the caller, resolves
|
|
5
|
+
**named queries** to approved ASTs, and drives the **same isomorphic mutators** the
|
|
6
|
+
browser predicted — rendering their logical ops to SQL against the daemon's private
|
|
7
|
+
control plane. The daemon only ever sees approved ASTs and approved write/rejection
|
|
8
|
+
records.
|
|
25
9
|
|
|
26
10
|
```ts
|
|
27
|
-
import { createRindleApiServer, registerQueries,
|
|
11
|
+
import { createRindleApiServer, registerQueries, sharedApiMutators } from "@rindle/api-server";
|
|
28
12
|
import { HttpRindleDaemonClient } from "@rindle/daemon-client";
|
|
29
|
-
import { issuesPageQuery
|
|
13
|
+
import { issuesPageQuery } from "./src/IssueList.queries.ts";
|
|
14
|
+
import { mutators, schema } from "./shared/app-def.ts";
|
|
15
|
+
|
|
16
|
+
// The authenticated principal a shared mutator body sees as ctx.user (never a client arg):
|
|
17
|
+
const sharedCtx = (ctx) => {
|
|
18
|
+
if (!ctx.user) throw new Error("unauthenticated");
|
|
19
|
+
return { user: ctx.user };
|
|
20
|
+
};
|
|
30
21
|
|
|
31
|
-
const
|
|
32
|
-
daemon: new HttpRindleDaemonClient({
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
createIssue: (tx, args) => {
|
|
36
|
-
tx.exec("INSERT INTO issue (id, title) VALUES (?, ?)", [args.id, args.title]);
|
|
37
|
-
},
|
|
22
|
+
const api = createRindleApiServer({
|
|
23
|
+
daemon: new HttpRindleDaemonClient({
|
|
24
|
+
baseUrl: "http://127.0.0.1:7600",
|
|
25
|
+
headers: { authorization: `Bearer ${process.env.RINDLE_DAEMON_TOKEN}` },
|
|
38
26
|
}),
|
|
27
|
+
schema, // drives the SQL renderer for the yielded ops
|
|
28
|
+
queries: registerQueries([issuesPageQuery]), // the co-located defineQuery values, listed
|
|
29
|
+
mutators: sharedApiMutators(mutators, sharedCtx), // the SAME bodies the browser predicts
|
|
39
30
|
authorizeQuery: ({ user }) => Boolean(user),
|
|
40
31
|
authorizeMutation: ({ user }) => Boolean(user),
|
|
41
32
|
});
|
|
33
|
+
// You own the HTTP: mount api.handleQueryJson / handleReadJson / handleMutateJson
|
|
34
|
+
// on api.routes ({ query: "/api/rindle/query", read: "/api/rindle/read", mutate: "/api/rindle/mutate" }).
|
|
42
35
|
```
|
|
43
36
|
|
|
44
|
-
|
|
45
|
-
context-scoped query's ctx, so a per-principal query (e.g. "my issues") is built from the server's
|
|
46
|
-
trusted identity — never a client-supplied arg.
|
|
47
|
-
|
|
48
|
-
When the server must **diverge** from the client — add a tenancy/auth filter the client can't see —
|
|
49
|
-
use `defineApiQueries`, which maps a name directly to a `(ctx, args)` resolver. Register a
|
|
50
|
-
server-specific query under the same name and it wins (both are plain `{ name → resolver }` maps, so
|
|
51
|
-
spread them together):
|
|
52
|
-
|
|
53
|
-
```ts
|
|
54
|
-
import { defineApiQueries, registerQueries } from "@rindle/api-server";
|
|
55
|
-
|
|
56
|
-
const queries = {
|
|
57
|
-
...registerQueries([issuesPageQuery, myIssuesQuery]),
|
|
58
|
-
...defineApiQueries({
|
|
59
|
-
// SAME name as the client's issuesPage — the later spread wins, so this server-only resolver
|
|
60
|
-
// overrides it and adds a tenancy filter (the `where`) the client's query never carries.
|
|
61
|
-
issuesPage: (ctx, _args) => q.issue.where.tenantId(ctx.user).orderBy("id", "asc"),
|
|
62
|
-
}),
|
|
63
|
-
};
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
There is no scope key. If two requests resolve to the same canonical AST, the daemon may dedupe
|
|
67
|
-
them because the result is the same. If tenant or user visibility matters, encode it into the AST.
|
|
37
|
+
## Docs
|
|
68
38
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
39
|
+
Full docs — named queries & server-only divergence, driving the shared mutators, the
|
|
40
|
+
two rejection shapes, pinned queries & the one-shot read, and bring-your-own-HTTP:
|
|
41
|
+
**[rindle.sh/docs/api-server](https://rindle.sh/docs/api-server)** · markdown mirror:
|
|
42
|
+
[`api-server.md`](https://rindle.sh/docs/api-server.md) · the mutator contract:
|
|
43
|
+
[rindle.sh/docs/mutators](https://rindle.sh/docs/mutators) · for agents:
|
|
44
|
+
[llms.txt](https://rindle.sh/llms.txt)
|
package/dist/index.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export declare const DEFAULT_RINDLE_API_ROUTES: {
|
|
|
9
9
|
readonly applyRowChangeTxn: "/api/rindle/apply-row-change-txn";
|
|
10
10
|
readonly claimRoomEpoch: "/api/rindle/claim-room-epoch";
|
|
11
11
|
readonly roomLmids: "/api/rindle/room-lmids";
|
|
12
|
+
readonly roomBoot: "/api/rindle/room-boot";
|
|
12
13
|
};
|
|
13
14
|
export type MaybePromise<T> = T | PromiseLike<T>;
|
|
14
15
|
export interface ApiContext<User> {
|
|
@@ -192,6 +193,7 @@ export interface RindleApiRoutes {
|
|
|
192
193
|
applyRowChangeTxn: string;
|
|
193
194
|
claimRoomEpoch: string;
|
|
194
195
|
roomLmids: string;
|
|
196
|
+
roomBoot: string;
|
|
195
197
|
}
|
|
196
198
|
/** A room-host reply the transport writes VERBATIM (`status` + JSON `body`): the
|
|
197
199
|
* daemon's fence/conflict/identity semantics ride specific statuses and body shapes
|
|
@@ -213,6 +215,79 @@ export interface PinnedQuery {
|
|
|
213
215
|
export interface PinFanout {
|
|
214
216
|
assertPins(pins: readonly MaterializeInput[]): Promise<void>;
|
|
215
217
|
}
|
|
218
|
+
/** The room-boot flush leg (enablement §5): where the placed room's write-behind lands and what
|
|
219
|
+
* credential it presents. `urls` are the trio's ROUTE PATHS (root-relative — the shell resolves
|
|
220
|
+
* them against the boot call's origin), so an app that overrides `routes` needs no out-of-band
|
|
221
|
+
* sync; `headers` ride every flush call verbatim (`httpAuthority`'s `headers`). */
|
|
222
|
+
export interface RoomBootFlush {
|
|
223
|
+
urls: {
|
|
224
|
+
apply: string;
|
|
225
|
+
claim: string;
|
|
226
|
+
lmids: string;
|
|
227
|
+
};
|
|
228
|
+
headers: Record<string, string>;
|
|
229
|
+
}
|
|
230
|
+
/** The `/room-boot` response (RINDLE-REALTIME-DESIGN.md §10.1 — the DO shell's cold-boot
|
|
231
|
+
* callback): the claimed placement epoch, the room's upstream footprint lease, and the flush
|
|
232
|
+
* leg. A cold room boots inert and serves nothing until this returns. */
|
|
233
|
+
export interface RoomBootResponse {
|
|
234
|
+
epoch: number;
|
|
235
|
+
upstreamLeaseToken: string;
|
|
236
|
+
/** Where the room opens its upstream subscription (a routed deploy's follower). Absent ⇒ the
|
|
237
|
+
* shell's statically configured rindled ws endpoint. */
|
|
238
|
+
upstreamWsEndpoint?: string;
|
|
239
|
+
flush: RoomBootFlush;
|
|
240
|
+
}
|
|
241
|
+
export interface RindleRealtimeOptions<User> {
|
|
242
|
+
/** The boot shell secret (§10.1 — a host binding, never client-derived). Authenticates the
|
|
243
|
+
* room's `Authorization: Bearer` on `/room-boot` (the default {@link authorizeBoot}) and keys
|
|
244
|
+
* the DEFAULT epoch-bound flush credential. */
|
|
245
|
+
shellSecret: string;
|
|
246
|
+
/** doc → the room's approved upstream footprint (§3.1) — an `Ast` or fluent `Query`. MAY
|
|
247
|
+
* delegate to the named-query registry internally; throw `RindleApiError("not-found", …, 404)`
|
|
248
|
+
* for a doc that shouldn't exist. The §9 footprint budget belongs here — it runs once per
|
|
249
|
+
* placement, at lease mint. */
|
|
250
|
+
resolveFootprint: (doc: string, ctx: ApiContext<User>) => MaybePromise<ApiQueryResult>;
|
|
251
|
+
/** Gates the flush trio — `authorizeRoom`, relocated. Default: verify the default flush
|
|
252
|
+
* credential from the {@link ROOM_FLUSH_CREDENTIAL_HEADER} request header — which requires the
|
|
253
|
+
* transport to pass its incoming request as `context.request` (Fetch `Request` and node
|
|
254
|
+
* `IncomingMessage` shapes are both understood). */
|
|
255
|
+
authorize?: Authorizer<ApiContext<User>>;
|
|
256
|
+
/** Gates `/room-boot`. Default: constant-time `Authorization: Bearer` check against
|
|
257
|
+
* {@link shellSecret} (same `context.request` requirement as {@link authorize}). */
|
|
258
|
+
authorizeBoot?: Authorizer<ApiContext<User>>;
|
|
259
|
+
/** Mint the flush headers a placed room presents on every flush call. Default:
|
|
260
|
+
* {@link mintRoomFlushCredential} under {@link ROOM_FLUSH_CREDENTIAL_HEADER}. Override this
|
|
261
|
+
* and {@link authorize} TOGETHER — they are the two ends of one credential. */
|
|
262
|
+
mintFlushHeaders?: (input: {
|
|
263
|
+
doc: string;
|
|
264
|
+
epoch: number;
|
|
265
|
+
}) => MaybePromise<Record<string, string>>;
|
|
266
|
+
/** Lease TTL for the room's upstream footprint materialization (defaults to the server-wide
|
|
267
|
+
* `leaseTtlMs`, else the daemon's default). */
|
|
268
|
+
upstreamLeaseTtlMs?: number;
|
|
269
|
+
/** Static override for where rooms open their upstream subscription; default is the
|
|
270
|
+
* `wsEndpoint` the materialize returns (set in routed deploys), else absent. */
|
|
271
|
+
upstreamWsEndpoint?: string;
|
|
272
|
+
}
|
|
273
|
+
export declare const ROOM_FLUSH_CREDENTIAL_HEADER = "x-rindle-room-credential";
|
|
274
|
+
export interface RoomFlushCredentialPayload {
|
|
275
|
+
v: 1;
|
|
276
|
+
doc: string;
|
|
277
|
+
epoch: number;
|
|
278
|
+
iat: number;
|
|
279
|
+
}
|
|
280
|
+
/** Sign the default epoch-bound flush credential (`/room-boot` mints one per placement). */
|
|
281
|
+
export declare function mintRoomFlushCredential(opts: {
|
|
282
|
+
shellSecret: string;
|
|
283
|
+
doc: string;
|
|
284
|
+
epoch: number;
|
|
285
|
+
/** Mint time; defaults to `Date.now()`. Injectable for tests. */
|
|
286
|
+
now?: number;
|
|
287
|
+
}): Promise<string>;
|
|
288
|
+
/** Verify a flush credential's MAC, then its claims; returns the payload or throws. The MAC is
|
|
289
|
+
* checked FIRST — no claim is trusted before it passes. */
|
|
290
|
+
export declare function verifyRoomFlushCredential(credential: string, shellSecret: string): Promise<RoomFlushCredentialPayload>;
|
|
216
291
|
export interface RindleApiServerOptions<User> {
|
|
217
292
|
daemon: RindleDaemonClient;
|
|
218
293
|
/** Where mutations are applied and `lmid` is stamped ({@link MutationBackend}). Default:
|
|
@@ -229,10 +304,16 @@ export interface RindleApiServerOptions<User> {
|
|
|
229
304
|
mutators?: ApiMutators<User>;
|
|
230
305
|
authorizeQuery?: Authorizer<AuthorizeQueryInput<User>>;
|
|
231
306
|
authorizeMutation?: Authorizer<AuthorizeMutationInput<User>>;
|
|
307
|
+
/** Rindle Realtime (RINDLE-REALTIME-ENABLEMENT-DESIGN.md §3.1): the ONE named opt-in.
|
|
308
|
+
* Presence activates the room flush trio AND `/room-boot`; absence keeps every room
|
|
309
|
+
* endpoint 403. Takes precedence over the deprecated {@link authorizeRoom}. */
|
|
310
|
+
realtime?: RindleRealtimeOptions<User>;
|
|
232
311
|
/** The room write-authority gate (§5.3.1): validates the caller is a placed room —
|
|
233
312
|
* the epoch-bound flush credential rides `context.request`, and what it means is
|
|
234
313
|
* the app's to define. The room endpoints are DISABLED (403) until this is set:
|
|
235
|
-
* hosting a write authority is an explicit opt-in, never a default.
|
|
314
|
+
* hosting a write authority is an explicit opt-in, never a default.
|
|
315
|
+
* @deprecated Use {@link realtime} (its `authorize`) — this bare form gates the
|
|
316
|
+
* flush trio but never activates `/room-boot`. When both are set, `realtime` wins. */
|
|
236
317
|
authorizeRoom?: Authorizer<ApiContext<User>>;
|
|
237
318
|
routes?: Partial<RindleApiRoutes>;
|
|
238
319
|
mode?: StreamMode;
|
|
@@ -305,6 +386,10 @@ export interface RindleApiServer<User> {
|
|
|
305
386
|
handleClaimRoomEpochJson(body: unknown, context: ApiContext<User>): Promise<RoomHostResponse>;
|
|
306
387
|
/** The room's boot probe (§3.3), same gate + envelope. */
|
|
307
388
|
handleRoomLmidsJson(body: unknown, context: ApiContext<User>): Promise<RoomHostResponse>;
|
|
389
|
+
/** The DO shell's cold-boot callback (§10.1; enablement §3.1): authenticate the shell
|
|
390
|
+
* secret, resolve the doc's footprint, claim the placement epoch, mint the upstream
|
|
391
|
+
* lease and the flush leg. 403 until {@link RindleApiServerOptions.realtime} is set. */
|
|
392
|
+
handleRoomBootJson(body: unknown, context: ApiContext<User>): Promise<RoomHostResponse>;
|
|
308
393
|
}
|
|
309
394
|
export type RindleApiErrorCode = "bad-request" | "forbidden" | "not-found" | "rejected";
|
|
310
395
|
export declare class RindleApiError extends Error {
|
|
@@ -367,6 +452,10 @@ export interface TableRenderMeta {
|
|
|
367
452
|
pkNames: string[];
|
|
368
453
|
/** Column name → declared type (only consulted by {@link SqlDialect.encodeValue}). */
|
|
369
454
|
types: Record<string, ColType>;
|
|
455
|
+
/** Columns a full insert must name — the non-nullable ones (design 206 §6.2). */
|
|
456
|
+
required: string[];
|
|
457
|
+
/** The nullable (omittable-to-null) columns — an omitted one binds `NULL` (design 206 §6.2). */
|
|
458
|
+
nullable: ReadonlySet<string>;
|
|
370
459
|
}
|
|
371
460
|
export type RenderIndex = Record<string, TableRenderMeta>;
|
|
372
461
|
/** Build the {@link RenderIndex} from a typed schema (`schema.tables[name]` is a `TableMeta`). */
|
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,4 +1,4 @@
|
|
|
1
|
-
import { driveMutationAsync, isoTx } from "@rindle/client";
|
|
1
|
+
import { driveMutationAsync, insertCell, insertPlan, isoTx, toCell } from "@rindle/client";
|
|
2
2
|
import { DaemonHttpError } from "@rindle/daemon-client";
|
|
3
3
|
import { compile as compileQueryAst } from "@rindle/query-compiler";
|
|
4
4
|
// Re-export the shared (generator) mutator seam so an app builds its server mutators from ONE import:
|
|
@@ -14,7 +14,79 @@ export const DEFAULT_RINDLE_API_ROUTES = {
|
|
|
14
14
|
applyRowChangeTxn: "/api/rindle/apply-row-change-txn",
|
|
15
15
|
claimRoomEpoch: "/api/rindle/claim-room-epoch",
|
|
16
16
|
roomLmids: "/api/rindle/room-lmids",
|
|
17
|
+
// The DO shell's cold-boot callback (§10.1) — active only when `realtime` is configured.
|
|
18
|
+
roomBoot: "/api/rindle/room-boot",
|
|
17
19
|
};
|
|
20
|
+
// The DEFAULT flush credential: `rfc1.<b64url payload>.<b64url hmac-sha256>`, payload
|
|
21
|
+
// `{v:1, doc, epoch, iat}`. Deliberately EPOCH-bound, not time-bound: the credential's lifecycle
|
|
22
|
+
// IS the placement fence (§8.3 — a superseded epoch's flushes 409 at the store no matter what
|
|
23
|
+
// credential they carry), and platform revocation is registry suspension, so an `exp` would only
|
|
24
|
+
// force spurious re-boots of long-lived rooms. HMAC via WebCrypto (`crypto.subtle`) so the exact
|
|
25
|
+
// same code runs in Node and a Cloudflare Worker — no `node:crypto` import (matching
|
|
26
|
+
// `@rindle/room`'s token module).
|
|
27
|
+
export const ROOM_FLUSH_CREDENTIAL_HEADER = "x-rindle-room-credential";
|
|
28
|
+
const FLUSH_CREDENTIAL_PREFIX = "rfc1";
|
|
29
|
+
function b64url(bytes) {
|
|
30
|
+
let bin = "";
|
|
31
|
+
for (const b of bytes)
|
|
32
|
+
bin += String.fromCharCode(b);
|
|
33
|
+
return btoa(bin).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
34
|
+
}
|
|
35
|
+
// Return type inferred (`Uint8Array<ArrayBuffer>` under TS ≥5.7 libs) — an explicit
|
|
36
|
+
// `Uint8Array` annotation widens to `ArrayBufferLike` and fails `crypto.subtle`'s
|
|
37
|
+
// `BufferSource` under consumers compiling this source with newer lib types.
|
|
38
|
+
function unb64url(s) {
|
|
39
|
+
const bin = atob(s.replace(/-/g, "+").replace(/_/g, "/"));
|
|
40
|
+
const out = new Uint8Array(bin.length);
|
|
41
|
+
for (let i = 0; i < bin.length; i++)
|
|
42
|
+
out[i] = bin.charCodeAt(i);
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
async function flushHmacKey(secret, usage) {
|
|
46
|
+
return crypto.subtle.importKey("raw", new TextEncoder().encode(secret), { name: "HMAC", hash: "SHA-256" }, false, [usage]);
|
|
47
|
+
}
|
|
48
|
+
/** Sign the default epoch-bound flush credential (`/room-boot` mints one per placement). */
|
|
49
|
+
export async function mintRoomFlushCredential(opts) {
|
|
50
|
+
const payload = {
|
|
51
|
+
v: 1,
|
|
52
|
+
doc: opts.doc,
|
|
53
|
+
epoch: opts.epoch,
|
|
54
|
+
iat: opts.now ?? Date.now(),
|
|
55
|
+
};
|
|
56
|
+
const body = b64url(new TextEncoder().encode(JSON.stringify(payload)));
|
|
57
|
+
const signed = `${FLUSH_CREDENTIAL_PREFIX}.${body}`;
|
|
58
|
+
const key = await flushHmacKey(opts.shellSecret, "sign");
|
|
59
|
+
const sig = new Uint8Array(await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(signed)));
|
|
60
|
+
return `${signed}.${b64url(sig)}`;
|
|
61
|
+
}
|
|
62
|
+
/** Verify a flush credential's MAC, then its claims; returns the payload or throws. The MAC is
|
|
63
|
+
* checked FIRST — no claim is trusted before it passes. */
|
|
64
|
+
export async function verifyRoomFlushCredential(credential, shellSecret) {
|
|
65
|
+
const parts = credential.split(".");
|
|
66
|
+
if (parts.length !== 3 || parts[0] !== FLUSH_CREDENTIAL_PREFIX) {
|
|
67
|
+
throw new Error("not a room flush credential");
|
|
68
|
+
}
|
|
69
|
+
const [, body, sig] = parts;
|
|
70
|
+
const key = await flushHmacKey(shellSecret, "verify");
|
|
71
|
+
const ok = await crypto.subtle.verify("HMAC", key, unb64url(sig), new TextEncoder().encode(`${FLUSH_CREDENTIAL_PREFIX}.${body}`));
|
|
72
|
+
if (!ok)
|
|
73
|
+
throw new Error("bad signature");
|
|
74
|
+
let payload;
|
|
75
|
+
try {
|
|
76
|
+
payload = JSON.parse(new TextDecoder().decode(unb64url(body)));
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
throw new Error("malformed payload");
|
|
80
|
+
}
|
|
81
|
+
if (payload.v !== 1)
|
|
82
|
+
throw new Error("unknown version");
|
|
83
|
+
if (typeof payload.doc !== "string" || payload.doc.length === 0) {
|
|
84
|
+
throw new Error("missing doc");
|
|
85
|
+
}
|
|
86
|
+
if (typeof payload.epoch !== "number")
|
|
87
|
+
throw new Error("missing epoch");
|
|
88
|
+
return payload;
|
|
89
|
+
}
|
|
18
90
|
export class RindleApiError extends Error {
|
|
19
91
|
code;
|
|
20
92
|
status;
|
|
@@ -136,7 +208,10 @@ export function buildRenderIndex(schema) {
|
|
|
136
208
|
const types = {};
|
|
137
209
|
for (const c of columns)
|
|
138
210
|
types[c] = meta.columns[c].type;
|
|
139
|
-
|
|
211
|
+
// Same schema-derived plan the client funnel uses (design 206 §6.1), so their required-sets
|
|
212
|
+
// and null-fills can't drift.
|
|
213
|
+
const { required, nullable } = insertPlan(schema.tables[name]);
|
|
214
|
+
out[name] = { columns, pkNames: [...meta.primaryKey], types, required, nullable };
|
|
140
215
|
}
|
|
141
216
|
return out;
|
|
142
217
|
}
|
|
@@ -150,14 +225,15 @@ function tableMeta(render, table) {
|
|
|
150
225
|
return meta;
|
|
151
226
|
}
|
|
152
227
|
/** Validate a keyed row against a table: reject unknown columns; require the pk columns; with
|
|
153
|
-
* `full`, require
|
|
154
|
-
* client `trackingTx.checkColumns` messages so an author sees
|
|
228
|
+
* `full`, require every NON-nullable column (a nullable column may be omitted and is filled with
|
|
229
|
+
* `NULL`, design 206 §6.2). Mirrors the client `trackingTx.checkColumns` messages so an author sees
|
|
230
|
+
* the same error on both tiers. */
|
|
155
231
|
function checkColumns(table, obj, meta, full) {
|
|
156
232
|
const unknown = Object.keys(obj).filter((k) => !meta.columns.includes(k));
|
|
157
233
|
if (unknown.length) {
|
|
158
234
|
throw new Error(`unknown column${unknown.length > 1 ? "s" : ""} ${unknown.join(", ")} on ${table} — columns: ${meta.columns.join(", ")}`);
|
|
159
235
|
}
|
|
160
|
-
const required = full ? meta.
|
|
236
|
+
const required = full ? meta.required : meta.pkNames;
|
|
161
237
|
const missing = required.filter((c) => !(c in obj));
|
|
162
238
|
if (missing.length) {
|
|
163
239
|
throw new Error(`missing ${full ? "column" : "primary-key column"}${missing.length > 1 ? "s" : ""} ${missing.join(", ")} on ${table}`);
|
|
@@ -170,8 +246,12 @@ export function renderOp(op, meta, dialect) {
|
|
|
170
246
|
const t = quoteIdent(op.table);
|
|
171
247
|
const params = [];
|
|
172
248
|
// Bind a value and return its placeholder at the correct 1-based index (post-push length).
|
|
249
|
+
// `insertCell` fills NULL for an omitted nullable column on the insert arm (design 206 §6.2);
|
|
250
|
+
// on update/delete every bound column is guaranteed present, so it is a pass-through there.
|
|
251
|
+
// `toCell` stringifies a `json` object (a typed mutator passes the parsed object) — a string
|
|
252
|
+
// passes through, so an author may still pass pre-stringified json.
|
|
173
253
|
const bind = (c, row) => {
|
|
174
|
-
params.push(encode(dialect, row[c], meta.types[c]));
|
|
254
|
+
params.push(encode(dialect, toCell(insertCell(row, c), meta.types[c]), meta.types[c]));
|
|
175
255
|
return dialect.placeholder(params.length);
|
|
176
256
|
};
|
|
177
257
|
if (op.kind === "insert" || op.kind === "insertIgnore" || op.kind === "upsert") {
|
|
@@ -826,8 +906,9 @@ export function queryResultToAst(result) {
|
|
|
826
906
|
*/
|
|
827
907
|
export async function dumpQueryShapes(opts) {
|
|
828
908
|
const tables = Object.values(opts.schema.tables)
|
|
829
|
-
// Local-only tables live in the browser's memory source,
|
|
830
|
-
|
|
909
|
+
// Local-only tables (both `true` and `"session"`) live in the browser's memory source,
|
|
910
|
+
// never a TableSource — no indexes.
|
|
911
|
+
.filter((t) => !t.local)
|
|
831
912
|
.map((t) => ({ name: t.name, primaryKey: [...t.primaryKey] }))
|
|
832
913
|
.sort((a, b) => a.name.localeCompare(b.name));
|
|
833
914
|
const queries = [];
|
|
@@ -1056,13 +1137,18 @@ export function createRindleApiServer(opts) {
|
|
|
1056
1137
|
throw new Error(`assertPins: ${failures.length} failed — ${failures.join("; ")}`);
|
|
1057
1138
|
}
|
|
1058
1139
|
};
|
|
1059
|
-
// The room write-authority gate (§5.3.1): endpoints are disabled until the app
|
|
1060
|
-
//
|
|
1140
|
+
// The room write-authority gate (§5.3.1): endpoints are disabled until the app opts in —
|
|
1141
|
+
// the `realtime` block (which also activates `/room-boot`) or the deprecated bare
|
|
1142
|
+
// `authorizeRoom` (trio only). Hosting an authority is never a default.
|
|
1143
|
+
const realtime = opts.realtime;
|
|
1144
|
+
const roomAuthorizer = realtime
|
|
1145
|
+
? (realtime.authorize ?? defaultFlushGate(realtime.shellSecret))
|
|
1146
|
+
: opts.authorizeRoom;
|
|
1061
1147
|
const roomGate = async (context) => {
|
|
1062
|
-
if (!
|
|
1148
|
+
if (!roomAuthorizer) {
|
|
1063
1149
|
throw new RindleApiError("forbidden", "room authority not configured", 403);
|
|
1064
1150
|
}
|
|
1065
|
-
await assertAuthorized(
|
|
1151
|
+
await assertAuthorized(roomAuthorizer, context);
|
|
1066
1152
|
};
|
|
1067
1153
|
// The store's verdict rides specific statuses + body shapes (fence / conflict /
|
|
1068
1154
|
// identity) the room decodes — pass a daemon HTTP error through VERBATIM.
|
|
@@ -1129,6 +1215,61 @@ export function createRindleApiServer(opts) {
|
|
|
1129
1215
|
return daemonVerdict(e);
|
|
1130
1216
|
}
|
|
1131
1217
|
},
|
|
1218
|
+
handleRoomBootJson: async (body, context) => {
|
|
1219
|
+
if (!realtime) {
|
|
1220
|
+
throw new RindleApiError("forbidden", "realtime not configured", 403);
|
|
1221
|
+
}
|
|
1222
|
+
await assertAuthorized(realtime.authorizeBoot ?? defaultBootGate(realtime.shellSecret), context);
|
|
1223
|
+
const msg = parseObject(body, "room-boot request");
|
|
1224
|
+
const doc = parseString(msg.doc, "doc");
|
|
1225
|
+
if (msg.instance !== undefined)
|
|
1226
|
+
parseString(msg.instance, "instance"); // diagnostic identity only
|
|
1227
|
+
const ast = queryResultToAst(await realtime.resolveFootprint(doc, context));
|
|
1228
|
+
const claim = opts.daemon.claimRoomEpoch?.bind(opts.daemon);
|
|
1229
|
+
if (!claim) {
|
|
1230
|
+
throw new Error("the configured daemon client does not implement claimRoomEpoch");
|
|
1231
|
+
}
|
|
1232
|
+
try {
|
|
1233
|
+
// Claim FIRST (§2.5): the lease below is minted for THIS placement, so a boot
|
|
1234
|
+
// that loses the epoch race learns it here, before any materialization exists.
|
|
1235
|
+
const { epoch } = await claim({ doc });
|
|
1236
|
+
const lease = await opts.daemon.materialize({
|
|
1237
|
+
ast,
|
|
1238
|
+
// The room's upstream leg IS the normalized protocol (§3) — never the app's
|
|
1239
|
+
// viewer `mode`.
|
|
1240
|
+
mode: "normalized",
|
|
1241
|
+
leaseTtlMs: realtime.upstreamLeaseTtlMs ?? opts.leaseTtlMs,
|
|
1242
|
+
});
|
|
1243
|
+
const headers = realtime.mintFlushHeaders
|
|
1244
|
+
? await realtime.mintFlushHeaders({ doc, epoch })
|
|
1245
|
+
: {
|
|
1246
|
+
[ROOM_FLUSH_CREDENTIAL_HEADER]: await mintRoomFlushCredential({
|
|
1247
|
+
shellSecret: realtime.shellSecret,
|
|
1248
|
+
doc,
|
|
1249
|
+
epoch,
|
|
1250
|
+
}),
|
|
1251
|
+
};
|
|
1252
|
+
const res = {
|
|
1253
|
+
epoch,
|
|
1254
|
+
upstreamLeaseToken: lease.leaseToken,
|
|
1255
|
+
flush: {
|
|
1256
|
+
urls: {
|
|
1257
|
+
apply: routes.applyRowChangeTxn,
|
|
1258
|
+
claim: routes.claimRoomEpoch,
|
|
1259
|
+
lmids: routes.roomLmids,
|
|
1260
|
+
},
|
|
1261
|
+
headers,
|
|
1262
|
+
},
|
|
1263
|
+
};
|
|
1264
|
+
const upstreamWsEndpoint = realtime.upstreamWsEndpoint ?? lease.wsEndpoint;
|
|
1265
|
+
if (upstreamWsEndpoint !== undefined)
|
|
1266
|
+
res.upstreamWsEndpoint = upstreamWsEndpoint;
|
|
1267
|
+
return { status: 200, body: res };
|
|
1268
|
+
}
|
|
1269
|
+
catch (e) {
|
|
1270
|
+
return daemonVerdict(e);
|
|
1271
|
+
}
|
|
1272
|
+
},
|
|
1132
1273
|
handleQueryJson: (body, context) => {
|
|
1133
1274
|
const msg = parseObject(body, "query request");
|
|
1134
1275
|
return createQueryLease({
|
|
@@ -1173,6 +1314,19 @@ export function runSharedMutation(mutator, args, ctx, tx) {
|
|
|
1173
1314
|
return driveMutationAsync(mutator(isoTx, args, ctx), {
|
|
1174
1315
|
apply: (op) => applyOpToServerTx(tx, op),
|
|
1175
1316
|
read: (table, pk) => tx.row(table, pk),
|
|
1317
|
+
query: async (q) => {
|
|
1318
|
+
// The shared-seam contract is ALWAYS an array of rows: the client's `WriteTxn.query` returns
|
|
1319
|
+
// an array even for a root `.one()` (the root unwrap is the Store's `materialize()`, not the
|
|
1320
|
+
// in-mutator read — rust/src/wasm/db.rs). The server's `tx.query` returns a scalar (object|null)
|
|
1321
|
+
// for a `.one()` root, so normalize it to `[]`/`[row]` here — one body sees the same shape on
|
|
1322
|
+
// both tiers. (Postgres backend: `tx.query` rejects until POSTGRES-READ-COMPILER-DESIGN.md
|
|
1323
|
+
// Phase B; the daemon/SQLite backend compiles + rides the open session — DAEMON §5.4.)
|
|
1324
|
+
const ast = q.ast();
|
|
1325
|
+
const res = await tx.query(ast);
|
|
1326
|
+
if (ast.one === true)
|
|
1327
|
+
return res == null ? [] : [res];
|
|
1328
|
+
return (res ?? []);
|
|
1329
|
+
},
|
|
1176
1330
|
});
|
|
1177
1331
|
}
|
|
1178
1332
|
/** Run one logical {@link MutationOp} (yielded by a shared generator mutator) against the live server
|
|
@@ -1213,6 +1367,65 @@ async function assertAuthorized(authorizer, input) {
|
|
|
1213
1367
|
if (result === false)
|
|
1214
1368
|
throw new RindleApiError("forbidden", "rindle request forbidden", 403);
|
|
1215
1369
|
}
|
|
1370
|
+
/** The default flush-trio gate: verify the default epoch-bound credential from the request
|
|
1371
|
+
* header. The two refusal messages are deliberately distinct — "missing" is a transport wiring
|
|
1372
|
+
* bug (no `context.request`), "refused" is an invalid credential. */
|
|
1373
|
+
function defaultFlushGate(shellSecret) {
|
|
1374
|
+
return async (context) => {
|
|
1375
|
+
const credential = requestHeader(context.request, ROOM_FLUSH_CREDENTIAL_HEADER);
|
|
1376
|
+
if (!credential) {
|
|
1377
|
+
throw new RindleApiError("forbidden", `missing ${ROOM_FLUSH_CREDENTIAL_HEADER} header — is the transport passing its incoming request as context.request?`, 403);
|
|
1378
|
+
}
|
|
1379
|
+
try {
|
|
1380
|
+
await verifyRoomFlushCredential(credential, shellSecret);
|
|
1381
|
+
}
|
|
1382
|
+
catch (e) {
|
|
1383
|
+
throw new RindleApiError("forbidden", `flush credential refused: ${errMessage(e)}`, 403);
|
|
1384
|
+
}
|
|
1385
|
+
};
|
|
1386
|
+
}
|
|
1387
|
+
/** The default `/room-boot` gate: `Authorization: Bearer <shell secret>` (README contract),
|
|
1388
|
+
* compared constant-time. */
|
|
1389
|
+
function defaultBootGate(shellSecret) {
|
|
1390
|
+
return (context) => {
|
|
1391
|
+
const auth = requestHeader(context.request, "authorization");
|
|
1392
|
+
const bearer = auth && /^bearer\s/i.test(auth) ? auth.replace(/^bearer\s+/i, "") : undefined;
|
|
1393
|
+
if (!bearer || !timingSafeEqualStr(bearer, shellSecret)) {
|
|
1394
|
+
throw new RindleApiError("forbidden", "room-boot: shell secret refused", 403);
|
|
1395
|
+
}
|
|
1396
|
+
};
|
|
1397
|
+
}
|
|
1398
|
+
/** Best-effort header extraction from whatever the transport put in `context.request`: a Fetch
|
|
1399
|
+
* `Request` (`headers.get`), a node `IncomingMessage` (lowercased header map), or a plain
|
|
1400
|
+
* `{headers: {...}}`. `undefined` when there is no request or no such header. */
|
|
1401
|
+
function requestHeader(request, name) {
|
|
1402
|
+
if (!request || typeof request !== "object")
|
|
1403
|
+
return undefined;
|
|
1404
|
+
const headers = request.headers;
|
|
1405
|
+
if (!headers || typeof headers !== "object")
|
|
1406
|
+
return undefined;
|
|
1407
|
+
if (typeof headers.get === "function") {
|
|
1408
|
+
return headers.get(name) ?? undefined;
|
|
1409
|
+
}
|
|
1410
|
+
const map = headers;
|
|
1411
|
+
const v = map[name.toLowerCase()] ?? map[name];
|
|
1412
|
+
if (typeof v === "string")
|
|
1413
|
+
return v;
|
|
1414
|
+
if (Array.isArray(v) && typeof v[0] === "string")
|
|
1415
|
+
return v[0];
|
|
1416
|
+
return undefined;
|
|
1417
|
+
}
|
|
1418
|
+
/** Constant-time string equality (a length mismatch fails fast — length is not the secret). */
|
|
1419
|
+
function timingSafeEqualStr(a, b) {
|
|
1420
|
+
const ab = new TextEncoder().encode(a);
|
|
1421
|
+
const bb = new TextEncoder().encode(b);
|
|
1422
|
+
if (ab.length !== bb.length)
|
|
1423
|
+
return false;
|
|
1424
|
+
let diff = 0;
|
|
1425
|
+
for (let i = 0; i < ab.length; i++)
|
|
1426
|
+
diff |= ab[i] ^ bb[i];
|
|
1427
|
+
return diff === 0;
|
|
1428
|
+
}
|
|
1216
1429
|
async function resolvePolicy(policy, input) {
|
|
1217
1430
|
if (!policy)
|
|
1218
1431
|
return { kind: "whileSubscribed" };
|