@rivetkit/workflow-engine 2.1.3 → 2.1.4
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/tsup/{chunk-WA4TXB6Y.js → chunk-JTLDEP6X.js} +20 -5
- package/dist/tsup/chunk-JTLDEP6X.js.map +1 -0
- package/dist/tsup/{chunk-6TTCEQL3.cjs → chunk-KQO2TD7T.cjs} +20 -5
- package/dist/tsup/chunk-KQO2TD7T.cjs.map +1 -0
- package/dist/tsup/index.cjs +2 -2
- package/dist/tsup/index.js +1 -1
- package/dist/tsup/testing.cjs +21 -21
- package/dist/tsup/testing.js +1 -1
- package/package.json +1 -1
- package/src/context.ts +25 -7
- package/dist/tsup/chunk-6TTCEQL3.cjs.map +0 -1
- package/dist/tsup/chunk-WA4TXB6Y.js.map +0 -1
package/dist/tsup/testing.cjs
CHANGED
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
var
|
|
50
|
+
var _chunkKQO2TD7Tcjs = require('./chunk-KQO2TD7T.cjs');
|
|
51
51
|
|
|
52
52
|
// src/testing.ts
|
|
53
53
|
var InMemoryWorkflowMessageDriver = class {
|
|
@@ -95,7 +95,7 @@ var InMemoryWorkflowMessageDriver = class {
|
|
|
95
95
|
}
|
|
96
96
|
async waitForMessages(messageNames, abortSignal) {
|
|
97
97
|
if (abortSignal.aborted) {
|
|
98
|
-
throw new (0,
|
|
98
|
+
throw new (0, _chunkKQO2TD7Tcjs.EvictedError)();
|
|
99
99
|
}
|
|
100
100
|
const nameSet = messageNames.length > 0 ? new Set(messageNames) : void 0;
|
|
101
101
|
if (this.#messages.some(
|
|
@@ -116,7 +116,7 @@ var InMemoryWorkflowMessageDriver = class {
|
|
|
116
116
|
},
|
|
117
117
|
abortSignal,
|
|
118
118
|
onAbort: () => {
|
|
119
|
-
waiter.reject(new (0,
|
|
119
|
+
waiter.reject(new (0, _chunkKQO2TD7Tcjs.EvictedError)());
|
|
120
120
|
}
|
|
121
121
|
};
|
|
122
122
|
abortSignal.addEventListener("abort", waiter.onAbort, { once: true });
|
|
@@ -154,48 +154,48 @@ var InMemoryDriver = (_class = class {constructor() { _class.prototype.__init.ca
|
|
|
154
154
|
__init4() {this.workerPollInterval = 100}
|
|
155
155
|
__init5() {this.messageDriver = this.#inMemoryMessageDriver}
|
|
156
156
|
async get(key) {
|
|
157
|
-
await
|
|
158
|
-
const entry = this.kv.get(
|
|
157
|
+
await _chunkKQO2TD7Tcjs.sleep.call(void 0, this.latency);
|
|
158
|
+
const entry = this.kv.get(_chunkKQO2TD7Tcjs.keyToHex.call(void 0, key));
|
|
159
159
|
return _nullishCoalesce((entry == null ? void 0 : entry.value), () => ( null));
|
|
160
160
|
}
|
|
161
161
|
async set(key, value) {
|
|
162
|
-
await
|
|
163
|
-
this.kv.set(
|
|
162
|
+
await _chunkKQO2TD7Tcjs.sleep.call(void 0, this.latency);
|
|
163
|
+
this.kv.set(_chunkKQO2TD7Tcjs.keyToHex.call(void 0, key), { key, value });
|
|
164
164
|
}
|
|
165
165
|
async delete(key) {
|
|
166
|
-
await
|
|
167
|
-
this.kv.delete(
|
|
166
|
+
await _chunkKQO2TD7Tcjs.sleep.call(void 0, this.latency);
|
|
167
|
+
this.kv.delete(_chunkKQO2TD7Tcjs.keyToHex.call(void 0, key));
|
|
168
168
|
}
|
|
169
169
|
async deletePrefix(prefix) {
|
|
170
|
-
await
|
|
170
|
+
await _chunkKQO2TD7Tcjs.sleep.call(void 0, this.latency);
|
|
171
171
|
for (const [hexKey, entry] of this.kv) {
|
|
172
|
-
if (
|
|
172
|
+
if (_chunkKQO2TD7Tcjs.keyStartsWith.call(void 0, entry.key, prefix)) {
|
|
173
173
|
this.kv.delete(hexKey);
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
176
|
}
|
|
177
177
|
async list(prefix) {
|
|
178
|
-
await
|
|
178
|
+
await _chunkKQO2TD7Tcjs.sleep.call(void 0, this.latency);
|
|
179
179
|
const results = [];
|
|
180
180
|
for (const entry of this.kv.values()) {
|
|
181
|
-
if (
|
|
181
|
+
if (_chunkKQO2TD7Tcjs.keyStartsWith.call(void 0, entry.key, prefix)) {
|
|
182
182
|
results.push({ key: entry.key, value: entry.value });
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
|
-
return results.sort((a, b) =>
|
|
185
|
+
return results.sort((a, b) => _chunkKQO2TD7Tcjs.compareKeys.call(void 0, a.key, b.key));
|
|
186
186
|
}
|
|
187
187
|
async batch(writes) {
|
|
188
|
-
await
|
|
188
|
+
await _chunkKQO2TD7Tcjs.sleep.call(void 0, this.latency);
|
|
189
189
|
for (const { key, value } of writes) {
|
|
190
|
-
this.kv.set(
|
|
190
|
+
this.kv.set(_chunkKQO2TD7Tcjs.keyToHex.call(void 0, key), { key, value });
|
|
191
191
|
}
|
|
192
192
|
}
|
|
193
193
|
async setAlarm(workflowId, wakeAt) {
|
|
194
|
-
await
|
|
194
|
+
await _chunkKQO2TD7Tcjs.sleep.call(void 0, this.latency);
|
|
195
195
|
this.alarms.set(workflowId, wakeAt);
|
|
196
196
|
}
|
|
197
197
|
async clearAlarm(workflowId) {
|
|
198
|
-
await
|
|
198
|
+
await _chunkKQO2TD7Tcjs.sleep.call(void 0, this.latency);
|
|
199
199
|
this.alarms.delete(workflowId);
|
|
200
200
|
}
|
|
201
201
|
async waitForMessages(messageNames, abortSignal) {
|
|
@@ -206,7 +206,7 @@ var InMemoryDriver = (_class = class {constructor() { _class.prototype.__init.ca
|
|
|
206
206
|
}
|
|
207
207
|
while (true) {
|
|
208
208
|
if (abortSignal.aborted) {
|
|
209
|
-
throw new (0,
|
|
209
|
+
throw new (0, _chunkKQO2TD7Tcjs.EvictedError)();
|
|
210
210
|
}
|
|
211
211
|
const messages = await this.messageDriver.receiveMessages({
|
|
212
212
|
names: messageNames.length > 0 ? messageNames : void 0,
|
|
@@ -216,7 +216,7 @@ var InMemoryDriver = (_class = class {constructor() { _class.prototype.__init.ca
|
|
|
216
216
|
if (messages.length > 0) {
|
|
217
217
|
return;
|
|
218
218
|
}
|
|
219
|
-
await
|
|
219
|
+
await _chunkKQO2TD7Tcjs.sleep.call(void 0, Math.max(1, this.latency));
|
|
220
220
|
}
|
|
221
221
|
}
|
|
222
222
|
/**
|
|
@@ -312,5 +312,5 @@ var InMemoryDriver = (_class = class {constructor() { _class.prototype.__init.ca
|
|
|
312
312
|
|
|
313
313
|
|
|
314
314
|
|
|
315
|
-
exports.CancelledError =
|
|
315
|
+
exports.CancelledError = _chunkKQO2TD7Tcjs.CancelledError; exports.CriticalError = _chunkKQO2TD7Tcjs.CriticalError; exports.DEFAULT_LOOP_COMMIT_INTERVAL = _chunkKQO2TD7Tcjs.DEFAULT_LOOP_COMMIT_INTERVAL; exports.DEFAULT_LOOP_HISTORY_EVERY = _chunkKQO2TD7Tcjs.DEFAULT_LOOP_HISTORY_EVERY; exports.DEFAULT_LOOP_HISTORY_KEEP = _chunkKQO2TD7Tcjs.DEFAULT_LOOP_HISTORY_KEEP; exports.DEFAULT_MAX_RETRIES = _chunkKQO2TD7Tcjs.DEFAULT_MAX_RETRIES; exports.DEFAULT_RETRY_BACKOFF_BASE = _chunkKQO2TD7Tcjs.DEFAULT_RETRY_BACKOFF_BASE; exports.DEFAULT_RETRY_BACKOFF_MAX = _chunkKQO2TD7Tcjs.DEFAULT_RETRY_BACKOFF_MAX; exports.DEFAULT_STEP_TIMEOUT = _chunkKQO2TD7Tcjs.DEFAULT_STEP_TIMEOUT; exports.EntryInProgressError = _chunkKQO2TD7Tcjs.EntryInProgressError; exports.EvictedError = _chunkKQO2TD7Tcjs.EvictedError; exports.HistoryDivergedError = _chunkKQO2TD7Tcjs.HistoryDivergedError; exports.InMemoryDriver = InMemoryDriver; exports.JoinError = _chunkKQO2TD7Tcjs.JoinError; exports.Loop = _chunkKQO2TD7Tcjs.Loop; exports.MessageWaitError = _chunkKQO2TD7Tcjs.MessageWaitError; exports.RaceError = _chunkKQO2TD7Tcjs.RaceError; exports.RollbackCheckpointError = _chunkKQO2TD7Tcjs.RollbackCheckpointError; exports.RollbackError = _chunkKQO2TD7Tcjs.RollbackError; exports.SleepError = _chunkKQO2TD7Tcjs.SleepError; exports.StepExhaustedError = _chunkKQO2TD7Tcjs.StepExhaustedError; exports.StepFailedError = _chunkKQO2TD7Tcjs.StepFailedError; exports.WorkflowContextImpl = _chunkKQO2TD7Tcjs.WorkflowContextImpl; exports.appendLoopIteration = _chunkKQO2TD7Tcjs.appendLoopIteration; exports.appendName = _chunkKQO2TD7Tcjs.appendName; exports.createEntry = _chunkKQO2TD7Tcjs.createEntry; exports.createHistorySnapshot = _chunkKQO2TD7Tcjs.createHistorySnapshot; exports.createStorage = _chunkKQO2TD7Tcjs.createStorage; exports.deleteEntriesWithPrefix = _chunkKQO2TD7Tcjs.deleteEntriesWithPrefix; exports.emptyLocation = _chunkKQO2TD7Tcjs.emptyLocation; exports.flush = _chunkKQO2TD7Tcjs.flush; exports.generateId = _chunkKQO2TD7Tcjs.generateId; exports.getEntry = _chunkKQO2TD7Tcjs.getEntry; exports.getOrCreateMetadata = _chunkKQO2TD7Tcjs.getOrCreateMetadata; exports.isLocationPrefix = _chunkKQO2TD7Tcjs.isLocationPrefix; exports.isLoopIterationMarker = _chunkKQO2TD7Tcjs.isLoopIterationMarker; exports.loadMetadata = _chunkKQO2TD7Tcjs.loadMetadata; exports.loadStorage = _chunkKQO2TD7Tcjs.loadStorage; exports.locationToKey = _chunkKQO2TD7Tcjs.locationToKey; exports.locationsEqual = _chunkKQO2TD7Tcjs.locationsEqual; exports.parentLocation = _chunkKQO2TD7Tcjs.parentLocation; exports.registerName = _chunkKQO2TD7Tcjs.registerName; exports.resolveName = _chunkKQO2TD7Tcjs.resolveName; exports.runWorkflow = _chunkKQO2TD7Tcjs.runWorkflow; exports.setEntry = _chunkKQO2TD7Tcjs.setEntry;
|
|
316
316
|
//# sourceMappingURL=testing.cjs.map
|
package/dist/tsup/testing.js
CHANGED
package/package.json
CHANGED
package/src/context.ts
CHANGED
|
@@ -384,18 +384,18 @@ export class WorkflowContextImpl implements WorkflowContextInterface {
|
|
|
384
384
|
|
|
385
385
|
const stepData = existing.kind.data;
|
|
386
386
|
|
|
387
|
-
// Replay successful result
|
|
388
|
-
if (stepData.output !== undefined) {
|
|
389
|
-
this.log("debug", { msg: "replaying step from history", step: config.name, key });
|
|
390
|
-
return stepData.output as T;
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
// Check if we should retry
|
|
394
387
|
const metadata = await loadMetadata(
|
|
395
388
|
this.storage,
|
|
396
389
|
this.driver,
|
|
397
390
|
existing.id,
|
|
398
391
|
);
|
|
392
|
+
|
|
393
|
+
// Replay successful result (including void steps).
|
|
394
|
+
if (metadata.status === "completed" || stepData.output !== undefined) {
|
|
395
|
+
return stepData.output as T;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// Check if we should retry
|
|
399
399
|
const maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
400
400
|
|
|
401
401
|
if (metadata.attempts >= maxRetries) {
|
|
@@ -628,6 +628,7 @@ export class WorkflowContextImpl implements WorkflowContextInterface {
|
|
|
628
628
|
this.markVisited(key);
|
|
629
629
|
|
|
630
630
|
let entry: Entry;
|
|
631
|
+
let metadata: EntryMetadata | undefined;
|
|
631
632
|
let state: S;
|
|
632
633
|
let iteration: number;
|
|
633
634
|
let rollbackSingleIteration = false;
|
|
@@ -643,6 +644,7 @@ export class WorkflowContextImpl implements WorkflowContextInterface {
|
|
|
643
644
|
}
|
|
644
645
|
|
|
645
646
|
const loopData = existing.kind.data;
|
|
647
|
+
metadata = await loadMetadata(this.storage, this.driver, existing.id);
|
|
646
648
|
|
|
647
649
|
if (rollbackMode) {
|
|
648
650
|
if (loopData.output !== undefined) {
|
|
@@ -653,6 +655,10 @@ export class WorkflowContextImpl implements WorkflowContextInterface {
|
|
|
653
655
|
rollbackOutput = undefined;
|
|
654
656
|
}
|
|
655
657
|
|
|
658
|
+
if (metadata.status === "completed") {
|
|
659
|
+
return loopData.output as T;
|
|
660
|
+
}
|
|
661
|
+
|
|
656
662
|
// Loop already completed
|
|
657
663
|
if (loopData.output !== undefined) {
|
|
658
664
|
return loopData.output as T;
|
|
@@ -677,6 +683,13 @@ export class WorkflowContextImpl implements WorkflowContextInterface {
|
|
|
677
683
|
data: { state, iteration },
|
|
678
684
|
});
|
|
679
685
|
setEntry(this.storage, location, entry);
|
|
686
|
+
metadata = getOrCreateMetadata(this.storage, entry.id);
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
if (metadata) {
|
|
690
|
+
metadata.status = "running";
|
|
691
|
+
metadata.error = undefined;
|
|
692
|
+
metadata.dirty = true;
|
|
680
693
|
}
|
|
681
694
|
|
|
682
695
|
// TODO: Add validation for commitInterval (must be > 0)
|
|
@@ -733,6 +746,11 @@ export class WorkflowContextImpl implements WorkflowContextInterface {
|
|
|
733
746
|
entry.kind.data.iteration = iteration;
|
|
734
747
|
}
|
|
735
748
|
entry.dirty = true;
|
|
749
|
+
if (metadata) {
|
|
750
|
+
metadata.status = "completed";
|
|
751
|
+
metadata.completedAt = Date.now();
|
|
752
|
+
metadata.dirty = true;
|
|
753
|
+
}
|
|
736
754
|
|
|
737
755
|
await this.flushStorage();
|
|
738
756
|
await this.forgetOldIterations(
|