@rivetkit/workflow-engine 0.0.0-feat-workflows-public-host-apis.1550fe4 → 0.0.0-feat-sqlite-sync.32022a9

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.
@@ -163,6 +163,7 @@ var KEY_PREFIX = {
163
163
  // Workflow metadata: [3, field]
164
164
  ENTRY_METADATA: 4
165
165
  // Entry metadata: [4, entryId]
166
+ // 5 is reserved for RivetKit's workflow trace context.
166
167
  };
167
168
  var WORKFLOW_FIELD = {
168
169
  STATE: 1,
@@ -1437,6 +1438,7 @@ function deserializeName(bytes) {
1437
1438
  // src/storage.ts
1438
1439
  var MAX_KV_BATCH_ENTRIES = 128;
1439
1440
  var MAX_KV_BATCH_PAYLOAD_BYTES = 976 * 1024;
1441
+ var MAX_CONCURRENT_DELETES = 64;
1440
1442
  function createStorage() {
1441
1443
  return {
1442
1444
  nameRegistry: [],
@@ -1616,18 +1618,8 @@ async function flush(storage, driver, onHistoryUpdated, pendingDeletions) {
1616
1618
  }
1617
1619
  }
1618
1620
  if (pendingDeletions) {
1619
- const deleteOps = [];
1620
- for (const prefix of pendingDeletions.prefixes) {
1621
- deleteOps.push(driver.deletePrefix(prefix));
1622
- }
1623
- for (const range of pendingDeletions.ranges) {
1624
- deleteOps.push(driver.deleteRange(range.start, range.end));
1625
- }
1626
- for (const key of pendingDeletions.keys) {
1627
- deleteOps.push(driver.delete(key));
1628
- }
1629
- if (deleteOps.length > 0) {
1630
- await Promise.all(deleteOps);
1621
+ const didChange = await runDeletes(driver, pendingDeletions);
1622
+ if (didChange) {
1631
1623
  historyUpdated = true;
1632
1624
  }
1633
1625
  }
@@ -1669,10 +1661,38 @@ function splitBatchWrites(writes) {
1669
1661
  }
1670
1662
  return chunks;
1671
1663
  }
1664
+ function splitBatchDeletes(keys) {
1665
+ const chunks = [];
1666
+ for (let i = 0; i < keys.length; i += MAX_KV_BATCH_ENTRIES) {
1667
+ chunks.push(keys.slice(i, i + MAX_KV_BATCH_ENTRIES));
1668
+ }
1669
+ return chunks;
1670
+ }
1671
+ async function runDeletes(driver, deletions) {
1672
+ const ops = [
1673
+ ...deletions.prefixes.map(
1674
+ (prefix) => () => driver.deletePrefix(prefix)
1675
+ ),
1676
+ ...deletions.ranges.map(
1677
+ (range) => () => driver.deleteRange(range.start, range.end)
1678
+ ),
1679
+ ...splitBatchDeletes(deletions.keys).map(
1680
+ (chunk) => () => driver.batchDelete(chunk)
1681
+ )
1682
+ ];
1683
+ if (ops.length === 0) {
1684
+ return false;
1685
+ }
1686
+ for (let i = 0; i < ops.length; i += MAX_CONCURRENT_DELETES) {
1687
+ await Promise.all(
1688
+ ops.slice(i, i + MAX_CONCURRENT_DELETES).map((op) => op())
1689
+ );
1690
+ }
1691
+ return true;
1692
+ }
1672
1693
  async function deleteEntriesWithPrefix(storage, driver, prefixLocation, onHistoryUpdated) {
1673
1694
  const deletions = collectDeletionsForPrefix(storage, prefixLocation);
1674
- await driver.deletePrefix(deletions.prefixes[0]);
1675
- await Promise.all(deletions.keys.map((key) => driver.delete(key)));
1695
+ await runDeletes(driver, deletions);
1676
1696
  if (deletions.keys.length > 0 && onHistoryUpdated) {
1677
1697
  onHistoryUpdated();
1678
1698
  }
@@ -1854,7 +1874,7 @@ function selectControlFlowError(current, candidate) {
1854
1874
  return controlFlowErrorPriority(candidate) < controlFlowErrorPriority(current) ? candidate : current;
1855
1875
  }
1856
1876
  var WorkflowContextImpl = class _WorkflowContextImpl {
1857
- constructor(workflowId, storage, driver, messageDriver, location = emptyLocation(), abortController, mode = "forward", rollbackActions, rollbackCheckpointSet = false, historyNotifier, onError, logger, visitedKeys) {
1877
+ constructor(workflowId, storage, driver, messageDriver, location = emptyLocation(), abortController, mode = "forward", rollbackActions, rollbackCheckpointSet = false, historyNotifier, onError, logger, visitedKeys, runSpan) {
1858
1878
  this.workflowId = workflowId;
1859
1879
  this.storage = storage;
1860
1880
  this.driver = driver;
@@ -1868,11 +1888,13 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
1868
1888
  this.onError = onError;
1869
1889
  this.logger = logger;
1870
1890
  this.visitedKeys = visitedKeys ?? /* @__PURE__ */ new Set();
1891
+ this.runSpan = runSpan;
1871
1892
  }
1872
1893
  entryInProgress = false;
1873
1894
  abortController;
1874
1895
  currentLocation;
1875
1896
  visitedKeys;
1897
+ runSpan;
1876
1898
  mode;
1877
1899
  rollbackActions;
1878
1900
  rollbackCheckpointSet;
@@ -1925,7 +1947,8 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
1925
1947
  this.historyNotifier,
1926
1948
  this.onError,
1927
1949
  this.logger,
1928
- this.visitedKeys
1950
+ this.visitedKeys,
1951
+ this.runSpan
1929
1952
  );
1930
1953
  }
1931
1954
  /**
@@ -2192,6 +2215,7 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
2192
2215
  }
2193
2216
  }
2194
2217
  async executeStep(config2) {
2218
+ var _a;
2195
2219
  this.ensureRollbackCheckpoint(config2);
2196
2220
  if (this.mode === "rollback") {
2197
2221
  return await this.executeStepRollback(config2);
@@ -2283,9 +2307,13 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
2283
2307
  metadata.lastAttemptAt = Date.now();
2284
2308
  metadata.dirty = true;
2285
2309
  const timeout = config2.timeout ?? DEFAULT_STEP_TIMEOUT;
2310
+ const stepSpan = (_a = this.runSpan) == null ? void 0 : _a.startStep(
2311
+ config2.name,
2312
+ metadata.attempts
2313
+ );
2286
2314
  try {
2287
2315
  const output = await this.executeWithTimeout(
2288
- config2.run(),
2316
+ stepSpan ? stepSpan.run(() => config2.run()) : config2.run(),
2289
2317
  timeout,
2290
2318
  config2.name
2291
2319
  );
@@ -2304,6 +2332,7 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
2304
2332
  });
2305
2333
  await this.flushStorage();
2306
2334
  }
2335
+ stepSpan == null ? void 0 : stepSpan.finish("ok");
2307
2336
  this.log("debug", {
2308
2337
  msg: "step completed",
2309
2338
  step: config2.name,
@@ -2316,6 +2345,7 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
2316
2345
  }
2317
2346
  entry.dirty = true;
2318
2347
  if (error instanceof StepTimeoutError && !config2.retryOnTimeout) {
2348
+ stepSpan == null ? void 0 : stepSpan.finish("failed", error);
2319
2349
  metadata.status = "exhausted";
2320
2350
  metadata.error = String(error);
2321
2351
  await this.notifyStepError(config2, metadata.attempts, error, {
@@ -2331,6 +2361,7 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
2331
2361
  );
2332
2362
  }
2333
2363
  if (error instanceof CriticalError || error instanceof RollbackError) {
2364
+ stepSpan == null ? void 0 : stepSpan.finish("failed", error);
2334
2365
  metadata.status = "exhausted";
2335
2366
  metadata.error = String(error);
2336
2367
  await this.notifyStepError(config2, metadata.attempts, error, {
@@ -2346,6 +2377,7 @@ var WorkflowContextImpl = class _WorkflowContextImpl {
2346
2377
  );
2347
2378
  }
2348
2379
  const willRetry = metadata.attempts <= maxRetries;
2380
+ stepSpan == null ? void 0 : stepSpan.finish(willRetry ? "retry" : "failed", error);
2349
2381
  metadata.status = willRetry ? "failed" : "exhausted";
2350
2382
  metadata.error = String(error);
2351
2383
  if (willRetry) {
@@ -3665,7 +3697,7 @@ async function awaitWithEviction(promise, abortSignal) {
3665
3697
  cleanup();
3666
3698
  }
3667
3699
  }
3668
- async function executeRollback(workflowId, workflowFn, input, driver, messageDriver, abortController, storage, historyNotifier, onError, logger) {
3700
+ async function executeRollback(workflowId, workflowFn, input, driver, messageDriver, abortController, storage, historyNotifier, onError, logger, runSpan) {
3669
3701
  const rollbackActions = [];
3670
3702
  const ctx = new WorkflowContextImpl(
3671
3703
  workflowId,
@@ -3679,7 +3711,9 @@ async function executeRollback(workflowId, workflowFn, input, driver, messageDri
3679
3711
  false,
3680
3712
  historyNotifier,
3681
3713
  onError,
3682
- logger
3714
+ logger,
3715
+ void 0,
3716
+ runSpan
3683
3717
  );
3684
3718
  try {
3685
3719
  await workflowFn(ctx, input);
@@ -3815,16 +3849,20 @@ async function waitForSleep(runtime, deadline, abortSignal) {
3815
3849
  async function executeLiveWorkflow(workflowId, workflowFn, input, driver, messageDriver, abortController, runtime, onHistoryUpdated, onError, logger) {
3816
3850
  let lastResult;
3817
3851
  while (true) {
3818
- const result = await executeWorkflow(
3819
- workflowId,
3820
- workflowFn,
3821
- input,
3852
+ const result = await traceRun(
3822
3853
  driver,
3823
- messageDriver,
3824
- abortController,
3825
- onHistoryUpdated,
3826
- onError,
3827
- logger
3854
+ (runSpan) => executeWorkflow(
3855
+ workflowId,
3856
+ workflowFn,
3857
+ input,
3858
+ driver,
3859
+ messageDriver,
3860
+ abortController,
3861
+ onHistoryUpdated,
3862
+ onError,
3863
+ logger,
3864
+ runSpan
3865
+ )
3828
3866
  );
3829
3867
  lastResult = result;
3830
3868
  if (result.state !== "sleeping") {
@@ -3923,16 +3961,20 @@ function runWorkflow(workflowId, workflowFn, input, driver, options = {}) {
3923
3961
  options.onHistoryUpdated,
3924
3962
  options.onError,
3925
3963
  logger
3926
- ) : executeWorkflow(
3927
- workflowId,
3928
- workflowFn,
3929
- input,
3964
+ ) : traceRun(
3930
3965
  driver,
3931
- messageDriver,
3932
- abortController,
3933
- options.onHistoryUpdated,
3934
- options.onError,
3935
- logger
3966
+ (runSpan) => executeWorkflow(
3967
+ workflowId,
3968
+ workflowFn,
3969
+ input,
3970
+ driver,
3971
+ messageDriver,
3972
+ abortController,
3973
+ options.onHistoryUpdated,
3974
+ options.onError,
3975
+ logger,
3976
+ runSpan
3977
+ )
3936
3978
  );
3937
3979
  return {
3938
3980
  workflowId,
@@ -4108,7 +4150,42 @@ function findReplayBoundaryEntry(entries, target) {
4108
4150
  }
4109
4151
  return boundary;
4110
4152
  }
4111
- async function executeWorkflow(workflowId, workflowFn, input, driver, messageDriver, abortController, onHistoryUpdated, onError, logger) {
4153
+ function runOutcomeFromState(state) {
4154
+ switch (state) {
4155
+ case "completed":
4156
+ return "completed";
4157
+ case "sleeping":
4158
+ return "sleeping";
4159
+ case "failed":
4160
+ return "failed";
4161
+ case "cancelled":
4162
+ return "cancelled";
4163
+ case "pending":
4164
+ case "running":
4165
+ case "rolling_back":
4166
+ return "evicted";
4167
+ }
4168
+ }
4169
+ async function traceRun(driver, run) {
4170
+ if (!driver.telemetry) {
4171
+ return await run();
4172
+ }
4173
+ const span = await driver.telemetry.startSpan();
4174
+ let outcome = "failed";
4175
+ try {
4176
+ const result = await span.run(() => run(span));
4177
+ outcome = runOutcomeFromState(result.state);
4178
+ return result;
4179
+ } catch (error) {
4180
+ if (error instanceof EvictedError) {
4181
+ outcome = "cancelled";
4182
+ }
4183
+ throw error;
4184
+ } finally {
4185
+ await span.finish(outcome);
4186
+ }
4187
+ }
4188
+ async function executeWorkflow(workflowId, workflowFn, input, driver, messageDriver, abortController, onHistoryUpdated, onError, logger, runSpan) {
4112
4189
  var _a;
4113
4190
  const storage = await loadStorage(driver);
4114
4191
  const historyNotifier = onHistoryUpdated ? () => onHistoryUpdated(createHistorySnapshot(storage)) : void 0;
@@ -4151,7 +4228,8 @@ async function executeWorkflow(workflowId, workflowFn, input, driver, messageDri
4151
4228
  storage,
4152
4229
  historyNotifier,
4153
4230
  onError,
4154
- logger
4231
+ logger,
4232
+ runSpan
4155
4233
  );
4156
4234
  } catch (error) {
4157
4235
  if (error instanceof EvictedError) {
@@ -4179,7 +4257,9 @@ async function executeWorkflow(workflowId, workflowFn, input, driver, messageDri
4179
4257
  false,
4180
4258
  historyNotifier,
4181
4259
  onError,
4182
- logger
4260
+ logger,
4261
+ void 0,
4262
+ runSpan
4183
4263
  );
4184
4264
  storage.state = "running";
4185
4265
  try {
@@ -4246,7 +4326,8 @@ async function executeWorkflow(workflowId, workflowFn, input, driver, messageDri
4246
4326
  storage,
4247
4327
  historyNotifier,
4248
4328
  onError,
4249
- logger
4329
+ logger,
4330
+ runSpan
4250
4331
  );
4251
4332
  } catch (rollbackError) {
4252
4333
  if (rollbackError instanceof EvictedError) {
@@ -4321,4 +4402,4 @@ export {
4321
4402
  runWorkflow,
4322
4403
  replayWorkflowFromStep
4323
4404
  };
4324
- //# sourceMappingURL=chunk-DTS4S7RT.js.map
4405
+ //# sourceMappingURL=chunk-AAAPEYGX.js.map