@usehelical/workflows 0.0.1-alpha.10 → 0.0.1-alpha.11

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.
@@ -6,19 +6,11 @@ type RetryConfig = {
6
6
  retryDelay?: number;
7
7
  backOffRate?: number;
8
8
  };
9
- type StepOptions = RetryConfig & {
9
+ type RunStepOptions = RetryConfig & {
10
10
  name?: string;
11
11
  };
12
- type StepFunction<Args extends unknown[], R> = (...args: Args) => Promise<R> | R;
13
- type StepDefinition<TArgs extends unknown[], TReturn> = {
14
- fn: StepFunction<TArgs, TReturn>;
15
- args: TArgs;
16
- options: StepOptions;
17
- };
18
- declare function defineStep<TArgs extends unknown[], TReturn>(fn: StepFunction<TArgs, TReturn>, options?: StepOptions): (...args: TArgs) => StepDefinition<TArgs, TReturn>;
19
-
20
- declare function runStep<TArgs extends unknown[], TReturn>(step: StepDefinition<TArgs, TReturn>): Promise<TReturn | (TReturn extends void ? void : TReturn)>;
21
- declare function executeStepWithRetries<TArgs extends unknown[], TReturn>(stepName: string, fn: StepFunction<TArgs, TReturn>, args: TArgs, retryConfig: RetryConfig): Promise<TReturn>;
12
+ declare function runStep<TReturn>(stepFn: () => Promise<TReturn>, options?: RunStepOptions): Promise<TReturn | (TReturn extends void ? void : TReturn)>;
13
+ declare function executeStepWithRetries<TReturn>(stepName: string, fn: () => Promise<TReturn>, retryConfig: RetryConfig): Promise<TReturn>;
22
14
 
23
15
  declare function setState<T = unknown>(state: StateDefinition<T> | string, value: T): Promise<void>;
24
16
 
@@ -47,4 +39,4 @@ declare function randomUUID(): Promise<string | undefined>;
47
39
 
48
40
  declare function runWorkflow<TArgs extends unknown[], TReturn>(wf: WorkflowEntry<TArgs, TReturn> | string, args?: TArgs, options?: RunWorkflowOptions): Promise<Run<TReturn>>;
49
41
 
50
- export { MessageDefinition, type RetryConfig, StateDefinition, type StepDefinition, type StepFunction, WorkflowEntry, cancellableSleep, defineStep, executeStepWithRetries, getAbortSignal, getRunId, getStepId, randomUUID, receiveMessage, runStep, runWorkflow, setState, sleep };
42
+ export { MessageDefinition, type RetryConfig, StateDefinition, WorkflowEntry, cancellableSleep, executeStepWithRetries, getAbortSignal, getRunId, getStepId, randomUUID, receiveMessage, runStep, runWorkflow, setState, sleep };
package/dist/workflows.js CHANGED
@@ -19,37 +19,27 @@ function defineState(name) {
19
19
  };
20
20
  }
21
21
 
22
- // core/step.ts
23
- function defineStep(fn, options = {}) {
24
- return (...args) => {
25
- return {
26
- fn,
27
- args,
28
- options
29
- };
30
- };
31
- }
32
-
33
22
  // core/steps/run-step.ts
