@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.
package/dist/report.js ADDED
@@ -0,0 +1,231 @@
1
+ import { MESH_CONFORMANCE_CAPABILITIES, MESH_CONFORMANCE_CASES, MESH_CONFORMANCE_REPORT_SCHEMA_VERSION, MESH_REQUIRED_CONFORMANCE_CAPABILITIES, } from "./contracts.js";
2
+ const digestPattern = /^sha256:(?:[A-Fa-f0-9]{64}|[A-Za-z0-9_-]{43})$/u;
3
+ const reasonPattern = /^[a-z][a-z0-9._:-]{0,63}$/u;
4
+ const versionPattern = /^[0-9A-Za-z][0-9A-Za-z.+-]{0,63}$/u;
5
+ const forbiddenReportKey = /(?:credential|password|private|secret|signature|token|connection|string|payload|envelope|snapshot|raw)/iu;
6
+ export function createMeshConformanceReport(input) {
7
+ assertExactRecord(input, [
8
+ "cases",
9
+ "conformanceVersion",
10
+ "declaredCapabilities",
11
+ "endedAt",
12
+ ...(input.environment === undefined ? [] : ["environment"]),
13
+ "fixtureManifestDigest",
14
+ "implementation",
15
+ "seed",
16
+ "startedAt",
17
+ "suiteDigest",
18
+ ]);
19
+ const capabilities = normalizeCapabilities(input.declaredCapabilities);
20
+ for (const required of MESH_REQUIRED_CONFORMANCE_CAPABILITIES) {
21
+ if (!capabilities.includes(required)) {
22
+ throw new TypeError("Required Mesh conformance capability is missing");
23
+ }
24
+ }
25
+ const cases = normalizeCases(input.cases, new Set(capabilities));
26
+ const counts = countCases(cases);
27
+ const verdict = counts.failed === 0 ? "passed" : "failed";
28
+ const report = Object.freeze({
29
+ schemaVersion: MESH_CONFORMANCE_REPORT_SCHEMA_VERSION,
30
+ conformanceVersion: boundedVersion(input.conformanceVersion),
31
+ suiteDigest: boundedDigest(input.suiteDigest),
32
+ fixtureManifestDigest: boundedDigest(input.fixtureManifestDigest),
33
+ implementation: normalizeImplementation(input.implementation),
34
+ declaredCapabilities: capabilities,
35
+ seed: boundedSeed(input.seed),
36
+ startedAt: timestamp(input.startedAt),
37
+ endedAt: timestamp(input.endedAt),
38
+ environment: normalizeEnvironment(input.environment ?? {}),
39
+ cases,
40
+ counts,
41
+ verdict,
42
+ });
43
+ if (Date.parse(report.endedAt) < Date.parse(report.startedAt)) {
44
+ throw new TypeError("Mesh conformance report time range is invalid");
45
+ }
46
+ return report;
47
+ }
48
+ export function validateMeshConformanceReport(input) {
49
+ assertExactRecord(input, [
50
+ "cases",
51
+ "conformanceVersion",
52
+ "counts",
53
+ "declaredCapabilities",
54
+ "endedAt",
55
+ "environment",
56
+ "fixtureManifestDigest",
57
+ "implementation",
58
+ "schemaVersion",
59
+ "seed",
60
+ "startedAt",
61
+ "suiteDigest",
62
+ "verdict",
63
+ ]);
64
+ const report = input;
65
+ if (report.schemaVersion !== MESH_CONFORMANCE_REPORT_SCHEMA_VERSION) {
66
+ throw new TypeError("Mesh conformance report schema is unsupported");
67
+ }
68
+ const normalized = createMeshConformanceReport({
69
+ conformanceVersion: report.conformanceVersion,
70
+ suiteDigest: report.suiteDigest,
71
+ fixtureManifestDigest: report.fixtureManifestDigest,
72
+ implementation: report.implementation,
73
+ declaredCapabilities: report.declaredCapabilities,
74
+ seed: report.seed,
75
+ startedAt: report.startedAt,
76
+ endedAt: report.endedAt,
77
+ environment: report.environment,
78
+ cases: report.cases,
79
+ });
80
+ if (!sameCounts(normalized.counts, report.counts) ||
81
+ normalized.verdict !== report.verdict) {
82
+ throw new TypeError("Mesh conformance report aggregate is inconsistent");
83
+ }
84
+ return normalized;
85
+ }
86
+ function normalizeCases(input, declared) {
87
+ if (!Array.isArray(input) || input.length !== MESH_CONFORMANCE_CASES.length) {
88
+ throw new TypeError("Mesh conformance report case coverage is incomplete");
89
+ }
90
+ const byId = new Map(input.map((entry) => [entry.caseId, entry]));
91
+ if (byId.size !== input.length) {
92
+ throw new TypeError("Mesh conformance report case is duplicated");
93
+ }
94
+ return Object.freeze(MESH_CONFORMANCE_CASES.map((definition) => {
95
+ const entry = byId.get(definition.id);
96
+ if (!entry) {
97
+ throw new TypeError("Mesh conformance report case is missing");
98
+ }
99
+ assertExactRecord(entry, [
100
+ "capability",
101
+ "caseId",
102
+ "durationMs",
103
+ "outcome",
104
+ ...(entry.reasonCode === undefined ? [] : ["reasonCode"]),
105
+ ]);
106
+ if (entry.capability !== definition.capability ||
107
+ !["passed", "failed", "skipped", "not_declared"].includes(entry.outcome) ||
108
+ !Number.isSafeInteger(entry.durationMs) ||
109
+ entry.durationMs < 0 ||
110
+ entry.durationMs > 60_000 ||
111
+ (entry.reasonCode !== undefined &&
112
+ !reasonPattern.test(entry.reasonCode))) {
113
+ throw new TypeError("Mesh conformance report case is invalid");
114
+ }
115
+ const isDeclared = declared.has(definition.capability);
116
+ if ((!isDeclared && entry.outcome !== "not_declared") ||
117
+ (isDeclared &&
118
+ (entry.outcome === "not_declared" || entry.outcome === "skipped")) ||
119
+ (definition.required && entry.outcome === "skipped") ||
120
+ (entry.outcome === "failed" && entry.reasonCode === undefined) ||
121
+ (entry.outcome !== "failed" && entry.reasonCode !== undefined)) {
122
+ throw new TypeError("Mesh conformance case outcome is inconsistent");
123
+ }
124
+ return Object.freeze({ ...entry });
125
+ }));
126
+ }
127
+ function normalizeCapabilities(values) {
128
+ if (!Array.isArray(values) ||
129
+ values.length > MESH_CONFORMANCE_CAPABILITIES.length) {
130
+ throw new RangeError("Mesh conformance capability count is invalid");
131
+ }
132
+ const unique = new Set(values);
133
+ if (unique.size !== values.length ||
134
+ values.some((value) => !MESH_CONFORMANCE_CAPABILITIES.includes(value))) {
135
+ throw new TypeError("Mesh conformance capability manifest is invalid");
136
+ }
137
+ return Object.freeze([...unique].sort(compareAscii));
138
+ }
139
+ function normalizeImplementation(value) {
140
+ assertExactRecord(value, ["name", "version"]);
141
+ return Object.freeze({
142
+ name: boundedText(value.name, 128),
143
+ version: boundedVersion(value.version),
144
+ });
145
+ }
146
+ function normalizeEnvironment(value) {
147
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
148
+ throw new TypeError("Mesh conformance environment is invalid");
149
+ }
150
+ const entries = Object.entries(value).sort(([left], [right]) => compareAscii(left, right));
151
+ if (entries.length > 16) {
152
+ throw new RangeError("Mesh conformance environment is too large");
153
+ }
154
+ const result = Object.create(null);
155
+ for (const [key, nested] of entries) {
156
+ if (!/^[a-z][a-z0-9._-]{0,31}$/u.test(key) ||
157
+ forbiddenReportKey.test(key)) {
158
+ throw new TypeError("Mesh conformance environment key is forbidden");
159
+ }
160
+ result[key] = boundedText(nested, 128);
161
+ }
162
+ return Object.freeze(result);
163
+ }
164
+ function countCases(cases) {
165
+ const counts = { passed: 0, failed: 0, skipped: 0, notDeclared: 0 };
166
+ for (const entry of cases) {
167
+ if (entry.outcome === "not_declared")
168
+ counts.notDeclared += 1;
169
+ else
170
+ counts[entry.outcome] += 1;
171
+ }
172
+ return Object.freeze({ total: cases.length, ...counts });
173
+ }
174
+ function sameCounts(left, right) {
175
+ return (right &&
176
+ left.total === right.total &&
177
+ left.passed === right.passed &&
178
+ left.failed === right.failed &&
179
+ left.skipped === right.skipped &&
180
+ left.notDeclared === right.notDeclared);
181
+ }
182
+ function boundedDigest(value) {
183
+ if (typeof value !== "string" || !digestPattern.test(value)) {
184
+ throw new TypeError("Mesh conformance digest is invalid");
185
+ }
186
+ return value;
187
+ }
188
+ function boundedVersion(value) {
189
+ if (typeof value !== "string" || !versionPattern.test(value)) {
190
+ throw new TypeError("Mesh conformance version is invalid");
191
+ }
192
+ return value;
193
+ }
194
+ function boundedText(value, maximum) {
195
+ if (typeof value !== "string" ||
196
+ value.length < 1 ||
197
+ new TextEncoder().encode(value).byteLength > maximum ||
198
+ /[\u0000-\u001f\u007f]/u.test(value)) {
199
+ throw new TypeError("Mesh conformance report text is invalid");
200
+ }
201
+ return value;
202
+ }
203
+ function boundedSeed(value) {
204
+ if (!Number.isSafeInteger(value) || value < 0 || value > 0xffff_ffff) {
205
+ throw new RangeError("Mesh conformance seed is invalid");
206
+ }
207
+ return value;
208
+ }
209
+ function timestamp(value) {
210
+ if (typeof value !== "string" ||
211
+ !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z$/u.test(value) ||
212
+ Number.isNaN(Date.parse(value))) {
213
+ throw new TypeError("Mesh conformance timestamp is invalid");
214
+ }
215
+ return value;
216
+ }
217
+ function assertExactRecord(value, keys) {
218
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
219
+ throw new TypeError("Mesh conformance record is invalid");
220
+ }
221
+ const actual = Object.keys(value).sort(compareAscii);
222
+ const expected = [...keys].sort(compareAscii);
223
+ if (actual.length !== expected.length ||
224
+ actual.some((key, index) => key !== expected[index])) {
225
+ throw new TypeError("Mesh conformance record must have an exact shape");
226
+ }
227
+ }
228
+ function compareAscii(left, right) {
229
+ return left < right ? -1 : left > right ? 1 : 0;
230
+ }
231
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { RoomMeshBridge, RoomMeshInboundProjection } from "@agentplat/rooms-mesh";
2
+ import type { MeshConformanceCaseResult, MeshConformanceFactoryContext } from "./contracts.js";
3
+ import { type MeshConformanceRunnerOptions } from "./runner.js";
4
+ export type MeshRoomsConformanceScenario = "normal" | "retry";
5
+ export interface MeshRoomsConformanceAdapter {
6
+ readonly bridge: RoomMeshBridge;
7
+ readonly projection: RoomMeshInboundProjection;
8
+ reproject(): RoomMeshInboundProjection | Promise<RoomMeshInboundProjection>;
9
+ sinkApplications(): number;
10
+ cleanup?(): void | Promise<void>;
11
+ }
12
+ export type MeshRoomsConformanceFactory = (scenario: MeshRoomsConformanceScenario, context: MeshConformanceFactoryContext) => MeshRoomsConformanceAdapter | Promise<MeshRoomsConformanceAdapter>;
13
+ export interface MeshRoomsConformanceOptions extends MeshConformanceRunnerOptions {
14
+ readonly factory: MeshRoomsConformanceFactory;
15
+ readonly allowDestructiveTests?: boolean;
16
+ }
17
+ export declare function runMeshRoomsConformance(options: MeshRoomsConformanceOptions): Promise<readonly MeshConformanceCaseResult[]>;
18
+ //# sourceMappingURL=rooms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rooms.d.ts","sourceRoot":"","sources":["../src/rooms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,yBAAyB,EAC1B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EACV,yBAAyB,EACzB,6BAA6B,EAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAML,KAAK,4BAA4B,EAClC,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,4BAA4B,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE9D,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,yBAAyB,CAAC;IAC/C,SAAS,IAAI,yBAAyB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC5E,gBAAgB,IAAI,MAAM,CAAC;IAC3B,OAAO,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,2BAA2B,GAAG,CACxC,QAAQ,EAAE,4BAA4B,EACtC,OAAO,EAAE,6BAA6B,KACnC,2BAA2B,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;AAExE,MAAM,WAAW,2BAA4B,SAAQ,4BAA4B;IAC/E,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAC1C;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,SAAS,yBAAyB,EAAE,CAAC,CA+E/C"}
package/dist/rooms.js ADDED
@@ -0,0 +1,70 @@
1
+ import { assertCondition, awaitConformanceOperation, runConformanceCleanup, runBoundedCase, runnerContext, } from "./runner.js";
2
+ export async function runMeshRoomsConformance(options) {
3
+ const context = runnerContext(options);
4
+ if (context.declaredCapabilities.has("rooms.projection_idempotency") &&
5
+ options.allowDestructiveTests !== true) {
6
+ throw new TypeError("Mesh Rooms conformance requires destructive-test consent");
7
+ }
8
+ return Object.freeze([
9
+ await runBoundedCase({
10
+ caseId: "rooms.projection.stable_key",
11
+ capability: "rooms.projection_idempotency",
12
+ context,
13
+ run: (signal) => withAdapter(options.factory, context, signal, "normal", async (adapter) => {
14
+ const repeated = await adapter.reproject();
15
+ assertCondition(repeated.idempotencyKey === adapter.projection.idempotencyKey);
16
+ assertCondition(repeated.tenantId === adapter.projection.tenantId);
17
+ assertCondition(repeated.roomId === adapter.projection.roomId);
18
+ assertCondition(repeated.taskId === adapter.projection.taskId);
19
+ assertCondition(repeated.source.messageId === adapter.projection.source.messageId);
20
+ }),
21
+ }),
22
+ await runBoundedCase({
23
+ caseId: "rooms.projection.duplicate",
24
+ capability: "rooms.projection_idempotency",
25
+ context,
26
+ run: (signal) => withAdapter(options.factory, context, signal, "normal", async (adapter) => {
27
+ const first = await adapter.bridge.apply(adapter.projection);
28
+ const second = await adapter.bridge.apply(adapter.projection);
29
+ assertCondition(first.status === "applied");
30
+ assertCondition(second.status === "duplicate");
31
+ assertCondition(adapter.sinkApplications() === 1);
32
+ }),
33
+ }),
34
+ await runBoundedCase({
35
+ caseId: "rooms.projection.retry",
36
+ capability: "rooms.projection_idempotency",
37
+ context,
38
+ run: (signal) => withAdapter(options.factory, context, signal, "retry", async (adapter) => {
39
+ let failed = false;
40
+ try {
41
+ await adapter.bridge.apply(adapter.projection);
42
+ }
43
+ catch {
44
+ failed = true;
45
+ }
46
+ assertCondition(failed);
47
+ const retried = await adapter.bridge.apply(adapter.projection);
48
+ assertCondition(retried.status === "applied");
49
+ assertCondition(adapter.sinkApplications() === 2);
50
+ }),
51
+ }),
52
+ ]);
53
+ }
54
+ async function withAdapter(factory, context, signal, scenario, run) {
55
+ const adapter = await awaitConformanceOperation(factory(scenario, Object.freeze({ seed: context.seed, signal })), signal);
56
+ if (!adapter || typeof adapter !== "object") {
57
+ throw new TypeError("Mesh Rooms conformance factory is invalid");
58
+ }
59
+ let failed;
60
+ try {
61
+ await awaitConformanceOperation(run(adapter), signal);
62
+ }
63
+ catch (error) {
64
+ failed = error;
65
+ }
66
+ await runConformanceCleanup(adapter.cleanup?.bind(adapter), context.cleanupTimeoutMs, failed);
67
+ if (failed !== undefined)
68
+ throw failed;
69
+ }
70
+ //# sourceMappingURL=rooms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rooms.js","sourceRoot":"","sources":["../src/rooms.ts"],"names":[],"mappings":"AASA,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,qBAAqB,EACrB,cAAc,EACd,aAAa,GAEd,MAAM,aAAa,CAAC;AAsBrB,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAoC;IAEpC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACvC,IACE,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,8BAA8B,CAAC;QAChE,OAAO,CAAC,qBAAqB,KAAK,IAAI,EACtC,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,0DAA0D,CAC3D,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,cAAc,CAAC;YACnB,MAAM,EAAE,6BAA6B;YACrC,UAAU,EAAE,8BAA8B;YAC1C,OAAO;YACP,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CACd,WAAW,CACT,OAAO,CAAC,OAAO,EACf,OAAO,EACP,MAAM,EACN,QAAQ,EACR,KAAK,EAAE,OAAO,EAAE,EAAE;gBAChB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC3C,eAAe,CACb,QAAQ,CAAC,cAAc,KAAK,OAAO,CAAC,UAAU,CAAC,cAAc,CAC9D,CAAC;gBACF,eAAe,CAAC,QAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACnE,eAAe,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC/D,eAAe,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC/D,eAAe,CACb,QAAQ,CAAC,MAAM,CAAC,SAAS,KAAK,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAClE,CAAC;YACJ,CAAC,CACF;SACJ,CAAC;QACF,MAAM,cAAc,CAAC;YACnB,MAAM,EAAE,4BAA4B;YACpC,UAAU,EAAE,8BAA8B;YAC1C,OAAO;YACP,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CACd,WAAW,CACT,OAAO,CAAC,OAAO,EACf,OAAO,EACP,MAAM,EACN,QAAQ,EACR,KAAK,EAAE,OAAO,EAAE,EAAE;gBAChB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC9D,eAAe,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;gBAC5C,eAAe,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;gBAC/C,eAAe,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;YACpD,CAAC,CACF;SACJ,CAAC;QACF,MAAM,cAAc,CAAC;YACnB,MAAM,EAAE,wBAAwB;YAChC,UAAU,EAAE,8BAA8B;YAC1C,OAAO;YACP,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CACd,WAAW,CACT,OAAO,CAAC,OAAO,EACf,OAAO,EACP,MAAM,EACN,OAAO,EACP,KAAK,EAAE,OAAO,EAAE,EAAE;gBAChB,IAAI,MAAM,GAAG,KAAK,CAAC;gBACnB,IAAI,CAAC;oBACH,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACjD,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,GAAG,IAAI,CAAC;gBAChB,CAAC;gBACD,eAAe,CAAC,MAAM,CAAC,CAAC;gBACxB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC/D,eAAe,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;gBAC9C,eAAe,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;YACpD,CAAC,CACF;SACJ,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,OAAoC,EACpC,OAAyC,EACzC,MAAmB,EACnB,QAAsC,EACtC,GAAmE;IAEnE,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAC7C,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,EAChE,MAAM,CACP,CAAC;IACF,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,yBAAyB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,qBAAqB,CACzB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,EAC9B,OAAO,CAAC,gBAAgB,EACxB,MAAM,CACP,CAAC;IACF,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,MAAM,CAAC;AACzC,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { type MeshConformanceCapability, type MeshConformanceCaseResult } from "./contracts.js";
2
+ export interface MeshConformanceRunnerOptions {
3
+ readonly declaredCapabilities: readonly MeshConformanceCapability[];
4
+ readonly seed?: number;
5
+ readonly timeoutMs?: number;
6
+ readonly totalTimeoutMs?: number;
7
+ readonly cleanupTimeoutMs?: number;
8
+ readonly signal?: AbortSignal;
9
+ readonly clock?: () => number;
10
+ }
11
+ export declare function runnerContext(options: MeshConformanceRunnerOptions): Readonly<{
12
+ declaredCapabilities: ReadonlySet<"protocol.v0.read" | "protocol.v0.write" | "protocol.v1.read" | "protocol.v1.write" | "protocol.canonical" | "transport.exact_byte_retry" | "transport.coarse_receipts" | "durability.inbox" | "durability.atomic_transition" | "durability.fenced_claims" | "durability.journal_chain" | "durability.snapshot_migration" | "rooms.projection_idempotency">;
13
+ seed: number;
14
+ timeoutMs: number;
15
+ totalTimeoutMs: number;
16
+ cleanupTimeoutMs: number;
17
+ signal: AbortSignal | undefined;
18
+ clock: () => number;
19
+ deadline: number;
20
+ }>;
21
+ export declare function runBoundedCase(input: {
22
+ readonly caseId: string;
23
+ readonly capability: MeshConformanceCapability;
24
+ readonly context: ReturnType<typeof runnerContext>;
25
+ readonly run: (signal: AbortSignal) => void | Promise<void>;
26
+ }): Promise<MeshConformanceCaseResult>;
27
+ export declare function awaitConformanceOperation<T>(operation: T | PromiseLike<T>, signal: AbortSignal): Promise<T>;
28
+ export declare function runConformanceCleanup(cleanup: (() => void | Promise<void>) | undefined, timeoutMs: number, previousFailure?: unknown): Promise<void>;
29
+ export declare function assertCondition(condition: unknown, reason?: string): asserts condition;
30
+ export declare function bytesEqual(left: Uint8Array, right: Uint8Array): boolean;
31
+ export declare class MeshConformanceCleanupError extends Error {
32
+ readonly previousFailure?: unknown | undefined;
33
+ constructor(previousFailure?: unknown | undefined);
34
+ }
35
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC/B,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,oBAAoB,EAAE,SAAS,yBAAyB,EAAE,CAAC;IACpE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CAC/B;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,4BAA4B;;;;;;;iBAH1C,MAAM;;GAiD9B;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,yBAAyB,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IACnD,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAiDrC;AAED,wBAAsB,yBAAyB,CAAC,CAAC,EAC/C,SAAS,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAC7B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,CAAC,CAAC,CAcZ;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,EACjD,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,OAAO,GACxB,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,OAAO,EAClB,MAAM,SAAiC,GACtC,OAAO,CAAC,SAAS,CAEnB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAMvE;AAiDD,qBAAa,2BAA4B,SAAQ,KAAK;IACxC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO;gBAAzB,eAAe,CAAC,EAAE,OAAO,YAAA;CAG/C"}
package/dist/runner.js ADDED
@@ -0,0 +1,192 @@
1
+ import { MESH_CONFORMANCE_CAPABILITIES, } from "./contracts.js";
2
+ export function runnerContext(options) {
3
+ const declaredCapabilities = normalizeCapabilities(options.declaredCapabilities);
4
+ const timeoutMs = options.timeoutMs ?? 5_000;
5
+ const seed = options.seed ?? 0;
6
+ if (!Number.isSafeInteger(timeoutMs) ||
7
+ timeoutMs < 10 ||
8
+ timeoutMs > 60_000) {
9
+ throw new RangeError("Mesh conformance case timeout is invalid");
10
+ }
11
+ if (!Number.isSafeInteger(seed) || seed < 0 || seed > 0xffff_ffff) {
12
+ throw new RangeError("Mesh conformance seed is invalid");
13
+ }
14
+ const clock = options.clock ?? Date.now;
15
+ const totalTimeoutMs = options.totalTimeoutMs ?? 60_000;
16
+ const cleanupTimeoutMs = options.cleanupTimeoutMs ?? 2_000;
17
+ if (!Number.isSafeInteger(totalTimeoutMs) ||
18
+ totalTimeoutMs < 10 ||
19
+ totalTimeoutMs > 300_000 ||
20
+ !Number.isSafeInteger(cleanupTimeoutMs) ||
21
+ cleanupTimeoutMs < 10 ||
22
+ cleanupTimeoutMs > 30_000) {
23
+ throw new RangeError("Mesh conformance suite timeout is invalid");
24
+ }
25
+ if (options.signal !== undefined &&
26
+ !(options.signal instanceof AbortSignal)) {
27
+ throw new TypeError("Mesh conformance abort signal is invalid");
28
+ }
29
+ const deadline = monotonicNow() + totalTimeoutMs;
30
+ return Object.freeze({
31
+ declaredCapabilities,
32
+ seed,
33
+ timeoutMs,
34
+ totalTimeoutMs,
35
+ cleanupTimeoutMs,
36
+ signal: options.signal,
37
+ clock,
38
+ deadline,
39
+ });
40
+ }
41
+ export async function runBoundedCase(input) {
42
+ if (!input.context.declaredCapabilities.has(input.capability)) {
43
+ return result(input.caseId, input.capability, "not_declared", 0);
44
+ }
45
+ const started = input.context.clock();
46
+ const remainingMs = Math.trunc(input.context.deadline - monotonicNow());
47
+ if (remainingMs <= 0) {
48
+ return result(input.caseId, input.capability, "failed", 0, "suite_timeout");
49
+ }
50
+ const timeoutMs = Math.min(input.context.timeoutMs, remainingMs);
51
+ const timeoutFailure = remainingMs <= input.context.timeoutMs
52
+ ? new ConformanceSuiteTimeout()
53
+ : new ConformanceTimeout();
54
+ const controller = new AbortController();
55
+ const relayAbort = () => controller.abort(new ConformanceAbort());
56
+ input.context.signal?.addEventListener("abort", relayAbort, { once: true });
57
+ let timeout;
58
+ try {
59
+ if (input.context.signal?.aborted)
60
+ throw new ConformanceAbort();
61
+ timeout = setTimeout(() => controller.abort(timeoutFailure), timeoutMs);
62
+ await input.run(controller.signal);
63
+ if (controller.signal.aborted)
64
+ throw controller.signal.reason;
65
+ return result(input.caseId, input.capability, "passed", duration(started, input.context.clock()));
66
+ }
67
+ catch (error) {
68
+ return result(input.caseId, input.capability, "failed", duration(started, input.context.clock()), error instanceof ConformanceTimeout
69
+ ? "timeout"
70
+ : error instanceof ConformanceSuiteTimeout
71
+ ? "suite_timeout"
72
+ : error instanceof ConformanceAbort
73
+ ? "aborted"
74
+ : error instanceof MeshConformanceCleanupError
75
+ ? cleanupReason(error)
76
+ : "assertion_failed");
77
+ }
78
+ finally {
79
+ if (timeout !== undefined)
80
+ clearTimeout(timeout);
81
+ input.context.signal?.removeEventListener("abort", relayAbort);
82
+ }
83
+ }
84
+ export async function awaitConformanceOperation(operation, signal) {
85
+ if (signal.aborted)
86
+ throw signal.reason;
87
+ let onAbort;
88
+ try {
89
+ return await Promise.race([
90
+ Promise.resolve(operation),
91
+ new Promise((_resolve, reject) => {
92
+ onAbort = () => reject(signal.reason);
93
+ signal.addEventListener("abort", onAbort, { once: true });
94
+ }),
95
+ ]);
96
+ }
97
+ finally {
98
+ if (onAbort !== undefined)
99
+ signal.removeEventListener("abort", onAbort);
100
+ }
101
+ }
102
+ export async function runConformanceCleanup(cleanup, timeoutMs, previousFailure) {
103
+ if (cleanup === undefined)
104
+ return;
105
+ let timer;
106
+ try {
107
+ await Promise.race([
108
+ Promise.resolve().then(cleanup),
109
+ new Promise((_resolve, reject) => {
110
+ timer = setTimeout(() => reject(new MeshConformanceCleanupError(previousFailure)), timeoutMs);
111
+ }),
112
+ ]);
113
+ }
114
+ catch (error) {
115
+ if (error instanceof MeshConformanceCleanupError)
116
+ throw error;
117
+ throw new MeshConformanceCleanupError(previousFailure);
118
+ }
119
+ finally {
120
+ if (timer !== undefined)
121
+ clearTimeout(timer);
122
+ }
123
+ }
124
+ export function assertCondition(condition, reason = "conformance assertion failed") {
125
+ if (condition !== true)
126
+ throw new TypeError(reason);
127
+ }
128
+ export function bytesEqual(left, right) {
129
+ if (left.byteLength !== right.byteLength)
130
+ return false;
131
+ for (let index = 0; index < left.byteLength; index += 1) {
132
+ if (left[index] !== right[index])
133
+ return false;
134
+ }
135
+ return true;
136
+ }
137
+ function normalizeCapabilities(values) {
138
+ if (!Array.isArray(values) ||
139
+ values.length > MESH_CONFORMANCE_CAPABILITIES.length) {
140
+ throw new RangeError("Mesh conformance capability count is invalid");
141
+ }
142
+ const result = new Set();
143
+ for (const value of values) {
144
+ if (!MESH_CONFORMANCE_CAPABILITIES.includes(value)) {
145
+ throw new TypeError("Mesh conformance capability is unknown");
146
+ }
147
+ if (result.has(value)) {
148
+ throw new TypeError("Mesh conformance capability is duplicated");
149
+ }
150
+ result.add(value);
151
+ }
152
+ return result;
153
+ }
154
+ function result(caseId, capability, outcome, durationMs, reasonCode) {
155
+ return Object.freeze({
156
+ caseId,
157
+ capability,
158
+ outcome,
159
+ ...(reasonCode === undefined ? {} : { reasonCode }),
160
+ durationMs,
161
+ });
162
+ }
163
+ function duration(started, ended) {
164
+ const value = Math.max(0, Math.trunc(ended - started));
165
+ return Number.isSafeInteger(value) ? Math.min(value, 60_000) : 60_000;
166
+ }
167
+ class ConformanceTimeout extends Error {
168
+ }
169
+ class ConformanceSuiteTimeout extends Error {
170
+ }
171
+ class ConformanceAbort extends Error {
172
+ }
173
+ export class MeshConformanceCleanupError extends Error {
174
+ previousFailure;
175
+ constructor(previousFailure) {
176
+ super("Mesh conformance cleanup failed");
177
+ this.previousFailure = previousFailure;
178
+ }
179
+ }
180
+ function cleanupReason(error) {
181
+ return error.previousFailure instanceof ConformanceTimeout
182
+ ? "timeout_cleanup_failed"
183
+ : error.previousFailure instanceof ConformanceSuiteTimeout
184
+ ? "suite_timeout_cleanup_failed"
185
+ : error.previousFailure instanceof ConformanceAbort
186
+ ? "aborted_cleanup_failed"
187
+ : "cleanup_failed";
188
+ }
189
+ function monotonicNow() {
190
+ return globalThis.performance?.now() ?? Date.now();
191
+ }
192
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { MeshConformanceCaseResult, MeshConformanceFactoryContext } from "./contracts.js";
2
+ import { type MeshConformanceRunnerOptions } from "./runner.js";
3
+ export type MeshTransportConformanceScenario = "retry" | "redirect" | "receipt";
4
+ export interface MeshTransportConformanceReceipt {
5
+ readonly disposition: "accepted" | "permanent_rejection" | "retryable";
6
+ readonly messageId?: string;
7
+ readonly retryAfterMs?: number;
8
+ }
9
+ export interface MeshTransportConformanceAdapter {
10
+ deliver(bytes: Uint8Array): MeshTransportConformanceReceipt | Promise<MeshTransportConformanceReceipt>;
11
+ observations(): Readonly<{
12
+ readonly attempts: readonly Uint8Array[];
13
+ readonly redirectFollowed: boolean;
14
+ }>;
15
+ cleanup?(): void | Promise<void>;
16
+ }
17
+ export type MeshTransportConformanceFactory = (scenario: MeshTransportConformanceScenario, context: MeshConformanceFactoryContext) => MeshTransportConformanceAdapter | Promise<MeshTransportConformanceAdapter>;
18
+ export interface MeshTransportConformanceOptions extends MeshConformanceRunnerOptions {
19
+ readonly factory: MeshTransportConformanceFactory;
20
+ readonly signedEnvelopeBytes: Uint8Array;
21
+ }
22
+ export declare function runMeshTransportConformance(options: MeshTransportConformanceOptions): Promise<readonly MeshConformanceCaseResult[]>;
23
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,6BAA6B,EAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAOL,KAAK,4BAA4B,EAClC,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,gCAAgC,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAEhF,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,WAAW,EAAE,UAAU,GAAG,qBAAqB,GAAG,WAAW,CAAC;IACvE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,+BAA+B;IAC9C,OAAO,CACL,KAAK,EAAE,UAAU,GAChB,+BAA+B,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAC9E,YAAY,IAAI,QAAQ,CAAC;QACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;QACzC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;KACpC,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,+BAA+B,GAAG,CAC5C,QAAQ,EAAE,gCAAgC,EAC1C,OAAO,EAAE,6BAA6B,KACnC,+BAA+B,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAC;AAEhF,MAAM,WAAW,+BAAgC,SAAQ,4BAA4B;IACnF,QAAQ,CAAC,OAAO,EAAE,+BAA+B,CAAC;IAClD,QAAQ,CAAC,mBAAmB,EAAE,UAAU,CAAC;CAC1C;AAED,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,SAAS,yBAAyB,EAAE,CAAC,CA6E/C"}