@moltzap/protocol 2026.503.2 → 2026.503.4
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/test-fixtures/seed-data.d.ts.map +1 -1
- package/dist/test-fixtures/seed-data.js +52 -21
- package/dist/test-fixtures/seed-data.js.map +1 -1
- package/dist/testing/agent-registration.d.ts.map +1 -1
- package/dist/testing/agent-registration.js +48 -39
- package/dist/testing/agent-registration.js.map +1 -1
- package/dist/testing/arbitraries/frames.d.ts.map +1 -1
- package/dist/testing/arbitraries/frames.js +2 -1
- package/dist/testing/arbitraries/frames.js.map +1 -1
- package/dist/testing/arbitraries/from-typebox.d.ts.map +1 -1
- package/dist/testing/arbitraries/from-typebox.js +19 -10
- package/dist/testing/arbitraries/from-typebox.js.map +1 -1
- package/dist/testing/arbitraries/rpc.d.ts.map +1 -1
- package/dist/testing/arbitraries/rpc.js +12 -3
- package/dist/testing/arbitraries/rpc.js.map +1 -1
- package/dist/testing/captures.d.ts.map +1 -1
- package/dist/testing/captures.js +4 -3
- package/dist/testing/captures.js.map +1 -1
- package/dist/testing/codec.d.ts.map +1 -1
- package/dist/testing/codec.js +13 -5
- package/dist/testing/codec.js.map +1 -1
- package/dist/testing/conformance/__divergence_proofs__/executable-proof-helpers.d.ts.map +1 -1
- package/dist/testing/conformance/__divergence_proofs__/executable-proof-helpers.js +7 -4
- package/dist/testing/conformance/__divergence_proofs__/executable-proof-helpers.js.map +1 -1
- package/dist/testing/conformance/_helpers.d.ts +6 -1
- package/dist/testing/conformance/_helpers.d.ts.map +1 -1
- package/dist/testing/conformance/_helpers.js +24 -0
- package/dist/testing/conformance/_helpers.js.map +1 -1
- package/dist/testing/conformance/adversity.d.ts.map +1 -1
- package/dist/testing/conformance/adversity.js +76 -66
- package/dist/testing/conformance/adversity.js.map +1 -1
- package/dist/testing/conformance/boundary.d.ts.map +1 -1
- package/dist/testing/conformance/boundary.js +49 -39
- package/dist/testing/conformance/boundary.js.map +1 -1
- package/dist/testing/conformance/client/adversity.d.ts.map +1 -1
- package/dist/testing/conformance/client/adversity.js +20 -15
- package/dist/testing/conformance/client/adversity.js.map +1 -1
- package/dist/testing/conformance/client/boundary.d.ts.map +1 -1
- package/dist/testing/conformance/client/boundary.js +7 -5
- package/dist/testing/conformance/client/boundary.js.map +1 -1
- package/dist/testing/conformance/client/delivery.d.ts.map +1 -1
- package/dist/testing/conformance/client/delivery.js +26 -20
- package/dist/testing/conformance/client/delivery.js.map +1 -1
- package/dist/testing/conformance/client/rpc-semantics.d.ts.map +1 -1
- package/dist/testing/conformance/client/rpc-semantics.js +18 -15
- package/dist/testing/conformance/client/rpc-semantics.js.map +1 -1
- package/dist/testing/conformance/client/runner.d.ts +13 -8
- package/dist/testing/conformance/client/runner.d.ts.map +1 -1
- package/dist/testing/conformance/client/runner.js +17 -24
- package/dist/testing/conformance/client/runner.js.map +1 -1
- package/dist/testing/conformance/client/schema-conformance.d.ts.map +1 -1
- package/dist/testing/conformance/client/schema-conformance.js +11 -9
- package/dist/testing/conformance/client/schema-conformance.js.map +1 -1
- package/dist/testing/conformance/client/suite.d.ts.map +1 -1
- package/dist/testing/conformance/client/suite.js +2 -1
- package/dist/testing/conformance/client/suite.js.map +1 -1
- package/dist/testing/conformance/delivery.d.ts.map +1 -1
- package/dist/testing/conformance/delivery.js +98 -124
- package/dist/testing/conformance/delivery.js.map +1 -1
- package/dist/testing/conformance/env.d.ts +9 -0
- package/dist/testing/conformance/env.d.ts.map +1 -1
- package/dist/testing/conformance/env.js +16 -3
- package/dist/testing/conformance/env.js.map +1 -1
- package/dist/testing/conformance/presence.d.ts.map +1 -1
- package/dist/testing/conformance/presence.js +4 -2
- package/dist/testing/conformance/presence.js.map +1 -1
- package/dist/testing/conformance/registry.d.ts +1 -1
- package/dist/testing/conformance/registry.d.ts.map +1 -1
- package/dist/testing/conformance/registry.js +1 -1
- package/dist/testing/conformance/registry.js.map +1 -1
- package/dist/testing/conformance/rpc-semantics.d.ts.map +1 -1
- package/dist/testing/conformance/rpc-semantics.js +139 -107
- package/dist/testing/conformance/rpc-semantics.js.map +1 -1
- package/dist/testing/conformance/runner.d.ts +2 -2
- package/dist/testing/conformance/runner.d.ts.map +1 -1
- package/dist/testing/conformance/runner.js +5 -10
- package/dist/testing/conformance/runner.js.map +1 -1
- package/dist/testing/conformance/schema-conformance.d.ts.map +1 -1
- package/dist/testing/conformance/schema-conformance.js +160 -120
- package/dist/testing/conformance/schema-conformance.js.map +1 -1
- package/dist/testing/conformance/suite.d.ts +1 -1
- package/dist/testing/conformance/suite.d.ts.map +1 -1
- package/dist/testing/conformance/suite.js +12 -9
- package/dist/testing/conformance/suite.js.map +1 -1
- package/dist/testing/models/dispatch.d.ts.map +1 -1
- package/dist/testing/models/dispatch.js +58 -50
- package/dist/testing/models/dispatch.js.map +1 -1
- package/dist/testing/models/state.d.ts +3 -3
- package/dist/testing/models/state.d.ts.map +1 -1
- package/dist/testing/models/state.js +14 -1
- package/dist/testing/models/state.js.map +1 -1
- package/dist/testing/test-client.d.ts +22 -3
- package/dist/testing/test-client.d.ts.map +1 -1
- package/dist/testing/test-client.js +51 -31
- package/dist/testing/test-client.js.map +1 -1
- package/dist/testing/test-server.d.ts.map +1 -1
- package/dist/testing/test-server.js +7 -11
- package/dist/testing/test-server.js.map +1 -1
- package/dist/testing/toxics/client.d.ts.map +1 -1
- package/dist/testing/toxics/client.js +39 -25
- package/dist/testing/toxics/client.js.map +1 -1
- package/dist/testing/toxics/profile.d.ts.map +1 -1
- package/dist/testing/toxics/profile.js +4 -1
- package/dist/testing/toxics/profile.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -6,10 +6,13 @@
|
|
|
6
6
|
* property bodies compiler-checked against `RpcMap`.
|
|
7
7
|
*/
|
|
8
8
|
import * as fc from "fast-check";
|
|
9
|
+
import { Data } from "effect";
|
|
9
10
|
import { rpcMethods, } from "../../rpc-registry.js";
|
|
10
11
|
import { applyCall } from "../models/dispatch.js";
|
|
11
12
|
import { initialReferenceState } from "../models/state.js";
|
|
12
13
|
import { arbitraryForParams } from "./from-typebox.js";
|
|
14
|
+
class RpcArbitraryInvariantError extends Data.TaggedError("RpcArbitraryInvariantError") {
|
|
15
|
+
}
|
|
13
16
|
/**
|
|
14
17
|
* Ordered list of every `RpcMethodName`. Exposed so properties can assert
|
|
15
18
|
* "every method exercised at least once" without going through `RpcMap`
|
|
@@ -22,7 +25,9 @@ const methodByName = new Map(rpcMethods.map((m) => [m.name, m]));
|
|
|
22
25
|
export function arbitraryCallFor(method) {
|
|
23
26
|
const def = methodByName.get(method);
|
|
24
27
|
if (def === undefined) {
|
|
25
|
-
throw new
|
|
28
|
+
throw new RpcArbitraryInvariantError({
|
|
29
|
+
message: `arbitraryCallFor: unknown method ${String(method)}`,
|
|
30
|
+
});
|
|
26
31
|
}
|
|
27
32
|
return arbitraryForParams(def.paramsSchema).map((params) => ({
|
|
28
33
|
method,
|
|
@@ -35,7 +40,9 @@ export function arbitraryCallFor(method) {
|
|
|
35
40
|
*/
|
|
36
41
|
export function arbitraryAnyCall() {
|
|
37
42
|
if (allRpcMethods.length === 0) {
|
|
38
|
-
throw new
|
|
43
|
+
throw new RpcArbitraryInvariantError({
|
|
44
|
+
message: "arbitraryAnyCall: rpcMethods empty",
|
|
45
|
+
});
|
|
39
46
|
}
|
|
40
47
|
return fc.constantFrom(...allRpcMethods).chain((m) => arbitraryCallFor(m));
|
|
41
48
|
}
|
|
@@ -89,7 +96,9 @@ export const confidentOracleMethods = (() => {
|
|
|
89
96
|
*/
|
|
90
97
|
export function arbitraryConfidentCall() {
|
|
91
98
|
if (confidentOracleMethods.length === 0) {
|
|
92
|
-
throw new
|
|
99
|
+
throw new RpcArbitraryInvariantError({
|
|
100
|
+
message: "arbitraryConfidentCall: model has zero confident-oracle methods; flag needs-structural-rework",
|
|
101
|
+
});
|
|
93
102
|
}
|
|
94
103
|
return fc
|
|
95
104
|
.constantFrom(...confidentOracleMethods)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../src/testing/arbitraries/rpc.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,UAAU,GAGX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../src/testing/arbitraries/rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captures.d.ts","sourceRoot":"","sources":["../../src/testing/captures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,MAAM,EAAO,MAAM,EAAU,MAAM,QAAQ,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"captures.d.ts","sourceRoot":"","sources":["../../src/testing/captures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,MAAM,EAAO,MAAM,EAAU,MAAM,QAAQ,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAI/D,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC/C;AAED,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;IAC/D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjE,gFAAgF;IAChF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAwB/B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,GACpC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAkC9B;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,kBAAkB,GACvB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAQrB;AAED,wDAAwD;AACxD,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,QAAQ,GACd,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAQrB"}
|
package/dist/testing/captures.js
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* Toxiproxy (Tier D).
|
|
11
11
|
*/
|
|
12
12
|
import { Effect, Ref, Stream, PubSub } from "effect";
|
|
13
|
+
const CAPTURE_FANOUT_CONCURRENCY = 8;
|
|
13
14
|
const startTime = Date.now();
|
|
14
15
|
/**
|
|
15
16
|
* Ring-buffer + PubSub implementation. The Ref holds the bounded
|
|
@@ -58,14 +59,14 @@ export function mergeCaptures(buffers) {
|
|
|
58
59
|
// merged copy: the source buffers are authoritative.
|
|
59
60
|
const snapshot = Effect.gen(function* () {
|
|
60
61
|
const snaps = yield* Effect.forEach(buffers, (b) => b.snapshot, {
|
|
61
|
-
concurrency:
|
|
62
|
+
concurrency: CAPTURE_FANOUT_CONCURRENCY,
|
|
62
63
|
});
|
|
63
64
|
const flat = snaps.flat();
|
|
64
65
|
return [...flat].sort((a, b) => a.at - b.at);
|
|
65
66
|
});
|
|
66
|
-
const stream = Stream.mergeAll(buffers.map((b) => b.stream), { concurrency:
|
|
67
|
+
const stream = Stream.mergeAll(buffers.map((b) => b.stream), { concurrency: CAPTURE_FANOUT_CONCURRENCY });
|
|
67
68
|
const clear = Effect.forEach(buffers, (b) => b.clear, {
|
|
68
|
-
concurrency:
|
|
69
|
+
concurrency: CAPTURE_FANOUT_CONCURRENCY,
|
|
69
70
|
}).pipe(Effect.asVoid);
|
|
70
71
|
return {
|
|
71
72
|
snapshot,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captures.js","sourceRoot":"","sources":["../../src/testing/captures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"captures.js","sourceRoot":"","sources":["../../src/testing/captures.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/testing/codec.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/testing/codec.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAQ/C;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAChB,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG,YAAY,CAAC,GAC7C,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG,aAAa,CAAC,GAC/C,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG,UAAU,CAAC,CAAC;AAE9C;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAC1B,UAAU,GACV,WAAW,GACX,WAAW,GACX,cAAc,GACd,wBAAwB,GACxB,gBAAgB,CAAC;AAErB,iDAAiD;AACjD,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,UAAU,GAAG,SAAS,GAChC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAiF3C;AAaD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,MAAM,GACX,MAAM,CAoDR"}
|
package/dist/testing/codec.js
CHANGED
|
@@ -11,6 +11,11 @@ import { Effect } from "effect";
|
|
|
11
11
|
import { Value } from "@sinclair/typebox/value";
|
|
12
12
|
import { RequestFrameSchema, ResponseFrameSchema, EventFrameSchema, } from "../schema/frames.js";
|
|
13
13
|
import { FrameSchemaError } from "./errors.js";
|
|
14
|
+
const BIT_FLIP_VARIANTS = 8;
|
|
15
|
+
const OVERSIZED_PADDING_BYTES = 65_536;
|
|
16
|
+
const LCG_MULTIPLIER = 1_664_525;
|
|
17
|
+
const LCG_INCREMENT = 1_013_904_223;
|
|
18
|
+
const LCG_MODULUS = 0x100000000;
|
|
14
19
|
/** Serialize a typed frame to the wire bytes. */
|
|
15
20
|
export function encodeFrame(frame) {
|
|
16
21
|
return JSON.stringify(frame);
|
|
@@ -110,7 +115,7 @@ export function malformFrame(base, kind, seed) {
|
|
|
110
115
|
const pos = Math.floor(rand() * rawJson.length);
|
|
111
116
|
const ch = rawJson.charCodeAt(pos);
|
|
112
117
|
// Flip one bit in the low byte (XOR with 1<<bit).
|
|
113
|
-
const bit = Math.floor(rand() *
|
|
118
|
+
const bit = Math.floor(rand() * BIT_FLIP_VARIANTS);
|
|
114
119
|
const flipped = String.fromCharCode(ch ^ (1 << bit));
|
|
115
120
|
return rawJson.slice(0, pos) + flipped + rawJson.slice(pos + 1);
|
|
116
121
|
}
|
|
@@ -125,7 +130,7 @@ export function malformFrame(base, kind, seed) {
|
|
|
125
130
|
// Uses `_padding` field at top level of the JSON object, which
|
|
126
131
|
// `additionalProperties: false` rejects — also triggers "extra-property"
|
|
127
132
|
// under different framing, but here the point is byte-size.
|
|
128
|
-
const padLen =
|
|
133
|
+
const padLen = OVERSIZED_PADDING_BYTES;
|
|
129
134
|
const pad = "X".repeat(padLen);
|
|
130
135
|
// Splice "_padding":"...", before the closing `}`.
|
|
131
136
|
const idx = rawJson.lastIndexOf("}");
|
|
@@ -151,10 +156,13 @@ export function malformFrame(base, kind, seed) {
|
|
|
151
156
|
}
|
|
152
157
|
default: {
|
|
153
158
|
const _exhaustive = kind;
|
|
154
|
-
|
|
159
|
+
return absurdMalformedFrameKind(_exhaustive);
|
|
155
160
|
}
|
|
156
161
|
}
|
|
157
162
|
}
|
|
163
|
+
function absurdMalformedFrameKind(kind) {
|
|
164
|
+
throw new Error(`malformFrame: unexpected kind ${String(kind)}`);
|
|
165
|
+
}
|
|
158
166
|
/**
|
|
159
167
|
* Deterministic LCG (Numerical Recipes constants). Given the same seed,
|
|
160
168
|
* yields the same sequence of floats in [0, 1). Good enough for reproducible
|
|
@@ -163,8 +171,8 @@ export function malformFrame(base, kind, seed) {
|
|
|
163
171
|
function lcg(seed) {
|
|
164
172
|
let s = seed >>> 0 || 1;
|
|
165
173
|
return () => {
|
|
166
|
-
s = (Math.imul(s,
|
|
167
|
-
return s /
|
|
174
|
+
s = (Math.imul(s, LCG_MULTIPLIER) + LCG_INCREMENT) >>> 0;
|
|
175
|
+
return s / LCG_MODULUS;
|
|
168
176
|
};
|
|
169
177
|
}
|
|
170
178
|
//# sourceMappingURL=codec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/testing/codec.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GAIjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/testing/codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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;
|
|
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;AAMxB,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,CAWN;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,MAAM,GACnB,IAAI,CAWN"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { Cause, Chunk, Effect, Option } from "effect";
|
|
2
2
|
import { PropertyAssertionFailure, PropertyInvariantViolation, } from "../registry.js";
|
|
3
|
+
class ProofExpectationError extends Error {
|
|
4
|
+
name = "ProofExpectationError";
|
|
5
|
+
}
|
|
3
6
|
export function runExpectingFailure(property) {
|
|
4
7
|
return Effect.gen(function* () {
|
|
5
8
|
const exit = yield* Effect.exit(property.run);
|
|
@@ -16,18 +19,18 @@ export function runExpectingFailure(property) {
|
|
|
16
19
|
}
|
|
17
20
|
export function expectInvariant(failure, propertyName) {
|
|
18
21
|
if (!(failure instanceof PropertyInvariantViolation)) {
|
|
19
|
-
throw new
|
|
22
|
+
throw new ProofExpectationError(`expected invariant failure, got ${failure._tag}`);
|
|
20
23
|
}
|
|
21
24
|
if (failure.name !== propertyName) {
|
|
22
|
-
throw new
|
|
25
|
+
throw new ProofExpectationError(`expected ${propertyName}, got ${failure.name}`);
|
|
23
26
|
}
|
|
24
27
|
}
|
|
25
28
|
export function expectAssertionFailure(failure, propertyName) {
|
|
26
29
|
if (!(failure instanceof PropertyAssertionFailure)) {
|
|
27
|
-
throw new
|
|
30
|
+
throw new ProofExpectationError(`expected assertion failure, got ${failure._tag}`);
|
|
28
31
|
}
|
|
29
32
|
if (failure.name !== propertyName) {
|
|
30
|
-
throw new
|
|
33
|
+
throw new ProofExpectationError(`expected ${propertyName}, got ${failure.name}`);
|
|
31
34
|
}
|
|
32
35
|
}
|
|
33
36
|
//# sourceMappingURL=executable-proof-helpers.js.map
|
|
@@ -1 +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,
|
|
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,qBAAsB,SAAQ,KAAK;IACrB,IAAI,GAAG,uBAAuB,CAAC;CAClD;AAED,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,qBAAqB,CAC7B,mCAAmC,OAAO,CAAC,IAAI,EAAE,CAClD,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAClC,MAAM,IAAI,qBAAqB,CAC7B,YAAY,YAAY,SAAS,OAAO,CAAC,IAAI,EAAE,CAChD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAAwB,EACxB,YAAoB;IAEpB,IAAI,CAAC,CAAC,OAAO,YAAY,wBAAwB,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,qBAAqB,CAC7B,mCAAmC,OAAO,CAAC,IAAI,EAAE,CAClD,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAClC,MAAM,IAAI,qBAAqB,CAC7B,YAAY,YAAY,SAAS,OAAO,CAAC,IAAI,EAAE,CAChD,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* property modules. Keep this file thin; promote utilities here only
|
|
4
4
|
* when they would otherwise be duplicated verbatim.
|
|
5
5
|
*/
|
|
6
|
-
import
|
|
6
|
+
import { Effect, Either } from "effect";
|
|
7
7
|
import type { TestClient } from "../test-client.js";
|
|
8
8
|
import type { FrameSchemaError, RpcResponseError, RpcTimeoutError, TransportClosedError, TransportIoError } from "../errors.js";
|
|
9
9
|
/**
|
|
@@ -14,4 +14,9 @@ import type { FrameSchemaError, RpcResponseError, RpcTimeoutError, TransportClos
|
|
|
14
14
|
* change outside this sub-issue's scope; this helper localizes the cast.
|
|
15
15
|
*/
|
|
16
16
|
export declare function sendUntypedRpc(client: TestClient, method: string, params: unknown): Effect.Effect<unknown, RpcResponseError | RpcTimeoutError | TransportClosedError | TransportIoError | FrameSchemaError>;
|
|
17
|
+
export declare function requireRight<A, E, F>(value: Either.Either<A, E>, onLeft: (error: E) => F): Effect.Effect<A, F>;
|
|
18
|
+
export declare function leftOrNull<A, E>(value: Either.Either<A, E>): E | null;
|
|
19
|
+
export declare function eitherTag<A, E extends {
|
|
20
|
+
readonly _tag: string;
|
|
21
|
+
}>(value: Either.Either<A, E>): "Right" | E["_tag"];
|
|
17
22
|
//# sourceMappingURL=_helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_helpers.d.ts","sourceRoot":"","sources":["../../../src/testing/conformance/_helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"_helpers.d.ts","sourceRoot":"","sources":["../../../src/testing/conformance/_helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AAEtB;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,GACd,MAAM,CAAC,MAAM,CACd,OAAO,EACL,gBAAgB,GAChB,eAAe,GACf,oBAAoB,GACpB,gBAAgB,GAChB,gBAAgB,CACnB,CAEA;AAcD,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAClC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GACtB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAKrB;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAKrE;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAC9D,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GACzB,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,CAKrB"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conformance-suite shared helpers — small utilities used by multiple
|
|
3
|
+
* property modules. Keep this file thin; promote utilities here only
|
|
4
|
+
* when they would otherwise be duplicated verbatim.
|
|
5
|
+
*/
|
|
6
|
+
import { Effect, Either } from "effect";
|
|
1
7
|
/**
|
|
2
8
|
* `apps/register` is server-handled but absent from the typed
|
|
3
9
|
* `rpcMethods` registry (see `packages/protocol/src/rpc-registry.ts`);
|
|
@@ -8,4 +14,22 @@
|
|
|
8
14
|
export function sendUntypedRpc(client, method, params) {
|
|
9
15
|
return client.sendRpc(method, params);
|
|
10
16
|
}
|
|
17
|
+
export function requireRight(value, onLeft) {
|
|
18
|
+
return Either.match(value, {
|
|
19
|
+
onLeft: (error) => Effect.fail(onLeft(error)),
|
|
20
|
+
onRight: (success) => Effect.succeed(success),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export function leftOrNull(value) {
|
|
24
|
+
return Either.match(value, {
|
|
25
|
+
onLeft: (error) => error,
|
|
26
|
+
onRight: () => null,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export function eitherTag(value) {
|
|
30
|
+
return Either.match(value, {
|
|
31
|
+
onLeft: (error) => error._tag,
|
|
32
|
+
onRight: () => "Right",
|
|
33
|
+
});
|
|
34
|
+
}
|
|
11
35
|
//# sourceMappingURL=_helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_helpers.js","sourceRoot":"","sources":["../../../src/testing/conformance/_helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"_helpers.js","sourceRoot":"","sources":["../../../src/testing/conformance/_helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAUxC;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAkB,EAClB,MAAc,EACd,MAAe;IASf,OAAQ,MAAM,CAAC,OAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC5D,CAAC;AAcD,MAAM,UAAU,YAAY,CAC1B,KAA0B,EAC1B,MAAuB;IAEvB,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;QACzB,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;KAC9C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAO,KAA0B;IACzD,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;QACzB,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;QACxB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI;KACpB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,KAA0B;IAE1B,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;QACzB,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI;QAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO;KACvB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adversity.d.ts","sourceRoot":"","sources":["../../../src/testing/conformance/adversity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"adversity.d.ts","sourceRoot":"","sources":["../../../src/testing/conformance/adversity.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AA6KzD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CA4D1E;AAED,4CAA4C;AAC5C,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CAcrE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CA2DtE;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CAmD1E;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CAkEvE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CAyCzE"}
|
|
@@ -18,13 +18,40 @@
|
|
|
18
18
|
* Principle 3: every property body is `Effect<void, PropertyFailure>`
|
|
19
19
|
* — no bare throws, no `Effect.void` shortcuts.
|
|
20
20
|
*/
|
|
21
|
-
import { Clock, Effect } from "effect";
|
|
21
|
+
import { Clock, Effect, Either } from "effect";
|
|
22
22
|
import { defaultToxicProfile } from "../toxics/defaults.js";
|
|
23
23
|
import { makeTestClient } from "../test-client.js";
|
|
24
24
|
import { registerTestAgent } from "../agent-registration.js";
|
|
25
|
+
import { TransportClosedError } from "../errors.js";
|
|
25
26
|
import { PropertyDeferred, PropertyInvariantViolation, PropertyUnavailable, registerProperty, } from "./registry.js";
|
|
27
|
+
import { ConversationsCreate, ConversationsList, } from "../../schema/methods/conversations.js";
|
|
28
|
+
import { MessagesSend } from "../../schema/methods/messages.js";
|
|
26
29
|
const CATEGORY = "adversity";
|
|
27
30
|
const DEFAULT_CAPTURE_CAPACITY = 128;
|
|
31
|
+
const ID_RADIX = 36;
|
|
32
|
+
const RANDOM_SUFFIX_START = 2;
|
|
33
|
+
const RANDOM_SUFFIX_END = 8;
|
|
34
|
+
const LATENCY_CLIENT_TIMEOUT_MS = 6_000;
|
|
35
|
+
const SLICER_CLIENT_TIMEOUT_MS = 8_000;
|
|
36
|
+
const RESET_CLIENT_TIMEOUT_MS = 4_000;
|
|
37
|
+
const RESET_POLL_ATTEMPTS = 10;
|
|
38
|
+
const RESET_CLOSE_BUDGET_MS = 3_500;
|
|
39
|
+
const TIMEOUT_CLIENT_TIMEOUT_MS = 1_500;
|
|
40
|
+
const TIMEOUT_EXPECTED_BUDGET_MS = 3_000;
|
|
41
|
+
const SLOW_CLOSE_CLIENT_TIMEOUT_MS = 2_000;
|
|
42
|
+
const SLOW_CLOSE_BUDGET_MS = 5_000;
|
|
43
|
+
const TIMEOUT_SURFACE_PROPERTY = "timeout-surface";
|
|
44
|
+
function violation(name, reason) {
|
|
45
|
+
return new PropertyInvariantViolation({ category: CATEGORY, name, reason });
|
|
46
|
+
}
|
|
47
|
+
function randomIdSuffix() {
|
|
48
|
+
return Math.random()
|
|
49
|
+
.toString(ID_RADIX)
|
|
50
|
+
.slice(RANDOM_SUFFIX_START, RANDOM_SUFFIX_END);
|
|
51
|
+
}
|
|
52
|
+
function proxyName(prefix, seed) {
|
|
53
|
+
return `${prefix}-${seed}-${randomIdSuffix()}`;
|
|
54
|
+
}
|
|
28
55
|
/** Acquire a TestClient that routes through the Toxiproxy proxy. */
|
|
29
56
|
function acquireProxiedClient(ctx, proxy, name, defaultTimeoutMs, unavailable) {
|
|
30
57
|
// Preserve the upstream path (e.g., `/ws`) when building the
|
|
@@ -97,24 +124,17 @@ export function registerLatencyResilience(ctx) {
|
|
|
97
124
|
ctx,
|
|
98
125
|
propertyName: "latency-resilience",
|
|
99
126
|
description: "fan-out delivery survives added latency + jitter",
|
|
100
|
-
proxyName:
|
|
127
|
+
proxyName: proxyName("lat", ctx.seed),
|
|
101
128
|
profile: defaultToxicProfile.latency,
|
|
102
129
|
body: ({ proxy, unavailable, attachToxic }) => Effect.gen(function* () {
|
|
103
|
-
const owner = yield* acquireProxiedClient(ctx, proxy, `lat-${ctx.seed}-o`,
|
|
104
|
-
const participant = yield* acquireProxiedClient(ctx, proxy, `lat-${ctx.seed}-p`,
|
|
105
|
-
const
|
|
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
|
-
}
|
|
130
|
+
const owner = yield* acquireProxiedClient(ctx, proxy, `lat-${ctx.seed}-o`, LATENCY_CLIENT_TIMEOUT_MS, unavailable);
|
|
131
|
+
const participant = yield* acquireProxiedClient(ctx, proxy, `lat-${ctx.seed}-p`, LATENCY_CLIENT_TIMEOUT_MS, unavailable);
|
|
132
|
+
const conversationId = yield* createOneOnOneConversation(owner, participant, "latency-resilience");
|
|
113
133
|
yield* Effect.scoped(Effect.gen(function* () {
|
|
114
134
|
yield* attachToxic;
|
|
115
135
|
yield* owner.client
|
|
116
|
-
.sendRpc(
|
|
117
|
-
conversationId
|
|
136
|
+
.sendRpc(MessagesSend.name, {
|
|
137
|
+
conversationId,
|
|
118
138
|
parts: [{ type: "text", text: "lat-ping" }],
|
|
119
139
|
})
|
|
120
140
|
.pipe(Effect.either);
|
|
@@ -154,25 +174,18 @@ export function registerSlicerFraming(ctx) {
|
|
|
154
174
|
ctx,
|
|
155
175
|
propertyName: "slicer-framing",
|
|
156
176
|
description: "partial-frame slicing preserves payload byte-identity",
|
|
157
|
-
proxyName:
|
|
177
|
+
proxyName: proxyName("sli", ctx.seed),
|
|
158
178
|
profile: defaultToxicProfile.slicer,
|
|
159
179
|
body: ({ proxy, unavailable, attachToxic }) => Effect.gen(function* () {
|
|
160
|
-
const owner = yield* acquireProxiedClient(ctx, proxy, `sli-${ctx.seed}-o`,
|
|
161
|
-
const participant = yield* acquireProxiedClient(ctx, proxy, `sli-${ctx.seed}-p`,
|
|
162
|
-
const
|
|
163
|
-
|
|
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)}`;
|
|
180
|
+
const owner = yield* acquireProxiedClient(ctx, proxy, `sli-${ctx.seed}-o`, SLICER_CLIENT_TIMEOUT_MS, unavailable);
|
|
181
|
+
const participant = yield* acquireProxiedClient(ctx, proxy, `sli-${ctx.seed}-p`, SLICER_CLIENT_TIMEOUT_MS, unavailable);
|
|
182
|
+
const conversationId = yield* createOneOnOneConversation(owner, participant, "slicer-framing");
|
|
183
|
+
const token = `sli-token-${ctx.seed}-${Date.now().toString(ID_RADIX)}`;
|
|
171
184
|
yield* Effect.scoped(Effect.gen(function* () {
|
|
172
185
|
yield* attachToxic;
|
|
173
186
|
yield* owner.client
|
|
174
|
-
.sendRpc(
|
|
175
|
-
conversationId
|
|
187
|
+
.sendRpc(MessagesSend.name, {
|
|
188
|
+
conversationId,
|
|
176
189
|
parts: [{ type: "text", text: token }],
|
|
177
190
|
})
|
|
178
191
|
.pipe(Effect.either);
|
|
@@ -205,27 +218,30 @@ export function registerResetPeerRecovery(ctx) {
|
|
|
205
218
|
ctx,
|
|
206
219
|
propertyName: "reset-peer-recovery",
|
|
207
220
|
description: "reset_peer surfaces TransportClosedError without hanging",
|
|
208
|
-
proxyName:
|
|
221
|
+
proxyName: proxyName("rst", ctx.seed),
|
|
209
222
|
profile: defaultToxicProfile.reset_peer,
|
|
210
223
|
body: ({ proxy, unavailable, attachToxic }) => Effect.gen(function* () {
|
|
211
224
|
const sender = yield* acquireProxiedClient(ctx, proxy, `rst-${ctx.seed}-s`,
|
|
212
225
|
// Deadline > reset_peer.timeoutMs (2000); bounded so a
|
|
213
226
|
// never-firing reset doesn't hang the suite.
|
|
214
|
-
|
|
227
|
+
RESET_CLIENT_TIMEOUT_MS, unavailable);
|
|
215
228
|
const observed = yield* Effect.scoped(Effect.gen(function* () {
|
|
216
229
|
yield* attachToxic;
|
|
217
230
|
const start = yield* Clock.currentTimeMillis;
|
|
218
|
-
for (let i = 0; i <
|
|
231
|
+
for (let i = 0; i < RESET_POLL_ATTEMPTS; i++) {
|
|
219
232
|
const outcome = yield* sender.client
|
|
220
|
-
.sendRpc(
|
|
233
|
+
.sendRpc(ConversationsList.name, {})
|
|
221
234
|
.pipe(Effect.either);
|
|
222
|
-
|
|
223
|
-
|
|
235
|
+
const transportClosed = Either.match(outcome, {
|
|
236
|
+
onLeft: (error) => error instanceof TransportClosedError,
|
|
237
|
+
onRight: () => false,
|
|
238
|
+
});
|
|
239
|
+
if (transportClosed) {
|
|
224
240
|
return true;
|
|
225
241
|
}
|
|
226
242
|
yield* Effect.sleep("300 millis");
|
|
227
243
|
const elapsed = (yield* Clock.currentTimeMillis) - start;
|
|
228
|
-
if (elapsed >
|
|
244
|
+
if (elapsed > RESET_CLOSE_BUDGET_MS)
|
|
229
245
|
return false;
|
|
230
246
|
}
|
|
231
247
|
return false;
|
|
@@ -247,47 +263,50 @@ export function registerResetPeerRecovery(ctx) {
|
|
|
247
263
|
export function registerTimeoutSurface(ctx) {
|
|
248
264
|
withToxicProxy({
|
|
249
265
|
ctx,
|
|
250
|
-
propertyName:
|
|
266
|
+
propertyName: TIMEOUT_SURFACE_PROPERTY,
|
|
251
267
|
description: "timeout toxic surfaces typed RpcTimeoutError within budget",
|
|
252
|
-
proxyName:
|
|
268
|
+
proxyName: proxyName("to", ctx.seed),
|
|
253
269
|
profile: defaultToxicProfile.timeout,
|
|
254
270
|
body: ({ proxy, unavailable, attachToxic }) => Effect.gen(function* () {
|
|
255
271
|
// Client timeout must be LESS than the toxic's forwarding
|
|
256
272
|
// timeout so the RPC hits the client-side deadline first.
|
|
257
273
|
// defaultToxicProfile.timeout.timeoutMs = 5000. Set client to
|
|
258
274
|
// 1500ms for a fast, clear timeout surface.
|
|
259
|
-
const proxied = yield* acquireProxiedClient(ctx, proxy, `to-${ctx.seed}-c`,
|
|
275
|
+
const proxied = yield* acquireProxiedClient(ctx, proxy, `to-${ctx.seed}-c`, TIMEOUT_CLIENT_TIMEOUT_MS, unavailable);
|
|
260
276
|
const { outcomeTag, elapsed } = yield* Effect.scoped(Effect.gen(function* () {
|
|
261
277
|
yield* attachToxic;
|
|
262
278
|
const start = yield* Clock.currentTimeMillis;
|
|
263
279
|
const outcome = yield* proxied.client
|
|
264
|
-
.sendRpc(
|
|
280
|
+
.sendRpc(ConversationsList.name, {})
|
|
265
281
|
.pipe(Effect.either);
|
|
266
282
|
const elapsed = (yield* Clock.currentTimeMillis) - start;
|
|
267
283
|
return {
|
|
268
|
-
outcomeTag:
|
|
284
|
+
outcomeTag: Either.match(outcome, {
|
|
285
|
+
onLeft: (error) => error._tag,
|
|
286
|
+
onRight: () => "success",
|
|
287
|
+
}),
|
|
269
288
|
elapsed,
|
|
270
289
|
};
|
|
271
290
|
}));
|
|
272
291
|
if (outcomeTag === "success") {
|
|
273
292
|
return yield* Effect.fail(new PropertyInvariantViolation({
|
|
274
293
|
category: CATEGORY,
|
|
275
|
-
name:
|
|
294
|
+
name: TIMEOUT_SURFACE_PROPERTY,
|
|
276
295
|
reason: "RPC through timeout toxic unexpectedly succeeded",
|
|
277
296
|
}));
|
|
278
297
|
}
|
|
279
298
|
if (outcomeTag !== "TestingRpcTimeoutError") {
|
|
280
299
|
return yield* Effect.fail(new PropertyInvariantViolation({
|
|
281
300
|
category: CATEGORY,
|
|
282
|
-
name:
|
|
301
|
+
name: TIMEOUT_SURFACE_PROPERTY,
|
|
283
302
|
reason: `expected RpcTimeoutError, got ${outcomeTag}`,
|
|
284
303
|
}));
|
|
285
304
|
}
|
|
286
|
-
if (elapsed >
|
|
305
|
+
if (elapsed > TIMEOUT_EXPECTED_BUDGET_MS) {
|
|
287
306
|
return yield* Effect.fail(new PropertyInvariantViolation({
|
|
288
307
|
category: CATEGORY,
|
|
289
|
-
name:
|
|
290
|
-
reason: `timeout fired at ${elapsed}ms, expected
|
|
308
|
+
name: TIMEOUT_SURFACE_PROPERTY,
|
|
309
|
+
reason: `timeout fired at ${elapsed}ms, expected <${TIMEOUT_EXPECTED_BUDGET_MS}ms`,
|
|
291
310
|
}));
|
|
292
311
|
}
|
|
293
312
|
}),
|
|
@@ -303,7 +322,7 @@ export function registerSlowCloseCleanup(ctx) {
|
|
|
303
322
|
ctx,
|
|
304
323
|
propertyName: "slow-close-cleanup",
|
|
305
324
|
description: "slow_close toxic does not leak descriptors beyond 2s",
|
|
306
|
-
proxyName:
|
|
325
|
+
proxyName: proxyName("sc", ctx.seed),
|
|
307
326
|
profile: defaultToxicProfile.slow_close,
|
|
308
327
|
body: ({ proxy, unavailable, attachToxic }) => Effect.gen(function* () {
|
|
309
328
|
const start = yield* Clock.currentTimeMillis;
|
|
@@ -312,49 +331,40 @@ export function registerSlowCloseCleanup(ctx) {
|
|
|
312
331
|
// Effect.scoped unwinds, the client must release within the
|
|
313
332
|
// 2s budget even though the toxic delays its close-frame.
|
|
314
333
|
yield* Effect.scoped(Effect.gen(function* () {
|
|
315
|
-
const _client = yield* acquireProxiedClient(ctx, proxy, `sc-${ctx.seed}-c`,
|
|
334
|
+
const _client = yield* acquireProxiedClient(ctx, proxy, `sc-${ctx.seed}-c`, SLOW_CLOSE_CLIENT_TIMEOUT_MS, unavailable);
|
|
316
335
|
// A single RPC proves the socket is alive before close.
|
|
317
336
|
yield* _client.client
|
|
318
|
-
.sendRpc(
|
|
337
|
+
.sendRpc(ConversationsList.name, {})
|
|
319
338
|
.pipe(Effect.either);
|
|
320
339
|
}));
|
|
321
340
|
const elapsed = (yield* Clock.currentTimeMillis) - start;
|
|
322
|
-
if (elapsed >
|
|
341
|
+
if (elapsed > SLOW_CLOSE_BUDGET_MS) {
|
|
323
342
|
return yield* Effect.fail(new PropertyInvariantViolation({
|
|
324
343
|
category: CATEGORY,
|
|
325
344
|
name: "slow-close-cleanup",
|
|
326
|
-
reason: `scope release took ${elapsed}ms under slow_close (budget
|
|
345
|
+
reason: `scope release took ${elapsed}ms under slow_close (budget ${SLOW_CLOSE_BUDGET_MS}ms)`,
|
|
327
346
|
}));
|
|
328
347
|
}
|
|
329
348
|
}),
|
|
330
349
|
});
|
|
331
350
|
}
|
|
332
|
-
|
|
351
|
+
// ── helpers ──────────────────────────────────────────────────────────
|
|
352
|
+
function createOneOnOneConversation(owner, participant, propertyName) {
|
|
333
353
|
return Effect.gen(function* () {
|
|
334
354
|
const create = yield* owner.client
|
|
335
|
-
.sendRpc(
|
|
355
|
+
.sendRpc(ConversationsCreate.name, {
|
|
336
356
|
type: "group",
|
|
337
357
|
name: `adv-conv-${owner.agent.name}`,
|
|
338
358
|
participants: [
|
|
339
359
|
{ type: "agent", id: participant.agent.agentId },
|
|
340
360
|
],
|
|
341
361
|
})
|
|
342
|
-
.pipe(Effect.
|
|
343
|
-
|
|
344
|
-
return {
|
|
345
|
-
kind: "error",
|
|
346
|
-
reason: `conversations/create under toxic: ${create.left._tag}`,
|
|
347
|
-
};
|
|
348
|
-
}
|
|
349
|
-
const id = create.right.conversation
|
|
350
|
-
?.id;
|
|
362
|
+
.pipe(Effect.mapError((error) => violation(propertyName, `conversations/create under toxic: ${error._tag}`)));
|
|
363
|
+
const id = create.conversation?.id;
|
|
351
364
|
if (typeof id !== "string" || id.length === 0) {
|
|
352
|
-
return
|
|
353
|
-
kind: "error",
|
|
354
|
-
reason: "conversations/create returned no conversation.id",
|
|
355
|
-
};
|
|
365
|
+
return yield* Effect.fail(violation(propertyName, "conversations/create returned no conversation.id"));
|
|
356
366
|
}
|
|
357
|
-
return
|
|
367
|
+
return id;
|
|
358
368
|
});
|
|
359
369
|
}
|
|
360
370
|
//# sourceMappingURL=adversity.js.map
|