@usehelical/workflows 0.0.1-alpha.14 → 0.0.1-alpha.15
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/{chunk-2CPBPIZ7.js → chunk-TZSPUZQ3.js} +208 -174
- package/dist/chunk-TZSPUZQ3.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +98 -38
- package/dist/index.js.map +1 -1
- package/dist/{run-BCTOgHFp.d.ts → run-BDlJdILv.d.ts} +9 -2
- package/dist/workflows.d.ts +2 -2
- package/dist/workflows.js +8 -18
- package/dist/workflows.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-2CPBPIZ7.js.map +0 -1
|
@@ -28,6 +28,22 @@ var QueueNotFoundError = class extends Error {
|
|
|
28
28
|
}
|
|
29
29
|
};
|
|
30
30
|
|
|
31
|
+
// core/workflow.ts
|
|
32
|
+
var TERMINAL_STATES = [
|
|
33
|
+
"success",
|
|
34
|
+
"error",
|
|
35
|
+
"cancelled",
|
|
36
|
+
"max_recovery_attempts_exceeded"
|
|
37
|
+
];
|
|
38
|
+
function defineWorkflow(fn, options = {}) {
|
|
39
|
+
return () => {
|
|
40
|
+
return {
|
|
41
|
+
fn,
|
|
42
|
+
maxRecoveryAttempts: options.maxRecoveryAttempts
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
31
47
|
// core/internal/repository/get-state.ts
|
|
32
48
|
async function getState(db, runId, key) {
|
|
33
49
|
const result = await db.selectFrom("state").select(["key", "value", "change_id"]).where("run_id", "=", runId).where("key", "=", key).executeTakeFirst();
|
|
@@ -37,97 +53,6 @@ async function getState(db, runId, key) {
|
|
|
37
53
|
return result.value;
|
|
38
54
|
}
|
|
39
55
|
|
|
40
|
-
// core/internal/errors.ts
|
|
41
|
-
var RunCancelledError = class extends Error {
|
|
42
|
-
constructor() {
|
|
43
|
-
super("This workflow run has been cancelled");
|
|
44
|
-
this.name = "RUN_CANCELLED" /* RUN_CANCELLED */;
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
var RunNotFoundError = class extends Error {
|
|
48
|
-
constructor(runId) {
|
|
49
|
-
super(`Workflow run "${runId}" not found`);
|
|
50
|
-
this.name = "RUN_NOT_FOUND" /* RUN_NOT_FOUND */;
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
var RunOutsideOfWorkflowError = class extends Error {
|
|
54
|
-
constructor() {
|
|
55
|
-
super("This function must be called within a workflow");
|
|
56
|
-
this.name = "RUN_OUTSIDE_OF_WORKFLOW" /* RUN_OUTSIDE_OF_WORKFLOW */;
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
var FatalError = class extends Error {
|
|
60
|
-
constructor(message) {
|
|
61
|
-
super(message);
|
|
62
|
-
this.name = "FATAL_ERROR" /* FATAL_ERROR */;
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
var MaxRetriesExceededError = class extends Error {
|
|
66
|
-
attemptErrors;
|
|
67
|
-
stepName;
|
|
68
|
-
maxAttempts;
|
|
69
|
-
constructor(stepName, maxAttempts, errors) {
|
|
70
|
-
const formattedErrors = errors.map((error, index) => `Attempt ${index + 1}: ${error.message}`).join(". ");
|
|
71
|
-
super(`Step "${stepName}" failed after ${maxAttempts + 1} attempts. ${formattedErrors}`);
|
|
72
|
-
this.name = "MAX_RETRIES_EXCEEDED" /* MAX_RETRIES_EXCEEDED */;
|
|
73
|
-
this.attemptErrors = errors;
|
|
74
|
-
this.stepName = stepName;
|
|
75
|
-
this.maxAttempts = maxAttempts;
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
var ErrorThatShouldNeverHappen = class extends Error {
|
|
79
|
-
constructor(message) {
|
|
80
|
-
super(message);
|
|
81
|
-
this.name = "ERROR_THAT_SHOULD_NEVER_HAPPEN" /* ERROR_THAT_SHOULD_NEVER_HAPPEN */;
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
var SerializationError = class extends Error {
|
|
85
|
-
constructor(message) {
|
|
86
|
-
super(message);
|
|
87
|
-
this.name = "SERIALIZATION_ERROR" /* SERIALIZATION_ERROR */;
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
var TimeoutError2 = class extends Error {
|
|
91
|
-
constructor(message) {
|
|
92
|
-
super(message);
|
|
93
|
-
this.name = "TIMEOUT" /* TIMEOUT */;
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
var DeadlineError = class extends Error {
|
|
97
|
-
constructor(message) {
|
|
98
|
-
super(message);
|
|
99
|
-
this.name = "DEADLINE" /* DEADLINE */;
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
function serialize(value) {
|
|
103
|
-
try {
|
|
104
|
-
return JSON.stringify(value);
|
|
105
|
-
} catch (error) {
|
|
106
|
-
throw new SerializationError(error.message);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
function deserialize(value) {
|
|
110
|
-
try {
|
|
111
|
-
return JSON.parse(value);
|
|
112
|
-
} catch (error) {
|
|
113
|
-
throw new SerializationError(error.message);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
function serializeError(error) {
|
|
117
|
-
try {
|
|
118
|
-
return JSON.stringify(serializeError$1(error));
|
|
119
|
-
} catch (error2) {
|
|
120
|
-
throw new SerializationError(error2.message);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
function deserializeError(serialized) {
|
|
124
|
-
try {
|
|
125
|
-
return deserializeError$1(JSON.parse(serialized));
|
|
126
|
-
} catch (error) {
|
|
127
|
-
throw new SerializationError(error.message);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
56
|
// core/internal/utils/sleep.ts
|
|
132
57
|
function sleep(ms) {
|
|
133
58
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
@@ -243,6 +168,116 @@ async function withDbRetry(fn, options = {}) {
|
|
|
243
168
|
}
|
|
244
169
|
}
|
|
245
170
|
}
|
|
171
|
+
|
|
172
|
+
// core/internal/errors.ts
|
|
173
|
+
var BaseError = class extends Error {
|
|
174
|
+
reason;
|
|
175
|
+
constructor(message, reason) {
|
|
176
|
+
super(message);
|
|
177
|
+
this.reason = reason;
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
var RunTimedOutError = class extends BaseError {
|
|
181
|
+
constructor() {
|
|
182
|
+
super("This workflow run has timed out", "timeout");
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
var UnknownError = class extends BaseError {
|
|
186
|
+
constructor(message) {
|
|
187
|
+
super(message || "An unknown error occurred", "unknown");
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
var RunDeadlineExceededError = class extends BaseError {
|
|
191
|
+
constructor() {
|
|
192
|
+
super("This workflow run has exceeded its deadline", "deadline");
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
var RunCancelledError = class extends BaseError {
|
|
196
|
+
constructor(message) {
|
|
197
|
+
super(message || "This workflow run has been cancelled", "cancel");
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
var MaxRecoveryAttemptsExceededError2 = class extends BaseError {
|
|
201
|
+
constructor(message) {
|
|
202
|
+
super(message || "Max recovery attempts exceeded", "max_recovery_attempts_exceeded");
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
var OperationTimedOutError = class extends BaseError {
|
|
206
|
+
constructor(operationName) {
|
|
207
|
+
super(`This operation "${operationName}" has timed out`, "timeout");
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
var RunNotFoundError = class extends Error {
|
|
211
|
+
constructor(runId) {
|
|
212
|
+
super(`Workflow run "${runId}" not found`);
|
|
213
|
+
this.name = "RUN_NOT_FOUND" /* RUN_NOT_FOUND */;
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
var RunOutsideOfWorkflowError = class extends Error {
|
|
217
|
+
constructor() {
|
|
218
|
+
super("This function must be called within a workflow");
|
|
219
|
+
this.name = "RUN_OUTSIDE_OF_WORKFLOW" /* RUN_OUTSIDE_OF_WORKFLOW */;
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
var FatalError = class extends Error {
|
|
223
|
+
constructor(message) {
|
|
224
|
+
super(message);
|
|
225
|
+
this.name = "FATAL_ERROR" /* FATAL_ERROR */;
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
var MaxRetriesExceededError = class extends Error {
|
|
229
|
+
attemptErrors;
|
|
230
|
+
stepName;
|
|
231
|
+
maxAttempts;
|
|
232
|
+
constructor(stepName, maxAttempts, errors) {
|
|
233
|
+
const formattedErrors = errors.map((error, index) => `Attempt ${index + 1}: ${error.message}`).join(". ");
|
|
234
|
+
super(`Step "${stepName}" failed after ${maxAttempts + 1} attempts. ${formattedErrors}`);
|
|
235
|
+
this.name = "MAX_RETRIES_EXCEEDED" /* MAX_RETRIES_EXCEEDED */;
|
|
236
|
+
this.attemptErrors = errors;
|
|
237
|
+
this.stepName = stepName;
|
|
238
|
+
this.maxAttempts = maxAttempts;
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
var ErrorThatShouldNeverHappen = class extends Error {
|
|
242
|
+
constructor(message) {
|
|
243
|
+
super(message);
|
|
244
|
+
this.name = "ERROR_THAT_SHOULD_NEVER_HAPPEN" /* ERROR_THAT_SHOULD_NEVER_HAPPEN */;
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
var SerializationError = class extends Error {
|
|
248
|
+
constructor(message) {
|
|
249
|
+
super(message);
|
|
250
|
+
this.name = "SERIALIZATION_ERROR" /* SERIALIZATION_ERROR */;
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
function serialize(value) {
|
|
254
|
+
try {
|
|
255
|
+
return JSON.stringify(value);
|
|
256
|
+
} catch (error) {
|
|
257
|
+
throw new SerializationError(error.message);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
function deserialize(value) {
|
|
261
|
+
try {
|
|
262
|
+
return JSON.parse(value);
|
|
263
|
+
} catch (error) {
|
|
264
|
+
throw new SerializationError(error.message);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function serializeError(error) {
|
|
268
|
+
try {
|
|
269
|
+
return JSON.stringify(serializeError$1(error));
|
|
270
|
+
} catch (error2) {
|
|
271
|
+
throw new SerializationError(error2.message);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
function deserializeError(serialized) {
|
|
275
|
+
try {
|
|
276
|
+
return deserializeError$1(JSON.parse(serialized));
|
|
277
|
+
} catch (error) {
|
|
278
|
+
throw new SerializationError(error.message);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
246
281
|
function getExecutionContext() {
|
|
247
282
|
const store = asyncLocalStorage.getStore();
|
|
248
283
|
if (!store) {
|
|
@@ -282,7 +317,7 @@ async function insertOperation(tx, runId, operationName, sequenceId, result, err
|
|
|
282
317
|
}).execute();
|
|
283
318
|
}
|
|
284
319
|
|
|
285
|
-
// core/internal/operation-manager.ts
|
|
320
|
+
// core/internal/context/operation-manager.ts
|
|
286
321
|
var OperationManager = class {
|
|
287
322
|
constructor(db, runId, operations = []) {
|
|
288
323
|
this.db = db;
|
|
@@ -408,53 +443,22 @@ function createExecutionContext({
|
|
|
408
443
|
db: ctx.db
|
|
409
444
|
};
|
|
410
445
|
}
|
|
411
|
-
async function recordRunResult(db, runId, result) {
|
|
446
|
+
async function recordRunResult(db, runId, result, cancelled) {
|
|
412
447
|
const [{ change_id }] = await db.updateTable("runs").set({
|
|
413
448
|
output: result.result,
|
|
414
449
|
error: result.error,
|
|
415
|
-
status: result.error ? "error" : "success",
|
|
450
|
+
status: cancelled ? "cancelled" : result.error ? "error" : "success",
|
|
416
451
|
updated_at: sql`(extract(epoch from now()) * 1000)::bigint`
|
|
417
452
|
}).where("id", "=", runId).returning(["change_id"]).execute();
|
|
418
453
|
return change_id;
|
|
419
454
|
}
|
|
420
|
-
async function cancelRun(runId, db) {
|
|
421
|
-
return withDbRetry(async () => {
|
|
422
|
-
return db.transaction().execute(async (tx) => {
|
|
423
|
-
const result = await tx.updateTable("runs").set({
|
|
424
|
-
status: "cancelled",
|
|
425
|
-
updated_at: sql`(extract(epoch from now()) * 1000)::bigint`
|
|
426
|
-
}).where(
|
|
427
|
-
(eb) => eb.and([eb("id", "=", runId), eb("status", "not in", ["cancelled", "success", "error"])])
|
|
428
|
-
).returning(["change_id", "path"]).executeTakeFirst();
|
|
429
|
-
if (!result) {
|
|
430
|
-
const exists = await tx.selectFrom("runs").select([]).where("id", "=", runId).executeTakeFirst();
|
|
431
|
-
if (exists) {
|
|
432
|
-
return void 0;
|
|
433
|
-
}
|
|
434
|
-
throw new RunNotFoundError(runId);
|
|
435
|
-
}
|
|
436
|
-
await sql`
|
|
437
|
-
UPDATE runs
|
|
438
|
-
SET
|
|
439
|
-
status = ${"cancelled"},
|
|
440
|
-
updated_at = (extract(epoch from now()) * 1000)::bigint
|
|
441
|
-
WHERE path @> ARRAY[${runId}]::text[]
|
|
442
|
-
AND id != ${runId}
|
|
443
|
-
AND status NOT IN (${"cancelled"}, ${"success"}, ${"error"})
|
|
444
|
-
`.execute(tx);
|
|
445
|
-
return {
|
|
446
|
-
path: result.path
|
|
447
|
-
};
|
|
448
|
-
});
|
|
449
|
-
});
|
|
450
|
-
}
|
|
451
455
|
|
|
452
456
|
// core/internal/execute-workflow.ts
|
|
453
457
|
async function executeWorkflow(ctx, params) {
|
|
454
458
|
const { db, runRegistry } = ctx;
|
|
455
459
|
const { options, runId, runPath, fn, args, operations } = params;
|
|
456
460
|
const abortController = new AbortController();
|
|
457
|
-
const [deadline] = getDeadlineAndReason({
|
|
461
|
+
const [deadline, deadlineReason] = getDeadlineAndReason({
|
|
458
462
|
timeout: options?.timeout,
|
|
459
463
|
deadline: options?.deadline
|
|
460
464
|
});
|
|
@@ -472,12 +476,16 @@ async function executeWorkflow(ctx, params) {
|
|
|
472
476
|
const result = await runWithExecutionContext(runStore, async () => {
|
|
473
477
|
return await runWithTimeout(async () => {
|
|
474
478
|
return await fn(...args);
|
|
475
|
-
});
|
|
479
|
+
}, deadlineReason);
|
|
476
480
|
});
|
|
477
481
|
await recordRunResult(db, runId, { result: result ? serialize(result) : void 0 });
|
|
478
482
|
return result;
|
|
479
483
|
} catch (error) {
|
|
480
|
-
|
|
484
|
+
if (error instanceof RunCancelledError) {
|
|
485
|
+
await recordRunResult(db, runId, { error: serializeError(error) }, true);
|
|
486
|
+
} else {
|
|
487
|
+
await recordRunResult(db, runId, { error: serializeError(error) });
|
|
488
|
+
}
|
|
481
489
|
throw error;
|
|
482
490
|
} finally {
|
|
483
491
|
runRegistry.unregisterRun(runId);
|
|
@@ -507,15 +515,15 @@ function getDeadlineAndReason({
|
|
|
507
515
|
}
|
|
508
516
|
return [void 0, void 0];
|
|
509
517
|
}
|
|
510
|
-
async function runWithTimeout(fn) {
|
|
511
|
-
const {
|
|
518
|
+
async function runWithTimeout(fn, deadlineReason) {
|
|
519
|
+
const { abortSignal } = getExecutionContext();
|
|
512
520
|
const abortPromise = new Promise((_, reject) => {
|
|
513
521
|
abortSignal.throwIfAborted();
|
|
514
522
|
abortSignal.addEventListener(
|
|
515
523
|
"abort",
|
|
516
524
|
() => {
|
|
517
525
|
if (abortSignal.reason?.name === "TimeoutError") {
|
|
518
|
-
reject(new
|
|
526
|
+
reject(new RunTimedOutError());
|
|
519
527
|
return;
|
|
520
528
|
}
|
|
521
529
|
reject(new RunCancelledError());
|
|
@@ -527,8 +535,13 @@ async function runWithTimeout(fn) {
|
|
|
527
535
|
try {
|
|
528
536
|
return await Promise.race([callPromise, abortPromise]);
|
|
529
537
|
} catch (error) {
|
|
530
|
-
if (error instanceof
|
|
531
|
-
|
|
538
|
+
if (error instanceof RunTimedOutError) {
|
|
539
|
+
if (deadlineReason === "timeout") {
|
|
540
|
+
throw new RunTimedOutError();
|
|
541
|
+
} else if (deadlineReason === "deadline") {
|
|
542
|
+
throw new RunDeadlineExceededError();
|
|
543
|
+
}
|
|
544
|
+
throw error;
|
|
532
545
|
}
|
|
533
546
|
await callPromise.catch(() => {
|
|
534
547
|
});
|
|
@@ -536,7 +549,7 @@ async function runWithTimeout(fn) {
|
|
|
536
549
|
}
|
|
537
550
|
}
|
|
538
551
|
|
|
539
|
-
// core/internal/
|
|
552
|
+
// core/internal/db/queries/get-run-status.ts
|
|
540
553
|
async function getRunStatus(db, runId) {
|
|
541
554
|
const run = await db.selectFrom("runs").select("status").where("id", "=", runId).executeTakeFirst();
|
|
542
555
|
if (!run) {
|
|
@@ -545,16 +558,16 @@ async function getRunStatus(db, runId) {
|
|
|
545
558
|
return run.status;
|
|
546
559
|
}
|
|
547
560
|
|
|
548
|
-
//
|
|
561
|
+
// core/internal/get-run-status.ts
|
|
549
562
|
async function getRunStatus2(ctx, runId) {
|
|
550
563
|
const { db, runRegistry } = ctx;
|
|
551
564
|
const run = runRegistry.getRun(runId);
|
|
552
565
|
if (run) {
|
|
553
|
-
return
|
|
566
|
+
return deriveRunStatus(run);
|
|
554
567
|
}
|
|
555
568
|
return getRunStatus(db, runId);
|
|
556
569
|
}
|
|
557
|
-
async function
|
|
570
|
+
async function deriveRunStatus(runEntry) {
|
|
558
571
|
if (runEntry.store.abortSignal.aborted) {
|
|
559
572
|
return "cancelled";
|
|
560
573
|
}
|
|
@@ -568,7 +581,7 @@ async function getRunStatusFromRegistry(runEntry) {
|
|
|
568
581
|
return "error";
|
|
569
582
|
}
|
|
570
583
|
|
|
571
|
-
//
|
|
584
|
+
// core/internal/wait-for-run-result.ts
|
|
572
585
|
async function waitForRunResult(ctx, runId) {
|
|
573
586
|
const { db, runEventBus } = ctx;
|
|
574
587
|
const run = await getRun(db, runId);
|
|
@@ -578,48 +591,69 @@ async function waitForRunResult(ctx, runId) {
|
|
|
578
591
|
success: false
|
|
579
592
|
};
|
|
580
593
|
}
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
594
|
+
switch (run.status) {
|
|
595
|
+
case "success":
|
|
596
|
+
return {
|
|
597
|
+
data: run.output ? deserialize(run.output) : void 0,
|
|
598
|
+
success: true
|
|
599
|
+
};
|
|
600
|
+
case "error":
|
|
601
|
+
return {
|
|
602
|
+
error: run.error ? deserializeError(run.error) : new UnknownError(),
|
|
603
|
+
success: false
|
|
604
|
+
};
|
|
605
|
+
case "cancelled":
|
|
606
|
+
return {
|
|
607
|
+
error: new RunCancelledError(),
|
|
608
|
+
success: false
|
|
609
|
+
};
|
|
610
|
+
case "max_recovery_attempts_exceeded":
|
|
611
|
+
return {
|
|
612
|
+
error: run.error ? deserializeError(run.error) : new MaxRecoveryAttemptsExceededError2(),
|
|
613
|
+
success: false
|
|
614
|
+
};
|
|
592
615
|
}
|
|
593
616
|
return new Promise((resolve, reject) => {
|
|
594
617
|
const unsubscribe = runEventBus.subscribe(runId, "*", async (e) => {
|
|
595
|
-
if (e.status
|
|
596
|
-
unsubscribe();
|
|
597
|
-
resolve({
|
|
598
|
-
error: new RunCancelledError(),
|
|
599
|
-
success: false
|
|
600
|
-
});
|
|
601
|
-
return;
|
|
602
|
-
}
|
|
603
|
-
if (e.status === "success" || e.status === "error") {
|
|
618
|
+
if (TERMINAL_STATES.includes(e.status)) {
|
|
604
619
|
unsubscribe();
|
|
605
620
|
try {
|
|
606
|
-
const
|
|
607
|
-
if (!
|
|
621
|
+
const run2 = await getRun(db, runId);
|
|
622
|
+
if (!run2) {
|
|
608
623
|
reject(new RunNotFoundError(runId));
|
|
609
624
|
return;
|
|
610
625
|
}
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
626
|
+
switch (run2.status) {
|
|
627
|
+
case "success":
|
|
628
|
+
resolve({
|
|
629
|
+
data: run2.output ? deserialize(run2.output) : void 0,
|
|
630
|
+
success: true
|
|
631
|
+
});
|
|
632
|
+
return;
|
|
633
|
+
case "error":
|
|
634
|
+
resolve({
|
|
635
|
+
error: run2.error ? deserializeError(run2.error) : new UnknownError(),
|
|
636
|
+
success: false
|
|
637
|
+
});
|
|
638
|
+
return;
|
|
639
|
+
case "cancelled":
|
|
640
|
+
resolve({
|
|
641
|
+
error: new RunCancelledError(),
|
|
642
|
+
success: false
|
|
643
|
+
});
|
|
644
|
+
return;
|
|
645
|
+
case "max_recovery_attempts_exceeded":
|
|
646
|
+
resolve({
|
|
647
|
+
error: run2.error ? deserializeError(run2.error) : new MaxRecoveryAttemptsExceededError2(),
|
|
648
|
+
success: false
|
|
649
|
+
});
|
|
650
|
+
return;
|
|
617
651
|
}
|
|
618
|
-
resolve({
|
|
619
|
-
data: completedRun.output ? deserialize(completedRun.output) : void 0,
|
|
620
|
-
success: true
|
|
621
|
-
});
|
|
622
652
|
} catch (error) {
|
|
653
|
+
if (error instanceof RunNotFoundError) {
|
|
654
|
+
reject(error);
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
623
657
|
resolve({
|
|
624
658
|
error,
|
|
625
659
|
success: false
|
|
@@ -686,7 +720,7 @@ async function insertMessage(db, options) {
|
|
|
686
720
|
}).execute();
|
|
687
721
|
}
|
|
688
722
|
|
|
689
|
-
//
|
|
723
|
+
// core/internal/get-state.ts
|
|
690
724
|
var StateNotAvailableError = class extends Error {
|
|
691
725
|
};
|
|
692
726
|
async function getState2(ctx, target, key) {
|
|
@@ -720,6 +754,6 @@ async function waitForStateNotification(stateEventBus, runId, key) {
|
|
|
720
754
|
});
|
|
721
755
|
}
|
|
722
756
|
|
|
723
|
-
export { ErrorThatShouldNeverHappen, FatalError, MaxRecoveryAttemptsExceededError, MaxRetriesExceededError, QueueNotFoundError, RunCancelledError, RunNotFoundError, StateNotAvailableError,
|
|
724
|
-
//# sourceMappingURL=chunk-
|
|
725
|
-
//# sourceMappingURL=chunk-
|
|
757
|
+
export { ErrorThatShouldNeverHappen, FatalError, MaxRecoveryAttemptsExceededError, MaxRetriesExceededError, OperationTimedOutError, QueueNotFoundError, RunCancelledError, RunNotFoundError, StateNotAvailableError, TERMINAL_STATES, TimeoutError, WorkflowNotFoundError, createRunHandle, defineWorkflow, deserialize, deserializeError, enqueueRun, executeAndRecordOperation, executeWorkflow, getExecutionContext, getRun, getRunStatus2 as getRunStatus, getState, getState2, insertMessage, insertPendingRun, returnOrThrowOperationResult, serialize, serializeError, sleep, waitForRunResult, waitForStateNotification, withDbRetry };
|
|
758
|
+
//# sourceMappingURL=chunk-TZSPUZQ3.js.map
|
|
759
|
+
//# sourceMappingURL=chunk-TZSPUZQ3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../client/errors.ts","../core/workflow.ts","../core/internal/repository/get-state.ts","../core/internal/utils/sleep.ts","../core/internal/db/retry.ts","../core/internal/errors.ts","../core/internal/utils/serialization.ts","../core/internal/context/execution-context.ts","../core/internal/repository/get-run.ts","../core/internal/repository/insert-operation.ts","../core/internal/context/operation-manager.ts","../client/utils.ts","../core/internal/repository/record-run-result.ts","../core/internal/execute-workflow.ts","../core/internal/db/queries/get-run-status.ts","../core/internal/get-run-status.ts","../core/internal/wait-for-run-result.ts","../client/run.ts","../core/internal/repository/insert-pending-run.ts","../core/internal/repository/enqueue-run.ts","../core/internal/repository/insert-message.ts","../core/internal/get-state.ts"],"names":["MaxRecoveryAttemptsExceededError","_serializeError","error","_deserializeError","getRunStatus","run","sql","getState"],"mappings":"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","file":"chunk-TZSPUZQ3.js","sourcesContent":["export class TimeoutError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'timeout';\n }\n}\n\nexport class MaxRecoveryAttemptsExceededError extends Error {\n constructor(runId: string, maxAttempts: number) {\n super(`Max recovery attempts exceeded for run \"${runId}\" after ${maxAttempts + 1} attempts`);\n this.name = 'max_recovery_attempts_exceeded';\n }\n}\n\nexport class WorkflowNotFoundError extends Error {\n constructor(workflowName: string) {\n super(`Workflow \"${workflowName}\" not found`);\n this.name = 'workflow_not_found';\n }\n}\n\nexport class QueueNotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'queue_not_found';\n }\n}\n","export type RunStatus =\n | 'pending'\n | 'queued'\n | 'success'\n | 'error'\n | 'cancelled'\n | 'max_recovery_attempts_exceeded';\n\nexport const TERMINAL_STATES: RunStatus[] = [\n 'success',\n 'error',\n 'cancelled',\n 'max_recovery_attempts_exceeded',\n];\n\nexport type WorkflowFunction<Args extends unknown[], R> = (...args: Args) => Promise<R> | R;\n\nexport type WorkflowDefinition<TArgs extends unknown[] = unknown[], TReturn = unknown> = {\n fn: WorkflowFunction<TArgs, TReturn>;\n maxRecoveryAttempts?: number;\n};\n\nexport function defineWorkflow<TArgs extends unknown[], TReturn>(\n fn: WorkflowFunction<TArgs, TReturn>,\n options: {\n maxRecoveryAttempts?: number;\n } = {},\n): () => WorkflowDefinition<TArgs, TReturn> {\n return () => {\n return {\n fn,\n maxRecoveryAttempts: options.maxRecoveryAttempts,\n };\n };\n}\n\nexport type WorkflowEntry<\n TArgs extends unknown[] = unknown[],\n TReturn = unknown,\n> = () => WorkflowDefinition<TArgs, TReturn>;\n","import { Database } from '../db/db';\n\nexport async function getState(\n db: Database,\n runId: string,\n key: string,\n): Promise<string | undefined> {\n const result = await db\n .selectFrom('state')\n .select(['key', 'value', 'change_id'])\n .where('run_id', '=', runId)\n .where('key', '=', key)\n .executeTakeFirst();\n\n if (!result) {\n return undefined;\n }\n\n return result.value;\n}\n","export function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { sleep } from '../utils/sleep';\n\n// Error detection helpers\ntype AnyErr = {\n code?: string;\n errno?: number;\n message?: string;\n stack?: string;\n cause?: unknown;\n};\n\n// PostgreSQL SQLSTATE error classes that are safe to retry\n// https://www.postgresql.org/docs/current/errcodes-appendix.html\nconst RETRY_SQLSTATE_PREFIXES = new Set([\n '08', // Connection Exception\n '40', // Transaction Rollback (deadlock_detected, serialization_failure)\n '53', // Insufficient Resources\n '55', // Object Not In Prerequisite State (lock_not_available)\n '57', // Operator Intervention (admin_shutdown, cannot_connect_now)\n]);\n\nconst RETRY_SQLSTATE_CODES = new Set([\n '40003', // statement_completion_unknown\n '40001', // serialization_failure\n '40P01', // deadlock_detected\n '55P03', // lock_not_available\n]);\n\n// Node.js transient network error codes\nconst RETRY_NODE_ERRNOS = new Set([\n 'ECONNRESET',\n 'ECONNREFUSED',\n 'EHOSTUNREACH',\n 'ENETUNREACH',\n 'ETIMEDOUT',\n 'ECONNABORTED',\n 'EPIPE',\n]);\n\nfunction isPgDatabaseError(e: AnyErr): boolean {\n return !!e && typeof e === 'object' && typeof e.code === 'string' && e.code.length === 5;\n}\n\nfunction sqlStateLooksRetryable(sqlstate: string | undefined): boolean {\n if (!sqlstate) return false;\n if (RETRY_SQLSTATE_CODES.has(sqlstate)) return true;\n const prefix = sqlstate.toString().slice(0, 2);\n return RETRY_SQLSTATE_PREFIXES.has(prefix);\n}\n\nfunction nodeErrnoLooksRetryable(e: AnyErr): boolean {\n const code = e.code;\n return !!code && RETRY_NODE_ERRNOS.has(code);\n}\n\nfunction messageLooksRetryable(msg: string): boolean {\n const m = msg.toLowerCase();\n return (\n msg.includes('ECONNREFUSED') ||\n msg.includes('ECONNRESET') ||\n m.includes('connection timeout') ||\n m.includes('server closed the connection') ||\n m.includes('connection terminated unexpectedly') ||\n m.includes('client has encountered a connection error') ||\n m.includes('timeout exceeded when trying to connect') ||\n m.includes('could not connect to server') ||\n m.includes('connection pool exhausted') ||\n m.includes('too many clients')\n );\n}\n\nfunction* unwrapErrors(e: unknown): Generator<unknown, void, void> {\n const queue: unknown[] = [e];\n const seen = new Set<unknown>();\n\n while (queue.length) {\n const cur = queue.shift()!;\n if (cur && typeof cur === 'object') {\n if (seen.has(cur)) continue;\n seen.add(cur);\n\n // AggregateError\n const ae = cur as { errors?: unknown[] };\n if (Array.isArray(ae.errors)) queue.push(...ae.errors);\n\n // Error cause chain\n const withCause = cur as { cause?: unknown };\n if (withCause.cause) queue.push(withCause.cause);\n\n // Wrapped errors\n const wrapped = cur as { error?: unknown };\n if (wrapped.error) queue.push(wrapped.error);\n }\n yield cur;\n }\n}\n\nfunction isRetriableDBError(err: unknown): boolean {\n for (const e of unwrapErrors(err)) {\n const anyErr = e as AnyErr;\n\n // Check PostgreSQL SQLSTATE codes\n if (isPgDatabaseError(anyErr) && sqlStateLooksRetryable(anyErr.code)) {\n return true;\n }\n\n // Check Node.js system errors\n if (nodeErrnoLooksRetryable(anyErr)) {\n return true;\n }\n\n // Check error messages\n if (e instanceof Error) {\n if (e.stack && messageLooksRetryable(e.stack)) return true;\n if (e.message && messageLooksRetryable(e.message)) return true;\n }\n if (messageLooksRetryable(String(e))) return true;\n }\n return false;\n}\n\n/**\n * Retry a function if it throws a retriable database error.\n * @param fn - The function to retry.\n * @param options - The options for the retry.\n * @param options.initialBackoffMs - The initial backoff time in milliseconds. Defaults to 1000.\n * @param options.maxBackoffMs - The maximum backoff time in milliseconds. Defaults to 60000.\n * @param options.onRetry - The callback to call when a retry is needed.\n * @returns The result of the function.\n */\nexport async function withDbRetry<T>(\n fn: () => Promise<T>,\n options: {\n initialBackoffMs?: number;\n maxBackoffMs?: number;\n onRetry?: (error: unknown, attempt: number, delayMs: number) => void;\n } = {},\n): Promise<T> {\n const { initialBackoffMs = 1000, maxBackoffMs = 60000, onRetry } = options;\n\n let attempt = 0;\n let backoffMs = initialBackoffMs;\n\n while (true) {\n try {\n return await fn();\n } catch (error) {\n if (!isRetriableDBError(error)) {\n // Not a retriable error - throw immediately\n throw error;\n }\n\n attempt++;\n\n // Calculate backoff with jitter (0.5x to 1.5x)\n const jitter = 0.5 + Math.random();\n const delayMs = Math.min(backoffMs * jitter, maxBackoffMs);\n\n // Log/callback\n if (onRetry) {\n onRetry(error, attempt, delayMs);\n } else {\n console.warn(\n `Database connection failed: ${error instanceof Error ? error.message : String(error)}. ` +\n `Retrying in ${(delayMs / 1000).toFixed(2)}s (attempt ${attempt})`,\n );\n }\n\n // Wait before retrying\n await sleep(delayMs);\n\n // Increase backoff for next attempt (exponential)\n backoffMs = Math.min(backoffMs * 2, maxBackoffMs);\n }\n }\n}\n","export enum ErrorType {\n INVALID_WORKFLOW_TRANSITION = 'INVALID_WORKFLOW_TRANSITION',\n RUN_CANCELLED = 'RUN_CANCELLED',\n RUN_NOT_FOUND = 'RUN_NOT_FOUND',\n RUN_OUTSIDE_OF_WORKFLOW = 'RUN_OUTSIDE_OF_WORKFLOW',\n FATAL_ERROR = 'FATAL_ERROR',\n NO_MESSAGE_AVAILABLE = 'NO_MESSAGE_AVAILABLE',\n MAX_RETRIES_EXCEEDED = 'MAX_RETRIES_EXCEEDED',\n ERROR_THAT_SHOULD_NEVER_HAPPEN = 'ERROR_THAT_SHOULD_NEVER_HAPPEN',\n SERIALIZATION_ERROR = 'SERIALIZATION_ERROR',\n MAX_RECOVERY_ATTEMPTS_EXCEEDED = 'MAX_RECOVERY_ATTEMPTS_EXCEEDED',\n WORKFLOW_NOT_FOUND = 'WORKFLOW_NOT_FOUND',\n TIMEOUT = 'TIMEOUT',\n CANCEL = 'CANCEL',\n DEADLINE = 'DEADLINE',\n RUN_NOT_CANCELLABLE = 'RUN_NOT_CANCELLABLE',\n QUEUE_NOT_FOUND = 'QUEUE_NOT_FOUND',\n}\n\nexport type ErrorReason =\n | 'timeout'\n | 'deadline'\n | 'cancel'\n | 'unhandled'\n | 'max_recovery_attempts_exceeded'\n | 'unknown';\n\nexport class BaseError extends Error {\n readonly reason: ErrorReason;\n\n constructor(message: string, reason: ErrorReason) {\n super(message);\n this.reason = reason;\n }\n}\n\nexport class RunTimedOutError extends BaseError {\n constructor() {\n super('This workflow run has timed out', 'timeout');\n }\n}\n\nexport class UnknownError extends BaseError {\n constructor(message?: string) {\n super(message || 'An unknown error occurred', 'unknown');\n }\n}\n\nexport class RunDeadlineExceededError extends BaseError {\n constructor() {\n super('This workflow run has exceeded its deadline', 'deadline');\n }\n}\n\nexport class RunCancelledError extends BaseError {\n constructor(message?: string) {\n super(message || 'This workflow run has been cancelled', 'cancel');\n }\n}\n\nexport class MaxRecoveryAttemptsExceededError extends BaseError {\n constructor(message?: string) {\n super(message || 'Max recovery attempts exceeded', 'max_recovery_attempts_exceeded');\n }\n}\n\nexport class UnhandledError extends BaseError {\n constructor(error: Error) {\n super(error.message, 'unhandled');\n }\n}\n\nexport class OperationTimedOutError extends BaseError {\n constructor(operationName: string) {\n super(`This operation \"${operationName}\" has timed out`, 'timeout');\n }\n}\n\nexport class InvalidWorkflowTransitionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = ErrorType.INVALID_WORKFLOW_TRANSITION;\n }\n}\n\nexport class RunNotFoundError extends Error {\n constructor(runId: string) {\n super(`Workflow run \"${runId}\" not found`);\n this.name = ErrorType.RUN_NOT_FOUND;\n }\n}\n\nexport class RunOutsideOfWorkflowError extends Error {\n constructor() {\n super('This function must be called within a workflow');\n this.name = ErrorType.RUN_OUTSIDE_OF_WORKFLOW;\n }\n}\n\nexport class FatalError extends Error {\n constructor(message: string) {\n super(message);\n this.name = ErrorType.FATAL_ERROR;\n }\n}\n\nexport class MaxRetriesExceededError extends Error {\n readonly attemptErrors: Error[];\n readonly stepName: string;\n readonly maxAttempts: number;\n\n constructor(stepName: string, maxAttempts: number, errors: Error[]) {\n const formattedErrors = errors\n .map((error, index) => `Attempt ${index + 1}: ${error.message}`)\n .join('. ');\n\n super(`Step \"${stepName}\" failed after ${maxAttempts + 1} attempts. ${formattedErrors}`);\n\n this.name = ErrorType.MAX_RETRIES_EXCEEDED;\n this.attemptErrors = errors;\n this.stepName = stepName;\n this.maxAttempts = maxAttempts;\n }\n}\n\nexport class ErrorThatShouldNeverHappen extends Error {\n constructor(message: string) {\n super(message);\n this.name = ErrorType.ERROR_THAT_SHOULD_NEVER_HAPPEN;\n }\n}\n\nexport class MessageNotAvailableError extends Error {\n constructor() {\n super('Message not available');\n this.name = ErrorType.NO_MESSAGE_AVAILABLE;\n }\n}\n\nexport class SerializationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = ErrorType.SERIALIZATION_ERROR;\n }\n}\n\nexport class RunNotCancellableError extends Error {\n constructor(message: string) {\n super(message);\n this.name = ErrorType.RUN_NOT_CANCELLABLE;\n this.message = message;\n }\n}\n","import { SerializationError } from '../errors';\nimport {\n serializeError as _serializeError,\n deserializeError as _deserializeError,\n} from 'serialize-error';\n\n/**\n * Serializes a value into a JSON string.\n */\nexport function serialize<T>(value: T): string {\n try {\n return JSON.stringify(value);\n } catch (error) {\n throw new SerializationError((error as Error).message);\n }\n}\n\n/**\n * Deserializes a JSON string into a value.\n */\nexport function deserialize<T>(value: string): T {\n try {\n return JSON.parse(value);\n } catch (error) {\n throw new SerializationError((error as Error).message);\n }\n}\n\n/**\n * Serializes an error object, preserving stack trace, message, name, and custom properties\n */\nexport function serializeError(error: Error): string {\n try {\n return JSON.stringify(_serializeError(error));\n } catch (error) {\n throw new SerializationError((error as Error).message);\n }\n}\n\n/**\n * Deserializes an error object, reconstructing it with stack trace and properties\n */\nexport function deserializeError(serialized: string): Error {\n try {\n return _deserializeError(JSON.parse(serialized));\n } catch (error) {\n throw new SerializationError((error as Error).message);\n }\n}\n","import { MessageEventBus } from '../events/message-event-bus';\nimport { OperationManager } from './operation-manager';\nimport { StateEventBus } from '../events/state-event-bus';\nimport { RunOutsideOfWorkflowError } from '../errors';\nimport { Database } from '../db/db';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { WorkflowRegistry } from './workflow-registry';\nimport { RunEventBus } from '../events/run-event-bus';\nimport { RunRegistry } from './run-registry';\nimport { QueueRegistry } from './queue-registry';\n\nexport interface ExecutionContext {\n runId: string;\n runPath: string[];\n executorId: string;\n abortSignal: AbortSignal;\n parentWorkflow?: ExecutionContext;\n operationManager: OperationManager;\n messageEventBus: MessageEventBus;\n stateEventBus: StateEventBus;\n workflowRegistry: WorkflowRegistry;\n runEventBus: RunEventBus;\n runRegistry: RunRegistry;\n queueRegistry: QueueRegistry;\n db: Database;\n}\n\nexport function getExecutionContext(): ExecutionContext {\n const store = asyncLocalStorage.getStore();\n if (!store) {\n throw new RunOutsideOfWorkflowError();\n }\n return store;\n}\n\nexport const asyncLocalStorage = new AsyncLocalStorage<ExecutionContext>();\n\nexport function runWithExecutionContext<TReturn>(\n store: ExecutionContext,\n callback: () => Promise<TReturn>,\n) {\n return asyncLocalStorage.run(store, callback);\n}\n","import { RunStatus } from '../../workflow';\nimport { Database } from '../db/db';\n\ninterface WorkflowResult {\n id: string;\n input?: string;\n output?: string;\n error?: string;\n status: RunStatus;\n queueName?: string;\n changeId: number;\n}\n\nexport async function getRun(db: Database, runId: string): Promise<WorkflowResult | undefined> {\n const result = await db\n .selectFrom('runs')\n .select(['id', 'inputs', 'output', 'error', 'status', 'change_id'])\n .where('id', '=', runId)\n .executeTakeFirst();\n\n if (!result) {\n return undefined;\n }\n\n return {\n id: result.id,\n input: result.inputs ?? undefined,\n output: result.output ?? undefined,\n error: result.error ?? undefined,\n status: result.status as RunStatus,\n changeId: result.change_id,\n };\n}\n","import { Database, Transaction } from '../db/db';\n\nexport async function insertOperation(\n tx: Transaction | Database,\n runId: string,\n operationName: string,\n sequenceId: number,\n result?: string,\n error?: string,\n) {\n await tx\n .insertInto('operations')\n .values({\n run_id: runId,\n name: operationName,\n sequence_id: sequenceId,\n output: result,\n error: error,\n })\n .execute();\n}\n","import { withDbRetry } from '../db/retry';\nimport { deserialize, deserializeError, serialize, serializeError } from '../utils/serialization';\nimport { getExecutionContext } from './execution-context';\nimport { RunCancelledError } from '../errors';\nimport { getRun } from '../repository/get-run';\nimport { insertOperation } from '../repository/insert-operation';\nimport { Database, Transaction } from '../db/db';\n\nexport interface OperationResult {\n result?: string;\n error?: string;\n}\n\nexport class OperationManager {\n private sequenceId = 0;\n private lastReservedSequenceId: number | null = null;\n constructor(\n private readonly db: Database,\n private readonly runId: string,\n // operations are stored in reverse order so the most recent operation is at the beginning of the array\n private readonly operations: OperationResult[] = [],\n ) {}\n\n getOperationResult(): OperationResult | null {\n const operation = this.operations.pop() as OperationResult;\n if (operation) {\n this.sequenceId++;\n return operation;\n }\n return null;\n }\n\n reserveSequenceId() {\n const reserved = this.sequenceId++;\n this.lastReservedSequenceId = reserved;\n return reserved;\n }\n\n getCurrentSequenceId() {\n return this.sequenceId;\n }\n\n /**\n * Gets the sequence ID that was most recently reserved for the current operation.\n * This is the ID that will be (or was) recorded in the database for this operation.\n * Returns null if no sequence ID has been reserved yet.\n */\n getActiveSequenceId(): number | null {\n return this.lastReservedSequenceId;\n }\n\n async recordResult(\n operationName: string,\n sequenceId: number,\n result: string | null,\n tx?: Transaction,\n ) {\n if (tx) {\n await insertOperation(tx, this.runId, operationName, sequenceId, result ?? undefined);\n } else {\n await withDbRetry(async () => {\n await insertOperation(this.db, this.runId, operationName, sequenceId, result ?? undefined);\n });\n }\n }\n\n async recordError(\n operationName: string,\n sequenceId: number,\n error: string | null,\n tx?: Transaction,\n ) {\n if (tx) {\n await insertOperation(\n tx,\n this.runId,\n operationName,\n sequenceId,\n undefined,\n error ?? undefined,\n );\n } else {\n await withDbRetry(async () => {\n await insertOperation(\n this.db,\n this.runId,\n operationName,\n sequenceId,\n undefined,\n error ?? undefined,\n );\n });\n }\n }\n}\n\nexport function returnOrThrowOperationResult<T = void>(\n op: OperationResult,\n): T extends void ? void : T {\n if (op.error) {\n throw deserializeError(op.error);\n }\n\n if (op.result === null || op.result === undefined) {\n return undefined as T extends void ? void : T;\n }\n\n return deserialize(op.result) as T extends void ? void : T;\n}\n\nexport async function executeAndRecordOperation<T>(\n operationManager: OperationManager,\n operationName: string,\n callback: () => Promise<T>,\n): Promise<T> {\n const seqId = operationManager.reserveSequenceId();\n try {\n const result = await callback();\n const serializedResult = serialize(result);\n await checkCancellation();\n await operationManager.recordResult(operationName, seqId, serializedResult);\n return result;\n } catch (error) {\n if (error instanceof RunCancelledError) {\n throw error;\n }\n const err = error instanceof Error ? error : new Error(String(error));\n await operationManager.recordError(operationName, seqId, serializeError(err));\n throw error;\n }\n}\n\nasync function checkCancellation() {\n const { abortSignal, runId, db } = getExecutionContext();\n if (abortSignal.aborted) {\n throw new RunCancelledError();\n }\n const run = await withDbRetry(async () => getRun(db, runId));\n if (run?.status === 'cancelled') {\n throw new RunCancelledError();\n }\n}\n","import { OperationManager, OperationResult } from '../core/internal/context/operation-manager';\nimport { ExecutionContext } from '../core/internal/context/execution-context';\nimport { RuntimeContext } from '../core/internal/context/runtime-context';\n\ntype CreateExecutionContextParams = {\n ctx: RuntimeContext;\n abortSignal: AbortSignal;\n runId: string;\n runPath: string[];\n operations?: OperationResult[];\n};\n\nexport function createExecutionContext({\n ctx,\n abortSignal,\n runId,\n runPath,\n operations,\n}: CreateExecutionContextParams): ExecutionContext {\n return {\n runId: runId,\n runPath: runPath,\n executorId: ctx.executorId,\n abortSignal: abortSignal,\n operationManager: new OperationManager(ctx.db, runId, operations || []),\n messageEventBus: ctx.messageEventBus,\n stateEventBus: ctx.stateEventBus,\n workflowRegistry: ctx.workflowRegistry,\n runEventBus: ctx.runEventBus,\n runRegistry: ctx.runRegistry,\n queueRegistry: ctx.queueRegistry,\n db: ctx.db,\n };\n}\n","import { sql } from 'kysely';\nimport { Database } from '../db/db';\n\ntype RunResult = {\n result?: string;\n error?: string;\n};\n\nexport async function recordRunResult(\n db: Database,\n runId: string,\n result: RunResult,\n cancelled?: boolean,\n) {\n const [{ change_id }] = await db\n .updateTable('runs')\n .set({\n output: result.result,\n error: result.error,\n status: cancelled ? 'cancelled' : result.error ? 'error' : 'success',\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n })\n .where('id', '=', runId)\n .returning(['change_id'])\n .execute();\n return change_id;\n}\n","import { createExecutionContext } from '../../client/utils';\nimport { WorkflowFunction } from '../workflow';\nimport { OperationResult } from './context/operation-manager';\nimport { recordRunResult } from './repository/record-run-result';\nimport { serialize, serializeError } from './utils/serialization';\nimport { RunWorkflowOptions } from './run-workflow';\nimport { RunCancelledError, RunDeadlineExceededError, RunTimedOutError } from './errors';\nimport { getExecutionContext, runWithExecutionContext } from './context/execution-context';\nimport { RuntimeContext } from './context/runtime-context';\n\nexport type ExecuteWorkflowParams<TArgs extends unknown[] = unknown[], TReturn = unknown> = {\n runId: string;\n runPath: string[];\n workflowName: string;\n fn: WorkflowFunction<TArgs, TReturn>;\n args: TArgs;\n options?: RunWorkflowOptions;\n operations?: OperationResult[];\n};\n\nexport async function executeWorkflow<TArgs extends unknown[], TReturn>(\n ctx: RuntimeContext,\n params: ExecuteWorkflowParams<TArgs, TReturn>,\n): Promise<void> {\n const { db, runRegistry } = ctx;\n const { options, runId, runPath, fn, args, operations } = params;\n\n const abortController = new AbortController();\n const [deadline, deadlineReason] = getDeadlineAndReason({\n timeout: options?.timeout,\n deadline: options?.deadline,\n });\n\n const runStore = createExecutionContext({\n ctx,\n abortSignal: AbortSignal.any(\n [abortController.signal].concat(deadline ? [AbortSignal.timeout(deadline - Date.now())] : []),\n ),\n runId,\n runPath,\n operations,\n });\n\n const executionPromise = (async () => {\n try {\n const result = await runWithExecutionContext(runStore, async () => {\n return await runWithTimeout(async () => {\n return await fn(...args);\n }, deadlineReason);\n });\n await recordRunResult(db, runId, { result: result ? serialize(result) : undefined });\n return result;\n } catch (error) {\n if (error instanceof RunCancelledError) {\n // User already called cancelRun() - just record the error\n await recordRunResult(db, runId, { error: serializeError(error as Error) }, true);\n } else {\n await recordRunResult(db, runId, { error: serializeError(error as Error) });\n }\n throw error;\n } finally {\n runRegistry.unregisterRun(runId);\n }\n })();\n\n runRegistry.registerRun(runId, {\n store: runStore,\n promise: executionPromise,\n abortController: abortController,\n });\n}\n\nfunction getDeadlineAndReason({\n timeout,\n deadline,\n}: {\n timeout?: number;\n deadline?: number;\n}): [number | undefined, 'timeout' | 'deadline' | undefined] {\n const now = Date.now();\n const timeoutDeadline = timeout ? now + timeout : undefined;\n\n if (timeoutDeadline && deadline) {\n return [\n Math.min(timeoutDeadline, deadline),\n timeoutDeadline < deadline ? 'timeout' : 'deadline',\n ];\n } else if (timeoutDeadline) {\n return [timeoutDeadline, 'timeout'];\n } else if (deadline) {\n return [deadline, 'deadline'];\n }\n return [undefined, undefined];\n}\n\nexport async function runWithTimeout<T>(\n fn: () => Promise<T>,\n deadlineReason?: 'timeout' | 'deadline',\n): Promise<T> {\n const { abortSignal } = getExecutionContext();\n\n const abortPromise = new Promise<T>((_, reject) => {\n abortSignal.throwIfAborted();\n abortSignal.addEventListener(\n 'abort',\n () => {\n if (abortSignal.reason?.name === 'TimeoutError') {\n reject(new RunTimedOutError());\n return;\n }\n reject(new RunCancelledError());\n },\n { once: true },\n );\n });\n\n const callPromise = fn();\n\n try {\n return await Promise.race([callPromise, abortPromise]);\n } catch (error) {\n if (error instanceof RunTimedOutError) {\n if (deadlineReason === 'timeout') {\n throw new RunTimedOutError();\n } else if (deadlineReason === 'deadline') {\n throw new RunDeadlineExceededError();\n }\n throw error;\n }\n await callPromise.catch(() => {});\n throw error;\n }\n}\n","import { RunStatus } from '../../../workflow';\nimport { Database } from '../db';\nimport { RunNotFoundError } from '../../errors';\n\nexport async function getRunStatus(db: Database, runId: string): Promise<RunStatus> {\n const run = await db\n .selectFrom('runs')\n .select('status')\n .where('id', '=', runId)\n .executeTakeFirst();\n if (!run) {\n throw new RunNotFoundError(runId);\n }\n return run.status as RunStatus;\n}\n","import { RunStatus } from '..';\nimport { RunEntry } from './context/run-registry';\nimport { RuntimeContext } from './context/runtime-context';\nimport { getRunStatus as getRunStatusQuery } from './db/queries/get-run-status';\n\nexport async function getRunStatus(ctx: RuntimeContext, runId: string): Promise<RunStatus> {\n const { db, runRegistry } = ctx;\n const run = runRegistry.getRun(runId);\n if (run) {\n return deriveRunStatus(run);\n }\n return getRunStatusQuery(db, runId);\n}\n\nasync function deriveRunStatus(runEntry: RunEntry): Promise<RunStatus> {\n if (runEntry.store.abortSignal.aborted) {\n return 'cancelled';\n }\n const promiseState = runEntry.getPromiseState();\n if (promiseState === 'pending') {\n return 'pending';\n }\n if (promiseState === 'fulfilled') {\n return 'success';\n }\n return 'error';\n}\n","import {\n MaxRecoveryAttemptsExceededError,\n RunCancelledError,\n RunNotFoundError,\n UnknownError,\n} from './errors';\nimport { getRun } from './repository/get-run';\nimport { RuntimeContext } from './context/runtime-context';\nimport { deserialize, deserializeError } from './utils/serialization';\nimport { RunResult } from '../../client/run';\nimport { TERMINAL_STATES } from '../workflow';\n\nexport async function waitForRunResult<TReturn>(\n ctx: RuntimeContext,\n runId: string,\n): Promise<RunResult<TReturn>> {\n const { db, runEventBus } = ctx;\n const run = await getRun(db, runId);\n if (!run) {\n return {\n error: new RunNotFoundError(runId),\n success: false,\n };\n }\n\n switch (run.status) {\n case 'success':\n return {\n data: run.output ? (deserialize(run.output) as TReturn) : (undefined as TReturn),\n success: true,\n };\n case 'error':\n return {\n error: run.error ? (deserializeError(run.error) as unknown as Error) : new UnknownError(),\n success: false,\n };\n case 'cancelled':\n return {\n error: new RunCancelledError(),\n success: false,\n };\n case 'max_recovery_attempts_exceeded':\n return {\n error: run.error\n ? (deserializeError(run.error) as unknown as Error)\n : new MaxRecoveryAttemptsExceededError(),\n success: false,\n };\n }\n\n return new Promise<RunResult<TReturn>>((resolve, reject) => {\n const unsubscribe = runEventBus.subscribe(runId, '*', async (e) => {\n if (TERMINAL_STATES.includes(e.status)) {\n unsubscribe();\n try {\n const run = await getRun(db, runId);\n if (!run) {\n reject(new RunNotFoundError(runId));\n return;\n }\n switch (run.status) {\n case 'success':\n resolve({\n data: run.output ? (deserialize(run.output) as TReturn) : (undefined as TReturn),\n success: true,\n });\n return;\n case 'error':\n resolve({\n error: run.error\n ? (deserializeError(run.error) as unknown as Error)\n : new UnknownError(),\n success: false,\n });\n return;\n case 'cancelled':\n resolve({\n error: new RunCancelledError(),\n success: false,\n });\n return;\n case 'max_recovery_attempts_exceeded':\n resolve({\n error: run.error\n ? (deserializeError(run.error) as unknown as Error)\n : new MaxRecoveryAttemptsExceededError(),\n success: false,\n });\n return;\n }\n } catch (error) {\n if (error instanceof RunNotFoundError) {\n reject(error);\n return;\n }\n resolve({\n error: error as Error,\n success: false,\n });\n }\n }\n });\n });\n}\n","import { RuntimeContext } from '../core/internal/context/runtime-context';\nimport { RunStatus } from '../core';\nimport { getRunStatus } from '../core/internal/get-run-status';\nimport { waitForRunResult } from '../core/internal/wait-for-run-result';\nimport { BaseError } from '../core/internal/errors';\n\nexport type RunResult<TReturn> =\n | { error: BaseError | Error; success: false }\n | { data: TReturn; success: true };\n\nexport interface Run<TReturn = unknown> {\n id: string;\n getStatus: () => Promise<RunStatus>;\n waitForResult: () => Promise<RunResult<TReturn>>;\n}\n\nexport function createRunHandle<TReturn = unknown>(\n runtimeContext: RuntimeContext,\n id: string,\n): Run<TReturn> {\n return {\n id,\n getStatus: () => getRunStatus(runtimeContext, id),\n waitForResult: () => waitForRunResult<TReturn>(runtimeContext, id),\n };\n}\n","import { sql } from 'kysely';\nimport { Database, Transaction } from '../db/db';\n\nexport type InsertRunOptions = {\n runId: string;\n path: string[];\n inputs: string;\n executorId: string;\n workflowName: string;\n};\n\nexport async function insertPendingRun(db: Database | Transaction, options: InsertRunOptions) {\n const result = await db\n .insertInto('runs')\n .values({\n id: options.runId,\n path: options.path,\n inputs: options.inputs,\n executor_id: options.executorId,\n workflow_name: options.workflowName,\n status: 'pending',\n started_at_epoch_ms: sql`(extract(epoch from now()) * 1000)::bigint`,\n created_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n })\n .returning(['id', 'path', 'change_id'])\n .executeTakeFirst();\n\n return {\n runId: result!.id,\n path: result!.path,\n changeId: result!.change_id,\n };\n}\n","import { sql } from 'kysely';\nimport { Database, Transaction } from '../db/db';\n\nexport type EnqueueRunOptions = {\n runId: string;\n path: string[];\n inputs: string;\n executorId: string;\n workflowName: string;\n timeout?: number;\n deadline?: number;\n recoveryAttempts?: number;\n deduplicationId?: string;\n queueName: string;\n queuePartitionKey?: string;\n};\n\nexport async function enqueueRun(db: Database | Transaction, options: EnqueueRunOptions) {\n const result = await db\n .insertInto('runs')\n .values({\n id: options.runId,\n path: options.path,\n inputs: options.inputs,\n queue_name: options.queueName,\n queue_partition_key: options.queuePartitionKey,\n queue_deduplication_id: options.deduplicationId,\n executor_id: options.executorId,\n workflow_name: options.workflowName,\n status: 'queued',\n recovery_attempts: options.recoveryAttempts,\n created_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n })\n .onConflict((oc) => oc.columns(['queue_name', 'queue_deduplication_id']).doNothing())\n .returning(['id', 'change_id'])\n .executeTakeFirst();\n\n return {\n runId: result?.id,\n changeId: result?.change_id,\n };\n}\n","import { Database, Transaction } from '../db/db';\n\ntype InsertMessageOptions = {\n destinationWorkflowId: string;\n messageType: string;\n data: string;\n};\n\nexport async function insertMessage(db: Database | Transaction, options: InsertMessageOptions) {\n return await db\n .insertInto('messages')\n .values({\n destination_run_id: options.destinationWorkflowId,\n type: options.messageType,\n payload: options.data,\n })\n .execute();\n}\n","import { withDbRetry } from './db/retry';\nimport { RuntimeContext } from './context/runtime-context';\nimport { StateDefinition } from '../state';\nimport { getState as getStateRepository } from './repository/get-state';\nimport { Run } from '../../client/run';\nimport { deserialize } from './utils/serialization';\nimport { StateEventBus } from './events/state-event-bus';\n\nexport class StateNotAvailableError extends Error {}\n\nexport async function getState<T>(\n ctx: RuntimeContext,\n target: Run | string,\n key: StateDefinition<T> | string,\n) {\n const { db, stateEventBus } = ctx;\n\n const destinationWorkflowId = typeof target === 'string' ? target : target.id;\n const stateKey = typeof key === 'string' ? key : key.name;\n\n while (true) {\n try {\n return await withDbRetry(async () => {\n const state = await getStateRepository(db, destinationWorkflowId, stateKey);\n if (!state) {\n throw new StateNotAvailableError();\n }\n return deserialize(state) as T;\n });\n } catch (error) {\n if (error instanceof StateNotAvailableError) {\n await waitForStateNotification(stateEventBus, destinationWorkflowId, stateKey);\n continue;\n }\n throw error;\n }\n }\n}\n\nexport async function waitForStateNotification(\n stateEventBus: StateEventBus,\n runId: string,\n key: string,\n) {\n return new Promise((resolve) => {\n const unsubscribe = stateEventBus.subscribe(runId, key, (state) => {\n unsubscribe();\n resolve(state);\n });\n });\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { W as WorkflowEntry, Q as QueueEntry, R as RunWorkflowOptions, a as Run, b as RunStatus, c as RunResult, d as QueueWorkflowOptions, M as MessageDefinition, S as StateDefinition } from './run-
|
|
1
|
+
import { W as WorkflowEntry, Q as QueueEntry, R as RunWorkflowOptions, a as Run, b as RunStatus, c as RunResult, d as QueueWorkflowOptions, M as MessageDefinition, S as StateDefinition } from './run-BDlJdILv.js';
|
|
2
2
|
|
|
3
3
|
type CreateInstanceOptions = {
|
|
4
4
|
instanceId?: string;
|