import Emitter from './Util/Emitter';
import Util from './Util/Util';
import P2PLoader from './../Loaders/P2PLoader';
/**
 * @class
 * @description Communication class that manages communication with a websocket tracker and gets peer candidates.
 * @extends Emitter
 * @exports P2PManager
 */
export default class P2PManager extends Emitter {
    static Util: typeof Util;
    static Constants: {
        trackerInterval: number;
        trackerCommunicationWait: number;
        trackerRetryJoinTime: number;
        Token: string;
        Default: {
            AnnouncePeers: number;
            MaxAnnouncePeers: number;
        };
        iceServers: {
            iceServers: {
                urls: string[];
            }[];
        };
        AnnounceEvents: {
            Offer: string;
            Offers: string;
            Candidates: string;
            Answer: string;
            Join: string;
        };
        WSCommEvents: {
            Connected: string;
            Data: string;
            Error: string;
            Closed: string;
            Warning: string;
        };
        WebRtcEvents: {
            Peer: string;
            PeerUpdate: string;
            Update: string;
            Error: string;
            Warning: string;
        };
        PeerEvents: {
            Connect: string;
            Error: string;
            Close: string;
            Signal: string;
        };
    };
    private readonly _hashId;
    private readonly _peerId;
    private readonly _config;
    private _tracker?;
    private _peerList;
    private _sentOffers;
    private _myOffers;
    private _tempAnswers;
    private _tempCandidates;
    private isOfferProcessStarted;
    private _loader;
    private _destroyed;
    private _peerConnectionErrors;
    private _maxPeerErrorsConnectionToBan;
    /**
     * @constructs P2PManager
     * @param {string} hashId ID of the content as string, to be hashed.
     * @param {P2PConfig} config Configuration JSON, including the tracker URL, iceServers...
     * @param {string?} peerId Optional, ID of the peer/user, if not set a random one will be generated.
     * @public
     */
    constructor(loader: P2PLoader, hashId: string, config: P2PConfig, peerId?: string);
    getId(): string;
    /**
     * Starts the communication with the websocket tracker
     * @public
     */
    start(): void;
    /**
     * Ends the communication with the websocket tracker
     * @public
     */
    stop(): void;
    /**
     * Destroys the tracker reference and stops the communication
     * @public
     */
    destroy(): void;
    /**
     * Sends a message to the tracker if available
     * @param {trackerMessage} message JSON object with the data to be sent to the tracker.
     * @private
     */
    private _sendWsMessage;
    /**
     * Generates an array of offers to be used/sent to the tracker so we can get answers to connect to peers
     * @private
     */
    private _generateAndSendOfferList;
    /**
     * Creates a peer to offer it, or to send it as answer.
     * @param {string} id ID of the peer to be created.
     * @param {boolean} initiator By defult true, if it has to generate the offer. If not generates the answer.
     * @returns {Peer.Instance} Peer object waiting for events/responses
     * @private
     */
    private _createPeer;
    /**
     * Callback for data events from the tracker
     * It manages all the events used: Offer, Candidates, Answer, Join
     * @param {callbackData} e event callback data
     * @private
     */
    private _dataReceived;
    /**
     * Handles tracker join event
     * @param {joinResponse} e event callback data
     * @private
     */
    private _handleJoin;
    /**
     * Handles tracker answer event
     * @param {answerData} e event callback data
     * @private
     */
    private _handleAnswer;
    /**
     * Handles connection after answer or candidates event
     * @param {answerObject} answer answer callback data/object
     */
    private _manageAnswer;
    /**
     * Handles tracker candidates event
     * @param {candidatesData} e event callback data
     * @private
     */
    private _handleCandidates;
    /**
     * Handles tracker offer event
     * @param {offerData} e event callback data
     * @private
     */
    private _handleOffer;
    private static parseCandidate;
    test(): void;
}
