@emseepea/testing 0.25.1 → 0.26.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 +67 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-event-store-conformance.d.ts +18 -0
- package/dist/mcp-event-store-conformance.d.ts.map +1 -0
- package/dist/mcp-event-store-conformance.js +203 -0
- package/dist/mcp-event-store-conformance.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -13,6 +13,60 @@ for setup, test structure, commands, and what a passing check proves.
|
|
|
13
13
|
Start from the [pea-variety conversation test](https://github.com/emseepea/emseepea/blob/main/examples/tool-server/eval/meaning.test.mjs).
|
|
14
14
|
Keep these tests in `eval/`, separate from ordinary tests in `test/`.
|
|
15
15
|
|
|
16
|
+
## Check an MCP Events store
|
|
17
|
+
|
|
18
|
+
Use `assertMcpEventStoreConformance` inside an ordinary `node:test` test to
|
|
19
|
+
check your implementation of the public `McpEventStore` interface. Supply a
|
|
20
|
+
factory for disposable synthetic storage; the helper does not provision a
|
|
21
|
+
database or install a storage adapter.
|
|
22
|
+
|
|
23
|
+
```js
|
|
24
|
+
import test from "node:test";
|
|
25
|
+
import { assertMcpEventStoreConformance } from "@emseepea/testing";
|
|
26
|
+
import { createEventStoreFixture } from "./fixtures/events-store.js";
|
|
27
|
+
|
|
28
|
+
test("event store contract", { timeout: 60_000 }, async () => {
|
|
29
|
+
await assertMcpEventStoreConformance(createEventStoreFixture);
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Implement `createEventStoreFixture` in your test support. Each call must return
|
|
34
|
+
fresh, empty storage and these callbacks:
|
|
35
|
+
|
|
36
|
+
- `open()` returns `{ store, close }`. Each handle accesses the same storage
|
|
37
|
+
within that fixture and closes independently.
|
|
38
|
+
- `dispose()` removes the fixture after all returned handles have been closed.
|
|
39
|
+
Closing every handle must allow a later `open()` on that fixture.
|
|
40
|
+
|
|
41
|
+
The factory is called separately for each scenario. It and `open()` must clean
|
|
42
|
+
up resources allocated before they reject. The helper joins started operations,
|
|
43
|
+
attempts every remaining close and then disposal, and retains categorized check
|
|
44
|
+
and cleanup errors. Backend error details are omitted. Use bounded backend
|
|
45
|
+
operations; a test timeout does not cancel them or guarantee cleanup.
|
|
46
|
+
|
|
47
|
+
Checks cover complete subscription writes, replacement, event-name isolation,
|
|
48
|
+
deletion, competing claims, retry fields, stale lease fencing, and persistence
|
|
49
|
+
through graceful close and reopen. They use explicit synthetic queue times.
|
|
50
|
+
The helper does not require full claim batches or a particular queue order.
|
|
51
|
+
|
|
52
|
+
`McpEventStoreConformanceError.code` is `MISMATCH` for an observed contract
|
|
53
|
+
violation, `CALLBACK_FAILED` for a fixture or backend failure, or `INCONCLUSIVE`
|
|
54
|
+
when bounded probing cannot obtain the queue records needed for a check.
|
|
55
|
+
Every outcome except completion rejects the promise. Do not convert an
|
|
56
|
+
inconclusive result into a passing test.
|
|
57
|
+
|
|
58
|
+
A pass covers the observed operations and fixture topology. Record whether
|
|
59
|
+
handles use one process or multiple processes. The maintained SQLite reference
|
|
60
|
+
uses two synchronous connections in one process; it does not prove overlapping
|
|
61
|
+
execution, crash recovery, or production durability.
|
|
62
|
+
|
|
63
|
+
The helper does not establish duplicate-enqueue policy, automatic expiry or
|
|
64
|
+
cleanup, safe concurrent renewal, business transaction atomicity, native client
|
|
65
|
+
execution, or production readiness. Runtime expiry and authorization need
|
|
66
|
+
separate tests. Use isolated synthetic fixtures, never production records.
|
|
67
|
+
|
|
68
|
+
## Test tool selection
|
|
69
|
+
|
|
16
70
|
Use `createConversation` inside an ordinary `node:test` test. Send one or more
|
|
17
71
|
user prompts, then assert exact tool calls and response meaning with the exported
|
|
18
72
|
semantic assertions.
|
|
@@ -643,8 +697,9 @@ days.
|
|
|
643
697
|
|
|
644
698
|
Import `@emseepea/testing/chatgpt` only when you want to test the real ChatGPT
|
|
645
699
|
web experience. Ordinary framework tests do not enable this adapter or install
|
|
646
|
-
Playwright. This is an experimental browser
|
|
647
|
-
|
|
700
|
+
Playwright. This is an experimental browser adapter: ChatGPT controls can
|
|
701
|
+
change, so adopters must qualify each capability they rely on against their
|
|
702
|
+
owned account and endpoint.
|
|
648
703
|
|
|
649
704
|
On your own machine, install the optional browser tooling:
|
|
650
705
|
|
|
@@ -785,6 +840,16 @@ Return ordered, run-scoped calls matching the declared method, target, outcome,
|
|
|
785
840
|
and optional result hash. Each call includes request/result SHA-256 values,
|
|
786
841
|
endpoint SHA-256, sequence, timestamp, and `nativeClient`.
|
|
787
842
|
|
|
843
|
+
Keep deterministic MCP qualification and native-host evidence separate.
|
|
844
|
+
Command-line qualification can prove a resource link's shape, catalogue
|
|
845
|
+
membership, exact `resources/read` result, and original bytes. A native ChatGPT
|
|
846
|
+
journey separately proves whether ChatGPT materializes or rejects that link.
|
|
847
|
+
|
|
848
|
+
Declare the expected `tools/call` and `resources/read` as distinct server calls.
|
|
849
|
+
If ChatGPT does not issue the expected read, record the checkpoint as
|
|
850
|
+
`incomplete` with category `server-observation-missing`; do not treat the
|
|
851
|
+
tool-returned URI as proof of a native resource read.
|
|
852
|
+
|
|
788
853
|
Set
|
|
789
854
|
`nativeClient: "verified-chatgpt"` only when your authenticated server boundary
|
|
790
855
|
establishes that the request came through the dedicated ChatGPT connection;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Client } from "@modelcontextprotocol/client";
|
|
2
2
|
import { serveEmseepea, type AuthenticationOptions } from "@emseepea/server";
|
|
3
|
+
export { assertMcpEventStoreConformance, McpEventStoreConformanceError, type McpEventStoreConformanceFixture, type McpEventStoreConformanceFixtureFactory, type McpEventStoreConformanceHandle, } from "./mcp-event-store-conformance.js";
|
|
3
4
|
export { createMcpAppHostSimulator, type McpAppHostSimulator, type McpAppHostSimulatorOptions, type McpAppMessageRequest, } from "./mcp-app-host.js";
|
|
4
5
|
export { assertPublishedMcpContractCompatible, comparePublishedMcpContracts, extractPublishedMcpContract, writePublishedMcpContractBaseline, type PublishedMcpContract, type PublishedMcpContractBaseline, type PublishedMcpContractBaselineInput, type PublishedMcpContractBreak, type PublishedMcpContractCheckPolicy, type PublishedMcpContractCheckPolicyInput, type PublishedMcpContractClient, type PublishedMcpResource, } from "./published-contract.js";
|
|
5
6
|
export { assertWcagContrast, wcagContrastRatio } from "./contrast.js";
|
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
|
@@ -2,6 +2,7 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import { fileURLToPath } from "node:url";
|
|
3
3
|
import { Client, StreamableHTTPClientTransport } from "@modelcontextprotocol/client";
|
|
4
4
|
import { serveEmseepea } from "@emseepea/server";
|
|
5
|
+
export { assertMcpEventStoreConformance, McpEventStoreConformanceError, } from "./mcp-event-store-conformance.js";
|
|
5
6
|
export { createMcpAppHostSimulator, } from "./mcp-app-host.js";
|
|
6
7
|
export { assertPublishedMcpContractCompatible, comparePublishedMcpContracts, extractPublishedMcpContract, writePublishedMcpContractBaseline, } from "./published-contract.js";
|
|
7
8
|
export { assertWcagContrast, wcagContrastRatio } from "./contrast.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { McpEventStore } from "@emseepea/server";
|
|
2
|
+
export interface McpEventStoreConformanceHandle {
|
|
3
|
+
readonly store: McpEventStore;
|
|
4
|
+
close(): void | Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export interface McpEventStoreConformanceFixture {
|
|
7
|
+
open(): McpEventStoreConformanceHandle | Promise<McpEventStoreConformanceHandle>;
|
|
8
|
+
dispose(): void | Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export type McpEventStoreConformanceFixtureFactory = () => McpEventStoreConformanceFixture | Promise<McpEventStoreConformanceFixture>;
|
|
11
|
+
export declare class McpEventStoreConformanceError extends Error {
|
|
12
|
+
readonly code: "MISMATCH" | "INCONCLUSIVE" | "CALLBACK_FAILED";
|
|
13
|
+
readonly scenario: string;
|
|
14
|
+
constructor(code: "MISMATCH" | "INCONCLUSIVE" | "CALLBACK_FAILED", scenario: string, detail: string);
|
|
15
|
+
}
|
|
16
|
+
/** Runs bounded synthetic checks; missing queue witnesses fail as INCONCLUSIVE. */
|
|
17
|
+
export declare function assertMcpEventStoreConformance(createFixture: McpEventStoreConformanceFixtureFactory): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=mcp-event-store-conformance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-event-store-conformance.d.ts","sourceRoot":"","sources":["../src/mcp-event-store-conformance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,aAAa,EAEd,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,KAAK,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,+BAA+B;IAC9C,IAAI,IAAI,8BAA8B,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;IACjF,OAAO,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,sCAAsC,GAAG,MACnD,+BAA+B,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAC;AAE7E,qBAAa,6BAA8B,SAAQ,KAAK;IAEpD,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,GAAG,iBAAiB;IAC9D,QAAQ,CAAC,QAAQ,EAAE,MAAM;gBADhB,IAAI,EAAE,UAAU,GAAG,cAAc,GAAG,iBAAiB,EACrD,QAAQ,EAAE,MAAM,EACzB,MAAM,EAAE,MAAM;CAKjB;AAYD,mFAAmF;AACnF,wBAAsB,8BAA8B,CAClD,aAAa,EAAE,sCAAsC,GACpD,OAAO,CAAC,IAAI,CAAC,CAmHf"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from "node:util";
|
|
2
|
+
export class McpEventStoreConformanceError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
scenario;
|
|
5
|
+
constructor(code, scenario, detail) {
|
|
6
|
+
super(`MCP Event store ${scenario}: ${detail}`);
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.scenario = scenario;
|
|
9
|
+
this.name = "McpEventStoreConformanceError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const fixturePreviousSecret = `whsec_${Buffer.alloc(32, 2).toString("base64")}`;
|
|
13
|
+
/** Runs bounded synthetic checks; missing queue witnesses fail as INCONCLUSIVE. */
|
|
14
|
+
export async function assertMcpEventStoreConformance(createFixture) {
|
|
15
|
+
const fixtureSubscription = subscription();
|
|
16
|
+
await scenario("subscriptions", createFixture, async ({ open, call, check }) => {
|
|
17
|
+
const a = (await open()).store;
|
|
18
|
+
const b = (await open()).store;
|
|
19
|
+
const original = fixtureSubscription;
|
|
20
|
+
check(await call("get absent", () => a.get(original.id)) === null, "absent subscription must be null");
|
|
21
|
+
await call("put rotation", () => a.put({ ...original, verifiedUntil: original.expiresAt - 1_000,
|
|
22
|
+
previousSecret: fixturePreviousSecret, previousSecretUntil: original.expiresAt - 2_000 }));
|
|
23
|
+
check(isDeepStrictEqual(await call("get rotation", () => b.get(original.id)), {
|
|
24
|
+
...original, verifiedUntil: original.expiresAt - 1_000, previousSecret: fixturePreviousSecret,
|
|
25
|
+
previousSecretUntil: original.expiresAt - 2_000,
|
|
26
|
+
}), "rotation fields must survive a shared-storage read");
|
|
27
|
+
const replacement = { ...original, name: "synthetic.replaced", arguments: { record: "replacement" } };
|
|
28
|
+
await call("replace", () => b.put(replacement));
|
|
29
|
+
check(isDeepStrictEqual(await call("get replacement", () => a.get(original.id)), replacement), "replacement must remove omitted optional fields");
|
|
30
|
+
check(isDeepStrictEqual(await call("list old name", () => a.list(original.name)), []), "list must isolate the event name");
|
|
31
|
+
check(isDeepStrictEqual(await call("list replacement", () => b.list(replacement.name)), [replacement]), "list must return the complete replacement");
|
|
32
|
+
const variants = [original, { ...replacement, ownerKey: "synthetic-other-owner" }];
|
|
33
|
+
await joined(variants.map((value, index) => () => call("race put", () => (index ? b : a).put(value))));
|
|
34
|
+
const raced = await call("read race", () => a.get(original.id));
|
|
35
|
+
check(variants.some((value) => isDeepStrictEqual(value, raced)), "racing puts must retain one complete record");
|
|
36
|
+
const distinct = Array.from({ length: 4 }, (_, index) => ({ ...original, id: `synthetic-sub-${index}` }));
|
|
37
|
+
await joined(distinct.map((value, index) => () => call("distinct put", () => (index % 2 ? b : a).put(value))));
|
|
38
|
+
for (const value of distinct)
|
|
39
|
+
check(isDeepStrictEqual(await call("read distinct", () => a.get(value.id)), value), "distinct concurrent writes must survive");
|
|
40
|
+
await joined([() => call("race delete", () => a.delete(original.id)),
|
|
41
|
+
() => call("race replacement", () => b.put(replacement))]);
|
|
42
|
+
const afterDelete = await call("read delete race", () => a.get(original.id));
|
|
43
|
+
check(afterDelete === null || isDeepStrictEqual(afterDelete, replacement), "put/delete race must retain a complete outcome");
|
|
44
|
+
await call("delete", () => b.delete(original.id));
|
|
45
|
+
check(await call("read deleted", () => a.get(original.id)) === null, "delete must be visible to another handle");
|
|
46
|
+
});
|
|
47
|
+
await scenario("competing claims", createFixture, async ({ open, call, check }) => {
|
|
48
|
+
const a = (await open()).store;
|
|
49
|
+
const b = (await open()).store;
|
|
50
|
+
await call("put queue subscription", () => a.put(fixtureSubscription));
|
|
51
|
+
const expected = Array.from({ length: 4 }, (_, index) => delivery(`synthetic-job-${index}`));
|
|
52
|
+
for (const value of expected)
|
|
53
|
+
await call("enqueue", () => a.enqueue(value));
|
|
54
|
+
await call("enqueue future", () => a.enqueue({ ...delivery("synthetic-future"), nextAttemptAt: 10_000 }));
|
|
55
|
+
const seen = new Set();
|
|
56
|
+
for (let round = 0; round < 8; round += 1) {
|
|
57
|
+
const batches = await joined([() => call("claim A", () => a.claimDue(2, 100, 1_000)),
|
|
58
|
+
() => call("claim B", () => b.claimDue(2, 100, 1_000))]);
|
|
59
|
+
for (const batch of batches) {
|
|
60
|
+
check(Array.isArray(batch) && batch.length <= 2, "claim must respect its limit");
|
|
61
|
+
for (const value of batch) {
|
|
62
|
+
check(!seen.has(value.id), "active claims must not overlap");
|
|
63
|
+
const expectedValue = expected.find(({ id }) => value.id === id);
|
|
64
|
+
check(expectedValue !== undefined && isDeepStrictEqual(withoutLease(value), expectedValue), "claim must retain an eligible queued record");
|
|
65
|
+
check(typeof value.leaseId === "string" && value.leaseId.length > 0, "claim must carry a lease token");
|
|
66
|
+
seen.add(value.id);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (seen.size !== expected.length)
|
|
71
|
+
throw new McpEventStoreConformanceError("INCONCLUSIVE", "competing claims", "bounded probing did not observe all synthetic queue witnesses");
|
|
72
|
+
});
|
|
73
|
+
for (const stale of ["complete", "reschedule"]) {
|
|
74
|
+
await scenario(`stale ${stale}`, createFixture, async ({ open, call, check, claim }) => {
|
|
75
|
+
const a = (await open()).store;
|
|
76
|
+
const b = (await open()).store;
|
|
77
|
+
await call("put queue subscription", () => a.put(fixtureSubscription));
|
|
78
|
+
const value = delivery("synthetic-fenced");
|
|
79
|
+
await call("enqueue", () => a.enqueue(value));
|
|
80
|
+
const old = await claim(a, 100);
|
|
81
|
+
const current = await claim(b, 201);
|
|
82
|
+
check(current.leaseId !== old.leaseId, "reclaim must replace the lease token");
|
|
83
|
+
check(isDeepStrictEqual(withoutLease(current), value), "reclaim must preserve every delivery field");
|
|
84
|
+
// Either rejection or no-op is permitted for a stale token. Only effects are checked.
|
|
85
|
+
await Promise.allSettled([Promise.resolve().then(() => stale === "complete"
|
|
86
|
+
? a.complete(old.id, old.leaseId)
|
|
87
|
+
: a.reschedule({ ...old, body: "synthetic-stale-mutation", nextAttemptAt: 0 }))]);
|
|
88
|
+
check(isDeepStrictEqual(await call("claim active", () => a.claimDue(1, 202, 100)), []), "a stale operation must not release a current claim");
|
|
89
|
+
const recovered = await claim(b, 302);
|
|
90
|
+
check(isDeepStrictEqual(withoutLease(recovered), value), "a stale operation must not alter the queued record");
|
|
91
|
+
await call("complete current", () => b.complete(recovered.id, recovered.leaseId));
|
|
92
|
+
await Promise.allSettled([Promise.resolve().then(() => a.reschedule({ ...old, nextAttemptAt: 0 }))]);
|
|
93
|
+
check(isDeepStrictEqual(await call("claim completed", () => b.claimDue(1, 500, 100)), []), "stale reschedule must not resurrect completed work");
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
await scenario("retry and reopen", createFixture, async ({ open, close, call, check, claim }) => {
|
|
97
|
+
const first = await open();
|
|
98
|
+
const value = delivery("synthetic-reopen");
|
|
99
|
+
await call("put", () => first.store.put(fixtureSubscription));
|
|
100
|
+
await call("enqueue", () => first.store.enqueue(value));
|
|
101
|
+
const old = await claim(first.store, 100);
|
|
102
|
+
await close(first);
|
|
103
|
+
const next = (await open()).store;
|
|
104
|
+
check(isDeepStrictEqual(await call("read reopened", () => next.get(fixtureSubscription.id)), fixtureSubscription), "subscription must survive graceful reopen");
|
|
105
|
+
check(isDeepStrictEqual(await call("claim reopened active", () => next.claimDue(1, 199, 100)), []), "active lease must survive graceful reopen");
|
|
106
|
+
const current = await claim(next, 201);
|
|
107
|
+
check(current.leaseId !== old.leaseId, "reopened reclaim must replace the lease token");
|
|
108
|
+
check(isDeepStrictEqual(withoutLease(current), value), "queued fields must survive graceful reopen");
|
|
109
|
+
const retry = { ...current, attempts: current.attempts + 1, nextAttemptAt: 1_000 };
|
|
110
|
+
await call("reschedule current", () => next.reschedule(retry));
|
|
111
|
+
check(isDeepStrictEqual(await call("claim before retry", () => next.claimDue(1, 999, 100)), []), "retry must not be claimed before its due time");
|
|
112
|
+
const retried = await claim(next, 1_001);
|
|
113
|
+
check(isDeepStrictEqual(withoutLease(retried), withoutLease(retry)), "retry fields must roundtrip");
|
|
114
|
+
await call("complete retry", () => next.complete(retried.id, retried.leaseId));
|
|
115
|
+
check(isDeepStrictEqual(await call("claim completed retry", () => next.claimDue(1, 2_000, 100)), []), "completion must remove the queued record");
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
async function scenario(name, createFixture, run) {
|
|
119
|
+
const handles = new Set();
|
|
120
|
+
const errors = [];
|
|
121
|
+
const call = async (label, operation) => {
|
|
122
|
+
try {
|
|
123
|
+
return await operation();
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
throw new McpEventStoreConformanceError("CALLBACK_FAILED", name, `${label} failed; backend details omitted`);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const fixture = await call("create fixture", createFixture);
|
|
130
|
+
const close = async (handle) => {
|
|
131
|
+
handles.delete(handle);
|
|
132
|
+
await call("close handle", () => handle.close());
|
|
133
|
+
};
|
|
134
|
+
try {
|
|
135
|
+
await run({
|
|
136
|
+
async open() {
|
|
137
|
+
const handle = await call("open handle", () => fixture.open());
|
|
138
|
+
handles.add(handle);
|
|
139
|
+
return handle;
|
|
140
|
+
}, close, call,
|
|
141
|
+
check(value, detail) { if (!value)
|
|
142
|
+
throw new McpEventStoreConformanceError("MISMATCH", name, detail); },
|
|
143
|
+
async claim(store, now) {
|
|
144
|
+
for (let attempt = 0; attempt < 8; attempt += 1) {
|
|
145
|
+
const values = await call("claim witness", () => store.claimDue(1, now, 100));
|
|
146
|
+
if (!Array.isArray(values) || values.length > 1)
|
|
147
|
+
throw new McpEventStoreConformanceError("MISMATCH", name, "claim must respect its limit");
|
|
148
|
+
if (values.length === 1) {
|
|
149
|
+
const value = values[0];
|
|
150
|
+
if (typeof value.leaseId !== "string" || value.leaseId.length === 0) {
|
|
151
|
+
throw new McpEventStoreConformanceError("MISMATCH", name, "claim must carry a lease token");
|
|
152
|
+
}
|
|
153
|
+
return value;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
throw new McpEventStoreConformanceError("INCONCLUSIVE", name, "bounded probing did not observe a queue witness");
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
errors.push(error);
|
|
162
|
+
}
|
|
163
|
+
for (const handle of handles) {
|
|
164
|
+
try {
|
|
165
|
+
await close(handle);
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
errors.push(error);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
await call("dispose fixture", () => fixture.dispose());
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
errors.push(error);
|
|
176
|
+
}
|
|
177
|
+
if (errors.length === 1)
|
|
178
|
+
throw errors[0];
|
|
179
|
+
if (errors.length > 1)
|
|
180
|
+
throw new AggregateError(errors, `MCP Event store ${name}: check and cleanup failed`);
|
|
181
|
+
}
|
|
182
|
+
async function joined(operations) {
|
|
183
|
+
const results = await Promise.allSettled(operations.map((operation) => Promise.resolve().then(operation)));
|
|
184
|
+
const failures = results.filter((result) => result.status === "rejected");
|
|
185
|
+
if (failures.length === 1)
|
|
186
|
+
throw failures[0].reason;
|
|
187
|
+
if (failures.length > 1)
|
|
188
|
+
throw new AggregateError(failures.map(({ reason }) => reason), "Concurrent store operations failed");
|
|
189
|
+
return results.map((result) => result.value);
|
|
190
|
+
}
|
|
191
|
+
function subscription() {
|
|
192
|
+
return { id: "synthetic-subscription", name: "synthetic.changed", ownerKey: "synthetic-owner",
|
|
193
|
+
arguments: { record: "synthetic-record" }, url: "https://callback.example.invalid/events",
|
|
194
|
+
secret: `whsec_${Buffer.alloc(32, 1).toString("base64")}`, expiresAt: Date.now() + 86_400_000 };
|
|
195
|
+
}
|
|
196
|
+
function delivery(id) {
|
|
197
|
+
return { id, subscriptionId: "synthetic-subscription", eventId: `synthetic-event-${id}`,
|
|
198
|
+
body: JSON.stringify({ synthetic: id }), attempts: 0, nextAttemptAt: 50 };
|
|
199
|
+
}
|
|
200
|
+
function withoutLease({ leaseId: _leaseId, ...value }) {
|
|
201
|
+
return value;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=mcp-event-store-conformance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-event-store-conformance.js","sourceRoot":"","sources":["../src/mcp-event-store-conformance.ts"],"names":[],"mappings":"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"}
|