import type { Type } from '@nestjs/common';
import * as net from 'net';
import { Server as NetSocket, Socket } from 'net';
import { TlsOptions } from 'tls';
import { TcpEvents, TcpStatus } from '../events/tcp.events.js';
import { TcpSocket } from '../helpers/index.js';
import { TcpOptions, TransportId } from '../interfaces/microservice-configuration.interface.js';
import { Server } from './server.js';
/**
 * @publicApi
 */
export declare class ServerTCP extends Server<TcpEvents, TcpStatus> {
    private readonly options;
    transportId: TransportId;
    protected server: NetSocket;
    protected readonly port: number;
    protected readonly host: string;
    protected readonly socketClass: Type<TcpSocket>;
    protected readonly maxBufferSize?: number;
    protected readonly incompleteMessageTimeout?: number;
    protected readonly maxSendBufferSize?: number;
    protected isManuallyTerminated: boolean;
    protected retryAttemptsCount: number;
    protected retryTimer?: ReturnType<typeof setTimeout>;
    protected tlsOptions?: TlsOptions;
    protected pendingEventListeners: Array<{
        event: keyof TcpEvents;
        callback: TcpEvents[keyof TcpEvents];
    }>;
    /**
     * Sockets accepted by this server that are still open. "net.Server#close"
     * only stops the server from accepting new connections, so these are tracked
     * separately and torn down on "close" - otherwise the process outlives the
     * shutdown and handlers keep running on already established connections.
     */
    protected readonly openSockets: Set<net.Socket>;
    constructor(options: Required<TcpOptions>['options']);
    listen(callback: (err?: unknown, ...optionalParams: unknown[]) => void): void;
    close(): void;
    bindHandler(socket: Socket): void;
    handleMessage(socket: TcpSocket, rawMessage: unknown): Promise<any>;
    handleClose(): undefined | number | NodeJS.Timer;
    unwrap<T>(): T;
    on<EventKey extends keyof TcpEvents = keyof TcpEvents, EventCallback extends TcpEvents[EventKey] = TcpEvents[EventKey]>(event: EventKey, callback: EventCallback): void;
    protected init(): void;
    protected registerListeningListener(socket: net.Server): void;
    protected registerErrorListener(socket: net.Server): void;
    protected registerCloseListener(socket: net.Server): void;
    /**
     * Keeps a reference to an accepted socket so that it can be destroyed when
     * the server is closed, and drops it again once it closes on its own.
     */
    protected trackOpenSocket(socket: Socket): void;
    /**
     * Destroys every socket still open. Called on shutdown so that "close" does
     * not leave the process alive, and so that no further messages are dispatched
     * to handlers over connections established before the shutdown.
     */
    protected closeOpenSockets(): void;
    protected getSocketInstance(socket: Socket): TcpSocket;
}
