@voltro/runtime 0.86.0 → 0.87.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.
Files changed (70) hide show
  1. package/CHANGELOG.md +5321 -0
  2. package/README.md +43 -0
  3. package/THIRD-PARTY-NOTICES.md +860 -221
  4. package/dist/analyticsSink.js +8 -14
  5. package/dist/apiKeys.js +82 -78
  6. package/dist/apiRoleBucketSampler.js +64 -0
  7. package/dist/apiRoleWorkloadHistory.js +56 -0
  8. package/dist/apiRoleWorkloadMetrics.js +78 -0
  9. package/dist/apiRoleWorkloadStorage.js +95 -0
  10. package/dist/approvals.js +67 -74
  11. package/dist/authMiddlewareLayer.js +7 -6
  12. package/dist/bindEvent.js +48 -28
  13. package/dist/bootListener.js +106 -39
  14. package/dist/bootStoreCodec.js +38 -37
  15. package/dist/circuitBreaker.js +1 -72
  16. package/dist/composeAnalytics.js +31 -10
  17. package/dist/computedQueryCache.js +231 -0
  18. package/dist/connectionsFacade.js +32 -30
  19. package/dist/coordinatedSchedule.js +84 -78
  20. package/dist/dataStore.js +154 -121
  21. package/dist/declaredTablesGuard.js +2 -1
  22. package/dist/dispatcher.js +403 -328
  23. package/dist/effectStore.js +2 -2
  24. package/dist/engineClients.js +24 -0
  25. package/dist/externalizedTasks.js +19 -6
  26. package/dist/fieldCipher.js +109 -40
  27. package/dist/fieldKeyRegistry.js +295 -0
  28. package/dist/fieldKeyRekey.js +286 -0
  29. package/dist/fieldKeyScan.js +136 -0
  30. package/dist/fieldKeyring.js +77 -0
  31. package/dist/hot.d.ts +56 -0
  32. package/dist/hot.js +3 -0
  33. package/dist/hotDataStore.js +148 -0
  34. package/dist/hotDataStoreSnapshot.js +98 -0
  35. package/dist/hotDataStoreTables.js +18 -0
  36. package/dist/http-range.d.ts +53 -0
  37. package/dist/http-range.js +52 -0
  38. package/dist/httpClientSsrf.js +12 -37
  39. package/dist/httpClientTracing.js +12 -9
  40. package/dist/httpCompression.js +17 -17
  41. package/dist/httpInputStream.js +82 -0
  42. package/dist/httpRouteMounts.js +1 -0
  43. package/dist/idempotencyStore.js +92 -52
  44. package/dist/index.d.ts +1164 -451
  45. package/dist/index.js +143 -132
  46. package/dist/kvFacade.js +23 -17
  47. package/dist/memoryQueryJoins.js +16 -16
  48. package/dist/memorySetOperations.js +43 -0
  49. package/dist/metrics.js +38 -24
  50. package/dist/outbox.js +1 -1
  51. package/dist/readRecorder.js +35 -34
  52. package/dist/readScopePredicate.js +12 -0
  53. package/dist/replicatedDataStore.js +22 -4
  54. package/dist/rowFilter.js +56 -39
  55. package/dist/rpcConnections.js +8 -8
  56. package/dist/rpcServer.js +522 -449
  57. package/dist/rpcWorkloadAdmission.js +50 -0
  58. package/dist/rywPositionStore.js +82 -47
  59. package/dist/scheduler.js +6 -1
  60. package/dist/servePipeline.js +215 -146
  61. package/dist/setReadScopes.js +28 -0
  62. package/dist/snapshotValueCodec.js +46 -0
  63. package/dist/sourceResolution.js +34 -24
  64. package/dist/storeMiddleware.js +211 -209
  65. package/dist/subscriber.js +1 -0
  66. package/dist/tenantScope.js +8 -20
  67. package/dist/traceparent.js +8 -19
  68. package/dist/webSocketGatewayRuntime.js +111 -71
  69. package/dist/workflowRuntime.js +9 -9
  70. package/package.json +19 -7
