@cruba/crubal-host 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -2
- package/dist/bin/crubal-host.d.ts +2 -0
- package/dist/bin/crubal-host.js +52 -0
- package/dist/bin/crubal-host.js.map +1 -0
- package/dist/src/credentials.d.ts +58 -0
- package/dist/src/credentials.js +161 -0
- package/dist/src/credentials.js.map +1 -0
- package/dist/src/emergency.d.ts +53 -0
- package/dist/src/emergency.js +91 -0
- package/dist/src/emergency.js.map +1 -0
- package/dist/src/host.d.ts +302 -0
- package/dist/src/host.js +808 -0
- package/dist/src/host.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.js +10 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/indexer.d.ts +41 -0
- package/dist/src/indexer.js +220 -0
- package/dist/src/indexer.js.map +1 -0
- package/dist/src/oidc.d.ts +29 -0
- package/dist/src/oidc.js +74 -0
- package/dist/src/oidc.js.map +1 -0
- package/dist/src/schema.sql +125 -0
- package/dist/src/secrets.d.ts +21 -0
- package/dist/src/secrets.js +36 -0
- package/dist/src/secrets.js.map +1 -0
- package/dist/src/server.d.ts +41 -0
- package/dist/src/server.js +520 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/signatures.d.ts +30 -0
- package/dist/src/signatures.js +53 -0
- package/dist/src/signatures.js.map +1 -0
- package/dist/src/terms.d.ts +21 -0
- package/dist/src/terms.js +55 -0
- package/dist/src/terms.js.map +1 -0
- package/package.json +48 -4
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
// server.ts: the HTTP surface (docs/design/host.md). Owner-scoped, small, the same for every owner; the host
|
|
2
|
+
// resolves the caller first and hands the store only the caller ID; every decision after that is the
|
|
3
|
+
// store's access. Nothing here decides anything a package could say.
|
|
4
|
+
import { timingSafeEqual } from "node:crypto";
|
|
5
|
+
import { createServer } from "node:http";
|
|
6
|
+
import { Access } from "@cruba/crubal";
|
|
7
|
+
import { formOf } from "@cruba/crubal";
|
|
8
|
+
import { parseJson } from "@cruba/crubal";
|
|
9
|
+
import { endEmergencyEdge, logEmergencyRead, makeEmergencyEdge } from "./emergency.js";
|
|
10
|
+
import { Index } from "./indexer.js";
|
|
11
|
+
import { readTerms, robotsTxt, termsHeaders, termsJson } from "./terms.js";
|
|
12
|
+
/** The reply as it is built: the few verbs the handler uses, kept in memory and handed to whatever transport asked. */
|
|
13
|
+
class Reply {
|
|
14
|
+
status = 200;
|
|
15
|
+
headers = {};
|
|
16
|
+
body = "";
|
|
17
|
+
setHeader(k, v) {
|
|
18
|
+
this.headers[k] = v;
|
|
19
|
+
}
|
|
20
|
+
writeHead(status, headers) {
|
|
21
|
+
this.status = status;
|
|
22
|
+
if (headers)
|
|
23
|
+
Object.assign(this.headers, headers);
|
|
24
|
+
}
|
|
25
|
+
end(chunk) {
|
|
26
|
+
if (chunk !== undefined)
|
|
27
|
+
this.body = chunk;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
class HttpError extends Error {
|
|
31
|
+
status;
|
|
32
|
+
constructor(status, message) {
|
|
33
|
+
super(message);
|
|
34
|
+
this.status = status;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const json = (res, status, body) => {
|
|
38
|
+
res.writeHead(status, { "content-type": "application/json; charset=utf-8" });
|
|
39
|
+
res.end(`${JSON.stringify(body)}\n`);
|
|
40
|
+
};
|
|
41
|
+
/** Read a node request's body, refusing one over the limit before anything else reads it. */
|
|
42
|
+
async function readBody(req, limit) {
|
|
43
|
+
const chunks = [];
|
|
44
|
+
let size = 0;
|
|
45
|
+
for await (const c of req) {
|
|
46
|
+
size += c.length;
|
|
47
|
+
if (size > limit)
|
|
48
|
+
throw new HttpError(413, `the body is over ${limit} bytes`);
|
|
49
|
+
chunks.push(c);
|
|
50
|
+
}
|
|
51
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
52
|
+
}
|
|
53
|
+
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
54
|
+
/** Compare a presented secret with the kept one in constant time, so a guess learns nothing from the clock. */
|
|
55
|
+
function sameSecret(presented, kept) {
|
|
56
|
+
if (!presented)
|
|
57
|
+
return false;
|
|
58
|
+
const a = Buffer.from(presented, "utf8");
|
|
59
|
+
const b = Buffer.from(kept, "utf8");
|
|
60
|
+
return a.length === b.length && timingSafeEqual(a, b);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Answer one request. Every route is here, owner-scoped, the same for every owner; errors become a JSON
|
|
64
|
+
* body with their status. Transports call this: `serve` for node, an app's route for in-process hosting.
|
|
65
|
+
*/
|
|
66
|
+
export async function handle(host, req) {
|
|
67
|
+
const res = new Reply();
|
|
68
|
+
const seen = {};
|
|
69
|
+
try {
|
|
70
|
+
await respond(host, req, res, seen);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
const status = e instanceof HttpError ? e.status : typeof e.status === "number" ? e.status : 400;
|
|
74
|
+
json(res, status, { error: e instanceof Error ? e.message : String(e) });
|
|
75
|
+
}
|
|
76
|
+
return { status: res.status, headers: res.headers, body: res.body, seen };
|
|
77
|
+
}
|
|
78
|
+
async function respond(host, req, res, seen) {
|
|
79
|
+
{
|
|
80
|
+
const url = new URL(req.url ?? "/", "http://host");
|
|
81
|
+
const method = req.method ?? "GET";
|
|
82
|
+
// Browsers: the allowlisted origin gets its headers; a preflight is answered here.
|
|
83
|
+
const origin = req.headers.origin;
|
|
84
|
+
if (typeof origin === "string" && host.o.cors?.includes(origin)) {
|
|
85
|
+
res.setHeader("access-control-allow-origin", origin);
|
|
86
|
+
res.setHeader("access-control-allow-headers", "authorization, content-type, signature, signature-input, content-digest, date, x-host-key");
|
|
87
|
+
res.setHeader("access-control-allow-methods", "GET, POST, OPTIONS");
|
|
88
|
+
res.setHeader("vary", "origin");
|
|
89
|
+
}
|
|
90
|
+
if (method === "OPTIONS") {
|
|
91
|
+
res.writeHead(204);
|
|
92
|
+
res.end();
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// The body was read once, up front: a signed request's digest covers it. The limit holds here too.
|
|
96
|
+
const raw = req.body;
|
|
97
|
+
if (Buffer.byteLength(raw, "utf8") > (host.o.bodyLimit ?? 1_048_576))
|
|
98
|
+
throw new HttpError(413, `the body is over ${host.o.bodyLimit ?? 1_048_576} bytes`);
|
|
99
|
+
const bodyOf = () => raw;
|
|
100
|
+
const parts = url.pathname.split("/").filter(Boolean);
|
|
101
|
+
const q = (k) => url.searchParams.get(k) ?? undefined;
|
|
102
|
+
/** One header's value; a repeated header gives its first value. */
|
|
103
|
+
const header = (k) => {
|
|
104
|
+
const v = req.headers[k];
|
|
105
|
+
return Array.isArray(v) ? v[0] : v;
|
|
106
|
+
};
|
|
107
|
+
seen.route = parts.slice(0, 3).join("/");
|
|
108
|
+
if (url.pathname === "/health" && method === "GET") {
|
|
109
|
+
const h = await host.health();
|
|
110
|
+
return json(res, h.ok ? 200 : 503, h);
|
|
111
|
+
}
|
|
112
|
+
if (url.pathname === "/.well-known/crubal.json")
|
|
113
|
+
return json(res, 200, await host.wellKnown());
|
|
114
|
+
// Published packages (11.5, 11.7): /packages/<owner>/<name>/<version>/package.json, and the text beside it.
|
|
115
|
+
if (parts[0] === "packages" && parts.length === 5 && method === "GET") {
|
|
116
|
+
const [, owner, name, version, file] = parts;
|
|
117
|
+
const p = await host.publishedBundle(decodeURIComponent(owner), decodeURIComponent(name), decodeURIComponent(version));
|
|
118
|
+
if (!p)
|
|
119
|
+
throw new HttpError(404, `no published ${owner}/${name} /${version}`);
|
|
120
|
+
if (file === "package.json") {
|
|
121
|
+
res.setHeader("cache-control", "public, max-age=31536000, immutable");
|
|
122
|
+
return json(res, 200, p.bundle);
|
|
123
|
+
}
|
|
124
|
+
if (file === "package.crubal") {
|
|
125
|
+
res.writeHead(200, { "content-type": "text/plain; charset=utf-8", "cache-control": "public, max-age=31536000, immutable" });
|
|
126
|
+
return res.end(p.text);
|
|
127
|
+
}
|
|
128
|
+
throw new HttpError(404, "package.json or package.crubal");
|
|
129
|
+
}
|
|
130
|
+
// OAuth's return leg: the code becomes the connection the state names.
|
|
131
|
+
if (url.pathname === "/oauth/callback" && method === "GET") {
|
|
132
|
+
const state = JSON.parse(Buffer.from(q("state") ?? "", "base64url").toString("utf8") || "{}");
|
|
133
|
+
const provider = state.name ? host.o.oauth?.[state.name] : undefined;
|
|
134
|
+
if (!state.owner || !state.name || !provider || !q("code"))
|
|
135
|
+
throw new HttpError(400, "state, name and code");
|
|
136
|
+
const c = await host.credentials.exchangeCode(state.owner, state.name, q("code"), provider, []);
|
|
137
|
+
return json(res, 200, c);
|
|
138
|
+
}
|
|
139
|
+
// The loops, for a scheduler, behind the host key.
|
|
140
|
+
const hostKeyOk = !host.o.hostKey || sameSecret(header("x-host-key"), host.o.hostKey);
|
|
141
|
+
if (parts[0] === "project" || parts[0] === "tick" || parts[0] === "retry" || parts[0] === "push" || parts[0] === "expire" || parts[0] === "drain") {
|
|
142
|
+
if (method !== "POST")
|
|
143
|
+
throw new HttpError(405, "POST");
|
|
144
|
+
if (!hostKeyOk)
|
|
145
|
+
throw new HttpError(403, "the host key");
|
|
146
|
+
const o = parseJson(bodyOf() || "{}");
|
|
147
|
+
const owner = typeof o.owner === "string" ? o.owner : undefined;
|
|
148
|
+
const now = typeof o.now === "string" ? o.now : undefined;
|
|
149
|
+
if (parts[0] === "project")
|
|
150
|
+
return json(res, 200, await host.project(owner, now));
|
|
151
|
+
if (parts[0] === "drain")
|
|
152
|
+
return json(res, 200, await host.drain(typeof o.rate === "number" ? o.rate : 100, owner, now));
|
|
153
|
+
if (parts[0] === "retry")
|
|
154
|
+
return json(res, 200, await host.retry(now, owner));
|
|
155
|
+
if (parts[0] === "push")
|
|
156
|
+
return json(res, 200, await host.push(now, owner));
|
|
157
|
+
if (parts[0] === "expire")
|
|
158
|
+
return json(res, 200, await host.expire(now, owner));
|
|
159
|
+
return json(res, 200, await host.tick(now, owner));
|
|
160
|
+
}
|
|
161
|
+
// The platform index (14.8, 14.10): who the caller is to every owner on this host, and the rows they
|
|
162
|
+
// stand in a relation to. A bearer token only; the host vouches, so no owner's signature is involved.
|
|
163
|
+
if (parts[0] === "whoami" && method === "GET") {
|
|
164
|
+
const me = await host.whoIs(header("authorization"));
|
|
165
|
+
if (!me)
|
|
166
|
+
throw new HttpError(401, "sign in");
|
|
167
|
+
seen.caller = `${me.owner}:${me.caller}`;
|
|
168
|
+
if (parts[1] === "rows") {
|
|
169
|
+
const relation = q("relation");
|
|
170
|
+
if (!relation)
|
|
171
|
+
throw new HttpError(400, "relation");
|
|
172
|
+
return json(res, 200, { caller: me.caller, home: me.owner, relation, rows: await host.rowsFor(me, relation, { ...(q("view") ? { view: q("view") } : {}), ...(q("limit") ? { limit: Number(q("limit")) } : {}) }) });
|
|
173
|
+
}
|
|
174
|
+
return json(res, 200, await host.whoami(me));
|
|
175
|
+
}
|
|
176
|
+
if (parts[0] !== "o" || !parts[1])
|
|
177
|
+
throw new HttpError(404, "not found");
|
|
178
|
+
const owner = decodeURIComponent(parts[1]);
|
|
179
|
+
// A signed request from another owner (RFC 9421) names its signer; a bearer token names a caller.
|
|
180
|
+
const target = `${header("x-forwarded-proto") ?? "http"}://${header("host") ?? "host"}${req.url ?? "/"}`;
|
|
181
|
+
const who = req.headers.signature ? await host.whoSigned(owner, { method, url: target, body: raw, headers: req.headers }) : await host.whoIs(header("authorization"));
|
|
182
|
+
// A hosted person (14.1) is the owner `domain:id`: the person signed in to the domain as that caller.
|
|
183
|
+
// At another owner on this host they are `person:<domain:id>`, vouched for without a signature (14.8).
|
|
184
|
+
const hostedAt = owner.indexOf(":");
|
|
185
|
+
const domain = hostedAt > 0 ? owner.slice(0, hostedAt) : owner;
|
|
186
|
+
const hostedId = hostedAt > 0 ? owner.slice(hostedAt + 1) : undefined;
|
|
187
|
+
const callerId = await host.callerFor(owner, who);
|
|
188
|
+
const isOwner = callerId === owner;
|
|
189
|
+
seen.owner = owner;
|
|
190
|
+
seen.caller = callerId;
|
|
191
|
+
const store = await host.storeFor(owner);
|
|
192
|
+
const at = host.now();
|
|
193
|
+
const [, , what, name, ...rest] = parts;
|
|
194
|
+
// Acting for a person (14.9): a system's request carries `for`; the person must have allowed it.
|
|
195
|
+
const forPerson = (b) => (typeof b.for === "string" ? b.for : q("for"))?.replace(/^person:/, "");
|
|
196
|
+
const acting = async (b) => {
|
|
197
|
+
const person = forPerson(b);
|
|
198
|
+
if (!person)
|
|
199
|
+
return undefined;
|
|
200
|
+
if (!who || who.via !== "key")
|
|
201
|
+
throw new HttpError(403, "only a system with its own key acts for a person");
|
|
202
|
+
const allowed = await host.mayActFor(who, person, at);
|
|
203
|
+
if (!allowed)
|
|
204
|
+
throw new HttpError(403, `${person} hasn't let ${who.owner}:${who.caller} act for them`);
|
|
205
|
+
// The person as this owner sees them: at home their bare ID, elsewhere person:<domain:id>.
|
|
206
|
+
const pAt = person.indexOf(":");
|
|
207
|
+
const actor = pAt > 0 && person.slice(0, pAt) === owner ? person.slice(pAt + 1) : `person:${person}`;
|
|
208
|
+
return { actor, acting: { system: `${who.owner}:${who.caller}`, person: actor, ...(allowed.items.length ? { items: allowed.items } : {}), gated: allowed.gated } };
|
|
209
|
+
};
|
|
210
|
+
// What a person allows (14.9): their own chain's owner lists, allows and revokes.
|
|
211
|
+
if (what === "acting-for") {
|
|
212
|
+
if (!isOwner || !hostedId)
|
|
213
|
+
throw new HttpError(403, "the person allows who acts for them");
|
|
214
|
+
if (method === "GET")
|
|
215
|
+
return json(res, 200, { person: owner, allowed: (await host.actingFor(owner)) });
|
|
216
|
+
if (method === "POST") {
|
|
217
|
+
const b = parseJson(bodyOf() || "{}");
|
|
218
|
+
const sysAt = (b.system ?? "").indexOf(":");
|
|
219
|
+
if (!b.system || sysAt <= 0)
|
|
220
|
+
throw new HttpError(400, "system, as <owner>:<id>");
|
|
221
|
+
return json(res, 200, (await host.allowActing(owner, b.system.slice(0, sysAt), b.system.slice(sysAt + 1), { ...(b.items ? { items: b.items } : {}), ...(b.until ? { until: b.until } : {}), ...(b.gated !== undefined ? { gated: b.gated } : {}) })));
|
|
222
|
+
}
|
|
223
|
+
if (method === "DELETE" && name)
|
|
224
|
+
return json(res, 200, { revoked: await host.revokeActing(owner, Number(name)) });
|
|
225
|
+
}
|
|
226
|
+
// Terms (12.5.1): robots rules and the terms file, from the owner's package.
|
|
227
|
+
if (what === "robots.txt" && method === "GET") {
|
|
228
|
+
const terms = readTerms((await store.definitions()).info.terms);
|
|
229
|
+
res.writeHead(200, { "content-type": "text/plain; charset=utf-8" });
|
|
230
|
+
return res.end(robotsTxt(terms, `/o/${owner}/`));
|
|
231
|
+
}
|
|
232
|
+
if (what === "terms.json" && method === "GET")
|
|
233
|
+
return json(res, 200, termsJson(owner, readTerms((await store.definitions()).info.terms)));
|
|
234
|
+
// Connections (docs/design/host.md, "Outbound"): the fact of a credential, never its material.
|
|
235
|
+
if (what === "connections" && method === "GET") {
|
|
236
|
+
if (!isOwner)
|
|
237
|
+
throw new HttpError(403, "the owner's connections");
|
|
238
|
+
return json(res, 200, (await host.credentials.connections(owner)));
|
|
239
|
+
}
|
|
240
|
+
if (what === "connect" && name) {
|
|
241
|
+
if (!isOwner)
|
|
242
|
+
throw new HttpError(403, "the owner connects");
|
|
243
|
+
const provider = host.o.oauth?.[name];
|
|
244
|
+
if (method === "GET") {
|
|
245
|
+
if (!provider)
|
|
246
|
+
throw new HttpError(404, `no OAuth provider for ${name}`);
|
|
247
|
+
const scopes = (q("scope") ?? "").split(" ").filter(Boolean);
|
|
248
|
+
return json(res, 200, { url: host.credentials.authorizeUrl(owner, name, provider, scopes) });
|
|
249
|
+
}
|
|
250
|
+
if (method === "POST") {
|
|
251
|
+
const b = parseJson(bodyOf() || "{}");
|
|
252
|
+
if (!b.scheme || !b.material)
|
|
253
|
+
throw new HttpError(400, "scheme and material");
|
|
254
|
+
return json(res, 200, (await host.connect(owner, name, { scheme: b.scheme, material: b.material, scopes: b.scopes ?? [], ...(b.expires ? { expires: b.expires } : {}) })).connection);
|
|
255
|
+
}
|
|
256
|
+
if (method === "DELETE") {
|
|
257
|
+
await host.disconnect(owner, name);
|
|
258
|
+
return json(res, 200, { disconnected: name });
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// Emergency access (14.13): made by the platform under its terms; ended by the owner unless legal.
|
|
262
|
+
if (what === "emergency" && method === "POST" && !name) {
|
|
263
|
+
if (!hostKeyOk)
|
|
264
|
+
throw new HttpError(403, "the platform makes emergency edges");
|
|
265
|
+
const r = parseJson(bodyOf() || "{}");
|
|
266
|
+
const made = await makeEmergencyEdge(store, r, host.o.emergency, at);
|
|
267
|
+
await host.notice(owner, { emergency: r.edge, kind: r.kind, reference: r.reference, who: r.who, until: r.until });
|
|
268
|
+
return json(res, 200, made);
|
|
269
|
+
}
|
|
270
|
+
if (what === "emergency" && name && rest[0] === "end" && method === "POST") {
|
|
271
|
+
if (!isOwner && !hostKeyOk)
|
|
272
|
+
throw new HttpError(403, "the owner or the platform");
|
|
273
|
+
return json(res, 200, (await endEmergencyEdge(store, name, callerId ?? "platform", at, isOwner)));
|
|
274
|
+
}
|
|
275
|
+
// A read under an emergency edge is logged, record by record (14.13).
|
|
276
|
+
const underEmergency = callerId ? [...(await store.state()).edges.values()].find((e) => e.who === callerId && e.relation === "emergency" && (typeof e.until !== "string" || e.until > at)) : undefined;
|
|
277
|
+
// A view's page from the reference index (12.6.1): applied from the stream first, then served.
|
|
278
|
+
if (what === "v" && name && method === "GET") {
|
|
279
|
+
const index = new Index(host.pool);
|
|
280
|
+
await index.apply(store, name);
|
|
281
|
+
const picks = {};
|
|
282
|
+
for (const [k, val] of url.searchParams)
|
|
283
|
+
if (!["page", "q", "shape"].includes(k))
|
|
284
|
+
picks[k] = val.split(",").map((x) => x.trim()).filter(Boolean);
|
|
285
|
+
const page = await index.serve(store, name, { ...(q("page") ? { page: Number(q("page")) } : {}), ...(Object.keys(picks).length ? { picks } : {}), ...(q("q") ? { q: q("q") } : {}), ...(q("shape") ? { shape: q("shape") } : {}), ...(callerId ? { caller: callerId } : {}) });
|
|
286
|
+
const th = termsHeaders(readTerms((await store.definitions()).info.terms));
|
|
287
|
+
const robots = [page.indexable ? "all" : "noindex", ...(th["x-robots-tag"] ? th["x-robots-tag"].split(", ") : [])].filter((t, i, a) => a.indexOf(t) === i && !(t === "all" && a.includes("noindex")));
|
|
288
|
+
res.setHeader("x-robots-tag", robots.join(", "));
|
|
289
|
+
res.setHeader("x-crubal-terms", th["x-crubal-terms"]);
|
|
290
|
+
res.setHeader("x-crubal-seq", String(page.seq));
|
|
291
|
+
return json(res, 200, page);
|
|
292
|
+
}
|
|
293
|
+
if (what === "run" && name && method === "POST") {
|
|
294
|
+
const b = parseJson(bodyOf() || "{}");
|
|
295
|
+
const border = await host.borderFor(owner, store);
|
|
296
|
+
const c = border.contracts.get(name);
|
|
297
|
+
if (!c)
|
|
298
|
+
throw new HttpError(404, `no contract ${name}`);
|
|
299
|
+
const record = typeof b.record === "string" ? b.record : undefined;
|
|
300
|
+
// A system acting for a person needs no standing of its own here (14.9); anyone else signs in.
|
|
301
|
+
const acted = await acting(b);
|
|
302
|
+
if (!acted && !callerId && !isOwner)
|
|
303
|
+
throw new HttpError(401, "sign in");
|
|
304
|
+
const actor = acted?.actor ?? callerId;
|
|
305
|
+
if (acted)
|
|
306
|
+
border.acting = acted.acting;
|
|
307
|
+
// A form run is the person's answers landing as the contract says; a send acts.
|
|
308
|
+
if (c.kind === "form") {
|
|
309
|
+
if (!record) {
|
|
310
|
+
const level = typeof b.level === "string" ? b.level : "product";
|
|
311
|
+
return json(res, 200, await border.arrive(name, JSON.stringify(b.answers ?? {}), level, actor, undefined, at));
|
|
312
|
+
}
|
|
313
|
+
return json(res, 200, await border.receive(name, record, JSON.stringify(b.answers ?? {}), actor, at));
|
|
314
|
+
}
|
|
315
|
+
if (!record)
|
|
316
|
+
throw new HttpError(400, "record");
|
|
317
|
+
return json(res, 200, await border.send(name, record, actor, at));
|
|
318
|
+
}
|
|
319
|
+
if (what === "receive" && name && method === "POST") {
|
|
320
|
+
const border = await host.borderFor(owner, store);
|
|
321
|
+
if (!border.contracts.has(name))
|
|
322
|
+
throw new HttpError(404, `no contract ${name}`);
|
|
323
|
+
const payload = bodyOf();
|
|
324
|
+
const record = q("record");
|
|
325
|
+
const run = q("run");
|
|
326
|
+
const acted = await acting({});
|
|
327
|
+
const actor = acted?.actor ?? callerId;
|
|
328
|
+
if (acted)
|
|
329
|
+
border.acting = acted.acting;
|
|
330
|
+
if (record)
|
|
331
|
+
return json(res, 200, await border.receive(name, record, payload, actor, at, run));
|
|
332
|
+
return json(res, 200, await border.arrive(name, payload, q("level") ?? "product", actor, q("of"), at, q("within")));
|
|
333
|
+
}
|
|
334
|
+
if (what === "records" && name && method === "GET") {
|
|
335
|
+
if (!callerId)
|
|
336
|
+
throw new HttpError(401, "sign in");
|
|
337
|
+
const r = await store.get(name);
|
|
338
|
+
if (!r)
|
|
339
|
+
throw new HttpError(404, `no record ${name}`);
|
|
340
|
+
if (underEmergency && callerId)
|
|
341
|
+
await logEmergencyRead(store, callerId, name, String(underEmergency.edge), at);
|
|
342
|
+
const p = await store.definitions();
|
|
343
|
+
// What the caller may see (14.6): with a permission menu declared, a facet needs the caller's `see` item.
|
|
344
|
+
const state = p.perms.menu.size ? await store.state() : undefined;
|
|
345
|
+
const access = state ? new Access(p.dict, p.perms, state.records, [...state.edges.values()], owner) : undefined;
|
|
346
|
+
if (access)
|
|
347
|
+
access.views = p.views;
|
|
348
|
+
const values = {};
|
|
349
|
+
for (const [k, v] of Object.entries(r.values))
|
|
350
|
+
if (!access || isOwner || access.may(callerId, "see", k, r.id))
|
|
351
|
+
values[k] = v;
|
|
352
|
+
const { sources, ...plain } = r;
|
|
353
|
+
return json(res, 200, q("full") ? { ...plain, values, sources: sources ?? {} } : { ...plain, values });
|
|
354
|
+
}
|
|
355
|
+
if (what === "forms" && name && method === "GET") {
|
|
356
|
+
const border = await host.borderFor(owner, store);
|
|
357
|
+
const c = border.contracts.get(name);
|
|
358
|
+
if (!c || c.kind !== "form")
|
|
359
|
+
throw new HttpError(404, `no form ${name}`);
|
|
360
|
+
const state = await store.state();
|
|
361
|
+
const p = await store.definitions();
|
|
362
|
+
const record = q("record") ? state.records.get(q("record")) : undefined;
|
|
363
|
+
const access = p.perms.menu.size ? new Access(p.dict, p.perms, state.records, [...state.edges.values()], owner) : undefined;
|
|
364
|
+
if (access)
|
|
365
|
+
access.views = p.views;
|
|
366
|
+
return json(res, 200, formOf(c, record, p.dict, { records: state.records, ...(callerId ? { caller: callerId } : {}), ...(access ? { access } : {}) }));
|
|
367
|
+
}
|
|
368
|
+
if (what === "stream" && name) {
|
|
369
|
+
const border = await host.borderFor(owner, store);
|
|
370
|
+
if (method === "GET") {
|
|
371
|
+
const cursor = q("cursor") ? Object.fromEntries(q("cursor").split(",").map((p) => p.split("=")).map(([v, n]) => [v ?? "", Number(n)])) : undefined;
|
|
372
|
+
return json(res, 200, await border.streamRun(name, callerId, cursor, at));
|
|
373
|
+
}
|
|
374
|
+
if (rest[0] === "ack" && method === "POST") {
|
|
375
|
+
const b = parseJson(bodyOf() || "{}");
|
|
376
|
+
return json(res, 200, await border.ack(name, b.cursor ?? {}));
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// Offers (7.8): what this owner shares, to whom `to` says; a take fetches one; a link is minted by the owner.
|
|
380
|
+
if (what === "offer" && method === "GET") {
|
|
381
|
+
const border = await host.borderFor(owner, store);
|
|
382
|
+
const offers = [...border.contracts.values()].filter((c) => c.kind === "offer");
|
|
383
|
+
if (!name) {
|
|
384
|
+
const list = [];
|
|
385
|
+
for (const c of offers)
|
|
386
|
+
if (await host.mayTake(owner, c, callerId, q("link")))
|
|
387
|
+
list.push({ contract: c.name, gives: [...c.gives], mode: c.mode ?? "gathered", terms: { ...c.terms }, to: c.to ?? "private" });
|
|
388
|
+
return json(res, 200, { owner, offers: list });
|
|
389
|
+
}
|
|
390
|
+
const c = border.contracts.get(name);
|
|
391
|
+
if (!c || c.kind !== "offer")
|
|
392
|
+
throw new HttpError(404, `no offer ${name}`);
|
|
393
|
+
if (!(await host.mayTake(owner, c, callerId, q("link"))))
|
|
394
|
+
throw new HttpError(callerId ? 403 : 401, `${name} isn't offered to you`);
|
|
395
|
+
return json(res, 200, (await border.offer(name)));
|
|
396
|
+
}
|
|
397
|
+
if (what === "offer" && name && rest[0] === "link" && method === "POST") {
|
|
398
|
+
if (!isOwner)
|
|
399
|
+
throw new HttpError(403, "the owner publishes a link");
|
|
400
|
+
return json(res, 200, { contract: name, link: await host.offerLink(owner, name) });
|
|
401
|
+
}
|
|
402
|
+
if (what === "offer" && name && rest[0] === "unpublish" && method === "POST") {
|
|
403
|
+
if (!isOwner)
|
|
404
|
+
throw new HttpError(403, "the owner unpublishes");
|
|
405
|
+
await host.unpublishOffer(owner, name);
|
|
406
|
+
return json(res, 200, { contract: name, unpublished: true });
|
|
407
|
+
}
|
|
408
|
+
if (what === "take" && name && method === "POST") {
|
|
409
|
+
if (!isOwner)
|
|
410
|
+
throw new HttpError(403, "the owner takes");
|
|
411
|
+
return json(res, 200, await host.take(owner, name, at));
|
|
412
|
+
}
|
|
413
|
+
// A presenter pushing a stream (12.6.2): the signed party's entries land in the index under its name.
|
|
414
|
+
if (what === "inbox" && name && method === "POST") {
|
|
415
|
+
if (!callerId || !/:owner$/.test(callerId))
|
|
416
|
+
throw new HttpError(401, "a signed request from the presenter");
|
|
417
|
+
const presenter = callerId.replace(/:owner$/, "");
|
|
418
|
+
const b = parseJson(bodyOf() || "{}");
|
|
419
|
+
const index = new Index(host.pool);
|
|
420
|
+
const cursor = {};
|
|
421
|
+
for (const [view, list] of Object.entries(b.entries ?? {})) {
|
|
422
|
+
const first = list[0];
|
|
423
|
+
const [vname, version = ""] = String(first?.projection ?? view).split(" /");
|
|
424
|
+
cursor[view] = await index.ingest(presenter, vname ?? view, version, String(first?.audience ?? "public"), list);
|
|
425
|
+
}
|
|
426
|
+
return json(res, 200, { contract: name, from: presenter, cursor });
|
|
427
|
+
}
|
|
428
|
+
// The review queue (9.5): open items by key; a decision is one entry, then the affected intakes replay.
|
|
429
|
+
if (what === "review" && method === "GET") {
|
|
430
|
+
if (!callerId)
|
|
431
|
+
throw new HttpError(401, "sign in");
|
|
432
|
+
const byKey = {};
|
|
433
|
+
for (const it of await store.review()) {
|
|
434
|
+
const key = String(it.key ?? "?");
|
|
435
|
+
const list = byKey[key] ?? [];
|
|
436
|
+
list.push(it);
|
|
437
|
+
byKey[key] = list;
|
|
438
|
+
}
|
|
439
|
+
return json(res, 200, byKey);
|
|
440
|
+
}
|
|
441
|
+
if (what === "review" && method === "POST") {
|
|
442
|
+
if (!callerId)
|
|
443
|
+
throw new HttpError(401, "sign in");
|
|
444
|
+
const d = parseJson(bodyOf() || "{}");
|
|
445
|
+
if (typeof d.key !== "string" || typeof d.decision !== "string")
|
|
446
|
+
throw new HttpError(400, "a decision names its key and decision");
|
|
447
|
+
if (d.key.startsWith("run:")) {
|
|
448
|
+
const border = await host.borderFor(owner, store);
|
|
449
|
+
return json(res, 200, await border.decideRun(String(d.run), d.decision === "drop" ? "drop" : "retry", callerId, at));
|
|
450
|
+
}
|
|
451
|
+
const r = await store.decide(d, { person: callerId }, at);
|
|
452
|
+
return json(res, 200, { decided: d.key, entry: r.entry ? String(r.entry.log) : "", replayed: r.replayed });
|
|
453
|
+
}
|
|
454
|
+
if (what === "install" && method === "POST") {
|
|
455
|
+
if (!isOwner)
|
|
456
|
+
throw new HttpError(403, "the owner installs");
|
|
457
|
+
const b = parseJson(bodyOf());
|
|
458
|
+
// A bundle in the body, or a package by name fetched from its publisher's well-known file.
|
|
459
|
+
if (typeof b.package === "string" && !b.facets && !b.hash)
|
|
460
|
+
return json(res, 200, { installed: await host.installFrom(owner, b.package, typeof b.version === "string" ? b.version : undefined) });
|
|
461
|
+
return json(res, 200, await host.install(owner, isObj(b.bundle) ? b.bundle : b));
|
|
462
|
+
}
|
|
463
|
+
if (what === "export" && method === "GET") {
|
|
464
|
+
if (!isOwner)
|
|
465
|
+
throw new HttpError(403, "the owner exports");
|
|
466
|
+
const intake = (await store.pool.query("select json from intake where owner = $1 order by received", [owner])).rows.map((r) => r.json);
|
|
467
|
+
return json(res, 200, { owner, log: (await store.entries()), intake });
|
|
468
|
+
}
|
|
469
|
+
if (what === "erase" && name && method === "POST") {
|
|
470
|
+
if (!isOwner)
|
|
471
|
+
throw new HttpError(403, "the owner erases");
|
|
472
|
+
if (hostedId) {
|
|
473
|
+
// A person erases their own records: the writes in their chain, and the domain's state follows.
|
|
474
|
+
const domainStore = await host.storeFor(domain);
|
|
475
|
+
const r = (await domainStore.state()).records.get(name);
|
|
476
|
+
if (!r || r.owner !== owner)
|
|
477
|
+
throw new HttpError(403, `${name} isn't ${owner}'s`);
|
|
478
|
+
return json(res, 200, (await domainStore.erase(name)));
|
|
479
|
+
}
|
|
480
|
+
return json(res, 200, (await store.erase(name)));
|
|
481
|
+
}
|
|
482
|
+
if (what === "rotate" && method === "POST") {
|
|
483
|
+
if (!isOwner)
|
|
484
|
+
throw new HttpError(403, "the owner rotates its key");
|
|
485
|
+
return json(res, 200, (await host.rotateKey(owner, at)));
|
|
486
|
+
}
|
|
487
|
+
throw new HttpError(404, "not found");
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
/** One structured line per request, when it has been answered. */
|
|
491
|
+
export function logLine(host, req, reply, started) {
|
|
492
|
+
if (host.o.log === false)
|
|
493
|
+
return;
|
|
494
|
+
const line = { at: host.now(), method: req.method, route: reply.seen.route ?? req.url, status: reply.status, ms: Date.now() - started, ...(reply.seen.owner ? { owner: reply.seen.owner } : {}), ...(reply.seen.caller ? { caller: reply.seen.caller } : {}) };
|
|
495
|
+
if (host.o.log)
|
|
496
|
+
host.o.log(line);
|
|
497
|
+
else
|
|
498
|
+
console.log(JSON.stringify(line));
|
|
499
|
+
}
|
|
500
|
+
/** The node server: reads each request, hands it to `handle`, writes the reply, logs the line. */
|
|
501
|
+
export function serve(host) {
|
|
502
|
+
return createServer((req, res) => {
|
|
503
|
+
const started = Date.now();
|
|
504
|
+
const method = req.method ?? "GET";
|
|
505
|
+
const url = req.url ?? "/";
|
|
506
|
+
const done = (reply) => {
|
|
507
|
+
res.writeHead(reply.status, reply.headers);
|
|
508
|
+
res.end(reply.body);
|
|
509
|
+
logLine(host, { method, url }, reply, started);
|
|
510
|
+
};
|
|
511
|
+
readBody(req, host.o.bodyLimit ?? 1_048_576)
|
|
512
|
+
.then((body) => handle(host, { method, url, headers: req.headers, body }))
|
|
513
|
+
.then(done)
|
|
514
|
+
.catch((e) => {
|
|
515
|
+
const status = e instanceof HttpError ? e.status : 400;
|
|
516
|
+
done({ status, headers: { "content-type": "application/json; charset=utf-8" }, body: `${JSON.stringify({ error: e instanceof Error ? e.message : String(e) })}\n`, seen: {} });
|
|
517
|
+
});
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const COMPONENTS: readonly ["@method", "@target-uri", "content-digest", "date"];
|
|
2
|
+
export declare function contentDigest(body: string): string;
|
|
3
|
+
/** The headers a signed request carries: Content-Digest, Date, Signature-Input and Signature. */
|
|
4
|
+
export declare function signRequest(o: {
|
|
5
|
+
method: string;
|
|
6
|
+
url: string;
|
|
7
|
+
body?: string;
|
|
8
|
+
keyid: string;
|
|
9
|
+
privateD: string;
|
|
10
|
+
publicX: string;
|
|
11
|
+
created?: number;
|
|
12
|
+
}): {
|
|
13
|
+
[header: string]: string;
|
|
14
|
+
};
|
|
15
|
+
export type Verified = {
|
|
16
|
+
keyid: string;
|
|
17
|
+
created: number;
|
|
18
|
+
};
|
|
19
|
+
/** Verify a request's signature with the signer's public key (its JWK `x`). Null when absent or invalid. */
|
|
20
|
+
export declare function verifyRequest(o: {
|
|
21
|
+
method: string;
|
|
22
|
+
url: string;
|
|
23
|
+
body?: string;
|
|
24
|
+
headers: {
|
|
25
|
+
[h: string]: string | string[] | undefined;
|
|
26
|
+
};
|
|
27
|
+
publicX: (keyid: string) => Promise<string | undefined>;
|
|
28
|
+
now?: number;
|
|
29
|
+
skew?: number;
|
|
30
|
+
}): Promise<Verified | null>;
|