@moltzap/protocol 2026.408.0 → 2026.425.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/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/rpc-registry.d.ts +446 -0
- package/dist/rpc-registry.d.ts.map +1 -0
- package/dist/rpc-registry.js +67 -0
- package/dist/rpc-registry.js.map +1 -0
- package/dist/rpc.d.ts +42 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +29 -0
- package/dist/rpc.js.map +1 -0
- package/dist/schema/apps.d.ts +86 -0
- package/dist/schema/apps.d.ts.map +1 -0
- package/dist/schema/apps.js +77 -0
- package/dist/schema/apps.js.map +1 -0
- package/dist/schema/contacts.d.ts +8 -18
- package/dist/schema/contacts.d.ts.map +1 -1
- package/dist/schema/contacts.js +9 -13
- package/dist/schema/contacts.js.map +1 -1
- package/dist/schema/conversations.d.ts +15 -8
- package/dist/schema/conversations.d.ts.map +1 -1
- package/dist/schema/conversations.js +18 -7
- package/dist/schema/conversations.js.map +1 -1
- package/dist/schema/delivery.d.ts +1 -4
- package/dist/schema/delivery.d.ts.map +1 -1
- package/dist/schema/delivery.js +2 -3
- package/dist/schema/delivery.js.map +1 -1
- package/dist/schema/errors.d.ts +13 -0
- package/dist/schema/errors.d.ts.map +1 -1
- package/dist/schema/errors.js +14 -0
- package/dist/schema/errors.js.map +1 -1
- package/dist/schema/events.d.ts +112 -93
- package/dist/schema/events.d.ts.map +1 -1
- package/dist/schema/events.js +84 -25
- package/dist/schema/events.js.map +1 -1
- package/dist/schema/identity.d.ts +19 -17
- package/dist/schema/identity.d.ts.map +1 -1
- package/dist/schema/identity.js +7 -14
- package/dist/schema/identity.js.map +1 -1
- package/dist/schema/index.d.ts +4 -2
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +4 -2
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/messages.d.ts +3 -7
- package/dist/schema/messages.d.ts.map +1 -1
- package/dist/schema/messages.js +4 -6
- package/dist/schema/messages.js.map +1 -1
- package/dist/schema/methods/apps.d.ts +123 -0
- package/dist/schema/methods/apps.d.ts.map +1 -0
- package/dist/schema/methods/apps.js +93 -0
- package/dist/schema/methods/apps.js.map +1 -0
- package/dist/schema/methods/auth.d.ts +102 -90
- package/dist/schema/methods/auth.d.ts.map +1 -1
- package/dist/schema/methods/auth.js +86 -74
- package/dist/schema/methods/auth.js.map +1 -1
- package/dist/schema/methods/contacts.d.ts +39 -74
- package/dist/schema/methods/contacts.d.ts.map +1 -1
- package/dist/schema/methods/contacts.js +35 -29
- package/dist/schema/methods/contacts.js.map +1 -1
- package/dist/schema/methods/conversations.d.ts +48 -52
- package/dist/schema/methods/conversations.d.ts.map +1 -1
- package/dist/schema/methods/conversations.js +89 -38
- package/dist/schema/methods/conversations.js.map +1 -1
- package/dist/schema/methods/invites.d.ts +1 -3
- package/dist/schema/methods/invites.d.ts.map +1 -1
- package/dist/schema/methods/invites.js +8 -1
- package/dist/schema/methods/invites.js.map +1 -1
- package/dist/schema/methods/messages.d.ts +12 -44
- package/dist/schema/methods/messages.d.ts.map +1 -1
- package/dist/schema/methods/messages.js +22 -28
- package/dist/schema/methods/messages.js.map +1 -1
- package/dist/schema/methods/presence.d.ts +7 -22
- package/dist/schema/methods/presence.d.ts.map +1 -1
- package/dist/schema/methods/presence.js +12 -6
- package/dist/schema/methods/presence.js.map +1 -1
- package/dist/schema/methods/push.d.ts +8 -6
- package/dist/schema/methods/push.d.ts.map +1 -1
- package/dist/schema/methods/push.js +20 -7
- package/dist/schema/methods/push.js.map +1 -1
- package/dist/schema/methods/system.d.ts +4 -0
- package/dist/schema/methods/system.d.ts.map +1 -0
- package/dist/schema/methods/system.js +11 -0
- package/dist/schema/methods/system.js.map +1 -0
- package/dist/schema/presence.d.ts +1 -12
- package/dist/schema/presence.d.ts.map +1 -1
- package/dist/schema/presence.js +2 -7
- package/dist/schema/presence.js.map +1 -1
- package/dist/schema/surfaces.d.ts +31 -25
- package/dist/schema/surfaces.d.ts.map +1 -1
- package/dist/schema/surfaces.js +40 -21
- package/dist/schema/surfaces.js.map +1 -1
- package/dist/testing/agent-registration.d.ts +49 -0
- package/dist/testing/agent-registration.d.ts.map +1 -0
- package/dist/testing/agent-registration.js +77 -0
- package/dist/testing/agent-registration.js.map +1 -0
- package/dist/testing/arbitraries/frames.d.ts +24 -0
- package/dist/testing/arbitraries/frames.d.ts.map +1 -0
- package/dist/testing/arbitraries/frames.js +36 -0
- package/dist/testing/arbitraries/frames.js.map +1 -0
- package/dist/testing/arbitraries/from-typebox.d.ts +37 -0
- package/dist/testing/arbitraries/from-typebox.d.ts.map +1 -0
- package/dist/testing/arbitraries/from-typebox.js +131 -0
- package/dist/testing/arbitraries/from-typebox.js.map +1 -0
- package/dist/testing/arbitraries/index.d.ts +4 -0
- package/dist/testing/arbitraries/index.d.ts.map +1 -0
- package/dist/testing/arbitraries/index.js +4 -0
- package/dist/testing/arbitraries/index.js.map +1 -0
- package/dist/testing/arbitraries/rpc.d.ts +66 -0
- package/dist/testing/arbitraries/rpc.d.ts.map +1 -0
- package/dist/testing/arbitraries/rpc.js +98 -0
- package/dist/testing/arbitraries/rpc.js.map +1 -0
- package/dist/testing/canonicalize.d.ts +38 -0
- package/dist/testing/canonicalize.d.ts.map +1 -0
- package/dist/testing/canonicalize.js +55 -0
- package/dist/testing/canonicalize.js.map +1 -0
- package/dist/testing/captures.d.ts +61 -0
- package/dist/testing/captures.d.ts.map +1 -0
- package/dist/testing/captures.js +99 -0
- package/dist/testing/captures.js.map +1 -0
- package/dist/testing/codec.d.ts +44 -0
- package/dist/testing/codec.d.ts.map +1 -0
- package/dist/testing/codec.js +170 -0
- package/dist/testing/codec.js.map +1 -0
- package/dist/testing/conformance/__divergence_proofs__/executable-proof-helpers.d.ts +6 -0
- package/dist/testing/conformance/__divergence_proofs__/executable-proof-helpers.d.ts.map +1 -0
- package/dist/testing/conformance/__divergence_proofs__/executable-proof-helpers.js +33 -0
- package/dist/testing/conformance/__divergence_proofs__/executable-proof-helpers.js.map +1 -0
- package/dist/testing/conformance/adversity.d.ts +36 -0
- package/dist/testing/conformance/adversity.d.ts.map +1 -0
- package/dist/testing/conformance/adversity.js +360 -0
- package/dist/testing/conformance/adversity.js.map +1 -0
- package/dist/testing/conformance/boundary.d.ts +56 -0
- package/dist/testing/conformance/boundary.d.ts.map +1 -0
- package/dist/testing/conformance/boundary.js +129 -0
- package/dist/testing/conformance/boundary.js.map +1 -0
- package/dist/testing/conformance/client/_fixtures.d.ts +71 -0
- package/dist/testing/conformance/client/_fixtures.d.ts.map +1 -0
- package/dist/testing/conformance/client/_fixtures.js +102 -0
- package/dist/testing/conformance/client/_fixtures.js.map +1 -0
- package/dist/testing/conformance/client/adversity.d.ts +39 -0
- package/dist/testing/conformance/client/adversity.d.ts.map +1 -0
- package/dist/testing/conformance/client/adversity.js +162 -0
- package/dist/testing/conformance/client/adversity.js.map +1 -0
- package/dist/testing/conformance/client/boundary.d.ts +12 -0
- package/dist/testing/conformance/client/boundary.d.ts.map +1 -0
- package/dist/testing/conformance/client/boundary.js +68 -0
- package/dist/testing/conformance/client/boundary.js.map +1 -0
- package/dist/testing/conformance/client/delivery.d.ts +38 -0
- package/dist/testing/conformance/client/delivery.d.ts.map +1 -0
- package/dist/testing/conformance/client/delivery.js +202 -0
- package/dist/testing/conformance/client/delivery.js.map +1 -0
- package/dist/testing/conformance/client/index.d.ts +16 -0
- package/dist/testing/conformance/client/index.d.ts.map +1 -0
- package/dist/testing/conformance/client/index.js +16 -0
- package/dist/testing/conformance/client/index.js.map +1 -0
- package/dist/testing/conformance/client/rpc-semantics.d.ts +26 -0
- package/dist/testing/conformance/client/rpc-semantics.d.ts.map +1 -0
- package/dist/testing/conformance/client/rpc-semantics.js +145 -0
- package/dist/testing/conformance/client/rpc-semantics.js.map +1 -0
- package/dist/testing/conformance/client/runner.d.ts +258 -0
- package/dist/testing/conformance/client/runner.d.ts.map +1 -0
- package/dist/testing/conformance/client/runner.js +228 -0
- package/dist/testing/conformance/client/runner.js.map +1 -0
- package/dist/testing/conformance/client/schema-conformance.d.ts +25 -0
- package/dist/testing/conformance/client/schema-conformance.d.ts.map +1 -0
- package/dist/testing/conformance/client/schema-conformance.js +123 -0
- package/dist/testing/conformance/client/schema-conformance.js.map +1 -0
- package/dist/testing/conformance/client/suite.d.ts +90 -0
- package/dist/testing/conformance/client/suite.d.ts.map +1 -0
- package/dist/testing/conformance/client/suite.js +209 -0
- package/dist/testing/conformance/client/suite.js.map +1 -0
- package/dist/testing/conformance/coverage-policy.d.ts +8 -0
- package/dist/testing/conformance/coverage-policy.d.ts.map +1 -0
- package/dist/testing/conformance/coverage-policy.js +10 -0
- package/dist/testing/conformance/coverage-policy.js.map +1 -0
- package/dist/testing/conformance/delivery.d.ts +40 -0
- package/dist/testing/conformance/delivery.d.ts.map +1 -0
- package/dist/testing/conformance/delivery.js +231 -0
- package/dist/testing/conformance/delivery.js.map +1 -0
- package/dist/testing/conformance/env.d.ts +3 -0
- package/dist/testing/conformance/env.d.ts.map +1 -0
- package/dist/testing/conformance/env.js +14 -0
- package/dist/testing/conformance/env.js.map +1 -0
- package/dist/testing/conformance/index.d.ts +10 -0
- package/dist/testing/conformance/index.d.ts.map +1 -0
- package/dist/testing/conformance/index.js +10 -0
- package/dist/testing/conformance/index.js.map +1 -0
- package/dist/testing/conformance/registry.d.ts +93 -0
- package/dist/testing/conformance/registry.d.ts.map +1 -0
- package/dist/testing/conformance/registry.js +62 -0
- package/dist/testing/conformance/registry.js.map +1 -0
- package/dist/testing/conformance/rpc-semantics.d.ts +67 -0
- package/dist/testing/conformance/rpc-semantics.d.ts.map +1 -0
- package/dist/testing/conformance/rpc-semantics.js +394 -0
- package/dist/testing/conformance/rpc-semantics.js.map +1 -0
- package/dist/testing/conformance/runner.d.ts +78 -0
- package/dist/testing/conformance/runner.d.ts.map +1 -0
- package/dist/testing/conformance/runner.js +65 -0
- package/dist/testing/conformance/runner.js.map +1 -0
- package/dist/testing/conformance/schema-conformance.d.ts +30 -0
- package/dist/testing/conformance/schema-conformance.d.ts.map +1 -0
- package/dist/testing/conformance/schema-conformance.js +229 -0
- package/dist/testing/conformance/schema-conformance.js.map +1 -0
- package/dist/testing/conformance/suite.d.ts +92 -0
- package/dist/testing/conformance/suite.d.ts.map +1 -0
- package/dist/testing/conformance/suite.js +233 -0
- package/dist/testing/conformance/suite.js.map +1 -0
- package/dist/testing/errors.d.ts +78 -0
- package/dist/testing/errors.d.ts.map +1 -0
- package/dist/testing/errors.js +34 -0
- package/dist/testing/errors.js.map +1 -0
- package/dist/testing/index.d.ts +25 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +37 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/models/dispatch.d.ts +61 -0
- package/dist/testing/models/dispatch.d.ts.map +1 -0
- package/dist/testing/models/dispatch.js +197 -0
- package/dist/testing/models/dispatch.js.map +1 -0
- package/dist/testing/models/index.d.ts +3 -0
- package/dist/testing/models/index.d.ts.map +1 -0
- package/dist/testing/models/index.js +3 -0
- package/dist/testing/models/index.js.map +1 -0
- package/dist/testing/models/state.d.ts +37 -0
- package/dist/testing/models/state.d.ts.map +1 -0
- package/dist/testing/models/state.js +14 -0
- package/dist/testing/models/state.js.map +1 -0
- package/dist/testing/test-client.d.ts +70 -0
- package/dist/testing/test-client.d.ts.map +1 -0
- package/dist/testing/test-client.js +266 -0
- package/dist/testing/test-client.js.map +1 -0
- package/dist/testing/test-server.d.ts +62 -0
- package/dist/testing/test-server.d.ts.map +1 -0
- package/dist/testing/test-server.js +134 -0
- package/dist/testing/test-server.js.map +1 -0
- package/dist/testing/toxics/client.d.ts +52 -0
- package/dist/testing/toxics/client.d.ts.map +1 -0
- package/dist/testing/toxics/client.js +120 -0
- package/dist/testing/toxics/client.js.map +1 -0
- package/dist/testing/toxics/defaults.d.ts +43 -0
- package/dist/testing/toxics/defaults.d.ts.map +1 -0
- package/dist/testing/toxics/defaults.js +9 -0
- package/dist/testing/toxics/defaults.js.map +1 -0
- package/dist/testing/toxics/index.d.ts +4 -0
- package/dist/testing/toxics/index.d.ts.map +1 -0
- package/dist/testing/toxics/index.js +4 -0
- package/dist/testing/toxics/index.js.map +1 -0
- package/dist/testing/toxics/profile.d.ts +69 -0
- package/dist/testing/toxics/profile.d.ts.map +1 -0
- package/dist/testing/toxics/profile.js +57 -0
- package/dist/testing/toxics/profile.js.map +1 -0
- package/dist/types.d.ts +7 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -1
- package/dist/validators.d.ts +49 -177
- package/dist/validators.d.ts.map +1 -1
- package/dist/validators.js +77 -48
- package/dist/validators.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +12 -34
- package/dist/optional/contact-events.d.ts +0 -3
- package/dist/optional/contact-events.d.ts.map +0 -1
- package/dist/optional/contact-events.js +0 -5
- package/dist/optional/contact-events.js.map +0 -1
- package/dist/optional/contact-methods.d.ts +0 -5
- package/dist/optional/contact-methods.d.ts.map +0 -1
- package/dist/optional/contact-methods.js +0 -5
- package/dist/optional/contact-methods.js.map +0 -1
- package/dist/phone-hash.d.ts +0 -10
- package/dist/phone-hash.d.ts.map +0 -1
- package/dist/phone-hash.js +0 -17
- package/dist/phone-hash.js.map +0 -1
- package/dist/schema/methods/phone-contacts.d.ts +0 -30
- package/dist/schema/methods/phone-contacts.d.ts.map +0 -1
- package/dist/schema/methods/phone-contacts.js +0 -10
- package/dist/schema/methods/phone-contacts.js.map +0 -1
- package/dist/test-client.d.ts +0 -34
- package/dist/test-client.d.ts.map +0 -1
- package/dist/test-client.js +0 -176
- package/dist/test-client.js.map +0 -1
- package/dist/test-fixtures/phone-hashes.d.ts +0 -18
- package/dist/test-fixtures/phone-hashes.d.ts.map +0 -1
- package/dist/test-fixtures/phone-hashes.js +0 -24
- package/dist/test-fixtures/phone-hashes.js.map +0 -1
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frame codec for the testing primitives.
|
|
3
|
+
*
|
|
4
|
+
* Satisfies §5.A1/A2/A3/A4 and Invariant I3: every frame crossing a
|
|
5
|
+
* primitive is `Value.Check`-validated before it is surfaced to property
|
|
6
|
+
* code. Malformed-frame arbitraries are generated *here* so Tier A can
|
|
7
|
+
* inject bit-flips, truncations, and oversized frames without leaking the
|
|
8
|
+
* malformation strategy into the primitives.
|
|
9
|
+
*/
|
|
10
|
+
import { Effect } from "effect";
|
|
11
|
+
import { Value } from "@sinclair/typebox/value";
|
|
12
|
+
import { RequestFrameSchema, ResponseFrameSchema, EventFrameSchema, } from "../schema/frames.js";
|
|
13
|
+
import { FrameSchemaError } from "./errors.js";
|
|
14
|
+
/** Serialize a typed frame to the wire bytes. */
|
|
15
|
+
export function encodeFrame(frame) {
|
|
16
|
+
return JSON.stringify(frame);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse + `Value.Check` an inbound frame. `FrameSchemaError` captures
|
|
20
|
+
* the failing branch so Tier A can assert "drop or typed error, never
|
|
21
|
+
* crash."
|
|
22
|
+
*/
|
|
23
|
+
export function decodeFrame(raw, direction) {
|
|
24
|
+
return Effect.suspend(() => {
|
|
25
|
+
let parsed;
|
|
26
|
+
try {
|
|
27
|
+
parsed = JSON.parse(raw);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
return Effect.fail(new FrameSchemaError({
|
|
31
|
+
direction,
|
|
32
|
+
expected: "request",
|
|
33
|
+
raw,
|
|
34
|
+
reason: `json parse failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
if (parsed === null ||
|
|
38
|
+
typeof parsed !== "object" ||
|
|
39
|
+
!("type" in parsed) ||
|
|
40
|
+
typeof parsed.type !== "string") {
|
|
41
|
+
return Effect.fail(new FrameSchemaError({
|
|
42
|
+
direction,
|
|
43
|
+
expected: "request",
|
|
44
|
+
raw,
|
|
45
|
+
reason: "frame missing required `type` discriminator",
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
const type = parsed.type;
|
|
49
|
+
switch (type) {
|
|
50
|
+
case "request":
|
|
51
|
+
if (Value.Check(RequestFrameSchema, parsed)) {
|
|
52
|
+
return Effect.succeed(parsed);
|
|
53
|
+
}
|
|
54
|
+
return Effect.fail(new FrameSchemaError({
|
|
55
|
+
direction,
|
|
56
|
+
expected: "request",
|
|
57
|
+
raw,
|
|
58
|
+
reason: firstValueError(RequestFrameSchema, parsed),
|
|
59
|
+
}));
|
|
60
|
+
case "response":
|
|
61
|
+
if (Value.Check(ResponseFrameSchema, parsed)) {
|
|
62
|
+
return Effect.succeed(parsed);
|
|
63
|
+
}
|
|
64
|
+
return Effect.fail(new FrameSchemaError({
|
|
65
|
+
direction,
|
|
66
|
+
expected: "response",
|
|
67
|
+
raw,
|
|
68
|
+
reason: firstValueError(ResponseFrameSchema, parsed),
|
|
69
|
+
}));
|
|
70
|
+
case "event":
|
|
71
|
+
if (Value.Check(EventFrameSchema, parsed)) {
|
|
72
|
+
return Effect.succeed(parsed);
|
|
73
|
+
}
|
|
74
|
+
return Effect.fail(new FrameSchemaError({
|
|
75
|
+
direction,
|
|
76
|
+
expected: "event",
|
|
77
|
+
raw,
|
|
78
|
+
reason: firstValueError(EventFrameSchema, parsed),
|
|
79
|
+
}));
|
|
80
|
+
default:
|
|
81
|
+
return Effect.fail(new FrameSchemaError({
|
|
82
|
+
direction,
|
|
83
|
+
expected: "request",
|
|
84
|
+
raw,
|
|
85
|
+
reason: `unknown frame type: ${type}`,
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function firstValueError(schema, value) {
|
|
91
|
+
const iter = Value.Errors(schema, value);
|
|
92
|
+
for (const err of iter) {
|
|
93
|
+
return `${err.path}: ${err.message}`;
|
|
94
|
+
}
|
|
95
|
+
return "schema check failed";
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Produce a malformed wire payload from a valid frame. The mutation is
|
|
99
|
+
* deterministic given the `kind` + `seed`; replaying with the same seed
|
|
100
|
+
* reproduces the exact bytes. Used by Tier A (A4) and Tier D (D3).
|
|
101
|
+
*/
|
|
102
|
+
export function malformFrame(base, kind, seed) {
|
|
103
|
+
const rawJson = encodeFrame(base);
|
|
104
|
+
// Deterministic LCG so a `seed` reproduces byte-for-byte. Not crypto.
|
|
105
|
+
const rand = lcg(seed);
|
|
106
|
+
switch (kind) {
|
|
107
|
+
case "bit-flip": {
|
|
108
|
+
if (rawJson.length === 0)
|
|
109
|
+
return rawJson;
|
|
110
|
+
const pos = Math.floor(rand() * rawJson.length);
|
|
111
|
+
const ch = rawJson.charCodeAt(pos);
|
|
112
|
+
// Flip one bit in the low byte (XOR with 1<<bit).
|
|
113
|
+
const bit = Math.floor(rand() * 8);
|
|
114
|
+
const flipped = String.fromCharCode(ch ^ (1 << bit));
|
|
115
|
+
return rawJson.slice(0, pos) + flipped + rawJson.slice(pos + 1);
|
|
116
|
+
}
|
|
117
|
+
case "truncated": {
|
|
118
|
+
if (rawJson.length <= 1)
|
|
119
|
+
return "";
|
|
120
|
+
const keep = Math.max(1, Math.floor(rawJson.length * rand()));
|
|
121
|
+
return rawJson.slice(0, keep);
|
|
122
|
+
}
|
|
123
|
+
case "oversized": {
|
|
124
|
+
// Pad with a long run of whitespace-in-string to exceed likely frame caps.
|
|
125
|
+
// Uses `_padding` field at top level of the JSON object, which
|
|
126
|
+
// `additionalProperties: false` rejects — also triggers "extra-property"
|
|
127
|
+
// under different framing, but here the point is byte-size.
|
|
128
|
+
const padLen = 64 * 1024;
|
|
129
|
+
const pad = "X".repeat(padLen);
|
|
130
|
+
// Splice "_padding":"...", before the closing `}`.
|
|
131
|
+
const idx = rawJson.lastIndexOf("}");
|
|
132
|
+
if (idx === -1)
|
|
133
|
+
return rawJson + pad;
|
|
134
|
+
return `${rawJson.slice(0, idx)},"_padding":"${pad}"}`;
|
|
135
|
+
}
|
|
136
|
+
case "invalid-utf8": {
|
|
137
|
+
// Insert a lone surrogate. JSON parser may accept; TypeBox Check rejects
|
|
138
|
+
// because frame strings (method, id) are expected to be UTF-8 clean.
|
|
139
|
+
const pos = Math.floor(rand() * rawJson.length);
|
|
140
|
+
return rawJson.slice(0, pos) + "\uD800" + rawJson.slice(pos);
|
|
141
|
+
}
|
|
142
|
+
case "missing-required-field": {
|
|
143
|
+
// Remove the `jsonrpc` required property.
|
|
144
|
+
return rawJson.replace(/"jsonrpc":"2\.0",?/, "");
|
|
145
|
+
}
|
|
146
|
+
case "extra-property": {
|
|
147
|
+
const idx = rawJson.lastIndexOf("}");
|
|
148
|
+
if (idx === -1)
|
|
149
|
+
return rawJson;
|
|
150
|
+
return `${rawJson.slice(0, idx)},"__extra":${seed}}`;
|
|
151
|
+
}
|
|
152
|
+
default: {
|
|
153
|
+
const _exhaustive = kind;
|
|
154
|
+
throw new Error(`malformFrame: unexpected kind ${String(_exhaustive)}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Deterministic LCG (Numerical Recipes constants). Given the same seed,
|
|
160
|
+
* yields the same sequence of floats in [0, 1). Good enough for reproducible
|
|
161
|
+
* mutation offsets; not for cryptographic use.
|
|
162
|
+
*/
|
|
163
|
+
function lcg(seed) {
|
|
164
|
+
let s = seed >>> 0 || 1;
|
|
165
|
+
return () => {
|
|
166
|
+
s = (Math.imul(s, 1664525) + 1013904223) >>> 0;
|
|
167
|
+
return s / 0x100000000;
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/testing/codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { type PropertyFailure, type RegisteredProperty } from "../registry.js";
|
|
3
|
+
export declare function runExpectingFailure(property: RegisteredProperty): Effect.Effect<PropertyFailure>;
|
|
4
|
+
export declare function expectInvariant(failure: PropertyFailure, propertyName: string): void;
|
|
5
|
+
export declare function expectAssertionFailure(failure: PropertyFailure, propertyName: string): void;
|
|
6
|
+
//# sourceMappingURL=executable-proof-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executable-proof-helpers.d.ts","sourceRoot":"","sources":["../../../../src/testing/conformance/__divergence_proofs__/executable-proof-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,EAAU,MAAM,QAAQ,CAAC;AACtD,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAExB,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,kBAAkB,GAC3B,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAiBhC;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,MAAM,GACnB,IAAI,CAON;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,MAAM,GACnB,IAAI,CAON"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Cause, Chunk, Effect, Option } from "effect";
|
|
2
|
+
import { PropertyAssertionFailure, PropertyInvariantViolation, } from "../registry.js";
|
|
3
|
+
export function runExpectingFailure(property) {
|
|
4
|
+
return Effect.gen(function* () {
|
|
5
|
+
const exit = yield* Effect.exit(property.run);
|
|
6
|
+
if (exit._tag === "Success") {
|
|
7
|
+
return yield* Effect.die(new Error(`${property.category}/${property.name} unexpectedly passed`));
|
|
8
|
+
}
|
|
9
|
+
const failures = Cause.failures(exit.cause);
|
|
10
|
+
const failure = Option.getOrNull(Chunk.head(failures));
|
|
11
|
+
if (failure === null) {
|
|
12
|
+
return yield* Effect.die(new Error(`expected typed failure, got ${exit.cause.toString()}`));
|
|
13
|
+
}
|
|
14
|
+
return failure;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export function expectInvariant(failure, propertyName) {
|
|
18
|
+
if (!(failure instanceof PropertyInvariantViolation)) {
|
|
19
|
+
throw new Error(`expected invariant failure, got ${failure._tag}`);
|
|
20
|
+
}
|
|
21
|
+
if (failure.name !== propertyName) {
|
|
22
|
+
throw new Error(`expected ${propertyName}, got ${failure.name}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function expectAssertionFailure(failure, propertyName) {
|
|
26
|
+
if (!(failure instanceof PropertyAssertionFailure)) {
|
|
27
|
+
throw new Error(`expected assertion failure, got ${failure._tag}`);
|
|
28
|
+
}
|
|
29
|
+
if (failure.name !== propertyName) {
|
|
30
|
+
throw new Error(`expected ${propertyName}, got ${failure.name}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=executable-proof-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executable-proof-helpers.js","sourceRoot":"","sources":["../../../../src/testing/conformance/__divergence_proofs__/executable-proof-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,EACL,wBAAwB,EACxB,0BAA0B,GAG3B,MAAM,gBAAgB,CAAC;AAExB,MAAM,UAAU,mBAAmB,CACjC,QAA4B;IAE5B,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACtB,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,sBAAsB,CAAC,CACvE,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACtB,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAClE,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAAwB,EACxB,YAAoB;IAEpB,IAAI,CAAC,CAAC,OAAO,YAAY,0BAA0B,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,YAAY,YAAY,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAAwB,EACxB,YAAoB;IAEpB,IAAI,CAAC,CAAC,OAAO,YAAY,wBAAwB,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,YAAY,YAAY,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ConformanceRunContext } from "./runner.js";
|
|
2
|
+
/**
|
|
3
|
+
* Latency — owner + participant route through a latency proxy. Owner
|
|
4
|
+
* sends `messages/send`; participant observes ≥1 inbound message
|
|
5
|
+
* event. Latency merely slows delivery; it must not drop events.
|
|
6
|
+
*/
|
|
7
|
+
export declare function registerLatencyResilience(ctx: ConformanceRunContext): void;
|
|
8
|
+
/** Backpressure — DEFERRED to epic #186. */
|
|
9
|
+
export declare function registerBackpressure(ctx: ConformanceRunContext): void;
|
|
10
|
+
/**
|
|
11
|
+
* Slicer — partial-frame splits must not corrupt payload. Owner sends
|
|
12
|
+
* a message with a distinctive token; participant's snapshot contains
|
|
13
|
+
* that token verbatim.
|
|
14
|
+
*/
|
|
15
|
+
export declare function registerSlicerFraming(ctx: ConformanceRunContext): void;
|
|
16
|
+
/**
|
|
17
|
+
* reset_peer — mid-flight the toxic forcibly resets the connection.
|
|
18
|
+
* Spec invariant: sender's RPCs surface a typed `TransportClosedError`,
|
|
19
|
+
* never hang, never crash. Full store-and-replay (reconnect + missed-
|
|
20
|
+
* event replay) is a consumer-side concern driven by each real client
|
|
21
|
+
* against `TestServer`; protocol-level guarantee is that the TestClient
|
|
22
|
+
* surfaces the transport failure as a typed outcome.
|
|
23
|
+
*/
|
|
24
|
+
export declare function registerResetPeerRecovery(ctx: ConformanceRunContext): void;
|
|
25
|
+
/**
|
|
26
|
+
* timeout — the toxic black-holes forwarding; the client must surface
|
|
27
|
+
* a typed `RpcTimeoutError` within its own timeout budget (not hang).
|
|
28
|
+
*/
|
|
29
|
+
export declare function registerTimeoutSurface(ctx: ConformanceRunContext): void;
|
|
30
|
+
/**
|
|
31
|
+
* slow_close — close-frames are delayed by the toxic. The scope
|
|
32
|
+
* release must still complete within a bounded window so the suite
|
|
33
|
+
* doesn't leak descriptors.
|
|
34
|
+
*/
|
|
35
|
+
export declare function registerSlowCloseCleanup(ctx: ConformanceRunContext): void;
|
|
36
|
+
//# sourceMappingURL=adversity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adversity.d.ts","sourceRoot":"","sources":["../../../src/testing/conformance/adversity.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AA4IzD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CAiE1E;AAED,4CAA4C;AAC5C,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CAcrE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CAgEtE;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CAkD1E;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CAgEvE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CAyCzE"}
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adversity — each toxic property asserts the specific invariant spec
|
|
3
|
+
* #181 §5 names for that toxic. Not a one-size-fits-all body: the
|
|
4
|
+
* toxics have different failure modes, and the spec's contract for each
|
|
5
|
+
* is different.
|
|
6
|
+
*
|
|
7
|
+
* Historical grouping note: spec #181 §5 calls this "Tier D". Code uses
|
|
8
|
+
* semantic names only. Backpressure is a tombstone (→ #186).
|
|
9
|
+
*
|
|
10
|
+
* | Toxic | Spec asks (paraphrased) |
|
|
11
|
+
* |-------------|------------------------------------------------------|
|
|
12
|
+
* | latency | delivery invariant still holds under added latency |
|
|
13
|
+
* | slicer | delivery holds + payload byte-identical through splits |
|
|
14
|
+
* | reset_peer | sender's RPCs surface typed TransportClosedError |
|
|
15
|
+
* | timeout | caller surfaces typed RpcTimeoutError within budget |
|
|
16
|
+
* | slow_close | scope release completes within a bounded window |
|
|
17
|
+
*
|
|
18
|
+
* Principle 3: every property body is `Effect<void, PropertyFailure>`
|
|
19
|
+
* — no bare throws, no `Effect.void` shortcuts.
|
|
20
|
+
*/
|
|
21
|
+
import { Clock, Effect } from "effect";
|
|
22
|
+
import { defaultToxicProfile } from "../toxics/defaults.js";
|
|
23
|
+
import { makeTestClient } from "../test-client.js";
|
|
24
|
+
import { registerTestAgent } from "../agent-registration.js";
|
|
25
|
+
import { PropertyDeferred, PropertyInvariantViolation, PropertyUnavailable, registerProperty, } from "./registry.js";
|
|
26
|
+
const CATEGORY = "adversity";
|
|
27
|
+
const DEFAULT_CAPTURE_CAPACITY = 128;
|
|
28
|
+
/** Acquire a TestClient that routes through the Toxiproxy proxy. */
|
|
29
|
+
function acquireProxiedClient(ctx, proxy, name, defaultTimeoutMs, unavailable) {
|
|
30
|
+
// Preserve the upstream path (e.g., `/ws`) when building the
|
|
31
|
+
// proxy-facing URL: Toxiproxy is a raw TCP forwarder, so the client's
|
|
32
|
+
// upgrade path must match what the server's HTTP router expects.
|
|
33
|
+
const upstreamPath = new URL(ctx.realServer.wsUrl).pathname;
|
|
34
|
+
const proxiedUrl = `${proxy.listenUrl}${upstreamPath}`;
|
|
35
|
+
return Effect.gen(function* () {
|
|
36
|
+
const agent = yield* registerTestAgent({
|
|
37
|
+
baseUrl: ctx.realServer.baseUrl,
|
|
38
|
+
name,
|
|
39
|
+
}).pipe(Effect.mapError((e) => unavailable(`register: ${e.body}`)));
|
|
40
|
+
const client = yield* makeTestClient({
|
|
41
|
+
serverUrl: proxiedUrl,
|
|
42
|
+
agentKey: agent.apiKey,
|
|
43
|
+
agentId: agent.agentId,
|
|
44
|
+
defaultTimeoutMs,
|
|
45
|
+
captureCapacity: DEFAULT_CAPTURE_CAPACITY,
|
|
46
|
+
}).pipe(Effect.mapError((e) => unavailable(`makeTestClient: ${String(e)}`)));
|
|
47
|
+
return { agent, client };
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Factory — wire a Toxiproxy proxy + attach the toxic; hand a body the
|
|
52
|
+
* proxy. Hard-deadlines each property body so a hanging toxic can't
|
|
53
|
+
* block the suite indefinitely; if the deadline fires, the property
|
|
54
|
+
* reports `PropertyUnavailable` (not a pass, not a crash).
|
|
55
|
+
*/
|
|
56
|
+
const PROPERTY_BUDGET_MS = 15_000;
|
|
57
|
+
function withToxicProxy(opts) {
|
|
58
|
+
const { ctx, propertyName, description, proxyName, profile, body } = opts;
|
|
59
|
+
const toxiproxy = ctx.toxiproxy;
|
|
60
|
+
const run = toxiproxy === null
|
|
61
|
+
? Effect.fail(new PropertyUnavailable({
|
|
62
|
+
category: CATEGORY,
|
|
63
|
+
name: propertyName,
|
|
64
|
+
reason: "Toxiproxy client not provisioned for this run",
|
|
65
|
+
}))
|
|
66
|
+
: (() => {
|
|
67
|
+
const upstreamHostPort = ctx.realServer.wsUrl
|
|
68
|
+
.replace(/^ws:\/\//, "")
|
|
69
|
+
.replace(/\/.*$/, "");
|
|
70
|
+
const unavailable = (reason) => new PropertyUnavailable({
|
|
71
|
+
category: CATEGORY,
|
|
72
|
+
name: propertyName,
|
|
73
|
+
reason,
|
|
74
|
+
});
|
|
75
|
+
return Effect.scoped(Effect.gen(function* () {
|
|
76
|
+
const proxy = yield* toxiproxy
|
|
77
|
+
.proxy({ name: proxyName, upstream: upstreamHostPort })
|
|
78
|
+
.pipe(Effect.mapError((e) => unavailable(`proxy: ${e.body}`)));
|
|
79
|
+
const attachToxic = proxy
|
|
80
|
+
.withToxic(profile)
|
|
81
|
+
.pipe(Effect.mapError((e) => unavailable(`toxic: ${e.body}`)), Effect.asVoid);
|
|
82
|
+
yield* body({ proxy, unavailable, attachToxic });
|
|
83
|
+
})).pipe(Effect.timeoutFail({
|
|
84
|
+
duration: `${PROPERTY_BUDGET_MS} millis`,
|
|
85
|
+
onTimeout: () => unavailable(`property exceeded ${PROPERTY_BUDGET_MS}ms budget under toxic`),
|
|
86
|
+
}));
|
|
87
|
+
})();
|
|
88
|
+
registerProperty(ctx, CATEGORY, propertyName, description, run);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Latency — owner + participant route through a latency proxy. Owner
|
|
92
|
+
* sends `messages/send`; participant observes ≥1 inbound message
|
|
93
|
+
* event. Latency merely slows delivery; it must not drop events.
|
|
94
|
+
*/
|
|
95
|
+
export function registerLatencyResilience(ctx) {
|
|
96
|
+
withToxicProxy({
|
|
97
|
+
ctx,
|
|
98
|
+
propertyName: "latency-resilience",
|
|
99
|
+
description: "fan-out delivery survives added latency + jitter",
|
|
100
|
+
proxyName: `lat-${ctx.seed}-${Math.random().toString(36).slice(2, 8)}`,
|
|
101
|
+
profile: defaultToxicProfile.latency,
|
|
102
|
+
body: ({ proxy, unavailable, attachToxic }) => Effect.gen(function* () {
|
|
103
|
+
const owner = yield* acquireProxiedClient(ctx, proxy, `lat-${ctx.seed}-o`, 6000, unavailable);
|
|
104
|
+
const participant = yield* acquireProxiedClient(ctx, proxy, `lat-${ctx.seed}-p`, 6000, unavailable);
|
|
105
|
+
const conv = yield* createOneOnOneConversation(owner, participant);
|
|
106
|
+
if (conv.kind !== "ok") {
|
|
107
|
+
return yield* Effect.fail(new PropertyInvariantViolation({
|
|
108
|
+
category: CATEGORY,
|
|
109
|
+
name: "latency-resilience",
|
|
110
|
+
reason: conv.reason,
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
yield* Effect.scoped(Effect.gen(function* () {
|
|
114
|
+
yield* attachToxic;
|
|
115
|
+
yield* owner.client
|
|
116
|
+
.sendRpc("messages/send", {
|
|
117
|
+
conversationId: conv.conversationId,
|
|
118
|
+
parts: [{ type: "text", text: "lat-ping" }],
|
|
119
|
+
})
|
|
120
|
+
.pipe(Effect.either);
|
|
121
|
+
// 100ms latency + 50ms jitter → 600ms window is generous.
|
|
122
|
+
yield* Effect.sleep("600 millis");
|
|
123
|
+
}));
|
|
124
|
+
const snap = yield* participant.client.snapshot;
|
|
125
|
+
const delivered = snap.filter((s) => s.kind === "inbound" &&
|
|
126
|
+
s.frame?.type === "event" &&
|
|
127
|
+
typeof s.frame.event === "string" &&
|
|
128
|
+
s.frame.event.includes("message")).length;
|
|
129
|
+
if (delivered === 0) {
|
|
130
|
+
return yield* Effect.fail(new PropertyInvariantViolation({
|
|
131
|
+
category: CATEGORY,
|
|
132
|
+
name: "latency-resilience",
|
|
133
|
+
reason: "latency toxic dropped all events",
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
}),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/** Backpressure — DEFERRED to epic #186. */
|
|
140
|
+
export function registerBackpressure(ctx) {
|
|
141
|
+
registerProperty(ctx, CATEGORY, "backpressure", "backpressure property deferred to #186 — BackpressurePolicy not extant", Effect.fail(new PropertyDeferred({
|
|
142
|
+
category: CATEGORY,
|
|
143
|
+
name: "backpressure",
|
|
144
|
+
followUp: "https://github.com/chughtapan/moltzap/issues/186",
|
|
145
|
+
})));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Slicer — partial-frame splits must not corrupt payload. Owner sends
|
|
149
|
+
* a message with a distinctive token; participant's snapshot contains
|
|
150
|
+
* that token verbatim.
|
|
151
|
+
*/
|
|
152
|
+
export function registerSlicerFraming(ctx) {
|
|
153
|
+
withToxicProxy({
|
|
154
|
+
ctx,
|
|
155
|
+
propertyName: "slicer-framing",
|
|
156
|
+
description: "partial-frame slicing preserves payload byte-identity",
|
|
157
|
+
proxyName: `sli-${ctx.seed}-${Math.random().toString(36).slice(2, 8)}`,
|
|
158
|
+
profile: defaultToxicProfile.slicer,
|
|
159
|
+
body: ({ proxy, unavailable, attachToxic }) => Effect.gen(function* () {
|
|
160
|
+
const owner = yield* acquireProxiedClient(ctx, proxy, `sli-${ctx.seed}-o`, 8000, unavailable);
|
|
161
|
+
const participant = yield* acquireProxiedClient(ctx, proxy, `sli-${ctx.seed}-p`, 8000, unavailable);
|
|
162
|
+
const conv = yield* createOneOnOneConversation(owner, participant);
|
|
163
|
+
if (conv.kind !== "ok") {
|
|
164
|
+
return yield* Effect.fail(new PropertyInvariantViolation({
|
|
165
|
+
category: CATEGORY,
|
|
166
|
+
name: "slicer-framing",
|
|
167
|
+
reason: conv.reason,
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
const token = `sli-token-${ctx.seed}-${Date.now().toString(36)}`;
|
|
171
|
+
yield* Effect.scoped(Effect.gen(function* () {
|
|
172
|
+
yield* attachToxic;
|
|
173
|
+
yield* owner.client
|
|
174
|
+
.sendRpc("messages/send", {
|
|
175
|
+
conversationId: conv.conversationId,
|
|
176
|
+
parts: [{ type: "text", text: token }],
|
|
177
|
+
})
|
|
178
|
+
.pipe(Effect.either);
|
|
179
|
+
yield* Effect.sleep("1200 millis"); // slicer fragments are slow
|
|
180
|
+
}));
|
|
181
|
+
const snap = yield* participant.client.snapshot;
|
|
182
|
+
const matched = snap.some((s) => s.kind === "inbound" &&
|
|
183
|
+
s.frame?.type === "event" &&
|
|
184
|
+
s.raw.includes(token));
|
|
185
|
+
if (!matched) {
|
|
186
|
+
return yield* Effect.fail(new PropertyInvariantViolation({
|
|
187
|
+
category: CATEGORY,
|
|
188
|
+
name: "slicer-framing",
|
|
189
|
+
reason: `token ${token} not reassembled in participant's frames`,
|
|
190
|
+
}));
|
|
191
|
+
}
|
|
192
|
+
}),
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* reset_peer — mid-flight the toxic forcibly resets the connection.
|
|
197
|
+
* Spec invariant: sender's RPCs surface a typed `TransportClosedError`,
|
|
198
|
+
* never hang, never crash. Full store-and-replay (reconnect + missed-
|
|
199
|
+
* event replay) is a consumer-side concern driven by each real client
|
|
200
|
+
* against `TestServer`; protocol-level guarantee is that the TestClient
|
|
201
|
+
* surfaces the transport failure as a typed outcome.
|
|
202
|
+
*/
|
|
203
|
+
export function registerResetPeerRecovery(ctx) {
|
|
204
|
+
withToxicProxy({
|
|
205
|
+
ctx,
|
|
206
|
+
propertyName: "reset-peer-recovery",
|
|
207
|
+
description: "reset_peer surfaces TransportClosedError without hanging",
|
|
208
|
+
proxyName: `rst-${ctx.seed}-${Math.random().toString(36).slice(2, 8)}`,
|
|
209
|
+
profile: defaultToxicProfile.reset_peer,
|
|
210
|
+
body: ({ proxy, unavailable, attachToxic }) => Effect.gen(function* () {
|
|
211
|
+
const sender = yield* acquireProxiedClient(ctx, proxy, `rst-${ctx.seed}-s`,
|
|
212
|
+
// Deadline > reset_peer.timeoutMs (2000); bounded so a
|
|
213
|
+
// never-firing reset doesn't hang the suite.
|
|
214
|
+
4000, unavailable);
|
|
215
|
+
const observed = yield* Effect.scoped(Effect.gen(function* () {
|
|
216
|
+
yield* attachToxic;
|
|
217
|
+
const start = yield* Clock.currentTimeMillis;
|
|
218
|
+
for (let i = 0; i < 10; i++) {
|
|
219
|
+
const outcome = yield* sender.client
|
|
220
|
+
.sendRpc("conversations/list", {})
|
|
221
|
+
.pipe(Effect.either);
|
|
222
|
+
if (outcome._tag === "Left" &&
|
|
223
|
+
outcome.left._tag === "TestingTransportClosedError") {
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
yield* Effect.sleep("300 millis");
|
|
227
|
+
const elapsed = (yield* Clock.currentTimeMillis) - start;
|
|
228
|
+
if (elapsed > 3500)
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
return false;
|
|
232
|
+
}));
|
|
233
|
+
if (!observed) {
|
|
234
|
+
return yield* Effect.fail(new PropertyUnavailable({
|
|
235
|
+
category: CATEGORY,
|
|
236
|
+
name: "reset-peer-recovery",
|
|
237
|
+
reason: "reset_peer toxic did not close within 3.5s budget",
|
|
238
|
+
}));
|
|
239
|
+
}
|
|
240
|
+
}),
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* timeout — the toxic black-holes forwarding; the client must surface
|
|
245
|
+
* a typed `RpcTimeoutError` within its own timeout budget (not hang).
|
|
246
|
+
*/
|
|
247
|
+
export function registerTimeoutSurface(ctx) {
|
|
248
|
+
withToxicProxy({
|
|
249
|
+
ctx,
|
|
250
|
+
propertyName: "timeout-surface",
|
|
251
|
+
description: "timeout toxic surfaces typed RpcTimeoutError within budget",
|
|
252
|
+
proxyName: `to-${ctx.seed}-${Math.random().toString(36).slice(2, 8)}`,
|
|
253
|
+
profile: defaultToxicProfile.timeout,
|
|
254
|
+
body: ({ proxy, unavailable, attachToxic }) => Effect.gen(function* () {
|
|
255
|
+
// Client timeout must be LESS than the toxic's forwarding
|
|
256
|
+
// timeout so the RPC hits the client-side deadline first.
|
|
257
|
+
// defaultToxicProfile.timeout.timeoutMs = 5000. Set client to
|
|
258
|
+
// 1500ms for a fast, clear timeout surface.
|
|
259
|
+
const proxied = yield* acquireProxiedClient(ctx, proxy, `to-${ctx.seed}-c`, 1500, unavailable);
|
|
260
|
+
const { outcomeTag, elapsed } = yield* Effect.scoped(Effect.gen(function* () {
|
|
261
|
+
yield* attachToxic;
|
|
262
|
+
const start = yield* Clock.currentTimeMillis;
|
|
263
|
+
const outcome = yield* proxied.client
|
|
264
|
+
.sendRpc("conversations/list", {})
|
|
265
|
+
.pipe(Effect.either);
|
|
266
|
+
const elapsed = (yield* Clock.currentTimeMillis) - start;
|
|
267
|
+
return {
|
|
268
|
+
outcomeTag: outcome._tag === "Right" ? "success" : outcome.left._tag,
|
|
269
|
+
elapsed,
|
|
270
|
+
};
|
|
271
|
+
}));
|
|
272
|
+
if (outcomeTag === "success") {
|
|
273
|
+
return yield* Effect.fail(new PropertyInvariantViolation({
|
|
274
|
+
category: CATEGORY,
|
|
275
|
+
name: "timeout-surface",
|
|
276
|
+
reason: "RPC through timeout toxic unexpectedly succeeded",
|
|
277
|
+
}));
|
|
278
|
+
}
|
|
279
|
+
if (outcomeTag !== "TestingRpcTimeoutError") {
|
|
280
|
+
return yield* Effect.fail(new PropertyInvariantViolation({
|
|
281
|
+
category: CATEGORY,
|
|
282
|
+
name: "timeout-surface",
|
|
283
|
+
reason: `expected RpcTimeoutError, got ${outcomeTag}`,
|
|
284
|
+
}));
|
|
285
|
+
}
|
|
286
|
+
if (elapsed > 3000) {
|
|
287
|
+
return yield* Effect.fail(new PropertyInvariantViolation({
|
|
288
|
+
category: CATEGORY,
|
|
289
|
+
name: "timeout-surface",
|
|
290
|
+
reason: `timeout fired at ${elapsed}ms, expected <3000ms`,
|
|
291
|
+
}));
|
|
292
|
+
}
|
|
293
|
+
}),
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* slow_close — close-frames are delayed by the toxic. The scope
|
|
298
|
+
* release must still complete within a bounded window so the suite
|
|
299
|
+
* doesn't leak descriptors.
|
|
300
|
+
*/
|
|
301
|
+
export function registerSlowCloseCleanup(ctx) {
|
|
302
|
+
withToxicProxy({
|
|
303
|
+
ctx,
|
|
304
|
+
propertyName: "slow-close-cleanup",
|
|
305
|
+
description: "slow_close toxic does not leak descriptors beyond 2s",
|
|
306
|
+
proxyName: `sc-${ctx.seed}-${Math.random().toString(36).slice(2, 8)}`,
|
|
307
|
+
profile: defaultToxicProfile.slow_close,
|
|
308
|
+
body: ({ proxy, unavailable, attachToxic }) => Effect.gen(function* () {
|
|
309
|
+
const start = yield* Clock.currentTimeMillis;
|
|
310
|
+
yield* attachToxic.pipe(Effect.orElseSucceed(() => undefined));
|
|
311
|
+
// Open + close a client scoped to this Effect.gen block; when
|
|
312
|
+
// Effect.scoped unwinds, the client must release within the
|
|
313
|
+
// 2s budget even though the toxic delays its close-frame.
|
|
314
|
+
yield* Effect.scoped(Effect.gen(function* () {
|
|
315
|
+
const _client = yield* acquireProxiedClient(ctx, proxy, `sc-${ctx.seed}-c`, 2000, unavailable);
|
|
316
|
+
// A single RPC proves the socket is alive before close.
|
|
317
|
+
yield* _client.client
|
|
318
|
+
.sendRpc("conversations/list", {})
|
|
319
|
+
.pipe(Effect.either);
|
|
320
|
+
}));
|
|
321
|
+
const elapsed = (yield* Clock.currentTimeMillis) - start;
|
|
322
|
+
if (elapsed > 5000) {
|
|
323
|
+
return yield* Effect.fail(new PropertyInvariantViolation({
|
|
324
|
+
category: CATEGORY,
|
|
325
|
+
name: "slow-close-cleanup",
|
|
326
|
+
reason: `scope release took ${elapsed}ms under slow_close (budget 5000ms)`,
|
|
327
|
+
}));
|
|
328
|
+
}
|
|
329
|
+
}),
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
function createOneOnOneConversation(owner, participant) {
|
|
333
|
+
return Effect.gen(function* () {
|
|
334
|
+
const create = yield* owner.client
|
|
335
|
+
.sendRpc("conversations/create", {
|
|
336
|
+
type: "group",
|
|
337
|
+
name: `adv-conv-${owner.agent.name}`,
|
|
338
|
+
participants: [
|
|
339
|
+
{ type: "agent", id: participant.agent.agentId },
|
|
340
|
+
],
|
|
341
|
+
})
|
|
342
|
+
.pipe(Effect.either);
|
|
343
|
+
if (create._tag === "Left") {
|
|
344
|
+
return {
|
|
345
|
+
kind: "error",
|
|
346
|
+
reason: `conversations/create under toxic: ${create.left._tag}`,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
const id = create.right.conversation
|
|
350
|
+
?.id;
|
|
351
|
+
if (typeof id !== "string" || id.length === 0) {
|
|
352
|
+
return {
|
|
353
|
+
kind: "error",
|
|
354
|
+
reason: "conversations/create returned no conversation.id",
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
return { kind: "ok", conversationId: id };
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=adversity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adversity.js","sourceRoot":"","sources":["../../../src/testing/conformance/adversity.ts"],"names":[],"mappings":"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"}
|