import { Board } from "../board";
import { WebSocketSubject } from "rxjs/webSocket";
import * as Network from '.';
import { SocketMessage } from ".";
/**
 * A network manager is aim to manage communication with your server API and websocket server
 */
export declare abstract class AbstractNetworkManager {
    protected api: import("axios").AxiosInstance;
    protected board: Board;
    protected webSocketSubject: WebSocketSubject<any> | null;
    protected msgsPromises: {
        timestamp: number;
        promise: {
            resolve: (value: (Network.SocketMessage | PromiseLike<Network.SocketMessage>)) => void;
            reject: (reason?: any) => void;
        };
    }[];
    constructor(board: Board);
    private init;
    abstract ping(): Promise<string>;
    /**
     * You must initialize this.webSocketSubject as a WebSocketSubject<SocketMessage>
     * @param uid
     */
    abstract joinRoom(uid: string): Promise<Network.Response>;
    /**
     * Disconnect from websocket
     */
    leaveRoom(): void;
    /**
     * Call your API to create a new websocket server
     *
     * @param name
     * @param limit
     * @param data
     * @param autojoinroom
     */
    abstract createRoom(name: string, limit: number, data: {}, autojoinroom: boolean): Promise<Network.Response>;
    /**
     * Add some data to your server
     *
     * @param data
     * @param merge
     */
    abstract setRoomData(data: any, merge: boolean): Promise<Network.Response>;
    /**
     * Get data from server
     */
    abstract getRoomData(): Promise<Network.Response>;
    /**
     * Close a server
     *
     * @param uid
     * @param close
     */
    abstract closeRoom(uid: string, close: boolean): Promise<Network.Response>;
    /**
     * Return all opened rooms
     */
    abstract getOpenedRooms(): Promise<{
        status: string;
        servers: Network.Room[];
    }>;
    /**
     * Return all closed rooms
     */
    abstract getClosedRooms(): Promise<{
        status: string;
        servers: Network.Room[];
    }>;
    /**
     * Open a room (similar to closeRoom(uid, false)
     * @param uid
     */
    openRoom(uid: string): Promise<Network.Response>;
    sendMessage(message: any): Promise<SocketMessage>;
    msgSentConfirmation(message: SocketMessage): void;
    /**
     * This function check if page is reloaded and disconnect the socket
     *
     * @private
     */
    private checkPageReload;
    abstract get wsUrl(): string;
    abstract get apiUrl(): string;
}
