@nifrajs/testing 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,483 @@
1
+ /**
2
+ * Profile-based adapter certification. Profiles are structural and dependency-free: an adapter package
3
+ * uses this only in its test/CI surface, while the resulting capability matrix is portable JSON evidence.
4
+ */
5
+ export class AdapterCertificationError extends Error {
6
+ report;
7
+ constructor(report) {
8
+ const failed = report.checks.filter((check) => !check.ok).map((check) => check.id);
9
+ super(`adapter ${report.adapterId} failed ${report.profile.id}: ${failed.join(", ")}`);
10
+ this.report = report;
11
+ this.name = "AdapterCertificationError";
12
+ }
13
+ }
14
+ const TOKEN = /^[a-z0-9][a-z0-9._:-]{0,127}$/;
15
+ const MAX_CHECKS = 128;
16
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
17
+ function canonical(value) {
18
+ if (Array.isArray(value))
19
+ return `[${value.map(canonical).join(",")}]`;
20
+ if (isRecord(value))
21
+ return `{${Object.keys(value)
22
+ .sort()
23
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
24
+ .join(",")}}`;
25
+ return JSON.stringify(value);
26
+ }
27
+ async function sha256(value) {
28
+ const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(value));
29
+ return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
30
+ }
31
+ function validateProfile(profile) {
32
+ if (!TOKEN.test(profile.id))
33
+ throw new TypeError("certification profile id must be a bounded token");
34
+ if (!Number.isInteger(profile.version) || profile.version < 1)
35
+ throw new TypeError("certification profile version must be a positive integer");
36
+ if (profile.checks.length < 1 || profile.checks.length > MAX_CHECKS)
37
+ throw new RangeError(`certification profile must contain 1-${MAX_CHECKS} checks`);
38
+ const capabilities = new Set(profile.capabilities);
39
+ if (capabilities.size !== profile.capabilities.length)
40
+ throw new TypeError("certification profile capability names must be unique");
41
+ const ids = new Set();
42
+ for (const capability of capabilities) {
43
+ if (!TOKEN.test(capability))
44
+ throw new TypeError("certification capability must be a bounded token");
45
+ }
46
+ for (const check of profile.checks) {
47
+ if (!TOKEN.test(check.id) || ids.has(check.id))
48
+ throw new TypeError("certification check ids must be unique bounded tokens");
49
+ if (!capabilities.has(check.capability))
50
+ throw new TypeError(`certification check ${check.id} names undeclared capability ${check.capability}`);
51
+ ids.add(check.id);
52
+ }
53
+ for (const capability of capabilities) {
54
+ if (!profile.checks.some((check) => check.capability === capability))
55
+ throw new TypeError(`certification capability has no checks: ${capability}`);
56
+ }
57
+ }
58
+ /** Define and validate a custom domain/provider profile at module initialization. */
59
+ export function defineCertificationProfile(profile) {
60
+ validateProfile(profile);
61
+ return profile;
62
+ }
63
+ export async function certifyAdapter(options) {
64
+ validateProfile(options.profile);
65
+ if (!TOKEN.test(options.adapterId))
66
+ throw new TypeError("adapter id must be a bounded token");
67
+ const checks = [];
68
+ for (const check of options.profile.checks) {
69
+ let adapter;
70
+ try {
71
+ adapter = await options.createAdapter();
72
+ await check.run(adapter, {
73
+ key: (suffix) => `nifra-cert:${options.profile.id}:${options.adapterId}:${check.id}:${suffix}`,
74
+ });
75
+ checks.push({ id: check.id, capability: check.capability, ok: true });
76
+ }
77
+ catch (error) {
78
+ checks.push({
79
+ id: check.id,
80
+ capability: check.capability,
81
+ ok: false,
82
+ errorName: error instanceof Error && TOKEN.test(error.name.toLowerCase())
83
+ ? error.name
84
+ : "AdapterError",
85
+ });
86
+ }
87
+ finally {
88
+ if (adapter !== undefined && options.cleanup !== undefined) {
89
+ try {
90
+ await options.cleanup(adapter);
91
+ }
92
+ catch {
93
+ // Cleanup cannot turn a failed functional check into success, and provider messages are not
94
+ // persisted. Adapter suites should make cleanup idempotent and observable separately.
95
+ }
96
+ }
97
+ }
98
+ }
99
+ const capabilities = options.profile.capabilities.map((capability) => {
100
+ const ids = checks.filter((check) => check.capability === capability);
101
+ return {
102
+ capability,
103
+ status: ids.every((check) => check.ok) ? "passed" : "failed",
104
+ checks: ids.map((check) => check.id),
105
+ };
106
+ });
107
+ const body = {
108
+ schemaVersion: 1,
109
+ ok: checks.every((check) => check.ok),
110
+ profile: { id: options.profile.id, version: options.profile.version },
111
+ adapterId: options.adapterId,
112
+ checks,
113
+ capabilities,
114
+ };
115
+ return { ...body, evidenceHash: await sha256(canonical(body)) };
116
+ }
117
+ export function assertAdapterCertification(report) {
118
+ if (!report.ok)
119
+ throw new AdapterCertificationError(report);
120
+ }
121
+ /** Recompute the portable evidence hash. Consumers should verify before trusting a stored report. */
122
+ export async function verifyAdapterCertification(report) {
123
+ const { evidenceHash, ...body } = report;
124
+ return evidenceHash === (await sha256(canonical(body)));
125
+ }
126
+ export function cacheStoreCertificationProfile() {
127
+ const entry = (value) => ({
128
+ value,
129
+ staleAt: 5_000_000,
130
+ expiresAt: 6_000_000,
131
+ });
132
+ return {
133
+ id: "cache-store",
134
+ version: 1,
135
+ capabilities: ["roundtrip", "tag-invalidation", "clear"],
136
+ checks: [
137
+ {
138
+ id: "set-get-delete",
139
+ capability: "roundtrip",
140
+ async run(store, context) {
141
+ const key = context.key("roundtrip");
142
+ await store.set(key, entry({ answer: 42 }), []);
143
+ const found = await store.get(key);
144
+ if (JSON.stringify(found?.value) !== '{"answer":42}')
145
+ throw new Error("CacheRoundtrip");
146
+ await store.delete(key);
147
+ if ((await store.get(key)) !== undefined)
148
+ throw new Error("CacheDelete");
149
+ },
150
+ },
151
+ {
152
+ id: "invalidate-tag",
153
+ capability: "tag-invalidation",
154
+ async run(store, context) {
155
+ const tagged = context.key("tagged");
156
+ const other = context.key("other");
157
+ const tag = context.key("tag");
158
+ await store.set(tagged, entry(1), [tag]);
159
+ await store.set(other, entry(2), [context.key("other-tag")]);
160
+ await store.invalidateTag(tag);
161
+ if ((await store.get(tagged)) !== undefined || (await store.get(other))?.value !== 2)
162
+ throw new Error("CacheTagInvalidation");
163
+ },
164
+ },
165
+ {
166
+ id: "clear",
167
+ capability: "clear",
168
+ async run(store, context) {
169
+ const key = context.key("clear");
170
+ await store.set(key, entry(1), []);
171
+ await store.clear();
172
+ if ((await store.get(key)) !== undefined)
173
+ throw new Error("CacheClear");
174
+ },
175
+ },
176
+ ],
177
+ };
178
+ }
179
+ export function jobStoreCertificationProfile() {
180
+ return {
181
+ id: "job-store",
182
+ version: 1,
183
+ capabilities: ["lease-complete", "retry-schedule", "dead-letter"],
184
+ checks: [
185
+ {
186
+ id: "lease-complete",
187
+ capability: "lease-complete",
188
+ async run(store) {
189
+ const id = await store.enqueue({
190
+ name: "cert",
191
+ payload: { n: 1 },
192
+ runAt: 10,
193
+ maxAttempts: 3,
194
+ });
195
+ if ((await store.lease(9, 1, 100)).length !== 0)
196
+ throw new Error("JobEarlyLease");
197
+ const leased = await store.lease(10, 1, 100);
198
+ if (leased.length !== 1 || leased[0]?.id !== id || leased[0]?.attempt !== 0)
199
+ throw new Error("JobLease");
200
+ await store.complete(id);
201
+ if ((await store.counts()).pending !== 0)
202
+ throw new Error("JobComplete");
203
+ },
204
+ },
205
+ {
206
+ id: "retry-schedule",
207
+ capability: "retry-schedule",
208
+ async run(store) {
209
+ const id = await store.enqueue({ name: "cert", payload: null, runAt: 0, maxAttempts: 3 });
210
+ await store.lease(0, 1, 10);
211
+ await store.retry(id, 20);
212
+ if ((await store.lease(19, 1, 10)).length !== 0)
213
+ throw new Error("JobRetryEarly");
214
+ const retried = await store.lease(20, 1, 10);
215
+ if (retried[0]?.attempt !== 1)
216
+ throw new Error("JobRetryAttempt");
217
+ },
218
+ },
219
+ {
220
+ id: "dead-letter",
221
+ capability: "dead-letter",
222
+ async run(store) {
223
+ const id = await store.enqueue({ name: "cert", payload: null, runAt: 0, maxAttempts: 1 });
224
+ await store.deadLetter(id, "bounded-code");
225
+ const counts = await store.counts();
226
+ if (counts.dead !== 1 || counts.pending !== 0)
227
+ throw new Error("JobDeadLetter");
228
+ },
229
+ },
230
+ ],
231
+ };
232
+ }
233
+ export function storageAdapterCertificationProfile(options = {}) {
234
+ const capabilities = ["object-roundtrip", "overwrite", "list-delete"];
235
+ const checks = [
236
+ {
237
+ id: "object-roundtrip",
238
+ capability: "object-roundtrip",
239
+ async run(store, context) {
240
+ const key = context.key("object");
241
+ await store.put(key, "hello", { contentType: "text/plain", metadata: { owner: "cert" } });
242
+ const object = await store.get(key);
243
+ if (object === null ||
244
+ new TextDecoder().decode(object.body) !== "hello" ||
245
+ object.size !== 5 ||
246
+ object.contentType !== "text/plain" ||
247
+ object.metadata?.owner !== "cert")
248
+ throw new Error("StorageRoundtrip");
249
+ },
250
+ },
251
+ {
252
+ id: "overwrite",
253
+ capability: "overwrite",
254
+ async run(store, context) {
255
+ const key = context.key("overwrite");
256
+ await store.put(key, "before");
257
+ await store.put(key, "after");
258
+ const object = await store.get(key);
259
+ if (object === null || new TextDecoder().decode(object.body) !== "after")
260
+ throw new Error("StorageOverwrite");
261
+ },
262
+ },
263
+ {
264
+ id: "list-delete",
265
+ capability: "list-delete",
266
+ async run(store, context) {
267
+ const prefix = `${context.key("prefix")}/`;
268
+ const key = `${prefix}a`;
269
+ await store.put(key, "x");
270
+ await store.put(context.key("outside"), "x");
271
+ const listed = await store.list({ prefix, limit: 1 });
272
+ if (listed.length !== 1 || listed[0] !== key || !(await store.exists(key)))
273
+ throw new Error("StorageList");
274
+ await store.delete(key);
275
+ if ((await store.exists(key)) || (await store.get(key)) !== null)
276
+ throw new Error("StorageDelete");
277
+ },
278
+ },
279
+ ];
280
+ if (options.paging === true) {
281
+ capabilities.push("cursor-paging");
282
+ checks.push({
283
+ id: "cursor-paging",
284
+ capability: "cursor-paging",
285
+ async run(store, context) {
286
+ if (store.listPage === undefined)
287
+ throw new Error("StoragePagingMissing");
288
+ const prefix = `${context.key("page")}/`;
289
+ await store.put(`${prefix}a`, "a");
290
+ await store.put(`${prefix}b`, "b");
291
+ const first = await store.listPage({ prefix, limit: 1 });
292
+ if (first.keys.length !== 1 || first.cursor === undefined)
293
+ throw new Error("StoragePagingFirst");
294
+ const second = await store.listPage({ prefix, limit: 1, cursor: first.cursor });
295
+ if (second.keys.length !== 1 || second.keys[0] === first.keys[0])
296
+ throw new Error("StoragePagingSecond");
297
+ },
298
+ });
299
+ }
300
+ if (options.presign === true) {
301
+ capabilities.push("presign");
302
+ checks.push({
303
+ id: "presign",
304
+ capability: "presign",
305
+ async run(store, context) {
306
+ if (store.presign === undefined)
307
+ throw new Error("StoragePresignMissing");
308
+ const signed = await store.presign(context.key("signed"), "put", {
309
+ expiresInSeconds: 60,
310
+ contentType: "text/plain",
311
+ contentLength: 1,
312
+ });
313
+ const url = new URL(signed.url);
314
+ if (url.protocol !== "https:" && url.protocol !== "http:")
315
+ throw new Error("StoragePresignUrl");
316
+ },
317
+ });
318
+ }
319
+ if (options.move === true) {
320
+ capabilities.push("copy-move");
321
+ checks.push({
322
+ id: "copy-move",
323
+ capability: "copy-move",
324
+ async run(store, context) {
325
+ if (store.copy === undefined || store.move === undefined)
326
+ throw new Error("StorageMoveMissing");
327
+ const source = context.key("source");
328
+ const copy = context.key("copy");
329
+ const moved = context.key("moved");
330
+ await store.put(source, "x");
331
+ await store.copy(source, copy);
332
+ await store.move(copy, moved);
333
+ if (!(await store.exists(source)) ||
334
+ (await store.exists(copy)) ||
335
+ !(await store.exists(moved)))
336
+ throw new Error("StorageMove");
337
+ },
338
+ });
339
+ }
340
+ return {
341
+ id: "storage-adapter",
342
+ version: 1,
343
+ capabilities,
344
+ checks,
345
+ };
346
+ }
347
+ export function runtimeAdapterCertificationProfile() {
348
+ return {
349
+ id: "runtime-adapter",
350
+ version: 1,
351
+ capabilities: ["request-bridge", "response-bridge", "lifecycle"],
352
+ checks: [
353
+ {
354
+ id: "request-bridge",
355
+ capability: "request-bridge",
356
+ async run(adapter) {
357
+ const server = await adapter.start({
358
+ async fetch(request) {
359
+ return Response.json({
360
+ method: request.method,
361
+ path: new URL(request.url).pathname,
362
+ header: request.headers.get("x-cert"),
363
+ body: await request.text(),
364
+ });
365
+ },
366
+ });
367
+ try {
368
+ const response = await fetch(`${server.origin}/cert/path`, {
369
+ method: "POST",
370
+ headers: { "x-cert": "yes" },
371
+ body: "payload",
372
+ });
373
+ const value = (await response.json());
374
+ if (value.method !== "POST" ||
375
+ value.path !== "/cert/path" ||
376
+ value.header !== "yes" ||
377
+ value.body !== "payload")
378
+ throw new Error("RuntimeRequestBridge");
379
+ }
380
+ finally {
381
+ await server.stop();
382
+ }
383
+ },
384
+ },
385
+ {
386
+ id: "response-bridge",
387
+ capability: "response-bridge",
388
+ async run(adapter) {
389
+ const server = await adapter.start({
390
+ fetch: () => new Response("certified", { status: 201, headers: { "x-cert": "yes" } }),
391
+ });
392
+ try {
393
+ const response = await fetch(`${server.origin}/`);
394
+ if (response.status !== 201 ||
395
+ response.headers.get("x-cert") !== "yes" ||
396
+ (await response.text()) !== "certified")
397
+ throw new Error("RuntimeResponseBridge");
398
+ }
399
+ finally {
400
+ await server.stop();
401
+ }
402
+ },
403
+ },
404
+ {
405
+ id: "idempotent-stop",
406
+ capability: "lifecycle",
407
+ async run(adapter) {
408
+ const server = await adapter.start({ fetch: () => new Response(null, { status: 204 }) });
409
+ if (!/^https?:\/\//.test(server.origin))
410
+ throw new Error("RuntimeOrigin");
411
+ await server.stop();
412
+ await server.stop();
413
+ },
414
+ },
415
+ ],
416
+ };
417
+ }
418
+ const certEvent = (id, order) => ({
419
+ id,
420
+ type: "nifra.certified",
421
+ version: 1,
422
+ aggregateId: "certification",
423
+ payload: { order },
424
+ timestamp: new Date(order * 1_000).toISOString(),
425
+ });
426
+ export function eventDeliveryCertificationProfile() {
427
+ return {
428
+ id: "event-delivery",
429
+ version: 1,
430
+ capabilities: ["idempotent-append", "claim-ownership", "ordered-replay"],
431
+ checks: [
432
+ {
433
+ id: "idempotent-append",
434
+ capability: "idempotent-append",
435
+ async run(store, context) {
436
+ const event = certEvent(context.key("event"), 1);
437
+ await store.append(event);
438
+ await store.append(event);
439
+ const page = await store.readPage({ limit: 10 });
440
+ if (page.records.filter((record) => record.event.id === event.id).length !== 1)
441
+ throw new Error("EventAppendIdempotency");
442
+ },
443
+ },
444
+ {
445
+ id: "claim-ownership",
446
+ capability: "claim-ownership",
447
+ async run(store, context) {
448
+ const event = certEvent(context.key("claim"), 1);
449
+ await store.append(event);
450
+ const claimed = await store.claimPending(1, "2026-01-01T00:00:00.000Z");
451
+ const claimId = claimed[0]?.claimId;
452
+ if (claimed[0]?.event.id !== event.id || claimId === null || claimId === undefined)
453
+ throw new Error("EventClaim");
454
+ if (await store.markDelivered(event.id, "wrong-claim", "2026-01-01T00:00:01.000Z"))
455
+ throw new Error("EventClaimFence");
456
+ if (!(await store.markDelivered(event.id, claimId, "2026-01-01T00:00:01.000Z")))
457
+ throw new Error("EventSettlement");
458
+ if ((await store.claimPending(1, "2026-01-01T00:00:02.000Z")).length !== 0)
459
+ throw new Error("EventRedelivery");
460
+ },
461
+ },
462
+ {
463
+ id: "ordered-replay",
464
+ capability: "ordered-replay",
465
+ async run(store, context) {
466
+ const first = certEvent(context.key("first"), 1);
467
+ const second = certEvent(context.key("second"), 2);
468
+ await store.append(first);
469
+ await store.append(second);
470
+ const pageOne = await store.readPage({ limit: 1 });
471
+ if (pageOne.records[0]?.event.id !== first.id ||
472
+ pageOne.nextPosition === null ||
473
+ !pageOne.hasMore)
474
+ throw new Error("EventReplayPageOne");
475
+ const pageTwo = await store.readPage({ after: pageOne.nextPosition, limit: 1 });
476
+ if (pageTwo.records[0]?.event.id !== second.id || pageTwo.hasMore)
477
+ throw new Error("EventReplayPageTwo");
478
+ },
479
+ },
480
+ ],
481
+ };
482
+ }
483
+ //# sourceMappingURL=certification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certification.js","sourceRoot":"","sources":["../src/certification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Deterministic durable-failure laboratory.
3
+ *
4
+ * The controller is an off-hot-path port: tests place named checkpoints around real adapters and a
5
+ * replayable schedule injects crashes, duplicate/reordered delivery, virtual delay, deadline expiry,
6
+ * lost provider replies, or checkpoint contention. Evidence contains tokens only - never payloads,
7
+ * provider results, exception messages, or stacks.
8
+ */
9
+ export type FailureKind = "crash" | "duplicate-delivery" | "reorder-events" | "delay" | "expire-budget" | "lose-provider-reply" | "contend-checkpoint";
10
+ interface FailureDirectiveBase {
11
+ readonly point: string;
12
+ /** 1-based invocation of this kind at this point. Default 1. */
13
+ readonly occurrence?: number;
14
+ }
15
+ export type FailureDirective = (FailureDirectiveBase & {
16
+ readonly kind: "crash";
17
+ }) | (FailureDirectiveBase & {
18
+ readonly kind: "duplicate-delivery";
19
+ /** Total copies of every delivery, including the original. Default 2, maximum 10. */
20
+ readonly copies?: number;
21
+ }) | (FailureDirectiveBase & {
22
+ readonly kind: "reorder-events";
23
+ }) | (FailureDirectiveBase & {
24
+ readonly kind: "delay";
25
+ readonly delayMs: number;
26
+ }) | (FailureDirectiveBase & {
27
+ readonly kind: "expire-budget";
28
+ }) | (FailureDirectiveBase & {
29
+ readonly kind: "lose-provider-reply";
30
+ }) | (FailureDirectiveBase & {
31
+ readonly kind: "contend-checkpoint";
32
+ });
33
+ type NormalizedFailureDirective = {
34
+ readonly kind: "crash";
35
+ readonly point: string;
36
+ readonly occurrence: number;
37
+ } | {
38
+ readonly kind: "duplicate-delivery";
39
+ readonly point: string;
40
+ readonly occurrence: number;
41
+ readonly copies: number;
42
+ } | {
43
+ readonly kind: "reorder-events";
44
+ readonly point: string;
45
+ readonly occurrence: number;
46
+ } | {
47
+ readonly kind: "delay";
48
+ readonly point: string;
49
+ readonly occurrence: number;
50
+ readonly delayMs: number;
51
+ } | {
52
+ readonly kind: "expire-budget";
53
+ readonly point: string;
54
+ readonly occurrence: number;
55
+ } | {
56
+ readonly kind: "lose-provider-reply";
57
+ readonly point: string;
58
+ readonly occurrence: number;
59
+ } | {
60
+ readonly kind: "contend-checkpoint";
61
+ readonly point: string;
62
+ readonly occurrence: number;
63
+ };
64
+ export interface FailureEvidence {
65
+ readonly sequence: number;
66
+ readonly kind: FailureKind;
67
+ readonly point: string;
68
+ readonly occurrence: number;
69
+ readonly virtualTimeMs: number;
70
+ }
71
+ export interface FailureReplay {
72
+ readonly seed: number;
73
+ readonly schedule: readonly NormalizedFailureDirective[];
74
+ }
75
+ export interface FailureLabOptions {
76
+ /** Replayable unsigned seed. Default is stable. */
77
+ readonly seed?: number;
78
+ readonly schedule: readonly FailureDirective[];
79
+ /** Virtual epoch/monotonic start. No real sleep is ever performed. Default 0. */
80
+ readonly startTimeMs?: number;
81
+ }
82
+ export interface FailureLab {
83
+ /** Apply virtual delay and/or crash directives at a named durability seam. */
84
+ checkpoint(point: string): void;
85
+ /** Apply duplicate/reorder directives to a delivery batch without inspecting its values. */
86
+ deliveries<T>(point: string, values: readonly T[]): readonly T[];
87
+ /** Run the provider operation, then optionally lose only its reply. */
88
+ provider<T>(point: string, operation: () => T | Promise<T>): Promise<T>;
89
+ /** Return zero when this budget seam is scheduled to expire; otherwise clamp the supplied value. */
90
+ remaining(point: string, remainingMs: number): number;
91
+ /** True only for a scheduled checkpoint conflict occurrence. */
92
+ checkpointContended(point: string): boolean;
93
+ /** Current virtual time. */
94
+ now(): number;
95
+ /** Immutable, token-only injection evidence. */
96
+ evidence(): readonly FailureEvidence[];
97
+ /** Exact normalized replay inputs. */
98
+ replay(): FailureReplay;
99
+ }
100
+ export declare class FailureInjectedError extends Error {
101
+ readonly kind: "crash" | "lose-provider-reply";
102
+ readonly point: string;
103
+ readonly occurrence: number;
104
+ readonly name = "FailureInjectedError";
105
+ constructor(kind: "crash" | "lose-provider-reply", point: string, occurrence: number);
106
+ }
107
+ export interface FailureScenario<Output> {
108
+ readonly name: string;
109
+ execute(lab: FailureLab): Output | Promise<Output>;
110
+ /** The scenario passes only when this post-failure invariant returns true. */
111
+ verify(context: {
112
+ readonly lab: FailureLab;
113
+ readonly result?: Output;
114
+ readonly error?: unknown;
115
+ }): boolean | Promise<boolean>;
116
+ }
117
+ export interface FailureScenarioReport {
118
+ readonly name: string;
119
+ readonly ok: boolean;
120
+ readonly replay: FailureReplay;
121
+ readonly evidence: readonly FailureEvidence[];
122
+ /** Sanitized failure identity. Messages and stacks are deliberately excluded. */
123
+ readonly error?: {
124
+ readonly name: string;
125
+ readonly kind?: FailureInjectedError["kind"];
126
+ };
127
+ }
128
+ /** Build one isolated deterministic controller. Construct a fresh lab for every replay. */
129
+ export declare function createFailureLab(options: FailureLabOptions): FailureLab;
130
+ /** Run one scenario and evaluate its post-failure invariant without leaking its result or error text. */
131
+ export declare function runFailureScenario<Output>(scenario: FailureScenario<Output>, options: FailureLabOptions): Promise<FailureScenarioReport>;
132
+ export {};
133
+ //# sourceMappingURL=failure-lab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure-lab.d.ts","sourceRoot":"","sources":["../src/failure-lab.ts"],"names":[],"mappings":"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"}