@temporalio/workflow
Version:
Temporal.io SDK Workflow sub-package
456 lines (455 loc) • 19.8 kB
TypeScript
import { ActivityFunction, ActivityOptions, LocalActivityOptions, QueryDefinition, SearchAttributes, SignalDefinition, UntypedActivities, UpdateDefinition, WithWorkflowArgs, Workflow, WorkflowResultType, WorkflowReturnType } from '@temporalio/common';
import { Duration } from '@temporalio/common/lib/time';
import { temporal } from '@temporalio/proto';
import { ChildWorkflowOptions, ChildWorkflowOptionsWithDefaults, ContinueAsNewOptions, DefaultSignalHandler, EnhancedStackTrace, Handler, QueryHandlerOptions, SignalHandlerOptions, UpdateHandlerOptions, WorkflowInfo, UpdateInfo } from './interfaces';
import { ChildWorkflowHandle, ExternalWorkflowHandle } from './workflow-handle';
/**
* Adds default values of `workflowId` and `cancellationType` to given workflow options.
*/
export declare function addDefaultWorkflowOptions<T extends Workflow>(opts: WithWorkflowArgs<T, ChildWorkflowOptions>): ChildWorkflowOptionsWithDefaults;
/**
* Asynchronous sleep.
*
* Schedules a timer on the Temporal service.
*
* @param ms sleep duration - number of milliseconds or {@link https://www.npmjs.com/package/ms | ms-formatted string}.
* If given a negative number or 0, value will be set to 1.
*/
export declare function sleep(ms: Duration): Promise<void>;
/**
* Schedule an activity and run outbound interceptors
* @hidden
*/
export declare function scheduleActivity<R>(activityType: string, args: any[], options: ActivityOptions): Promise<R>;
/**
* Schedule an activity and run outbound interceptors
* @hidden
*/
export declare function scheduleLocalActivity<R>(activityType: string, args: any[], options: LocalActivityOptions): Promise<R>;
/**
* Symbol used in the return type of proxy methods to mark that an attribute on the source type is not a method.
*
* @see {@link ActivityInterfaceFor}
* @see {@link proxyActivities}
* @see {@link proxyLocalActivities}
*/
export declare const NotAnActivityMethod: unique symbol;
/**
* Type helper that takes a type `T` and transforms attributes that are not {@link ActivityFunction} to
* {@link NotAnActivityMethod}.
*
* @example
*
* Used by {@link proxyActivities} to get this compile-time error:
*
* ```ts
* interface MyActivities {
* valid(input: number): Promise<number>;
* invalid(input: number): number;
* }
*
* const act = proxyActivities<MyActivities>({ startToCloseTimeout: '5m' });
*
* await act.valid(true);
* await act.invalid();
* // ^ TS complains with:
* // (property) invalidDefinition: typeof NotAnActivityMethod
* // This expression is not callable.
* // Type 'Symbol' has no call signatures.(2349)
* ```
*/
export type ActivityInterfaceFor<T> = {
[K in keyof T]: T[K] extends ActivityFunction ? T[K] : typeof NotAnActivityMethod;
};
/**
* Configure Activity functions with given {@link ActivityOptions}.
*
* This method may be called multiple times to setup Activities with different options.
*
* @return a {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy | Proxy} for
* which each attribute is a callable Activity function
*
* @example
* ```ts
* import { proxyActivities } from '@temporalio/workflow';
* import * as activities from '../activities';
*
* // Setup Activities from module exports
* const { httpGet, otherActivity } = proxyActivities<typeof activities>({
* startToCloseTimeout: '30 minutes',
* });
*
* // Setup Activities from an explicit interface (e.g. when defined by another SDK)
* interface JavaActivities {
* httpGetFromJava(url: string): Promise<string>
* someOtherJavaActivity(arg1: number, arg2: string): Promise<string>;
* }
*
* const {
* httpGetFromJava,
* someOtherJavaActivity
* } = proxyActivities<JavaActivities>({
* taskQueue: 'java-worker-taskQueue',
* startToCloseTimeout: '5m',
* });
*
* export function execute(): Promise<void> {
* const response = await httpGet("http://example.com");
* // ...
* }
* ```
*/
export declare function proxyActivities<A = UntypedActivities>(options: ActivityOptions): ActivityInterfaceFor<A>;
/**
* Configure Local Activity functions with given {@link LocalActivityOptions}.
*
* This method may be called multiple times to setup Activities with different options.
*
* @return a {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy | Proxy}
* for which each attribute is a callable Activity function
*
* @see {@link proxyActivities} for examples
*/
export declare function proxyLocalActivities<A = UntypedActivities>(options: LocalActivityOptions): ActivityInterfaceFor<A>;
/**
* Returns a client-side handle that can be used to signal and cancel an existing Workflow execution.
* It takes a Workflow ID and optional run ID.
*/
export declare function getExternalWorkflowHandle(workflowId: string, runId?: string): ExternalWorkflowHandle;
/**
* Start a child Workflow execution
*
* - Returns a client-side handle that implements a child Workflow interface.
* - By default, a child will be scheduled on the same task queue as its parent.
*
* A child Workflow handle supports awaiting completion, signaling and cancellation via {@link CancellationScope}s.
* In order to query the child, use a {@link WorkflowClient} from an Activity.
*/
export declare function startChild<T extends Workflow>(workflowType: string, options: WithWorkflowArgs<T, ChildWorkflowOptions>): Promise<ChildWorkflowHandle<T>>;
/**
* Start a child Workflow execution
*
* - Returns a client-side handle that implements a child Workflow interface.
* - Deduces the Workflow type and signature from provided Workflow function.
* - By default, a child will be scheduled on the same task queue as its parent.
*
* A child Workflow handle supports awaiting completion, signaling and cancellation via {@link CancellationScope}s.
* In order to query the child, use a {@link WorkflowClient} from an Activity.
*/
export declare function startChild<T extends Workflow>(workflowFunc: T, options: WithWorkflowArgs<T, ChildWorkflowOptions>): Promise<ChildWorkflowHandle<T>>;
/**
* Start a child Workflow execution
*
* **Override for Workflows that accept no arguments**.
*
* - Returns a client-side handle that implements a child Workflow interface.
* - The child will be scheduled on the same task queue as its parent.
*
* A child Workflow handle supports awaiting completion, signaling and cancellation via {@link CancellationScope}s.
* In order to query the child, use a {@link WorkflowClient} from an Activity.
*/
export declare function startChild<T extends () => Promise<any>>(workflowType: string): Promise<ChildWorkflowHandle<T>>;
/**
* Start a child Workflow execution
*
* **Override for Workflows that accept no arguments**.
*
* - Returns a client-side handle that implements a child Workflow interface.
* - Deduces the Workflow type and signature from provided Workflow function.
* - The child will be scheduled on the same task queue as its parent.
*
* A child Workflow handle supports awaiting completion, signaling and cancellation via {@link CancellationScope}s.
* In order to query the child, use a {@link WorkflowClient} from an Activity.
*/
export declare function startChild<T extends () => Promise<any>>(workflowFunc: T): Promise<ChildWorkflowHandle<T>>;
/**
* Start a child Workflow execution and await its completion.
*
* - By default, a child will be scheduled on the same task queue as its parent.
* - This operation is cancellable using {@link CancellationScope}s.
*
* @return The result of the child Workflow.
*/
export declare function executeChild<T extends Workflow>(workflowType: string, options: WithWorkflowArgs<T, ChildWorkflowOptions>): Promise<WorkflowResultType<T>>;
/**
* Start a child Workflow execution and await its completion.
*
* - By default, a child will be scheduled on the same task queue as its parent.
* - Deduces the Workflow type and signature from provided Workflow function.
* - This operation is cancellable using {@link CancellationScope}s.
*
* @return The result of the child Workflow.
*/
export declare function executeChild<T extends Workflow>(workflowFunc: T, options: WithWorkflowArgs<T, ChildWorkflowOptions>): Promise<WorkflowResultType<T>>;
/**
* Start a child Workflow execution and await its completion.
*
* **Override for Workflows that accept no arguments**.
*
* - The child will be scheduled on the same task queue as its parent.
* - This operation is cancellable using {@link CancellationScope}s.
*
* @return The result of the child Workflow.
*/
export declare function executeChild<T extends () => WorkflowReturnType>(workflowType: string): Promise<WorkflowResultType<T>>;
/**
* Start a child Workflow execution and await its completion.
*
* **Override for Workflows that accept no arguments**.
*
* - The child will be scheduled on the same task queue as its parent.
* - Deduces the Workflow type and signature from provided Workflow function.
* - This operation is cancellable using {@link CancellationScope}s.
*
* @return The result of the child Workflow.
*/
export declare function executeChild<T extends () => WorkflowReturnType>(workflowFunc: T): Promise<WorkflowResultType<T>>;
/**
* Get information about the current Workflow.
*
* WARNING: This function returns a frozen copy of WorkflowInfo, at the point where this method has been called.
* Changes happening at later point in workflow execution will not be reflected in the returned object.
*
* For this reason, we recommend calling `workflowInfo()` on every access to {@link WorkflowInfo}'s fields,
* rather than caching the `WorkflowInfo` object (or part of it) in a local variable. For example:
*
* ```ts
* // GOOD
* function myWorkflow() {
* doSomething(workflowInfo().searchAttributes)
* ...
* doSomethingElse(workflowInfo().searchAttributes)
* }
* ```
*
* vs
*
* ```ts
* // BAD
* function myWorkflow() {
* const attributes = workflowInfo().searchAttributes
* doSomething(attributes)
* ...
* doSomethingElse(attributes)
* }
* ```
*/
export declare function workflowInfo(): WorkflowInfo;
/**
* Get information about the current update if any.
*
* @return Info for the current update handler the code calling this is executing
* within if any.
*/
export declare function currentUpdateInfo(): UpdateInfo | undefined;
/**
* Returns whether or not code is executing in workflow context
*/
export declare function inWorkflowContext(): boolean;
/**
* Returns a function `f` that will cause the current Workflow to ContinueAsNew when called.
*
* `f` takes the same arguments as the Workflow function supplied to typeparam `F`.
*
* Once `f` is called, Workflow Execution immediately completes.
*/
export declare function makeContinueAsNewFunc<F extends Workflow>(options?: ContinueAsNewOptions): (...args: Parameters<F>) => Promise<never>;
/**
* {@link https://docs.temporal.io/concepts/what-is-continue-as-new/ | Continues-As-New} the current Workflow Execution
* with default options.
*
* Shorthand for `makeContinueAsNewFunc<F>()(...args)`. (See: {@link makeContinueAsNewFunc}.)
*
* @example
*
*```ts
*import { continueAsNew } from '@temporalio/workflow';
*
*export async function myWorkflow(n: number): Promise<void> {
* // ... Workflow logic
* await continueAsNew<typeof myWorkflow>(n + 1);
*}
*```
*/
export declare function continueAsNew<F extends Workflow>(...args: Parameters<F>): Promise<never>;
/**
* Generate an RFC compliant V4 uuid.
* Uses the workflow's deterministic PRNG making it safe for use within a workflow.
* This function is cryptographically insecure.
* See the {@link https://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid | stackoverflow discussion}.
*/
export declare function uuid4(): string;
/**
* Patch or upgrade workflow code by checking or stating that this workflow has a certain patch.
*
* See {@link https://docs.temporal.io/typescript/versioning | docs page} for info.
*
* If the workflow is replaying an existing history, then this function returns true if that
* history was produced by a worker which also had a `patched` call with the same `patchId`.
* If the history was produced by a worker *without* such a call, then it will return false.
*
* If the workflow is not currently replaying, then this call *always* returns true.
*
* Your workflow code should run the "new" code if this returns true, if it returns false, you
* should run the "old" code. By doing this, you can maintain determinism.
*
* @param patchId An identifier that should be unique to this patch. It is OK to use multiple
* calls with the same ID, which means all such calls will always return the same value.
*/
export declare function patched(patchId: string): boolean;
/**
* Indicate that a patch is being phased out.
*
* See {@link https://docs.temporal.io/typescript/versioning | docs page} for info.
*
* Workflows with this call may be deployed alongside workflows with a {@link patched} call, but
* they must *not* be deployed while any workers still exist running old code without a
* {@link patched} call, or any runs with histories produced by such workers exist. If either kind
* of worker encounters a history produced by the other, their behavior is undefined.
*
* Once all live workflow runs have been produced by workers with this call, you can deploy workers
* which are free of either kind of patch call for this ID. Workers with and without this call
* may coexist, as long as they are both running the "new" code.
*
* @param patchId An identifier that should be unique to this patch. It is OK to use multiple
* calls with the same ID, which means all such calls will always return the same value.
*/
export declare function deprecatePatch(patchId: string): void;
/**
* Returns a Promise that resolves when `fn` evaluates to `true` or `timeout` expires.
*
* @param timeout number of milliseconds or {@link https://www.npmjs.com/package/ms | ms-formatted string}
*
* @returns a boolean indicating whether the condition was true before the timeout expires
*/
export declare function condition(fn: () => boolean, timeout: Duration): Promise<boolean>;
/**
* Returns a Promise that resolves when `fn` evaluates to `true`.
*/
export declare function condition(fn: () => boolean): Promise<void>;
/**
* Define an update method for a Workflow.
*
* A definition is used to register a handler in the Workflow via {@link setHandler} and to update a Workflow using a {@link WorkflowHandle}, {@link ChildWorkflowHandle} or {@link ExternalWorkflowHandle}.
* A definition can be reused in multiple Workflows.
*/
export declare function defineUpdate<Ret, Args extends any[] = [], Name extends string = string>(name: Name): UpdateDefinition<Ret, Args, Name>;
/**
* Define a signal method for a Workflow.
*
* A definition is used to register a handler in the Workflow via {@link setHandler} and to signal a Workflow using a {@link WorkflowHandle}, {@link ChildWorkflowHandle} or {@link ExternalWorkflowHandle}.
* A definition can be reused in multiple Workflows.
*/
export declare function defineSignal<Args extends any[] = [], Name extends string = string>(name: Name): SignalDefinition<Args, Name>;
/**
* Define a query method for a Workflow.
*
* A definition is used to register a handler in the Workflow via {@link setHandler} and to query a Workflow using a {@link WorkflowHandle}.
* A definition can be reused in multiple Workflows.
*/
export declare function defineQuery<Ret, Args extends any[] = [], Name extends string = string>(name: Name): QueryDefinition<Ret, Args, Name>;
/**
* Set a handler function for a Workflow update, signal, or query.
*
* If this function is called multiple times for a given update, signal, or query name the last handler will overwrite any previous calls.
*
* @param def an {@link UpdateDefinition}, {@link SignalDefinition}, or {@link QueryDefinition} as returned by {@link defineUpdate}, {@link defineSignal}, or {@link defineQuery} respectively.
* @param handler a compatible handler function for the given definition or `undefined` to unset the handler.
* @param options an optional `description` of the handler and an optional update `validator` function.
*/
export declare function setHandler<Ret, Args extends any[], T extends QueryDefinition<Ret, Args>>(def: T, handler: Handler<Ret, Args, T> | undefined, options?: QueryHandlerOptions): void;
export declare function setHandler<Ret, Args extends any[], T extends SignalDefinition<Args>>(def: T, handler: Handler<Ret, Args, T> | undefined, options?: SignalHandlerOptions): void;
export declare function setHandler<Ret, Args extends any[], T extends UpdateDefinition<Ret, Args>>(def: T, handler: Handler<Ret, Args, T> | undefined, options?: UpdateHandlerOptions<Args>): void;
/**
* Set a signal handler function that will handle signals calls for non-registered signal names.
*
* Signals are dispatched to the default signal handler in the order that they were accepted by the server.
*
* If this function is called multiple times for a given signal or query name the last handler will overwrite any previous calls.
*
* @param handler a function that will handle signals for non-registered signal names, or `undefined` to unset the handler.
*/
export declare function setDefaultSignalHandler(handler: DefaultSignalHandler | undefined): void;
/**
* Updates this Workflow's Search Attributes by merging the provided `searchAttributes` with the existing Search
* Attributes, `workflowInfo().searchAttributes`.
*
* For example, this Workflow code:
*
* ```ts
* upsertSearchAttributes({
* CustomIntField: [1],
* CustomBoolField: [true]
* });
* upsertSearchAttributes({
* CustomIntField: [42],
* CustomKeywordField: ['durable code', 'is great']
* });
* ```
*
* would result in the Workflow having these Search Attributes:
*
* ```ts
* {
* CustomIntField: [42],
* CustomBoolField: [true],
* CustomKeywordField: ['durable code', 'is great']
* }
* ```
*
* @param searchAttributes The Record to merge. Use a value of `[]` to clear a Search Attribute.
*/
export declare function upsertSearchAttributes(searchAttributes: SearchAttributes): void;
/**
* Updates this Workflow's Memos by merging the provided `memo` with existing
* Memos (as returned by `workflowInfo().memo`).
*
* New memo is merged by replacing properties of the same name _at the first
* level only_. Setting a property to value `undefined` or `null` clears that
* key from the Memo.
*
* For example:
*
* ```ts
* upsertMemo({
* key1: value,
* key3: { subkey1: value }
* key4: value,
* });
* upsertMemo({
* key2: value
* key3: { subkey2: value }
* key4: undefined,
* });
* ```
*
* would result in the Workflow having these Memo:
*
* ```ts
* {
* key1: value,
* key2: value,
* key3: { subkey2: value } // Note this object was completely replaced
* // Note that key4 was completely removed
* }
* ```
*
* @param memo The Record to merge.
*/
export declare function upsertMemo(memo: Record<string, unknown>): void;
/**
* Whether update and signal handlers have finished executing.
*
* Consider waiting on this condition before workflow return or continue-as-new, to prevent
* interruption of in-progress handlers by workflow exit:
*
* ```ts
* await workflow.condition(workflow.allHandlersFinished)
* ```
*
* @returns true if there are no in-progress update or signal handler executions.
*/
export declare function allHandlersFinished(): boolean;
export declare const stackTraceQuery: QueryDefinition<string, [], string>;
export declare const enhancedStackTraceQuery: QueryDefinition<EnhancedStackTrace, [], string>;
export declare const workflowMetadataQuery: QueryDefinition<temporal.api.sdk.v1.IWorkflowMetadata, [], string>;