@@ -1,5 +1,6 @@
1
1
  //#region src/subscriber.ts
2
2
  var e = (e) => {
3
+ if (e.eventTenant !== void 0 && typeof e.eventTenant != "function") throw Error("defineSubscriber: `eventTenant` must be a function");
3
4
  if (e.once !== void 0 && e.eachReplica === !0) throw Error("defineSubscriber: choose either `once` or `eachReplica: true`, not both");
4
5
  return e;
5
6
  };
@@ -1,23 +1,11 @@
1
- import { and as e, eq as t, isNull as n } from "@voltro/database";
1
+ import { mapSetReadScopes as e } from "./setReadScopes.js";
2
+ import { addReadScopePredicate as t } from "./readScopePredicate.js";
3
+ import { eq as n, gt as r, isNull as i, or as a } from "@voltro/database";
2
4
  //#region src/tenantScope.ts
3
- var r = (n, r, i) => {
4
- if (n.crossTenant || !r.has(n.table) || i == null) return n;
5
- let a = t("tenantId", i);
6
- return {
7
- ...n,
8
- predicate: n.predicate ? e(n.predicate, a) : a
9
- };
10
- }, i = (e, t, n) => n === "" && !e.crossTenant && t.has(e.table), a = (e) => e?.type === "user" && e.tenantId === "", o = (t, r) => {
11
- if (t.includeDeleted || !r.has(t.table)) return t;
12
- let i = n("deletedAt");
13
- return {
14
- ...t,
15
- predicate: t.predicate ? e(t.predicate, i) : i
16
- };
17
- }, s = (e) => (t, n) => {
18
- e.observe?.beforeScope?.({ ...t }, n);
19
- let i = o(r(t, e.tenantScopedTables, n.tenantId), e.softDeleteScopedTables);
20
- return e.observe?.afterScope?.({ ...i }), i;
5
+ var o = (r, i, a) => e(r, (e) => e.crossTenant || !i.has(e.table) || a == null ? e : t(e, (e) => n(e("tenantId"), a))), s = (e, t, n) => n === "" && !e.crossTenant && t.has(e.table), c = (e) => e?.type === "user" && e.tenantId === "", l = (n, r) => e(n, (e) => e.includeDeleted || !r.has(e.table) ? e : t(e, (e) => i(e("deletedAt")))), u = (n) => (s, c) => {
6
+ n.observe?.beforeScope?.({ ...s }, c);
7
+ let u = l(o(s, n.tenantScopedTables, c.tenantId), n.softDeleteScopedTables), d = /* @__PURE__ */ new Date(), f = n.expiresScopedTables, p = f === void 0 ? u : e(u, (e) => e.includeExpired || !f.has(e.table) ? e : t(e, (e) => a(i(e("expiresAt")), r(e("expiresAt"), d))));
8
+ return n.observe?.afterScope?.({ ...p }), p;
21
9
  };
22
10
  //#endregion
23
- export { o as applySoftDeleteScope, r as applyTenantScope, i as isEmptyTenantScopedRead, a as isOrglessUserSubject, s as makeQueryFinalizer };
11
+ export { l as applySoftDeleteScope, o as applyTenantScope, s as isEmptyTenantScopedRead, c as isOrglessUserSubject, u as makeQueryFinalizer };
@@ -1,34 +1,23 @@
1
1
  import { Tracer as e } from "effect";
2
+ import { newTraceId as t } from "@voltro/shared";
2
3
  //#region src/traceparent.ts
3
- var t = /^00-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/, n = (e) => `00-${e.traceId}-${e.spanId}-${e.sampled ? "01" : "00"}`, r = (e) => {
4
+ var n = /^00-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/, r = (e) => `00-${e.traceId}-${e.spanId}-${e.sampled ? "01" : "00"}`, i = (e) => {
4
5
  if (typeof e != "string") return null;
5
- let n = t.exec(e.trim().toLowerCase());
6
- if (n === null) return null;
7
- let [, r, i, a] = n;
6
+ let t = n.exec(e.trim().toLowerCase());
7
+ if (t === null) return null;
8
+ let [, r, i, a] = t;
8
9
  return r === "0".repeat(32) || i === "0".repeat(16) ? null : {
9
10
  traceId: r,
10
11
  spanId: i,
11
12
  sampled: (parseInt(a, 16) & 1) == 1
12
13
  };
13
- }, i = (t) => {
14
- let n = r(t);
14
+ }, a = (t) => {
15
+ let n = i(t);
15
16
  if (n !== null) return e.externalSpan({
16
17
  traceId: n.traceId,
17
18
  spanId: n.spanId,
18
19
  sampled: n.sampled
19
20
  });
20
- }, a = () => {
21
- let e = globalThis.crypto, t = /* @__PURE__ */ new Uint8Array(16);
22
- if (e?.getRandomValues !== void 0) e.getRandomValues(t);
23
- else {
24
- let e = `${Date.now().toString(16)}${Math.random().toString(16).slice(2)}`;
25
- for (let n = 0; n < t.length; n += 1) {
26
- let r = e.slice(n * 2 % e.length, n * 2 % e.length + 2);
27
- t[n] = (parseInt(r, 16) || n + 1) ^ (Math.random() * 256 | 0);
28
- }
29
- }
30
- let n = Array.from(t, (e) => e.toString(16).padStart(2, "0")).join("");
31
- return n === "0".repeat(32) ? `${"0".repeat(31)}1` : n;
32
21
  };
33
22
  //#endregion
34
- export { i as externalSpanFromTraceparent, n as formatTraceparent, a as newTraceId, r as parseTraceparent };
23
+ export { a as externalSpanFromTraceparent, r as formatTraceparent, t as newTraceId, i as parseTraceparent };
@@ -1,114 +1,154 @@
1
- import { Effect as e } from "effect";
2
- import { GATEWAY_CREDENTIAL_EXPIRED_CLOSE_CODE as t } from "@voltro/protocol";
3
- import { Socket as n } from "effect/socket";
1
+ import { Effect as e, Schema as t } from "effect";
2
+ import { GATEWAY_CREDENTIAL_EXPIRED_CLOSE_CODE as n, Subject as r } from "@voltro/protocol";
3
+ import { Socket as i } from "effect/socket";
4
4
  //#region src/webSocketGatewayRuntime.ts
5
- var r = (r, i, a, o, s, c, l) => e.scoped(e.gen(function* () {
6
- let u = yield* r.writer, d = yield* e.context(), f = new AbortController(), p = a.limits?.maxMessageBytes ?? 1048576, m = a.limits?.maxPendingBytes ?? 4194304, h = a.limits?.maxPendingMessages ?? 64, g = [], _ = [], v = 0, y, b = 0, x, S, C, w = !1, T = !1, E = () => {
7
- let e = x;
8
- x = void 0;
5
+ var a = (a, o, s, c, l, u, d) => e.scoped(e.gen(function* () {
6
+ let f = yield* a.writer, p = yield* e.context(), m = new AbortController(), h = s.limits?.maxMessageBytes ?? 1048576, g = s.limits?.maxPendingBytes ?? 4194304, _ = s.limits?.maxPendingMessages ?? 64, v = [], y = s.limits?.maxInboundMessagesPerSecond, b = s.limits?.burst ?? y ?? 0, x = b, S = performance.now(), C = [], w = 0, T, E = 0, D, O, k, A = 0, j, M = s.auth === "token" ? "waiting" : "admitted", N = c, P = !1, F = !1, I = () => {
7
+ let e = D;
8
+ D = void 0;
9
9
  try {
10
10
  e?.();
11
11
  } catch (e) {
12
- l(e);
12
+ d(e);
13
13
  }
14
- }, D = (e) => {
15
- if (!f.signal.aborted) {
16
- f.abort(e), S !== void 0 && clearTimeout(S), g.length = 0, y?.reject(e);
17
- for (let t = v; t < _.length; t += 1) _[t]?.reject(e);
18
- _.length = 0, v = 0, b = 0, E();
14
+ }, L = (e) => {
15
+ if (!m.signal.aborted) {
16
+ m.abort(e), O !== void 0 && clearTimeout(O), k !== void 0 && clearTimeout(k), v.length = 0, T?.reject(e);
17
+ for (let t = w; t < C.length; t += 1) C[t]?.reject(e);
18
+ C.length = 0, w = 0, E = 0, I();
19
19
  }
20
- }, O = (t = 1e3, r) => {
21
- f.signal.aborted || (D(Error(r ?? "gateway closed")), !(T || i.destroyed) && (T = !0, C = setTimeout(() => i.destroy(), 1e3), C.unref(), w ? e.runPromiseWith(d)(u.write(new n.CloseEvent(t, r))).catch(() => i.destroy()) : i.destroy()));
22
- }, k = () => new Promise((e, t) => {
23
- if (f.signal.aborted || i.destroyed) {
20
+ }, R = (t = 1e3, n) => {
21
+ m.signal.aborted || (L(Error(n ?? "gateway closed")), !(F || o.destroyed) && (F = !0, j = setTimeout(() => o.destroy(), 1e3), j.unref(), P ? e.runPromiseWith(p)(f.write(new i.CloseEvent(t, n))).catch(() => o.destroy()) : o.destroy()));
22
+ }, z = () => new Promise((e, t) => {
23
+ if (m.signal.aborted || o.destroyed) {
24
24
  t(/* @__PURE__ */ Error("gateway closed"));
25
25
  return;
26
26
  }
27
27
  let n = () => {
28
28
  t(/* @__PURE__ */ Error("gateway closed"));
29
29
  };
30
- f.signal.addEventListener("abort", n, { once: !0 }), i.write(/* @__PURE__ */ new Uint8Array(), (r) => {
31
- f.signal.removeEventListener("abort", n), r ? t(r) : e();
30
+ m.signal.addEventListener("abort", n, { once: !0 }), o.write(/* @__PURE__ */ new Uint8Array(), (r) => {
31
+ m.signal.removeEventListener("abort", n), r ? t(r) : e();
32
32
  });
33
- }), A = async () => {
34
- if (y !== void 0 || f.signal.aborted) return;
35
- let t = _[v];
33
+ }), B = async () => {
34
+ if (T !== void 0 || m.signal.aborted) return;
35
+ let t = C[w];
36
36
  if (t) {
37
- _[v] = void 0, v += 1, v === _.length ? (_.length = 0, v = 0) : v >= 1024 && v * 2 >= _.length && (_.splice(0, v), v = 0), y = t;
37
+ C[w] = void 0, w += 1, w === C.length ? (C.length = 0, w = 0) : w >= 1024 && w * 2 >= C.length && (C.splice(0, w), w = 0), T = t;
38
38
  try {
39
- if (await e.runPromiseWith(d)(u.write(t.data), { signal: f.signal }), await k(), f.signal.aborted) throw Error("gateway closed");
40
- t.resolve();
39
+ if (await e.runPromiseWith(p)(f.write(t.data), { signal: m.signal }), await z(), m.signal.aborted) throw Error("gateway closed");
40
+ t.resolve({ queuedBytes: E - t.size });
41
41
  } catch (e) {
42
- t.reject(e instanceof Error ? e : /* @__PURE__ */ Error("gateway write failed")), O(1011, "gateway write failed");
42
+ t.reject(e instanceof Error ? e : /* @__PURE__ */ Error("gateway write failed")), R(1011, "gateway write failed");
43
43
  } finally {
44
- f.signal.aborted || (b -= t.size), y = void 0, f.signal.aborted || A();
44
+ m.signal.aborted || (E -= t.size), T = void 0, m.signal.aborted || B();
45
45
  }
46
46
  }
47
- }, j = (e) => {
48
- if (f.signal.aborted) return Promise.reject(/* @__PURE__ */ Error("gateway closed"));
47
+ }, V = (e) => {
48
+ if (m.signal.aborted) return Promise.reject(/* @__PURE__ */ Error("gateway closed"));
49
49
  let t = typeof e == "string" ? Buffer.byteLength(e) : e.byteLength;
50
- if (t > p) return O(1009, "gateway message too large"), Promise.reject(/* @__PURE__ */ Error("gateway message too large"));
51
- if (t > m - b || _.length - v + +!!y >= h) return O(1013, "gateway outbound queue exceeded"), Promise.reject(/* @__PURE__ */ Error("gateway outbound queue exceeded"));
52
- b += t;
50
+ if (t > h) return R(1009, "gateway message too large"), Promise.reject(/* @__PURE__ */ Error("gateway message too large"));
51
+ if (t > g - E || C.length - w + +!!T >= _) return R(1013, "gateway outbound queue exceeded"), Promise.reject(/* @__PURE__ */ Error("gateway outbound queue exceeded"));
52
+ E += t;
53
53
  let n = new Promise((n, r) => {
54
- _.push({
54
+ C.push({
55
55
  data: typeof e == "string" ? e : e.slice(),
56
56
  size: t,
57
57
  resolve: n,
58
58
  reject: r
59
59
  });
60
60
  });
61
- return A(), n;
62
- }, M = {
61
+ return B(), n;
62
+ }, H = {
63
63
  send: (e) => {
64
- j(e).catch(() => {});
64
+ V(e).catch(() => {});
65
65
  },
66
- sendAsync: j,
67
- signal: f.signal,
68
- close: O,
66
+ sendAsync: V,
67
+ get queuedBytes() {
68
+ return E;
69
+ },
70
+ signal: m.signal,
71
+ close: R,
69
72
  onMessage: (e) => {
70
- f.signal.aborted || g.push(e);
73
+ m.signal.aborted || v.push(e);
74
+ },
75
+ get subject() {
76
+ return N;
71
77
  },
72
- subject: o,
73
- headers: s,
74
- path: a.path
75
- }, N = () => D(/* @__PURE__ */ Error("gateway disconnected")), P = () => O(1011, "gateway transport failed");
76
- i.once("close", N), i.once("error", P), yield* e.addFinalizer(() => e.sync(() => {
77
- D(/* @__PURE__ */ Error("gateway stopped")), C !== void 0 && clearTimeout(C), i.off("close", N), i.off("error", P), i.destroy();
78
+ headers: l,
79
+ path: s.path
80
+ }, U = () => {
81
+ Promise.resolve().then(() => {
82
+ if (!m.signal.aborted) return s.onConnection(H);
83
+ }).then((e) => {
84
+ typeof e == "function" && (D = e), m.signal.aborted && I();
85
+ }, (e) => {
86
+ d(e), R(1011, "gateway setup failed");
87
+ });
88
+ }, W = (e) => {
89
+ if (m.signal.aborted) return !1;
90
+ let t = e - Date.now();
91
+ return t <= 0 ? (R(n, "credential expired"), !1) : (O = setTimeout(() => {
92
+ W(e);
93
+ }, Math.min(t, 2147483647)), O.unref(), !0);
94
+ }, G = (e, n) => {
95
+ M = "verifying";
96
+ let i = Uint8Array.from(e);
97
+ Promise.resolve().then(() => m.signal.aborted ? null : s.verify(i, {
98
+ signal: m.signal,
99
+ headers: l,
100
+ path: s.path,
101
+ receivedAt: n
102
+ })).then((e) => {
103
+ if (!m.signal.aborted) {
104
+ if (performance.now() >= A) R(1008, "gateway token verification timed out");
105
+ else if (e === null) R(1008, "gateway token rejected");
106
+ else {
107
+ if (!e || !t.is(r)(e.subject) || e.credentialExpiresAt !== void 0 && (!Number.isFinite(e.credentialExpiresAt) || !Number.isSafeInteger(Math.ceil(e.credentialExpiresAt * 1e3)))) throw Error("gateway token verifier returned an invalid SubjectResolution");
108
+ N = e.subject, k !== void 0 && clearTimeout(k), (e.credentialExpiresAt === void 0 || W(e.credentialExpiresAt * 1e3)) && (M = "admitted", U());
109
+ }
110
+ }
111
+ }).catch((e) => {
112
+ m.signal.aborted || (d(e), R(1011, "gateway token verification failed"));
113
+ });
114
+ }, K = () => L(/* @__PURE__ */ Error("gateway disconnected")), q = () => R(1011, "gateway transport failed");
115
+ o.once("close", K), o.once("error", q), yield* e.addFinalizer(() => e.sync(() => {
116
+ L(/* @__PURE__ */ Error("gateway stopped")), j !== void 0 && clearTimeout(j), o.off("close", K), o.off("error", q), o.destroy();
78
117
  }));
79
- let F = (e) => {
80
- if (!f.signal.aborted) {
81
- if (e.byteLength > p) O(1009, "gateway message too large");
118
+ let J = (e) => {
119
+ if (m.signal.aborted) return;
120
+ let t = performance.now();
121
+ if (e.byteLength > h) R(1009, "gateway message too large");
122
+ else {
123
+ if (y !== void 0) {
124
+ if (x = Math.min(b, x + Math.max(0, t - S) * y / 1e3), S = t, x < 1) {
125
+ R(1008, "gateway inbound rate exceeded");
126
+ return;
127
+ }
128
+ x--;
129
+ }
130
+ if (M !== "admitted" && t >= A) R(1008, "gateway token verification timed out");
131
+ else if (M === "waiting") G(e, t);
132
+ else if (M === "verifying") R(1008, "gateway token verification pending");
82
133
  else try {
83
- for (let t of g) t(e);
134
+ for (let n of v) n(e, t);
84
135
  } catch (e) {
85
- l(e), O(1011, "gateway message handler failed");
86
- }
87
- }
88
- }, I = e.sync(() => {
89
- if (w = !0, c !== void 0) {
90
- let e = c - Date.now();
91
- if (e <= 0) {
92
- O(t, "credential expired");
93
- return;
136
+ d(e), R(1011, "gateway message handler failed");
94
137
  }
95
- S = setTimeout(() => O(t, "credential expired"), e), S.unref();
96
138
  }
97
- Promise.resolve().then(() => {
98
- if (!f.signal.aborted) return a.onConnection(M);
99
- }).then((e) => {
100
- typeof e == "function" && (x = e), f.signal.aborted && E();
101
- }, (e) => {
102
- l(e), O(1011, "gateway setup failed");
103
- });
139
+ }, Y = e.sync(() => {
140
+ if (P = !0, s.auth === "token") {
141
+ let e = s.verificationTimeoutMs ?? 5e3;
142
+ A = performance.now() + e, k = setTimeout(() => R(1008, "gateway token verification timed out"), e), k.unref();
143
+ } else (u === void 0 || W(u)) && U();
104
144
  });
105
145
  yield* e.gen(function* () {
106
- let e = yield* r.reader;
107
- for (yield* I;;) {
146
+ let e = yield* a.reader;
147
+ for (yield* Y;;) {
108
148
  let t = yield* e.pull;
109
- for (let e of t) F(typeof e == "string" ? new TextEncoder().encode(e) : e);
149
+ for (let e of t) J(typeof e == "string" ? new TextEncoder().encode(e) : e);
110
150
  }
111
151
  }).pipe(e.ignore);
112
152
  }));
113
153
  //#endregion
114
- export { r as runWebSocketGateway };
154
+ export { a as runWebSocketGateway };
@@ -4,8 +4,8 @@ import { makeEffectStoreLayer as r } from "./effectStore.js";
4
4
  import { Cause as i, Effect as a, Exit as o, Layer as s, Option as c, Schema as l, SchemaIssue as u } from "effect";
5
5
  import { SubjectService as d, WorkflowControlResultSchema as f, WorkflowQueuedCancellationResultSchema as p, WorkflowRestartCommandSchema as m, WorkflowRestartObservationSchema as h, WorkflowRestartResultSchema as g, WorkflowRestartTargetSchema as _, WorkflowRetryCommandSchema as v, WorkflowRetryObservationSchema as y, WorkflowRetryTargetSchema as b } from "@voltro/protocol";
6
6
  import { createLogger as x } from "@voltro/logger";
7
- import * as S from "effect/SchemaAST";
8
- import { executePreparedWorkflow as C, getCurrentWorkflowExecutionId as w, hasPreparedWorkflowExecution as T } from "@voltro/workflow";
7
+ import { executePreparedWorkflow as S, getCurrentWorkflowExecutionId as C, hasPreparedWorkflowExecution as w } from "@voltro/workflow";
8
+ import * as T from "effect/SchemaAST";
9
9
  //#region src/workflowRuntime.ts
10
10
  var E = class extends l.TaggedError()("WorkflowStartNotExecuted", {
11
11
  workflowName: l.String,
@@ -135,9 +135,9 @@ var E = class extends l.TaggedError()("WorkflowStartNotExecuted", {
135
135
  }
136
136
  }, H = (e, t) => {
137
137
  let n = e.ast, r = [], i = [];
138
- return S.isObjects(n) && n.propertySignatures.forEach((e) => {
138
+ return T.isObjects(n) && n.propertySignatures.forEach((e) => {
139
139
  let n = e.name;
140
- typeof n == "string" && (S.isOptional(e.type) ? t && i.push(n) : r.push(n));
140
+ typeof n == "string" && (T.isOptional(e.type) ? t && i.push(n) : r.push(n));
141
141
  }), {
142
142
  required: r,
143
143
  optional: i
@@ -151,7 +151,7 @@ var E = class extends l.TaggedError()("WorkflowStartNotExecuted", {
151
151
  }
152
152
  return n;
153
153
  }, i = (e, t, n = e.payloadSchema) => {
154
- let r = l.decodeUnknownResult(l.make(S.toType(n.ast)))(t);
154
+ let r = l.decodeUnknownResult(l.make(T.toType(n.ast)))(t);
155
155
  if (r._tag === "Success") return;
156
156
  let i = new Set(typeof t == "object" && t ? Object.keys(t) : []), a = W(n).filter((e) => !i.has(e));
157
157
  throw new V(e.name, a, u.makeFormatterDefault()(r.failure.issue));
@@ -161,7 +161,7 @@ var E = class extends l.TaggedError()("WorkflowStartNotExecuted", {
161
161
  }, d = async (t, n) => {
162
162
  let i = r(t);
163
163
  return z(t, n, c.getOrUndefined(await e.runEffect(i.poll(n))));
164
- }, x = async () => e.runEffect(w()), L = async (t, n, r) => {
164
+ }, x = async () => e.runEffect(C()), L = async (t, n, r) => {
165
165
  if (e.resolveQueuedStart === void 0) throw Error(`Workflow '${t}' remains queued under receipt '${n}'; no receipt resolver is configured`);
166
166
  let i = await e.resolveQueuedStart({
167
167
  workflowName: t,
@@ -353,9 +353,9 @@ var E = class extends l.TaggedError()("WorkflowStartNotExecuted", {
353
353
  }
354
354
  let m;
355
355
  (e.rememberStartContext !== void 0 || i?.callerContext !== void 0) && (m = c ?? await e.runEffect(u.executionId(p)), await e.rememberStartContext?.(t, m, i?.callerContext ?? { subject: n }));
356
- let h = c ?? (m !== void 0 && T(u) ? m : void 0);
357
- if (d) return h === void 0 ? await e.runEffect(u.execute(p)) : await e.runEffect(C(u, p, h, { discard: !1 })), e.onEnqueue?.(), M(t, h ?? await e.runEffect(u.executionId(p)), "succeeded");
358
- let g = await e.runEffect(h === void 0 ? u.execute(p, { discard: !0 }) : C(u, p, h));
356
+ let h = c ?? (m !== void 0 && w(u) ? m : void 0);
357
+ if (d) return h === void 0 ? await e.runEffect(u.execute(p)) : await e.runEffect(S(u, p, h, { discard: !1 })), e.onEnqueue?.(), M(t, h ?? await e.runEffect(u.executionId(p)), "succeeded");
358
+ let g = await e.runEffect(h === void 0 ? u.execute(p, { discard: !0 }) : S(u, p, h));
359
359
  return e.onEnqueue?.(), M(t, g, "running");
360
360
  };
361
361
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voltro/runtime",
3
- "version": "0.86.0",
3
+ "version": "0.87.0",
4
4
  "description": "The Voltro server runtime — AppContext assembly, the dispatcher, handler layers, API keys, coordinated scheduling, and analytics composition.",
5
5
  "keywords": [
6
6
  "voltro",
@@ -18,11 +18,21 @@
18
18
  },
19
19
  "type": "module",
20
20
  "exports": {
21
+ "./hot": {
22
+ "types": "./dist/hot.d.ts",
23
+ "import": "./dist/hot.js",
24
+ "default": "./dist/hot.js"
25
+ },
21
26
  ".": {
22
27
  "types": "./dist/index.d.ts",
23
28
  "import": "./dist/index.js",
24
29
  "default": "./dist/index.js"
25
30
  },
31
+ "./http-range": {
32
+ "types": "./dist/http-range.d.ts",
33
+ "import": "./dist/http-range.js",
34
+ "default": "./dist/http-range.js"
35
+ },
26
36
  "./package.json": "./package.json"
27
37
  },
28
38
  "main": "./dist/index.js",
@@ -34,6 +44,7 @@
34
44
  },
35
45
  "dependencies": {
36
46
  "@effect/platform-node": "4.0.1",
47
+ "@effect/platform-node-shared": "4.0.1",
37
48
  "@opentelemetry/api": "^1.9.1",
38
49
  "@opentelemetry/exporter-metrics-otlp-http": "^0.222.0",
39
50
  "@opentelemetry/exporter-trace-otlp-http": "^0.222.0",
@@ -42,12 +53,13 @@
42
53
  "@opentelemetry/sdk-trace-base": "^2.11.0",
43
54
  "@opentelemetry/sdk-trace-node": "^2.11.0",
44
55
  "@opentelemetry/semantic-conventions": "^1.43.0",
45
- "@voltro/database": "0.86.0",
46
- "@voltro/kv": "0.86.0",
47
- "@voltro/local-first": "0.86.0",
48
- "@voltro/logger": "0.86.0",
49
- "@voltro/protocol": "0.86.0",
50
- "@voltro/workflow": "0.86.0",
56
+ "@voltro/database": "0.87.0",
57
+ "@voltro/kv": "0.87.0",
58
+ "@voltro/local-first": "0.87.0",
59
+ "@voltro/logger": "0.87.0",
60
+ "@voltro/protocol": "0.87.0",
61
+ "@voltro/shared": "0.87.0",
62
+ "@voltro/workflow": "0.87.0",
51
63
  "ioredis": "^5.11.1"
52
64
  },
53
65
  "peerDependencies": {