@rivetkit/workflow-engine 2.1.0-rc.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/LICENSE +203 -0
- package/dist/schemas/v1.ts +781 -0
- package/dist/tsup/chunk-GJ66YE5W.cjs +3441 -0
- package/dist/tsup/chunk-GJ66YE5W.cjs.map +1 -0
- package/dist/tsup/chunk-JWHWQBZP.js +3441 -0
- package/dist/tsup/chunk-JWHWQBZP.js.map +1 -0
- package/dist/tsup/index.cjs +93 -0
- package/dist/tsup/index.cjs.map +1 -0
- package/dist/tsup/index.d.cts +884 -0
- package/dist/tsup/index.d.ts +884 -0
- package/dist/tsup/index.js +93 -0
- package/dist/tsup/index.js.map +1 -0
- package/dist/tsup/testing.cjs +316 -0
- package/dist/tsup/testing.cjs.map +1 -0
- package/dist/tsup/testing.d.cts +52 -0
- package/dist/tsup/testing.d.ts +52 -0
- package/dist/tsup/testing.js +316 -0
- package/dist/tsup/testing.js.map +1 -0
- package/package.json +70 -0
- package/schemas/serde.ts +609 -0
- package/schemas/v1.bare +203 -0
- package/schemas/versioned.ts +107 -0
- package/src/context.ts +1845 -0
- package/src/driver.ts +103 -0
- package/src/errors.ts +170 -0
- package/src/index.ts +907 -0
- package/src/keys.ts +277 -0
- package/src/location.ts +168 -0
- package/src/storage.ts +364 -0
- package/src/testing.ts +292 -0
- package/src/types.ts +508 -0
- package/src/utils.ts +48 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CancelledError,
|
|
3
|
+
CriticalError,
|
|
4
|
+
DEFAULT_LOOP_COMMIT_INTERVAL,
|
|
5
|
+
DEFAULT_LOOP_HISTORY_EVERY,
|
|
6
|
+
DEFAULT_LOOP_HISTORY_KEEP,
|
|
7
|
+
DEFAULT_MAX_RETRIES,
|
|
8
|
+
DEFAULT_RETRY_BACKOFF_BASE,
|
|
9
|
+
DEFAULT_RETRY_BACKOFF_MAX,
|
|
10
|
+
DEFAULT_STEP_TIMEOUT,
|
|
11
|
+
EntryInProgressError,
|
|
12
|
+
EvictedError,
|
|
13
|
+
HistoryDivergedError,
|
|
14
|
+
JoinError,
|
|
15
|
+
Loop,
|
|
16
|
+
MessageWaitError,
|
|
17
|
+
RaceError,
|
|
18
|
+
RollbackCheckpointError,
|
|
19
|
+
RollbackError,
|
|
20
|
+
SleepError,
|
|
21
|
+
StepExhaustedError,
|
|
22
|
+
StepFailedError,
|
|
23
|
+
WorkflowContextImpl,
|
|
24
|
+
appendLoopIteration,
|
|
25
|
+
appendName,
|
|
26
|
+
createEntry,
|
|
27
|
+
createHistorySnapshot,
|
|
28
|
+
createStorage,
|
|
29
|
+
deleteEntriesWithPrefix,
|
|
30
|
+
emptyLocation,
|
|
31
|
+
flush,
|
|
32
|
+
generateId,
|
|
33
|
+
getEntry,
|
|
34
|
+
getOrCreateMetadata,
|
|
35
|
+
isLocationPrefix,
|
|
36
|
+
isLoopIterationMarker,
|
|
37
|
+
loadMetadata,
|
|
38
|
+
loadStorage,
|
|
39
|
+
locationToKey,
|
|
40
|
+
locationsEqual,
|
|
41
|
+
parentLocation,
|
|
42
|
+
registerName,
|
|
43
|
+
resolveName,
|
|
44
|
+
runWorkflow,
|
|
45
|
+
setEntry
|
|
46
|
+
} from "./chunk-JWHWQBZP.js";
|
|
47
|
+
export {
|
|
48
|
+
CancelledError,
|
|
49
|
+
CriticalError,
|
|
50
|
+
DEFAULT_LOOP_COMMIT_INTERVAL,
|
|
51
|
+
DEFAULT_LOOP_HISTORY_EVERY,
|
|
52
|
+
DEFAULT_LOOP_HISTORY_KEEP,
|
|
53
|
+
DEFAULT_MAX_RETRIES,
|
|
54
|
+
DEFAULT_RETRY_BACKOFF_BASE,
|
|
55
|
+
DEFAULT_RETRY_BACKOFF_MAX,
|
|
56
|
+
DEFAULT_STEP_TIMEOUT,
|
|
57
|
+
EntryInProgressError,
|
|
58
|
+
EvictedError,
|
|
59
|
+
HistoryDivergedError,
|
|
60
|
+
JoinError,
|
|
61
|
+
Loop,
|
|
62
|
+
MessageWaitError,
|
|
63
|
+
RaceError,
|
|
64
|
+
RollbackCheckpointError,
|
|
65
|
+
RollbackError,
|
|
66
|
+
SleepError,
|
|
67
|
+
StepExhaustedError,
|
|
68
|
+
StepFailedError,
|
|
69
|
+
WorkflowContextImpl,
|
|
70
|
+
appendLoopIteration,
|
|
71
|
+
appendName,
|
|
72
|
+
createEntry,
|
|
73
|
+
createHistorySnapshot,
|
|
74
|
+
createStorage,
|
|
75
|
+
deleteEntriesWithPrefix,
|
|
76
|
+
emptyLocation,
|
|
77
|
+
flush,
|
|
78
|
+
generateId,
|
|
79
|
+
getEntry,
|
|
80
|
+
getOrCreateMetadata,
|
|
81
|
+
isLocationPrefix,
|
|
82
|
+
isLoopIterationMarker,
|
|
83
|
+
loadMetadata,
|
|
84
|
+
loadStorage,
|
|
85
|
+
locationToKey,
|
|
86
|
+
locationsEqual,
|
|
87
|
+
parentLocation,
|
|
88
|
+
registerName,
|
|
89
|
+
resolveName,
|
|
90
|
+
runWorkflow,
|
|
91
|
+
setEntry
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } var _class;
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
var _chunkGJ66YE5Wcjs = require('./chunk-GJ66YE5W.cjs');
|
|
51
|
+
|
|
52
|
+
// src/testing.ts
|
|
53
|
+
var InMemoryWorkflowMessageDriver = class {
|
|
54
|
+
#messages = [];
|
|
55
|
+
#waiters = /* @__PURE__ */ new Set();
|
|
56
|
+
async addMessage(message) {
|
|
57
|
+
this.#messages.push(message);
|
|
58
|
+
this.#notifyWaiters(message.name);
|
|
59
|
+
}
|
|
60
|
+
async receiveMessages(opts) {
|
|
61
|
+
const limitedCount = Math.max(1, opts.count);
|
|
62
|
+
const nameSet = opts.names && opts.names.length > 0 ? new Set(opts.names) : void 0;
|
|
63
|
+
const selected = [];
|
|
64
|
+
for (let i = 0; i < this.#messages.length && selected.length < limitedCount; i++) {
|
|
65
|
+
const message = this.#messages[i];
|
|
66
|
+
if (nameSet && !nameSet.has(message.name)) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
selected.push({ message, index: i });
|
|
70
|
+
}
|
|
71
|
+
if (selected.length === 0) {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
if (!opts.completable) {
|
|
75
|
+
for (let i = selected.length - 1; i >= 0; i--) {
|
|
76
|
+
this.#messages.splice(selected[i].index, 1);
|
|
77
|
+
}
|
|
78
|
+
return selected.map((entry) => entry.message);
|
|
79
|
+
}
|
|
80
|
+
return selected.map((entry) => {
|
|
81
|
+
const { message } = entry;
|
|
82
|
+
return {
|
|
83
|
+
...message,
|
|
84
|
+
complete: async () => {
|
|
85
|
+
await this.completeMessage(message.id);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
async completeMessage(messageId) {
|
|
91
|
+
const index = this.#messages.findIndex((message) => message.id === messageId);
|
|
92
|
+
if (index !== -1) {
|
|
93
|
+
this.#messages.splice(index, 1);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async waitForMessages(messageNames, abortSignal) {
|
|
97
|
+
if (abortSignal.aborted) {
|
|
98
|
+
throw new (0, _chunkGJ66YE5Wcjs.EvictedError)();
|
|
99
|
+
}
|
|
100
|
+
const nameSet = messageNames.length > 0 ? new Set(messageNames) : void 0;
|
|
101
|
+
if (this.#messages.some(
|
|
102
|
+
(message) => nameSet ? nameSet.has(message.name) : true
|
|
103
|
+
)) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
await new Promise((resolve, reject) => {
|
|
107
|
+
const waiter = {
|
|
108
|
+
nameSet,
|
|
109
|
+
resolve: () => {
|
|
110
|
+
this.#removeWaiter(waiter);
|
|
111
|
+
resolve();
|
|
112
|
+
},
|
|
113
|
+
reject: (error) => {
|
|
114
|
+
this.#removeWaiter(waiter);
|
|
115
|
+
reject(error);
|
|
116
|
+
},
|
|
117
|
+
abortSignal,
|
|
118
|
+
onAbort: () => {
|
|
119
|
+
waiter.reject(new (0, _chunkGJ66YE5Wcjs.EvictedError)());
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
abortSignal.addEventListener("abort", waiter.onAbort, { once: true });
|
|
123
|
+
this.#waiters.add(waiter);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
#removeWaiter(waiter) {
|
|
127
|
+
if (this.#waiters.delete(waiter)) {
|
|
128
|
+
waiter.abortSignal.removeEventListener("abort", waiter.onAbort);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
#notifyWaiters(name) {
|
|
132
|
+
for (const waiter of [...this.#waiters]) {
|
|
133
|
+
if (waiter.nameSet && !waiter.nameSet.has(name)) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
waiter.resolve();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
clear() {
|
|
140
|
+
this.#messages = [];
|
|
141
|
+
for (const waiter of [...this.#waiters]) {
|
|
142
|
+
waiter.reject(new Error("cleared"));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
var InMemoryDriver = (_class = class {constructor() { _class.prototype.__init.call(this);_class.prototype.__init2.call(this);_class.prototype.__init3.call(this);_class.prototype.__init4.call(this);_class.prototype.__init5.call(this); }
|
|
147
|
+
// Map from hex-encoded key to { originalKey, value }
|
|
148
|
+
__init() {this.kv = /* @__PURE__ */ new Map()}
|
|
149
|
+
__init2() {this.alarms = /* @__PURE__ */ new Map()}
|
|
150
|
+
#inMemoryMessageDriver = new InMemoryWorkflowMessageDriver();
|
|
151
|
+
/** Simulated latency per operation (ms) */
|
|
152
|
+
__init3() {this.latency = 10}
|
|
153
|
+
/** How often the worker polls for work */
|
|
154
|
+
__init4() {this.workerPollInterval = 100}
|
|
155
|
+
__init5() {this.messageDriver = this.#inMemoryMessageDriver}
|
|
156
|
+
async get(key) {
|
|
157
|
+
await _chunkGJ66YE5Wcjs.sleep.call(void 0, this.latency);
|
|
158
|
+
const entry = this.kv.get(_chunkGJ66YE5Wcjs.keyToHex.call(void 0, key));
|
|
159
|
+
return _nullishCoalesce((entry == null ? void 0 : entry.value), () => ( null));
|
|
160
|
+
}
|
|
161
|
+
async set(key, value) {
|
|
162
|
+
await _chunkGJ66YE5Wcjs.sleep.call(void 0, this.latency);
|
|
163
|
+
this.kv.set(_chunkGJ66YE5Wcjs.keyToHex.call(void 0, key), { key, value });
|
|
164
|
+
}
|
|
165
|
+
async delete(key) {
|
|
166
|
+
await _chunkGJ66YE5Wcjs.sleep.call(void 0, this.latency);
|
|
167
|
+
this.kv.delete(_chunkGJ66YE5Wcjs.keyToHex.call(void 0, key));
|
|
168
|
+
}
|
|
169
|
+
async deletePrefix(prefix) {
|
|
170
|
+
await _chunkGJ66YE5Wcjs.sleep.call(void 0, this.latency);
|
|
171
|
+
for (const [hexKey, entry] of this.kv) {
|
|
172
|
+
if (_chunkGJ66YE5Wcjs.keyStartsWith.call(void 0, entry.key, prefix)) {
|
|
173
|
+
this.kv.delete(hexKey);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async list(prefix) {
|
|
178
|
+
await _chunkGJ66YE5Wcjs.sleep.call(void 0, this.latency);
|
|
179
|
+
const results = [];
|
|
180
|
+
for (const entry of this.kv.values()) {
|
|
181
|
+
if (_chunkGJ66YE5Wcjs.keyStartsWith.call(void 0, entry.key, prefix)) {
|
|
182
|
+
results.push({ key: entry.key, value: entry.value });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return results.sort((a, b) => _chunkGJ66YE5Wcjs.compareKeys.call(void 0, a.key, b.key));
|
|
186
|
+
}
|
|
187
|
+
async batch(writes) {
|
|
188
|
+
await _chunkGJ66YE5Wcjs.sleep.call(void 0, this.latency);
|
|
189
|
+
for (const { key, value } of writes) {
|
|
190
|
+
this.kv.set(_chunkGJ66YE5Wcjs.keyToHex.call(void 0, key), { key, value });
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async setAlarm(workflowId, wakeAt) {
|
|
194
|
+
await _chunkGJ66YE5Wcjs.sleep.call(void 0, this.latency);
|
|
195
|
+
this.alarms.set(workflowId, wakeAt);
|
|
196
|
+
}
|
|
197
|
+
async clearAlarm(workflowId) {
|
|
198
|
+
await _chunkGJ66YE5Wcjs.sleep.call(void 0, this.latency);
|
|
199
|
+
this.alarms.delete(workflowId);
|
|
200
|
+
}
|
|
201
|
+
async waitForMessages(messageNames, abortSignal) {
|
|
202
|
+
const driver = this.messageDriver;
|
|
203
|
+
if (driver.waitForMessages) {
|
|
204
|
+
await driver.waitForMessages(messageNames, abortSignal);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
while (true) {
|
|
208
|
+
if (abortSignal.aborted) {
|
|
209
|
+
throw new (0, _chunkGJ66YE5Wcjs.EvictedError)();
|
|
210
|
+
}
|
|
211
|
+
const messages = await this.messageDriver.receiveMessages({
|
|
212
|
+
names: messageNames.length > 0 ? messageNames : void 0,
|
|
213
|
+
count: 1,
|
|
214
|
+
completable: true
|
|
215
|
+
});
|
|
216
|
+
if (messages.length > 0) {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
await _chunkGJ66YE5Wcjs.sleep.call(void 0, Math.max(1, this.latency));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get the alarm time for a workflow (for testing).
|
|
224
|
+
*/
|
|
225
|
+
getAlarm(workflowId) {
|
|
226
|
+
return this.alarms.get(workflowId);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Check if any alarms are due and return their workflow IDs.
|
|
230
|
+
*/
|
|
231
|
+
getDueAlarms() {
|
|
232
|
+
const now = Date.now();
|
|
233
|
+
const due = [];
|
|
234
|
+
for (const [workflowId, wakeAt] of this.alarms) {
|
|
235
|
+
if (wakeAt <= now) {
|
|
236
|
+
due.push(workflowId);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return due;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Clear all data (for testing).
|
|
243
|
+
*/
|
|
244
|
+
clear() {
|
|
245
|
+
this.kv.clear();
|
|
246
|
+
this.alarms.clear();
|
|
247
|
+
this.#inMemoryMessageDriver.clear();
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Get a snapshot of all data (for testing/debugging).
|
|
251
|
+
*/
|
|
252
|
+
snapshot() {
|
|
253
|
+
const kvSnapshot = {};
|
|
254
|
+
for (const [hexKey, entry] of this.kv) {
|
|
255
|
+
kvSnapshot[hexKey] = entry.value;
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
kv: kvSnapshot,
|
|
259
|
+
alarms: Object.fromEntries(this.alarms)
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Get all hex-encoded keys (for testing).
|
|
264
|
+
*/
|
|
265
|
+
keys() {
|
|
266
|
+
return [...this.kv.keys()];
|
|
267
|
+
}
|
|
268
|
+
}, _class);
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
exports.CancelledError = _chunkGJ66YE5Wcjs.CancelledError; exports.CriticalError = _chunkGJ66YE5Wcjs.CriticalError; exports.DEFAULT_LOOP_COMMIT_INTERVAL = _chunkGJ66YE5Wcjs.DEFAULT_LOOP_COMMIT_INTERVAL; exports.DEFAULT_LOOP_HISTORY_EVERY = _chunkGJ66YE5Wcjs.DEFAULT_LOOP_HISTORY_EVERY; exports.DEFAULT_LOOP_HISTORY_KEEP = _chunkGJ66YE5Wcjs.DEFAULT_LOOP_HISTORY_KEEP; exports.DEFAULT_MAX_RETRIES = _chunkGJ66YE5Wcjs.DEFAULT_MAX_RETRIES; exports.DEFAULT_RETRY_BACKOFF_BASE = _chunkGJ66YE5Wcjs.DEFAULT_RETRY_BACKOFF_BASE; exports.DEFAULT_RETRY_BACKOFF_MAX = _chunkGJ66YE5Wcjs.DEFAULT_RETRY_BACKOFF_MAX; exports.DEFAULT_STEP_TIMEOUT = _chunkGJ66YE5Wcjs.DEFAULT_STEP_TIMEOUT; exports.EntryInProgressError = _chunkGJ66YE5Wcjs.EntryInProgressError; exports.EvictedError = _chunkGJ66YE5Wcjs.EvictedError; exports.HistoryDivergedError = _chunkGJ66YE5Wcjs.HistoryDivergedError; exports.InMemoryDriver = InMemoryDriver; exports.JoinError = _chunkGJ66YE5Wcjs.JoinError; exports.Loop = _chunkGJ66YE5Wcjs.Loop; exports.MessageWaitError = _chunkGJ66YE5Wcjs.MessageWaitError; exports.RaceError = _chunkGJ66YE5Wcjs.RaceError; exports.RollbackCheckpointError = _chunkGJ66YE5Wcjs.RollbackCheckpointError; exports.RollbackError = _chunkGJ66YE5Wcjs.RollbackError; exports.SleepError = _chunkGJ66YE5Wcjs.SleepError; exports.StepExhaustedError = _chunkGJ66YE5Wcjs.StepExhaustedError; exports.StepFailedError = _chunkGJ66YE5Wcjs.StepFailedError; exports.WorkflowContextImpl = _chunkGJ66YE5Wcjs.WorkflowContextImpl; exports.appendLoopIteration = _chunkGJ66YE5Wcjs.appendLoopIteration; exports.appendName = _chunkGJ66YE5Wcjs.appendName; exports.createEntry = _chunkGJ66YE5Wcjs.createEntry; exports.createHistorySnapshot = _chunkGJ66YE5Wcjs.createHistorySnapshot; exports.createStorage = _chunkGJ66YE5Wcjs.createStorage; exports.deleteEntriesWithPrefix = _chunkGJ66YE5Wcjs.deleteEntriesWithPrefix; exports.emptyLocation = _chunkGJ66YE5Wcjs.emptyLocation; exports.flush = _chunkGJ66YE5Wcjs.flush; exports.generateId = _chunkGJ66YE5Wcjs.generateId; exports.getEntry = _chunkGJ66YE5Wcjs.getEntry; exports.getOrCreateMetadata = _chunkGJ66YE5Wcjs.getOrCreateMetadata; exports.isLocationPrefix = _chunkGJ66YE5Wcjs.isLocationPrefix; exports.isLoopIterationMarker = _chunkGJ66YE5Wcjs.isLoopIterationMarker; exports.loadMetadata = _chunkGJ66YE5Wcjs.loadMetadata; exports.loadStorage = _chunkGJ66YE5Wcjs.loadStorage; exports.locationToKey = _chunkGJ66YE5Wcjs.locationToKey; exports.locationsEqual = _chunkGJ66YE5Wcjs.locationsEqual; exports.parentLocation = _chunkGJ66YE5Wcjs.parentLocation; exports.registerName = _chunkGJ66YE5Wcjs.registerName; exports.resolveName = _chunkGJ66YE5Wcjs.resolveName; exports.runWorkflow = _chunkGJ66YE5Wcjs.runWorkflow; exports.setEntry = _chunkGJ66YE5Wcjs.setEntry;
|
|
316
|
+
//# sourceMappingURL=testing.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/workflow-engine/dist/tsup/testing.cjs","../../src/testing.ts"],"names":[],"mappings":"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","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/workflow-engine/dist/tsup/testing.cjs","sourcesContent":[null,"import type { EngineDriver, KVEntry, KVWrite } from \"./driver.js\";\nimport { EvictedError } from \"./errors.js\";\nimport { compareKeys, keyStartsWith, keyToHex } from \"./keys.js\";\nimport type { Message, WorkflowMessageDriver } from \"./types.js\";\nimport { sleep } from \"./utils.js\";\n\ninterface Waiter {\n\tnameSet?: Set<string>;\n\tresolve: () => void;\n\treject: (error: Error) => void;\n\tabortSignal: AbortSignal;\n\tonAbort: () => void;\n}\n\nclass InMemoryWorkflowMessageDriver implements WorkflowMessageDriver {\n\t#messages: Message[] = [];\n\t#waiters = new Set<Waiter>();\n\n\tasync addMessage(message: Message): Promise<void> {\n\t\tthis.#messages.push(message);\n\t\tthis.#notifyWaiters(message.name);\n\t}\n\n\tasync receiveMessages(opts: {\n\t\tnames?: readonly string[];\n\t\tcount: number;\n\t\tcompletable: boolean;\n\t}): Promise<Message[]> {\n\t\tconst limitedCount = Math.max(1, opts.count);\n\t\tconst nameSet =\n\t\t\topts.names && opts.names.length > 0\n\t\t\t\t? new Set(opts.names)\n\t\t\t\t: undefined;\n\t\tconst selected: Array<{ message: Message; index: number }> = [];\n\n\t\tfor (let i = 0; i < this.#messages.length && selected.length < limitedCount; i++) {\n\t\t\tconst message = this.#messages[i];\n\t\t\tif (nameSet && !nameSet.has(message.name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tselected.push({ message, index: i });\n\t\t}\n\n\t\tif (selected.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif (!opts.completable) {\n\t\t\tfor (let i = selected.length - 1; i >= 0; i--) {\n\t\t\t\tthis.#messages.splice(selected[i].index, 1);\n\t\t\t}\n\t\t\treturn selected.map((entry) => entry.message);\n\t\t}\n\n\t\treturn selected.map((entry) => {\n\t\t\tconst { message } = entry;\n\t\t\treturn {\n\t\t\t\t...message,\n\t\t\t\tcomplete: async () => {\n\t\t\t\t\tawait this.completeMessage(message.id);\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t}\n\n\tasync completeMessage(messageId: string): Promise<void> {\n\t\tconst index = this.#messages.findIndex((message) => message.id === messageId);\n\t\tif (index !== -1) {\n\t\t\tthis.#messages.splice(index, 1);\n\t\t}\n\t}\n\n\tasync waitForMessages(\n\t\tmessageNames: string[],\n\t\tabortSignal: AbortSignal,\n\t): Promise<void> {\n\t\tif (abortSignal.aborted) {\n\t\t\tthrow new EvictedError();\n\t\t}\n\n\t\tconst nameSet = messageNames.length > 0 ? new Set(messageNames) : undefined;\n\t\tif (\n\t\t\tthis.#messages.some((message) =>\n\t\t\t\tnameSet ? nameSet.has(message.name) : true,\n\t\t\t)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst waiter: Waiter = {\n\t\t\t\tnameSet,\n\t\t\t\tresolve: () => {\n\t\t\t\t\tthis.#removeWaiter(waiter);\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tthis.#removeWaiter(waiter);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t\tabortSignal,\n\t\t\t\tonAbort: () => {\n\t\t\t\t\twaiter.reject(new EvictedError());\n\t\t\t\t},\n\t\t\t};\n\t\t\tabortSignal.addEventListener(\"abort\", waiter.onAbort, { once: true });\n\t\t\tthis.#waiters.add(waiter);\n\t\t});\n\t}\n\n\t#removeWaiter(waiter: Waiter): void {\n\t\tif (this.#waiters.delete(waiter)) {\n\t\t\twaiter.abortSignal.removeEventListener(\"abort\", waiter.onAbort);\n\t\t}\n\t}\n\n\t#notifyWaiters(name: string): void {\n\t\tfor (const waiter of [...this.#waiters]) {\n\t\t\tif (waiter.nameSet && !waiter.nameSet.has(name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\twaiter.resolve();\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tthis.#messages = [];\n\t\tfor (const waiter of [...this.#waiters]) {\n\t\t\twaiter.reject(new Error(\"cleared\"));\n\t\t}\n\t}\n}\n\n/**\n * In-memory implementation of EngineDriver for testing.\n * Uses binary keys (Uint8Array) with hex encoding for internal Map storage.\n */\nexport class InMemoryDriver implements EngineDriver {\n\t// Map from hex-encoded key to { originalKey, value }\n\tprivate kv = new Map<string, { key: Uint8Array; value: Uint8Array }>();\n\tprivate alarms = new Map<string, number>();\n\t#inMemoryMessageDriver = new InMemoryWorkflowMessageDriver();\n\n\t/** Simulated latency per operation (ms) */\n\tlatency = 10;\n\n\t/** How often the worker polls for work */\n\tworkerPollInterval = 100;\n\tmessageDriver: WorkflowMessageDriver = this.#inMemoryMessageDriver;\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\tawait sleep(this.latency);\n\t\tconst entry = this.kv.get(keyToHex(key));\n\t\treturn entry?.value ?? null;\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.kv.set(keyToHex(key), { key, value });\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.kv.delete(keyToHex(key));\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const [hexKey, entry] of this.kv) {\n\t\t\tif (keyStartsWith(entry.key, prefix)) {\n\t\t\t\tthis.kv.delete(hexKey);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync list(prefix: Uint8Array): Promise<KVEntry[]> {\n\t\tawait sleep(this.latency);\n\t\tconst results: KVEntry[] = [];\n\t\tfor (const entry of this.kv.values()) {\n\t\t\tif (keyStartsWith(entry.key, prefix)) {\n\t\t\t\tresults.push({ key: entry.key, value: entry.value });\n\t\t\t}\n\t\t}\n\t\t// Sort by key lexicographically\n\t\treturn results.sort((a, b) => compareKeys(a.key, b.key));\n\t}\n\n\tasync batch(writes: KVWrite[]): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tfor (const { key, value } of writes) {\n\t\t\tthis.kv.set(keyToHex(key), { key, value });\n\t\t}\n\t}\n\n\tasync setAlarm(workflowId: string, wakeAt: number): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.alarms.set(workflowId, wakeAt);\n\t}\n\n\tasync clearAlarm(workflowId: string): Promise<void> {\n\t\tawait sleep(this.latency);\n\t\tthis.alarms.delete(workflowId);\n\t}\n\n\tasync waitForMessages(\n\t\tmessageNames: string[],\n\t\tabortSignal: AbortSignal,\n\t): Promise<void> {\n\t\tconst driver = this.messageDriver as WorkflowMessageDriver & {\n\t\t\twaitForMessages?: (\n\t\t\t\tmessageNames: string[],\n\t\t\t\tabortSignal: AbortSignal,\n\t\t\t) => Promise<void>;\n\t\t};\n\t\tif (driver.waitForMessages) {\n\t\t\tawait driver.waitForMessages(messageNames, abortSignal);\n\t\t\treturn;\n\t\t}\n\n\t\twhile (true) {\n\t\t\tif (abortSignal.aborted) {\n\t\t\t\tthrow new EvictedError();\n\t\t\t}\n\t\t\tconst messages = await this.messageDriver.receiveMessages({\n\t\t\t\tnames: messageNames.length > 0 ? messageNames : undefined,\n\t\t\t\tcount: 1,\n\t\t\t\tcompletable: true,\n\t\t\t});\n\t\t\tif (messages.length > 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait sleep(Math.max(1, this.latency));\n\t\t}\n\t}\n\n\t/**\n\t * Get the alarm time for a workflow (for testing).\n\t */\n\tgetAlarm(workflowId: string): number | undefined {\n\t\treturn this.alarms.get(workflowId);\n\t}\n\n\t/**\n\t * Check if any alarms are due and return their workflow IDs.\n\t */\n\tgetDueAlarms(): string[] {\n\t\tconst now = Date.now();\n\t\tconst due: string[] = [];\n\t\tfor (const [workflowId, wakeAt] of this.alarms) {\n\t\t\tif (wakeAt <= now) {\n\t\t\t\tdue.push(workflowId);\n\t\t\t}\n\t\t}\n\t\treturn due;\n\t}\n\n\t/**\n\t * Clear all data (for testing).\n\t */\n\tclear(): void {\n\t\tthis.kv.clear();\n\t\tthis.alarms.clear();\n\t\tthis.#inMemoryMessageDriver.clear();\n\t}\n\n\t/**\n\t * Get a snapshot of all data (for testing/debugging).\n\t */\n\tsnapshot(): {\n\t\tkv: Record<string, Uint8Array>;\n\t\talarms: Record<string, number>;\n\t} {\n\t\tconst kvSnapshot: Record<string, Uint8Array> = {};\n\t\tfor (const [hexKey, entry] of this.kv) {\n\t\t\tkvSnapshot[hexKey] = entry.value;\n\t\t}\n\t\treturn {\n\t\t\tkv: kvSnapshot,\n\t\t\talarms: Object.fromEntries(this.alarms),\n\t\t};\n\t}\n\n\t/**\n\t * Get all hex-encoded keys (for testing).\n\t */\n\tkeys(): string[] {\n\t\treturn [...this.kv.keys()];\n\t}\n}\n\n// Re-export main exports for convenience\nexport * from \"./index.js\";\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { EngineDriver, WorkflowMessageDriver, KVEntry, KVWrite } from './index.cjs';
|
|
2
|
+
export { BranchConfig, BranchOutput, BranchStatus, BranchStatusType, CancelledError, CriticalError, DEFAULT_LOOP_COMMIT_INTERVAL, DEFAULT_LOOP_HISTORY_EVERY, DEFAULT_LOOP_HISTORY_KEEP, DEFAULT_MAX_RETRIES, DEFAULT_RETRY_BACKOFF_BASE, DEFAULT_RETRY_BACKOFF_MAX, DEFAULT_STEP_TIMEOUT, Entry, EntryInProgressError, EntryKind, EntryKindType, EntryMetadata, EntryStatus, EvictedError, History, HistoryDivergedError, JoinEntry, JoinError, Location, Loop, LoopConfig, LoopEntry, LoopIterationMarker, LoopResult, Message, MessageEntry, MessageWaitError, NameIndex, PathSegment, RaceEntry, RaceError, RemovedEntry, RollbackCheckpointEntry, RollbackCheckpointError, RollbackContextInterface, RollbackError, RunWorkflowOptions, SleepEntry, SleepError, SleepState, StepConfig, StepEntry, StepExhaustedError, StepFailedError, Storage, WorkflowContextImpl, WorkflowContextInterface, WorkflowEntryMetadataSnapshot, WorkflowFunction, WorkflowHandle, WorkflowHistoryEntry, WorkflowHistorySnapshot, WorkflowQueue, WorkflowQueueMessage, WorkflowQueueNextOptions, WorkflowResult, WorkflowRunMode, WorkflowState, appendLoopIteration, appendName, createEntry, createHistorySnapshot, createStorage, deleteEntriesWithPrefix, emptyLocation, flush, generateId, getEntry, getOrCreateMetadata, isLocationPrefix, isLoopIterationMarker, loadMetadata, loadStorage, locationToKey, locationsEqual, parentLocation, registerName, resolveName, runWorkflow, setEntry } from './index.cjs';
|
|
3
|
+
import 'pino';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* In-memory implementation of EngineDriver for testing.
|
|
7
|
+
* Uses binary keys (Uint8Array) with hex encoding for internal Map storage.
|
|
8
|
+
*/
|
|
9
|
+
declare class InMemoryDriver implements EngineDriver {
|
|
10
|
+
#private;
|
|
11
|
+
private kv;
|
|
12
|
+
private alarms;
|
|
13
|
+
/** Simulated latency per operation (ms) */
|
|
14
|
+
latency: number;
|
|
15
|
+
/** How often the worker polls for work */
|
|
16
|
+
workerPollInterval: number;
|
|
17
|
+
messageDriver: WorkflowMessageDriver;
|
|
18
|
+
get(key: Uint8Array): Promise<Uint8Array | null>;
|
|
19
|
+
set(key: Uint8Array, value: Uint8Array): Promise<void>;
|
|
20
|
+
delete(key: Uint8Array): Promise<void>;
|
|
21
|
+
deletePrefix(prefix: Uint8Array): Promise<void>;
|
|
22
|
+
list(prefix: Uint8Array): Promise<KVEntry[]>;
|
|
23
|
+
batch(writes: KVWrite[]): Promise<void>;
|
|
24
|
+
setAlarm(workflowId: string, wakeAt: number): Promise<void>;
|
|
25
|
+
clearAlarm(workflowId: string): Promise<void>;
|
|
26
|
+
waitForMessages(messageNames: string[], abortSignal: AbortSignal): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Get the alarm time for a workflow (for testing).
|
|
29
|
+
*/
|
|
30
|
+
getAlarm(workflowId: string): number | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Check if any alarms are due and return their workflow IDs.
|
|
33
|
+
*/
|
|
34
|
+
getDueAlarms(): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Clear all data (for testing).
|
|
37
|
+
*/
|
|
38
|
+
clear(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Get a snapshot of all data (for testing/debugging).
|
|
41
|
+
*/
|
|
42
|
+
snapshot(): {
|
|
43
|
+
kv: Record<string, Uint8Array>;
|
|
44
|
+
alarms: Record<string, number>;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Get all hex-encoded keys (for testing).
|
|
48
|
+
*/
|
|
49
|
+
keys(): string[];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export { EngineDriver, InMemoryDriver, KVEntry, KVWrite, WorkflowMessageDriver };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { EngineDriver, WorkflowMessageDriver, KVEntry, KVWrite } from './index.js';
|
|
2
|
+
export { BranchConfig, BranchOutput, BranchStatus, BranchStatusType, CancelledError, CriticalError, DEFAULT_LOOP_COMMIT_INTERVAL, DEFAULT_LOOP_HISTORY_EVERY, DEFAULT_LOOP_HISTORY_KEEP, DEFAULT_MAX_RETRIES, DEFAULT_RETRY_BACKOFF_BASE, DEFAULT_RETRY_BACKOFF_MAX, DEFAULT_STEP_TIMEOUT, Entry, EntryInProgressError, EntryKind, EntryKindType, EntryMetadata, EntryStatus, EvictedError, History, HistoryDivergedError, JoinEntry, JoinError, Location, Loop, LoopConfig, LoopEntry, LoopIterationMarker, LoopResult, Message, MessageEntry, MessageWaitError, NameIndex, PathSegment, RaceEntry, RaceError, RemovedEntry, RollbackCheckpointEntry, RollbackCheckpointError, RollbackContextInterface, RollbackError, RunWorkflowOptions, SleepEntry, SleepError, SleepState, StepConfig, StepEntry, StepExhaustedError, StepFailedError, Storage, WorkflowContextImpl, WorkflowContextInterface, WorkflowEntryMetadataSnapshot, WorkflowFunction, WorkflowHandle, WorkflowHistoryEntry, WorkflowHistorySnapshot, WorkflowQueue, WorkflowQueueMessage, WorkflowQueueNextOptions, WorkflowResult, WorkflowRunMode, WorkflowState, appendLoopIteration, appendName, createEntry, createHistorySnapshot, createStorage, deleteEntriesWithPrefix, emptyLocation, flush, generateId, getEntry, getOrCreateMetadata, isLocationPrefix, isLoopIterationMarker, loadMetadata, loadStorage, locationToKey, locationsEqual, parentLocation, registerName, resolveName, runWorkflow, setEntry } from './index.js';
|
|
3
|
+
import 'pino';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* In-memory implementation of EngineDriver for testing.
|
|
7
|
+
* Uses binary keys (Uint8Array) with hex encoding for internal Map storage.
|
|
8
|
+
*/
|
|
9
|
+
declare class InMemoryDriver implements EngineDriver {
|
|
10
|
+
#private;
|
|
11
|
+
private kv;
|
|
12
|
+
private alarms;
|
|
13
|
+
/** Simulated latency per operation (ms) */
|
|
14
|
+
latency: number;
|
|
15
|
+
/** How often the worker polls for work */
|
|
16
|
+
workerPollInterval: number;
|
|
17
|
+
messageDriver: WorkflowMessageDriver;
|
|
18
|
+
get(key: Uint8Array): Promise<Uint8Array | null>;
|
|
19
|
+
set(key: Uint8Array, value: Uint8Array): Promise<void>;
|
|
20
|
+
delete(key: Uint8Array): Promise<void>;
|
|
21
|
+
deletePrefix(prefix: Uint8Array): Promise<void>;
|
|
22
|
+
list(prefix: Uint8Array): Promise<KVEntry[]>;
|
|
23
|
+
batch(writes: KVWrite[]): Promise<void>;
|
|
24
|
+
setAlarm(workflowId: string, wakeAt: number): Promise<void>;
|
|
25
|
+
clearAlarm(workflowId: string): Promise<void>;
|
|
26
|
+
waitForMessages(messageNames: string[], abortSignal: AbortSignal): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Get the alarm time for a workflow (for testing).
|
|
29
|
+
*/
|
|
30
|
+
getAlarm(workflowId: string): number | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Check if any alarms are due and return their workflow IDs.
|
|
33
|
+
*/
|
|
34
|
+
getDueAlarms(): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Clear all data (for testing).
|
|
37
|
+
*/
|
|
38
|
+
clear(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Get a snapshot of all data (for testing/debugging).
|
|
41
|
+
*/
|
|
42
|
+
snapshot(): {
|
|
43
|
+
kv: Record<string, Uint8Array>;
|
|
44
|
+
alarms: Record<string, number>;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Get all hex-encoded keys (for testing).
|
|
48
|
+
*/
|
|
49
|
+
keys(): string[];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export { EngineDriver, InMemoryDriver, KVEntry, KVWrite, WorkflowMessageDriver };
|