@whooshbang/contract-mock 1.0.0-rc.16
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/CHANGELOG.md +141 -0
- package/LICENSE +21 -0
- package/README.md +173 -0
- package/dist/app.d.ts +8 -0
- package/dist/app.js +16 -0
- package/dist/app.js.map +1 -0
- package/dist/cli.d.ts +26 -0
- package/dist/cli.js +249 -0
- package/dist/cli.js.map +1 -0
- package/dist/control-surface.d.ts +13 -0
- package/dist/control-surface.js +158 -0
- package/dist/control-surface.js.map +1 -0
- package/dist/core.d.ts +33 -0
- package/dist/core.js +3459 -0
- package/dist/core.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction-control.d.ts +6 -0
- package/dist/interaction-control.js +76 -0
- package/dist/interaction-control.js.map +1 -0
- package/dist/scenarios.d.ts +14 -0
- package/dist/scenarios.js +73 -0
- package/dist/scenarios.js.map +1 -0
- package/dist/types.d.ts +203 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +9 -0
- package/dist/worker.js +10 -0
- package/dist/worker.js.map +1 -0
- package/package.json +67 -0
- package/scenarios/v1/manifest.json +31 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { parseInteractionControlInput } from "./interaction-control.js";
|
|
2
|
+
const MAX_CONTROL_REQUEST_BYTES = 64 * 1024;
|
|
3
|
+
async function timingSafeTokenEqual(supplied, expected) {
|
|
4
|
+
try {
|
|
5
|
+
const encoder = new TextEncoder();
|
|
6
|
+
const comparisonInput = encoder.encode("whooshbang.contract-mock.control.v1");
|
|
7
|
+
const [suppliedKey, expectedKey] = await Promise.all([
|
|
8
|
+
globalThis.crypto.subtle.importKey("raw", encoder.encode(supplied), { hash: "SHA-256", name: "HMAC" }, false, ["sign"]),
|
|
9
|
+
globalThis.crypto.subtle.importKey("raw", encoder.encode(expected), { hash: "SHA-256", name: "HMAC" }, false, ["verify"]),
|
|
10
|
+
]);
|
|
11
|
+
const suppliedMac = await globalThis.crypto.subtle.sign("HMAC", suppliedKey, comparisonInput);
|
|
12
|
+
return await globalThis.crypto.subtle.verify("HMAC", expectedKey, suppliedMac, comparisonInput);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async function readControlJson(request) {
|
|
19
|
+
const reader = request.body?.getReader();
|
|
20
|
+
if (reader === undefined) {
|
|
21
|
+
throw new TypeError("A JSON body is required.");
|
|
22
|
+
}
|
|
23
|
+
const chunks = [];
|
|
24
|
+
let length = 0;
|
|
25
|
+
try {
|
|
26
|
+
for (;;) {
|
|
27
|
+
const result = await reader.read();
|
|
28
|
+
if (result.done) {
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
length += result.value.byteLength;
|
|
32
|
+
if (length > MAX_CONTROL_REQUEST_BYTES) {
|
|
33
|
+
await reader.cancel();
|
|
34
|
+
throw new RangeError("The control request is too large.");
|
|
35
|
+
}
|
|
36
|
+
chunks.push(result.value);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
reader.releaseLock();
|
|
41
|
+
}
|
|
42
|
+
const bytes = new Uint8Array(length);
|
|
43
|
+
let offset = 0;
|
|
44
|
+
for (const chunk of chunks) {
|
|
45
|
+
bytes.set(chunk, offset);
|
|
46
|
+
offset += chunk.byteLength;
|
|
47
|
+
}
|
|
48
|
+
return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
49
|
+
}
|
|
50
|
+
function asRecord(value) {
|
|
51
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
52
|
+
throw new TypeError("The control request must be a JSON object.");
|
|
53
|
+
}
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
function isProviderOutcome(value) {
|
|
57
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
const record = value;
|
|
61
|
+
if (!["accepted", "retryable", "terminal", "ambiguous"].includes(String(record.kind))) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
return (record.retryAfterSeconds === undefined ||
|
|
65
|
+
(record.kind === "retryable" &&
|
|
66
|
+
typeof record.retryAfterSeconds === "number" &&
|
|
67
|
+
Number.isInteger(record.retryAfterSeconds) &&
|
|
68
|
+
record.retryAfterSeconds >= 0 &&
|
|
69
|
+
record.retryAfterSeconds <= 86_400));
|
|
70
|
+
}
|
|
71
|
+
function controlError(status, detail) {
|
|
72
|
+
return Response.json({
|
|
73
|
+
detail,
|
|
74
|
+
status,
|
|
75
|
+
title: status === 401
|
|
76
|
+
? "Control authentication required"
|
|
77
|
+
: "Invalid control request",
|
|
78
|
+
type: "about:blank",
|
|
79
|
+
}, { status });
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Mounts the CLI-only, test-only HTTP control surface. This module is not
|
|
83
|
+
* imported by either public package entry point or the Worker entry point.
|
|
84
|
+
*/
|
|
85
|
+
export function mountContractMockControlSurface(target, token) {
|
|
86
|
+
if (!/^[\u0021-\u007e]{8,4096}$/u.test(token)) {
|
|
87
|
+
throw new RangeError("The control token must be 8 to 4096 visible ASCII characters.");
|
|
88
|
+
}
|
|
89
|
+
target.app.use("/__contract-mock/*", async (context, next) => {
|
|
90
|
+
const supplied = context.req.header("whooshbang-contract-mock-token");
|
|
91
|
+
if (supplied === undefined ||
|
|
92
|
+
!/^[\u0021-\u007e]{8,4096}$/u.test(supplied) ||
|
|
93
|
+
!(await timingSafeTokenEqual(supplied, token))) {
|
|
94
|
+
return controlError(401, "Provide the explicit contract-mock control token.");
|
|
95
|
+
}
|
|
96
|
+
return next();
|
|
97
|
+
});
|
|
98
|
+
target.app.get("/__contract-mock/snapshot", (context) => context.json(target.inspect()));
|
|
99
|
+
target.app.post("/__contract-mock/reset", async (context) => {
|
|
100
|
+
try {
|
|
101
|
+
const body = asRecord(await readControlJson(context.req.raw));
|
|
102
|
+
if (typeof body.scenario !== "string") {
|
|
103
|
+
return controlError(400, "A scenario name is required.");
|
|
104
|
+
}
|
|
105
|
+
await target.control.reset(body.scenario);
|
|
106
|
+
return context.json(target.inspect());
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return controlError(400, "The reset request is invalid.");
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
target.app.post("/__contract-mock/provider-outcomes", async (context) => {
|
|
113
|
+
try {
|
|
114
|
+
const body = asRecord(await readControlJson(context.req.raw));
|
|
115
|
+
if (!Array.isArray(body.outcomes) ||
|
|
116
|
+
!body.outcomes.every(isProviderOutcome)) {
|
|
117
|
+
return controlError(400, "The provider outcome script is invalid.");
|
|
118
|
+
}
|
|
119
|
+
target.control.setProviderOutcomes(body.outcomes);
|
|
120
|
+
return context.json({ accepted: true });
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return controlError(400, "The provider outcome script is invalid.");
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
target.app.post("/__contract-mock/webhook-responses", async (context) => {
|
|
127
|
+
try {
|
|
128
|
+
const body = asRecord(await readControlJson(context.req.raw));
|
|
129
|
+
if (!Array.isArray(body.responses) ||
|
|
130
|
+
!body.responses.every((value) => value === "network_failure" ||
|
|
131
|
+
(typeof value === "number" &&
|
|
132
|
+
Number.isInteger(value) &&
|
|
133
|
+
value >= 100 &&
|
|
134
|
+
value <= 599))) {
|
|
135
|
+
return controlError(400, "The webhook response script is invalid.");
|
|
136
|
+
}
|
|
137
|
+
target.control.setWebhookResponses(body.responses);
|
|
138
|
+
return context.json({ accepted: true });
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return controlError(400, "The webhook response script is invalid.");
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
target.app.post("/__contract-mock/interactions", async (context) => {
|
|
145
|
+
try {
|
|
146
|
+
const input = parseInteractionControlInput(await readControlJson(context.req.raw));
|
|
147
|
+
return context.json(await target.control.submitInteraction(input));
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return controlError(400, "The interaction request is invalid.");
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
target.app.post("/__contract-mock/run-pending", async (context) => {
|
|
154
|
+
await target.control.runPending();
|
|
155
|
+
return context.json({ accepted: true });
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=control-surface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-surface.js","sourceRoot":"","sources":["../src/control-surface.ts"],"names":[],"mappings":"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"}
|
package/dist/core.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import type { WhooshBangContractMock, WhooshBangContractMockOptions } from "./types.js";
|
|
3
|
+
interface CoreWhooshBangContractMock extends WhooshBangContractMock {
|
|
4
|
+
readonly app: Hono;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* The synthetic project and environment identifiers the fixture project
|
|
8
|
+
* credentials authenticate against.
|
|
9
|
+
*
|
|
10
|
+
* Environment-scoped paths need an environment identifier that the bearer
|
|
11
|
+
* token alone does not carry, so consumers building customer-endpoint URLs
|
|
12
|
+
* read it from here rather than guessing.
|
|
13
|
+
*/
|
|
14
|
+
export declare const CONTRACT_MOCK_FIXTURE_ENVIRONMENTS: Readonly<{
|
|
15
|
+
readonly liveEnvironmentId: "environment_project_synthetic_live";
|
|
16
|
+
readonly projectId: "project_synthetic";
|
|
17
|
+
readonly testEnvironmentId: "environment_project_synthetic_test";
|
|
18
|
+
}>;
|
|
19
|
+
export declare const CONTRACT_MOCK_FIXTURE_CREDENTIALS: Readonly<{
|
|
20
|
+
readonly grant: "oauth-grant-token";
|
|
21
|
+
readonly humanSession: "human-session-token";
|
|
22
|
+
readonly otherGrant: "oauth-grant-other-token";
|
|
23
|
+
readonly liveProject: "project-live-token";
|
|
24
|
+
readonly machineA: "machine-a-token";
|
|
25
|
+
readonly machineB: "machine-b-token";
|
|
26
|
+
readonly otherHumanSession: "human-other-session-token";
|
|
27
|
+
readonly projectA: "project-a-token";
|
|
28
|
+
readonly projectB: "project-b-token";
|
|
29
|
+
readonly projectTest: "project-test-token";
|
|
30
|
+
readonly readOnly: "project-read-only-token";
|
|
31
|
+
}>;
|
|
32
|
+
export declare function createWhooshBangContractMockCore(options?: WhooshBangContractMockOptions): CoreWhooshBangContractMock;
|
|
33
|
+
export {};
|