import EventEmitter from 'events';
import { ErrorWithReasonCode, IClientOptions, IConnackPacket, IPublishPacket, MqttClient } from 'mqtt';
import { Config, DeviceConfigLocalMqtt } from './config-types.js';
import { AnsiLogger } from 'matterbridge/logger';
import { MaybePromise } from 'matterbridge/matter';
import { DysonIoTCredentialsResponse } from './dyson-cloud-types.js';
export interface DeviceConfigRemoteMqtt {
    name: string;
    serialNumber: string;
    rootTopic: string;
    getCredentials: () => Promise<DysonIoTCredentialsResponse>;
}
export type DeviceConfigMqtt = DeviceConfigLocalMqtt | DeviceConfigRemoteMqtt;
export interface DysonMqttClientEventMap {
    close: [];
    connect: [packet: IConnackPacket];
    error: [error: Error | ErrorWithReasonCode];
    message: [topic: string, payload: Buffer, packet: IPublishPacket];
}
export interface DysonMqttClientOptions {
    brokerUrl: string;
    options: IClientOptions;
}
export declare abstract class DysonMqttClient extends EventEmitter<DysonMqttClientEventMap> {
    readonly log: AnsiLogger;
    readonly config: Config;
    private delegate?;
    private clientOptions?;
    private count;
    constructor(log: AnsiLogger, config: Config);
    protected abstract getConnectionOptions(): MaybePromise<DysonMqttClientOptions>;
    private destroyClient;
    private createClient;
    connect(): Promise<void>;
    get mqtt(): MqttClient;
    publishAsync(...args: Parameters<MqttClient['publishAsync']>): Promise<import("mqtt-packet").Packet | undefined>;
    subscribeAsync(...args: Parameters<MqttClient['subscribeAsync']>): Promise<import("mqtt").ISubscriptionGrant[]>;
    endAsync(...args: Parameters<MqttClient['endAsync']>): Promise<void>;
}
export declare class DysonMqttClientLocal extends DysonMqttClient {
    readonly deviceConfig: DeviceConfigLocalMqtt;
    constructor(log: AnsiLogger, config: Config, deviceConfig: DeviceConfigLocalMqtt);
    protected getConnectionOptions(): DysonMqttClientOptions;
}
export declare class DysonMqttClientRemote extends DysonMqttClient {
    readonly deviceConfig: DeviceConfigRemoteMqtt;
    constructor(log: AnsiLogger, config: Config, deviceConfig: DeviceConfigRemoteMqtt);
    protected getConnectionOptions(): Promise<DysonMqttClientOptions>;
}
//# sourceMappingURL=dyson-mqtt-client.d.ts.map