import { Observable } from "rxjs";
import { RSocketConfig } from "../../..";
import { RSocket, RSocketState } from '../../api/rsocket.api';
import { Payload } from "../../core/protocol/payload";
import { CompositeMetadata } from "../composite-metadata";
import { DecodedPayload, EncodingRSocket, RSocketEncoderRequestOptions } from "../encoding-rsocket-client";
import { Authentication } from "../security/authentication";
import { RSocketRoutingResponder } from "./rsocket-routing-responder";
export interface RoutedPayload extends DecodedPayload {
    route: string;
    authentication?: Authentication;
    metadata?: CompositeMetadata;
    metadataMimeType?: 'message/x.rsocket.composite-metadata.v0';
}
export declare type MessagePayloadType = 'dataOnly' | 'decodedPayload';
export interface MessageRoutingOptions<PayloadType extends MessagePayloadType> {
    payloadType: PayloadType;
    encodingOptions?: RSocketEncoderRequestOptions;
}
export declare class MessageRoutingRSocket implements RSocket<RoutedPayload, DecodedPayload, RSocketEncoderRequestOptions> {
    readonly parent: EncodingRSocket;
    readonly _responder: RSocketRoutingResponder;
    constructor(parent: EncodingRSocket);
    get responder(): RSocketRoutingResponder;
    simpleRequestResponse<ResponseType = any, RequestType = any>(route: string, data?: RequestType, authentication?: Authentication): Observable<ResponseType>;
    requestResponse(payload: RoutedPayload, options?: RSocketEncoderRequestOptions): Observable<DecodedPayload<any, any>>;
    simpleRequestStream<ResponseType = any, RequestType = any>(route: string, data?: RequestType, requester?: Observable<number>, authentication?: Authentication): Observable<ResponseType>;
    requestStream(payload: RoutedPayload, requester?: Observable<number>, options?: RSocketEncoderRequestOptions): Observable<DecodedPayload<any, any> | Payload>;
    simpleRequestFNF(route: string, data?: any, authentication?: Authentication): void;
    requestFNF(payload: RoutedPayload): void;
    addRequestResponseHandler<RequestType, ResponseType = any>(route: string, handler: (requestData: RequestType, metadata?: CompositeMetadata) => Observable<ResponseType> | ResponseType, options?: MessageRoutingOptions<'dataOnly'>): any;
    addRequestResponseHandler<RequestType>(route: string, handler: (requestData: RequestType, metadata?: CompositeMetadata) => Observable<DecodedPayload> | DecodedPayload, options?: MessageRoutingOptions<'decodedPayload'>): any;
    addRequestStreamHandler<RequestType, ResponseType = any>(route: string, handler: (requestData: RequestType, metadata?: CompositeMetadata) => Observable<ResponseType> | ResponseType, options?: MessageRoutingOptions<'dataOnly'>): any;
    addRequestStreamHandler<RequestType>(route: string, handler: (requestData: RequestType, metadata?: CompositeMetadata) => Observable<DecodedPayload> | DecodedPayload, options?: MessageRoutingOptions<'decodedPayload'>): any;
    addFireAndForgetHandler<RequestType = any>(route: string, handler: (requestData: RequestType, metadata?: CompositeMetadata) => void, options?: RSocketEncoderRequestOptions): void;
    private _createMappingHandler;
    close(): Observable<void>;
    state(): Observable<RSocketState>;
    getSetupConfig(): RSocketConfig;
    private _isCompositeMetadataRequest;
    private _constructCompositeMetadata;
}
