@usehelical/workflows 0.0.1-alpha.12 → 0.0.1-alpha.14

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.
@@ -2,23 +2,39 @@ import { serializeError as serializeError$1, deserializeError as deserializeErro
2
2
  import { AsyncLocalStorage } from 'async_hooks';
3
3
  import { sql } from 'kysely';
4
4
 
5
- // core/workflow.ts
6
- var WorkflowStatus = /* @__PURE__ */ ((WorkflowStatus2) => {
7
- WorkflowStatus2["PENDING"] = "PENDING";
8
- WorkflowStatus2["QUEUED"] = "QUEUED";
9
- WorkflowStatus2["SUCCESS"] = "SUCCESS";
10
- WorkflowStatus2["ERROR"] = "ERROR";
11
- WorkflowStatus2["CANCELLED"] = "CANCELLED";
12
- WorkflowStatus2["MAX_RECOVERY_ATTEMPTS_EXCEEDED"] = "MAX_RECOVERY_ATTEMPTS_EXCEEDED";
13
- return WorkflowStatus2;
14
- })(WorkflowStatus || {});
15
- function defineWorkflow(fn, options = {}) {
16
- return () => {
17
- return {
18
- fn,
19
- maxRecoveryAttempts: options.maxRecoveryAttempts
20
- };
21
- };
5
+ // client/errors.ts
6
+ var TimeoutError = class extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = "timeout";
10
+ }
11
+ };
12
+ var MaxRecoveryAttemptsExceededError = class extends Error {
13
+ constructor(runId, maxAttempts) {
14
+ super(`Max recovery attempts exceeded for run "${runId}" after ${maxAttempts + 1} attempts`);
15
+ this.name = "max_recovery_attempts_exceeded";
16
+ }
17
+ };
18
+ var WorkflowNotFoundError = class extends Error {
19
+ constructor(workflowName) {
20
+ super(`Workflow "${workflowName}" not found`);
21
+ this.name = "workflow_not_found";
22
+ }
23
+ };
24
+ var QueueNotFoundError = class extends Error {
25
+ constructor(message) {
26
+ super(message);
27
+ this.name = "queue_not_found";
28
+ }
29
+ };
30
+
31
+ // core/internal/repository/get-state.ts
32
+ async function getState(db, runId, key) {
33
+ const result = await db.selectFrom("state").select(["key", "value", "change_id"]).where("run_id", "=", runId).where("key", "=", key).executeTakeFirst();
34
+ if (!result) {
35
+ return void 0;
36
+ }
37
+ return result.value;
22
38
  }
23
39
 
24
40
  // core/internal/errors.ts
@@ -71,19 +87,7 @@ var SerializationError = class extends Error {
71
87
  this.name = "SERIALIZATION_ERROR" /* SERIALIZATION_ERROR */;
72
88
  }
73
89
  };
