import { type CommonLogger, type ErrorReporter, type TransactionObservabilityManager } from '@lokalise/node-core';
import type { MetadataFiller } from '../messages/MetadataFiller';
import type { HandlerSpy, HandlerSpyParams, PublicHandlerSpy } from '../queues/HandlerSpy';
import type { ConsumerMessageMetadataType } from '@message-queue-toolkit/schemas';
import type { EventRegistry } from './EventRegistry';
import type { AnyEventHandler, CommonEventDefinition, CommonEventDefinitionConsumerSchemaType, CommonEventDefinitionPublisherSchemaType, EventTypeNames, SingleEventHandler } from './eventTypes';
export type DomainEventEmitterDependencies<SupportedEvents extends CommonEventDefinition[]> = {
    eventRegistry: EventRegistry<SupportedEvents>;
    metadataFiller: MetadataFiller;
    logger: CommonLogger;
    errorReporter?: ErrorReporter;
    transactionObservabilityManager?: TransactionObservabilityManager;
};
export declare class DomainEventEmitter<SupportedEvents extends CommonEventDefinition[]> {
    private readonly eventRegistry;
    private readonly metadataFiller;
    private readonly logger;
    private readonly errorReporter?;
    private readonly transactionObservabilityManager?;
    private readonly _handlerSpy?;
    private readonly eventHandlerMap;
    private readonly inProgressBackgroundHandlerByEventId;
    constructor(deps: DomainEventEmitterDependencies<SupportedEvents>, options?: {
        handlerSpy?: HandlerSpy<object> | HandlerSpyParams | boolean;
    });
    get handlerSpy(): PublicHandlerSpy<CommonEventDefinitionPublisherSchemaType<SupportedEvents[number]>>;
    dispose(): Promise<void>;
    emit<SupportedEvent extends SupportedEvents[number]>(supportedEvent: SupportedEvent, data: Omit<CommonEventDefinitionPublisherSchemaType<SupportedEvent>, 'type'>, precedingMessageMetadata?: Partial<ConsumerMessageMetadataType>): Promise<Omit<CommonEventDefinitionConsumerSchemaType<SupportedEvent>, 'type'>>;
    /**
     * Register handler for a specific event
     */
    on<EventTypeName extends EventTypeNames<SupportedEvents[number]>>(eventTypeName: EventTypeName, handler: SingleEventHandler<SupportedEvents, EventTypeName>, isBackgroundHandler?: boolean): void;
    /**
     * Register handler for multiple events
     */
    onMany<EventTypeName extends EventTypeNames<SupportedEvents[number]>>(eventTypeNames: EventTypeName[], handler: SingleEventHandler<SupportedEvents, EventTypeName>, isBackgroundHandler?: boolean): void;
    /**
     * Register handler for all events supported by the emitter
     */
    onAny(handler: AnyEventHandler<SupportedEvents>, isBackgroundHandler?: boolean): void;
    private handleEvent;
    private executeEventHandler;
    private buildTransactionKey;
}
