@cruba/crubal-host 0.0.0-stage → 0.3.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 +90 -0
- package/dist/src/emergency.js.map +1 -0
- package/dist/src/host.d.ts +308 -0
- package/dist/src/host.js +827 -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 +44 -0
- package/dist/src/indexer.js +277 -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 +128 -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 +523 -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,53 @@
|
|
|
1
|
+
// signatures.ts: signed requests between owners (docs/design/host.md, "Between owners"): HTTP message
|
|
2
|
+
// signatures (RFC 9421) over the method, the target, the body's digest and the date, made with the domain's
|
|
3
|
+
// Ed25519 key and verified against the key its well-known file publishes. The subset here is what two
|
|
4
|
+
// hosts need to prove who is calling; nothing more.
|
|
5
|
+
import { createHash, createPrivateKey, createPublicKey, sign as edSign, verify as edVerify } from "node:crypto";
|
|
6
|
+
export const COMPONENTS = ["@method", "@target-uri", "content-digest", "date"];
|
|
7
|
+
export function contentDigest(body) {
|
|
8
|
+
return `sha-256=:${createHash("sha256").update(body, "utf8").digest("base64")}:`;
|
|
9
|
+
}
|
|
10
|
+
function base(method, target, digest, date, params) {
|
|
11
|
+
return [`"@method": ${method.toUpperCase()}`, `"@target-uri": ${target}`, `"content-digest": ${digest}`, `"date": ${date}`, `"@signature-params": ${params}`].join("\n");
|
|
12
|
+
}
|
|
13
|
+
/** The headers a signed request carries: Content-Digest, Date, Signature-Input and Signature. */
|
|
14
|
+
export function signRequest(o) {
|
|
15
|
+
const body = o.body ?? "";
|
|
16
|
+
const digest = contentDigest(body);
|
|
17
|
+
const created = o.created ?? Math.floor(Date.now() / 1000);
|
|
18
|
+
const date = new Date(created * 1000).toUTCString();
|
|
19
|
+
const params = `(${COMPONENTS.map((c) => `"${c}"`).join(" ")});created=${created};keyid="${o.keyid}";alg="ed25519"`;
|
|
20
|
+
const key = createPrivateKey({ key: { kty: "OKP", crv: "Ed25519", x: o.publicX, d: o.privateD }, format: "jwk" });
|
|
21
|
+
const sig = edSign(null, Buffer.from(base(o.method, o.url, digest, date, params), "utf8"), key).toString("base64");
|
|
22
|
+
return { "content-digest": digest, date, "signature-input": `sig1=${params}`, signature: `sig1=:${sig}:` };
|
|
23
|
+
}
|
|
24
|
+
/** Verify a request's signature with the signer's public key (its JWK `x`). Null when absent or invalid. */
|
|
25
|
+
export function verifyRequest(o) {
|
|
26
|
+
return (async () => {
|
|
27
|
+
const h = (n) => { const v = o.headers[n] ?? o.headers[n.toLowerCase()]; return Array.isArray(v) ? v[0] : v; };
|
|
28
|
+
const input = h("signature-input");
|
|
29
|
+
const signature = h("signature");
|
|
30
|
+
const date = h("date");
|
|
31
|
+
const digest = h("content-digest");
|
|
32
|
+
if (!input || !signature || !date || !digest)
|
|
33
|
+
return null;
|
|
34
|
+
const m = input.match(/^sig1=(\((?:"[^"]+" ?)+\);created=(\d+);keyid="([^"]+)";alg="ed25519")$/);
|
|
35
|
+
const s = signature.match(/^sig1=:([A-Za-z0-9+/=]+):$/);
|
|
36
|
+
if (!m || !s)
|
|
37
|
+
return null;
|
|
38
|
+
const [, params, createdText, keyid] = m;
|
|
39
|
+
const created = Number(createdText);
|
|
40
|
+
const now = o.now ?? Math.floor(Date.now() / 1000);
|
|
41
|
+
if (Math.abs(now - created) > (o.skew ?? 300))
|
|
42
|
+
return null;
|
|
43
|
+
if (contentDigest(o.body ?? "") !== digest)
|
|
44
|
+
return null;
|
|
45
|
+
const x = await o.publicX(keyid);
|
|
46
|
+
if (!x)
|
|
47
|
+
return null;
|
|
48
|
+
const key = createPublicKey({ key: { kty: "OKP", crv: "Ed25519", x }, format: "jwk" });
|
|
49
|
+
const ok = edVerify(null, Buffer.from(base(o.method, o.url, digest, date, params), "utf8"), key, Buffer.from(s[1], "base64"));
|
|
50
|
+
return ok ? { keyid, created } : null;
|
|
51
|
+
})();
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=signatures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signatures.js","sourceRoot":"","sources":["../../src/signatures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type Terms = {
|
|
2
|
+
[audience: string]: {
|
|
3
|
+
[use: string]: boolean;
|
|
4
|
+
};
|
|
5
|
+
};
|
|
6
|
+
/** `search yes, answer yes, train no` → `{search: true, answer: true, train: false}`. */
|
|
7
|
+
export declare function readTerms(text: {
|
|
8
|
+
[audience: string]: string;
|
|
9
|
+
}): Terms;
|
|
10
|
+
/** The user agents that fetch pages to train models, as they name themselves. */
|
|
11
|
+
export declare const TRAINING_BOTS: string[];
|
|
12
|
+
/** robots.txt for an owner's public terms. */
|
|
13
|
+
export declare function robotsTxt(terms: Terms, prefix?: string): string;
|
|
14
|
+
/** Response headers for a public page under these terms. */
|
|
15
|
+
export declare function termsHeaders(terms: Terms): {
|
|
16
|
+
[header: string]: string;
|
|
17
|
+
};
|
|
18
|
+
/** The machine-readable terms file, by audience. */
|
|
19
|
+
export declare function termsJson(owner: string, terms: Terms): {
|
|
20
|
+
[k: string]: unknown;
|
|
21
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// terms.ts: a package's terms per audience (spec 12.5.1) turned into what crawlers and agents read: robots
|
|
2
|
+
// rules for the bots that train, a machine-readable terms file, and response headers. CRUBAL states the
|
|
3
|
+
// terms; the host turns them into these. Nothing here is a visibility decision: that stayed in the views.
|
|
4
|
+
/** `search yes, answer yes, train no` → `{search: true, answer: true, train: false}`. */
|
|
5
|
+
export function readTerms(text) {
|
|
6
|
+
const out = {};
|
|
7
|
+
for (const [audience, line] of Object.entries(text)) {
|
|
8
|
+
const uses = {};
|
|
9
|
+
for (const piece of line.split(",")) {
|
|
10
|
+
const [use, yn] = piece.trim().split(/\s+/);
|
|
11
|
+
if (use)
|
|
12
|
+
uses[use] = yn !== "no";
|
|
13
|
+
}
|
|
14
|
+
out[audience] = uses;
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
18
|
+
/** The user agents that fetch pages to train models, as they name themselves. */
|
|
19
|
+
export const TRAINING_BOTS = ["GPTBot", "ChatGPT-User", "CCBot", "Google-Extended", "anthropic-ai", "ClaudeBot", "Claude-Web", "Bytespider", "Applebot-Extended", "cohere-ai", "PerplexityBot", "Meta-ExternalAgent", "Amazonbot"];
|
|
20
|
+
/** robots.txt for an owner's public terms. */
|
|
21
|
+
export function robotsTxt(terms, prefix = "/") {
|
|
22
|
+
const pub = terms.public ?? {};
|
|
23
|
+
const lines = [];
|
|
24
|
+
if (pub.search === false) {
|
|
25
|
+
lines.push("User-agent: *", `Disallow: ${prefix}`, "");
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
if (pub.train === false)
|
|
29
|
+
for (const bot of TRAINING_BOTS)
|
|
30
|
+
lines.push(`User-agent: ${bot}`, `Disallow: ${prefix}`, "");
|
|
31
|
+
lines.push("User-agent: *", "Allow: /", "");
|
|
32
|
+
}
|
|
33
|
+
return `${lines.join("\n").trimEnd()}\n`;
|
|
34
|
+
}
|
|
35
|
+
/** Response headers for a public page under these terms. */
|
|
36
|
+
export function termsHeaders(terms) {
|
|
37
|
+
const pub = terms.public ?? {};
|
|
38
|
+
const robots = [];
|
|
39
|
+
if (pub.search === false)
|
|
40
|
+
robots.push("noindex");
|
|
41
|
+
if (pub.answer === false)
|
|
42
|
+
robots.push("nosnippet");
|
|
43
|
+
if (pub.train === false)
|
|
44
|
+
robots.push("noai", "noimageai");
|
|
45
|
+
const out = {};
|
|
46
|
+
if (robots.length)
|
|
47
|
+
out["x-robots-tag"] = robots.join(", ");
|
|
48
|
+
out["x-crubal-terms"] = Object.entries(pub).map(([u, ok]) => `${u}=${ok ? "yes" : "no"}`).join("; ") || "search=yes; answer=yes; train=yes";
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
/** The machine-readable terms file, by audience. */
|
|
52
|
+
export function termsJson(owner, terms) {
|
|
53
|
+
return { crubal: "2", owner, terms: Object.keys(terms).length ? terms : { public: { search: true, answer: true, train: true } } };
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=terms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terms.js","sourceRoot":"","sources":["../../src/terms.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,50 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cruba/crubal-host",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "The reference CRUBAL host: identity, secrets, adapters, signing, the loops, the platform index and the HTTP surface over the Postgres store.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/src/index.d.ts",
|
|
10
|
+
"default": "./dist/src/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"main": "./dist/src/index.js",
|
|
14
|
+
"types": "./dist/src/index.d.ts",
|
|
15
|
+
"bin": {
|
|
16
|
+
"crubal-host": "dist/bin/crubal-host.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=22"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"test": "node --test test/*.test.ts",
|
|
27
|
+
"typecheck": "tsc --noEmit",
|
|
28
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json && cp src/schema.sql dist/src/",
|
|
29
|
+
"prepublishOnly": "npm run typecheck && npm run build"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@cruba/crubal": "0.3.0",
|
|
33
|
+
"@cruba/crubal-postgres": "0.3.0",
|
|
34
|
+
"pg": "^8.13.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/node": "^24.0.0",
|
|
38
|
+
"@types/pg": "^8.11.0",
|
|
39
|
+
"typescript": "^5.6.0"
|
|
40
|
+
},
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "git+https://github.com/nes4less/crubal.git",
|
|
44
|
+
"directory": "packages/crubal-host"
|
|
45
|
+
},
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"access": "public"
|
|
48
|
+
},
|
|
49
|
+
"author": "Chris Thompson"
|
|
50
|
+
}
|