import { Deferred } from './utils/Utils.js';
import { RegisteredHandler } from './matchmaker/RegisteredHandler.js';
import { Room } from './Room.js';
import { Presence } from './presence/Presence.js';
import { IRoomCache, MatchMakerDriver, SortOptions } from './matchmaker/driver/local/LocalDriver.js';
import controller from './matchmaker/controller.js';
import * as stats from './Stats.js';
import { AuthContext } from './Transport.js';
import { Type } from './utils/types.js';
export { controller, stats, type MatchMakerDriver };
export type ClientOptions = any;
export type SelectProcessIdCallback = (roomName: string, clientOptions: ClientOptions) => Promise<string>;
export interface SeatReservation {
    sessionId: string;
    room: IRoomCache;
    devMode?: boolean;
}
export declare let publicAddress: string;
export declare let processId: string;
export declare let presence: Presence;
export declare let driver: MatchMakerDriver;
export declare let selectProcessIdToCreateRoom: SelectProcessIdCallback;
export declare function setHealthChecksEnabled(value: boolean): void;
export declare let onReady: Deferred;
export declare enum MatchMakerState {
    INITIALIZING = 0,
    READY = 1,
    SHUTTING_DOWN = 2
}
/**
 * Internal MatchMaker state
 */
export declare let state: MatchMakerState;
/**
 * @private
 */
export declare function setup(_presence?: Presence, _driver?: MatchMakerDriver, _publicAddress?: string, _selectProcessIdToCreateRoom?: SelectProcessIdCallback): Promise<void>;
/**
 * - Accept receiving remote room creation requests
 * - Check for leftover/invalid processId's on startup
 * @private
 */
export declare function accept(): Promise<void>;
/**
 * Join or create into a room and return seat reservation
 */
export declare function joinOrCreate(roomName: string, clientOptions?: ClientOptions, authContext?: AuthContext): Promise<SeatReservation>;
/**
 * Create a room and return seat reservation
 */
export declare function create(roomName: string, clientOptions?: ClientOptions, authContext?: AuthContext): Promise<SeatReservation>;
/**
 * Join a room and return seat reservation
 */
export declare function join(roomName: string, clientOptions?: ClientOptions, authContext?: AuthContext): Promise<SeatReservation>;
/**
 * Join a room by id and return seat reservation
 */
export declare function reconnect(roomId: string, clientOptions?: ClientOptions): Promise<{
    room: import("./matchmaker/driver/api.js").RoomCache<any>;
    sessionId: any;
}>;
/**
 * Join a room by id and return client seat reservation. An exception is thrown if a room is not found for roomId.
 *
 * @param roomId - The Id of the specific room instance.
 * @param clientOptions - Options for the client seat reservation (for `onJoin`/`onAuth`)
 * @param authContext - Optional authentication token
 *
 * @returns Promise<SeatReservation> - A promise which contains `sessionId` and `IRoomCache`.
 */
export declare function joinById(roomId: string, clientOptions?: ClientOptions, authContext?: AuthContext): Promise<SeatReservation>;
/**
 * Perform a query for all cached rooms
 */
export declare function query(conditions?: Partial<IRoomCache>, sortOptions?: SortOptions): Promise<IRoomCache[]>;
/**
 * Find for a public and unlocked room available.
 *
 * @param roomName - The Id of the specific room.
 * @param filterOptions - Filter options.
 * @param sortOptions - Sorting options.
 *
 * @returns Promise<IRoomCache> - A promise contaning an object which includes room metadata and configurations.
 */
export declare function findOneRoomAvailable(roomName: string, filterOptions: ClientOptions, additionalSortOptions?: SortOptions): Promise<import("./matchmaker/driver/api.js").RoomCache<any>>;
/**
 * Call a method or return a property on a remote room.
 *
 * @param roomId - The Id of the specific room instance.
 * @param method - Method or attribute to call or retrive.
 * @param args - Array of arguments for the method
 *
 * @returns Promise<any> - Returned value from the called or retrieved method/attribute.
 */
export declare function remoteRoomCall<R = any>(roomId: string, method: string, args?: any[], rejectionTimeout?: number): Promise<R>;
export declare function defineRoomType<T extends Type<Room>>(roomName: string, klass: T, defaultOptions?: Parameters<NonNullable<InstanceType<T>['onCreate']>>[0]): RegisteredHandler;
export declare function removeRoomType(roomName: string): void;
export declare function hasHandler(roomName: string): boolean;
export declare function getHandler(roomName: string): RegisteredHandler;
export declare function getRoomClass(roomName: string): Type<Room>;
/**
 * Creates a new room.
 *
 * @param roomName - The identifier you defined on `gameServer.define()`
 * @param clientOptions - Options for `onCreate`
 *
 * @returns Promise<IRoomCache> - A promise contaning an object which includes room metadata and configurations.
 */
export declare function createRoom(roomName: string, clientOptions: ClientOptions): Promise<IRoomCache>;
export declare function handleCreateRoom(roomName: string, clientOptions: ClientOptions, restoringRoomId?: string): Promise<IRoomCache>;
/**
 * Get room data by roomId.
 * This method does not return the actual room instance, use `getLocalRoomById` for that.
 */
export declare function getRoomById(roomId: string): Promise<import("./matchmaker/driver/api.js").RoomCache<any>>;
/**
 * Get local room instance by roomId. (Can return "undefined" if the room is not available on this process)
 */
export declare function getLocalRoomById(roomId: string): Room<any, any, any, any>;
/**
 * Disconnects every client on every room in the current process.
 */
export declare function disconnectAll(closeCode?: number): Promise<any>[];
export declare function gracefullyShutdown(): Promise<any>;
/**
 * Reserve a seat for a client in a room
 */
export declare function reserveSeatFor(room: IRoomCache, options: ClientOptions, authData?: any): Promise<SeatReservation>;
/**
 * Perform health check on all processes
 */
export declare function healthCheckAllProcesses(): Promise<void>;
export declare function healthCheckProcessId(processId: string): Promise<any>;
