import { Message, MessageAttributes } from '@node-ts/bus-messages'; import { ClassConstructor } from '../util'; import { MessageWorkflowMapping } from './message-workflow-mapping'; import { WorkflowState, WorkflowStatus } from './workflow-state'; export type WorkflowHandler = (message?: TMessage, attributes?: TMessageAttributes, workflowState?: WorkflowStateType) => void | Partial | Promise>; export type WhenHandler> = (workflow: WorkflowType) => WorkflowHandler; type KeyOfType = { [P in keyof T]: T[P] extends U ? P : never; }[keyof T]; export type OnWhenHandler = Workflow> = { workflowCtor: ClassConstructor>; workflowHandler: KeyOfType; customLookup: MessageWorkflowMapping | undefined; }; /** * A workflow configuration that describes how to map incoming messages to handlers within the workflow. */ export declare class WorkflowMapper> { private readonly workflow; readonly onStartedBy: Map, { workflowCtor: ClassConstructor>; workflowHandler: KeyOfType; }>; readonly onWhen: Map, OnWhenHandler>; private workflowStateType; constructor(workflow: ClassConstructor>); get workflowStateCtor(): ClassConstructor | undefined; withState(workflowStateType: ClassConstructor): this; startedBy(message: ClassConstructor, workflowHandler: KeyOfType): this; when(message: ClassConstructor, workflowHandler: KeyOfType, customLookup?: MessageWorkflowMapping): this; } export declare abstract class Workflow { abstract configureWorkflow(mapper: WorkflowMapper): void; /** * Ends the workflow and optionally sets any final state. After this is returned, * the workflow instance will no longer be activated for subsequent messages. */ protected completeWorkflow(workflowState?: Partial): { $status: WorkflowStatus; $workflowId?: WorkflowStateType["$workflowId"] | undefined; $version?: WorkflowStateType["$version"] | undefined; $name?: WorkflowStateType["$name"] | undefined; }; /** * Prevents a new workflow from starting, and prevents the persistence of * the workflow state. This should only be used in `startedBy` workflow handlers. */ protected discardWorkflow(): { $status: WorkflowStatus; }; } export {};