UNPKG

@temporalio/workflow

Version:
448 lines (447 loc) 16.9 kB
import type { RawSourceMap } from 'source-map'; import { RetryPolicy, TemporalFailure, CommonWorkflowOptions, HandlerUnfinishedPolicy, SearchAttributes, SignalDefinition, UpdateDefinition, QueryDefinition, Duration, VersioningIntent } from '@temporalio/common'; import type { coresdk } from '@temporalio/proto'; /** * Workflow Execution information */ export interface WorkflowInfo { /** * ID of the Workflow, this can be set by the client during Workflow creation. * A single Workflow may run multiple times e.g. when scheduled with cron. */ readonly workflowId: string; /** * ID of a single Workflow run */ readonly runId: string; /** * Workflow function's name */ readonly workflowType: string; /** * Indexed information attached to the Workflow Execution * * This value may change during the lifetime of an Execution. */ readonly searchAttributes: SearchAttributes; /** * Non-indexed information attached to the Workflow Execution */ readonly memo?: Record<string, unknown>; /** * Parent Workflow info (present if this is a Child Workflow) */ readonly parent?: ParentWorkflowInfo; /** * Result from the previous Run (present if this is a Cron Workflow or was Continued As New). * * An array of values, since other SDKs may return multiple values from a Workflow. */ readonly lastResult?: unknown; /** * Failure from the previous Run (present when this Run is a retry, or the last Run of a Cron Workflow failed) */ readonly lastFailure?: TemporalFailure; /** * Length of Workflow history up until the current Workflow Task. * * This value changes during the lifetime of an Execution. * * You may safely use this information to decide when to {@link continueAsNew}. */ readonly historyLength: number; /** * Size of Workflow history in bytes until the current Workflow Task. * * This value changes during the lifetime of an Execution. * * Supported only on Temporal Server 1.20+, always zero on older servers. * * You may safely use this information to decide when to {@link continueAsNew}. */ readonly historySize: number; /** * A hint provided by the current WorkflowTaskStarted event recommending whether to * {@link continueAsNew}. * * This value changes during the lifetime of an Execution. * * Supported only on Temporal Server 1.20+, always `false` on older servers. */ readonly continueAsNewSuggested: boolean; /** * Task queue this Workflow is executing on */ readonly taskQueue: string; /** * Namespace this Workflow is executing in */ readonly namespace: string; /** * Run Id of the first Run in this Execution Chain */ readonly firstExecutionRunId: string; /** * The last Run Id in this Execution Chain */ readonly continuedFromExecutionRunId?: string; /** * Time at which this [Workflow Execution Chain](https://docs.temporal.io/workflows#workflow-execution-chain) was started */ readonly startTime: Date; /** * Time at which the current Workflow Run started */ readonly runStartTime: Date; /** * Milliseconds after which the Workflow Execution is automatically terminated by Temporal Server. Set via {@link WorkflowOptions.workflowExecutionTimeout}. */ readonly executionTimeoutMs?: number; /** * Time at which the Workflow Execution expires */ readonly executionExpirationTime?: Date; /** * Milliseconds after which the Workflow Run is automatically terminated by Temporal Server. Set via {@link WorkflowOptions.workflowRunTimeout}. */ readonly runTimeoutMs?: number; /** * Maximum execution time of a Workflow Task in milliseconds. Set via {@link WorkflowOptions.workflowTaskTimeout}. */ readonly taskTimeoutMs: number; /** * Retry Policy for this Execution. Set via {@link WorkflowOptions.retry}. */ readonly retryPolicy?: RetryPolicy; /** * Starts at 1 and increments for every retry if there is a `retryPolicy` */ readonly attempt: number; /** * Cron Schedule for this Execution. Set via {@link WorkflowOptions.cronSchedule}. */ readonly cronSchedule?: string; /** * Milliseconds between Cron Runs */ readonly cronScheduleToScheduleInterval?: number; /** * The Build ID of the worker which executed the current Workflow Task. May be undefined if the * task was completed by a worker without a Build ID. If this worker is the one executing this * task for the first time and has a Build ID set, then its ID will be used. This value may change * over the lifetime of the workflow run, but is deterministic and safe to use for branching. */ readonly currentBuildId?: string; readonly unsafe: UnsafeWorkflowInfo; } /** * Unsafe information about the current Workflow Execution. * * Never rely on this information in Workflow logic as it will cause non-deterministic behavior. */ export interface UnsafeWorkflowInfo { /** * Current system time in milliseconds * * The safe version of time is `new Date()` and `Date.now()`, which are set on the first invocation of a Workflow * Task and stay constant for the duration of the Task and during replay. */ readonly now: () => number; readonly isReplaying: boolean; } /** * Information about a workflow update. */ export interface UpdateInfo { /** * A workflow-unique identifier for this update. */ readonly id: string; /** * The update type name. */ readonly name: string; } export interface ParentWorkflowInfo { workflowId: string; runId: string; namespace: string; } /** * Not an actual error, used by the Workflow runtime to abort execution when {@link continueAsNew} is called */ export declare class ContinueAsNew extends Error { readonly command: coresdk.workflow_commands.IContinueAsNewWorkflowExecution; constructor(command: coresdk.workflow_commands.IContinueAsNewWorkflowExecution); } /** * Options for continuing a Workflow as new */ export interface ContinueAsNewOptions { /** * A string representing the Workflow type name, e.g. the filename in the Node.js SDK or class name in Java */ workflowType?: string; /** * Task queue to continue the Workflow in */ taskQueue?: string; /** * Timeout for the entire Workflow run * @format {@link https://www.npmjs.com/package/ms | ms-formatted string} */ workflowRunTimeout?: Duration; /** * Timeout for a single Workflow task * @format {@link https://www.npmjs.com/package/ms | ms-formatted string} */ workflowTaskTimeout?: Duration; /** * Non-searchable attributes to attach to next Workflow run */ memo?: Record<string, unknown>; /** * Searchable attributes to attach to next Workflow run */ searchAttributes?: SearchAttributes; /** * When using the Worker Versioning feature, specifies whether this Workflow should * Continue-as-New onto a worker with a compatible Build Id or not. See {@link VersioningIntent}. * * @default 'COMPATIBLE' * * @experimental */ versioningIntent?: VersioningIntent; } /** * Specifies: * - whether cancellation requests are sent to the Child * - whether and when a {@link CanceledFailure} is thrown from {@link executeChild} or * {@link ChildWorkflowHandle.result} * * @default {@link ChildWorkflowCancellationType.WAIT_CANCELLATION_COMPLETED} */ export type ChildWorkflowCancellationType = (typeof ChildWorkflowCancellationType)[keyof typeof ChildWorkflowCancellationType]; export declare const ChildWorkflowCancellationType: { /** * Don't send a cancellation request to the Child. */ readonly ABANDON: "ABANDON"; /** * Send a cancellation request to the Child. Immediately throw the error. */ readonly TRY_CANCEL: "TRY_CANCEL"; /** * Send a cancellation request to the Child. The Child may respect cancellation, in which case an error will be thrown * when cancellation has completed, and {@link isCancellation}(error) will be true. On the other hand, the Child may * ignore the cancellation request, in which case an error might be thrown with a different cause, or the Child may * complete successfully. * * @default */ readonly WAIT_CANCELLATION_COMPLETED: "WAIT_CANCELLATION_COMPLETED"; /** * Send a cancellation request to the Child. Throw the error once the Server receives the Child cancellation request. */ readonly WAIT_CANCELLATION_REQUESTED: "WAIT_CANCELLATION_REQUESTED"; }; export declare const encodeChildWorkflowCancellationType: (input: coresdk.child_workflow.ChildWorkflowCancellationType | import("@temporalio/common/lib/type-helpers").RemovePrefix<"", "ABANDON" | "TRY_CANCEL" | "WAIT_CANCELLATION_COMPLETED" | "WAIT_CANCELLATION_REQUESTED"> | null | undefined) => coresdk.child_workflow.ChildWorkflowCancellationType | undefined, decodeChildWorkflowCancellationType: (input: coresdk.child_workflow.ChildWorkflowCancellationType | null | undefined) => import("@temporalio/common/lib/type-helpers").RemovePrefix<"", "ABANDON" | "TRY_CANCEL" | "WAIT_CANCELLATION_COMPLETED" | "WAIT_CANCELLATION_REQUESTED"> | undefined; /** * How a Child Workflow reacts to the Parent Workflow reaching a Closed state. * * @see {@link https://docs.temporal.io/concepts/what-is-a-parent-close-policy/ | Parent Close Policy} */ export type ParentClosePolicy = (typeof ParentClosePolicy)[keyof typeof ParentClosePolicy]; export declare const ParentClosePolicy: { /** * When the Parent is Closed, the Child is Terminated. * * @default */ readonly TERMINATE: "TERMINATE"; /** * When the Parent is Closed, nothing is done to the Child. */ readonly ABANDON: "ABANDON"; /** * When the Parent is Closed, the Child is Cancelled. */ readonly REQUEST_CANCEL: "REQUEST_CANCEL"; /** * If a `ParentClosePolicy` is set to this, or is not set at all, the server default value will be used. * * @deprecated Either leave property `undefined`, or set an explicit policy instead. */ readonly PARENT_CLOSE_POLICY_UNSPECIFIED: undefined; /** * When the Parent is Closed, the Child is Terminated. * * @deprecated Use {@link ParentClosePolicy.TERMINATE} instead. */ readonly PARENT_CLOSE_POLICY_TERMINATE: "TERMINATE"; /** * When the Parent is Closed, nothing is done to the Child. * * @deprecated Use {@link ParentClosePolicy.ABANDON} instead. */ readonly PARENT_CLOSE_POLICY_ABANDON: "ABANDON"; /** * When the Parent is Closed, the Child is Cancelled. * * @deprecated Use {@link ParentClosePolicy.REQUEST_CANCEL} instead. */ readonly PARENT_CLOSE_POLICY_REQUEST_CANCEL: "REQUEST_CANCEL"; }; export declare const encodeParentClosePolicy: (input: "ABANDON" | "TERMINATE" | "REQUEST_CANCEL" | "PARENT_CLOSE_POLICY_TERMINATE" | "PARENT_CLOSE_POLICY_ABANDON" | "PARENT_CLOSE_POLICY_REQUEST_CANCEL" | coresdk.child_workflow.ParentClosePolicy | null | undefined) => coresdk.child_workflow.ParentClosePolicy | undefined, decodeParentClosePolicy: (input: coresdk.child_workflow.ParentClosePolicy | null | undefined) => "ABANDON" | "TERMINATE" | "REQUEST_CANCEL" | undefined; export interface ChildWorkflowOptions extends CommonWorkflowOptions { /** * Workflow id to use when starting. If not specified a UUID is generated. Note that it is * dangerous as in case of client side retries no deduplication will happen based on the * generated id. So prefer assigning business meaningful ids if possible. */ workflowId?: string; /** * Task queue to use for Workflow tasks. It should match a task queue specified when creating a * `Worker` that hosts the Workflow code. * * By default, a child is scheduled on the same Task Queue as the parent. */ taskQueue?: string; /** * Specifies: * - whether cancellation requests are sent to the Child * - whether and when an error is thrown from {@link executeChild} or * {@link ChildWorkflowHandle.result} * * @default {@link ChildWorkflowCancellationType.WAIT_CANCELLATION_COMPLETED} */ cancellationType?: ChildWorkflowCancellationType; /** * Specifies how the Child reacts to the Parent Workflow reaching a Closed state. * * @default {@link ParentClosePolicy.PARENT_CLOSE_POLICY_TERMINATE} */ parentClosePolicy?: ParentClosePolicy; /** * When using the Worker Versioning feature, specifies whether this Child Workflow should run on * a worker with a compatible Build Id or not. See {@link VersioningIntent}. * * @default 'COMPATIBLE' * * @experimental */ versioningIntent?: VersioningIntent; } export type RequiredChildWorkflowOptions = Required<Pick<ChildWorkflowOptions, 'workflowId' | 'cancellationType'>> & { args: unknown[]; }; export type ChildWorkflowOptionsWithDefaults = ChildWorkflowOptions & RequiredChildWorkflowOptions; export interface StackTraceSDKInfo { name: string; version: string; } /** * Represents a slice of a file starting at lineOffset */ export interface StackTraceFileSlice { /** * Only used possible to trim the file without breaking syntax highlighting. */ line_offset: number; /** * slice of a file with `\n` (newline) line terminator. */ content: string; } /** * A pointer to a location in a file */ export interface StackTraceFileLocation { /** * Path to source file (absolute or relative). * When using a relative path, make sure all paths are relative to the same root. */ file_path?: string; /** * If possible, SDK should send this, required for displaying the code location. */ line?: number; /** * If possible, SDK should send this. */ column?: number; /** * Function name this line belongs to (if applicable). * Used for falling back to stack trace view. */ function_name?: string; /** * Flag to mark this as internal SDK code and hide by default in the UI. */ internal_code: boolean; } export interface StackTrace { locations: StackTraceFileLocation[]; } /** * Used as the result for the enhanced stack trace query */ export interface EnhancedStackTrace { sdk: StackTraceSDKInfo; /** * Mapping of file path to file contents. * SDK may choose to send no, some or all sources. * Sources might be trimmed, and some time only the file(s) of the top element of the trace will be sent. */ sources: Record<string, StackTraceFileSlice[]>; stacks: StackTrace[]; } export interface WorkflowCreateOptions { info: WorkflowInfo; randomnessSeed: number[]; now: number; showStackTraceSources: boolean; } export interface WorkflowCreateOptionsInternal extends WorkflowCreateOptions { sourceMap: RawSourceMap; registeredActivityNames: Set<string>; getTimeOfDay(): bigint; } /** * A handler function capable of accepting the arguments for a given UpdateDefinition, SignalDefinition or QueryDefinition. */ export type Handler<Ret, Args extends any[], T extends UpdateDefinition<Ret, Args> | SignalDefinition<Args> | QueryDefinition<Ret, Args>> = T extends UpdateDefinition<infer R, infer A> ? (...args: A) => R | Promise<R> : T extends SignalDefinition<infer A> ? (...args: A) => void | Promise<void> : T extends QueryDefinition<infer R, infer A> ? (...args: A) => R : never; /** * A handler function accepting signal calls for non-registered signal names. */ export type DefaultSignalHandler = (signalName: string, ...args: unknown[]) => void | Promise<void>; /** * A validation function capable of accepting the arguments for a given UpdateDefinition. */ export type UpdateValidator<Args extends any[]> = (...args: Args) => void; /** * A description of a query handler. */ export type QueryHandlerOptions = { description?: string; }; /** * A description of a signal handler. */ export type SignalHandlerOptions = { description?: string; unfinishedPolicy?: HandlerUnfinishedPolicy; }; /** * A validator and description of an update handler. */ export type UpdateHandlerOptions<Args extends any[]> = { validator?: UpdateValidator<Args>; description?: string; unfinishedPolicy?: HandlerUnfinishedPolicy; }; export interface ActivationCompletion { commands: coresdk.workflow_commands.IWorkflowCommand[]; usedInternalFlags: number[]; }