@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.
@@ -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
- await recordRunResult(db, runId, { error: serializeError(error) });
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 { runId, db, abortSignal } = getExecutionContext();
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 TimeoutError(`Workflow timed out`));
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 TimeoutError || error instanceof DeadlineError) {
531
- await cancelRun(runId, db);
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/repository/get-run-status.ts
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
- // client/get-run-status.ts
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 getRunStatusFromRegistry(run);
566
+ return deriveRunStatus(run);
554
567
  }
555
568
  return getRunStatus(db, runId);
556
569
  }
557
- async function getRunStatusFromRegistry(runEntry) {
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
- // client/wait-for-run-result.ts
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
- if (run.status === "cancelled") {
582
- return {
583
- error: new RunCancelledError(),
584
- success: false
585
- };
586
- }
587
- if (run.status === "error") {
588
- return {
589
- error: run.error ? deserializeError(run.error) : new Error("Unexptected error"),
590
- success: false
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 === "cancelled") {
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 completedRun = await getRun(db, runId);
607
- if (!completedRun) {
621
+ const run2 = await getRun(db, runId);
622
+ if (!run2) {
608
623
  reject(new RunNotFoundError(runId));
609
624
  return;
610
625
  }
611
- if (completedRun.status === "error") {
612
- resolve({
613
- error: completedRun.error ? deserializeError(completedRun.error) : new Error("error"),
614
- success: false
615
- });
616
- return;
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
- // client/get-state.ts
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, TimeoutError2 as TimeoutError, TimeoutError as TimeoutError2, WorkflowNotFoundError, cancelRun, createRunHandle, deserialize, deserializeError, enqueueRun, executeAndRecordOperation, executeWorkflow, getExecutionContext, getRun, getRunStatus2 as getRunStatus, getState, getState2, insertMessage, insertPendingRun, returnOrThrowOperationResult, serialize, serializeError, sleep, waitForRunResult, waitForStateNotification, withDbRetry };
724
- //# sourceMappingURL=chunk-2CPBPIZ7.js.map
725
- //# sourceMappingURL=chunk-2CPBPIZ7.js.map
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-BCTOgHFp.js';
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;