@rivetkit/workflow-engine 0.0.0-feat-workflows-public-host-apis.1550fe4 → 0.0.0-feat-sqlite-sync.18dce02
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-DTS4S7RT.js → chunk-AAAPEYGX.js} +123 -42
- package/dist/tsup/chunk-AAAPEYGX.js.map +1 -0
- package/dist/tsup/{chunk-KLHCG2KY.cjs → chunk-XRITRTKT.cjs} +123 -42
- package/dist/tsup/chunk-XRITRTKT.cjs.map +1 -0
- package/dist/tsup/index.cjs +2 -2
- package/dist/tsup/index.cjs.map +1 -1
- package/dist/tsup/index.d.cts +36 -2
- package/dist/tsup/index.d.ts +36 -2
- package/dist/tsup/index.js +1 -1
- package/dist/tsup/testing.cjs +29 -23
- package/dist/tsup/testing.cjs.map +1 -1
- package/dist/tsup/testing.d.cts +2 -1
- package/dist/tsup/testing.d.ts +2 -1
- package/dist/tsup/testing.js +7 -1
- package/dist/tsup/testing.js.map +1 -1
- package/package.json +2 -2
- package/src/context.ts +15 -2
- package/src/driver.ts +45 -0
- package/src/index.ts +88 -22
- package/src/keys.ts +1 -0
- package/src/storage.ts +46 -14
- package/src/testing.ts +7 -0
- package/dist/tsup/chunk-DTS4S7RT.js.map +0 -1
- package/dist/tsup/chunk-KLHCG2KY.cjs.map +0 -1
|
@@ -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
|
|
1620
|
-
|
|
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
|
|
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 = class _WorkflowContextImpl {
|
|
1857
|
-
constructor(workflowId, storage, driver, messageDriver, location = emptyLocation(), abortController, mode = "forward", rollbackActions, rollbackCheckpointSet = false, historyNotifier, onError, logger, visitedKeys) {;_class.prototype.__init.call(this);_class.prototype.__init2.call(this);_class.prototype.__init3.call(this);
|
|
1877
|
+
constructor(workflowId, storage, driver, messageDriver, location = emptyLocation(), abortController, mode = "forward", rollbackActions, rollbackCheckpointSet = false, historyNotifier, onError, logger, visitedKeys, runSpan) {;_class.prototype.__init.call(this);_class.prototype.__init2.call(this);_class.prototype.__init3.call(this);
|
|
1858
1878
|
this.workflowId = workflowId;
|
|
1859
1879
|
this.storage = storage;
|
|
1860
1880
|
this.driver = driver;
|
|
@@ -1868,6 +1888,7 @@ var WorkflowContextImpl = (_class = class _WorkflowContextImpl {
|
|
|
1868
1888
|
this.onError = onError;
|
|
1869
1889
|
this.logger = logger;
|
|
1870
1890
|
this.visitedKeys = _nullishCoalesce(visitedKeys, () => ( /* @__PURE__ */ new Set()));
|
|
1891
|
+
this.runSpan = runSpan;
|
|
1871
1892
|
}
|
|
1872
1893
|
__init() {this.entryInProgress = false}
|
|
1873
1894
|
|
|
@@ -1876,6 +1897,7 @@ var WorkflowContextImpl = (_class = class _WorkflowContextImpl {
|
|
|
1876
1897
|
|
|
1877
1898
|
|
|
1878
1899
|
|
|
1900
|
+
|
|
1879
1901
|
/** Track names used in current execution to detect duplicates */
|
|
1880
1902
|
__init2() {this.usedNamesInExecution = /* @__PURE__ */ new Set()}
|
|
1881
1903
|
__init3() {this.pendingCompletableMessageIds = /* @__PURE__ */ new Set()}
|
|
@@ -1925,7 +1947,8 @@ var WorkflowContextImpl = (_class = 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 = 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 = class _WorkflowContextImpl {
|
|
|
2283
2307
|
metadata.lastAttemptAt = Date.now();
|
|
2284
2308
|
metadata.dirty = true;
|
|
2285
2309
|
const timeout = _nullishCoalesce(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 = 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 = 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 = 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 = 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
|
|
3819
|
-
workflowId,
|
|
3820
|
-
workflowFn,
|
|
3821
|
-
input,
|
|
3852
|
+
const result = await traceRun(
|
|
3822
3853
|
driver,
|
|
3823
|
-
|
|
3824
|
-
|
|
3825
|
-
|
|
3826
|
-
|
|
3827
|
-
|
|
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
|
-
) :
|
|
3927
|
-
workflowId,
|
|
3928
|
-
workflowFn,
|
|
3929
|
-
input,
|
|
3964
|
+
) : traceRun(
|
|
3930
3965
|
driver,
|
|
3931
|
-
|
|
3932
|
-
|
|
3933
|
-
|
|
3934
|
-
|
|
3935
|
-
|
|
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
|
-
|
|
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 @@ async function executeWorkflow(workflowId, workflowFn, input, driver, messageDri
|
|
|
4321
4402
|
|
|
4322
4403
|
|
|
4323
4404
|
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;
|
|
4324
|
-
//# sourceMappingURL=chunk-
|
|
4405
|
+
//# sourceMappingURL=chunk-XRITRTKT.cjs.map
|