O Motor
O WorkflowEngine é o coração da biblioteca. É uma classe stateless (sem estado) responsável por orquestrar a execução de um workflow com base em uma WorkflowDefinition (definição de workflow). Seu objetivo primário é transicionar entre estados, gerando um novo Snapshot imutável a cada passo.
Modelo de Execução: Passo a Passo
Para garantir a compatibilidade com ambientes serverless e outros ambientes efêmeros, o motor não executa um workflow inteiro em um único processo de longa duração. Em vez disso, ele opera com base em um modelo de passo a passo.
O método principal, execute, recebe o estado atual (seja um objeto Snapshot ou um initialNodeId) e executa o workflow passo a passo até que uma pausa, erro ou a finalização seja encontrada.
import { WorkflowEngine } from "refluxo";
const engine = new WorkflowEngine({ workflow, nodeDefinitions });
// Iniciando uma nova execução
let snapshot = await engine.execute({
initialNodeId: "start-node",
workflowId: "my-first-workflow"
});
// Retomando uma execução pausada
let resumedSnapshot = await engine.execute({
snapshot: pausedSnapshot,
externalPayload: { approved: true } // Dados para o nó que está aguardando
});Como Funciona
- Inicialização: O método
executerecebe o estado inicial. Se for uma nova execução, ele cria umSnapshotnovo. Se estiver retomando, ele carrega o snapshot fornecido e define seu status paraactive. - Loop de Execução: Ele executa um loop
whileque continua enquanto oSnapshot.statusfor"active". executeStep: Dentro do loop, ele chamaexecuteStep, que é responsável por executar um único nó.- Processa os dados de entrada através dos Transformadores configurados (ex: resolvendo expressões).
- Valida a entrada (input) com base no schema do nó.
- Chama a função
executordo nó. - Valida a saída (output).
- Processa os dados de saída através dos Transformadores configurados.
- Determina o próximo nó a ser executado.
- Retorna um novo
Snapshotcom o estado atualizado.
O Objeto globals
O método execute também aceita um objeto opcional globals. Esses dados são passados diretamente para os métodos transformInput e transformOutput de todos os transformadores, mas não são armazenados no Snapshot. Este é o mecanismo para injetar dados sensíveis (segredos) ou configurações específicas do ambiente na execução do workflow sem persisti-los.
await engine.execute({
snapshot,
globals: {
API_KEY: process.env.API_KEY,
DB_CONNECTION: dbConnection
}
});- Finalização: O loop termina quando o
statusmuda parapaused,completed,failedouerror. OSnapshotfinal é então retornado.
Este modelo garante que cada passo seja uma transação atômica, tornando todo o processo altamente resiliente e observável.
Transformadores (Transformers)
O motor utiliza um pipeline de Transformadores para processar dados antes e depois da execução de um nó. Isso permite comportamentos dinâmicos, como substituição de variáveis, criptografia/descriptografia ou manipulação de dados personalizada.
O WorkflowEngine aceita um array de transformadores em seu construtor:
const engine = new WorkflowEngine({
workflow,
nodeDefinitions,
transformers: [new JexlEngine(), meuTransformadorCustomizado]
});A Interface ITransformEngine
Um transformador implementa a interface ITransformEngine, que possui dois métodos opcionais:
transformInput(data, context, globals, metadata): Chamado antes de um nó ser executado. Processa os dados de entrada do nó (ex: resolvendo).transformOutput(data, context, globals, metadata): Chamado após a execução de um nó. Processa os dados de saída do nó.
Por padrão, o motor inclui o JexlEngine, que lida com a resolução de expressões. Você pode adicionar seus próprios transformadores para estender as capacidades do motor.