import { Kafka } from 'kafkajs';
import { IBrokerAdapter, BrokerMessage, MessageHandler } from '@syntropylog/types';

declare class KafkaAdapter implements IBrokerAdapter {
    private readonly producer;
    private readonly consumer;
    constructor(kafkaInstance: Kafka, groupId: string);
    connect(): Promise<void>;
    disconnect(): Promise<void>;
    publish(topic: string, message: BrokerMessage): Promise<void>;
    subscribe(topic: string, handler: MessageHandler): Promise<void>;
}

declare class RabbitMQAdapter implements IBrokerAdapter {
    private connection;
    private channel;
    private connectionString;
    private exchangeName;
    private consumerTags;
    constructor(connectionString: string, exchangeName?: string);
    connect(): Promise<void>;
    disconnect(): Promise<void>;
    publish(topic: string, message: BrokerMessage): Promise<void>;
    subscribe(topic: string, handler: MessageHandler): Promise<void>;
    unsubscribe(topic: string): Promise<void>;
}

declare class NatsAdapter implements IBrokerAdapter {
    private readonly natsServers;
    private natsConnection;
    private codec;
    private subscriptions;
    constructor(natsServers?: string[]);
    connect(): Promise<void>;
    disconnect(): Promise<void>;
    publish(topic: string, message: BrokerMessage): Promise<void>;
    subscribe(topic: string, handler: MessageHandler): Promise<void>;
    unsubscribe(topic: string): Promise<void>;
    private natsHeadersToRecord;
    private recordToNatsHeaders;
}

export { KafkaAdapter, NatsAdapter, RabbitMQAdapter };
