import { FlowNodeInstance, FlowNodeInstanceState, Logger, Model } from '@5minds/processcube_engine_sdk';
import { FlowNodeInstanceTypeSpecificData } from '../../../Contracts/InternalDataModels/index';
import { FlowNodeInstanceDatabaseAdapter } from '../../../Tools/DatabaseAdaptersSequelize/index';
import { EventMiddlewareHandler } from '../../../Tools/EventMiddlewareHandler';
import { ProcessInstance } from '../../ProcessInstance';
import { InternalEngineEvent } from '../FlowNodeHandler';
import { FlowNodeHandlerFactory } from '../FlowNodeHandlerFactory';
export type BoundaryEventTriggerData = {
    boundaryInstanceId: string;
    nextFlowNode: Model.Base.FlowNode;
    interruptHandler: boolean;
    canTriggerMultipleTimes: boolean;
    eventPayload?: any;
};
export type BoundaryEventTriggerCallback = (data: BoundaryEventTriggerData) => void | Promise<void>;
/**
 * The base implementation for a BoundaryEventHandler.
 */
export declare abstract class BoundaryEventHandler<TBoundaryEvent extends Model.Events.BoundaryEvent> {
    protected attachedFlowNodeInstanceId: string;
    protected readonly processInstance: ProcessInstance;
    protected boundaryEventModel: TBoundaryEvent;
    protected processToken: Record<string, any>;
    protected flowNodeInstanceDatabaseAdapter: FlowNodeInstanceDatabaseAdapter;
    protected eventMiddlewareHandler: EventMiddlewareHandler;
    protected flowNodeHandlerFactory: FlowNodeHandlerFactory;
    protected boundaryEventInstanceId: string;
    protected flowNodeInstance?: FlowNodeInstance;
    protected state: FlowNodeInstanceState;
    protected logger: Logger;
    eventWasTriggered: boolean;
    protected executionPromise: {
        promise: Promise<any>;
        controller: AbortController;
        isPending: boolean;
    };
    protected executionFinishCallback: Function;
    protected startedAt: Date;
    protected finishedAt: Date;
    protected triggeredByFlowNodeInstanceId: string;
    protected lastWrittenDataObjectValues: Record<string, any>;
    constructor(eventMiddlewareHandler: EventMiddlewareHandler, flowNodeInstanceDatabaseAdapter: FlowNodeInstanceDatabaseAdapter, flowNodeHandlerFactory: FlowNodeHandlerFactory, boundaryEventModel: TBoundaryEvent, processInstance: ProcessInstance, processTokenOfAttachedFlowNode: Record<string, any>, namespace: string);
    protected createExecutionPromise(executor: (resolve?: (value?: any) => void, reject?: (reason?: any) => void) => void): {
        promise: Promise<any>;
        controller: AbortController;
        isPending: boolean;
    };
    protected get boundaryEventInstance(): FlowNodeInstance;
    protected set boundaryEventInstance(boundaryEventInstance: FlowNodeInstance);
    getInstanceId(): string;
    getModelId(): string;
    getModelName(): string;
    getState(): FlowNodeInstanceState;
    abstract execute(onTriggeredCallback: BoundaryEventTriggerCallback, attachedFlowNodeInstanceId: string, decoratedFlowNodeRejectFunc: Function): Promise<void>;
    abstract resume(boundaryEventInstance: FlowNodeInstance, onTriggeredCallback: BoundaryEventTriggerCallback, attachedFlowNodeInstanceId: string, decoratedFlowNodeRejectFunc: Function, flowNodeInstances?: Array<FlowNodeInstance>): Promise<void>;
    finish(): Promise<void>;
    cancel(): Promise<void>;
    getNextFlowNode(): Model.Base.FlowNode;
    protected initialize(attachedFlowNodeInstanceId: string, boundaryEventInstance?: FlowNodeInstance, typeData?: FlowNodeInstanceTypeSpecificData): Promise<void>;
    protected saveTokenInDataObjects(token: Record<string, any> | Array<any>, boundaryEventModelId: string): Promise<void>;
    protected executeRuntimePropertyExpressionsOnFlowNode(): Promise<Record<'correlationMetdata' | 'processInstanceMetadata', any>>;
    protected postEventToEventMiddlewares(payload: InternalEngineEvent): Promise<void>;
    protected persistOnEnter(typeData?: FlowNodeInstanceTypeSpecificData): Promise<void>;
    protected persistOnExit(): Promise<void>;
    protected persistOnCancel(): Promise<void>;
    protected persistOnError(error: Error): Promise<void>;
    protected sendBoundaryEventWaitingNotification(eventName?: string): void;
    protected sendBoundaryEventTriggeredNotification(eventName?: string): void;
    protected sendBoundaryEventFinishedNotification(eventName?: string): void;
    protected runPreScript(): Promise<void>;
    protected runPostScript(): Promise<void>;
    protected boundaryEventWasTriggered(flowNodeInstances: Array<FlowNodeInstance>): boolean;
    protected handleNextFlowNodes(flowNodeInstances?: Array<FlowNodeInstance>): Promise<any>;
    private setCorrelationMetadata;
    private setProcessInstanceMetadata;
    private logFlowNodePersistenceEvent;
    private publishProcessInstanceMetadataChangedNotification;
    private publishCorrelationMetadataChangedNotification;
    private buildEventMessage;
    private runOutgoingDataObjectExpressions;
    private parseDataObjectExpression;
    private persistDataObjectValues;
}
