bpmn-engine
Version:
BPMN 2.0 execution engine. Open source javascript workflow engine.
335 lines (303 loc) • 8.77 kB
TypeScript
// Author : Saeed Tabrizi
// Refactored by : Pål Edman
import { EventEmitter } from 'node:events';
import { Definitions as BpmnModdleDefinitions } from 'bpmn-moddle';
import { extendFn, SerializableContext, TypeResolver } from 'moddle-context-serializer';
import {
ActivityStatus,
ElementBroker,
EnvironmentOptions,
Definition,
DefinitionState,
Environment,
Api,
ElementBase,
ILogger,
EnvironmentState,
IScripts,
Script,
} from 'bpmn-elements';
declare module 'bpmn-engine' {
/**
* Engine emits the following events:
error: An non-recoverable error has occurred
stop: Executions was stopped
end: Execution completed
*/
export type BpmnEngineEvent = 'error' | 'stop' | 'end';
/**
* Each activity and flow emits events when changing state.
activity.enter: An activity is entered
activity.start: An activity is started
activity.wait: The activity is postponed for some reason, e.g. a user task is waiting to be signaled or a message is expected
wait: Same as above
activity.end: An activity has ended successfully
activity.leave: The execution left the activity
activity.stop: Activity run was stopped
activity.throw: An recoverable error was thrown
activity.error: An non-recoverable error has occurred
*/
export type BpmnActivityEvent =
| 'activity.enter'
| 'activity.start'
| 'activity.wait'
| 'wait'
| 'activity.end'
| 'activity.leave'
| 'activity.stop'
| 'activity.throw'
| 'activity.error';
/**
* Sequence flow events
flow.take: The sequence flow was taken
flow.discard: The sequence flow was discarded
flow.looped: The sequence is looped
*/
export type BpmnSequenceFlowEvent = 'flow.take' | 'flow.discard' | 'flow.looped';
export interface BpmnMessage {
id?: string;
executionId?: string;
[name: string]: any;
}
export interface IListenerEmitter {
emit(eventName: string, ...args: any[]): void;
}
export interface BpmnEngineExecuteOptions extends EnvironmentOptions {
listener?: EventEmitter | IListenerEmitter;
}
export interface BpmnEngineOptions extends BpmnEngineExecuteOptions {
/**
* optional name of engine,
*/
name?: string;
/**
* optional BPMN 2.0 definition source as string
*/
source?: string;
/**
* optional serialized context supplied by moddle-context-serializer
*/
sourceContext?: SerializableContext;
/**
* optional override of BPMN Elements behaviors, defaults to bpmn-elements
*/
elements?: Record<string, any>;
/**
* Passed to moddle-context-serializer as TypeResolver
*/
typeResolver?: typeof TypeResolver;
/**
* Passed to moddle-context-serializer as extendFn
*/
extendFn?: extendFn;
/**
* optional bpmn-moddle options to be passed to bpmn-moddle
*/
moddleOptions?: any;
moddleContext?: BpmnModdleDefinitions;
[x: string]: any;
}
const enum BpmnEngineRunningStatus {
/**
* Engine is not executing
*/
Idle = 'idle',
/**
* Engine is executing
*/
Running = 'running',
/**
* Engine execution is stopped
*/
Stopped = 'stopped',
/**
* Engine execution has errored
*/
Error = 'error',
}
export function Engine(options?: BpmnEngineOptions): Engine;
export class Engine extends EventEmitter {
constructor(options?: BpmnEngineOptions);
/**
* engine name
*/
readonly name: string;
/**
* engine broker
*/
broker: ElementBroker<Engine>;
/**
* engine state
*/
readonly state: BpmnEngineRunningStatus;
/**
* boolean stopped
*/
readonly stopped: boolean;
/**
* current engine execution
*/
readonly execution: Execution;
/**
* engine environment
*/
readonly environment: Environment;
/**
* engine logger
*/
readonly logger: ILogger;
get activityStatus(): ActivityStatus;
/**
* execute definition
* @param options Optional object with options to override the initial engine options
* @param cb Callback called before the throw
* @summary Execute options overrides the initial options passed to the engine before executing the definition.
*/
execute(): Promise<Execution>;
execute(options: BpmnEngineExecuteOptions): Promise<Execution>;
execute(options: BpmnEngineExecuteOptions, cb: (err: Error, execution?: Execution) => void): Promise<Execution>;
execute(cb: (err: Error) => void): Promise<Execution>;
/**
* get definition by id
* @param id id of definition
*/
getDefinitionById(id: string): Promise<Definition>;
/**
* get all definitions
*/
getDefinitions(): Promise<Definition[]>;
/**
* get execution serialized state
*/
getState(): Promise<BpmnEngineExecutionState>;
/**
* Recover engine from state
* @param state engine state
* @param recoverOptions optional object with options that will completely override the options passed to the engine at init
*/
recover(state: any, recoverOptions?: BpmnEngineOptions): Engine;
/**
* Resume execution function with previously saved engine state.
* @param options
* @param callback
*/
resume(options?: BpmnEngineExecuteOptions, callback?: (err: Error, execution?: Execution) => void): Promise<Execution>;
/**
* Stop execution. The instance is terminated.
*/
stop(): Promise<void>;
waitFor<R>(eventName: BpmnEngineEvent): Promise<R>;
/**
* Add definition source by source context.
* @param options
*/
addSource(options?: { sourceContext: any }): void;
}
interface BpmnEngineDefinitionState extends DefinitionState {
/**
* Serialized moddle-context-serializer context
*/
source?: string;
}
export interface BpmnEngineExecutionState {
name: string;
engineVersion: string;
state: BpmnEngineRunningStatus;
stopped: boolean;
environment: EnvironmentState;
definitions: BpmnEngineDefinitionState[];
}
export interface Execution {
/**
* engine name
*
* @type {string}
* @
*/
readonly name: string;
/**
* state of execution, i.e running or idle
*
* @type {("running"| "idle")}
*
*/
readonly state: 'running' | 'idle';
/**
* is the execution stopped
*
* @type {boolean}
*
*/
readonly stopped: boolean;
/**
* engine environment
*
* @type {Environment}
*
*/
readonly environment: Environment;
/**
* executing definitions
*
* @type {Definition}
*
*/
readonly definitions: Definition[];
get activityStatus(): ActivityStatus;
/**
* Are any definition running
*/
get isRunning(): boolean;
/**
* Get activity/element by id. Loops the definitions and returns the first found activity with id.
* @param activityId Activity or element id
*/
getActivityById(activityId: string): ElementBase;
getActivityById<R>(activityId: string): R;
/**
* get execution serializable state
*
* @returns {BpmnEngineExecutionState}
*
*/
getState(): BpmnEngineExecutionState;
/**
* stop execution
*
*
*/
stop(): Promise<void>;
/**
* get activities in a postponed state
*
*
*/
getPostponed(): Api<ElementBase>[];
/**
* send signal to execution, distributed to all definitions
* Delegate a signal message to all interested parties, usually MessageEventDefinition, SignalEventDefinition, SignalTask (user, manual), ReceiveTask, or a StartEvent that has a form.
* @param message {BpmnMessage}
* @param options
*/
signal(message?: BpmnMessage, options?: { ignoreSameDefinition?: boolean }): void;
/**
* send cancel activity to execution, distributed to all definitions
* Delegate a cancel message to all interested parties, perhaps a stalled TimerEventDefinition.
* @param message
*/
cancelActivity(message?: BpmnMessage): void;
/**
*
* @param event
*/
waitFor<T>(event: BpmnEngineEvent): Promise<T>;
}
export class JavaScripts implements IScripts {
/**
* @param disableDummy Disable returning dummy scripts if script is not found. Dummy script will immediately call next function without error or return value
*/
constructor(disableDummy?: boolean);
register(activity: any): Script | undefined;
getScript(language: string, identifier: { id: string; [x: string]: any }): Script;
}
}