import * as JsSIP from 'jssip';
import { AnswerOptions, RenegotiateOptions, RTCSession, TerminateOptions } from 'jssip/lib/RTCSession';
import { UnRegisterOptions } from 'jssip/lib/UA';
import * as PropTypes from 'prop-types';
import * as React from 'react';
import { CallDirection, CallStatus, SipErrorType, SipStatus } from '../../lib/enums';
import { ExtraHeaders } from '../../lib/types';
export interface JsSipConfig {
    host: string;
    port: number;
    pathname: string;
    secure: boolean;
    user: string;
    password: string;
    autoRegister: boolean;
    autoAnswer: boolean;
    iceRestart: boolean;
    sessionTimersExpires: number;
    extraHeaders: ExtraHeaders;
    iceServers: RTCIceServer[];
    debug: boolean;
    inboundAudioDeviceId: string;
    outboundAudioDeviceId: string;
    debugNamespaces?: string | null;
}
export interface JsSipState {
    sipStatus: SipStatus;
    sipErrorType: SipErrorType | null;
    sipErrorMessage: string | null;
    callStatus: CallStatus;
    callDirection: CallDirection | null;
    callCounterpart: string | null;
    dtmfSender: RTCDTMFSender | null;
    callIsOnHold: boolean;
    callMicrophoneIsMuted: boolean;
    rtcSession: RTCSession | null;
    isPlaying: boolean;
}
export default class SipProvider extends React.Component<JsSipConfig, JsSipState> {
    static childContextTypes: {
        sip: PropTypes.Requireable<PropTypes.InferProps<{
            status: PropTypes.Requireable<string>;
            errorType: PropTypes.Requireable<string>;
            errorMessage: PropTypes.Requireable<string>;
            host: PropTypes.Requireable<string>;
            port: PropTypes.Requireable<number>;
            user: PropTypes.Requireable<string>;
            pathname: PropTypes.Requireable<string>;
            secure: PropTypes.Requireable<boolean>;
            password: PropTypes.Requireable<string>;
            autoRegister: PropTypes.Requireable<boolean>;
            autoAnswer: PropTypes.Requireable<boolean>;
            sessionTimersExpires: PropTypes.Requireable<number>;
            extraHeaders: PropTypes.Requireable<{
                [x: string]: (string | null | undefined)[] | null | undefined;
            }>;
            iceServers: PropTypes.Requireable<(object | null | undefined)[]>;
            debug: PropTypes.Requireable<boolean>;
            debugNamespaces: PropTypes.Requireable<string>;
        }>>;
        call: PropTypes.Requireable<PropTypes.InferProps<{
            id: PropTypes.Requireable<string>;
            status: PropTypes.Requireable<string>;
            direction: PropTypes.Requireable<string>;
            counterpart: PropTypes.Requireable<string>;
            isOnHold: PropTypes.Requireable<boolean>;
            hold: PropTypes.Requireable<(...args: any[]) => any>;
            unhold: PropTypes.Requireable<(...args: any[]) => any>;
            toggleHold: PropTypes.Requireable<(...args: any[]) => any>;
            microphoneIsMuted: PropTypes.Requireable<boolean>;
            muteMicrophone: PropTypes.Requireable<(...args: any[]) => any>;
            unmuteMicrophone: PropTypes.Requireable<(...args: any[]) => any>;
            toggleMuteMicrophone: PropTypes.Requireable<(...args: any[]) => any>;
            isPlaying: PropTypes.Requireable<boolean>;
        }>>;
        registerSip: PropTypes.Requireable<(...args: any[]) => any>;
        unregisterSip: PropTypes.Requireable<(...args: any[]) => any>;
        answerCall: PropTypes.Requireable<(...args: any[]) => any>;
        startCall: PropTypes.Requireable<(...args: any[]) => any>;
        stopCall: PropTypes.Requireable<(...args: any[]) => any>;
        sendDTMF: PropTypes.Requireable<(...args: any[]) => any>;
        audioSinkId: PropTypes.Requireable<string>;
        setAudioSinkId: PropTypes.Requireable<(...args: any[]) => any>;
    };
    static propTypes: {
        host: PropTypes.Requireable<string>;
        port: PropTypes.Requireable<number>;
        pathname: PropTypes.Requireable<string>;
        secure: PropTypes.Requireable<boolean>;
        user: PropTypes.Requireable<string>;
        password: PropTypes.Requireable<string>;
        autoRegister: PropTypes.Requireable<boolean>;
        autoAnswer: PropTypes.Requireable<boolean>;
        iceRestart: PropTypes.Requireable<boolean>;
        sessionTimersExpires: PropTypes.Requireable<number>;
        extraHeaders: PropTypes.Requireable<{
            [x: string]: (string | null | undefined)[] | null | undefined;
        }>;
        iceServers: PropTypes.Requireable<(object | null | undefined)[]>;
        debug: PropTypes.Requireable<boolean>;
        inboundAudioDeviceId: PropTypes.Requireable<string>;
        outboundAudioDeviceId: PropTypes.Requireable<string>;
        children: PropTypes.Requireable<PropTypes.ReactNodeLike>;
    };
    static defaultProps: {
        host: null;
        port: null;
        pathname: string;
        secure: boolean;
        user: null;
        password: null;
        autoRegister: boolean;
        autoAnswer: boolean;
        iceRestart: boolean;
        sessionTimersExpires: number;
        extraHeaders: {
            register: never[];
            invite: never[];
            hold: never[];
        };
        iceServers: never[];
        debug: boolean;
        inboundAudioDeviceId: string;
        outboundAudioDeviceId: string;
        children: null;
    };
    private ua;
    private logger;
    private currentSinkId;
    private remoteAudioElement;
    constructor(props: any);
    getChildContext(): {
        sip: {
            status: SipStatus;
            errorType: "sipErrorType/CONFIGURATION" | "sipErrorType/CONNECTION" | "sipErrorType/REGISTRATION" | null;
            errorMessage: string | null;
            host: string;
            port: number;
            pathname: string;
            secure: boolean;
            user: string;
            password: string;
            autoRegister: boolean;
            autoAnswer: boolean;
            iceRestart: boolean;
            sessionTimersExpires: number;
            extraHeaders: ExtraHeaders;
            iceServers: RTCIceServer[];
            debug: boolean;
            inboundAudioDeviceId: string;
            outboundAudioDeviceId: string;
            debugNamespaces?: string | null | undefined;
            children?: React.ReactNode;
        };
        call: {
            id: string;
            status: CallStatus;
            direction: "callDirection/INCOMING" | "callDirection/OUTGOING" | null;
            counterpart: string | null;
            dtmfSender: RTCDTMFSender | null;
            isOnHold: boolean;
            hold: (useUpdate?: boolean) => void;
            unhold: (useUpdate?: boolean) => void;
            toggleHold: (useUpdate?: boolean) => void;
            microphoneIsMuted: boolean;
            muteMicrophone: () => void;
            unmuteMicrophone: () => void;
            toggleMuteMicrophone: () => void;
            renegotiate: (options?: RenegotiateOptions | undefined, done?: (() => void) | undefined) => void;
        };
        registerSip: () => void;
        unregisterSip: (options?: UnRegisterOptions | undefined) => void;
        audioSinkId: string;
        setAudioSinkId: (sinkId: string) => Promise<void>;
        answerCall: (options?: AnswerOptions | undefined) => void;
        startCall: (destination: string | number, anonymous?: boolean | undefined) => void;
        stopCall: (options?: TerminateOptions | undefined) => void;
        sendDTMF: (tones: string, duration?: number, interToneGap?: number) => void;
    };
    getUA(): JsSIP.UA | null;
    getUAOrFail(): JsSIP.UA;
    componentDidMount(): void;
    componentDidUpdate(prevProps: any): void;
    componentWillUnmount(): void;
    render(): React.ReactNode;
    registerSip(): void;
    unregisterSip(options?: UnRegisterOptions): void;
    reconfigureDebug(): void;
    setAudioSinkId: (sinkId: string) => Promise<void>;
    get audioSinkId(): string;
    reinitializeJsSIP(): Promise<void>;
    answerCall: (options?: AnswerOptions | undefined) => void;
    startCall: (destination: string | number, anonymous?: boolean | undefined) => void;
    stopCall: (options?: TerminateOptions | undefined) => void;
    sendDTMF: (tones: string, duration?: number, interToneGap?: number) => void;
    callHold: (useUpdate?: boolean) => void;
    callUnhold: (useUpdate?: boolean) => void;
    callToggleHold: (useUpdate?: boolean) => void;
    callMuteMicrophone: () => void;
    callUnmuteMicrophone: () => void;
    callToggleMuteMicrophone: () => void;
    renegotiate: (options?: RenegotiateOptions | undefined, done?: (() => void) | undefined) => void;
    private handleAutoAnswer;
    private getRemoteAudioOrFail;
    private createRemoteAudioElement;
    private deleteRemoteAudio;
}
