/*!
 * Copyright (c) 2019 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0
 *
 * SPDX-License-Identifier: EPL-2.0
 */
import { WebSocketStateHandler } from './request-factory/resilience/websocket-resilience-interfaces';
import { WebSocketRequestSenderFactory } from './request-factory/websocket-request-sender';
import { WebSocketImplementationBuilderUrl } from './request-factory/websocket-request-handler';
import { DefaultDittoWebSocketClient, DittoWebSocketClient, DittoWebSocketLiveClient, DittoWebSocketTwinClient } from './ditto-client-websocket';
import { WebSocketThingsHandle } from './handles/things.interfaces';
import { WebSocketMessagesHandle } from './handles/messages-websocket';
import { CommandsHandle } from './handles/commands';
import { EventsHandle } from './handles/events';
import { FeaturesHandle } from './handles/features.interfaces';
import { AuthProvider } from '../auth/auth-provider';
import { ApiVersion, Channel } from '../model/ditto-protocol';
import { AbstractBuilder, BuildStep, CustomBuilderContext, CustomCommandsHandleStep, CustomEventsHandleStep, CustomFeaturesHandleStep, CustomMessagesHandleStep, CustomThingsHandleStep, ProtocolStep } from './builder-steps';
export interface WebSocketBuilderInitialStep extends ProtocolStep<WebSocketBufferStep> {
}
export interface WebSocketBufferStep extends BuildStep {
    withoutBuffer(): WebSocketChannelStep;
    withBuffer(size: number): WebSocketChannelStep;
}
export interface WebSocketChannelStep extends BuildStep {
    liveChannel(): WebSocketBuildStepLive;
    twinChannel(): WebSocketBuildStepTwin;
}
export interface WebSocketStateHandlerStep extends BuildStep {
    withStateHandler(handler: WebSocketStateHandler): this;
}
export interface WebSocketBuildStep extends BuildStep, WebSocketStateHandlerStep {
    /**
     * Builds a DittoClient for the selected API.
     *
     * @returns The DittoClient
     */
    build(): DittoWebSocketClient;
}
/**
 * Step that allows to add custom handles for a client.
 */
export interface WebSocketCustomHandlesBuildStep extends BuildStep, WebSocketBuildStep, CustomThingsHandleStep<WebSocketRequestSenderFactory, WebSocketThingsHandle>, CustomFeaturesHandleStep<WebSocketRequestSenderFactory, FeaturesHandle>, CustomEventsHandleStep<WebSocketRequestSenderFactory, EventsHandle>, CustomMessagesHandleStep<WebSocketRequestSenderFactory, WebSocketMessagesHandle>, CustomCommandsHandleStep<WebSocketRequestSenderFactory, CommandsHandle> {
}
export interface WebSocketBuildStepLive extends WebSocketCustomHandlesBuildStep {
    build(): DittoWebSocketLiveClient;
}
export interface WebSocketBuildStepTwin extends WebSocketCustomHandlesBuildStep {
    build(): DittoWebSocketTwinClient;
}
/**
 * Implementation of all the methods to build a Context.
 */
export declare class WebSocketClientBuilder extends AbstractBuilder<WebSocketBufferStep> implements WebSocketBufferStep, WebSocketChannelStep, WebSocketBuildStepLive, WebSocketBuildStepTwin {
    private readonly builder;
    private channel;
    private stateHandler;
    private resilienceFactory;
    private customHandles;
    private constructor();
    /**
     * Creates a new WebSocket Builder.
     *
     * @param urlBuilder The url builder used by the builder.
     */
    static newBuilder(urlBuilder: WebSocketImplementationBuilderUrl): WebSocketBuilderInitialStep;
    finalize(): WebSocketBufferStep;
    withStateHandler(handler: WebSocketStateHandler): this;
    withBuffer(size: number): WebSocketChannelStep;
    withoutBuffer(): WebSocketChannelStep;
    liveChannel(): WebSocketBuildStepLive;
    twinChannel(): WebSocketBuildStepTwin;
    withCustomThingsHandle(factory: (requestSenderFactory: WebSocketRequestSenderFactory, customBuilderContext?: CustomBuilderContext) => WebSocketThingsHandle): this;
    withCustomFeaturesHandle(factory: (requestSenderFactory: WebSocketRequestSenderFactory, thingsId: string, customBuilderContext?: CustomBuilderContext) => FeaturesHandle): this;
    withCustomMessagesHandle(factory: (requestSenderFactory: WebSocketRequestSenderFactory, customBuilderContext?: CustomBuilderContext) => WebSocketMessagesHandle): this;
    withCustomEventsHandle(factory: (requestSenderFactory: WebSocketRequestSenderFactory, customBuilderContext?: CustomBuilderContext) => EventsHandle): this;
    withCustomCommandsHandle(factory: (requestSenderFactory: WebSocketRequestSenderFactory, customBuilderContext?: CustomBuilderContext) => CommandsHandle): this;
    build(): DefaultDittoWebSocketClient;
    buildClient(tls: boolean, domain: string, apiVersion: ApiVersion, stateHandler: WebSocketStateHandler, channel: Channel, authProviders: AuthProvider[]): DittoWebSocketClient;
}
//# sourceMappingURL=websocket-client-builder.d.ts.map