@agentplat/mesh-conformance 0.3.0-beta.1

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.
@@ -0,0 +1,332 @@
1
+ import { computeMeshDurableValueDigest, normalizeMeshDurableScope, verifyMeshDurableJournal, } from "@agentplat/mesh/durability";
2
+ import { assertCondition, awaitConformanceOperation, runBoundedCase, runConformanceCleanup, runnerContext, } from "./runner.js";
3
+ export async function runMeshDurabilityConformance(options) {
4
+ const context = runnerContext(options);
5
+ if ([
6
+ "durability.inbox",
7
+ "durability.atomic_transition",
8
+ "durability.fenced_claims",
9
+ "durability.journal_chain",
10
+ "durability.snapshot_migration",
11
+ ].some((capability) => context.declaredCapabilities.has(capability)) &&
12
+ options.allowDestructiveTests !== true) {
13
+ throw new TypeError("Mesh durability conformance requires destructive-test consent");
14
+ }
15
+ return Object.freeze([
16
+ await repositoryCase(options.factory, context, "durability.inbox.commit_receipt", "durability.inbox", "inbox_commit", verifyInboxCommit),
17
+ await repositoryCase(options.factory, context, "durability.inbox.conflict", "durability.inbox", "inbox_conflict", verifyInboxConflict),
18
+ await repositoryCase(options.factory, context, "durability.transition.atomic", "durability.atomic_transition", "atomic_transition", verifyAtomicTransition),
19
+ await repositoryCase(options.factory, context, "durability.claim.stale_fenced", "durability.fenced_claims", "stale_claim", verifyStaleClaim),
20
+ await repositoryCase(options.factory, context, "durability.journal.chain", "durability.journal_chain", "journal_chain", verifyJournalChain),
21
+ await runBoundedCase({
22
+ caseId: "durability.snapshot.migration",
23
+ capability: "durability.snapshot_migration",
24
+ context,
25
+ run: (signal) => withAdapter(options.factory, context, signal, "snapshot_migration", async (adapter) => {
26
+ assertSnapshotAdapter(adapter);
27
+ await verifySnapshotMigration(adapter);
28
+ }),
29
+ }),
30
+ ]);
31
+ }
32
+ async function repositoryCase(factory, context, caseId, capability, scenario, verify) {
33
+ return runBoundedCase({
34
+ caseId,
35
+ capability,
36
+ context,
37
+ run: (signal) => withAdapter(factory, context, signal, scenario, async (adapter) => {
38
+ assertRepositoryAdapter(adapter);
39
+ await verify(adapter);
40
+ }),
41
+ });
42
+ }
43
+ async function verifyInboxCommit(adapter) {
44
+ const received = await adapter.repository.receive({
45
+ scope: adapter.scope,
46
+ envelope: adapter.inboundEnvelopes[0],
47
+ });
48
+ assertCondition(received.accepted && received.duplicate === false);
49
+ const restarted = await adapter.restartRepository();
50
+ assertCondition(restarted !== adapter.repository);
51
+ const claimed = await restarted.claimInbox({
52
+ scope: adapter.scope,
53
+ workerId: "commit-worker",
54
+ limit: 16,
55
+ leaseDurationMs: 30_000,
56
+ });
57
+ assertCondition(claimed.length === 1);
58
+ assertCondition(claimed[0].messageId === adapter.inboundEnvelopes[0].messageId);
59
+ }
60
+ async function verifyInboxConflict(adapter) {
61
+ const original = adapter.inboundEnvelopes[0];
62
+ const conflicting = adapter.conflictingInboundEnvelope;
63
+ assertCondition(original.messageId === conflicting.messageId);
64
+ assertCondition((await computeMeshDurableValueDigest(original)) !==
65
+ (await computeMeshDurableValueDigest(conflicting)));
66
+ const first = await adapter.repository.receive({
67
+ scope: adapter.scope,
68
+ envelope: original,
69
+ });
70
+ const second = await adapter.repository.receive({
71
+ scope: adapter.scope,
72
+ envelope: conflicting,
73
+ });
74
+ assertCondition(first.accepted);
75
+ assertCondition(!second.accepted && second.code === "message_conflict");
76
+ }
77
+ async function verifyAtomicTransition(adapter) {
78
+ await receivePair(adapter);
79
+ const firstClaims = await claimInbox(adapter, "atomic-worker-a", 30_000);
80
+ assertCondition(firstClaims.length === 2);
81
+ const [first, second] = sortInboxClaims(firstClaims);
82
+ const firstState = Object.freeze({ conformanceRevision: 1 });
83
+ const firstCommit = await adapter.repository.commitInboxTransition({
84
+ inbox: first,
85
+ expectedSnapshotRevision: 0,
86
+ transitionId: "conformance-atomic-1",
87
+ outcome: "applied",
88
+ nextState: firstState,
89
+ nextStateDescriptor: {
90
+ format: "application/vnd.agentplat.conformance-state+json",
91
+ schemaVersion: 1,
92
+ },
93
+ journal: [
94
+ { entryId: "conformance-journal-1", kind: "conformance.applied" },
95
+ ],
96
+ outbox: [
97
+ {
98
+ effectId: "conformance-shared-effect",
99
+ envelope: adapter.outboundEnvelopes[0],
100
+ },
101
+ ],
102
+ });
103
+ assertCondition(firstCommit.committed);
104
+ const conflictingCommit = await adapter.repository.commitInboxTransition({
105
+ inbox: second,
106
+ expectedSnapshotRevision: 1,
107
+ transitionId: "conformance-atomic-2",
108
+ outcome: "applied",
109
+ nextState: { conformanceRevision: 2 },
110
+ nextStateDescriptor: {
111
+ format: "application/vnd.agentplat.conformance-state+json",
112
+ schemaVersion: 1,
113
+ },
114
+ journal: [
115
+ { entryId: "conformance-journal-2", kind: "conformance.applied" },
116
+ ],
117
+ outbox: [
118
+ {
119
+ effectId: "conformance-shared-effect",
120
+ envelope: adapter.outboundEnvelopes[1],
121
+ },
122
+ ],
123
+ });
124
+ assertCondition(!conflictingCommit.committed &&
125
+ conflictingCommit.code === "outbox_conflict");
126
+ const snapshot = await adapter.repository.loadSnapshot(adapter.scope);
127
+ const journal = await adapter.repository.inspectJournal({
128
+ scope: adapter.scope,
129
+ limit: 16,
130
+ });
131
+ const outbox = await adapter.repository.claimOutbox({
132
+ scope: adapter.scope,
133
+ workerId: "atomic-outbox-worker",
134
+ limit: 16,
135
+ leaseDurationMs: 30_000,
136
+ });
137
+ assertCondition(snapshot?.revision === 1);
138
+ assertCondition(snapshot.state
139
+ .conformanceRevision === 1);
140
+ assertCondition(journal.length === 1);
141
+ assertCondition(outbox.length === 1);
142
+ assertCondition(outbox[0].messageId === adapter.outboundEnvelopes[0].messageId);
143
+ assertCondition(await adapter.repository.abandonInbox({
144
+ inbox: second,
145
+ retryAfterMs: 1,
146
+ reasonCode: "conformance_conflict",
147
+ }));
148
+ }
149
+ async function verifyStaleClaim(adapter) {
150
+ assertCondition(typeof adapter.advanceTime === "function");
151
+ await adapter.repository.receive({
152
+ scope: adapter.scope,
153
+ envelope: adapter.inboundEnvelopes[0],
154
+ });
155
+ const stale = (await claimInbox(adapter, "stale-worker", 10))[0];
156
+ assertCondition(stale !== undefined);
157
+ await adapter.advanceTime(11);
158
+ const current = (await claimInbox(adapter, "current-worker", 30_000))[0];
159
+ assertCondition(current !== undefined);
160
+ assertCondition(current.claim.generation > stale.claim.generation);
161
+ const staleCommit = await adapter.repository.commitInboxTransition({
162
+ inbox: stale,
163
+ expectedSnapshotRevision: 0,
164
+ transitionId: "conformance-stale-transition",
165
+ outcome: "applied",
166
+ nextState: { claim: "stale" },
167
+ journal: [],
168
+ outbox: [],
169
+ });
170
+ assertCondition(!staleCommit.committed && staleCommit.code === "claim_lost");
171
+ const currentCommit = await adapter.repository.commitInboxTransition({
172
+ inbox: current,
173
+ expectedSnapshotRevision: 0,
174
+ transitionId: "conformance-current-transition",
175
+ outcome: "applied",
176
+ nextState: { claim: "current" },
177
+ journal: [],
178
+ outbox: [],
179
+ });
180
+ assertCondition(currentCommit.committed);
181
+ const snapshot = await adapter.repository.loadSnapshot(adapter.scope);
182
+ assertCondition(snapshot?.state?.claim === "current");
183
+ }
184
+ async function verifyJournalChain(adapter) {
185
+ await adapter.repository.receive({
186
+ scope: adapter.scope,
187
+ envelope: adapter.inboundEnvelopes[0],
188
+ });
189
+ const inbox = (await claimInbox(adapter, "journal-worker", 30_000))[0];
190
+ assertCondition(inbox !== undefined);
191
+ const committed = await adapter.repository.commitInboxTransition({
192
+ inbox,
193
+ expectedSnapshotRevision: 0,
194
+ transitionId: "conformance-journal-transition",
195
+ outcome: "applied",
196
+ nextState: { journal: true },
197
+ journal: [
198
+ { entryId: "conformance-chain-a", kind: "conformance.a" },
199
+ { entryId: "conformance-chain-b", kind: "conformance.b" },
200
+ ],
201
+ outbox: [],
202
+ });
203
+ assertCondition(committed.committed);
204
+ const journal = await adapter.repository.inspectJournal({
205
+ scope: adapter.scope,
206
+ limit: 16,
207
+ });
208
+ assertCondition(journal.length === 2);
209
+ const expectedHead = journal[1];
210
+ const verification = {
211
+ expectedHeadDigest: expectedHead.digest,
212
+ expectedHeadSequence: expectedHead.sequence,
213
+ };
214
+ assertCondition(await verifyMeshDurableJournal({ entries: journal, ...verification }));
215
+ const mutated = journal.map((entry, index) => index === 1 ? { ...entry, kind: "conformance.mutated" } : entry);
216
+ assertCondition(!(await verifyMeshDurableJournal({ entries: mutated, ...verification })));
217
+ assertCondition(!(await verifyMeshDurableJournal({
218
+ entries: [journal[1], journal[0]],
219
+ ...verification,
220
+ })));
221
+ assertCondition(!(await verifyMeshDurableJournal({
222
+ entries: [journal[0]],
223
+ ...verification,
224
+ })));
225
+ }
226
+ async function verifySnapshotMigration(adapter) {
227
+ const [first, second] = await Promise.all([
228
+ adapter.registry.migrate(adapter.legacySnapshot),
229
+ adapter.registry.migrate(structuredClone(adapter.legacySnapshot)),
230
+ ]);
231
+ assertCondition(first.stateDigest === second.stateDigest);
232
+ assertCondition(first.stateDigest ===
233
+ (await computeMeshDurableValueDigest(adapter.expectedState)));
234
+ const currentSnapshot = Object.freeze({
235
+ ...adapter.legacySnapshot,
236
+ schemaVersion: 2,
237
+ state: first.state,
238
+ stateDigest: first.stateDigest,
239
+ snapshotFormat: first.descriptor.format,
240
+ snapshotSchemaVersion: first.descriptor.schemaVersion,
241
+ });
242
+ const decoded = await adapter.registry.decode(currentSnapshot);
243
+ assertCondition((await computeMeshDurableValueDigest(decoded)) ===
244
+ first.stateDigest);
245
+ const idempotent = await adapter.registry.migrate(currentSnapshot);
246
+ assertCondition(idempotent.stateDigest === first.stateDigest);
247
+ await expectFailure(() => adapter.registry.decode({
248
+ ...currentSnapshot,
249
+ snapshotFormat: "application/vnd.agentplat.unknown+json",
250
+ }));
251
+ await expectFailure(() => adapter.registry.decode({
252
+ ...currentSnapshot,
253
+ stateDigest: "sha256:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
254
+ }));
255
+ }
256
+ async function receivePair(adapter) {
257
+ for (const envelope of adapter.inboundEnvelopes) {
258
+ const result = await adapter.repository.receive({
259
+ scope: adapter.scope,
260
+ envelope,
261
+ });
262
+ assertCondition(result.accepted && !result.duplicate);
263
+ }
264
+ }
265
+ function claimInbox(adapter, workerId, leaseDurationMs) {
266
+ return adapter.repository.claimInbox({
267
+ scope: adapter.scope,
268
+ workerId,
269
+ limit: 16,
270
+ leaseDurationMs,
271
+ });
272
+ }
273
+ function sortInboxClaims(claims) {
274
+ return [...claims].sort((left, right) => left.messageId < right.messageId
275
+ ? -1
276
+ : left.messageId > right.messageId
277
+ ? 1
278
+ : 0);
279
+ }
280
+ function assertRepositoryAdapter(adapter) {
281
+ if (!adapter ||
282
+ typeof adapter !== "object" ||
283
+ !("repository" in adapter) ||
284
+ !adapter.repository ||
285
+ typeof adapter.repository.receive !== "function" ||
286
+ typeof adapter.restartRepository !== "function" ||
287
+ !Array.isArray(adapter.inboundEnvelopes) ||
288
+ adapter.inboundEnvelopes.length !== 2 ||
289
+ !Array.isArray(adapter.outboundEnvelopes) ||
290
+ adapter.outboundEnvelopes.length !== 2) {
291
+ throw new TypeError("Mesh durability repository adapter is invalid");
292
+ }
293
+ normalizeMeshDurableScope(adapter.scope);
294
+ }
295
+ function assertSnapshotAdapter(adapter) {
296
+ if (!adapter ||
297
+ typeof adapter !== "object" ||
298
+ !("registry" in adapter) ||
299
+ !adapter.registry ||
300
+ typeof adapter.registry.migrate !== "function" ||
301
+ !adapter.legacySnapshot ||
302
+ adapter.expectedState === undefined) {
303
+ throw new TypeError("Mesh durability snapshot adapter is invalid");
304
+ }
305
+ }
306
+ async function withAdapter(factory, context, signal, scenario, run) {
307
+ const adapter = await awaitConformanceOperation(factory(scenario, Object.freeze({ seed: context.seed, signal })), signal);
308
+ if (!adapter || typeof adapter !== "object") {
309
+ throw new TypeError("Mesh durability conformance factory is invalid");
310
+ }
311
+ let failed;
312
+ try {
313
+ await awaitConformanceOperation(run(adapter), signal);
314
+ }
315
+ catch (error) {
316
+ failed = error;
317
+ }
318
+ await runConformanceCleanup(adapter.cleanup?.bind(adapter), context.cleanupTimeoutMs, failed);
319
+ if (failed !== undefined)
320
+ throw failed;
321
+ }
322
+ async function expectFailure(run) {
323
+ let failed = false;
324
+ try {
325
+ await run();
326
+ }
327
+ catch {
328
+ failed = true;
329
+ }
330
+ assertCondition(failed);
331
+ }
332
+ //# sourceMappingURL=durability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durability.js","sourceRoot":"","sources":["../src/durability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./contracts.js";
2
+ export { createMeshConformanceReport, validateMeshConformanceReport, } from "./report.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,GAC9B,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./contracts.js";
2
+ export { createMeshConformanceReport, validateMeshConformanceReport, } from "./report.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,GAC9B,MAAM,aAAa,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { MeshJsonValue, MeshWireVersion } from "@agentplat/mesh-protocol";
2
+ import type { MeshConformanceCaseResult, MeshConformanceFactoryContext } from "./contracts.js";
3
+ import { type MeshConformanceRunnerOptions } from "./runner.js";
4
+ export interface MeshProtocolConformanceParseResult {
5
+ readonly accepted: boolean;
6
+ readonly wireVersion?: number;
7
+ readonly reasonCode?: string;
8
+ }
9
+ export interface MeshProtocolConformanceAdapter {
10
+ parse(bytes: Uint8Array, acceptedWireVersions?: readonly MeshWireVersion[]): MeshProtocolConformanceParseResult | Promise<MeshProtocolConformanceParseResult>;
11
+ canonicalize(value: MeshJsonValue): Uint8Array | Promise<Uint8Array>;
12
+ write?(wireVersion: MeshWireVersion): Uint8Array | Promise<Uint8Array>;
13
+ verify(bytes: Uint8Array): boolean | Promise<boolean>;
14
+ cleanup?(): void | Promise<void>;
15
+ }
16
+ export type MeshProtocolConformanceFactory = (context: MeshConformanceFactoryContext) => MeshProtocolConformanceAdapter | Promise<MeshProtocolConformanceAdapter>;
17
+ export interface MeshProtocolConformanceFixtures {
18
+ readonly v0EnvelopeBytes: Uint8Array;
19
+ readonly v1EnvelopeBytes: Uint8Array;
20
+ readonly unknownEnvelopeBytes: Uint8Array;
21
+ readonly substitutedV1EnvelopeBytes: Uint8Array;
22
+ readonly canonicalValueA: MeshJsonValue;
23
+ readonly canonicalValueB: MeshJsonValue;
24
+ readonly expectedCanonicalBytes: Uint8Array;
25
+ }
26
+ export interface MeshProtocolConformanceOptions extends MeshConformanceRunnerOptions {
27
+ readonly factory: MeshProtocolConformanceFactory;
28
+ readonly fixtures: MeshProtocolConformanceFixtures;
29
+ }
30
+ export declare function runMeshProtocolConformance(options: MeshProtocolConformanceOptions): Promise<readonly MeshConformanceCaseResult[]>;
31
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE/E,OAAO,KAAK,EACV,yBAAyB,EACzB,6BAA6B,EAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAOL,KAAK,4BAA4B,EAClC,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,CACH,KAAK,EAAE,UAAU,EACjB,oBAAoB,CAAC,EAAE,SAAS,eAAe,EAAE,GAE/C,kCAAkC,GAClC,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAChD,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrE,KAAK,CAAC,CAAC,WAAW,EAAE,eAAe,GAAG,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACvE,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,8BAA8B,GAAG,CAC3C,OAAO,EAAE,6BAA6B,KACnC,8BAA8B,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;AAE9E,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,UAAU,CAAC;IAC1C,QAAQ,CAAC,0BAA0B,EAAE,UAAU,CAAC;IAChD,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC;IACxC,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC;IACxC,QAAQ,CAAC,sBAAsB,EAAE,UAAU,CAAC;CAC7C;AAED,MAAM,WAAW,8BAA+B,SAAQ,4BAA4B;IAClF,QAAQ,CAAC,OAAO,EAAE,8BAA8B,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,+BAA+B,CAAC;CACpD;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,SAAS,yBAAyB,EAAE,CAAC,CAyG/C"}
@@ -0,0 +1,166 @@
1
+ import { assertCondition, awaitConformanceOperation, bytesEqual, runConformanceCleanup, runBoundedCase, runnerContext, } from "./runner.js";
2
+ export async function runMeshProtocolConformance(options) {
3
+ const context = runnerContext(options);
4
+ const fixtures = normalizeFixtures(options.fixtures);
5
+ return Object.freeze([
6
+ await runBoundedCase({
7
+ caseId: "protocol.v0.parse",
8
+ capability: "protocol.v0.read",
9
+ context,
10
+ run: (signal) => withAdapter(options.factory, context, signal, async (adapter) => {
11
+ const result = await adapter.parse(fixtures.v0EnvelopeBytes.slice());
12
+ assertParseResult(result);
13
+ assertCondition(result.accepted && result.wireVersion === 0);
14
+ }),
15
+ }),
16
+ await runBoundedCase({
17
+ caseId: "protocol.v1.parse",
18
+ capability: "protocol.v1.read",
19
+ context,
20
+ run: (signal) => withAdapter(options.factory, context, signal, async (adapter) => {
21
+ const result = await adapter.parse(fixtures.v1EnvelopeBytes.slice());
22
+ assertParseResult(result);
23
+ assertCondition(result.accepted && result.wireVersion === 1);
24
+ }),
25
+ }),
26
+ await runBoundedCase({
27
+ caseId: "protocol.unknown.reject",
28
+ capability: "protocol.v1.read",
29
+ context,
30
+ run: (signal) => withAdapter(options.factory, context, signal, async (adapter) => {
31
+ const result = await adapter.parse(fixtures.unknownEnvelopeBytes.slice());
32
+ assertParseResult(result);
33
+ assertCondition(!result.accepted &&
34
+ result.reasonCode === "unsupported_wire_version");
35
+ }),
36
+ }),
37
+ await runBoundedCase({
38
+ caseId: "protocol.canonical.stable",
39
+ capability: "protocol.canonical",
40
+ context,
41
+ run: (signal) => withAdapter(options.factory, context, signal, async (adapter) => {
42
+ const [left, right] = await Promise.all([
43
+ adapter.canonicalize(fixtures.canonicalValueA),
44
+ adapter.canonicalize(fixtures.canonicalValueB),
45
+ ]);
46
+ assertBytes(left);
47
+ assertBytes(right);
48
+ assertCondition(bytesEqual(left, right));
49
+ assertCondition(bytesEqual(left, fixtures.expectedCanonicalBytes));
50
+ }),
51
+ }),
52
+ await runBoundedCase({
53
+ caseId: "protocol.v1.write",
54
+ capability: "protocol.v1.write",
55
+ context,
56
+ run: (signal) => withAdapter(options.factory, context, signal, async (adapter) => {
57
+ assertCondition(adapter.write !== undefined);
58
+ const bytes = await adapter.write(1);
59
+ assertBytes(bytes);
60
+ const parsed = await adapter.parse(bytes.slice(), [1]);
61
+ assertParseResult(parsed);
62
+ assertCondition(parsed.accepted && parsed.wireVersion === 1);
63
+ assertCondition(await adapter.verify(bytes));
64
+ }),
65
+ }),
66
+ await runBoundedCase({
67
+ caseId: "protocol.version.signature_binding",
68
+ capability: "protocol.v1.write",
69
+ context,
70
+ run: (signal) => withAdapter(options.factory, context, signal, async (adapter) => {
71
+ assertCondition(await adapter.verify(fixtures.v1EnvelopeBytes.slice()));
72
+ assertCondition(!(await adapter.verify(fixtures.substitutedV1EnvelopeBytes.slice())));
73
+ }),
74
+ }),
75
+ await runBoundedCase({
76
+ caseId: "protocol.v0.explicit_write",
77
+ capability: "protocol.v0.write",
78
+ context,
79
+ run: (signal) => withAdapter(options.factory, context, signal, async (adapter) => {
80
+ assertCondition(adapter.write !== undefined);
81
+ const bytes = await adapter.write(0);
82
+ assertBytes(bytes);
83
+ const parsed = await adapter.parse(bytes.slice(), [0]);
84
+ assertParseResult(parsed);
85
+ assertCondition(parsed.accepted && parsed.wireVersion === 0);
86
+ assertCondition(await adapter.verify(bytes));
87
+ }),
88
+ }),
89
+ ]);
90
+ }
91
+ async function withAdapter(factory, context, signal, run) {
92
+ const adapter = await awaitConformanceOperation(factory(Object.freeze({ seed: context.seed, signal })), signal);
93
+ if (!adapter || typeof adapter !== "object") {
94
+ throw new TypeError("Mesh protocol conformance factory is invalid");
95
+ }
96
+ let failed;
97
+ try {
98
+ await awaitConformanceOperation(run(adapter), signal);
99
+ }
100
+ catch (error) {
101
+ failed = error;
102
+ }
103
+ await runConformanceCleanup(adapter.cleanup?.bind(adapter), context.cleanupTimeoutMs, failed);
104
+ if (failed !== undefined)
105
+ throw failed;
106
+ }
107
+ function normalizeFixtures(fixtures) {
108
+ if (!fixtures || typeof fixtures !== "object") {
109
+ throw new TypeError("Mesh protocol conformance fixtures are required");
110
+ }
111
+ for (const value of [
112
+ fixtures.v0EnvelopeBytes,
113
+ fixtures.v1EnvelopeBytes,
114
+ fixtures.unknownEnvelopeBytes,
115
+ fixtures.substitutedV1EnvelopeBytes,
116
+ fixtures.expectedCanonicalBytes,
117
+ ]) {
118
+ if (!(value instanceof Uint8Array) ||
119
+ value.byteLength < 1 ||
120
+ value.byteLength > 262_144) {
121
+ throw new RangeError("Mesh protocol conformance fixture is invalid");
122
+ }
123
+ }
124
+ return Object.freeze({
125
+ v0EnvelopeBytes: fixtures.v0EnvelopeBytes.slice(),
126
+ v1EnvelopeBytes: fixtures.v1EnvelopeBytes.slice(),
127
+ unknownEnvelopeBytes: fixtures.unknownEnvelopeBytes.slice(),
128
+ substitutedV1EnvelopeBytes: fixtures.substitutedV1EnvelopeBytes.slice(),
129
+ canonicalValueA: deepFreeze(structuredClone(fixtures.canonicalValueA)),
130
+ canonicalValueB: deepFreeze(structuredClone(fixtures.canonicalValueB)),
131
+ expectedCanonicalBytes: fixtures.expectedCanonicalBytes.slice(),
132
+ });
133
+ }
134
+ function assertParseResult(value) {
135
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
136
+ throw new TypeError("Mesh protocol conformance parse result is invalid");
137
+ }
138
+ const keys = Object.keys(value).sort();
139
+ const allowed = new Set(["accepted", "reasonCode", "wireVersion"]);
140
+ if (keys.some((key) => !allowed.has(key)) ||
141
+ typeof value.accepted !== "boolean" ||
142
+ (value.wireVersion !== undefined &&
143
+ (!Number.isSafeInteger(value.wireVersion) || value.wireVersion < 0)) ||
144
+ (value.reasonCode !== undefined &&
145
+ (typeof value.reasonCode !== "string" ||
146
+ !/^[a-z][a-z0-9._:-]{0,63}$/u.test(value.reasonCode))) ||
147
+ (value.accepted && value.wireVersion === undefined) ||
148
+ (value.accepted && value.reasonCode !== undefined) ||
149
+ (!value.accepted && value.wireVersion !== undefined)) {
150
+ throw new TypeError("Mesh protocol conformance parse result is invalid");
151
+ }
152
+ }
153
+ function assertBytes(value) {
154
+ if (!(value instanceof Uint8Array) || value.byteLength > 262_144) {
155
+ throw new TypeError("Mesh protocol conformance output is invalid");
156
+ }
157
+ }
158
+ function deepFreeze(value) {
159
+ if (value !== null && typeof value === "object" && !Object.isFrozen(value)) {
160
+ Object.freeze(value);
161
+ for (const nested of Object.values(value))
162
+ deepFreeze(nested);
163
+ }
164
+ return value;
165
+ }
166
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type MeshConformanceReport, type MeshConformanceReportInput } from "./contracts.js";
2
+ export declare function createMeshConformanceReport(input: MeshConformanceReportInput): MeshConformanceReport;
3
+ export declare function validateMeshConformanceReport(input: unknown): MeshConformanceReport;
4
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAChC,MAAM,gBAAgB,CAAC;AAQxB,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,0BAA0B,GAChC,qBAAqB,CAyCvB;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,GACb,qBAAqB,CAuCvB"}