import { Events, Game } from "../../types";
import { API, type APITypes, EventEmitter } from "../../utils";
export type Codec = "json" | "teto" | "candor";
export interface Spool {
    host: string;
    endpoint: string;
    token: string;
    signature: Promise<APITypes.Server.Signature>;
}
export declare class Ribbon {
    #private;
    static CACHE_MAXSIZE: number;
    static BATCH_TIMEOUT: number;
    static readonly CLOSE_CODES: {
        readonly 1000: "ribbon closed normally";
        readonly 1001: "client closed ribbon";
        readonly 1002: "protocol error";
        readonly 1003: "protocol violation";
        readonly 1005: "no error provided";
        readonly 1006: "ribbon lost";
        readonly 1007: "payload data corrupted";
        readonly 1008: "protocol violation";
        readonly 1009: "too much data";
        readonly 1010: "negotiation error";
        readonly 1011: "server error";
        readonly 1012: "server restarting";
        readonly 1013: "temporary error";
        readonly 1014: "bad gateway";
        readonly 1015: "TLS error";
    };
    static FLAGS: {
        ALIVE: number;
        SUCCESSFUL: number;
        CONNECTING: number;
        FAST_PING: number;
        TIMING_OUT: number;
        DEAD: number;
    };
    static CODEC_FLAGS: {
        readonly F_ID: 128;
    };
    static SLOW_CODEC_THRESHOLD: number;
    emitter: EventEmitter<Events.in.all>;
    constructor({ verbose, token, handling, userAgent, codec, spool, api, spooling }: {
        verbose: boolean;
        token: string;
        handling: Game.Handling;
        userAgent: string;
        codec: Codec;
        spool: Spool;
        api: API;
        spooling?: boolean;
    });
    static create({ verbose, token, handling, userAgent, codec, spooling }: {
        verbose?: boolean;
        token: string;
        handling: Game.Handling;
        userAgent: string;
        codec?: Codec;
        spooling?: boolean;
    }): Promise<Ribbon>;
    emit<T extends keyof Events.out.all>(event: T, ...data: Events.out.all[T] extends void ? [] : [Events.out.all[T]]): void;
    log(msg: string, { force, level }?: {
        force: boolean;
        level: "info" | "warning" | "error";
    }): void;
    /** The last ping time, in ms */
    get ping(): number;
    /** Used in the Game class to detect disconnects faster, don't touch. */
    set fasterPing(value: boolean);
    /** Ribbon spool information, useful for logging */
    get spool(): {
        host: string;
        endpoint: string;
    };
    /** Closes and cleans up the ribbon, called automatically by `client.destroy()` */
    destroy(): void;
    /** Automatically disconnect the ribbon's connection. It will attempt to automatically reconnect. */
    disconnect(): void;
    /** Clones a ribbon. Used internally by Client.reconnect. */
    clone(): Promise<Ribbon>;
}
export { RibbonOptions } from "./types";
