import type { EventFilter, IEvents, ILogger, ITimers, LogFunction } from '../../interfaces'; import type { HttpResponse, IFetch, RequestParameters } from '../interpreter'; import type { UseCase } from '../usecase'; import type { HooksContext } from './failure/event-adapter'; import type { MapInterpreterEventAdapter } from './failure/map-interpreter-adapter'; import type { FailurePolicyReason } from './failure/policy'; declare type AsyncFunction = (...args: any[]) => Promise; declare type MaybePromise = T | Promise; declare type ResolvedPromise = T extends Promise ? R : T; export declare type InterceptableMetadata = { provider?: string; profile?: string; usecase?: string; }; export declare type Interceptable = { metadata?: InterceptableMetadata; events?: Events; }; declare type EventContextBase = { readonly time: Date; readonly usecase?: string; readonly profile?: string; readonly provider?: string; }; export declare type BeforeHookResult = MaybePromise<{ kind: 'continue'; } | { kind: 'modify'; newArgs: Parameters; } | { kind: 'abort'; newResult: ReturnType; } | void>; export declare type BeforeHook = (context: EventContext, args: Parameters) => BeforeHookResult; export declare type AfterHookResult = MaybePromise<{ kind: 'continue'; } | { kind: 'modify'; newResult: ReturnType; } | { kind: 'retry'; newArgs?: Parameters; } | void>; export declare type AfterHook = (context: EventContext, args: Parameters, result: ReturnType) => AfterHookResult; export declare type BindContext = EventContextBase & { profile: string; usecase: string; }; export declare type PerformContext = EventContextBase & { profile: string; usecase: string; provider: string; }; export declare type ProviderSwitchContext = EventContextBase & { provider: string; toProvider?: string; profile: string; reason: FailurePolicyReason; }; export declare type SuccessContext = EventContextBase & { profile: string; usecase: string; provider: string; }; export declare type FailureContext = EventContextBase & { profile: string; usecase: string; provider: string; }; export declare type AuthenticateContext = EventContextBase & { resourceRequest?: RequestParameters; previousResponse?: HttpResponse; }; declare type VoidEventTypes = { failure: FailureContext; success: SuccessContext; 'provider-switch': ProviderSwitchContext; }; declare type VoidEventHook = (context: EventContext) => void; declare type EventTypes = { perform: [ InstanceType['performBoundUsecase'], PerformContext ]; fetch: [IFetch['fetch'], EventContextBase]; 'unhandled-http': [ InstanceType['unhandledHttp'], EventContextBase ]; 'bind-and-perform': [ InstanceType['bindAndPerform'], BindContext ]; }; export declare type EventParams = { [K in keyof EventTypes as `pre-${K}`]: BeforeHook; } & { [K in keyof EventTypes as `post-${K}`]: AfterHook; } & { [K in keyof VoidEventTypes]: VoidEventHook; }; export declare class Events implements IEvents { timers: ITimers; hookContext: HooksContext; private listeners; log: LogFunction | undefined; constructor(timers: ITimers, logger?: ILogger); on(event: E, options: { priority: number; filter?: EventFilter; }, callback: EventParams[E]): void; emit(event: E, parameters: Parameters): Promise>>; } export declare type InterceptPlacement = 'before' | 'after' | 'around'; declare const eventInterceptorMetadataDefaults: { placement: InterceptPlacement; }; declare type EventMetadata = Partial & { eventName: E; }; export declare function eventInterceptor(eventMetadata: EventMetadata): (target: Interceptable, propertyKey: string, descriptor: TypedPropertyDescriptor) => PropertyDescriptor; export {};