34
- async function runStep(step) {
23
+ async function runStep(stepFn, options = {}) {
24
+ const { maxRetries, retryDelay, backOffRate } = options;
35
25
  const { operationManager } = getExecutionContext();
36
- const stepName = step.options.name || step.fn.name || "<unknown>";
26
+ const stepName = options.name || stepFn.name || "<unknown>";
37
27
  const op = operationManager.getOperationResult();
38
28
  if (op) {
39
29
  return returnOrThrowOperationResult(op);
40
30
  }
41
31
  return await executeAndRecordOperation(operationManager, stepName, async () => {
42
- return await executeStepWithRetries(stepName, step.fn, step.args, step.options);
32
+ return await executeStepWithRetries(stepName, stepFn, { maxRetries, retryDelay, backOffRate });
43
33
  });
44
34
  }
45
- async function executeStepWithRetries(stepName, fn, args, retryConfig) {
35
+ async function executeStepWithRetries(stepName, fn, retryConfig) {
46
36
  const maxRetries = retryConfig.maxRetries ?? 0;
47
37
  const retryDelay = retryConfig.retryDelay ?? 0;
48
38
  const backOffRate = retryConfig.backOffRate ?? 1;
49
39
  const attemptErrors = [];
50
40
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
51
41
  try {
52
- return await fn(...args);
42
+ return await fn();
53
43
  } catch (error) {
54
44
  const err = error instanceof Error ? error : new Error(String(error));
55
45
  attemptErrors.push(err);
@@ -287,6 +277,6 @@ async function runWorkflow(wf, args = [], options = {}) {
287
277
  return createRunHandle(ctx, newRun.runId);
288
278
  }
289
279
 
290
- export { cancellableSleep, defineMessage, defineQueue, defineState, defineStep, executeStepWithRetries, getAbortSignal, getRunId, getStepId, randomUUID, receiveMessage, runStep, runWorkflow, setState, sleep2 as sleep };
280
+ export { cancellableSleep, defineMessage, defineQueue, defineState, executeStepWithRetries, getAbortSignal, getRunId, getStepId, randomUUID, receiveMessage, runStep, runWorkflow, setState, sleep2 as sleep };
291
281
  //# sourceMappingURL=workflows.js.map
292
282
  //# sourceMappingURL=workflows.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../core/message.ts","../core/queue.ts","../core/state.ts","../core/step.ts","../core/steps/run-step.ts","../core/internal/repository/insert-state.ts","../core/steps/set-state.ts","../core/internal/repository/read-and-delete-message.ts","../core/steps/receive-message.ts","../core/steps/helpers/get-step-id.ts","../core/steps/helpers/get-abort-signal.ts","../core/steps/helpers/get-run-id.ts","../core/steps/sleep.ts","../core/steps/random-uuid.ts","../core/steps/run-workflow.ts"],"names":["sleep","newRun","crypto"],"mappings":"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","file":"workflows.js","sourcesContent":["export type MessageDefinition<T> = {\n name: string;\n data?: T;\n};\n\nexport function defineMessage<T>(name: string): MessageDefinition<T> {\n return { name } as MessageDefinition<T>;\n}\n","export type QueueRateLimit = {\n limitPerPeriod: number;\n period: number;\n};\n\nexport type QueueOptions = {\n workerConcurrency?: number;\n concurrency?: number;\n rateLimit?: QueueRateLimit;\n priorityEnabled?: boolean;\n partitioningEnabled?: boolean;\n name?: string;\n};\n\nexport function defineQueue(options: QueueOptions = {}): QueueEntry {\n return () => options;\n}\n\nexport type QueueEntry = () => QueueOptions;\n\nexport type QueueDefinition = QueueOptions & { name: string };\n","export interface StateDefinition<T> {\n name: string;\n data?: T;\n}\n\nexport function defineState<T>(name: string) {\n return {\n name,\n } as StateDefinition<T>;\n}\n","export type RetryConfig = {\n maxRetries?: number;\n retryDelay?: number;\n backOffRate?: number;\n};\n\ntype StepOptions = RetryConfig & {\n name?: string;\n};\n\nexport type StepFunction<Args extends unknown[], R> = (...args: Args) => Promise<R> | R;\n\nexport type StepDefinition<TArgs extends unknown[], TReturn> = {\n fn: StepFunction<TArgs, TReturn>;\n args: TArgs;\n options: StepOptions;\n};\n\nexport function defineStep<TArgs extends unknown[], TReturn>(\n fn: StepFunction<TArgs, TReturn>,\n options: StepOptions = {},\n): (...args: TArgs) => StepDefinition<TArgs, TReturn> {\n return (...args: TArgs) => {\n return {\n fn,\n args,\n options,\n };\n };\n}\n","import {\n ErrorThatShouldNeverHappen,\n FatalError,\n MaxRetriesExceededError,\n} from '../internal/errors';\nimport { getExecutionContext } from '../internal/execution-context';\nimport { sleep } from '../internal/utils/sleep';\nimport { RetryConfig, StepDefinition, StepFunction } from '../step';\nimport {\n executeAndRecordOperation,\n returnOrThrowOperationResult,\n} from '../internal/operation-manager';\n\nexport async function runStep<TArgs extends unknown[], TReturn>(\n step: StepDefinition<TArgs, TReturn>,\n) {\n const { operationManager } = getExecutionContext();\n const stepName = step.options.name || step.fn.name || '<unknown>';\n\n const op = operationManager.getOperationResult();\n if (op) {\n return returnOrThrowOperationResult<TReturn>(op);\n }\n return await executeAndRecordOperation(operationManager, stepName, async () => {\n return await executeStepWithRetries(stepName, step.fn, step.args, step.options);\n });\n}\n\nexport async function executeStepWithRetries<TArgs extends unknown[], TReturn>(\n stepName: string,\n fn: StepFunction<TArgs, TReturn>,\n args: TArgs,\n retryConfig: RetryConfig,\n): Promise<TReturn> {\n const maxRetries = retryConfig.maxRetries ?? 0;\n const retryDelay = retryConfig.retryDelay ?? 0;\n const backOffRate = retryConfig.backOffRate ?? 1;\n\n const attemptErrors: Error[] = [];\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn(...args);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n attemptErrors.push(err);\n if (err instanceof FatalError) {\n throw err;\n }\n if (maxRetries === 0) {\n throw err;\n }\n if (attempt >= maxRetries) {\n throw new MaxRetriesExceededError(stepName, maxRetries, attemptErrors);\n }\n const delay = retryDelay * Math.pow(backOffRate, attempt);\n await sleep(delay);\n }\n }\n throw new ErrorThatShouldNeverHappen(`Step \"${stepName}\" should never be reached`);\n}\n","import { Database, Transaction } from '../db/db';\n\ntype InsertStateOptions = {\n runId: string;\n key: string;\n value: string;\n sequenceId: number;\n};\n\nexport async function insertState(tx: Transaction | Database, options: InsertStateOptions) {\n await tx\n .insertInto('state')\n .values({\n run_id: options.runId,\n key: options.key,\n value: options.value,\n })\n .onConflict((oc) =>\n oc.column('run_id').column('key').doUpdateSet({\n value: options.value,\n }),\n )\n .execute();\n\n await tx\n .insertInto('state_history')\n .values({\n run_id: options.runId,\n sequence_id: options.sequenceId,\n key: options.key,\n value: options.value,\n })\n .execute();\n}\n","import { withDbRetry } from '../internal/db/retry';\nimport { getExecutionContext } from '../internal/execution-context';\nimport { returnOrThrowOperationResult } from '../internal/operation-manager';\nimport { insertState } from '../internal/repository/insert-state';\nimport { serialize } from '../internal/serialization';\nimport { StateDefinition } from '../state';\n\nconst SET_STATE_OPERATION_NAME = 'workflow::state::set';\n\nexport async function setState<T = unknown>(state: StateDefinition<T> | string, value: T) {\n const stateKey = typeof state === 'string' ? state : state.name;\n const { operationManager, runId, db } = getExecutionContext();\n\n const op = operationManager.getOperationResult();\n if (op) {\n return returnOrThrowOperationResult<void>(op);\n }\n\n const seqId = operationManager.reserveSequenceId();\n\n await withDbRetry(async () => {\n return await db.transaction().execute(async (tx) => {\n await insertState(tx, { runId, key: stateKey, value: serialize(value), sequenceId: seqId });\n await operationManager.recordResult(SET_STATE_OPERATION_NAME, seqId, null, tx);\n });\n });\n}\n","import { Transaction } from '../db/db';\n\ntype Message = {\n id: string;\n payload?: string;\n type?: string;\n};\n\nexport async function readAndDeleteMessage(\n tx: Transaction,\n runId: string,\n messageType?: string,\n): Promise<Message | undefined> {\n const result = await tx\n .deleteFrom('messages')\n .where('destination_run_id', '=', runId)\n .$if(messageType !== undefined, (qb) => qb.where('type', '=', messageType!))\n .orderBy('created_at_epoch_ms', 'asc')\n .limit(1)\n .returning(['id', 'payload', 'type'])\n .executeTakeFirst();\n return result\n ? {\n id: result.id,\n payload: result.payload ?? undefined,\n type: result.type ?? undefined,\n }\n : undefined;\n}\n","import { withDbRetry } from '../internal/db/retry';\nimport { MessageEventBus } from '../internal/events/message-event-bus';\nimport { getExecutionContext } from '../internal/execution-context';\nimport { returnOrThrowOperationResult } from '../internal/operation-manager';\nimport { readAndDeleteMessage } from '../internal/repository/read-and-delete-message';\nimport { deserialize, serialize, serializeError } from '../internal/serialization';\nimport { MessageDefinition } from '../message';\n\nconst RECEIVE_MESSAGE_OPERATION_NAME = 'workflow::message::receive';\n\nclass MessageNotAvailableError extends Error {}\n\nexport async function receiveMessage<T>(message: MessageDefinition<T> | string): Promise<T> {\n const { runId, operationManager, messageEventBus, db } = getExecutionContext();\n const messageType = typeof message === 'string' ? message : message.name;\n\n const op = operationManager.getOperationResult();\n if (op) {\n return returnOrThrowOperationResult<T>(op) as T;\n }\n\n const seqId = operationManager.reserveSequenceId();\n\n while (true) {\n try {\n return await withDbRetry(async () => {\n return await db.transaction().execute(async (tx) => {\n const msg = await readAndDeleteMessage(tx, runId, messageType);\n if (!msg) {\n throw new MessageNotAvailableError();\n }\n await operationManager.recordResult(\n RECEIVE_MESSAGE_OPERATION_NAME,\n seqId,\n serialize(msg.payload),\n tx,\n );\n return deserialize(msg.payload!) as T;\n });\n });\n } catch (error) {\n if (error instanceof MessageNotAvailableError) {\n await waitForMessageNotification(messageEventBus, runId, messageType);\n continue;\n }\n await operationManager.recordError(\n RECEIVE_MESSAGE_OPERATION_NAME,\n seqId,\n serializeError(error as Error),\n );\n throw error;\n }\n }\n}\n\nasync function waitForMessageNotification(\n messageEventBus: MessageEventBus,\n runId: string,\n messageType: string,\n): Promise<void> {\n return new Promise((resolve) => {\n const unsubscribe = messageEventBus.subscribe(runId, messageType, () => {\n unsubscribe();\n resolve();\n });\n });\n}\n","import { getExecutionContext } from '../../internal/execution-context';\nimport { createHash } from 'node:crypto';\n\n/**\n * Generates a stable, unique step ID based on the current run ID and sequence ID.\n * This ID is deterministic and will remain the same across retries, making it\n * suitable for use as an idempotency key with third-party systems.\n *\n * The step ID is a SHA-256 hash of the run ID and sequence ID, formatted as a\n * hex string for easy use with external APIs.\n *\n * @returns A unique, stable identifier for the current step execution\n */\nexport function getStepId(): string {\n const ctx = getExecutionContext();\n const sequenceId = ctx.operationManager.getActiveSequenceId();\n\n if (sequenceId === null) {\n throw new Error('getStepId() can only be called from within a step function');\n }\n\n const hash = createHash('sha256');\n hash.update(`${ctx.runId}:${sequenceId}`);\n return hash.digest('hex');\n}\n","import { getExecutionContext } from '../../internal/execution-context';\n\nexport function getAbortSignal() {\n return getExecutionContext().abortSignal;\n}\n","import { getExecutionContext } from '../../internal/execution-context';\n\nexport function getRunId() {\n const { runId } = getExecutionContext();\n return runId;\n}\n","import { RunCancelledError } from '../internal/errors';\nimport { getExecutionContext } from '../internal/execution-context';\nimport { executeAndRecordOperation } from '../internal/operation-manager';\n\nconst SLEEP_OPERATION_NAME = '_helical::sleep';\n\nexport async function sleep(ms: number) {\n const { operationManager, abortSignal } = getExecutionContext();\n let endTimeMs: number;\n const existingResult = operationManager.getOperationResult();\n if (existingResult) {\n endTimeMs = Number(existingResult.result);\n } else {\n const currentTime = Date.now();\n endTimeMs = currentTime + ms;\n await executeAndRecordOperation(operationManager, SLEEP_OPERATION_NAME, async () => {\n return endTimeMs;\n });\n }\n const remainingMs = endTimeMs - Date.now();\n try {\n await cancellableSleep(remainingMs, abortSignal);\n } catch {\n throw new RunCancelledError();\n }\n}\n\nexport function cancellableSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new Error('Sleep aborted'));\n return;\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n const onAbort = () => {\n cleanup();\n reject(new Error('Sleep aborted'));\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n signal?.removeEventListener('abort', onAbort);\n };\n\n signal?.addEventListener('abort', onAbort);\n });\n}\n","import { getExecutionContext } from '../internal/execution-context';\nimport crypto from 'node:crypto';\nimport { executeAndRecordOperation } from '../internal/operation-manager';\n\nconst RANDOM_UUID_OPERATION_NAME = '_helical::randomUUID';\n\nexport async function randomUUID() {\n const { operationManager } = getExecutionContext();\n const existingResult = operationManager.getOperationResult();\n if (existingResult) {\n return existingResult.result as string;\n } else {\n await executeAndRecordOperation(operationManager, RANDOM_UUID_OPERATION_NAME, async () => {\n return crypto.randomUUID();\n });\n }\n}\n","import { createRunHandle } from '../../client/run';\nimport { RunWorkflowOptions } from '../../client/run-workflow';\nimport { withDbRetry } from '../internal/db/retry';\nimport { WorkflowNotFoundError } from '../internal/errors';\nimport { executeWorkflow } from '../internal/execute-workflow';\nimport { getExecutionContext } from '../internal/execution-context';\nimport { executeAndRecordOperation } from '../internal/operation-manager';\nimport { insertPendingRun } from '../internal/repository/insert-pending-run';\nimport { deserialize, deserializeError, serialize } from '../internal/serialization';\nimport { WorkflowEntry } from '../workflow';\nimport crypto from 'node:crypto';\n\ntype RunWorkflowOperationResult = {\n runId: string;\n runPath: string[];\n workflowName: string;\n};\n\nexport async function runWorkflow<TArgs extends unknown[], TReturn>(\n wf: WorkflowEntry<TArgs, TReturn> | string,\n args: TArgs = [] as unknown as TArgs,\n options: RunWorkflowOptions = {},\n) {\n const ctx = getExecutionContext();\n const { operationManager, runPath, workflowRegistry, db, executorId } = ctx;\n\n const workflow =\n typeof wf === 'string'\n ? workflowRegistry.getByName(wf)\n : workflowRegistry.getByWorkflowDefinition(wf);\n if (!workflow) {\n throw new WorkflowNotFoundError('Workflow not found');\n }\n\n const op = operationManager.getOperationResult();\n if (op) {\n if (op.error) {\n throw deserializeError(op.error);\n }\n const newRun = deserialize<RunWorkflowOperationResult>(op.result!);\n return createRunHandle<TReturn>(ctx, newRun.runId);\n }\n\n const newRun = await executeAndRecordOperation(operationManager, 'runWorkflow', async () => {\n const newRunId = options.id ?? crypto.randomUUID();\n const newRun: RunWorkflowOperationResult = {\n runId: newRunId,\n runPath: [...runPath, newRunId],\n workflowName: workflow.name,\n };\n withDbRetry(async () => {\n return await insertPendingRun(db, {\n ...newRun,\n path: newRun.runPath,\n inputs: serialize(args),\n executorId: executorId,\n });\n });\n return newRun;\n });\n\n await executeWorkflow(ctx, {\n runId: newRun.runId,\n runPath: newRun.runPath,\n workflowName: newRun.workflowName,\n fn: workflow.fn,\n args,\n options,\n });\n\n return createRunHandle<TReturn>(ctx, newRun.runId);\n}\n"]}
1
+ {"version":3,"sources":["../core/message.ts","../core/queue.ts","../core/state.ts","../core/steps/run-step.ts","../core/internal/repository/insert-state.ts","../core/steps/set-state.ts","../core/internal/repository/read-and-delete-message.ts","../core/steps/receive-message.ts","../core/steps/helpers/get-step-id.ts","../core/steps/helpers/get-abort-signal.ts","../core/steps/helpers/get-run-id.ts","../core/steps/sleep.ts","../core/steps/random-uuid.ts","../core/steps/run-workflow.ts"],"names":["sleep","newRun","crypto"],"mappings":"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","file":"workflows.js","sourcesContent":["export type MessageDefinition<T> = {\n name: string;\n data?: T;\n};\n\nexport function defineMessage<T>(name: string): MessageDefinition<T> {\n return { name } as MessageDefinition<T>;\n}\n","export type QueueRateLimit = {\n limitPerPeriod: number;\n period: number;\n};\n\nexport type QueueOptions = {\n workerConcurrency?: number;\n concurrency?: number;\n rateLimit?: QueueRateLimit;\n priorityEnabled?: boolean;\n partitioningEnabled?: boolean;\n name?: string;\n};\n\nexport function defineQueue(options: QueueOptions = {}): QueueEntry {\n return () => options;\n}\n\nexport type QueueEntry = () => QueueOptions;\n\nexport type QueueDefinition = QueueOptions & { name: string };\n","export interface StateDefinition<T> {\n name: string;\n data?: T;\n}\n\nexport function defineState<T>(name: string) {\n return {\n name,\n } as StateDefinition<T>;\n}\n","import {\n ErrorThatShouldNeverHappen,\n FatalError,\n MaxRetriesExceededError,\n} from '../internal/errors';\nimport { getExecutionContext } from '../internal/execution-context';\nimport { sleep } from '../internal/utils/sleep';\nimport {\n executeAndRecordOperation,\n returnOrThrowOperationResult,\n} from '../internal/operation-manager';\n\nexport type RetryConfig = {\n maxRetries?: number;\n retryDelay?: number;\n backOffRate?: number;\n};\n\ntype RunStepOptions = RetryConfig & {\n name?: string;\n};\n\nexport async function runStep<TReturn>(\n stepFn: () => Promise<TReturn>,\n options: RunStepOptions = {},\n) {\n const { maxRetries, retryDelay, backOffRate } = options;\n const { operationManager } = getExecutionContext();\n const stepName = options.name || stepFn.name || '<unknown>';\n\n const op = operationManager.getOperationResult();\n if (op) {\n return returnOrThrowOperationResult<TReturn>(op);\n }\n return await executeAndRecordOperation(operationManager, stepName, async () => {\n return await executeStepWithRetries(stepName, stepFn, { maxRetries, retryDelay, backOffRate });\n });\n}\n\nexport async function executeStepWithRetries<TReturn>(\n stepName: string,\n fn: () => Promise<TReturn>,\n retryConfig: RetryConfig,\n): Promise<TReturn> {\n const maxRetries = retryConfig.maxRetries ?? 0;\n const retryDelay = retryConfig.retryDelay ?? 0;\n const backOffRate = retryConfig.backOffRate ?? 1;\n\n const attemptErrors: Error[] = [];\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n attemptErrors.push(err);\n if (err instanceof FatalError) {\n throw err;\n }\n if (maxRetries === 0) {\n throw err;\n }\n if (attempt >= maxRetries) {\n throw new MaxRetriesExceededError(stepName, maxRetries, attemptErrors);\n }\n const delay = retryDelay * Math.pow(backOffRate, attempt);\n await sleep(delay);\n }\n }\n throw new ErrorThatShouldNeverHappen(`Step \"${stepName}\" should never be reached`);\n}\n","import { Database, Transaction } from '../db/db';\n\ntype InsertStateOptions = {\n runId: string;\n key: string;\n value: string;\n sequenceId: number;\n};\n\nexport async function insertState(tx: Transaction | Database, options: InsertStateOptions) {\n await tx\n .insertInto('state')\n .values({\n run_id: options.runId,\n key: options.key,\n value: options.value,\n })\n .onConflict((oc) =>\n oc.column('run_id').column('key').doUpdateSet({\n value: options.value,\n }),\n )\n .execute();\n\n await tx\n .insertInto('state_history')\n .values({\n run_id: options.runId,\n sequence_id: options.sequenceId,\n key: options.key,\n value: options.value,\n })\n .execute();\n}\n","import { withDbRetry } from '../internal/db/retry';\nimport { getExecutionContext } from '../internal/execution-context';\nimport { returnOrThrowOperationResult } from '../internal/operation-manager';\nimport { insertState } from '../internal/repository/insert-state';\nimport { serialize } from '../internal/serialization';\nimport { StateDefinition } from '../state';\n\nconst SET_STATE_OPERATION_NAME = 'workflow::state::set';\n\nexport async function setState<T = unknown>(state: StateDefinition<T> | string, value: T) {\n const stateKey = typeof state === 'string' ? state : state.name;\n const { operationManager, runId, db } = getExecutionContext();\n\n const op = operationManager.getOperationResult();\n if (op) {\n return returnOrThrowOperationResult<void>(op);\n }\n\n const seqId = operationManager.reserveSequenceId();\n\n await withDbRetry(async () => {\n return await db.transaction().execute(async (tx) => {\n await insertState(tx, { runId, key: stateKey, value: serialize(value), sequenceId: seqId });\n await operationManager.recordResult(SET_STATE_OPERATION_NAME, seqId, null, tx);\n });\n });\n}\n","import { Transaction } from '../db/db';\n\ntype Message = {\n id: string;\n payload?: string;\n type?: string;\n};\n\nexport async function readAndDeleteMessage(\n tx: Transaction,\n runId: string,\n messageType?: string,\n): Promise<Message | undefined> {\n const result = await tx\n .deleteFrom('messages')\n .where('destination_run_id', '=', runId)\n .$if(messageType !== undefined, (qb) => qb.where('type', '=', messageType!))\n .orderBy('created_at_epoch_ms', 'asc')\n .limit(1)\n .returning(['id', 'payload', 'type'])\n .executeTakeFirst();\n return result\n ? {\n id: result.id,\n payload: result.payload ?? undefined,\n type: result.type ?? undefined,\n }\n : undefined;\n}\n","import { withDbRetry } from '../internal/db/retry';\nimport { MessageEventBus } from '../internal/events/message-event-bus';\nimport { getExecutionContext } from '../internal/execution-context';\nimport { returnOrThrowOperationResult } from '../internal/operation-manager';\nimport { readAndDeleteMessage } from '../internal/repository/read-and-delete-message';\nimport { deserialize, serialize, serializeError } from '../internal/serialization';\nimport { MessageDefinition } from '../message';\n\nconst RECEIVE_MESSAGE_OPERATION_NAME = 'workflow::message::receive';\n\nclass MessageNotAvailableError extends Error {}\n\nexport async function receiveMessage<T>(message: MessageDefinition<T> | string): Promise<T> {\n const { runId, operationManager, messageEventBus, db } = getExecutionContext();\n const messageType = typeof message === 'string' ? message : message.name;\n\n const op = operationManager.getOperationResult();\n if (op) {\n return returnOrThrowOperationResult<T>(op) as T;\n }\n\n const seqId = operationManager.reserveSequenceId();\n\n while (true) {\n try {\n return await withDbRetry(async () => {\n return await db.transaction().execute(async (tx) => {\n const msg = await readAndDeleteMessage(tx, runId, messageType);\n if (!msg) {\n throw new MessageNotAvailableError();\n }\n await operationManager.recordResult(\n RECEIVE_MESSAGE_OPERATION_NAME,\n seqId,\n serialize(msg.payload),\n tx,\n );\n return deserialize(msg.payload!) as T;\n });\n });\n } catch (error) {\n if (error instanceof MessageNotAvailableError) {\n await waitForMessageNotification(messageEventBus, runId, messageType);\n continue;\n }\n await operationManager.recordError(\n RECEIVE_MESSAGE_OPERATION_NAME,\n seqId,\n serializeError(error as Error),\n );\n throw error;\n }\n }\n}\n\nasync function waitForMessageNotification(\n messageEventBus: MessageEventBus,\n runId: string,\n messageType: string,\n): Promise<void> {\n return new Promise((resolve) => {\n const unsubscribe = messageEventBus.subscribe(runId, messageType, () => {\n unsubscribe();\n resolve();\n });\n });\n}\n","import { getExecutionContext } from '../../internal/execution-context';\nimport { createHash } from 'node:crypto';\n\n/**\n * Generates a stable, unique step ID based on the current run ID and sequence ID.\n * This ID is deterministic and will remain the same across retries, making it\n * suitable for use as an idempotency key with third-party systems.\n *\n * The step ID is a SHA-256 hash of the run ID and sequence ID, formatted as a\n * hex string for easy use with external APIs.\n *\n * @returns A unique, stable identifier for the current step execution\n */\nexport function getStepId(): string {\n const ctx = getExecutionContext();\n const sequenceId = ctx.operationManager.getActiveSequenceId();\n\n if (sequenceId === null) {\n throw new Error('getStepId() can only be called from within a step function');\n }\n\n const hash = createHash('sha256');\n hash.update(`${ctx.runId}:${sequenceId}`);\n return hash.digest('hex');\n}\n","import { getExecutionContext } from '../../internal/execution-context';\n\nexport function getAbortSignal() {\n return getExecutionContext().abortSignal;\n}\n","import { getExecutionContext } from '../../internal/execution-context';\n\nexport function getRunId() {\n const { runId } = getExecutionContext();\n return runId;\n}\n","import { RunCancelledError } from '../internal/errors';\nimport { getExecutionContext } from '../internal/execution-context';\nimport { executeAndRecordOperation } from '../internal/operation-manager';\n\nconst SLEEP_OPERATION_NAME = '_helical::sleep';\n\nexport async function sleep(ms: number) {\n const { operationManager, abortSignal } = getExecutionContext();\n let endTimeMs: number;\n const existingResult = operationManager.getOperationResult();\n if (existingResult) {\n endTimeMs = Number(existingResult.result);\n } else {\n const currentTime = Date.now();\n endTimeMs = currentTime + ms;\n await executeAndRecordOperation(operationManager, SLEEP_OPERATION_NAME, async () => {\n return endTimeMs;\n });\n }\n const remainingMs = endTimeMs - Date.now();\n try {\n await cancellableSleep(remainingMs, abortSignal);\n } catch {\n throw new RunCancelledError();\n }\n}\n\nexport function cancellableSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new Error('Sleep aborted'));\n return;\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n const onAbort = () => {\n cleanup();\n reject(new Error('Sleep aborted'));\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n signal?.removeEventListener('abort', onAbort);\n };\n\n signal?.addEventListener('abort', onAbort);\n });\n}\n","import { getExecutionContext } from '../internal/execution-context';\nimport crypto from 'node:crypto';\nimport { executeAndRecordOperation } from '../internal/operation-manager';\n\nconst RANDOM_UUID_OPERATION_NAME = '_helical::randomUUID';\n\nexport async function randomUUID() {\n const { operationManager } = getExecutionContext();\n const existingResult = operationManager.getOperationResult();\n if (existingResult) {\n return existingResult.result as string;\n } else {\n await executeAndRecordOperation(operationManager, RANDOM_UUID_OPERATION_NAME, async () => {\n return crypto.randomUUID();\n });\n }\n}\n","import { createRunHandle } from '../../client/run';\nimport { RunWorkflowOptions } from '../../client/run-workflow';\nimport { withDbRetry } from '../internal/db/retry';\nimport { WorkflowNotFoundError } from '../internal/errors';\nimport { executeWorkflow } from '../internal/execute-workflow';\nimport { getExecutionContext } from '../internal/execution-context';\nimport { executeAndRecordOperation } from '../internal/operation-manager';\nimport { insertPendingRun } from '../internal/repository/insert-pending-run';\nimport { deserialize, deserializeError, serialize } from '../internal/serialization';\nimport { WorkflowEntry } from '../workflow';\nimport crypto from 'node:crypto';\n\ntype RunWorkflowOperationResult = {\n runId: string;\n runPath: string[];\n workflowName: string;\n};\n\nexport async function runWorkflow<TArgs extends unknown[], TReturn>(\n wf: WorkflowEntry<TArgs, TReturn> | string,\n args: TArgs = [] as unknown as TArgs,\n options: RunWorkflowOptions = {},\n) {\n const ctx = getExecutionContext();\n const { operationManager, runPath, workflowRegistry, db, executorId } = ctx;\n\n const workflow =\n typeof wf === 'string'\n ? workflowRegistry.getByName(wf)\n : workflowRegistry.getByWorkflowDefinition(wf);\n if (!workflow) {\n throw new WorkflowNotFoundError('Workflow not found');\n }\n\n const op = operationManager.getOperationResult();\n if (op) {\n if (op.error) {\n throw deserializeError(op.error);\n }\n const newRun = deserialize<RunWorkflowOperationResult>(op.result!);\n return createRunHandle<TReturn>(ctx, newRun.runId);\n }\n\n const newRun = await executeAndRecordOperation(operationManager, 'runWorkflow', async () => {\n const newRunId = options.id ?? crypto.randomUUID();\n const newRun: RunWorkflowOperationResult = {\n runId: newRunId,\n runPath: [...runPath, newRunId],\n workflowName: workflow.name,\n };\n withDbRetry(async () => {\n return await insertPendingRun(db, {\n ...newRun,\n path: newRun.runPath,\n inputs: serialize(args),\n executorId: executorId,\n });\n });\n return newRun;\n });\n\n await executeWorkflow(ctx, {\n runId: newRun.runId,\n runPath: newRun.runPath,\n workflowName: newRun.workflowName,\n fn: workflow.fn,\n args,\n options,\n });\n\n return createRunHandle<TReturn>(ctx, newRun.runId);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usehelical/workflows",
3
- "version": "0.0.1-alpha.10",
3
+ "version": "0.0.1-alpha.11",
4
4
  "description": "simple typesage durable workflows without magic",
5
5
  "main": "./dist/index.js",
6
6
  "type": "module",