74
- var MaxRecoveryAttemptsExceededError = class extends Error {
75
- constructor(runId, maxAttempts) {
76
- super(`Max recovery attempts exceeded for run "${runId}" after ${maxAttempts + 1} attempts`);
77
- this.name = "MAX_RECOVERY_ATTEMPTS_EXCEEDED" /* MAX_RECOVERY_ATTEMPTS_EXCEEDED */;
78
- }
79
- };
80
- var WorkflowNotFoundError = class extends Error {
81
- constructor(workflowName) {
82
- super(`Workflow "${workflowName}" not found`);
83
- this.name = "WORKFLOW_NOT_FOUND" /* WORKFLOW_NOT_FOUND */;
84
- }
85
- };
86
- var TimeoutError = class extends Error {
90
+ var TimeoutError2 = class extends Error {
87
91
  constructor(message) {
88
92
  super(message);
89
93
  this.name = "TIMEOUT" /* TIMEOUT */;
@@ -95,12 +99,6 @@ var DeadlineError = class extends Error {
95
99
  this.name = "DEADLINE" /* DEADLINE */;
96
100
  }
97
101
  };
98
- var QueueNotFoundError = class extends Error {
99
- constructor(message) {
100
- super(message);
101
- this.name = "QUEUE_NOT_FOUND" /* QUEUE_NOT_FOUND */;
102
- }
103
- };
104
102
  function serialize(value) {
105
103
  try {
106
104
  return JSON.stringify(value);
@@ -382,7 +380,7 @@ async function checkCancellation() {
382
380
  throw new RunCancelledError();
383
381
  }
384
382
  const run = await withDbRetry(async () => getRun(db, runId));
385
- if (run?.status === "CANCELLED" /* CANCELLED */) {
383
+ if (run?.status === "cancelled") {
386
384
  throw new RunCancelledError();
387
385
  }
388
386
  }
@@ -414,7 +412,7 @@ async function recordRunResult(db, runId, result) {
414
412
  const [{ change_id }] = await db.updateTable("runs").set({
415
413
  output: result.result,
416
414
  error: result.error,
417
- status: result.error ? "ERROR" /* ERROR */ : "SUCCESS" /* SUCCESS */,
415
+ status: result.error ? "error" : "success",
418
416
  updated_at: sql`(extract(epoch from now()) * 1000)::bigint`
419
417
  }).where("id", "=", runId).returning(["change_id"]).execute();
420
418
  return change_id;
@@ -423,17 +421,10 @@ async function cancelRun(runId, db) {
423
421
  return withDbRetry(async () => {
424
422
  return db.transaction().execute(async (tx) => {
425
423
  const result = await tx.updateTable("runs").set({
426
- status: "CANCELLED" /* CANCELLED */,
424
+ status: "cancelled",
427
425
  updated_at: sql`(extract(epoch from now()) * 1000)::bigint`
428
426
  }).where(
429
- (eb) => eb.and([
430
- eb("id", "=", runId),
431
- eb("status", "not in", [
432
- "CANCELLED" /* CANCELLED */,
433
- "SUCCESS" /* SUCCESS */,
434
- "ERROR" /* ERROR */
435
- ])
436
- ])
427
+ (eb) => eb.and([eb("id", "=", runId), eb("status", "not in", ["cancelled", "success", "error"])])
437
428
  ).returning(["change_id", "path"]).executeTakeFirst();
438
429
  if (!result) {
439
430
  const exists = await tx.selectFrom("runs").select([]).where("id", "=", runId).executeTakeFirst();
@@ -445,11 +436,11 @@ async function cancelRun(runId, db) {
445
436
  await sql`
446
437
  UPDATE runs
447
438
  SET
448
- status = ${"CANCELLED" /* CANCELLED */},
439
+ status = ${"cancelled"},
449
440
  updated_at = (extract(epoch from now()) * 1000)::bigint
450
441
  WHERE path @> ARRAY[${runId}]::text[]
451
442
  AND id != ${runId}
452
- AND status NOT IN (${"CANCELLED" /* CANCELLED */}, ${"SUCCESS" /* SUCCESS */}, ${"ERROR" /* ERROR */})
443
+ AND status NOT IN (${"cancelled"}, ${"success"}, ${"error"})
453
444
  `.execute(tx);
454
445
  return {
455
446
  path: result.path
@@ -554,78 +545,99 @@ async function getRunStatus(db, runId) {
554
545
  return run.status;
555
546
  }
556
547
 
557
- // client/run.ts
558
- function createRunHandle(runtimeContext, id) {
559
- const { runRegistry, db, runEventBus } = runtimeContext;
560
- const run = runRegistry.getRun(id);
548
+ // client/get-run-status.ts
549
+ async function getRunStatus2(ctx, runId) {
550
+ const { db, runRegistry } = ctx;
551
+ const run = runRegistry.getRun(runId);
561
552
  if (run) {
562
- return {
563
- id,
564
- status: () => getRunStatusFromRegistry(run),
565
- result: () => run.promise
566
- };
553
+ return getRunStatusFromRegistry(run);
567
554
  }
568
- return {
569
- id,
570
- status: () => getRunStatus(db, id),
571
- result: () => getRunResult(id, runEventBus, db)
572
- };
555
+ return getRunStatus(db, runId);
573
556
  }
574
557
  async function getRunStatusFromRegistry(runEntry) {
575
558
  if (runEntry.store.abortSignal.aborted) {
576
- return "CANCELLED" /* CANCELLED */;
559
+ return "cancelled";
577
560
  }
578
561
  const promiseState = runEntry.getPromiseState();
579
562
  if (promiseState === "pending") {
580
- return "PENDING" /* PENDING */;
563
+ return "pending";
581
564
  }
582
565
  if (promiseState === "fulfilled") {
583
- return "SUCCESS" /* SUCCESS */;
566
+ return "success";
584
567
  }
585
- return "ERROR" /* ERROR */;
568
+ return "error";
586
569
  }
587
- async function getRunResult(id, runEventBus, db) {
588
- const run = await getRun(db, id);
570
+
571
+ // client/wait-for-run-result.ts
572
+ async function waitForRunResult(ctx, runId) {
573
+ const { db, runEventBus } = ctx;
574
+ const run = await getRun(db, runId);
589
575
  if (!run) {
590
- throw new RunNotFoundError(id);
576
+ return {
577
+ error: new RunNotFoundError(runId),
578
+ success: false
579
+ };
591
580
  }
592
- if (run.status === "CANCELLED" /* CANCELLED */) {
593
- throw new RunCancelledError();
581
+ if (run.status === "cancelled") {
582
+ return {
583
+ error: new RunCancelledError(),
584
+ success: false
585
+ };
594
586
  }
595
- if (run.status === "ERROR" /* ERROR */) {
596
- throw run.error ? deserializeError(run.error) : void 0;
587
+ if (run.status === "error") {
588
+ return {
589
+ error: run.error ? deserializeError(run.error) : new Error("Unexptected error"),
590
+ success: false
591
+ };
597
592
  }
598
593
  return new Promise((resolve, reject) => {
599
- const unsubscribe = runEventBus.subscribe(id, "*", async (e) => {
600
- if (e.status === "CANCELLED" /* CANCELLED */) {
594
+ const unsubscribe = runEventBus.subscribe(runId, "*", async (e) => {
595
+ if (e.status === "cancelled") {
601
596
  unsubscribe();
602
- reject(new RunCancelledError());
597
+ resolve({
598
+ error: new RunCancelledError(),
599
+ success: false
600
+ });
603
601
  return;
604
602
  }
605
- if (e.status === "SUCCESS" /* SUCCESS */ || e.status === "ERROR" /* ERROR */) {
603
+ if (e.status === "success" || e.status === "error") {
606
604
  unsubscribe();
607
605
  try {
608
- const completedRun = await getRun(db, id);
606
+ const completedRun = await getRun(db, runId);
609
607
  if (!completedRun) {
610
- reject(new RunNotFoundError(id));
608
+ reject(new RunNotFoundError(runId));
611
609
  return;
612
610
  }
613
- if (completedRun.status === "ERROR" /* ERROR */) {
614
- reject(
615
- completedRun.error ? deserializeError(completedRun.error) : new Error("error")
616
- );
611
+ if (completedRun.status === "error") {
612
+ resolve({
613
+ error: completedRun.error ? deserializeError(completedRun.error) : new Error("error"),
614
+ success: false
615
+ });
617
616
  return;
618
617
  }
619
- resolve(
620
- completedRun.output ? deserialize(completedRun.output) : void 0
621
- );
618
+ resolve({
619
+ data: completedRun.output ? deserialize(completedRun.output) : void 0,
620
+ success: true
621
+ });
622
622
  } catch (error) {
623
- reject(error);
623
+ resolve({
624
+ error,
625
+ success: false
626
+ });
624
627
  }
625
628
  }
626
629
  });
627
630
  });
628
631
  }
632
+
633
+ // client/run.ts
634
+ function createRunHandle(runtimeContext, id) {
635
+ return {
636
+ id,
637
+ getStatus: () => getRunStatus2(runtimeContext, id),
638
+ waitForResult: () => waitForRunResult(runtimeContext, id)
639
+ };
640
+ }
629
641
  async function insertPendingRun(db, options) {
630
642
  const result = await db.insertInto("runs").values({
631
643
  id: options.runId,
@@ -633,7 +645,7 @@ async function insertPendingRun(db, options) {
633
645
  inputs: options.inputs,
634
646
  executor_id: options.executorId,
635
647
  workflow_name: options.workflowName,
636
- status: "PENDING" /* PENDING */,
648
+ status: "pending",
637
649
  started_at_epoch_ms: sql`(extract(epoch from now()) * 1000)::bigint`,
638
650
  created_at: sql`(extract(epoch from now()) * 1000)::bigint`,
639
651
  updated_at: sql`(extract(epoch from now()) * 1000)::bigint`
@@ -644,7 +656,70 @@ async function insertPendingRun(db, options) {
644
656
  changeId: result.change_id
645
657
  };
646
658
  }
659
+ async function enqueueRun(db, options) {
660
+ const result = await db.insertInto("runs").values({
661
+ id: options.runId,
662
+ path: options.path,
663
+ inputs: options.inputs,
664
+ queue_name: options.queueName,
665
+ queue_partition_key: options.queuePartitionKey,
666
+ queue_deduplication_id: options.deduplicationId,
667
+ executor_id: options.executorId,
668
+ workflow_name: options.workflowName,
669
+ status: "queued",
670
+ recovery_attempts: options.recoveryAttempts,
671
+ created_at: sql`(extract(epoch from now()) * 1000)::bigint`,
672
+ updated_at: sql`(extract(epoch from now()) * 1000)::bigint`
673
+ }).onConflict((oc) => oc.columns(["queue_name", "queue_deduplication_id"]).doNothing()).returning(["id", "change_id"]).executeTakeFirst();
674
+ return {
675
+ runId: result?.id,
676
+ changeId: result?.change_id
677
+ };
678
+ }
679
+
680
+ // core/internal/repository/insert-message.ts
681
+ async function insertMessage(db, options) {
682
+ return await db.insertInto("messages").values({
683
+ destination_run_id: options.destinationWorkflowId,
684
+ type: options.messageType,
685
+ payload: options.data
686
+ }).execute();
687
+ }
688
+
689
+ // client/get-state.ts
690
+ var StateNotAvailableError = class extends Error {
691
+ };
692
+ async function getState2(ctx, target, key) {
693
+ const { db, stateEventBus } = ctx;
694
+ const destinationWorkflowId = typeof target === "string" ? target : target.id;
695
+ const stateKey = typeof key === "string" ? key : key.name;
696
+ while (true) {
697
+ try {
698
+ return await withDbRetry(async () => {
699
+ const state = await getState(db, destinationWorkflowId, stateKey);
700
+ if (!state) {
701
+ throw new StateNotAvailableError();
702
+ }
703
+ return deserialize(state);
704
+ });
705
+ } catch (error) {
706
+ if (error instanceof StateNotAvailableError) {
707
+ await waitForStateNotification(stateEventBus, destinationWorkflowId, stateKey);
708
+ continue;
709
+ }
710
+ throw error;
711
+ }
712
+ }
713
+ }
714
+ async function waitForStateNotification(stateEventBus, runId, key) {
715
+ return new Promise((resolve) => {
716
+ const unsubscribe = stateEventBus.subscribe(runId, key, (state) => {
717
+ unsubscribe();
718
+ resolve(state);
719
+ });
720
+ });
721
+ }
647
722
 
648
- export { ErrorThatShouldNeverHappen, FatalError, MaxRecoveryAttemptsExceededError, MaxRetriesExceededError, QueueNotFoundError, RunCancelledError, RunNotFoundError, TimeoutError, WorkflowNotFoundError, WorkflowStatus, cancelRun, createRunHandle, defineWorkflow, deserialize, deserializeError, executeAndRecordOperation, executeWorkflow, getExecutionContext, getRun, insertPendingRun, returnOrThrowOperationResult, serialize, serializeError, sleep, withDbRetry };
649
- //# sourceMappingURL=chunk-WKVKC6AI.js.map
650
- //# sourceMappingURL=chunk-WKVKC6AI.js.map
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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../client/errors.ts","../core/internal/repository/get-state.ts","../core/internal/errors.ts","../core/internal/serialization.ts","../core/internal/utils/sleep.ts","../core/internal/db/retry.ts","../core/internal/execution-context.ts","../core/internal/repository/get-run.ts","../core/internal/repository/insert-operation.ts","../core/internal/operation-manager.ts","../client/utils.ts","../core/internal/repository/record-run-result.ts","../core/internal/repository/cancel-run.ts","../core/internal/execute-workflow.ts","../core/internal/repository/get-run-status.ts","../client/get-run-status.ts","../client/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","../client/get-state.ts"],"names":["TimeoutError","_serializeError","error","_deserializeError","sql","getRunStatus","getState"],"mappings":"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","file":"chunk-2CPBPIZ7.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","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 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 class InvalidWorkflowTransitionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = ErrorType.INVALID_WORKFLOW_TRANSITION;\n }\n}\n\nexport class RunCancelledError extends Error {\n constructor() {\n super('This workflow run has been cancelled');\n this.name = ErrorType.RUN_CANCELLED;\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 TimeoutError extends Error {\n constructor(message: string) {\n super(message);\n this.name = ErrorType.TIMEOUT;\n }\n}\n\nexport class DeadlineError extends Error {\n constructor(message: string) {\n super(message);\n this.name = ErrorType.DEADLINE;\n }\n}\n\nexport class CancelError extends Error {\n constructor(message: string) {\n super(message);\n this.name = ErrorType.CANCEL;\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","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","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 './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/operation-manager';\nimport { ExecutionContext } from '../core/internal/execution-context';\nimport { RuntimeContext } from '../core/internal/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(db: Database, runId: string, result: RunResult) {\n const [{ change_id }] = await db\n .updateTable('runs')\n .set({\n output: result.result,\n error: result.error,\n status: 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 { sql } from 'kysely';\nimport { Database } from '../db/db';\nimport { RunNotFoundError } from '../errors';\nimport { withDbRetry } from '../db/retry';\n\nexport async function cancelRun(runId: string, db: Database) {\n return withDbRetry(async () => {\n return db.transaction().execute(async (tx) => {\n const result = await tx\n .updateTable('runs')\n .set({\n status: 'cancelled',\n updated_at: sql`(extract(epoch from now()) * 1000)::bigint`,\n })\n .where((eb) =>\n eb.and([eb('id', '=', runId), eb('status', 'not in', ['cancelled', 'success', 'error'])]),\n )\n .returning(['change_id', 'path'])\n .executeTakeFirst();\n\n if (!result) {\n const exists = await tx\n .selectFrom('runs')\n .select([])\n .where('id', '=', runId)\n .executeTakeFirst();\n if (exists) {\n return undefined;\n }\n throw new RunNotFoundError(runId);\n }\n\n await sql`\n UPDATE runs\n SET \n status = ${'cancelled'},\n updated_at = (extract(epoch from now()) * 1000)::bigint\n WHERE path @> ARRAY[${runId}]::text[]\n AND id != ${runId}\n AND status NOT IN (${'cancelled'}, ${'success'}, ${'error'})\n `.execute(tx);\n\n return {\n path: result.path,\n };\n });\n });\n}\n","import { createExecutionContext } from '../../client/utils';\nimport { WorkflowFunction } from '../workflow';\nimport { OperationResult } from './operation-manager';\nimport { recordRunResult } from './repository/record-run-result';\nimport { serialize, serializeError } from './serialization';\nimport { RunWorkflowOptions } from '../../client/run-workflow';\nimport { cancelRun } from './repository/cancel-run';\nimport { DeadlineError, RunCancelledError } from './errors';\nimport { TimeoutError } from '../../client/errors';\nimport { getExecutionContext, runWithExecutionContext } from './execution-context';\nimport { RuntimeContext } from './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] = 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 });\n });\n await recordRunResult(db, runId, { result: result ? serialize(result) : undefined });\n return result;\n } catch (error) {\n await recordRunResult(db, runId, { error: serializeError(error as Error) });\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>(fn: () => Promise<T>): Promise<T> {\n const { runId, db, 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 TimeoutError(`Workflow timed out`));\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 TimeoutError || error instanceof DeadlineError) {\n await cancelRun(runId, db);\n }\n await callPromise.catch(() => {});\n throw error;\n }\n}\n","import { RunStatus } from '../../workflow';\nimport { Database } from '../db/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 '../core';\nimport { RunEntry } from '../core/internal/run-registry';\nimport { RuntimeContext } from '../core/internal/runtime-context';\nimport { getRunStatus as getRunStatusFromDb } from '../core/internal/repository/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 getRunStatusFromRegistry(run);\n }\n return getRunStatusFromDb(db, runId);\n}\n\nasync function getRunStatusFromRegistry(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 { RunCancelledError, RunNotFoundError } from '../core/internal/errors';\nimport { getRun } from '../core/internal/repository/get-run';\nimport { RuntimeContext } from '../core/internal/runtime-context';\nimport { deserialize, deserializeError } from '../core/internal/serialization';\nimport { RunResult } from './run';\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 if (run.status === 'cancelled') {\n return {\n error: new RunCancelledError(),\n success: false,\n };\n }\n\n if (run.status === 'error') {\n return {\n error: run.error\n ? (deserializeError(run.error) as unknown as Error)\n : new Error('Unexptected error'),\n success: false,\n };\n }\n\n return new Promise<RunResult<TReturn>>((resolve, reject) => {\n const unsubscribe = runEventBus.subscribe(runId, '*', async (e) => {\n if (e.status === 'cancelled') {\n unsubscribe();\n resolve({\n error: new RunCancelledError(),\n success: false,\n });\n return;\n }\n if (e.status === 'success' || e.status === 'error') {\n unsubscribe();\n try {\n const completedRun = await getRun(db, runId);\n if (!completedRun) {\n reject(new RunNotFoundError(runId));\n return;\n }\n if (completedRun.status === 'error') {\n resolve({\n error: completedRun.error\n ? (deserializeError(completedRun.error) as unknown as Error)\n : new Error('error'),\n success: false,\n });\n return;\n }\n resolve({\n data: completedRun.output\n ? (deserialize(completedRun.output) as TReturn)\n : (undefined as TReturn),\n success: true,\n });\n } catch (error) {\n resolve({\n error: error as Error,\n success: false,\n });\n }\n }\n });\n });\n}\n","import { RuntimeContext } from '../core/internal/runtime-context';\nimport { RunStatus } from '../core';\nimport { getRunStatus } from './get-run-status';\nimport { waitForRunResult } from './wait-for-run-result';\n\nexport type RunResult<TReturn> =\n | { error: 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 '../core/internal/db/retry';\nimport { RuntimeContext } from '../core/internal/runtime-context';\nimport { StateDefinition } from '../core/state';\nimport { getState as getStateRepository } from '../core/internal/repository/get-state';\nimport { Run } from './run';\nimport { deserialize } from '../core/internal/serialization';\nimport { StateEventBus } from '../core/internal/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,12 +1,4 @@
1
- import { W as WorkflowEntry, Q as QueueEntry, R as RunWorkflowOptions, a as Run, M as MessageDefinition, S as StateDefinition } from './state-B89wwR8P.js';
2
-
3
- type QueueWorkflowOptions = {
4
- timeout?: number;
5
- deadline?: number;
6
- priority?: number;
7
- partitionKey?: string;
8
- deduplicationId?: string;
9
- };
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';
10
2
 
11
3
  type CreateInstanceOptions = {
12
4
  instanceId?: string;
@@ -22,6 +14,8 @@ declare function createInstance(props: CreateInstanceParams): {
22
14
  cancelRun: (runId: string) => Promise<void>;
23
15
  resumeRun: (runId: string) => Promise<Run<void>>;
24
16
  getRun: (runId: string) => Promise<Run<unknown>>;
17
+ getRunStatus: (runId: string) => Promise<RunStatus>;
18
+ waitForRunResult: <TReturn>(runId: string) => Promise<RunResult<TReturn>>;
25
19
  queueWorkflow: <TArgs extends unknown[], TReturn>(queue: QueueEntry | string, wf: WorkflowEntry<TArgs, TReturn> | string, args?: TArgs, options?: QueueWorkflowOptions) => Promise<Run<TReturn>>;
26
20
  sendMessage: <T>(target: Run | string, name: MessageDefinition<T>, data: T) => Promise<void>;
27
21
  getState: <T>(target: Run | string, key: StateDefinition<T> | string) => Promise<T>;