import { BaseError, FlowNodeInstance, FlowNodeInstanceState, Identity, Logger, Model } from '@5minds/processcube_engine_sdk';
import { FlowNodeInstanceTypeSpecificData } from '../../../Contracts';
import { EventMiddlewareHandler, FlowNodeInstanceDatabaseAdapter } from '../../../Tools';
import { FlowNodeExpressionConfig, ProcessInstance } from '../../ProcessInstance';
import { InternalEngineEvent } from '../FlowNodeHandler';
import { ActivityHandler } from './ActivityHandler';
export declare abstract class ActivityInstanceHandler<TActivity extends Model.Activities.Activity> {
    protected readonly flowNodeInstanceDatabaseAdapter: FlowNodeInstanceDatabaseAdapter;
    protected readonly eventMiddlewareHandler: EventMiddlewareHandler;
    protected instanceContext: {
        [key: string]: any;
    };
    protected readonly activityHandler: ActivityHandler<TActivity>;
    protected readonly processInstance: ProcessInstance;
    protected triggeredByFlowNodeInstanceId: string;
    protected typeData: FlowNodeInstanceTypeSpecificData;
    protected logger: Logger;
    protected loggingMetaData: any;
    protected loggerNamespace: string;
    protected currentToken: Record<string, any> | Array<any>;
    protected previousFlowNodeInstanceId: string;
    private _state;
    private _flowNodeInstanceId;
    private startedAt;
    private finishedAt;
    private tokenChangedSubscription;
    constructor(eventMiddlewareHandler: EventMiddlewareHandler, flowNodeInstanceDatabaseAdapter: FlowNodeInstanceDatabaseAdapter, activityHandler: ActivityHandler<TActivity>, processInstance: ProcessInstance, previousFlowNodeInstanceId?: string, instanceContext?: {
        [key: string]: any;
    });
    get flowNodeInstanceId(): string;
    protected set flowNodeInstanceId(value: string);
    get state(): string;
    protected set state(value: FlowNodeInstanceState);
    protected get flowNode(): TActivity;
    protected get flowNodeLane(): Model.ProcessElements.Lane;
    protected get owner(): Identity;
    initFromFlowNodeInstance(fni: FlowNodeInstance): void;
    execute(startToken: Record<string, any> | Array<any>, executionCanceledCallback?: Function): Promise<Record<string, any> | Array<any>>;
    resume(flowNodeInstanceForHandler: FlowNodeInstance, resumptionCanceledCallback?: Function): Promise<Record<string, any> | Array<any>>;
    private handleActivityError;
    endWithError(error: BaseError, force?: boolean): Promise<void>;
    terminate(): Promise<void>;
    cancel(): Promise<void>;
    persistOnEnter(): Promise<void>;
    protected persistOnSuspend<TFlowNodeData extends FlowNodeInstanceTypeSpecificData>(updatedTokenPayload?: any, typeData?: TFlowNodeData): Promise<void>;
    protected persistOnExit<TFlowNodeData extends FlowNodeInstanceTypeSpecificData>(dataObjectValues: Record<string, any>, typeData?: TFlowNodeData): Promise<void>;
    protected persistOnError<TFlowNodeData extends FlowNodeInstanceTypeSpecificData>(error: BaseError, typeData?: TFlowNodeData, force?: boolean): Promise<void>;
    protected persistOnCancel<TFlowNodeData extends FlowNodeInstanceTypeSpecificData>(typeData?: TFlowNodeData): Promise<void>;
    protected persistOnTerminate<TFlowNodeData extends FlowNodeInstanceTypeSpecificData>(typeData?: TFlowNodeData): Promise<void>;
    protected beforeExecute(): Promise<void>;
    protected afterExecute(): Promise<void>;
    protected runHandler(_executionCanceledCallback?: Function): Promise<void>;
    private resumeFromState;
    /**
     * Hook for resuming a Flow Node Handler that is currently in a suspended state.
     */
    protected resumeAfterSuspend(flowNodeInstance: FlowNodeInstance, resumptionCanceledCallback?: Function): Promise<void>;
    protected finishActivity(): Promise<void>;
    protected ensureHasClaim(): void;
    protected executeRuntimeExpressionOnInstanceContext<TResult>(config: FlowNodeExpressionConfig): Promise<TResult>;
    protected postEventToEventMiddlewares(payload: InternalEngineEvent): Promise<void>;
    private subscribeToMiddlewareEvent;
    /**
     * Executes all expressions for updating some meta property on the containing ProcessInstance.
     * For example "engine.setProcessInstanceMetadata.propertyName" or "engine.setCorrelationMetadata.propertyName".
     *
     * These expressions can be found within the FlowNode's extension properties.
     *
     * @async
     */
    private executeRuntimePropertyExpressionsOnFlowNode;
    private setCorrelationMetadata;
    private setProcessInstanceMetadata;
    private logFlowNodePersistenceEvent;
    private publishActivityReachedNotification;
    private publishActivityFinishedNotification;
    private publishActivityCanceledNotification;
    private publishProcessInstanceMetadataChangedNotification;
    private publishCorrelationMetadataChangedNotification;
}
