@voltro/workflow 0.84.0 → 0.85.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.
@@ -1,12 +1,12 @@
1
- import { F as e, R as t, S as n, g as r, v as i } from "./primitives-Btjhjm8P.js";
2
- import { E as a, a as o } from "./journalEncryption--n5VDdYO.js";
3
- import { C as s, r as c, w as l } from "./src-DP-lKqaG.js";
4
- import { t as u, u as d } from "./cluster-i3frC3Da.js";
5
- import { Cause as f, Cron as p, Deferred as m, Effect as h, Fiber as g, Layer as _, Schema as v } from "effect";
6
- import { SqlClient as y } from "@effect/sql";
7
- import { afterEach as b, beforeAll as x, describe as S, expect as C, test as w } from "vitest";
1
+ import { E as e, O as t, a as n } from "./journalEncryption-DTyhUzaS.js";
2
+ import { F as r, R as i, S as a, g as o, v as s } from "./primitives-DX04WTWh.js";
3
+ import { C as c, r as l, w as u } from "./src-C2NEyUM8.js";
4
+ import { t as d, u as f } from "./cluster-F_bhqVP7.js";
5
+ import { Cause as p, Cron as m, Deferred as h, Effect as g, Fiber as _, Layer as v, Option as y, Schema as b } from "effect";
6
+ import { SqlClient as x } from "effect/sql";
7
+ import { afterEach as S, beforeAll as C, describe as w, expect as T, test as E } from "vitest";
8
8
  //#region src/clusterTestSuite.ts
