@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.
@@ -47,7 +47,7 @@
47
47
 
48
48
 
49
49
 
50
- var _chunk6TTCEQL3cjs = require('./chunk-6TTCEQL3.cjs');
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, _chunk6TTCEQL3cjs.EvictedError)();
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, _chunk6TTCEQL3cjs.EvictedError)());
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 _chunk6TTCEQL3cjs.sleep.call(void 0, this.latency);
158
- const entry = this.kv.get(_chunk6TTCEQL3cjs.keyToHex.call(void 0, key));
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 _chunk6TTCEQL3cjs.sleep.call(void 0, this.latency);
163
- this.kv.set(_chunk6TTCEQL3cjs.keyToHex.call(void 0, key), { key, value });
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 _chunk6TTCEQL3cjs.sleep.call(void 0, this.latency);
167
- this.kv.delete(_chunk6TTCEQL3cjs.keyToHex.call(void 0, key));
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 _chunk6TTCEQL3cjs.sleep.call(void 0, this.latency);
170
+ await _chunkKQO2TD7Tcjs.sleep.call(void 0, this.latency);
171
171
  for (const [hexKey, entry] of this.kv) {
172
- if (_chunk6TTCEQL3cjs.keyStartsWith.call(void 0, entry.key, prefix)) {
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 _chunk6TTCEQL3cjs.sleep.call(void 0, this.latency);
178
+ await _chunkKQO2TD7Tcjs.sleep.call(void 0, this.latency);
179
179
  const results = [];
180
180
  for (const entry of this.kv.values()) {
181
- if (_chunk6TTCEQL3cjs.keyStartsWith.call(void 0, entry.key, prefix)) {
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) => _chunk6TTCEQL3cjs.compareKeys.call(void 0, a.key, b.key));
185
+ return results.sort((a, b) => _chunkKQO2TD7Tcjs.compareKeys.call(void 0, a.key, b.key));
186
186
  }
187
187
  async batch(writes) {
188
- await _chunk6TTCEQL3cjs.sleep.call(void 0, this.latency);
188
+ await _chunkKQO2TD7Tcjs.sleep.call(void 0, this.latency);
189
189
  for (const { key, value } of writes) {
190
- this.kv.set(_chunk6TTCEQL3cjs.keyToHex.call(void 0, key), { key, value });
190
+ this.kv.set(_chunkKQO2TD7Tcjs.keyToHex.call(void 0, key), { key, value });
191
191
  }
192
192
  }
193
193
  async setAlarm(workflowId, wakeAt) {
194
- await _chunk6TTCEQL3cjs.sleep.call(void 0, this.latency);
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 _chunk6TTCEQL3cjs.sleep.call(void 0, this.latency);
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, _chunk6TTCEQL3cjs.EvictedError)();
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 _chunk6TTCEQL3cjs.sleep.call(void 0, Math.max(1, this.latency));
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 = _chunk6TTCEQL3cjs.CancelledError; exports.CriticalError = _chunk6TTCEQL3cjs.CriticalError; exports.DEFAULT_LOOP_COMMIT_INTERVAL = _chunk6TTCEQL3cjs.DEFAULT_LOOP_COMMIT_INTERVAL; exports.DEFAULT_LOOP_HISTORY_EVERY = _chunk6TTCEQL3cjs.DEFAULT_LOOP_HISTORY_EVERY; exports.DEFAULT_LOOP_HISTORY_KEEP = _chunk6TTCEQL3cjs.DEFAULT_LOOP_HISTORY_KEEP; exports.DEFAULT_MAX_RETRIES = _chunk6TTCEQL3cjs.DEFAULT_MAX_RETRIES; exports.DEFAULT_RETRY_BACKOFF_BASE = _chunk6TTCEQL3cjs.DEFAULT_RETRY_BACKOFF_BASE; exports.DEFAULT_RETRY_BACKOFF_MAX = _chunk6TTCEQL3cjs.DEFAULT_RETRY_BACKOFF_MAX; exports.DEFAULT_STEP_TIMEOUT = _chunk6TTCEQL3cjs.DEFAULT_STEP_TIMEOUT; exports.EntryInProgressError = _chunk6TTCEQL3cjs.EntryInProgressError; exports.EvictedError = _chunk6TTCEQL3cjs.EvictedError; exports.HistoryDivergedError = _chunk6TTCEQL3cjs.HistoryDivergedError; exports.InMemoryDriver = InMemoryDriver; exports.JoinError = _chunk6TTCEQL3cjs.JoinError; exports.Loop = _chunk6TTCEQL3cjs.Loop; exports.MessageWaitError = _chunk6TTCEQL3cjs.MessageWaitError; exports.RaceError = _chunk6TTCEQL3cjs.RaceError; exports.RollbackCheckpointError = _chunk6TTCEQL3cjs.RollbackCheckpointError; exports.RollbackError = _chunk6TTCEQL3cjs.RollbackError; exports.SleepError = _chunk6TTCEQL3cjs.SleepError; exports.StepExhaustedError = _chunk6TTCEQL3cjs.StepExhaustedError; exports.StepFailedError = _chunk6TTCEQL3cjs.StepFailedError; exports.WorkflowContextImpl = _chunk6TTCEQL3cjs.WorkflowContextImpl; exports.appendLoopIteration = _chunk6TTCEQL3cjs.appendLoopIteration; exports.appendName = _chunk6TTCEQL3cjs.appendName; exports.createEntry = _chunk6TTCEQL3cjs.createEntry; exports.createHistorySnapshot = _chunk6TTCEQL3cjs.createHistorySnapshot; exports.createStorage = _chunk6TTCEQL3cjs.createStorage; exports.deleteEntriesWithPrefix = _chunk6TTCEQL3cjs.deleteEntriesWithPrefix; exports.emptyLocation = _chunk6TTCEQL3cjs.emptyLocation; exports.flush = _chunk6TTCEQL3cjs.flush; exports.generateId = _chunk6TTCEQL3cjs.generateId; exports.getEntry = _chunk6TTCEQL3cjs.getEntry; exports.getOrCreateMetadata = _chunk6TTCEQL3cjs.getOrCreateMetadata; exports.isLocationPrefix = _chunk6TTCEQL3cjs.isLocationPrefix; exports.isLoopIterationMarker = _chunk6TTCEQL3cjs.isLoopIterationMarker; exports.loadMetadata = _chunk6TTCEQL3cjs.loadMetadata; exports.loadStorage = _chunk6TTCEQL3cjs.loadStorage; exports.locationToKey = _chunk6TTCEQL3cjs.locationToKey; exports.locationsEqual = _chunk6TTCEQL3cjs.locationsEqual; exports.parentLocation = _chunk6TTCEQL3cjs.parentLocation; exports.registerName = _chunk6TTCEQL3cjs.registerName; exports.resolveName = _chunk6TTCEQL3cjs.resolveName; exports.runWorkflow = _chunk6TTCEQL3cjs.runWorkflow; exports.setEntry = _chunk6TTCEQL3cjs.setEntry;
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
@@ -47,7 +47,7 @@ import {
47
47
  runWorkflow,
48
48
  setEntry,
49
49
  sleep
50
- } from "./chunk-WA4TXB6Y.js";
50
+ } from "./chunk-JTLDEP6X.js";
51
51
 
52
52
  // src/testing.ts
53
53
  var InMemoryWorkflowMessageDriver = class {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rivetkit/workflow-engine",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
4
4
  "description": "Durable workflow engine with reentrant execution",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [
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(