import type { PeerId, SyncMessage, SyncMessageHandler, SyncTransport } from './types.js';
type WebSocketState = 0 | 1 | 2 | 3;
interface WebSocketLike {
    readyState: WebSocketState;
    onopen: (() => void) | null;
    onmessage: ((event: {
        data: unknown;
    }) => void | Promise<void>) | null;
    onclose: (() => void) | null;
    onerror: ((event: unknown) => void) | null;
    send(data: string): void;
    close(): void;
}
type WebSocketCtor = new (url: string) => WebSocketLike;
export interface PartyKitReconnectOptions {
    /** Max reconnect attempts (0 = unlimited). Default: unlimited. */
    maxAttempts?: number;
    /** Initial backoff in ms. Default: 500. */
    baseDelayMs?: number;
    /** Max backoff in ms. Default: 30_000. */
    maxDelayMs?: number;
}
export interface PartyKitRoomTransportOptions {
    /** Local client/peer identity. */
    peerId: string;
    /** Full PartyKit room WebSocket URL. */
    roomUrl: string;
    /** Optional auth token appended as `?token=` on the WebSocket URL. */
    auth?: string;
    /** Logical room peer ID used by SyncEngine calls. Default: `room`. */
    roomId?: string;
    /** Human-readable room name. */
    roomName?: string;
    /** Test hook or non-browser WebSocket implementation. */
    WebSocketImpl?: WebSocketCtor;
    /**
     * Reconnect with exponential backoff after unexpected close.
     * Default: enabled.
     */
    reconnect?: boolean | PartyKitReconnectOptions;
    /** Called after a successful reconnect (e.g. to re-sync). */
    onReconnect?: () => void | Promise<void>;
    /** Called when the connection drops. */
    onDisconnect?: (reason?: string) => void;
}
/**
 * SyncTransport for a PartyKit-style room relay.
 *
 * The server side should implement the same room semantics as SyncRoomCore:
 * canonical catch-up log, full-op catch-up, and broadcast of newly accepted ops.
 */
export declare class PartyKitRoomTransport implements SyncTransport {
    private peerId;
    private room;
    private roomUrl;
    private WebSocketImpl;
    private ws;
    private messageHandler;
    private intentionalClose;
    private reconnectEnabled;
    private reconnectOpts;
    private reconnectAttempt;
    private reconnectTimer?;
    private connectPromise;
    private onReconnect?;
    private onDisconnect?;
    constructor(opts: PartyKitRoomTransportOptions);
    connect(): Promise<void>;
    send(peerId: string, message: SyncMessage): Promise<void>;
    onMessage(handler: SyncMessageHandler): void;
    peers(): PeerId[];
    close(): void;
    getPeerId(): string;
    getRoomPeer(): PeerId;
    /** Whether the WebSocket is open. */
    isConnected(): boolean;
    private openSocket;
    private scheduleReconnect;
    private tryReconnect;
    private static withAuth;
    private parseMessage;
}
export {};
//# sourceMappingURL=partykit-transport.d.ts.map