import { Logger, type MakeRequired } from '../../common';
import { type GatewayReceivePayload, type GatewaySendPayload } from '../../types';
import { DynamicBucket } from '../structures';
import { ConnectTimeout } from '../structures/timeout';
import { BaseSocket } from './basesocket';
import type { ShardData, ShardOptions } from './shared';
export interface ShardHeart {
    interval: number;
    nodeInterval?: NodeJS.Timeout;
    lastAck?: number;
    lastBeat?: number;
    ack: boolean;
}
export declare class Shard {
    id: number;
    logger: Logger;
    debugger?: Logger;
    data: Partial<ShardData> | ShardData;
    websocket: BaseSocket | null;
    connectTimeout: ConnectTimeout;
    heart: ShardHeart;
    bucket: DynamicBucket;
    offlineSendQueue: ((_?: unknown) => void)[];
    pendingGuilds: Set<string>;
    options: MakeRequired<ShardOptions, 'properties' | 'ratelimitOptions'>;
    isReady: boolean;
    constructor(id: number, options: ShardOptions);
    get latency(): number;
    get isOpen(): boolean;
    get gatewayURL(): string;
    get resumeGatewayURL(): string | undefined;
    get currentGatewayURL(): string;
    ping(): Promise<number>;
    connect(): Promise<void>;
    send<T extends GatewaySendPayload = GatewaySendPayload>(force: boolean, message: T): Promise<void>;
    identify(): Promise<void>;
    get resumable(): boolean;
    resume(): Promise<void>;
    heartbeat(requested: boolean): void;
    disconnect(): void;
    reconnect(): Promise<void>;
    onpacket(packet: GatewayReceivePayload): void | Promise<void>;
    protected handleClosed(close: {
        code: number;
        reason: string;
    }): Promise<void>;
    close(code: number, reason: string): void;
    protected handleMessage(data: string | Buffer): void | Promise<void>;
    checkOffline(force: boolean): Promise<unknown>;
    calculateSafeRequests(): number;
}
