@superbee/core 0.2.0-pre.16 → 0.2.0-pre.19
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 +622 -5
- package/dist/blob-journal.d.ts +187 -2
- package/dist/blob-journal.d.ts.map +1 -1
- package/dist/blob-journal.js +377 -5
- package/dist/blob-journal.js.map +1 -1
- package/dist/body-replace-guards.d.ts +50 -0
- package/dist/body-replace-guards.d.ts.map +1 -0
- package/dist/body-replace-guards.js +158 -0
- package/dist/body-replace-guards.js.map +1 -0
- package/dist/builtin-recipes/content.d.ts +93 -0
- package/dist/builtin-recipes/content.d.ts.map +1 -0
- package/dist/builtin-recipes/content.js +288 -0
- package/dist/builtin-recipes/content.js.map +1 -0
- package/dist/builtin-recipes.d.ts +10 -0
- package/dist/builtin-recipes.d.ts.map +1 -0
- package/dist/builtin-recipes.js +97 -0
- package/dist/builtin-recipes.js.map +1 -0
- package/dist/bundle-health/index.d.ts +14 -0
- package/dist/bundle-health/index.d.ts.map +1 -0
- package/dist/bundle-health/index.js +12 -0
- package/dist/bundle-health/index.js.map +1 -0
- package/dist/bundle-health/kind-findings.d.ts +44 -0
- package/dist/bundle-health/kind-findings.d.ts.map +1 -0
- package/dist/bundle-health/kind-findings.js +68 -0
- package/dist/bundle-health/kind-findings.js.map +1 -0
- package/dist/bundle-health/legacy-page.d.ts +39 -0
- package/dist/bundle-health/legacy-page.d.ts.map +1 -0
- package/dist/bundle-health/legacy-page.js +50 -0
- package/dist/bundle-health/legacy-page.js.map +1 -0
- package/dist/bundle-health/report.d.ts +202 -0
- package/dist/bundle-health/report.d.ts.map +1 -0
- package/dist/bundle-health/report.js +438 -0
- package/dist/bundle-health/report.js.map +1 -0
- package/dist/code-point-order.d.ts +8 -0
- package/dist/code-point-order.d.ts.map +1 -0
- package/dist/code-point-order.js +20 -0
- package/dist/code-point-order.js.map +1 -0
- package/dist/connectors.d.ts +223 -0
- package/dist/connectors.d.ts.map +1 -0
- package/dist/connectors.js +1143 -0
- package/dist/connectors.js.map +1 -0
- package/dist/document-field-actions.d.ts +18 -0
- package/dist/document-field-actions.d.ts.map +1 -1
- package/dist/document-field-actions.js +91 -29
- package/dist/document-field-actions.js.map +1 -1
- package/dist/document-mutation.d.ts +7 -9
- package/dist/document-mutation.d.ts.map +1 -1
- package/dist/document-mutation.js +16 -16
- package/dist/document-mutation.js.map +1 -1
- package/dist/file-journaled-backend.d.ts +31 -5
- package/dist/file-journaled-backend.d.ts.map +1 -1
- package/dist/file-journaled-backend.js +131 -118
- package/dist/file-journaled-backend.js.map +1 -1
- package/dist/hosted-client/blob-delivery.d.ts +6 -0
- package/dist/hosted-client/blob-delivery.d.ts.map +1 -1
- package/dist/hosted-client/blob-delivery.js +23 -1
- package/dist/hosted-client/blob-delivery.js.map +1 -1
- package/dist/hosted-client/blob-write.d.ts +386 -0
- package/dist/hosted-client/blob-write.d.ts.map +1 -0
- package/dist/hosted-client/blob-write.js +770 -0
- package/dist/hosted-client/blob-write.js.map +1 -0
- package/dist/hosted-client/client.d.ts +64 -0
- package/dist/hosted-client/client.d.ts.map +1 -1
- package/dist/hosted-client/client.js +31 -0
- package/dist/hosted-client/client.js.map +1 -1
- package/dist/hosted-client/directory.d.ts +46 -0
- package/dist/hosted-client/directory.d.ts.map +1 -0
- package/dist/hosted-client/directory.js +74 -0
- package/dist/hosted-client/directory.js.map +1 -0
- package/dist/hosted-client/errors.d.ts +10 -0
- package/dist/hosted-client/errors.d.ts.map +1 -1
- package/dist/hosted-client/errors.js +13 -0
- package/dist/hosted-client/errors.js.map +1 -1
- package/dist/hosted-client/inbox.d.ts +320 -0
- package/dist/hosted-client/inbox.d.ts.map +1 -0
- package/dist/hosted-client/inbox.js +379 -0
- package/dist/hosted-client/inbox.js.map +1 -0
- package/dist/hosted-client/index.d.ts +11 -4
- package/dist/hosted-client/index.d.ts.map +1 -1
- package/dist/hosted-client/index.js +11 -4
- package/dist/hosted-client/index.js.map +1 -1
- package/dist/hosted-client/journal.d.ts +103 -0
- package/dist/hosted-client/journal.d.ts.map +1 -0
- package/dist/hosted-client/journal.js +464 -0
- package/dist/hosted-client/journal.js.map +1 -0
- package/dist/hosted-client/node.d.ts +5 -1
- package/dist/hosted-client/node.d.ts.map +1 -1
- package/dist/hosted-client/node.js +6 -1
- package/dist/hosted-client/node.js.map +1 -1
- package/dist/hosted-client/write.d.ts +28 -2
- package/dist/hosted-client/write.d.ts.map +1 -1
- package/dist/hosted-client/write.js +33 -11
- package/dist/hosted-client/write.js.map +1 -1
- package/dist/hosted-transport/answer-rows.d.ts +3 -2
- package/dist/hosted-transport/answer-rows.d.ts.map +1 -1
- package/dist/hosted-transport/answer-rows.js +1 -1
- package/dist/hosted-transport/answer-rows.js.map +1 -1
- package/dist/hosted-transport/carrier.d.ts +10 -0
- package/dist/hosted-transport/carrier.d.ts.map +1 -1
- package/dist/hosted-transport/carrier.js +22 -2
- package/dist/hosted-transport/carrier.js.map +1 -1
- package/dist/hosted-transport/whole-document-transport.d.ts +1 -1
- package/dist/hosted-transport/whole-document-transport.d.ts.map +1 -1
- package/dist/hosted-transport/whole-document-transport.js +20 -12
- package/dist/hosted-transport/whole-document-transport.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/kind-authoring.d.ts +170 -0
- package/dist/kind-authoring.d.ts.map +1 -0
- package/dist/kind-authoring.js +451 -0
- package/dist/kind-authoring.js.map +1 -0
- package/dist/kind-conformance-error.d.ts +15 -0
- package/dist/kind-conformance-error.d.ts.map +1 -0
- package/dist/kind-conformance-error.js +20 -0
- package/dist/kind-conformance-error.js.map +1 -0
- package/dist/kinds-load.js +4 -4
- package/dist/kinds-load.js.map +1 -1
- package/dist/kinds.d.ts +2 -0
- package/dist/kinds.d.ts.map +1 -1
- package/dist/kinds.js +10 -2
- package/dist/kinds.js.map +1 -1
- package/dist/paths.d.ts +16 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +25 -0
- package/dist/paths.js.map +1 -1
- package/dist/query-filter.d.ts +9 -0
- package/dist/query-filter.d.ts.map +1 -1
- package/dist/query-filter.js +19 -3
- package/dist/query-filter.js.map +1 -1
- package/dist/recipe-lifecycle/stamp.d.ts +11 -0
- package/dist/recipe-lifecycle/stamp.d.ts.map +1 -1
- package/dist/recipe-lifecycle/stamp.js +6 -0
- package/dist/recipe-lifecycle/stamp.js.map +1 -1
- package/dist/record-overlay/apply.d.ts +43 -0
- package/dist/record-overlay/apply.d.ts.map +1 -0
- package/dist/record-overlay/apply.js +527 -0
- package/dist/record-overlay/apply.js.map +1 -0
- package/dist/record-overlay/canonical.d.ts +22 -0
- package/dist/record-overlay/canonical.d.ts.map +1 -0
- package/dist/record-overlay/canonical.js +47 -0
- package/dist/record-overlay/canonical.js.map +1 -0
- package/dist/record-overlay/digest.d.ts +4 -0
- package/dist/record-overlay/digest.d.ts.map +1 -0
- package/dist/record-overlay/digest.js +11 -0
- package/dist/record-overlay/digest.js.map +1 -0
- package/dist/record-overlay/errors.d.ts +44 -0
- package/dist/record-overlay/errors.d.ts.map +1 -0
- package/dist/record-overlay/errors.js +55 -0
- package/dist/record-overlay/errors.js.map +1 -0
- package/dist/record-overlay/findings.d.ts +5 -0
- package/dist/record-overlay/findings.d.ts.map +1 -0
- package/dist/record-overlay/findings.js +83 -0
- package/dist/record-overlay/findings.js.map +1 -0
- package/dist/record-overlay/index.d.ts +23 -0
- package/dist/record-overlay/index.d.ts.map +1 -0
- package/dist/record-overlay/index.js +21 -0
- package/dist/record-overlay/index.js.map +1 -0
- package/dist/record-overlay/plan.d.ts +12 -0
- package/dist/record-overlay/plan.d.ts.map +1 -0
- package/dist/record-overlay/plan.js +285 -0
- package/dist/record-overlay/plan.js.map +1 -0
- package/dist/record-overlay/policy.d.ts +69 -0
- package/dist/record-overlay/policy.d.ts.map +1 -0
- package/dist/record-overlay/policy.js +228 -0
- package/dist/record-overlay/policy.js.map +1 -0
- package/dist/record-overlay/redact.d.ts +3 -0
- package/dist/record-overlay/redact.d.ts.map +1 -0
- package/dist/record-overlay/redact.js +27 -0
- package/dist/record-overlay/redact.js.map +1 -0
- package/dist/record-overlay/signal-kind.d.ts +30 -0
- package/dist/record-overlay/signal-kind.d.ts.map +1 -0
- package/dist/record-overlay/signal-kind.js +38 -0
- package/dist/record-overlay/signal-kind.js.map +1 -0
- package/dist/record-overlay/signal-text.d.ts +45 -0
- package/dist/record-overlay/signal-text.d.ts.map +1 -0
- package/dist/record-overlay/signal-text.js +116 -0
- package/dist/record-overlay/signal-text.js.map +1 -0
- package/dist/record-overlay/source-index.d.ts +19 -0
- package/dist/record-overlay/source-index.d.ts.map +1 -0
- package/dist/record-overlay/source-index.js +102 -0
- package/dist/record-overlay/source-index.js.map +1 -0
- package/dist/record-overlay/types.d.ts +291 -0
- package/dist/record-overlay/types.d.ts.map +1 -0
- package/dist/record-overlay/types.js +2 -0
- package/dist/record-overlay/types.js.map +1 -0
- package/dist/remote-operations.js +5 -2
- package/dist/remote-operations.js.map +1 -1
- package/dist/search/contract.d.ts +151 -0
- package/dist/search/contract.d.ts.map +1 -0
- package/dist/search/contract.js +78 -0
- package/dist/search/contract.js.map +1 -0
- package/dist/search/errors.d.ts +30 -0
- package/dist/search/errors.d.ts.map +1 -0
- package/dist/search/errors.js +50 -0
- package/dist/search/errors.js.map +1 -0
- package/dist/search/identity.d.ts +12 -0
- package/dist/search/identity.d.ts.map +1 -0
- package/dist/search/identity.js +90 -0
- package/dist/search/identity.js.map +1 -0
- package/dist/search/index.d.ts +15 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +14 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/memory-source.d.ts +25 -0
- package/dist/search/memory-source.d.ts.map +1 -0
- package/dist/search/memory-source.js +230 -0
- package/dist/search/memory-source.js.map +1 -0
- package/dist/search/rank.d.ts +34 -0
- package/dist/search/rank.d.ts.map +1 -0
- package/dist/search/rank.js +129 -0
- package/dist/search/rank.js.map +1 -0
- package/dist/search/row-text.d.ts +38 -0
- package/dist/search/row-text.d.ts.map +1 -0
- package/dist/search/row-text.js +88 -0
- package/dist/search/row-text.js.map +1 -0
- package/dist/search/search.d.ts +28 -0
- package/dist/search/search.d.ts.map +1 -0
- package/dist/search/search.js +240 -0
- package/dist/search/search.js.map +1 -0
- package/dist/search/source.d.ts +67 -0
- package/dist/search/source.d.ts.map +1 -0
- package/dist/search/source.js +2 -0
- package/dist/search/source.js.map +1 -0
- package/dist/search/text.d.ts +47 -0
- package/dist/search/text.d.ts.map +1 -0
- package/dist/search/text.js +148 -0
- package/dist/search/text.js.map +1 -0
- package/dist/source-engine/guard.d.ts +82 -0
- package/dist/source-engine/guard.d.ts.map +1 -0
- package/dist/source-engine/guard.js +396 -0
- package/dist/source-engine/guard.js.map +1 -0
- package/dist/source-engine/index.d.ts +24 -0
- package/dist/source-engine/index.d.ts.map +1 -0
- package/dist/source-engine/index.js +20 -0
- package/dist/source-engine/index.js.map +1 -0
- package/dist/source-engine/machine-state.d.ts +74 -0
- package/dist/source-engine/machine-state.d.ts.map +1 -0
- package/dist/source-engine/machine-state.js +48 -0
- package/dist/source-engine/machine-state.js.map +1 -0
- package/dist/source-engine/observe.d.ts +18 -0
- package/dist/source-engine/observe.d.ts.map +1 -0
- package/dist/source-engine/observe.js +598 -0
- package/dist/source-engine/observe.js.map +1 -0
- package/dist/source-engine/robots.d.ts +53 -0
- package/dist/source-engine/robots.d.ts.map +1 -0
- package/dist/source-engine/robots.js +158 -0
- package/dist/source-engine/robots.js.map +1 -0
- package/dist/source-engine/types.d.ts +285 -0
- package/dist/source-engine/types.d.ts.map +1 -0
- package/dist/source-engine/types.js +2 -0
- package/dist/source-engine/types.js.map +1 -0
- package/dist/source-harness/conformance.d.ts +16 -0
- package/dist/source-harness/conformance.d.ts.map +1 -0
- package/dist/source-harness/conformance.js +265 -0
- package/dist/source-harness/conformance.js.map +1 -0
- package/dist/source-harness/fixture.d.ts +95 -0
- package/dist/source-harness/fixture.d.ts.map +1 -0
- package/dist/source-harness/fixture.js +261 -0
- package/dist/source-harness/fixture.js.map +1 -0
- package/dist/source-harness/index.d.ts +22 -0
- package/dist/source-harness/index.d.ts.map +1 -0
- package/dist/source-harness/index.js +19 -0
- package/dist/source-harness/index.js.map +1 -0
- package/dist/source-harness/peer.d.ts +74 -0
- package/dist/source-harness/peer.d.ts.map +1 -0
- package/dist/source-harness/peer.js +106 -0
- package/dist/source-harness/peer.js.map +1 -0
- package/dist/storage.d.ts +2 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +1 -1
- package/dist/storage.js.map +1 -1
- package/dist/uncertain-write.d.ts +39 -6
- package/dist/uncertain-write.d.ts.map +1 -1
- package/dist/uncertain-write.js +25 -3
- package/dist/uncertain-write.js.map +1 -1
- package/package.json +33 -1
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The transport conformance suite. The engine's guard cannot see headers a transport adds after
|
|
3
|
+
* it, so every transport proves against a scripted peer that it sends the credential only when the
|
|
4
|
+
* engine's `credentialHost` and its own exact host match agree (lookalike hosts included), returns
|
|
5
|
+
* redirects unfollowed and refuses a body over the bound, and, behind the engine, that a
|
|
6
|
+
* cross-host or private-address redirect reaches nothing. It returns rows rather than asserting,
|
|
7
|
+
* so it runs under any test runner.
|
|
8
|
+
*/
|
|
9
|
+
import { bindSourceFeed, credentialHosts, parseConnectorDoc } from "../connectors.js";
|
|
10
|
+
import { buildKindRegistry } from "../kinds.js";
|
|
11
|
+
import { MemoryMachineState } from "../source-engine/machine-state.js";
|
|
12
|
+
import { observeSource } from "../source-engine/observe.js";
|
|
13
|
+
import { fetchIdentity } from "../source-engine/robots.js";
|
|
14
|
+
import { ScriptedPeer } from "./peer.js";
|
|
15
|
+
export const CONFORMANCE_SCENARIOS = Object.freeze([
|
|
16
|
+
"credential-reaches-its-host",
|
|
17
|
+
"credential-stays-on-its-host",
|
|
18
|
+
"redirect-returned-unfollowed",
|
|
19
|
+
"cross-host-redirect-refused",
|
|
20
|
+
"body-over-bound-refused",
|
|
21
|
+
"private-redirect-refused",
|
|
22
|
+
]);
|
|
23
|
+
const CREDENTIAL_HOST = "api.github.com";
|
|
24
|
+
const KEYLESS_HOST = "feeds.example.org";
|
|
25
|
+
const OUTSIDE_HOST = "collector.example.net";
|
|
26
|
+
const PROBE = "conformance-probe";
|
|
27
|
+
const IDENTITY = fetchIdentity("SuperbeeConformance/1 (+https://superbee.example.org/conformance)");
|
|
28
|
+
const PRIVATE_TARGETS = Object.freeze([
|
|
29
|
+
"https://127.0.0.1/latest",
|
|
30
|
+
"https://10.0.0.5/internal",
|
|
31
|
+
"https://[::1]/x",
|
|
32
|
+
"https://[::ffff:127.0.0.1]/x",
|
|
33
|
+
"https://169.254.169.254/latest/meta-data/",
|
|
34
|
+
"https://metadata.google.internal/computeMetadata/v1/",
|
|
35
|
+
"https://localhost/x",
|
|
36
|
+
"https://api.github.com:8443/x",
|
|
37
|
+
"http://api.github.com/x",
|
|
38
|
+
]);
|
|
39
|
+
/**
|
|
40
|
+
* Requests that must never carry the credential: hosts that only look like the credential host,
|
|
41
|
+
* whatever the engine says, and the credential host itself when the engine says it is not one.
|
|
42
|
+
*/
|
|
43
|
+
const CREDENTIAL_PROBES = Object.freeze([
|
|
44
|
+
{ name: "a declared keyless host", url: `https://${KEYLESS_HOST}/feed.json`, credentialHost: true },
|
|
45
|
+
{ name: "an undeclared host", url: `https://${OUTSIDE_HOST}/collect`, credentialHost: true },
|
|
46
|
+
{ name: "the credential host over http", url: `http://${CREDENTIAL_HOST}/repos/octo/probe/issues`, credentialHost: true },
|
|
47
|
+
{ name: "a host starting with the credential host", url: `https://${CREDENTIAL_HOST}.${OUTSIDE_HOST}/x`, credentialHost: true },
|
|
48
|
+
{ name: "a host ending with the credential host without a dot", url: `https://evil${CREDENTIAL_HOST}/x`, credentialHost: true },
|
|
49
|
+
{ name: "the credential host with a trailing dot", url: `https://${CREDENTIAL_HOST}./x`, credentialHost: true },
|
|
50
|
+
{ name: "the credential host as userinfo", url: `https://${CREDENTIAL_HOST}@${OUTSIDE_HOST}/x`, credentialHost: true },
|
|
51
|
+
{ name: "the credential host on another port", url: `https://${CREDENTIAL_HOST}:8443/x`, credentialHost: true },
|
|
52
|
+
{ name: "the credential host when the engine says otherwise", url: `https://${CREDENTIAL_HOST}/repos/octo/probe/issues`, credentialHost: false },
|
|
53
|
+
]);
|
|
54
|
+
const record = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
55
|
+
/** Requests the probe profile makes: one GET of `spec.url`, its host and `spec.also` declared. */
|
|
56
|
+
const probe = {
|
|
57
|
+
id: PROBE,
|
|
58
|
+
version: 1,
|
|
59
|
+
kind: "generic",
|
|
60
|
+
validateSpec(spec) {
|
|
61
|
+
if (!record(spec) || typeof spec.url !== "string")
|
|
62
|
+
return { ok: false, errors: [{ path: "/url", message: "is a URL" }] };
|
|
63
|
+
const also = Array.isArray(spec.also) ? spec.also.filter((host) => typeof host === "string") : [];
|
|
64
|
+
return { ok: true, spec: { url: spec.url, also } };
|
|
65
|
+
},
|
|
66
|
+
hostsFor: (spec) => [new URL(spec.url).hostname, ...spec.also],
|
|
67
|
+
async observe({ spec, transport }) {
|
|
68
|
+
await transport.request({ url: spec.url, headers: { accept: "application/json" } });
|
|
69
|
+
return { records: [], nextCursor: null, more: false, complete: false };
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
let world;
|
|
73
|
+
function probeWorld() {
|
|
74
|
+
if (world)
|
|
75
|
+
return world;
|
|
76
|
+
const registry = buildKindRegistry([{ id: "conventions/probe", body: "", frontmatter: { type: "Convention", title: "Probe", governs: "Probe", fields: { required: ["title"] } } }], [], { okfVersion: "0.2" });
|
|
77
|
+
const parsed = parseConnectorDoc({ id: "connectors/conformance", body: "", frontmatter: {
|
|
78
|
+
type: "Connector", title: "Transport conformance probe", auth: { kind: "token", provider: "github" }, domains: [KEYLESS_HOST],
|
|
79
|
+
sources: [{ name: "probe", profile: PROBE, target_kind: "Probe", identity: { resource: `https://${CREDENTIAL_HOST}/repos/{owner}/{repo}`, id: "{id}" }, fields: { title: "title" }, completeness: "complete" }],
|
|
80
|
+
} }, { kinds: registry });
|
|
81
|
+
if (!parsed.ok)
|
|
82
|
+
throw new Error(`conformance connector refused: ${parsed.errors.map((e) => e.code).join(", ")}`);
|
|
83
|
+
const bound = bindSourceFeed(parsed.connector, { id: "source-feeds/conformance", frontmatter: {
|
|
84
|
+
type: "Source Feed", connector: parsed.connector.id, source: "probe", url: `https://${CREDENTIAL_HOST}/repos/octo/probe`, owned_fields: ["title"],
|
|
85
|
+
} }, registry, { okfVersion: "0.2" });
|
|
86
|
+
return (world = { connector: parsed.connector, bound });
|
|
87
|
+
}
|
|
88
|
+
const CREDENTIALS = () => [
|
|
89
|
+
{ hosts: credentialHosts({ kind: "token", provider: "github" }), header: "authorization", value: "Bearer conformance-secret-1" },
|
|
90
|
+
// A provider's own header (Vagaro's `accessToken`), so a check on `authorization` alone cannot pass.
|
|
91
|
+
{ hosts: credentialHosts({ kind: "token", provider: "github" }), header: "accessToken", value: "conformance-secret-2" },
|
|
92
|
+
];
|
|
93
|
+
/**
|
|
94
|
+
* Whether a request carries the credential anywhere: a header, the URL (decoded, so an encoded
|
|
95
|
+
* copy counts) or the body. The secret is the value's last word, so `Bearer x` is found as `x`.
|
|
96
|
+
*/
|
|
97
|
+
function carries(request, credential) {
|
|
98
|
+
const secret = credential.value.split(/\s+/).at(-1);
|
|
99
|
+
let url = request.url;
|
|
100
|
+
try {
|
|
101
|
+
url = decodeURIComponent(request.url.replaceAll("+", " "));
|
|
102
|
+
}
|
|
103
|
+
catch { /* keep the raw URL */ }
|
|
104
|
+
return [...Object.values(request.headers), url, request.url, request.body ?? ""].some((text) => text.includes(secret));
|
|
105
|
+
}
|
|
106
|
+
/** Every request that carried the credential's value toward a host it does not belong to. */
|
|
107
|
+
function leaks(peer, credential) {
|
|
108
|
+
return peer.received.filter((request) => {
|
|
109
|
+
const url = new URL(request.url);
|
|
110
|
+
const allowed = url.protocol === "https:" && credential.hosts.includes(url.hostname);
|
|
111
|
+
return !allowed && carries(request, credential);
|
|
112
|
+
}).map((request) => `${request.method} ${request.url}`);
|
|
113
|
+
}
|
|
114
|
+
const answer = (routes) => (request) => {
|
|
115
|
+
const url = new URL(request.url);
|
|
116
|
+
if (url.pathname === "/robots.txt")
|
|
117
|
+
return { status: 404, body: "" };
|
|
118
|
+
return routes[`${url.origin}${url.pathname}`] ?? { status: 404, body: "" };
|
|
119
|
+
};
|
|
120
|
+
async function throughEngine(target, credential, routes, spec, maxBytes) {
|
|
121
|
+
const { connector, bound } = probeWorld();
|
|
122
|
+
const peer = new ScriptedPeer(answer(routes));
|
|
123
|
+
const receipt = await observeSource({
|
|
124
|
+
connector, bound, profile: probe, spec, transport: target.create(peer, credential), state: new MemoryMachineState(), identity: IDENTITY,
|
|
125
|
+
mode: "complete", budget: { requests: 20, ...(maxBytes !== undefined ? { maxBytes } : {}) }, commit: async () => { },
|
|
126
|
+
});
|
|
127
|
+
return { receipt, peer };
|
|
128
|
+
}
|
|
129
|
+
async function direct(transport, url, options = {}) {
|
|
130
|
+
try {
|
|
131
|
+
return await transport.request({ url, method: "GET", headers: { accept: "application/json" }, maxBytes: options.maxBytes ?? 4096, credentialHost: options.credentialHost ?? false });
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const CHECKS = {
|
|
138
|
+
async "credential-reaches-its-host"(target) {
|
|
139
|
+
const problems = [];
|
|
140
|
+
for (const credential of CREDENTIALS()) {
|
|
141
|
+
const peer = new ScriptedPeer(() => ({ status: 200, body: "[]" }));
|
|
142
|
+
await direct(target.create(peer, credential), `https://${CREDENTIAL_HOST}/repos/octo/probe/issues`, { credentialHost: true });
|
|
143
|
+
const sent = peer.received[0]?.headers[credential.header.toLowerCase()];
|
|
144
|
+
if (sent !== credential.value)
|
|
145
|
+
problems.push(`the ${credential.header} credential did not reach ${CREDENTIAL_HOST}`);
|
|
146
|
+
const { peer: engine } = await throughEngine(target, credential, { [`https://${CREDENTIAL_HOST}/x`]: { status: 200, body: "{}" } }, { url: `https://${CREDENTIAL_HOST}/x` });
|
|
147
|
+
if (engine.received[0]?.headers[credential.header.toLowerCase()] !== credential.value)
|
|
148
|
+
problems.push(`behind the engine the ${credential.header} credential did not reach ${CREDENTIAL_HOST}`);
|
|
149
|
+
}
|
|
150
|
+
return problems;
|
|
151
|
+
},
|
|
152
|
+
async "credential-stays-on-its-host"(target) {
|
|
153
|
+
const problems = [];
|
|
154
|
+
for (const credential of CREDENTIALS()) {
|
|
155
|
+
const peer = new ScriptedPeer(() => ({ status: 200, body: "[]" }));
|
|
156
|
+
const transport = target.create(peer, credential);
|
|
157
|
+
for (const probe of CREDENTIAL_PROBES) {
|
|
158
|
+
const before = peer.received.length;
|
|
159
|
+
await direct(transport, probe.url, { credentialHost: probe.credentialHost });
|
|
160
|
+
const carried = peer.received.slice(before).filter((request) => carries(request, credential));
|
|
161
|
+
if (carried.length)
|
|
162
|
+
problems.push(`${credential.header} sent toward ${probe.name}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return problems;
|
|
166
|
+
},
|
|
167
|
+
async "redirect-returned-unfollowed"(target) {
|
|
168
|
+
const [credential] = CREDENTIALS();
|
|
169
|
+
const peer = new ScriptedPeer(answer({
|
|
170
|
+
[`https://${CREDENTIAL_HOST}/a`]: { status: 302, headers: { Location: `https://${CREDENTIAL_HOST}/b` }, body: "" },
|
|
171
|
+
[`https://${CREDENTIAL_HOST}/b`]: { status: 200, body: "{}" },
|
|
172
|
+
}));
|
|
173
|
+
const result = await direct(target.create(peer, credential), `https://${CREDENTIAL_HOST}/a`, { credentialHost: true });
|
|
174
|
+
const problems = [];
|
|
175
|
+
if (result instanceof Error || !result.ok || result.status !== 302)
|
|
176
|
+
problems.push("the 302 was not returned as the answer");
|
|
177
|
+
else if (result.headers.location !== `https://${CREDENTIAL_HOST}/b`)
|
|
178
|
+
problems.push("the 302's location header was not returned under a lowercase name");
|
|
179
|
+
if (peer.received.length !== 1)
|
|
180
|
+
problems.push(`the transport sent ${peer.received.length} requests for one call`);
|
|
181
|
+
return problems;
|
|
182
|
+
},
|
|
183
|
+
async "cross-host-redirect-refused"(target) {
|
|
184
|
+
const problems = [];
|
|
185
|
+
const cases = [
|
|
186
|
+
{ name: "credential host to an undeclared host", from: `https://${CREDENTIAL_HOST}/x`, to: `https://${OUTSIDE_HOST}/steal` },
|
|
187
|
+
{ name: "keyless host to an undeclared host", from: `https://${KEYLESS_HOST}/x`, to: `https://${OUTSIDE_HOST}/steal` },
|
|
188
|
+
{ name: "credential host to a declared keyless host", from: `https://${CREDENTIAL_HOST}/x`, to: `https://${KEYLESS_HOST}/y`, also: [KEYLESS_HOST] },
|
|
189
|
+
{ name: "declared keyless host to the credential host", from: `https://${KEYLESS_HOST}/x`, to: `https://${CREDENTIAL_HOST}/y`, also: [CREDENTIAL_HOST] },
|
|
190
|
+
];
|
|
191
|
+
for (const credential of CREDENTIALS()) {
|
|
192
|
+
for (const c of cases) {
|
|
193
|
+
const toHost = new URL(c.to).hostname;
|
|
194
|
+
const { receipt, peer } = await throughEngine(target, credential, {
|
|
195
|
+
[c.from]: { status: 302, headers: { location: c.to }, body: "" },
|
|
196
|
+
[c.to]: { status: 200, body: "{}" },
|
|
197
|
+
}, { url: c.from, ...(c.also ? { also: c.also } : {}) });
|
|
198
|
+
const reached = peer.received.filter((request) => request.url.startsWith(c.to)).length;
|
|
199
|
+
if (receipt.outcome !== "refused")
|
|
200
|
+
problems.push(`${c.name}: the run ended ${receipt.outcome}, not refused`);
|
|
201
|
+
if (reached)
|
|
202
|
+
problems.push(`${c.name}: ${reached} request(s) reached ${toHost}`);
|
|
203
|
+
for (const leak of leaks(peer, credential))
|
|
204
|
+
problems.push(`${c.name}: ${credential.header} sent with ${leak}`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return problems;
|
|
208
|
+
},
|
|
209
|
+
async "body-over-bound-refused"(target) {
|
|
210
|
+
const [credential] = CREDENTIALS();
|
|
211
|
+
const problems = [];
|
|
212
|
+
// 600 characters, 1200 bytes: a bound read in characters would pass it.
|
|
213
|
+
const over = "é".repeat(600);
|
|
214
|
+
const exact = "a".repeat(1000);
|
|
215
|
+
const peer = new ScriptedPeer(answer({
|
|
216
|
+
[`https://${CREDENTIAL_HOST}/over`]: { status: 200, body: over },
|
|
217
|
+
[`https://${CREDENTIAL_HOST}/exact`]: { status: 200, body: exact },
|
|
218
|
+
}));
|
|
219
|
+
const transport = target.create(peer, credential);
|
|
220
|
+
const refused = await direct(transport, `https://${CREDENTIAL_HOST}/over`, { maxBytes: 1000, credentialHost: true });
|
|
221
|
+
if (refused instanceof Error || refused.ok || refused.refused !== "too_large")
|
|
222
|
+
problems.push("a 1200-byte body under a 1000-byte bound was not refused as too_large");
|
|
223
|
+
const admitted = await direct(transport, `https://${CREDENTIAL_HOST}/exact`, { maxBytes: 1000, credentialHost: true });
|
|
224
|
+
if (admitted instanceof Error || !admitted.ok || admitted.body !== exact || admitted.bytes !== 1000)
|
|
225
|
+
problems.push("a body exactly at the bound was not returned whole");
|
|
226
|
+
const { receipt } = await throughEngine(target, credential, { [`https://${CREDENTIAL_HOST}/over`]: { status: 200, body: over } }, { url: `https://${CREDENTIAL_HOST}/over` }, 1000);
|
|
227
|
+
if (receipt.outcome !== "too_large")
|
|
228
|
+
problems.push(`behind the engine the run ended ${receipt.outcome}, not too_large`);
|
|
229
|
+
return problems;
|
|
230
|
+
},
|
|
231
|
+
async "private-redirect-refused"(target) {
|
|
232
|
+
const [credential] = CREDENTIALS();
|
|
233
|
+
const problems = [];
|
|
234
|
+
for (const from of [`https://${CREDENTIAL_HOST}/x`, `https://${KEYLESS_HOST}/x`]) {
|
|
235
|
+
for (const to of PRIVATE_TARGETS) {
|
|
236
|
+
const { receipt, peer } = await throughEngine(target, credential, { [from]: { status: 302, headers: { location: to }, body: "" } }, { url: from });
|
|
237
|
+
const toUrl = new URL(to);
|
|
238
|
+
const reached = peer.received.filter((request) => {
|
|
239
|
+
const url = new URL(request.url);
|
|
240
|
+
return url.hostname === toUrl.hostname && url.port === toUrl.port && url.protocol === toUrl.protocol;
|
|
241
|
+
}).length;
|
|
242
|
+
if (receipt.outcome !== "refused")
|
|
243
|
+
problems.push(`${from} to ${to}: the run ended ${receipt.outcome}, not refused`);
|
|
244
|
+
if (reached)
|
|
245
|
+
problems.push(`${from} to ${to}: ${reached} request(s) reached it`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return problems;
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
/** Run every conformance scenario against one transport. */
|
|
252
|
+
export async function runTransportConformance(target) {
|
|
253
|
+
const rows = [];
|
|
254
|
+
for (const scenario of CONFORMANCE_SCENARIOS) {
|
|
255
|
+
try {
|
|
256
|
+
const problems = await CHECKS[scenario](target);
|
|
257
|
+
rows.push(problems.length ? { scenario, ok: false, detail: problems.join("; ") } : { scenario, ok: true });
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
rows.push({ scenario, ok: false, detail: `threw: ${error instanceof Error ? error.message : String(error)}` });
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return rows;
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=conformance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance.js","sourceRoot":"","sources":["../../src/source-harness/conformance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fixture harness: replay a profile's scripted provider answers through the engine, map and
|
|
3
|
+
* write each committed page through record-overlay over a MemoryBackend bundle, and check each
|
|
4
|
+
* required scenario's outcome rule. The rules are profile-independent, so one list holds every
|
|
5
|
+
* profile, generic or extension, to the same behaviour.
|
|
6
|
+
*/
|
|
7
|
+
import { type Connector } from "../connectors.js";
|
|
8
|
+
import type { OverlayReceipt, RecordChange } from "../record-overlay/types.js";
|
|
9
|
+
import { type SourceState } from "../source-engine/machine-state.js";
|
|
10
|
+
import { type FetchIdentity } from "../source-engine/robots.js";
|
|
11
|
+
import type { SourceBudget, SourceProfile, SourceRunReceipt } from "../source-engine/types.js";
|
|
12
|
+
import type { ConceptId, Frontmatter, OkfDocument } from "../types.js";
|
|
13
|
+
import { type PeerRequest, type ScriptedExchange, type TransportCredential } from "./peer.js";
|
|
14
|
+
/** Every profile's fixture includes these; a name may add a variant after a dot (`cursor.resume.page-number`). */
|
|
15
|
+
export declare const REQUIRED_SCENARIOS: readonly ["errors.auth", "errors.rate-limit", "errors.server", "errors.malformed", "page.incomplete", "cursor.resume", "cursor.hostile", "complete.disappear", "fields.owned-conflict", "fields.unmapped", "fields.null", "identity.missing", "hosts.redirect", "hosts.undeclared"];
|
|
16
|
+
export type RequiredScenario = (typeof REQUIRED_SCENARIOS)[number];
|
|
17
|
+
/** The required scenario a name counts toward, or undefined. */
|
|
18
|
+
export declare function scenarioBase(name: string): RequiredScenario | undefined;
|
|
19
|
+
/** Required scenarios no name covers. */
|
|
20
|
+
export declare function missingScenarios(names: Iterable<string>): RequiredScenario[];
|
|
21
|
+
export interface SourceFixture {
|
|
22
|
+
connector: Connector;
|
|
23
|
+
profile: SourceProfile<any, any>;
|
|
24
|
+
spec: unknown;
|
|
25
|
+
/**
|
|
26
|
+
* The bundle's starting documents: Conventions for the target Kind, `Signal` and `Source Feed`,
|
|
27
|
+
* the Source Feed, and any overlay documents.
|
|
28
|
+
*/
|
|
29
|
+
documents: readonly OkfDocument[];
|
|
30
|
+
feed: ConceptId;
|
|
31
|
+
identity?: FetchIdentity;
|
|
32
|
+
credential?: TransportCredential;
|
|
33
|
+
}
|
|
34
|
+
export interface SourceRunScript {
|
|
35
|
+
mode?: "incremental" | "complete";
|
|
36
|
+
/** The run's observation time; runs default to one hour apart. */
|
|
37
|
+
at?: string;
|
|
38
|
+
exchanges: readonly ScriptedExchange[];
|
|
39
|
+
/** Editor edits applied before the run. */
|
|
40
|
+
edits?: ReadonlyArray<{
|
|
41
|
+
id: ConceptId;
|
|
42
|
+
set: Record<string, unknown>;
|
|
43
|
+
}>;
|
|
44
|
+
budget?: Partial<SourceBudget>;
|
|
45
|
+
}
|
|
46
|
+
export interface SourceScenario {
|
|
47
|
+
name: string;
|
|
48
|
+
/** Replaces the fixture's spec for this scenario. */
|
|
49
|
+
spec?: unknown;
|
|
50
|
+
runs: readonly SourceRunScript[];
|
|
51
|
+
}
|
|
52
|
+
export interface ScenarioRun {
|
|
53
|
+
receipt: SourceRunReceipt;
|
|
54
|
+
/** Every change a commit carried, replays of pending changes included. */
|
|
55
|
+
changes: RecordChange[];
|
|
56
|
+
/** One record-overlay receipt per committed page. */
|
|
57
|
+
overlay: OverlayReceipt[];
|
|
58
|
+
/** The run's findings, written. */
|
|
59
|
+
findings: OverlayReceipt;
|
|
60
|
+
/** Requests that reached the provider. */
|
|
61
|
+
received: PeerRequest[];
|
|
62
|
+
unscripted: string[];
|
|
63
|
+
unused: ScriptedExchange[];
|
|
64
|
+
stateBefore: SourceState | null;
|
|
65
|
+
state: SourceState | null;
|
|
66
|
+
/** Every document's frontmatter after the run. */
|
|
67
|
+
documents: Record<string, Frontmatter>;
|
|
68
|
+
}
|
|
69
|
+
export interface ScenarioResult {
|
|
70
|
+
name: string;
|
|
71
|
+
base: RequiredScenario | undefined;
|
|
72
|
+
/** The declared hosts the scenario's spec may reach. */
|
|
73
|
+
hosts: string[];
|
|
74
|
+
threshold: number;
|
|
75
|
+
edits: Array<{
|
|
76
|
+
run: number;
|
|
77
|
+
id: ConceptId;
|
|
78
|
+
set: Record<string, unknown>;
|
|
79
|
+
}>;
|
|
80
|
+
runs: ScenarioRun[];
|
|
81
|
+
}
|
|
82
|
+
/** Run one scenario's runs in order over one fresh bundle and one machine state. */
|
|
83
|
+
export declare function runSourceScenario(fixture: SourceFixture, scenario: SourceScenario): Promise<ScenarioResult>;
|
|
84
|
+
/**
|
|
85
|
+
* The problems with one scenario's result: its required outcome rule, plus for every scenario no
|
|
86
|
+
* request to a host outside the declared set and no request the fixture did not script.
|
|
87
|
+
*/
|
|
88
|
+
export declare function checkScenario(result: ScenarioResult): string[];
|
|
89
|
+
/** Run every scenario of a fixture, check each, and list the required scenarios it lacks. */
|
|
90
|
+
export declare function runSourceFixture(fixture: SourceFixture, scenarios: readonly SourceScenario[]): Promise<{
|
|
91
|
+
results: ScenarioResult[];
|
|
92
|
+
problems: Record<string, string[]>;
|
|
93
|
+
missing: RequiredScenario[];
|
|
94
|
+
}>;
|
|
95
|
+
//# sourceMappingURL=fixture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../../src/source-harness/fixture.ts"],"names":[],"mappings":"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"}
|