import { EventEmitter } from "node:events";
import { ProtoObject } from "./proto-object.js";
import type { ProtoObjectDynamicMethods } from "../types/dynamic-methods.js";
/**
 * Message types for TCP communication
 */
export declare enum MessageType {
    REQUEST = "REQUEST",
    RESPONSE = "RESPONSE",
    NOTIFICATION = "NOTIFICATION",
    ERROR = "ERROR"
}
/**
 * TCP Message wrapper
 */
export interface TCPMessage<T = any> {
    id: string;
    type: MessageType;
    timestamp: number;
    data: T;
}
/**
 * Static methods interface for TCP ProtoObject classes
 */
export interface ProtoObjectTCPStaticMethods<T extends ProtoObjectDynamicMethods<T>> {
    new (data?: Partial<T>): T;
    fromJSON<U extends ProtoObjectDynamicMethods<U>>(data: {
        [key: string]: unknown;
    }): U;
}
/**
 * TCP Server for ProtoObject communication
 */
export declare class ProtoObjectTCPServer extends EventEmitter {
    private port;
    private server;
    private clients;
    constructor(port?: number);
    private setupServer;
    private parseMessages;
    start(): Promise<void>;
    stop(): Promise<void>;
    sendToClient<T extends ProtoObject<T>>(clientId: string, object: T, type?: MessageType): boolean;
    broadcast<T extends ProtoObject<T>>(object: T, type?: MessageType): void;
    private sendMessage;
    private generateId;
    getConnectedClients(): string[];
}
/**
 * TCP Client for ProtoObject communication
 */
export declare class ProtoObjectTCPClient extends EventEmitter {
    private host;
    private port;
    private socket;
    private messageBuffer;
    constructor(host?: string, port?: number);
    connect(): Promise<void>;
    private processMessages;
    send<T extends ProtoObject<T>>(object: T, type?: MessageType): boolean;
    disconnect(): void;
    private generateId;
}
/**
 * Base class for TCP-enabled ProtoObjects
 */
export declare class ProtoObjectTCP<T extends ProtoObjectDynamicMethods<T>> extends ProtoObject<T> {
    constructor(data?: Partial<T>);
    /**
     * Send this object through TCP client
     */
    sendTCP(client: ProtoObjectTCPClient, type?: MessageType): boolean;
    /**
     * Broadcast this object through TCP server
     */
    broadcastTCP(server: ProtoObjectTCPServer, type?: MessageType): void;
    /**
     * Send this object to specific client through TCP server
     */
    sendToClientTCP(server: ProtoObjectTCPServer, clientId: string, type?: MessageType): boolean;
    /**
     * Create object from TCP message
     */
    static fromTCPMessage<U extends ProtoObjectDynamicMethods<U>>(message: TCPMessage): U;
}