9
- var T = async (e, t, n = 750) => {
9
+ var D = async (e, t, n = 750) => {
10
10
  try {
11
11
  let r = await import("node:net");
12
12
  return await new Promise((i) => {
@@ -22,140 +22,140 @@ var T = async (e, t, n = 750) => {
22
22
  } catch {
23
23
  return !1;
24
24
  }
25
- }, E = [
25
+ }, O = [
26
26
  "cluster_messages",
27
27
  "cluster_replies",
28
28
  "cluster_locks",
29
29
  "cluster_runners"
30
- ], D = async (e) => {
30
+ ], k = async (e) => {
31
31
  try {
32
- await h.runPromise(h.gen(function* () {
33
- let e = yield* y.SqlClient;
34
- for (let t of E) yield* e.unsafe(`DELETE FROM ${t}`).pipe(h.ignore);
35
- }).pipe(h.scoped, h.provide(e.sqlClientLayer)));
32
+ await g.runPromise(g.gen(function* () {
33
+ let e = yield* x.SqlClient;
34
+ for (let t of O) yield* e.unsafe(`DELETE FROM ${t}`).pipe(g.ignore);
35
+ }).pipe(g.scoped, g.provide(e.sqlClientLayer)));
36
36
  } catch {}
37
- }, O = "10 seconds", k = "30 seconds", A = (e, t) => h.gen(function* () {
38
- let n = yield* h.sync(() => Date.now() + t);
37
+ }, A = "10 seconds", j = "30 seconds", M = (e, t) => g.gen(function* () {
38
+ let n = yield* g.sync(() => Date.now() + t);
39
39
  for (; !e();) {
40
40
  if (Date.now() > n) return !1;
41
- yield* h.sleep("250 millis");
41
+ yield* g.sleep("250 millis");
42
42
  }
43
43
  return !0;
44
- }), j = (a) => {
45
- let o = `${a.name}-${Date.now()}`, s = (e, t) => d({
46
- sqlClientLayer: a.sqlClientLayer,
47
- runnerStorage: a.runnerStorage,
48
- runnerListenPort: e,
49
- ...a.dialectId ? { dialectId: a.dialectId } : {},
50
- ...a.shardLockMode ? { shardLockMode: a.shardLockMode } : {},
51
- ...t && t.length > 0 ? { extraShardingLayers: t } : {}
44
+ }), N = (e) => {
45
+ let t = `${e.name}-${Date.now()}`, n = (t, n) => f({
46
+ sqlClientLayer: e.sqlClientLayer,
47
+ runnerStorage: e.runnerStorage,
48
+ runnerListenPort: t,
49
+ ...e.dialectId ? { dialectId: e.dialectId } : {},
50
+ ...e.shardLockMode ? { shardLockMode: e.shardLockMode } : {},
51
+ ...n && n.length > 0 ? { extraShardingLayers: n } : {}
52
52
  });
53
- S(`cluster workflow engine — ${a.name}`, () => {
54
- let l = !1;
55
- x(async () => {
56
- if (l = await a.reachable(), !l) {
57
- console.warn(`[skip] cluster suite — ${a.name} not reachable`);
53
+ w(`cluster workflow engine — ${e.name}`, () => {
54
+ let c = !1;
55
+ C(async () => {
56
+ if (c = await e.reachable(), !c) {
57
+ console.warn(`[skip] cluster suite — ${e.name} not reachable`);
58
58
  return;
59
59
  }
60
- await D(a);
61
- }, 3e4), w("a two-step workflow runs end-to-end", async () => {
62
- if (!l) return;
63
- let e = `clusterTwoStep_${o}`, t = n({
64
- name: e,
65
- payload: { id: v.String },
66
- success: v.Number,
67
- idempotencyKey: ({ id: t }) => `${e}:${t}`
68
- }), r = t.toLayer(() => h.gen(function* () {
69
- let e = yield* i({
60
+ await k(e);
61
+ }, 3e4), E("a two-step workflow runs end-to-end", async () => {
62
+ if (!c) return;
63
+ let r = `clusterTwoStep_${t}`, i = a({
64
+ name: r,
65
+ payload: { id: b.String },
66
+ success: b.Number,
67
+ idempotencyKey: ({ id: e }) => `${r}:${e}`
68
+ }), o = i.toLayer(() => g.gen(function* () {
69
+ let e = yield* s({
70
70
  name: "first",
71
- success: v.Number,
72
- execute: h.succeed(40)
71
+ success: b.Number,
72
+ execute: g.succeed(40)
73
73
  });
74
- return yield* i({
74
+ return yield* s({
75
75
  name: "second",
76
- success: v.Number,
77
- execute: h.succeed(e + 2)
76
+ success: b.Number,
77
+ execute: g.succeed(e + 2)
78
78
  });
79
- })), c = await h.runPromise(h.scoped(t.execute({ id: `e2e-${o}` }).pipe(h.provide(r.pipe(_.provideMerge(s(a.runnerPort)))))));
80
- C(c).toBe(42);
81
- }, 3e4), w("idempotency-key journal — same payload returns same result", async () => {
82
- if (!l) return;
83
- let e = `clusterIdempotency_${o}`, t = 0, r = n({
84
- name: e,
85
- payload: { id: v.String },
86
- success: v.Number,
87
- idempotencyKey: ({ id: t }) => `${e}:${t}`
88
- }), c = r.toLayer(() => i({
79
+ })), l = await g.runPromise(g.scoped(i.execute({ id: `e2e-${t}` }).pipe(g.provide(o.pipe(v.provideMerge(n(e.runnerPort)))))));
80
+ T(l).toBe(42);
81
+ }, 3e4), E("idempotency-key journal — same payload returns same result", async () => {
82
+ if (!c) return;
83
+ let r = `clusterIdempotency_${t}`, i = 0, o = a({
84
+ name: r,
85
+ payload: { id: b.String },
86
+ success: b.Number,
87
+ idempotencyKey: ({ id: e }) => `${r}:${e}`
88
+ }), l = o.toLayer(() => s({
89
89
  name: "compute",
90
- success: v.Number,
91
- execute: h.sync(() => (t++, t * 100))
92
- })).pipe(_.provideMerge(s(a.runnerPort))), [u, d] = await h.runPromise(h.scoped(h.gen(function* () {
93
- return [yield* r.execute({ id: `same-${o}` }), yield* r.execute({ id: `same-${o}` })];
94
- }).pipe(h.provide(c))));
95
- C(u).toBe(d), C(t).toBe(1);
96
- }, 3e4), w("ClusterCron fires its execute on the shard owner", async () => {
97
- if (!l) return;
98
- let e = await h.runPromise(m.make()), t = 0, n = u({
99
- name: `clusterCron_${o}`,
100
- cron: p.unsafeParse("*/1 * * * * *", "UTC"),
90
+ success: b.Number,
91
+ execute: g.sync(() => (i++, i * 100))
92
+ })).pipe(v.provideMerge(n(e.runnerPort))), [u, d] = await g.runPromise(g.scoped(g.gen(function* () {
93
+ return [yield* o.execute({ id: `same-${t}` }), yield* o.execute({ id: `same-${t}` })];
94
+ }).pipe(g.provide(l))));
95
+ T(u).toBe(d), T(i).toBe(1);
96
+ }, 3e4), E("ClusterCron fires its execute on the shard owner", async () => {
97
+ if (!c) return;
98
+ let r = await g.runPromise(h.make()), i = 0, a = d({
99
+ name: `clusterCron_${t}`,
100
+ cron: m.parseUnsafe("*/1 * * * * *", "UTC"),
101
101
  execute: async () => {
102
- t += 1, await h.runPromise(m.succeed(e, !0)).catch(() => {});
102
+ i += 1, await g.runPromise(h.succeed(r, !0)).catch(() => {});
103
103
  }
104
- }), r = await h.runPromise(h.scoped(h.gen(function* () {
105
- return yield* _.build(s(a.runnerPort + 1, [n])), yield* m.await(e).pipe(h.timeout("25 seconds"), h.orElseSucceed(() => !1));
104
+ }), o = await g.runPromise(g.scoped(g.gen(function* () {
105
+ return yield* v.build(n(e.runnerPort + 1, [a])), yield* h.await(r).pipe(g.timeout("25 seconds"), g.orElseSucceed(() => !1));
106
106
  })));
107
- C(r).toBe(!0), C(t).toBeGreaterThanOrEqual(1);
107
+ T(o).toBe(!0), T(i).toBeGreaterThanOrEqual(1);
108
108
  }, 35e3);
109
- let d = a.clusterResume ? w : (() => {});
110
- d("a sleeping workflow resumes on a fresh runner after the first is torn down", async () => {
111
- if (!l) return;
112
- let e = `dormancyResume_${o}`, t = [], c = [], u = [], d = () => n({
113
- name: e,
114
- payload: { id: v.String },
115
- success: v.String,
116
- idempotencyKey: ({ id: t }) => `${e}:${t}`
117
- }), f = (e, n) => e.toLayer(() => h.gen(function* () {
118
- return yield* i({
109
+ let u = e.clusterResume ? E : (() => {});
110
+ u("a sleeping workflow resumes on a fresh runner after the first is torn down", async () => {
111
+ if (!c) return;
112
+ let r = `dormancyResume_${t}`, i = [], l = [], u = [], d = () => a({
113
+ name: r,
114
+ payload: { id: b.String },
115
+ success: b.String,
116
+ idempotencyKey: ({ id: e }) => `${r}:${e}`
117
+ }), f = (e, t) => e.toLayer(() => g.gen(function* () {
118
+ return yield* s({
119
119
  name: "step1",
120
- success: v.Void,
121
- execute: h.sync(() => {
122
- t.push(n);
120
+ success: b.Void,
121
+ execute: g.sync(() => {
122
+ i.push(t);
123
123
  })
124
- }), yield* i({
124
+ }), yield* s({
125
125
  name: "armed",
126
- success: v.Void,
127
- execute: h.sync(() => {
128
- u.push(n);
126
+ success: b.Void,
127
+ execute: g.sync(() => {
128
+ u.push(t);
129
129
  })
130
- }), yield* r({
130
+ }), yield* o({
131
131
  name: "nap",
132
- duration: O
133
- }), yield* i({
132
+ duration: A
133
+ }), yield* s({
134
134
  name: "step2",
135
- success: v.Void,
136
- execute: h.sync(() => {
137
- c.push(n);
135
+ success: b.Void,
136
+ execute: g.sync(() => {
137
+ l.push(t);
138
138
  })
139
139
  }), "done";
140
- })), p = a.runnerPort + 2, m = (e) => {
140
+ })), p = e.runnerPort + 2, m = (e) => {
141
141
  let t = d();
142
142
  return {
143
143
  wf: t,
144
- layer: f(t, e).pipe(_.provideMerge(s(p)))
144
+ layer: f(t, e).pipe(v.provideMerge(n(p)))
145
145
  };
146
- }, y = { id: `resume-${o}` }, b = await h.runPromise(h.scoped(h.gen(function* () {
147
- let { wf: e, layer: t } = m("A"), n = yield* _.build(t), r = yield* h.forkDaemon(e.execute(y).pipe(h.provide(n), h.ignore));
148
- return (yield* A(() => u.length > 0, 6e4)) ? r : yield* h.die(/* @__PURE__ */ Error("runner A never journaled step1"));
146
+ }, h = { id: `resume-${t}` }, y = await g.runPromise(g.scoped(g.gen(function* () {
147
+ let { wf: e, layer: t } = m("A"), n = yield* v.build(t), r = yield* g.forkDetach(e.execute(h).pipe(g.provide(n), g.ignore));
148
+ return (yield* M(() => u.length > 0, 6e4)) ? r : yield* g.die(/* @__PURE__ */ Error("runner A never journaled step1"));
149
149
  })));
150
- await h.runPromise(g.interrupt(b).pipe(h.ignore)), C(t).toEqual(["A"]), C(c).toEqual([]);
151
- let x = await h.runPromise(h.scoped(h.gen(function* () {
152
- let { wf: e, layer: t } = m("B"), n = yield* _.build(t);
153
- return yield* e.execute(y).pipe(h.provide(n), h.timeout("240 seconds"), h.orElseSucceed(() => "TIMEOUT"));
150
+ await g.runPromise(_.interrupt(y).pipe(g.ignore)), T(i).toEqual(["A"]), T(l).toEqual([]);
151
+ let x = await g.runPromise(g.scoped(g.gen(function* () {
152
+ let { wf: e, layer: t } = m("B"), n = yield* v.build(t);
153
+ return yield* e.execute(h).pipe(g.provide(n), g.timeout("240 seconds"), g.orElseSucceed(() => "TIMEOUT"));
154
154
  })));
155
- C(x).toBe("done"), C(t).toEqual(["A"]), C(c).toEqual(["B"]);
156
- }, 48e4), d("dormancy loop: a wake signal survives teardown and is cleared on resume", async () => {
157
- if (!l) return;
158
- let u = `dormancyLoop_${o}`, d = `wr_${u}`, f = [], p = /* @__PURE__ */ new Map(), m = c({
155
+ T(x).toBe("done"), T(i).toEqual(["A"]), T(l).toEqual(["B"]);
156
+ }, 48e4), u("dormancy loop: a wake signal survives teardown and is cleared on resume", async () => {
157
+ if (!c) return;
158
+ let u = `dormancyLoop_${t}`, d = `wr_${u}`, f = [], p = /* @__PURE__ */ new Map(), m = l({
159
159
  store: {
160
160
  insert: async (e, t) => t,
161
161
  update: async () => null,
@@ -169,235 +169,235 @@ var T = async (e, t, n = 750) => {
169
169
  p.delete(e);
170
170
  }
171
171
  }
172
- }), y = () => n({
172
+ }), h = () => a({
173
173
  name: u,
174
- payload: { id: v.String },
175
- success: v.String,
174
+ payload: { id: b.String },
175
+ success: b.String,
176
176
  idempotencyKey: ({ id: e }) => `${u}:${e}`
177
- }), b = (n, a) => n.toLayer(() => h.gen(function* () {
178
- return yield* i({
177
+ }), y = (e, t) => e.toLayer(() => g.gen(function* () {
178
+ return yield* s({
179
179
  name: "step1",
180
- success: v.Void,
181
- execute: h.void
182
- }), yield* r({
180
+ success: b.Void,
181
+ execute: g.void
182
+ }), yield* o({
183
183
  name: "nap",
184
- duration: k
185
- }), yield* i({
184
+ duration: j
185
+ }), yield* s({
186
186
  name: "step2",
187
- success: v.Void,
188
- execute: h.sync(() => {
189
- f.push(a);
187
+ success: b.Void,
188
+ execute: g.sync(() => {
189
+ f.push(t);
190
190
  })
191
191
  }), "done";
192
- }).pipe(h.locally(e, d), h.provideService(t, m))), x = a.runnerPort + 2, S = (e) => {
193
- let t = y();
192
+ }).pipe(g.provideService(r, d), g.provideService(i, m))), x = e.runnerPort + 2, S = (e) => {
193
+ let t = h();
194
194
  return {
195
195
  wf: t,
196
- layer: b(t, e).pipe(_.provideMerge(s(x)))
196
+ layer: y(t, e).pipe(v.provideMerge(n(x)))
197
197
  };
198
- }, w = { id: `loop-${o}` }, T = await h.runPromise(h.scoped(h.gen(function* () {
199
- let { wf: e, layer: t } = S("A"), n = yield* _.build(t), r = yield* h.forkDaemon(e.execute(w).pipe(h.provide(n), h.ignore));
200
- return (yield* A(() => p.has(d), 6e4)) ? (yield* h.sleep("1 second"), r) : yield* h.die(/* @__PURE__ */ Error("workflow never registered a wakeup"));
198
+ }, C = { id: `loop-${t}` }, w = await g.runPromise(g.scoped(g.gen(function* () {
199
+ let { wf: e, layer: t } = S("A"), n = yield* v.build(t), r = yield* g.forkDetach(e.execute(C).pipe(g.provide(n), g.ignore));
200
+ return (yield* M(() => p.has(d), 6e4)) ? (yield* g.sleep("1 second"), r) : yield* g.die(/* @__PURE__ */ Error("workflow never registered a wakeup"));
201
201
  })));
202
- await h.runPromise(g.interrupt(T).pipe(h.ignore)), C(p.has(d)).toBe(!0), C(f).toEqual([]);
203
- let E = await h.runPromise(h.scoped(h.gen(function* () {
204
- let { wf: e, layer: t } = S("B"), n = yield* _.build(t);
205
- return yield* e.execute(w).pipe(h.provide(n), h.timeout("600 seconds"), h.orElseSucceed(() => "TIMEOUT"));
202
+ await g.runPromise(_.interrupt(w).pipe(g.ignore)), T(p.has(d)).toBe(!0), T(f).toEqual([]);
203
+ let E = await g.runPromise(g.scoped(g.gen(function* () {
204
+ let { wf: e, layer: t } = S("B"), n = yield* v.build(t);
205
+ return yield* e.execute(C).pipe(g.provide(n), g.timeout("600 seconds"), g.orElseSucceed(() => "TIMEOUT"));
206
206
  })));
207
- C(E).toBe("done"), C(f).toEqual(["B"]), C(p.has(d)).toBe(!1);
207
+ T(E).toBe("done"), T(f).toEqual(["B"]), T(p.has(d)).toBe(!1);
208
208
  }, 9e5);
209
209
  });
210
- }, M = {
210
+ }, P = {
211
211
  encrypt: (e) => `enc:v2:c:${Buffer.from(e, "utf8").toString("base64")}`,
212
212
  decrypt: (e) => Buffer.from(e.slice(9), "base64").toString("utf8")
213
- }, N = (e) => {
214
- let t = `${e.name}-enc-${Date.now()}`, r = () => d({
215
- sqlClientLayer: e.sqlClientLayer,
216
- runnerStorage: e.runnerStorage,
217
- runnerListenPort: e.runnerPort + 7,
218
- ...e.dialectId ? { dialectId: e.dialectId } : {}
219
- }), c = (t) => h.runPromise(h.gen(function* () {
220
- let e = yield* y.SqlClient, n = yield* e.unsafe("SELECT * FROM cluster_messages"), r = yield* e.unsafe("SELECT * FROM cluster_replies");
221
- return [...n, ...r].filter((e) => JSON.stringify(e).includes(t)).length;
222
- }).pipe(h.scoped, h.provide(e.sqlClientLayer))), u = (e, t) => {
223
- let r = n({
213
+ }, F = (r) => {
214
+ let i = `${r.name}-enc-${Date.now()}`, o = () => f({
215
+ sqlClientLayer: r.sqlClientLayer,
216
+ runnerStorage: r.runnerStorage,
217
+ runnerListenPort: r.runnerPort + 7,
218
+ ...r.dialectId ? { dialectId: r.dialectId } : {}
219
+ }), l = (e) => g.runPromise(g.gen(function* () {
220
+ let t = yield* x.SqlClient, n = yield* t.unsafe("SELECT * FROM cluster_messages"), r = yield* t.unsafe("SELECT * FROM cluster_replies"), i = (e) => JSON.stringify(e, (e, t) => typeof t == "bigint" ? String(t) : t);
221
+ return [...n, ...r].filter((t) => i(t).includes(e)).length;
222
+ }).pipe(g.provideService(x.SafeIntegers, !0), g.scoped, g.provide(r.sqlClientLayer))), d = (e, t) => {
223
+ let n = a({
224
224
  name: e,
225
225
  payload: {
226
- note: v.String,
227
- count: v.Number
226
+ note: b.String,
227
+ count: b.Number
228
228
  },
229
- success: v.Struct({ summary: v.String }),
229
+ success: b.Struct({ summary: b.String }),
230
230
  idempotencyKey: ({ count: t }) => `${e}:${t}`,
231
231
  encrypted: t
232
- }), a = 0;
232
+ }), r = 0;
233
233
  return {
234
- wf: r,
235
- handler: r.toLayer(({ note: e }) => h.gen(function* () {
236
- return { summary: `RESULT-${yield* i({
234
+ wf: n,
235
+ handler: n.toLayer(({ note: e }) => g.gen(function* () {
236
+ return { summary: `RESULT-${yield* s({
237
237
  name: "summarise",
238
- success: v.String,
239
- execute: h.sync(() => (a++, `STEP-${e}`))
238
+ success: b.String,
239
+ execute: g.sync(() => (r++, `STEP-${e}`))
240
240
  })}` };
241
241
  })),
242
- executions: () => a
242
+ executions: () => r
243
243
  };
244
- }, p = (e, t) => h.runPromise(h.scoped(e.wf.execute(t).pipe(h.provide(e.handler.pipe(_.provideMerge(r()))))));
245
- S(`encrypted workflow journal — ${e.name}`, () => {
246
- let d = !1;
247
- x(async () => {
248
- d = await e.reachable(), d && await D(e);
249
- }, 3e4), b(() => a(void 0)), w("payload, step result and result are ciphertext; the unencrypted twin is found (control)", async (e) => {
250
- d || e.skip(), a(M);
251
- let n = u(`journalPlain_${t}`, !1), r = u(`journalSealed_${t}`, !0);
252
- C(await p(n, {
244
+ }, m = (e, t) => g.runPromise(g.scoped(e.wf.execute(t).pipe(g.provide(e.handler.pipe(v.provideMerge(o()))))));
245
+ w(`encrypted workflow journal — ${r.name}`, () => {
246
+ let f = !1;
247
+ C(async () => {
248
+ f = await r.reachable(), f && await k(r);
249
+ }, 3e4), S(() => e(void 0)), E("payload, step result and result are ciphertext; the unencrypted twin is found (control)", async (t) => {
250
+ f || t.skip(), e(P);
251
+ let n = d(`journalPlain_${i}`, !1), r = d(`journalSealed_${i}`, !0);
252
+ T(await m(n, {
253
253
  note: "PLAINMARK",
254
254
  count: 1
255
- })).toEqual({ summary: "RESULT-STEP-PLAINMARK" }), C(await p(r, {
255
+ })).toEqual({ summary: "RESULT-STEP-PLAINMARK" }), T(await m(r, {
256
256
  note: "SEALMARK",
257
257
  count: 1
258
- })).toEqual({ summary: "RESULT-STEP-SEALMARK" }), C(await c("PLAINMARK"), "the probe finds plaintext").toBeGreaterThan(0), C(await c("SEALMARK"), "no journal row carries the encrypted run in plaintext").toBe(0), C(await c("enc:v2:c:"), "and the ciphertext is there").toBeGreaterThan(0);
259
- }, 6e4), w("a second execute replays the result from the encrypted journal without re-running the step", async (e) => {
260
- d || e.skip(), a(M);
261
- let n = u(`journalReplay_${t}`, !0), r = await p(n, {
258
+ })).toEqual({ summary: "RESULT-STEP-SEALMARK" }), T(await l("PLAINMARK"), "the probe finds plaintext").toBeGreaterThan(0), T(await l("SEALMARK"), "no journal row carries the encrypted run in plaintext").toBe(0), T(await l("enc:v2:c:"), "and the ciphertext is there").toBeGreaterThan(0);
259
+ }, 6e4), E("a second execute replays the result from the encrypted journal without re-running the step", async (t) => {
260
+ f || t.skip(), e(P);
261
+ let n = d(`journalReplay_${i}`, !0), r = await m(n, {
262
262
  note: "REPLAYMARK",
263
263
  count: 7
264
- }), i = await p(n, {
264
+ }), a = await m(n, {
265
265
  note: "REPLAYMARK",
266
266
  count: 7
267
267
  });
268
- C(i).toEqual(r), C(n.executions()).toBe(1);
269
- }, 6e4), w("a run journaled in plaintext before the declaration is still read", async (e) => {
270
- d || e.skip();
271
- let n = `journalBefore_${t}`, r = await p(u(n, !1), {
268
+ T(a).toEqual(r), T(n.executions()).toBe(1);
269
+ }, 6e4), E("a run journaled in plaintext before the declaration is still read", async (t) => {
270
+ f || t.skip();
271
+ let n = `journalBefore_${i}`, r = await m(d(n, !1), {
272
272
  note: "OLDMARK",
273
273
  count: 3
274
274
  });
275
- a(M);
276
- let i = u(n, !0);
277
- C(await p(i, {
275
+ e(P);
276
+ let a = d(n, !0);
277
+ T(await m(a, {
278
278
  note: "OLDMARK",
279
279
  count: 3
280
- })).toEqual(r), C(i.executions(), "answered from the plaintext journal, not re-run").toBe(0);
280
+ })).toEqual(r), T(a.executions(), "answered from the plaintext journal, not re-run").toBe(0);
281
281
  }, 6e4);
282
- let m = (e, t, a) => {
283
- class o extends v.TaggedError()("Refused", { detail: v.String }) {}
284
- let s = n({
282
+ let h = (e, t, n) => {
283
+ class r extends b.TaggedError()("Refused", { detail: b.String }) {}
284
+ let i = a({
285
285
  name: e,
286
- payload: { note: v.String },
287
- error: o,
286
+ payload: { note: b.String },
287
+ error: r,
288
288
  idempotencyKey: ({ note: t }) => `${e}:${t}`,
289
289
  encrypted: t
290
- }), c = s.toLayer(({ note: e }) => i({
290
+ }), c = i.toLayer(({ note: e }) => s({
291
291
  name: "call-upstream",
292
- success: v.String,
293
- error: o,
294
- execute: a === "defect" ? h.die(/* @__PURE__ */ Error(`upstream rejected FAILMARK-${e}`)) : h.fail(new o({ detail: `FAILMARK-${e}` }))
292
+ success: b.String,
293
+ error: r,
294
+ execute: n === "defect" ? g.die(/* @__PURE__ */ Error(`upstream rejected FAILMARK-${e}`)) : g.fail(new r({ detail: `FAILMARK-${e}` }))
295
295
  }));
296
- return h.runPromiseExit(h.scoped(s.execute({ note: e }).pipe(h.provide(c.pipe(_.provideMerge(r()))))));
296
+ return g.runPromiseExit(g.scoped(i.execute({ note: e }).pipe(g.provide(c.pipe(v.provideMerge(o()))))));
297
297
  };
298
- for (let e of ["defect", "typed"]) w(`a ${e} failure of an encrypted run leaves no plaintext; the unencrypted twin does (control)`, async (n) => {
299
- d || n.skip(), a(M);
300
- let r = await m(`journalFailPlain_${e}_${t}`, !1, e);
301
- C(r._tag).toBe("Failure"), C(await c(`FAILMARK-journalFailPlain_${e}`), "the probe finds plaintext").toBeGreaterThan(0);
302
- let i = await m(`journalFailSealed_${e}_${t}`, !0, e);
303
- C(i._tag).toBe("Failure"), C(await c(`FAILMARK-journalFailSealed_${e}`), "no journal row carries the failure in plaintext").toBe(0), C(f.pretty(i.cause)).toContain(`FAILMARK-journalFailSealed_${e}`);
298
+ for (let n of ["defect", "typed"]) E(`a ${n} failure of an encrypted run leaves no plaintext; the unencrypted twin does (control)`, async (r) => {
299
+ f || r.skip(), e(P);
300
+ let a = await h(`journalFailPlain_${n}_${i}`, !1, n);
301
+ T(a._tag).toBe("Failure"), T(await l(`FAILMARK-journalFailPlain_${n}`), "the probe finds plaintext").toBeGreaterThan(0);
302
+ let o = await h(`journalFailSealed_${n}_${i}`, !0, n);
303
+ T(o._tag).toBe("Failure"), T(await l(`FAILMARK-journalFailSealed_${n}`), "no journal row carries the failure in plaintext").toBe(0), T(t(p.squash(o.cause))).toContain(`FAILMARK-journalFailSealed_${n}`);
304
304
  }, 6e4);
305
- w("a journaled wait value of an encrypted run is ciphertext; the unencrypted twin is found (control)", async (e) => {
306
- d || e.skip(), a(M);
307
- let i = (e, t) => {
308
- let i = n({
305
+ E("a journaled wait value of an encrypted run is ciphertext; the unencrypted twin is found (control)", async (t) => {
306
+ f || t.skip(), e(P);
307
+ let r = (e, t) => {
308
+ let r = a({
309
309
  name: e,
310
- payload: { note: v.String },
311
- success: v.String,
310
+ payload: { note: b.String },
311
+ success: b.String,
312
312
  idempotencyKey: ({ note: t }) => `${e}:${t}`,
313
313
  encrypted: t
314
- }), a = i.toLayer(({ note: e }) => o({
314
+ }), i = r.toLayer(({ note: e }) => n({
315
315
  name: "await-signal:approval",
316
- success: v.String,
317
- execute: h.succeed(`WAITMARK-${e}`)
316
+ success: b.String,
317
+ execute: g.succeed(`WAITMARK-${e}`)
318
318
  }));
319
- return h.runPromise(h.scoped(i.execute({ note: e }).pipe(h.provide(a.pipe(_.provideMerge(r()))))));
319
+ return g.runPromise(g.scoped(r.execute({ note: e }).pipe(g.provide(i.pipe(v.provideMerge(o()))))));
320
320
  };
321
- C(await i(`journalWaitPlain_${t}`, !1)).toBe(`WAITMARK-journalWaitPlain_${t}`), C(await c(`WAITMARK-journalWaitPlain_${t}`), "the probe finds plaintext").toBeGreaterThan(0), C(await i(`journalWaitSealed_${t}`, !0)).toBe(`WAITMARK-journalWaitSealed_${t}`), C(await c(`WAITMARK-journalWaitSealed_${t}`), "no plaintext wait value in the journal").toBe(0);
321
+ T(await r(`journalWaitPlain_${i}`, !1)).toBe(`WAITMARK-journalWaitPlain_${i}`), T(await l(`WAITMARK-journalWaitPlain_${i}`), "the probe finds plaintext").toBeGreaterThan(0), T(await r(`journalWaitSealed_${i}`, !0)).toBe(`WAITMARK-journalWaitSealed_${i}`), T(await l(`WAITMARK-journalWaitSealed_${i}`), "no plaintext wait value in the journal").toBe(0);
322
322
  }, 6e4);
323
- let g = (e, t, n) => h.gen(function* () {
323
+ let _ = (e, t, n) => g.gen(function* () {
324
324
  for (let r = 0; r < 400; r++) {
325
325
  let r = yield* e.poll(t);
326
326
  if (n(r)) return r;
327
- yield* h.sleep("50 millis");
327
+ yield* g.sleep("50 millis");
328
328
  }
329
- return yield* h.dieMessage("pollUntil: never satisfied");
330
- }), y = (e) => e?._tag;
331
- for (let e of [!1, !0]) w(`a suspending signal's value is ${e ? "ciphertext" : "found (control)"} in the journal, and the run resumes with it`, async (i) => {
332
- d || i.skip(), a(M);
333
- let o = `journalSignal_${e ? "sealed" : "plain"}_${t}`, u = n({
334
- name: o,
335
- payload: { id: v.String },
336
- success: v.Unknown,
337
- idempotencyKey: ({ id: e }) => `${o}:${e}`,
338
- encrypted: e
339
- }), f = u.toLayer(() => s({ store: { query: () => Promise.resolve([]) } }, {
329
+ return yield* g.die(/* @__PURE__ */ Error("pollUntil: never satisfied"));
330
+ }), x = (e) => y.isOption(e) && y.isSome(e) ? e.value._tag : void 0;
331
+ for (let t of [!1, !0]) E(`a suspending signal's value is ${t ? "ciphertext" : "found (control)"} in the journal, and the run resumes with it`, async (n) => {
332
+ f || n.skip(), e(P);
333
+ let r = `journalSignal_${t ? "sealed" : "plain"}_${i}`, s = a({
334
+ name: r,
335
+ payload: { id: b.String },
336
+ success: b.Unknown,
337
+ idempotencyKey: ({ id: e }) => `${r}:${e}`,
338
+ encrypted: t
339
+ }), d = s.toLayer(() => c({ store: { query: () => Promise.resolve([]) } }, {
340
340
  name: "approval",
341
- schema: v.Struct({ comment: v.String }),
341
+ schema: b.Struct({ comment: b.String }),
342
342
  timeoutMs: 36e5
343
- })), p = `SIGNALMARK-${o}`, m = await h.runPromise(h.scoped(h.gen(function* () {
344
- let e = yield* u.executionId({ id: "one" });
345
- return yield* u.execute({ id: "one" }, { discard: !0 }), yield* g(u, e, (e) => y(e) === "Suspended"), yield* l({
343
+ })), p = `SIGNALMARK-${r}`, m = await g.runPromise(g.scoped(g.gen(function* () {
344
+ let e = yield* s.executionId({ id: "one" });
345
+ return yield* s.execute({ id: "one" }, { discard: !0 }), yield* _(s, e, (e) => x(e) === "Suspended"), yield* u({
346
346
  target: {
347
347
  executionId: e,
348
- workflowName: o
348
+ workflowName: r
349
349
  },
350
350
  signalName: "approval",
351
351
  payload: { comment: p }
352
- }), yield* g(u, e, (e) => y(e) === "Complete");
353
- }).pipe(h.provide(f.pipe(_.provideMerge(r()))))));
354
- C(JSON.stringify(m.exit), "the body received the value").toContain(p);
355
- let b = await c(p);
356
- e ? C(b, "no plaintext signal value in the journal").toBe(0) : C(b, "the probe finds plaintext").toBeGreaterThan(0);
352
+ }), yield* _(s, e, (e) => x(e) === "Complete");
353
+ }).pipe(g.provide(d.pipe(v.provideMerge(o()))))));
354
+ T(JSON.stringify(y.getOrThrow(m).exit), "the body received the value").toContain(p);
355
+ let h = await l(p);
356
+ t ? T(h, "no plaintext signal value in the journal").toBe(0) : T(h, "the probe finds plaintext").toBeGreaterThan(0);
357
357
  }, 9e4);
358
- w("an encrypted child's defect reaches its encrypted parent as thrown, and no journal row carries it", async (e) => {
359
- d || e.skip(), a(M);
360
- let i = `journalChild_${t}`, o = `journalParent_${t}`, s = `CHILDMARK-${t}`, l = n({
361
- name: i,
362
- payload: { id: v.String },
363
- success: v.String,
358
+ E("an encrypted child's defect reaches its encrypted parent as thrown, and no journal row carries it", async (t) => {
359
+ f || t.skip(), e(P);
360
+ let n = `journalChild_${i}`, r = `journalParent_${i}`, s = `CHILDMARK-${i}`, c = a({
361
+ name: n,
362
+ payload: { id: b.String },
363
+ success: b.String,
364
364
  idempotencyKey: ({ id: e }) => e,
365
365
  encrypted: !0
366
- }), u = n({
367
- name: o,
368
- payload: { id: v.String },
369
- success: v.String,
366
+ }), u = a({
367
+ name: r,
368
+ payload: { id: b.String },
369
+ success: b.String,
370
370
  idempotencyKey: ({ id: e }) => e,
371
371
  encrypted: !0
372
- }), f = l.toLayer(() => h.die(/* @__PURE__ */ Error(`child failed ${s}`))), p = u.toLayer(({ id: e }) => l.execute({ id: `${e}-child` }).pipe(h.catchAllDefect((e) => h.succeed(`caught: ${e.message}`)))), m = await h.runPromise(h.scoped(u.execute({ id: "p1" }).pipe(h.provide(_.mergeAll(p, f).pipe(_.provideMerge(r()))))));
373
- C(m).toBe(`caught: child failed ${s}`), C(await c(s)).toBe(0);
374
- }, 6e4), w("an encrypted run that suspends on a failed step journals no plaintext", async (e) => {
375
- d || e.skip(), a(M);
376
- let o = `journalSuspendOnFailure_${t}`, s = `SOFMARK-${t}`, l = n({
377
- name: o,
378
- payload: { id: v.String },
379
- success: v.String,
372
+ }), d = c.toLayer(() => g.die(/* @__PURE__ */ Error(`child failed ${s}`))), p = u.toLayer(({ id: e }) => c.execute({ id: `${e}-child` }).pipe(g.catchDefect((e) => g.succeed(`caught: ${e.message}`)))), m = await g.runPromise(g.scoped(u.execute({ id: "p1" }).pipe(g.provide(v.mergeAll(p, d).pipe(v.provideMerge(o()))))));
373
+ T(m).toBe(`caught: child failed ${s}`), T(await l(s)).toBe(0);
374
+ }, 6e4), E("an encrypted run that suspends on a failed step journals no plaintext", async (t) => {
375
+ f || t.skip(), e(P);
376
+ let n = `journalSuspendOnFailure_${i}`, r = `SOFMARK-${i}`, c = a({
377
+ name: n,
378
+ payload: { id: b.String },
379
+ success: b.String,
380
380
  idempotencyKey: ({ id: e }) => e,
381
381
  encrypted: !0,
382
382
  suspendOnFailure: !0
383
- }), u = l.toLayer(() => i({
383
+ }), u = c.toLayer(() => s({
384
384
  name: "call",
385
- success: v.String,
386
- execute: h.die(/* @__PURE__ */ Error(`step failed ${s}`))
385
+ success: b.String,
386
+ execute: g.die(/* @__PURE__ */ Error(`step failed ${r}`))
387
387
  }));
388
- await h.runPromise(h.scoped(h.gen(function* () {
389
- let e = yield* l.executionId({ id: "s1" });
390
- yield* l.execute({ id: "s1" }, { discard: !0 }), yield* g(l, e, (e) => y(e) === "Suspended");
391
- }).pipe(h.provide(u.pipe(_.provideMerge(r())))))), C(await c(s)).toBe(0);
392
- }, 6e4), w("without a registered cipher an encrypted run fails instead of writing plaintext", async (e) => {
393
- d || e.skip();
394
- let n = u(`journalNoCipher_${t}`, !0);
395
- await C(p(n, {
388
+ await g.runPromise(g.scoped(g.gen(function* () {
389
+ let e = yield* c.executionId({ id: "s1" });
390
+ yield* c.execute({ id: "s1" }, { discard: !0 }), yield* _(c, e, (e) => x(e) === "Suspended");
391
+ }).pipe(g.provide(u.pipe(v.provideMerge(o())))))), T(await l(r)).toBe(0);
392
+ }, 6e4), E("without a registered cipher an encrypted run fails instead of writing plaintext", async (e) => {
393
+ f || e.skip();
394
+ let t = d(`journalNoCipher_${i}`, !0);
395
+ await T(m(t, {
396
396
  note: "NOCIPHERMARK",
397
397
  count: 1
398
- })).rejects.toThrow(), C(await c("NOCIPHERMARK")).toBe(0);
398
+ })).rejects.toThrow(), T(await l("NOCIPHERMARK")).toBe(0);
399
399
  }, 6e4);
400
400
  });
401
401
  };
402
402
  //#endregion
403
- export { D as purgeClusterState, j as runClusterEngineSuite, N as runJournalEncryptionSuite, T as tcpReachable };
403
+ export { k as purgeClusterState, N as runClusterEngineSuite, F as runJournalEncryptionSuite, D as tcpReachable };