import { IMidwayContainer } from '@midwayjs/core';
import { type TraceContext, TraceService } from '@mwcp/otel';
import type { ScopeType } from '@mwcp/share';
import { Kmore, KmoreQueryBuilder, KmoreTransaction, PropagationType, TrxPropagateOptions } from 'kmore';
import { CallerService } from './caller.service.js';
import { CallerKey, CallerKeyPropagationMapIndex, DbSourceName, EntryCallerKeyTrxMapIndex, PropagatingOptions, PropagatingRet, RegisterTrxPropagateOptions, StartNewTrxOptions } from './propagation/trx-status.types.js';
/**
 * Declarative transaction status manager
 */
export declare class TrxStatusService {
    readonly applicationContext: IMidwayContainer;
    readonly appDir: string;
    protected readonly traceSvc: TraceService;
    protected readonly callerSvc: CallerService;
    readonly scope2TraceContextMap: WeakMap<ScopeType, TraceContext>;
    protected readonly dbInstanceList: Map<string, Kmore<any>>;
    protected readonly callerKeyPropagationMapIndex: CallerKeyPropagationMapIndex;
    protected readonly entryCallerKeyTrxMapIndex: EntryCallerKeyTrxMapIndex;
    getName(): string;
    registerDbInstance(dbId: string, db: Kmore): void;
    /**
     * If dbId is undefined or empty
     * - return the only on instance
     * - throw error if multiple instance exists
     */
    getDbInstance(dbId: string | undefined): Kmore | undefined;
    getDbInstanceCount(): number;
    listDbInstanceNames(): DbSourceName[];
    unregisterDbInstance(dbId: string): void;
    registerPropagation(options: RegisterTrxPropagateOptions): CallerKey;
    retrieveUniqueTopCallerKey(sourceName: DbSourceName | undefined, scope: ScopeType, key: CallerKey): CallerKey | undefined;
    /**
     * Is decorator `Transactional()` registered with current scope and callerKey
     */
    isRegistered(dbSourceName: DbSourceName, scope: ScopeType, key: CallerKey): boolean;
    startNewTrx(this: TrxStatusService, options: StartNewTrxOptions): Promise<KmoreTransaction>;
    /**
     * Only top caller can commit
     */
    tryCommitTrxIfKeyIsEntryTop(sourceName: DbSourceName | undefined, scope: ScopeType, callerKey: CallerKey): Promise<void>;
    trxRollbackEntry(sourceName: DbSourceName | undefined, scope: ScopeType, callerKey: CallerKey): Promise<void>;
    bindBuilderPropagationData(dbSourceName: DbSourceName, builder: KmoreQueryBuilder, distance?: number): void;
    propagating(options: PropagatingOptions): Promise<PropagatingRet>;
    protected _propagatingRequired(options: PropagatingOptions, trxPropagateOptions: TrxPropagateOptions): Promise<KmoreTransaction>;
    protected _propagatingSupports(options: PropagatingOptions, trxPropagateOptions: TrxPropagateOptions): Promise<KmoreTransaction | undefined>;
    cleanAfterRequestFinished(scope: ScopeType): void;
    protected cleanAfterTrx(dbSourceName: DbSourceName | undefined, scope: ScopeType, callerKey: CallerKey): void;
    protected builderLinkTrx(options: PropagatingOptions, trx: KmoreTransaction | undefined): void;
    protected getTrxArrayByEntryKey(dbSourceName: DbSourceName, scope: ScopeType, key: CallerKey): KmoreTransaction[] | undefined;
    protected getCurrentTrxByEntryKey(dbSourceName: DbSourceName, scope: ScopeType, key: CallerKey): KmoreTransaction | undefined;
    protected updateEntryCallerKeyTrxMap(dbSourceName: DbSourceName, scope: ScopeType, key: CallerKey, trx: KmoreTransaction): void;
    protected removeEntryCallerKeyTrxMap(scope: ScopeType): void;
    protected cleanEntryCallerKeyTrxMapByKey(dbSourceName: DbSourceName, scope: ScopeType, key: CallerKey): void;
    protected removeTrxFromEntryCallerKeyTrxMap(dbSourceName: DbSourceName, scope: ScopeType, trxId: symbol): void;
    getCurrentTrxId(dbSourceName: DbSourceName, scope: ScopeType, callerKey: CallerKey): symbol | undefined;
    getCurrentTrx(dbSourceName: DbSourceName, scope: ScopeType, callerKey: CallerKey): KmoreTransaction | undefined;
    protected getPropagationOptions(dbSourceName: DbSourceName, scope: ScopeType, key: CallerKey): RegisterTrxPropagateOptions | undefined;
    protected setPropagationOptions(key: CallerKey, options: RegisterTrxPropagateOptions): void;
    protected getPropagationOptionsCount(dbSourceName: DbSourceName, scope: ScopeType): number;
    protected getPropagationType(dbSourceName: DbSourceName, scope: ScopeType, key: CallerKey): PropagationType | undefined;
    protected delPropagationOptions(dbSourceName: DbSourceName, scope: ScopeType, key: CallerKey): void;
    protected retrieveRegisteredTopCallerKeyFromCallStack(dbSourceName: DbSourceName, scope: ScopeType, limit?: number): CallerKey | undefined;
    getTraceContextByScope(scope: ScopeType): TraceContext | undefined;
    /**
     * @param scope kmoreTrxId or kmoreQueryId
     */
    setTraceContextByScope(scope: ScopeType, traceContext: TraceContext): void;
    removeTraceContextByScope(scope: ScopeType): void;
}
//# sourceMappingURL=trx-status.service.d.ts.map