import type { PeerInfo, MessageRecord } from "../types.js";
/**
 * WebSocket close codes for different disconnect scenarios.
 * Uses standard RFC 6455 / IANA-registered codes.
 */
export declare const WsCloseCode: {
    /** Clean client-initiated close. */
    readonly NORMAL_CLOSURE: 1000;
    /** Heartbeat timeout -- 3 missed pings (90s). */
    readonly HEARTBEAT_TIMEOUT: 1001;
    /** Invalid frame data from client. */
    readonly UNSUPPORTED_DATA: 1003;
    /** Unexpected server error. */
    readonly INTERNAL_ERROR: 1011;
    /** Server shutting down via SIGTERM. */
    readonly SERVICE_RESTART: 1012;
};
export interface MessageFrame {
    type: "message";
    payload: MessageRecord;
    timestamp: string;
}
export interface PeerConnectedFrame {
    type: "peer_connected";
    payload: {
        peerId: string;
        name: string;
        project: string;
    };
    timestamp: string;
}
export interface PeerDisconnectedFrame {
    type: "peer_disconnected";
    payload: {
        peerId: string;
    };
    timestamp: string;
}
export interface PeersSnapshotFrame {
    type: "peers_snapshot";
    payload: {
        peers: PeerInfo[];
    };
    timestamp: string;
}
export interface QueuedMessagesFrame {
    type: "queued_messages";
    payload: {
        messages: MessageRecord[];
    };
    timestamp: string;
}
export interface ErrorFrame {
    type: "error";
    payload: {
        code: string;
        message: string;
    };
    timestamp: string;
}
export interface DeliveryAckFrame {
    type: "delivery_ack";
    payload: {
        messageId: string;
        peerId: string;
    };
    timestamp: string;
}
/**
 * Discriminated union of all server-to-client WebSocket frame types.
 * The `type` field acts as the discriminator for client-side dispatch.
 */
export type WsServerFrame = MessageFrame | PeerConnectedFrame | PeerDisconnectedFrame | PeersSnapshotFrame | QueuedMessagesFrame | ErrorFrame | DeliveryAckFrame;
//# sourceMappingURL=ws-frames.d.ts.map