@flowlab/all
Version:
A cool library focusing on handling various flows
115 lines (100 loc) • 4.38 kB
text/typescript
// src/types/config.ts
import { IWorkflowContext, INodeContext } from './runtime';
// --- Node Definition ---
export type NodeFunction<Input = any, Output = any> = (
context: INodeContext, // Pass full context
input: Input // Keep typed input for convenience if desired, or rely solely on context.input
) => Promise<Output | void>; // Allow void return if output set via context
export interface NodeMetadata {
id: string; // Unique Node ID/Name
description?: string;
inputSchema?: object; // Optional JSON schema for input validation
outputSchema?: object; // Optional JSON schema for output validation
}
// --- Step Configuration ---
export enum StepType {
TASK = 'TASK',
CONDITION = 'CONDITION',
PARALLEL = 'PARALLEL',
SUB_WORKFLOW = 'SUB_WORKFLOW',
EVENT_TRIGGER = 'EVENT_TRIGGER', // Added from Root
EVENT_LISTENER = 'EVENT_LISTENER',// Added from Root
// Could add others like WAIT, MANUAL_APPROVAL etc.
}
export interface RetryOptions {
maxRetries: number;
delayMs: number; // Delay between retries
backoffFactor?: number; // Optional exponential backoff
}
// Base configuration for all steps
export interface BaseStepConfig {
id: string; // Unique ID within the workflow definition
description?: string;
nextStepId?: string; // Default next step (used by TASK, SUB_WORKFLOW etc.)
// --- Features from Root ---
timeoutMs?: number;
retryOptions?: RetryOptions;
compensateOnFailure?: boolean | string; // Boolean or step ID for compensation task
requiredRoles?: string[]; // Optional role check
// --- Input/Output Mapping (Crucial from Root) ---
// Maps context variables (e.g., 'variables.userId') or step outputs ('steps.prevStep.output.data') to node input fields
inputMapping?: Record<string, string>; // e.g., { nodeInputField: 'variables.someData' }
// Maps node output fields back to workflow variables
outputMapping?: Record<string, string>; // e.g., { 'variables.resultData': 'output.processedValue' }
}
// Specific Step Configurations
export interface TaskStepConfig extends BaseStepConfig {
type: StepType.TASK;
nodeId: string; // ID of the registered node to execute
input?: Record<string, any>; // Static input values (can be overridden by inputMapping)
}
export type ConditionFunction = (context: IWorkflowContext) => Promise<string | boolean> | string | boolean;
export interface ConditionStepConfig extends BaseStepConfig {
type: StepType.CONDITION;
condition: ConditionFunction;
branches: Record<string, string>; // Map condition result (true/false/'branchName') to next step ID
// `nextStepId` is typically not used here
}
export interface ParallelStepConfig extends BaseStepConfig {
type: StepType.PARALLEL;
// Define parallel branches - each branch is a mini-workflow definition (array of steps)
// Simpler approach: Just list step configs to run in parallel
parallelSteps: StepConfig[]; // Array of steps to execute concurrently
// `nextStepId` points to the step after ALL parallel branches complete
}
export interface SubWorkflowStepConfig extends BaseStepConfig {
type: StepType.SUB_WORKFLOW;
subWorkflowId: string; // ID of the workflow definition to call
input?: Record<string, any>; // Static input (overridden by mapping)
waitForCompletion?: boolean; // Default true
}
// --- Event Step Configurations (from Root) ---
export interface EventTriggerStepConfig extends BaseStepConfig {
type: StepType.EVENT_TRIGGER;
eventName: string;
eventDataMapping?: Record<string, string>; // Map context to event payload
}
export interface EventListenerStepConfig extends BaseStepConfig {
type: StepType.EVENT_LISTENER;
eventName: string;
// outputMapping maps event payload to variables
// Often used as a starting step, so no `nextStepId` might be needed initially if handled by definition.setStartStep
}
// Union type for any step configuration
export type StepConfig =
| TaskStepConfig
| ConditionStepConfig
| ParallelStepConfig
| SubWorkflowStepConfig
| EventTriggerStepConfig
| EventListenerStepConfig;
// --- Workflow Definition Structure ---
export interface WorkflowDefinitionData {
id: string;
name?: string;
description?: string;
steps: Record<string, StepConfig>; // Map of stepId to StepConfig
startStepId?: string;
version?: number; // Optional versioning
// Metadata like owner, tags etc.
}