@rivetkit/workflow-engine 2.3.0 → 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.
@@ -1664,30 +1664,6 @@ function setEntry(storage, location, entry) {
1664
1664
  storage.history.entries.set(key, entry);
1665
1665
  }
1666
1666
 
1667
- // src/utils.ts
1668
- function sleep(ms) {
1669
- return new Promise((resolve) => setTimeout(resolve, ms));
1670
- }
1671
- var TIMEOUT_MAX = 2147483647;
1672
- function setLongTimeout(listener, after) {
1673
- let timeout;
1674
- function start(remaining) {
1675
- if (remaining <= TIMEOUT_MAX) {
1676
- timeout = setTimeout(listener, remaining);
1677
- } else {
1678
- timeout = setTimeout(() => {
1679
- start(remaining - TIMEOUT_MAX);
1680
- }, TIMEOUT_MAX);
1681
- }
1682
- }
1683
- start(after);
1684
- return {
1685
- abort: () => {
1686
- if (timeout !== void 0) clearTimeout(timeout);
1687
- }
1688
- };
1689
- }
1690
-
1691
1667
  // src/context.ts
1692
1668
  var DEFAULT_MAX_RETRIES = 3;
1693
1669
  var DEFAULT_RETRY_BACKOFF_BASE = 100;
@@ -2034,25 +2010,33 @@ var WorkflowContextImpl = (_class = class _WorkflowContextImpl {
2034
2010
  this.abortController.abort(new EvictedError());
2035
2011
  }
2036
2012
  /**
2037
- * Wait for eviction message.
2038
- *
2039
- * The event listener uses { once: true } to auto-remove after firing,
2040
- * preventing memory leaks if this method is called multiple times.
2013
+ * Wait for `ms`, rejecting early with EvictedError if the workflow is
2014
+ * evicted. Both the timer and the abort listener are torn down on either
2015
+ * outcome, so a completed sleep never leaves a dangling listener on the
2016
+ * long-lived run abort signal.
2041
2017
  */
2042
- waitForEviction() {
2043
- return new Promise((_, reject) => {
2044
- if (this.abortSignal.aborted) {
2045
- reject(new EvictedError());
2046
- return;
2018
+ async sleepOrEvict(ms) {
2019
+ if (this.abortSignal.aborted) {
2020
+ throw new EvictedError();
2021
+ }
2022
+ let timer;
2023
+ let onAbort;
2024
+ try {
2025
+ await new Promise((resolve, reject) => {
2026
+ timer = setTimeout(resolve, ms);
2027
+ onAbort = () => reject(new EvictedError());
2028
+ this.abortSignal.addEventListener("abort", onAbort, {
2029
+ once: true
2030
+ });
2031
+ });
2032
+ } finally {
2033
+ if (timer !== void 0) {
2034
+ clearTimeout(timer);
2047
2035
  }
2048
- this.abortSignal.addEventListener(
2049
- "abort",
2050
- () => {
2051
- reject(new EvictedError());
2052
- },
2053
- { once: true }
2054
- );
2055
- });
2036
+ if (onAbort) {
2037
+ this.abortSignal.removeEventListener("abort", onAbort);
2038
+ }
2039
+ }
2056
2040
  }
2057
2041
  // === Step ===
2058
2042
  async step(nameOrConfig, run) {
@@ -2695,7 +2679,7 @@ var WorkflowContextImpl = (_class = class _WorkflowContextImpl {
2695
2679
  return;
2696
2680
  }
2697
2681
  if (remaining < this.driver.workerPollInterval) {
2698
- await Promise.race([sleep(remaining), this.waitForEviction()]);
2682
+ await this.sleepOrEvict(remaining);
2699
2683
  this.checkEvicted();
2700
2684
  if (entry.kind.type === "sleep") {
2701
2685
  entry.kind.data.state = "completed";
@@ -3506,6 +3490,30 @@ var WorkflowContextImpl = (_class = class _WorkflowContextImpl {
3506
3490
  }
3507
3491
  }, _class);
3508
3492
 
3493
+ // src/utils.ts
3494
+ function sleep(ms) {
3495
+ return new Promise((resolve) => setTimeout(resolve, ms));
3496
+ }
3497
+ var TIMEOUT_MAX = 2147483647;
3498
+ function setLongTimeout(listener, after) {
3499
+ let timeout;
3500
+ function start(remaining) {
3501
+ if (remaining <= TIMEOUT_MAX) {
3502
+ timeout = setTimeout(listener, remaining);
3503
+ } else {
3504
+ timeout = setTimeout(() => {
3505
+ start(remaining - TIMEOUT_MAX);
3506
+ }, TIMEOUT_MAX);
3507
+ }
3508
+ }
3509
+ start(after);
3510
+ return {
3511
+ abort: () => {
3512
+ if (timeout !== void 0) clearTimeout(timeout);
3513
+ }
3514
+ };
3515
+ }
3516
+
3509
3517
  // src/index.ts
3510
3518
  var Loop = {
3511
3519
  continue: (state) => ({
@@ -3729,25 +3737,41 @@ async function executeLiveWorkflow(workflowId, workflowFn, input, driver, messag
3729
3737
  const hasMessages = result.waitingForMessages !== void 0;
3730
3738
  const hasDeadline = result.sleepUntil !== void 0;
3731
3739
  if (hasMessages && hasDeadline) {
3740
+ const iterationAbort = new AbortController();
3741
+ const onRunAbort = () => iterationAbort.abort();
3742
+ if (abortController.signal.aborted) {
3743
+ iterationAbort.abort();
3744
+ } else {
3745
+ abortController.signal.addEventListener("abort", onRunAbort, {
3746
+ once: true
3747
+ });
3748
+ }
3749
+ const messagePromise = awaitWithEviction(
3750
+ driver.waitForMessages(
3751
+ result.waitingForMessages,
3752
+ iterationAbort.signal
3753
+ ),
3754
+ iterationAbort.signal
3755
+ );
3756
+ const sleepPromise = waitForSleep(
3757
+ runtime,
3758
+ result.sleepUntil,
3759
+ iterationAbort.signal
3760
+ );
3761
+ messagePromise.catch(() => {
3762
+ });
3763
+ sleepPromise.catch(() => {
3764
+ });
3732
3765
  try {
3733
- const messagePromise = awaitWithEviction(
3734
- driver.waitForMessages(
3735
- result.waitingForMessages,
3736
- abortController.signal
3737
- ),
3738
- abortController.signal
3739
- );
3740
- const sleepPromise = waitForSleep(
3741
- runtime,
3742
- result.sleepUntil,
3743
- abortController.signal
3744
- );
3745
3766
  await Promise.race([messagePromise, sleepPromise]);
3746
3767
  } catch (error) {
3747
3768
  if (error instanceof EvictedError) {
3748
3769
  return lastResult;
3749
3770
  }
3750
3771
  throw error;
3772
+ } finally {
3773
+ iterationAbort.abort();
3774
+ abortController.signal.removeEventListener("abort", onRunAbort);
3751
3775
  }
3752
3776
  continue;
3753
3777
  }
@@ -4200,5 +4224,5 @@ async function executeWorkflow(workflowId, workflowFn, input, driver, messageDri
4200
4224
 
4201
4225
 
4202
4226
 
4203
- exports.extractErrorInfo = extractErrorInfo; exports.CriticalError = CriticalError; exports.RollbackError = RollbackError; exports.RollbackCheckpointError = RollbackCheckpointError; exports.SleepError = SleepError; exports.MessageWaitError = MessageWaitError; exports.EvictedError = EvictedError; exports.HistoryDivergedError = HistoryDivergedError; exports.StepExhaustedError = StepExhaustedError; exports.StepFailedError = StepFailedError; exports.JoinError = JoinError; exports.RaceError = RaceError; exports.CancelledError = CancelledError; exports.EntryInProgressError = EntryInProgressError; exports.keyStartsWith = keyStartsWith; exports.compareKeys = compareKeys; exports.keyToHex = keyToHex; exports.isLoopIterationMarker = isLoopIterationMarker; exports.registerName = registerName; exports.resolveName = resolveName; exports.locationToKey = locationToKey; exports.appendName = appendName; exports.appendLoopIteration = appendLoopIteration; exports.emptyLocation = emptyLocation; exports.parentLocation = parentLocation; exports.isLocationPrefix = isLocationPrefix; exports.locationsEqual = locationsEqual; exports.createStorage = createStorage; exports.createHistorySnapshot = createHistorySnapshot; exports.generateId = generateId; exports.createEntry = createEntry; exports.getOrCreateMetadata = getOrCreateMetadata; exports.loadStorage = loadStorage; exports.loadMetadata = loadMetadata; exports.flush = flush; exports.deleteEntriesWithPrefix = deleteEntriesWithPrefix; exports.getEntry = getEntry; exports.setEntry = setEntry; exports.sleep = sleep; exports.DEFAULT_MAX_RETRIES = DEFAULT_MAX_RETRIES; exports.DEFAULT_RETRY_BACKOFF_BASE = DEFAULT_RETRY_BACKOFF_BASE; exports.DEFAULT_RETRY_BACKOFF_MAX = DEFAULT_RETRY_BACKOFF_MAX; exports.DEFAULT_LOOP_HISTORY_PRUNE_INTERVAL = DEFAULT_LOOP_HISTORY_PRUNE_INTERVAL; exports.DEFAULT_STEP_TIMEOUT = DEFAULT_STEP_TIMEOUT; exports.WorkflowContextImpl = WorkflowContextImpl; exports.Loop = Loop; exports.runWorkflow = runWorkflow; exports.replayWorkflowFromStep = replayWorkflowFromStep;
4204
- //# sourceMappingURL=chunk-U2W3KHJC.cjs.map
4227
+ exports.extractErrorInfo = extractErrorInfo; exports.CriticalError = CriticalError; exports.RollbackError = RollbackError; exports.RollbackCheckpointError = RollbackCheckpointError; exports.SleepError = SleepError; exports.MessageWaitError = MessageWaitError; exports.EvictedError = EvictedError; exports.HistoryDivergedError = HistoryDivergedError; exports.StepExhaustedError = StepExhaustedError; exports.StepFailedError = StepFailedError; exports.JoinError = JoinError; exports.RaceError = RaceError; exports.CancelledError = CancelledError; exports.EntryInProgressError = EntryInProgressError; exports.keyStartsWith = keyStartsWith; exports.compareKeys = compareKeys; exports.keyToHex = keyToHex; exports.isLoopIterationMarker = isLoopIterationMarker; exports.registerName = registerName; exports.resolveName = resolveName; exports.locationToKey = locationToKey; exports.appendName = appendName; exports.appendLoopIteration = appendLoopIteration; exports.emptyLocation = emptyLocation; exports.parentLocation = parentLocation; exports.isLocationPrefix = isLocationPrefix; exports.locationsEqual = locationsEqual; exports.createStorage = createStorage; exports.createHistorySnapshot = createHistorySnapshot; exports.generateId = generateId; exports.createEntry = createEntry; exports.getOrCreateMetadata = getOrCreateMetadata; exports.loadStorage = loadStorage; exports.loadMetadata = loadMetadata; exports.flush = flush; exports.deleteEntriesWithPrefix = deleteEntriesWithPrefix; exports.getEntry = getEntry; exports.setEntry = setEntry; exports.DEFAULT_MAX_RETRIES = DEFAULT_MAX_RETRIES; exports.DEFAULT_RETRY_BACKOFF_BASE = DEFAULT_RETRY_BACKOFF_BASE; exports.DEFAULT_RETRY_BACKOFF_MAX = DEFAULT_RETRY_BACKOFF_MAX; exports.DEFAULT_LOOP_HISTORY_PRUNE_INTERVAL = DEFAULT_LOOP_HISTORY_PRUNE_INTERVAL; exports.DEFAULT_STEP_TIMEOUT = DEFAULT_STEP_TIMEOUT; exports.WorkflowContextImpl = WorkflowContextImpl; exports.sleep = sleep; exports.Loop = Loop; exports.runWorkflow = runWorkflow; exports.replayWorkflowFromStep = replayWorkflowFromStep;
4228
+ //# sourceMappingURL=chunk-GQWOLYBA.cjs.map