rivetkit 2.3.0-rc.9 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/client.d.ts +511 -62
- package/dist/browser/client.js +230 -174
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/inspector/client.js +53 -23
- package/dist/browser/inspector/client.js.map +1 -1
- package/dist/tsup/actor/errors.cjs +4 -2
- package/dist/tsup/actor/errors.cjs.map +1 -1
- package/dist/tsup/actor/errors.d.cts +1 -1
- package/dist/tsup/actor/errors.d.ts +1 -1
- package/dist/tsup/actor/errors.js +3 -1
- package/dist/tsup/agent-os/index.cjs +2163 -2087
- package/dist/tsup/agent-os/index.cjs.map +1 -1
- package/dist/tsup/agent-os/index.d.cts +509 -69
- package/dist/tsup/agent-os/index.d.ts +509 -69
- package/dist/tsup/agent-os/index.js +2163 -2087
- package/dist/tsup/agent-os/index.js.map +1 -1
- package/dist/tsup/{chunk-WQ4HNA4W.cjs → chunk-3MHDOUD7.cjs} +73 -3
- package/dist/tsup/chunk-3MHDOUD7.cjs.map +1 -0
- package/dist/tsup/{chunk-QAZLM4WT.cjs → chunk-4FC7TVS6.cjs} +8 -4
- package/dist/tsup/chunk-4FC7TVS6.cjs.map +1 -0
- package/dist/tsup/{chunk-4CGA6QJO.cjs → chunk-4UUEB43Y.cjs} +24 -9
- package/dist/tsup/chunk-4UUEB43Y.cjs.map +1 -0
- package/dist/tsup/{chunk-GVTOE34S.cjs → chunk-5IWLUJ6W.cjs} +222 -235
- package/dist/tsup/chunk-5IWLUJ6W.cjs.map +1 -0
- package/dist/tsup/{chunk-MMMEZM5J.js → chunk-H6VVZMWN.js} +4 -4
- package/dist/tsup/chunk-H6VVZMWN.js.map +1 -0
- package/dist/tsup/{chunk-3YY5S6TV.js → chunk-HXUEHHJF.js} +2 -2
- package/dist/tsup/chunk-HXUEHHJF.js.map +1 -0
- package/dist/tsup/{chunk-H7P7WR2Y.js → chunk-I35VSLEM.js} +6 -6
- package/dist/tsup/chunk-I35VSLEM.js.map +1 -0
- package/dist/tsup/{chunk-H37XQU3I.js → chunk-JBUZRPY5.js} +2 -2
- package/dist/tsup/{chunk-CPA4Y3RG.cjs → chunk-JLJJZYCJ.cjs} +10 -10
- package/dist/tsup/chunk-JLJJZYCJ.cjs.map +1 -0
- package/dist/tsup/{chunk-PCBNKI2J.js → chunk-JZ7TWV65.js} +1 -1
- package/dist/tsup/chunk-JZ7TWV65.js.map +1 -0
- package/dist/tsup/{chunk-VRCIXJRN.js → chunk-L2X3YFER.js} +64 -10
- package/dist/tsup/chunk-L2X3YFER.js.map +1 -0
- package/dist/tsup/{chunk-Y5NSCZA2.cjs → chunk-MNHKOS6L.cjs} +72 -18
- package/dist/tsup/chunk-MNHKOS6L.cjs.map +1 -0
- package/dist/tsup/{chunk-KJTA3ATT.js → chunk-NERUIBOT.js} +22 -7
- package/dist/tsup/chunk-NERUIBOT.js.map +1 -0
- package/dist/tsup/{chunk-4WPEZBK4.cjs → chunk-OST76LRW.cjs} +10 -10
- package/dist/tsup/chunk-OST76LRW.cjs.map +1 -0
- package/dist/tsup/{chunk-MALSPBAF.cjs → chunk-OZBCXBVP.cjs} +3 -3
- package/dist/tsup/{chunk-MALSPBAF.cjs.map → chunk-OZBCXBVP.cjs.map} +1 -1
- package/dist/tsup/{chunk-F3Q5BFQ6.js → chunk-PT6OIW5E.js} +66 -79
- package/dist/tsup/chunk-PT6OIW5E.js.map +1 -0
- package/dist/tsup/{chunk-W7EYSYVI.js → chunk-R6KPN5EW.js} +134 -20
- package/dist/tsup/chunk-R6KPN5EW.js.map +1 -0
- package/dist/tsup/{chunk-VJFRBJVQ.cjs → chunk-V5KMAMX3.cjs} +138 -24
- package/dist/tsup/chunk-V5KMAMX3.cjs.map +1 -0
- package/dist/tsup/{chunk-LD5YASJU.cjs → chunk-VE2X4KMG.cjs} +2 -2
- package/dist/tsup/{chunk-LD5YASJU.cjs.map → chunk-VE2X4KMG.cjs.map} +1 -1
- package/dist/tsup/{chunk-T6YVRM4K.js → chunk-XIX5DOZN.js} +72 -2
- package/dist/tsup/chunk-XIX5DOZN.js.map +1 -0
- package/dist/tsup/{chunk-2NDZ7JCR.cjs → chunk-ZA7FLHKH.cjs} +1 -1
- package/dist/tsup/chunk-ZA7FLHKH.cjs.map +1 -0
- package/dist/tsup/{chunk-KIWH5H3K.js → chunk-ZZ3WBRPD.js} +7 -3
- package/dist/tsup/chunk-ZZ3WBRPD.js.map +1 -0
- package/dist/tsup/client/mod.cjs +9 -9
- package/dist/tsup/client/mod.d.cts +5 -5
- package/dist/tsup/client/mod.d.ts +5 -5
- package/dist/tsup/client/mod.js +8 -8
- package/dist/tsup/common/log.cjs +3 -3
- package/dist/tsup/common/log.js +2 -2
- package/dist/tsup/common/websocket.cjs +4 -4
- package/dist/tsup/common/websocket.js +3 -3
- package/dist/tsup/{config-Ca8dN4cS.d.cts → config-CzvopP5m.d.cts} +544 -23
- package/dist/tsup/{config-CxjGYf4K.d.cts → config-D49x8NpL.d.cts} +1 -2
- package/dist/tsup/{config-CxjGYf4K.d.ts → config-D49x8NpL.d.ts} +1 -2
- package/dist/tsup/{config-0Ta55UV0.d.ts → config-DZuT7tcp.d.ts} +544 -23
- package/dist/tsup/context-CyAdY-aA.d.ts +128 -0
- package/dist/tsup/context-sNB28g0N.d.cts +128 -0
- package/dist/tsup/db/drizzle.cjs +3 -3
- package/dist/tsup/db/drizzle.d.cts +1 -1
- package/dist/tsup/db/drizzle.d.ts +1 -1
- package/dist/tsup/db/drizzle.js +1 -1
- package/dist/tsup/db/mod.cjs +2 -2
- package/dist/tsup/db/mod.d.cts +2 -2
- package/dist/tsup/db/mod.d.ts +2 -2
- package/dist/tsup/db/mod.js +1 -1
- package/dist/tsup/dynamic/mod.cjs +24 -0
- package/dist/tsup/dynamic/mod.cjs.map +1 -0
- package/dist/tsup/dynamic/mod.d.cts +37 -0
- package/dist/tsup/dynamic/mod.d.ts +37 -0
- package/dist/tsup/dynamic/mod.js +24 -0
- package/dist/tsup/dynamic/mod.js.map +1 -0
- package/dist/tsup/inspector/mod.cjs +6 -6
- package/dist/tsup/inspector/mod.js +5 -5
- package/dist/tsup/inspector-tab/mod.cjs +173 -0
- package/dist/tsup/inspector-tab/mod.cjs.map +1 -0
- package/dist/tsup/inspector-tab/mod.d.cts +250 -0
- package/dist/tsup/inspector-tab/mod.d.ts +250 -0
- package/dist/tsup/inspector-tab/mod.js +173 -0
- package/dist/tsup/inspector-tab/mod.js.map +1 -0
- package/dist/tsup/mod.cjs +758 -348
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +5 -5
- package/dist/tsup/mod.d.ts +5 -5
- package/dist/tsup/mod.js +662 -252
- package/dist/tsup/mod.js.map +1 -1
- package/dist/tsup/test/mod.cjs +21 -18
- package/dist/tsup/test/mod.cjs.map +1 -1
- package/dist/tsup/test/mod.d.cts +4 -4
- package/dist/tsup/test/mod.d.ts +4 -4
- package/dist/tsup/test/mod.js +18 -15
- package/dist/tsup/test/mod.js.map +1 -1
- package/dist/tsup/{utils-DVekpm4I.d.cts → utils-CqDnC_PS.d.cts} +2 -1
- package/dist/tsup/{utils-DVekpm4I.d.ts → utils-CqDnC_PS.d.ts} +2 -1
- package/dist/tsup/utils.cjs +3 -3
- package/dist/tsup/utils.d.cts +1 -1
- package/dist/tsup/utils.d.ts +1 -1
- package/dist/tsup/utils.js +2 -2
- package/dist/tsup/workflow/mod.cjs +383 -322
- package/dist/tsup/workflow/mod.cjs.map +1 -1
- package/dist/tsup/workflow/mod.d.cts +8 -8
- package/dist/tsup/workflow/mod.d.ts +8 -8
- package/dist/tsup/workflow/mod.js +360 -299
- package/dist/tsup/workflow/mod.js.map +1 -1
- package/package.json +35 -14
- package/src/actor/config.ts +173 -51
- package/src/actor/contexts/index.ts +7 -2
- package/src/actor/definition.ts +17 -19
- package/src/actor/driver.ts +3 -3
- package/src/actor/errors.ts +20 -3
- package/src/actor/instance/mod.ts +26 -34
- package/src/actor/keys.ts +1 -1
- package/src/actor/mod.ts +22 -20
- package/src/actor/schema.ts +2 -2
- package/src/agent-os/actor/index.ts +38 -18
- package/src/agent-os/actor/preview.ts +1 -2
- package/src/agent-os/actor/session.ts +2 -2
- package/src/agent-os/config.ts +1 -1
- package/src/agent-os/fs/database-vfs.ts +1 -1
- package/src/agent-os/index.ts +16 -15
- package/src/client/actor-common.ts +87 -54
- package/src/client/actor-conn.ts +8 -36
- package/src/client/actor-handle.ts +69 -51
- package/src/client/actor-query.ts +5 -5
- package/src/client/errors.ts +1 -1
- package/src/client/lifecycle-errors.ts +2 -4
- package/src/client/query.ts +1 -1
- package/src/client/queue.ts +8 -3
- package/src/client/raw-utils.ts +8 -6
- package/src/client/resolve-gateway-target.ts +1 -1
- package/src/client/utils.ts +2 -7
- package/src/common/actor-websocket.ts +3 -1
- package/src/common/bare/actor-persist/v1.ts +205 -163
- package/src/common/bare/actor-persist/v2.ts +265 -213
- package/src/common/bare/actor-persist/v3.ts +176 -172
- package/src/common/bare/actor-persist/v4.ts +254 -253
- package/src/common/bare/transport/v1.ts +659 -543
- package/src/common/client-protocol-versioned.ts +66 -64
- package/src/common/database/config.ts +2 -8
- package/src/common/database/native-database.ts +1 -1
- package/src/common/database/shared.ts +1 -0
- package/src/common/encoding.ts +250 -16
- package/src/common/engine.ts +28 -1
- package/src/common/eventsource.ts +1 -1
- package/src/common/inline-websocket-adapter.ts +14 -13
- package/src/common/log.ts +1 -0
- package/src/common/router.ts +13 -17
- package/src/common/utils.ts +1 -150
- package/src/common/websocket-interface.ts +1 -1
- package/src/db/mod.ts +1 -1
- package/src/devtools-loader/index.ts +4 -7
- package/src/devtools-loader/serve-devtools.ts +26 -0
- package/src/drivers/engine/actor-driver.ts +58 -56
- package/src/dynamic/instance.ts +32 -0
- package/src/dynamic/internal.ts +50 -0
- package/src/dynamic/isolate-runtime.ts +66 -0
- package/src/dynamic/mod.ts +32 -0
- package/src/engine-client/actor-http-client.ts +3 -3
- package/src/engine-client/actor-websocket-client.ts +6 -5
- package/src/engine-client/api-endpoints.ts +51 -2
- package/src/engine-client/api-utils.ts +2 -2
- package/src/engine-client/driver.ts +1 -1
- package/src/engine-client/mod.ts +6 -3
- package/src/engine-client/ws-proxy.ts +9 -4
- package/src/inspector/client.browser.ts +5 -11
- package/src/inspector/mod.ts +1 -3
- package/src/inspector-tab/mod.ts +315 -0
- package/src/registry/config/envoy.ts +1 -2
- package/src/registry/config/index.ts +40 -16
- package/src/registry/index.ts +209 -73
- package/src/registry/napi-runtime.ts +29 -2
- package/src/registry/native-validation.ts +10 -12
- package/src/registry/native.ts +433 -198
- package/src/registry/process-metrics.ts +250 -0
- package/src/registry/runtime.ts +52 -1
- package/src/registry/wasm-runtime.ts +29 -2
- package/src/registry/write-through-proxy.ts +40 -0
- package/src/serde.ts +2 -2
- package/src/serverless/configure.ts +18 -7
- package/src/test/mod.ts +11 -8
- package/src/utils/endpoint-parser.ts +1 -1
- package/src/utils/env-vars.ts +37 -0
- package/src/utils/router.ts +1 -1
- package/src/utils.ts +1 -2
- package/src/workflow/context.ts +699 -240
- package/src/workflow/driver.ts +23 -12
- package/src/workflow/inspector.ts +4 -3
- package/src/workflow/mod.ts +37 -23
- package/dist/tsup/chunk-2NDZ7JCR.cjs.map +0 -1
- package/dist/tsup/chunk-3YY5S6TV.js.map +0 -1
- package/dist/tsup/chunk-4CGA6QJO.cjs.map +0 -1
- package/dist/tsup/chunk-4WPEZBK4.cjs.map +0 -1
- package/dist/tsup/chunk-CPA4Y3RG.cjs.map +0 -1
- package/dist/tsup/chunk-F3Q5BFQ6.js.map +0 -1
- package/dist/tsup/chunk-GVTOE34S.cjs.map +0 -1
- package/dist/tsup/chunk-H7P7WR2Y.js.map +0 -1
- package/dist/tsup/chunk-KIWH5H3K.js.map +0 -1
- package/dist/tsup/chunk-KJTA3ATT.js.map +0 -1
- package/dist/tsup/chunk-MMMEZM5J.js.map +0 -1
- package/dist/tsup/chunk-PCBNKI2J.js.map +0 -1
- package/dist/tsup/chunk-QAZLM4WT.cjs.map +0 -1
- package/dist/tsup/chunk-T6YVRM4K.js.map +0 -1
- package/dist/tsup/chunk-VJFRBJVQ.cjs.map +0 -1
- package/dist/tsup/chunk-VRCIXJRN.js.map +0 -1
- package/dist/tsup/chunk-W7EYSYVI.js.map +0 -1
- package/dist/tsup/chunk-WQ4HNA4W.cjs.map +0 -1
- package/dist/tsup/chunk-Y5NSCZA2.cjs.map +0 -1
- package/dist/tsup/context-B_IWbWne.d.ts +0 -92
- package/dist/tsup/context-CUrQ9MHc.d.cts +0 -92
- package/src/utils/serve.ts +0 -217
- /package/dist/tsup/{chunk-H37XQU3I.js.map → chunk-JBUZRPY5.js.map} +0 -0
|
@@ -1,22 +1,24 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } var _class; var _class2;
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } async function _asyncNullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return await rhsFn(); } } var _class; var _class2;
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkJLJJZYCJcjs = require('../chunk-JLJJZYCJ.cjs');
|
|
4
|
+
require('../chunk-4UUEB43Y.cjs');
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
|
|
7
|
-
var _chunkWQ4HNA4Wcjs = require('../chunk-WQ4HNA4W.cjs');
|
|
8
|
-
require('../chunk-4CGA6QJO.cjs');
|
|
9
8
|
|
|
9
|
+
var _chunk3MHDOUD7cjs = require('../chunk-3MHDOUD7.cjs');
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
var _chunkLD5YASJUcjs = require('../chunk-LD5YASJU.cjs');
|
|
13
|
-
require('../chunk-VJFRBJVQ.cjs');
|
|
14
12
|
|
|
13
|
+
var _chunkVE2X4KMGcjs = require('../chunk-VE2X4KMG.cjs');
|
|
14
|
+
require('../chunk-V5KMAMX3.cjs');
|
|
15
15
|
|
|
16
|
-
var _chunkY5NSCZA2cjs = require('../chunk-Y5NSCZA2.cjs');
|
|
17
16
|
|
|
17
|
+
var _chunkMNHKOS6Lcjs = require('../chunk-MNHKOS6L.cjs');
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
var _chunk4FC7TVS6cjs = require('../chunk-4FC7TVS6.cjs');
|
|
20
22
|
|
|
21
23
|
// src/workflow/mod.ts
|
|
22
24
|
|
|
@@ -33,8 +35,345 @@ var _chunkQAZLM4WTcjs = require('../chunk-QAZLM4WT.cjs');
|
|
|
33
35
|
var _workflowengine = require('@rivetkit/workflow-engine');
|
|
34
36
|
var _invariant = require('invariant'); var _invariant2 = _interopRequireDefault(_invariant);
|
|
35
37
|
|
|
38
|
+
// src/workflow/constants.ts
|
|
39
|
+
var WORKFLOW_GUARD_KV_KEY = "__rivet_actor_workflow_guard_triggered";
|
|
40
|
+
|
|
41
|
+
// src/workflow/context.ts
|
|
42
|
+
var DEACTIVATE_STEP = /* @__PURE__ */ Symbol("workflow.step.deactivate");
|
|
43
|
+
var WorkflowStepContext = class {
|
|
44
|
+
#runCtx;
|
|
45
|
+
#active = true;
|
|
46
|
+
#onGuardViolation;
|
|
47
|
+
constructor(runCtx, onGuardViolation) {
|
|
48
|
+
this.#runCtx = runCtx;
|
|
49
|
+
this.#onGuardViolation = onGuardViolation;
|
|
50
|
+
}
|
|
51
|
+
[DEACTIVATE_STEP]() {
|
|
52
|
+
this.#active = false;
|
|
53
|
+
}
|
|
54
|
+
#ensureActive(feature) {
|
|
55
|
+
if (!this.#active) {
|
|
56
|
+
this.#onGuardViolation();
|
|
57
|
+
throw new Error(
|
|
58
|
+
`${feature} is only available inside workflow steps`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
get actorId() {
|
|
63
|
+
return this.#runCtx.actorId;
|
|
64
|
+
}
|
|
65
|
+
get name() {
|
|
66
|
+
return this.#runCtx.name;
|
|
67
|
+
}
|
|
68
|
+
get key() {
|
|
69
|
+
return this.#runCtx.key;
|
|
70
|
+
}
|
|
71
|
+
get log() {
|
|
72
|
+
return this.#runCtx.log;
|
|
73
|
+
}
|
|
74
|
+
get abortSignal() {
|
|
75
|
+
return this.#runCtx.abortSignal;
|
|
76
|
+
}
|
|
77
|
+
get state() {
|
|
78
|
+
this.#ensureActive("state");
|
|
79
|
+
return this.#runCtx.state;
|
|
80
|
+
}
|
|
81
|
+
get vars() {
|
|
82
|
+
this.#ensureActive("vars");
|
|
83
|
+
return this.#runCtx.vars;
|
|
84
|
+
}
|
|
85
|
+
get db() {
|
|
86
|
+
this.#ensureActive("db");
|
|
87
|
+
return this.#runCtx.db;
|
|
88
|
+
}
|
|
89
|
+
client() {
|
|
90
|
+
this.#ensureActive("client");
|
|
91
|
+
return this.#runCtx.client();
|
|
92
|
+
}
|
|
93
|
+
broadcast(name, ...args) {
|
|
94
|
+
this.#ensureActive("broadcast");
|
|
95
|
+
this.#runCtx.broadcast(
|
|
96
|
+
name,
|
|
97
|
+
...args
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
get queue() {
|
|
101
|
+
const self = this;
|
|
102
|
+
async function send(name, body) {
|
|
103
|
+
self.#ensureActive("queue.send");
|
|
104
|
+
await self.#runCtx.queue.send(name, body);
|
|
105
|
+
}
|
|
106
|
+
return { send };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Holds the actor awake for the duration of the provided promise. The actor
|
|
110
|
+
* cannot idle-sleep or finalize the sleep grace period until the promise
|
|
111
|
+
* settles.
|
|
112
|
+
*/
|
|
113
|
+
keepAwake(promise) {
|
|
114
|
+
this.#ensureActive("keepAwake");
|
|
115
|
+
return this.#runCtx.keepAwake(promise);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Registers a promise that the sleep grace period will wait on. Use this for
|
|
119
|
+
* best-effort flush/cleanup work that may complete inside the grace window.
|
|
120
|
+
*/
|
|
121
|
+
waitUntil(promise) {
|
|
122
|
+
this.#ensureActive("waitUntil");
|
|
123
|
+
this.#runCtx.waitUntil(promise);
|
|
124
|
+
}
|
|
125
|
+
destroy() {
|
|
126
|
+
this.#ensureActive("destroy");
|
|
127
|
+
this.#runCtx.destroy();
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
var WorkflowContext = class _WorkflowContext {
|
|
131
|
+
#inner;
|
|
132
|
+
#runCtx;
|
|
133
|
+
constructor(inner, runCtx) {
|
|
134
|
+
this.#inner = inner;
|
|
135
|
+
this.#runCtx = runCtx;
|
|
136
|
+
}
|
|
137
|
+
get workflowId() {
|
|
138
|
+
return this.#inner.workflowId;
|
|
139
|
+
}
|
|
140
|
+
get abortSignal() {
|
|
141
|
+
return this.#inner.abortSignal;
|
|
142
|
+
}
|
|
143
|
+
get actorId() {
|
|
144
|
+
return this.#runCtx.actorId;
|
|
145
|
+
}
|
|
146
|
+
get name() {
|
|
147
|
+
return this.#runCtx.name;
|
|
148
|
+
}
|
|
149
|
+
get key() {
|
|
150
|
+
return this.#runCtx.key;
|
|
151
|
+
}
|
|
152
|
+
get log() {
|
|
153
|
+
return this.#runCtx.log;
|
|
154
|
+
}
|
|
155
|
+
get queue() {
|
|
156
|
+
const self = this;
|
|
157
|
+
async function next(name, opts) {
|
|
158
|
+
const message = await self.#inner.queue.next(name, opts);
|
|
159
|
+
return self.#toActorQueueMessage(message);
|
|
160
|
+
}
|
|
161
|
+
async function nextBatch(name, opts) {
|
|
162
|
+
const messages = await self.#inner.queue.nextBatch(name, opts);
|
|
163
|
+
return messages.map(
|
|
164
|
+
(message) => self.#toActorQueueMessage(message)
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
next,
|
|
169
|
+
nextBatch
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
async step(nameOrConfig, run) {
|
|
173
|
+
if (typeof nameOrConfig === "string") {
|
|
174
|
+
if (!run) {
|
|
175
|
+
throw new Error("Step run function missing");
|
|
176
|
+
}
|
|
177
|
+
const stepRun = run;
|
|
178
|
+
return await this.#wrapActive(
|
|
179
|
+
() => this.#inner.step(nameOrConfig, () => this.#runStep(stepRun))
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
const stepConfig = nameOrConfig;
|
|
183
|
+
const rollback = stepConfig.rollback;
|
|
184
|
+
const config = {
|
|
185
|
+
...stepConfig,
|
|
186
|
+
run: () => this.#runStep(stepConfig.run),
|
|
187
|
+
rollback: rollback ? (_ctx, output) => this.#runRollback(rollback, output) : void 0
|
|
188
|
+
};
|
|
189
|
+
return await this.#wrapActive(() => this.#inner.step(config));
|
|
190
|
+
}
|
|
191
|
+
async tryStep(nameOrConfig, run) {
|
|
192
|
+
if (typeof nameOrConfig === "string") {
|
|
193
|
+
if (!run) {
|
|
194
|
+
throw new Error("Step run function missing");
|
|
195
|
+
}
|
|
196
|
+
const stepRun = run;
|
|
197
|
+
return await this.#wrapActive(
|
|
198
|
+
() => this.#inner.tryStep(nameOrConfig, () => this.#runStep(stepRun))
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
const stepConfig = nameOrConfig;
|
|
202
|
+
const rollback = stepConfig.rollback;
|
|
203
|
+
const config = {
|
|
204
|
+
...stepConfig,
|
|
205
|
+
run: () => this.#runStep(stepConfig.run),
|
|
206
|
+
rollback: rollback ? (_ctx, output) => this.#runRollback(rollback, output) : void 0
|
|
207
|
+
};
|
|
208
|
+
return await this.#wrapActive(() => this.#inner.tryStep(config));
|
|
209
|
+
}
|
|
210
|
+
async try(nameOrConfig, run) {
|
|
211
|
+
if (typeof nameOrConfig === "string") {
|
|
212
|
+
if (!run) {
|
|
213
|
+
throw new Error("Try run function missing");
|
|
214
|
+
}
|
|
215
|
+
const tryRun = run;
|
|
216
|
+
return await this.#wrapActive(
|
|
217
|
+
() => this.#inner.try(
|
|
218
|
+
nameOrConfig,
|
|
219
|
+
async (ctx) => tryRun(this.#createChildContext(ctx))
|
|
220
|
+
)
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
const tryConfig = nameOrConfig;
|
|
224
|
+
const config = {
|
|
225
|
+
...tryConfig,
|
|
226
|
+
run: async (ctx) => tryConfig.run(this.#createChildContext(ctx))
|
|
227
|
+
};
|
|
228
|
+
return await this.#wrapActive(() => this.#inner.try(config));
|
|
229
|
+
}
|
|
230
|
+
async loop(nameOrConfig, run) {
|
|
231
|
+
if (typeof nameOrConfig === "string") {
|
|
232
|
+
if (!run) {
|
|
233
|
+
throw new Error("Loop run function missing");
|
|
234
|
+
}
|
|
235
|
+
const loopRun = run;
|
|
236
|
+
return await this.#wrapActive(
|
|
237
|
+
() => this.#inner.loop(
|
|
238
|
+
nameOrConfig,
|
|
239
|
+
// A void return (no explicit Loop result) is undefined at
|
|
240
|
+
// runtime, which the engine treats as continue.
|
|
241
|
+
async (ctx) => await _asyncNullishCoalesce(await loopRun(this.#createChildContext(ctx)), async () => ( void 0))
|
|
242
|
+
)
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
const loopConfig = nameOrConfig;
|
|
246
|
+
const wrapped = {
|
|
247
|
+
...loopConfig,
|
|
248
|
+
run: (async (ctx, state) => await _asyncNullishCoalesce(await loopConfig.run(this.#createChildContext(ctx), state), async () => ( void 0)))
|
|
249
|
+
};
|
|
250
|
+
return await this.#wrapActive(() => this.#inner.loop(wrapped));
|
|
251
|
+
}
|
|
252
|
+
sleep(name, durationMs) {
|
|
253
|
+
return this.#inner.sleep(name, durationMs);
|
|
254
|
+
}
|
|
255
|
+
sleepUntil(name, timestampMs) {
|
|
256
|
+
return this.#inner.sleepUntil(name, timestampMs);
|
|
257
|
+
}
|
|
258
|
+
async rollbackCheckpoint(name) {
|
|
259
|
+
await this.#wrapActive(() => this.#inner.rollbackCheckpoint(name));
|
|
260
|
+
}
|
|
261
|
+
async join(name, branches) {
|
|
262
|
+
const wrappedBranches = Object.fromEntries(
|
|
263
|
+
Object.entries(branches).map(([key, branch]) => [
|
|
264
|
+
key,
|
|
265
|
+
{
|
|
266
|
+
run: async (ctx) => branch.run(this.#createChildContext(ctx))
|
|
267
|
+
}
|
|
268
|
+
])
|
|
269
|
+
);
|
|
270
|
+
return await this.#wrapActive(
|
|
271
|
+
() => this.#inner.join(name, wrappedBranches)
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
async race(name, branches) {
|
|
275
|
+
const wrappedBranches = branches.map((branch) => ({
|
|
276
|
+
name: branch.name,
|
|
277
|
+
run: (ctx) => branch.run(this.#createChildContext(ctx))
|
|
278
|
+
}));
|
|
279
|
+
return await this.#wrapActive(
|
|
280
|
+
() => this.#inner.race(name, wrappedBranches)
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
async removed(name, originalType) {
|
|
284
|
+
await this.#wrapActive(() => this.#inner.removed(name, originalType));
|
|
285
|
+
}
|
|
286
|
+
isEvicted() {
|
|
287
|
+
return this.#inner.isEvicted();
|
|
288
|
+
}
|
|
289
|
+
// Runs a user step body inside a fresh step context, snapshotting actor
|
|
290
|
+
// state/vars so a thrown step rolls back its mutations, and deactivating the
|
|
291
|
+
// step context once the body settles so it cannot be used after the step.
|
|
292
|
+
async #runStep(run) {
|
|
293
|
+
const stepCtx = new WorkflowStepContext(this.#runCtx, () => this.#markGuardTriggered());
|
|
294
|
+
let stateSnapshot = null;
|
|
295
|
+
try {
|
|
296
|
+
stateSnapshot = { state: this.#runCtx[_chunk3MHDOUD7cjs.RAW_STATE_SYMBOL]() };
|
|
297
|
+
} catch (error) {
|
|
298
|
+
this.#runCtx.log.debug({
|
|
299
|
+
msg: "failed to get state, likely due to being stateless workflow",
|
|
300
|
+
error
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
if (stateSnapshot) {
|
|
304
|
+
stateSnapshot.state = structuredClone(stateSnapshot.state);
|
|
305
|
+
}
|
|
306
|
+
const varsSnapshot = structuredClone(this.#runCtx.vars);
|
|
307
|
+
try {
|
|
308
|
+
return await run(stepCtx);
|
|
309
|
+
} catch (error) {
|
|
310
|
+
if (stateSnapshot) {
|
|
311
|
+
this.#runCtx.state = stateSnapshot.state;
|
|
312
|
+
}
|
|
313
|
+
this.#runCtx.vars = varsSnapshot;
|
|
314
|
+
throw error;
|
|
315
|
+
} finally {
|
|
316
|
+
stepCtx[DEACTIVATE_STEP]();
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
#toActorQueueMessage(message) {
|
|
320
|
+
let id;
|
|
321
|
+
try {
|
|
322
|
+
id = BigInt(message.id);
|
|
323
|
+
} catch (e) {
|
|
324
|
+
throw new Error(`Invalid queue message id "${message.id}"`);
|
|
325
|
+
}
|
|
326
|
+
return {
|
|
327
|
+
id,
|
|
328
|
+
name: message.name,
|
|
329
|
+
body: message.body,
|
|
330
|
+
createdAt: message.createdAt,
|
|
331
|
+
...message.complete ? { complete: message.complete } : {}
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
// Runs a step rollback compensation with an active step context. Rollbacks
|
|
335
|
+
// intentionally mutate actor state, so their writes are not snapshotted.
|
|
336
|
+
async #runRollback(rollback, output) {
|
|
337
|
+
const stepCtx = new WorkflowStepContext(this.#runCtx, () => this.#markGuardTriggered());
|
|
338
|
+
try {
|
|
339
|
+
await rollback(stepCtx, output);
|
|
340
|
+
} finally {
|
|
341
|
+
stepCtx[DEACTIVATE_STEP]();
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
async #wrapActive(run) {
|
|
345
|
+
return await this.#runCtx.internalKeepAwake(run);
|
|
346
|
+
}
|
|
347
|
+
// Records that a step context was used outside its step. Mirrors the value
|
|
348
|
+
// onto actor state and a KV flag so callers can observe the violation.
|
|
349
|
+
#markGuardTriggered() {
|
|
350
|
+
try {
|
|
351
|
+
const state = this.#runCtx.state;
|
|
352
|
+
if (state && typeof state === "object" && "guardTriggered" in state) {
|
|
353
|
+
state.guardTriggered = true;
|
|
354
|
+
}
|
|
355
|
+
} catch (e2) {
|
|
356
|
+
}
|
|
357
|
+
this.#runCtx.waitUntil(
|
|
358
|
+
(async () => {
|
|
359
|
+
try {
|
|
360
|
+
await this.#runCtx.kv.put(WORKFLOW_GUARD_KV_KEY, "true");
|
|
361
|
+
} catch (error) {
|
|
362
|
+
this.#runCtx.log.error({
|
|
363
|
+
msg: "failed to persist workflow guard flag",
|
|
364
|
+
error
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
})()
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
#createChildContext(ctx) {
|
|
371
|
+
return new _WorkflowContext(ctx, this.#runCtx);
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
|
|
36
375
|
// src/workflow/driver.ts
|
|
37
|
-
var WORKFLOW_STORAGE_PREFIX =
|
|
376
|
+
var WORKFLOW_STORAGE_PREFIX = _chunkVE2X4KMGcjs.workflowStoragePrefix.call(void 0, );
|
|
38
377
|
function stripWorkflowKey(prefixed) {
|
|
39
378
|
return prefixed.slice(WORKFLOW_STORAGE_PREFIX.length);
|
|
40
379
|
}
|
|
@@ -91,7 +430,7 @@ var ActorWorkflowMessageDriver = class {
|
|
|
91
430
|
let parsedId;
|
|
92
431
|
try {
|
|
93
432
|
parsedId = BigInt(messageId);
|
|
94
|
-
} catch (
|
|
433
|
+
} catch (e3) {
|
|
95
434
|
return;
|
|
96
435
|
}
|
|
97
436
|
await this.#runCtx.internalKeepAwake(
|
|
@@ -112,7 +451,7 @@ var ActorWorkflowDriver = (_class = class {
|
|
|
112
451
|
async get(key) {
|
|
113
452
|
const [value] = await this.#runCtx.internalKeepAwake(
|
|
114
453
|
this.#actor.driver.kvBatchGet(this.#actor.id, [
|
|
115
|
-
|
|
454
|
+
_chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, key)
|
|
116
455
|
])
|
|
117
456
|
);
|
|
118
457
|
return _nullishCoalesce(value, () => ( null));
|
|
@@ -120,19 +459,19 @@ var ActorWorkflowDriver = (_class = class {
|
|
|
120
459
|
async set(key, value) {
|
|
121
460
|
await this.#runCtx.internalKeepAwake(
|
|
122
461
|
this.#actor.driver.kvBatchPut(this.#actor.id, [
|
|
123
|
-
[
|
|
462
|
+
[_chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, key), value]
|
|
124
463
|
])
|
|
125
464
|
);
|
|
126
465
|
}
|
|
127
466
|
async delete(key) {
|
|
128
467
|
await this.#runCtx.internalKeepAwake(
|
|
129
468
|
this.#actor.driver.kvBatchDelete(this.#actor.id, [
|
|
130
|
-
|
|
469
|
+
_chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, key)
|
|
131
470
|
])
|
|
132
471
|
);
|
|
133
472
|
}
|
|
134
473
|
async deletePrefix(prefix) {
|
|
135
|
-
const start =
|
|
474
|
+
const start = _chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, prefix);
|
|
136
475
|
const end = computeUpperBound(start);
|
|
137
476
|
if (end) {
|
|
138
477
|
await this.#runCtx.internalKeepAwake(
|
|
@@ -157,8 +496,8 @@ var ActorWorkflowDriver = (_class = class {
|
|
|
157
496
|
await this.#runCtx.internalKeepAwake(
|
|
158
497
|
this.#actor.driver.kvDeleteRange(
|
|
159
498
|
this.#actor.id,
|
|
160
|
-
|
|
161
|
-
|
|
499
|
+
_chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, start),
|
|
500
|
+
_chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, end)
|
|
162
501
|
)
|
|
163
502
|
);
|
|
164
503
|
}
|
|
@@ -166,7 +505,7 @@ var ActorWorkflowDriver = (_class = class {
|
|
|
166
505
|
const entries = await this.#runCtx.internalKeepAwake(
|
|
167
506
|
this.#actor.driver.kvListPrefix(
|
|
168
507
|
this.#actor.id,
|
|
169
|
-
|
|
508
|
+
_chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, prefix)
|
|
170
509
|
)
|
|
171
510
|
);
|
|
172
511
|
return entries.map(([key, value]) => ({
|
|
@@ -181,7 +520,7 @@ var ActorWorkflowDriver = (_class = class {
|
|
|
181
520
|
this.#actor.driver.kvBatchPut(
|
|
182
521
|
this.#actor.id,
|
|
183
522
|
writes.map(({ key, value }) => [
|
|
184
|
-
|
|
523
|
+
_chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, key),
|
|
185
524
|
value
|
|
186
525
|
])
|
|
187
526
|
),
|
|
@@ -226,22 +565,22 @@ var ActorWorkflowControlDriver = (_class2 = class {
|
|
|
226
565
|
}
|
|
227
566
|
async get(key) {
|
|
228
567
|
const [value] = await this.#actor.driver.kvBatchGet(this.#actor.id, [
|
|
229
|
-
|
|
568
|
+
_chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, key)
|
|
230
569
|
]);
|
|
231
570
|
return _nullishCoalesce(value, () => ( null));
|
|
232
571
|
}
|
|
233
572
|
async set(key, value) {
|
|
234
573
|
await this.#actor.driver.kvBatchPut(this.#actor.id, [
|
|
235
|
-
[
|
|
574
|
+
[_chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, key), value]
|
|
236
575
|
]);
|
|
237
576
|
}
|
|
238
577
|
async delete(key) {
|
|
239
578
|
await this.#actor.driver.kvBatchDelete(this.#actor.id, [
|
|
240
|
-
|
|
579
|
+
_chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, key)
|
|
241
580
|
]);
|
|
242
581
|
}
|
|
243
582
|
async deletePrefix(prefix) {
|
|
244
|
-
const start =
|
|
583
|
+
const start = _chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, prefix);
|
|
245
584
|
const end = computeUpperBound(start);
|
|
246
585
|
if (end) {
|
|
247
586
|
await this.#actor.driver.kvDeleteRange(this.#actor.id, start, end);
|
|
@@ -262,14 +601,14 @@ var ActorWorkflowControlDriver = (_class2 = class {
|
|
|
262
601
|
async deleteRange(start, end) {
|
|
263
602
|
await this.#actor.driver.kvDeleteRange(
|
|
264
603
|
this.#actor.id,
|
|
265
|
-
|
|
266
|
-
|
|
604
|
+
_chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, start),
|
|
605
|
+
_chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, end)
|
|
267
606
|
);
|
|
268
607
|
}
|
|
269
608
|
async list(prefix) {
|
|
270
609
|
const entries = await this.#actor.driver.kvListPrefix(
|
|
271
610
|
this.#actor.id,
|
|
272
|
-
|
|
611
|
+
_chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, prefix)
|
|
273
612
|
);
|
|
274
613
|
return entries.map(([key, value]) => ({
|
|
275
614
|
key: stripWorkflowKey(key),
|
|
@@ -282,7 +621,7 @@ var ActorWorkflowControlDriver = (_class2 = class {
|
|
|
282
621
|
}
|
|
283
622
|
await this.#actor.driver.kvBatchPut(
|
|
284
623
|
this.#actor.id,
|
|
285
|
-
writes.map(({ key, value }) => [
|
|
624
|
+
writes.map(({ key, value }) => [_chunkVE2X4KMGcjs.makeWorkflowKey.call(void 0, key), value])
|
|
286
625
|
);
|
|
287
626
|
}
|
|
288
627
|
async setAlarm(_workflowId, wakeAt) {
|
|
@@ -296,293 +635,6 @@ var ActorWorkflowControlDriver = (_class2 = class {
|
|
|
296
635
|
}
|
|
297
636
|
}, _class2);
|
|
298
637
|
|
|
299
|
-
// src/workflow/constants.ts
|
|
300
|
-
var WORKFLOW_GUARD_KV_KEY = "__rivet_actor_workflow_guard_triggered";
|
|
301
|
-
|
|
302
|
-
// src/workflow/context.ts
|
|
303
|
-
var ActorWorkflowContext = class _ActorWorkflowContext {
|
|
304
|
-
#inner;
|
|
305
|
-
#runCtx;
|
|
306
|
-
#actorAccessDepth = 0;
|
|
307
|
-
#allowActorAccess = false;
|
|
308
|
-
#guardViolation = false;
|
|
309
|
-
constructor(inner, runCtx) {
|
|
310
|
-
this.#inner = inner;
|
|
311
|
-
this.#runCtx = runCtx;
|
|
312
|
-
}
|
|
313
|
-
get workflowId() {
|
|
314
|
-
return this.#inner.workflowId;
|
|
315
|
-
}
|
|
316
|
-
get abortSignal() {
|
|
317
|
-
return this.#inner.abortSignal;
|
|
318
|
-
}
|
|
319
|
-
get queue() {
|
|
320
|
-
const self = this;
|
|
321
|
-
async function next(name, opts) {
|
|
322
|
-
const message = await self.#inner.queue.next(name, opts);
|
|
323
|
-
return self.#toActorQueueMessage(message);
|
|
324
|
-
}
|
|
325
|
-
async function nextBatch(name, opts) {
|
|
326
|
-
const messages = await self.#inner.queue.nextBatch(name, opts);
|
|
327
|
-
return messages.map(
|
|
328
|
-
(message) => self.#toActorQueueMessage(message)
|
|
329
|
-
);
|
|
330
|
-
}
|
|
331
|
-
async function send(name, body) {
|
|
332
|
-
self.#ensureActorAccess("queue.send");
|
|
333
|
-
await self.#runCtx.queue.send(name, body);
|
|
334
|
-
}
|
|
335
|
-
return {
|
|
336
|
-
next,
|
|
337
|
-
nextBatch,
|
|
338
|
-
send
|
|
339
|
-
};
|
|
340
|
-
}
|
|
341
|
-
async step(nameOrConfig, run) {
|
|
342
|
-
if (typeof nameOrConfig === "string") {
|
|
343
|
-
if (!run) {
|
|
344
|
-
throw new Error("Step run function missing");
|
|
345
|
-
}
|
|
346
|
-
return await this.#wrapActive(
|
|
347
|
-
() => this.#inner.step(
|
|
348
|
-
nameOrConfig,
|
|
349
|
-
() => this.#withActorAccess(run)
|
|
350
|
-
)
|
|
351
|
-
);
|
|
352
|
-
}
|
|
353
|
-
const stepConfig = nameOrConfig;
|
|
354
|
-
const config = {
|
|
355
|
-
...stepConfig,
|
|
356
|
-
run: () => this.#withActorAccess(stepConfig.run)
|
|
357
|
-
};
|
|
358
|
-
return await this.#wrapActive(() => this.#inner.step(config));
|
|
359
|
-
}
|
|
360
|
-
async tryStep(nameOrConfig, run) {
|
|
361
|
-
if (typeof nameOrConfig === "string") {
|
|
362
|
-
if (!run) {
|
|
363
|
-
throw new Error("Step run function missing");
|
|
364
|
-
}
|
|
365
|
-
return await this.#wrapActive(
|
|
366
|
-
() => this.#inner.tryStep(
|
|
367
|
-
nameOrConfig,
|
|
368
|
-
() => this.#withActorAccess(run)
|
|
369
|
-
)
|
|
370
|
-
);
|
|
371
|
-
}
|
|
372
|
-
const stepConfig = nameOrConfig;
|
|
373
|
-
const config = {
|
|
374
|
-
...stepConfig,
|
|
375
|
-
run: () => this.#withActorAccess(stepConfig.run)
|
|
376
|
-
};
|
|
377
|
-
return await this.#wrapActive(() => this.#inner.tryStep(config));
|
|
378
|
-
}
|
|
379
|
-
async try(nameOrConfig, run) {
|
|
380
|
-
if (typeof nameOrConfig === "string") {
|
|
381
|
-
if (!run) {
|
|
382
|
-
throw new Error("Try run function missing");
|
|
383
|
-
}
|
|
384
|
-
return await this.#wrapActive(
|
|
385
|
-
() => this.#inner.try(
|
|
386
|
-
nameOrConfig,
|
|
387
|
-
async (ctx) => run(this.#createChildContext(ctx))
|
|
388
|
-
)
|
|
389
|
-
);
|
|
390
|
-
}
|
|
391
|
-
const tryConfig = nameOrConfig;
|
|
392
|
-
const config = {
|
|
393
|
-
...tryConfig,
|
|
394
|
-
run: async (ctx) => tryConfig.run(this.#createChildContext(ctx))
|
|
395
|
-
};
|
|
396
|
-
return await this.#wrapActive(() => this.#inner.try(config));
|
|
397
|
-
}
|
|
398
|
-
async loop(nameOrConfig, run) {
|
|
399
|
-
if (typeof nameOrConfig === "string") {
|
|
400
|
-
if (!run) {
|
|
401
|
-
throw new Error("Loop run function missing");
|
|
402
|
-
}
|
|
403
|
-
return await this.#wrapActive(
|
|
404
|
-
() => this.#inner.loop(
|
|
405
|
-
nameOrConfig,
|
|
406
|
-
async (ctx) => run(this.#createChildContext(ctx))
|
|
407
|
-
)
|
|
408
|
-
);
|
|
409
|
-
}
|
|
410
|
-
const wrapped = {
|
|
411
|
-
...nameOrConfig,
|
|
412
|
-
run: async (ctx, state) => nameOrConfig.run(this.#createChildContext(ctx), state)
|
|
413
|
-
};
|
|
414
|
-
return await this.#wrapActive(() => this.#inner.loop(wrapped));
|
|
415
|
-
}
|
|
416
|
-
sleep(name, durationMs) {
|
|
417
|
-
return this.#inner.sleep(name, durationMs);
|
|
418
|
-
}
|
|
419
|
-
sleepUntil(name, timestampMs) {
|
|
420
|
-
return this.#inner.sleepUntil(name, timestampMs);
|
|
421
|
-
}
|
|
422
|
-
destroy() {
|
|
423
|
-
this.#ensureActorAccess("destroy");
|
|
424
|
-
this.#runCtx.destroy();
|
|
425
|
-
}
|
|
426
|
-
async rollbackCheckpoint(name) {
|
|
427
|
-
await this.#wrapActive(() => this.#inner.rollbackCheckpoint(name));
|
|
428
|
-
}
|
|
429
|
-
async join(name, branches) {
|
|
430
|
-
const wrappedBranches = Object.fromEntries(
|
|
431
|
-
Object.entries(branches).map(([key, branch]) => [
|
|
432
|
-
key,
|
|
433
|
-
{
|
|
434
|
-
run: async (ctx) => branch.run(this.#createChildContext(ctx))
|
|
435
|
-
}
|
|
436
|
-
])
|
|
437
|
-
);
|
|
438
|
-
return await this.#wrapActive(
|
|
439
|
-
() => this.#inner.join(name, wrappedBranches)
|
|
440
|
-
);
|
|
441
|
-
}
|
|
442
|
-
async race(name, branches) {
|
|
443
|
-
const wrappedBranches = branches.map((branch) => ({
|
|
444
|
-
name: branch.name,
|
|
445
|
-
run: (ctx) => branch.run(this.#createChildContext(ctx))
|
|
446
|
-
}));
|
|
447
|
-
return await this.#wrapActive(
|
|
448
|
-
() => this.#inner.race(name, wrappedBranches)
|
|
449
|
-
);
|
|
450
|
-
}
|
|
451
|
-
async removed(name, originalType) {
|
|
452
|
-
await this.#wrapActive(() => this.#inner.removed(name, originalType));
|
|
453
|
-
}
|
|
454
|
-
isEvicted() {
|
|
455
|
-
return this.#inner.isEvicted();
|
|
456
|
-
}
|
|
457
|
-
get state() {
|
|
458
|
-
this.#ensureActorAccess("state");
|
|
459
|
-
return this.#runCtx.state;
|
|
460
|
-
}
|
|
461
|
-
get vars() {
|
|
462
|
-
this.#ensureActorAccess("vars");
|
|
463
|
-
return this.#runCtx.vars;
|
|
464
|
-
}
|
|
465
|
-
client() {
|
|
466
|
-
this.#ensureActorAccess("client");
|
|
467
|
-
return this.#runCtx.client();
|
|
468
|
-
}
|
|
469
|
-
get db() {
|
|
470
|
-
this.#ensureActorAccess("db");
|
|
471
|
-
return this.#runCtx.db;
|
|
472
|
-
}
|
|
473
|
-
get log() {
|
|
474
|
-
return this.#runCtx.log;
|
|
475
|
-
}
|
|
476
|
-
/** @deprecated No-op. Use `keepAwake(promise)` or `waitUntil(promise)` instead. */
|
|
477
|
-
setPreventSleep(_prevent) {
|
|
478
|
-
this.#ensureActorAccess("setPreventSleep");
|
|
479
|
-
}
|
|
480
|
-
/** @deprecated No-op. Always returns `false`. */
|
|
481
|
-
get preventSleep() {
|
|
482
|
-
this.#ensureActorAccess("preventSleep");
|
|
483
|
-
return false;
|
|
484
|
-
}
|
|
485
|
-
/**
|
|
486
|
-
* Holds the actor awake for the duration of the provided promise. The
|
|
487
|
-
* actor cannot idle-sleep or finalize the sleep grace period until the
|
|
488
|
-
* promise settles.
|
|
489
|
-
*/
|
|
490
|
-
keepAwake(promise) {
|
|
491
|
-
this.#ensureActorAccess("keepAwake");
|
|
492
|
-
return this.#runCtx.keepAwake(promise);
|
|
493
|
-
}
|
|
494
|
-
/**
|
|
495
|
-
* Registers a promise that the sleep grace period will wait on. Use this
|
|
496
|
-
* for best-effort flush/cleanup work that may complete inside the grace
|
|
497
|
-
* window. For work the actor must stay running through, prefer
|
|
498
|
-
* `c.keepAwake(promise)` which also blocks idle sleep.
|
|
499
|
-
*/
|
|
500
|
-
waitUntil(promise) {
|
|
501
|
-
this.#ensureActorAccess("waitUntil");
|
|
502
|
-
this.#runCtx.waitUntil(promise);
|
|
503
|
-
}
|
|
504
|
-
get actorId() {
|
|
505
|
-
return this.#runCtx.actorId;
|
|
506
|
-
}
|
|
507
|
-
broadcast(name, ...args) {
|
|
508
|
-
this.#ensureActorAccess("broadcast");
|
|
509
|
-
this.#runCtx.broadcast(
|
|
510
|
-
name,
|
|
511
|
-
...args
|
|
512
|
-
);
|
|
513
|
-
}
|
|
514
|
-
#toActorQueueMessage(message) {
|
|
515
|
-
let id;
|
|
516
|
-
try {
|
|
517
|
-
id = BigInt(message.id);
|
|
518
|
-
} catch (e2) {
|
|
519
|
-
throw new Error(`Invalid queue message id "${message.id}"`);
|
|
520
|
-
}
|
|
521
|
-
return {
|
|
522
|
-
id,
|
|
523
|
-
name: message.name,
|
|
524
|
-
body: message.body,
|
|
525
|
-
createdAt: message.createdAt,
|
|
526
|
-
...message.complete ? { complete: message.complete } : {}
|
|
527
|
-
};
|
|
528
|
-
}
|
|
529
|
-
async #wrapActive(run) {
|
|
530
|
-
return await this.#runCtx.internalKeepAwake(run);
|
|
531
|
-
}
|
|
532
|
-
async #withActorAccess(run) {
|
|
533
|
-
this.#actorAccessDepth++;
|
|
534
|
-
if (this.#actorAccessDepth === 1) {
|
|
535
|
-
this.#allowActorAccess = true;
|
|
536
|
-
}
|
|
537
|
-
try {
|
|
538
|
-
return await run();
|
|
539
|
-
} finally {
|
|
540
|
-
this.#actorAccessDepth--;
|
|
541
|
-
if (this.#actorAccessDepth === 0) {
|
|
542
|
-
this.#allowActorAccess = false;
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
#ensureActorAccess(feature) {
|
|
547
|
-
if (!this.#allowActorAccess) {
|
|
548
|
-
this.#guardViolation = true;
|
|
549
|
-
this.#markGuardTriggered();
|
|
550
|
-
throw new Error(
|
|
551
|
-
`${feature} is only available inside workflow steps`
|
|
552
|
-
);
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
consumeGuardViolation() {
|
|
556
|
-
const violated = this.#guardViolation;
|
|
557
|
-
this.#guardViolation = false;
|
|
558
|
-
return violated;
|
|
559
|
-
}
|
|
560
|
-
#markGuardTriggered() {
|
|
561
|
-
try {
|
|
562
|
-
const state = this.#runCtx.state;
|
|
563
|
-
if (state && typeof state === "object" && "guardTriggered" in state) {
|
|
564
|
-
state.guardTriggered = true;
|
|
565
|
-
}
|
|
566
|
-
} catch (e3) {
|
|
567
|
-
}
|
|
568
|
-
this.#runCtx.waitUntil(
|
|
569
|
-
(async () => {
|
|
570
|
-
try {
|
|
571
|
-
await this.#runCtx.kv.put(WORKFLOW_GUARD_KV_KEY, "true");
|
|
572
|
-
} catch (error) {
|
|
573
|
-
this.#runCtx.log.error({
|
|
574
|
-
msg: "failed to persist workflow guard flag",
|
|
575
|
-
error
|
|
576
|
-
});
|
|
577
|
-
}
|
|
578
|
-
})()
|
|
579
|
-
);
|
|
580
|
-
}
|
|
581
|
-
#createChildContext(ctx) {
|
|
582
|
-
return new _ActorWorkflowContext(ctx, this.#runCtx);
|
|
583
|
-
}
|
|
584
|
-
};
|
|
585
|
-
|
|
586
638
|
// src/workflow/mod.ts
|
|
587
639
|
|
|
588
640
|
function shouldRethrowWorkflowError(error) {
|
|
@@ -595,7 +647,7 @@ function shouldRethrowWorkflowError(error) {
|
|
|
595
647
|
return true;
|
|
596
648
|
}
|
|
597
649
|
function workflowReplayInFlightError() {
|
|
598
|
-
return new (0,
|
|
650
|
+
return new (0, _chunk4FC7TVS6cjs.RivetError)(
|
|
599
651
|
"actor",
|
|
600
652
|
"workflow_in_flight",
|
|
601
653
|
"Workflow replay is unavailable while the workflow is currently in flight.",
|
|
@@ -614,13 +666,13 @@ function workflow(fn, options = {}) {
|
|
|
614
666
|
function getWorkflowInspector(actorId) {
|
|
615
667
|
let workflowInspector = workflowInspectors.get(actorId);
|
|
616
668
|
if (!workflowInspector) {
|
|
617
|
-
workflowInspector =
|
|
669
|
+
workflowInspector = _chunkJLJJZYCJcjs.createWorkflowInspectorAdapter.call(void 0, );
|
|
618
670
|
workflowInspectors.set(actorId, workflowInspector);
|
|
619
671
|
}
|
|
620
672
|
return workflowInspector;
|
|
621
673
|
}
|
|
622
674
|
async function run(runCtx) {
|
|
623
|
-
const actor = runCtx[
|
|
675
|
+
const actor = runCtx[_chunk3MHDOUD7cjs.ACTOR_CONTEXT_INTERNAL_SYMBOL];
|
|
624
676
|
_invariant2.default.call(void 0, actor, "workflow() requires an actor instance");
|
|
625
677
|
const workflowInspector = getWorkflowInspector(actor.id);
|
|
626
678
|
const driver = new ActorWorkflowDriver(actor, runCtx);
|
|
@@ -650,11 +702,13 @@ function workflow(fn, options = {}) {
|
|
|
650
702
|
});
|
|
651
703
|
const handle = _workflowengine.runWorkflow.call(void 0,
|
|
652
704
|
actor.id,
|
|
653
|
-
async (ctx) => await fn(new
|
|
705
|
+
async (ctx) => await fn(new WorkflowContext(ctx, runCtx)),
|
|
654
706
|
void 0,
|
|
655
707
|
driver,
|
|
656
708
|
{
|
|
657
709
|
mode: "live",
|
|
710
|
+
// The actor logger and the engine's pino logger are runtime
|
|
711
|
+
// compatible but not structurally assignable.
|
|
658
712
|
logger: runCtx.log,
|
|
659
713
|
onHistoryUpdated: workflowInspector.update,
|
|
660
714
|
onError: onError ? async (event) => await onError(runCtx, event) : void 0
|
|
@@ -674,27 +728,33 @@ function workflow(fn, options = {}) {
|
|
|
674
728
|
try {
|
|
675
729
|
await handle.result;
|
|
676
730
|
} catch (error) {
|
|
677
|
-
if (runCtx.abortSignal.aborted) {
|
|
731
|
+
if (runCtx.abortSignal.aborted || _chunk4FC7TVS6cjs.isActorAbortedError.call(void 0, error)) {
|
|
678
732
|
return;
|
|
679
733
|
}
|
|
680
734
|
if (shouldRethrowWorkflowError(error)) {
|
|
681
735
|
runCtx.log.error({
|
|
682
736
|
msg: "workflow run failed",
|
|
683
|
-
error:
|
|
737
|
+
error: _chunkMNHKOS6Lcjs.stringifyError.call(void 0, error)
|
|
684
738
|
});
|
|
685
739
|
throw error;
|
|
686
740
|
}
|
|
687
741
|
runCtx.log.warn({
|
|
688
742
|
msg: "workflow failed and will sleep until woken",
|
|
689
|
-
error:
|
|
743
|
+
error: _chunkMNHKOS6Lcjs.stringifyError.call(void 0, error)
|
|
690
744
|
});
|
|
691
745
|
} finally {
|
|
692
746
|
runCtx.abortSignal.removeEventListener("abort", onAbort);
|
|
693
747
|
}
|
|
694
748
|
}
|
|
695
749
|
const runWithConfig = run;
|
|
696
|
-
runWithConfig[
|
|
750
|
+
runWithConfig[_chunk3MHDOUD7cjs.RUN_FUNCTION_CONFIG_SYMBOL] = {
|
|
697
751
|
icon: "diagram-project",
|
|
752
|
+
// Drop the per-actor inspector when the actor is destroyed so this map
|
|
753
|
+
// does not retain one inspector (and its encoded history) per actor id
|
|
754
|
+
// for the process lifetime.
|
|
755
|
+
disposeInspector: (actorId) => {
|
|
756
|
+
workflowInspectors.delete(actorId);
|
|
757
|
+
},
|
|
698
758
|
inspectorFactory: (actor) => {
|
|
699
759
|
const actorId = resolveWorkflowInspectorActorId(actor);
|
|
700
760
|
return {
|
|
@@ -729,5 +789,6 @@ function resolveWorkflowInspectorActorId(actor) {
|
|
|
729
789
|
|
|
730
790
|
|
|
731
791
|
|
|
732
|
-
|
|
792
|
+
|
|
793
|
+
exports.Loop = _workflowengine.Loop; exports.WorkflowContext = WorkflowContext; exports.WorkflowStepContext = WorkflowStepContext; exports.workflow = workflow;
|
|
733
794
|
//# sourceMappingURL=mod.cjs.map
|