UNPKG

@nocobase/plugin-workflow

Version:

A powerful BPM tool that provides foundational support for business automation, with the capability to extend unlimited triggers and nodes.

176 lines (175 loc) 5.34 kB
/** * This file is part of the NocoBase (R) project. * Copyright (c) 2020-2024 NocoBase Co., Ltd. * Authors: NocoBase Team. * * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. * For more information, please refer to: https://www.nocobase.com/agreement. */ /// <reference types="node" /> import { Transaction, Transactionable } from '@nocobase/database'; import { Logger } from '@nocobase/logger'; import type Plugin from './Plugin'; import { IJob } from './instructions'; import type { ExecutionModel, FlowNodeModel, JobModel } from './types'; export type ProcessorRunOptions = { rerun?: true; signal?: AbortSignal; }; export type ProcessorRerunOptions = { nodeId?: string | number; overwrite?: boolean; }; export interface ProcessorOptions extends Transactionable { plugin: Plugin; [key: string]: any; } export type BackgroundAbortHandle = { signal: AbortSignal; dispose: () => void; throwIfAborted: () => void; }; export default class Processor { execution: ExecutionModel; options: ProcessorOptions; static StatusMap: { 0: 0; 1: 1; [-1]: -1; [-2]: -2; [-3]: -3; [-4]: -4; [-5]: -5; [-6]: -6; }; logger: Logger; /** * @experimental */ transaction?: Transaction | null; /** * @experimental */ nodes: FlowNodeModel[]; /** * @experimental */ nodesMap: Map<string | number, FlowNodeModel>; private jobsMapByNodeKey; private jobResultsMapByNodeKey; private jobsToSave; private rerunContext; /** * @experimental */ lastSavedJob: JobModel | null; abortController: AbortController; timeoutGuard: NodeJS.Timeout | null; private runningRegistered; private abortReason; private aborted; constructor(execution: ExecutionModel, options: ProcessorOptions); get abortSignal(): AbortSignal; setTimeoutGuard(ms: number): void; abortExecution(reason?: string): void; isTimeoutAborted(): boolean; /** * Create an independent abort handle for background work that outlives this processor's * run loop (e.g. fire-and-forget instructions that resume the job later). It mirrors the * current abort state and sets its own timer based on the execution's `expiresAt`, so the * timeout still applies after the processor has exited its synchronous run. * * The caller must invoke `dispose()` once the background work settles to release the timer * and the abort listener. */ createBackgroundAbortHandle(): BackgroundAbortHandle; /** * Reload a job and return it only when it is still pending, otherwise `null`. Background * work uses this before resuming so it never overwrites a job that another path (timeout * abort, a competing resume) has already settled. */ findPendingJob(jobId: number | string): Promise<JobModel | null>; private makeNodes; private makeJobs; prepare(): Promise<void>; start(): Promise<any>; resume(job: JobModel): Promise<void>; resolveRerun(options?: ProcessorRerunOptions): { node: FlowNodeModel; input: JobModel | { result: any; }; targetJob: JobModel; }; rerun(options?: ProcessorRerunOptions): Promise<any>; private getRerunNode; private getRerunInput; private exec; run(node: FlowNodeModel, input?: JobModel | { result: unknown; }, options?: ProcessorRunOptions): Promise<any>; end(node: FlowNodeModel, job: JobModel): Promise<any>; private recall; exit(s?: number | true): Promise<any>; /** * @experimental */ saveJob(payload: JobModel | IJob): JobModel; /** * @experimental */ getBranches(node: FlowNodeModel): FlowNodeModel[]; private enterRunningState; private shouldContinueExecution; private leaveRunningState; /** * @experimental * find the first node in current branch */ findBranchStartNode(node: FlowNodeModel, parent?: FlowNodeModel): FlowNodeModel | null; /** * @experimental * find the node start current branch */ findBranchParentNode(node?: FlowNodeModel): FlowNodeModel | null; /** * @experimental */ findBranchEndNode(node: FlowNodeModel): FlowNodeModel | null; /** * @experimental */ findBranchParentJob(job: JobModel, node: FlowNodeModel): JobModel | null; /** * @experimental */ findBranchLastJob(node: FlowNodeModel, job: JobModel): JobModel | null; /** * @experimental */ getScope(sourceNodeId?: number | string, includeSelfScope?: boolean): { ctx: { $context: any; $jobsMapByNodeKey: { [key: string]: any; }; $system: {}; $scopes: Record<string, any>; $env: {}; }; $context: any; $jobsMapByNodeKey: { [key: string]: any; }; $system: {}; $scopes: Record<string, any>; $env: {}; }; /** * @experimental */ getParsedValue(value: any, sourceNodeId?: number | string, { additionalScope, includeSelfScope }?: { additionalScope?: {}; includeSelfScope?: boolean; }): any; }