/// <reference types="node" />
/// <reference types="node" />
/// <reference types="node" />
import { Duplex } from 'stream';
import { Socket, SocketConnectOpts } from 'net';
import { RequireOnlyOne } from './util';
declare const DEFAULT_TIMEOUT = 30000;
declare type SocksProxyType = 4 | 5;
declare const ERRORS: {
    InvalidSocksCommand: string;
    InvalidSocksCommandForOperation: string;
    InvalidSocksCommandChain: string;
    InvalidSocksClientOptionsDestination: string;
    InvalidSocksClientOptionsExistingSocket: string;
    InvalidSocksClientOptionsProxy: string;
    InvalidSocksClientOptionsTimeout: string;
    InvalidSocksClientOptionsProxiesLength: string;
    InvalidSocksClientOptionsCustomAuthRange: string;
    InvalidSocksClientOptionsCustomAuthOptions: string;
    NegotiationError: string;
    SocketClosed: string;
    ProxyConnectionTimedOut: string;
    InternalError: string;
    InvalidSocks4HandshakeResponse: string;
    Socks4ProxyRejectedConnection: string;
    InvalidSocks4IncomingConnectionResponse: string;
    Socks4ProxyRejectedIncomingBoundConnection: string;
    InvalidSocks5InitialHandshakeResponse: string;
    InvalidSocks5IntiailHandshakeSocksVersion: string;
    InvalidSocks5InitialHandshakeNoAcceptedAuthType: string;
    InvalidSocks5InitialHandshakeUnknownAuthType: string;
    Socks5AuthenticationFailed: string;
    InvalidSocks5FinalHandshake: string;
    InvalidSocks5FinalHandshakeRejected: string;
    InvalidSocks5IncomingConnectionResponse: string;
    Socks5ProxyRejectedIncomingBoundConnection: string;
};
declare const SOCKS_INCOMING_PACKET_SIZES: {
    Socks5InitialHandshakeResponse: number;
    Socks5UserPassAuthenticationResponse: number;
    Socks5ResponseHeader: number;
    Socks5ResponseIPv4: number;
    Socks5ResponseIPv6: number;
    Socks5ResponseHostname: (hostNameLength: number) => number;
    Socks4Response: number;
};
declare type SocksCommandOption = 'connect' | 'bind' | 'associate';
declare enum SocksCommand {
    connect = 1,
    bind = 2,
    associate = 3
}
declare enum Socks4Response {
    Granted = 90,
    Failed = 91,
    Rejected = 92,
    RejectedIdent = 93
}
declare enum Socks5Auth {
    NoAuth = 0,
    GSSApi = 1,
    UserPass = 2
}
declare const SOCKS5_CUSTOM_AUTH_START = 128;
declare const SOCKS5_CUSTOM_AUTH_END = 254;
declare const SOCKS5_NO_ACCEPTABLE_AUTH = 255;
declare enum Socks5Response {
    Granted = 0,
    Failure = 1,
    NotAllowed = 2,
    NetworkUnreachable = 3,
    HostUnreachable = 4,
    ConnectionRefused = 5,
    TTLExpired = 6,
    CommandNotSupported = 7,
    AddressNotSupported = 8
}
declare enum Socks5HostType {
    IPv4 = 1,
    Hostname = 3,
    IPv6 = 4
}
declare enum SocksClientState {
    Created = 0,
    Connecting = 1,
    Connected = 2,
    SentInitialHandshake = 3,
    ReceivedInitialHandshakeResponse = 4,
    SentAuthentication = 5,
    ReceivedAuthenticationResponse = 6,
    SentFinalHandshake = 7,
    ReceivedFinalResponse = 8,
    BoundWaitingForConnection = 9,
    Established = 10,
    Disconnected = 11,
    Error = 99
}
/**
 * Represents a SocksProxy
 */
declare type SocksProxy = RequireOnlyOne<{
    ipaddress?: string;
    host?: string;
    port: number;
    type: SocksProxyType;
    userId?: string;
    password?: string;
    custom_auth_method?: number;
    custom_auth_request_handler?: () => Promise<Buffer>;
    custom_auth_response_size?: number;
    custom_auth_response_handler?: (data: Buffer) => Promise<boolean>;
}, 'host' | 'ipaddress'>;
/**
 * Represents a remote host
 */
interface SocksRemoteHost {
    host: string;
    port: number;
}
/**
 * SocksClient connection options.
 */
interface SocksClientOptions {
    command: SocksCommandOption;
    destination: SocksRemoteHost;
    proxy: SocksProxy;
    timeout?: number;
    existing_socket?: Duplex;
    set_tcp_nodelay?: boolean;
    socket_options?: SocketConnectOpts;
}
/**
 * SocksClient chain connection options.
 */
interface SocksClientChainOptions {
    command: 'connect';
    destination: SocksRemoteHost;
    proxies: SocksProxy[];
    timeout?: number;
    randomizeChain?: false;
}
interface SocksClientEstablishedEvent {
    socket: Socket;
    remoteHost?: SocksRemoteHost;
}
declare type SocksClientBoundEvent = SocksClientEstablishedEvent;
interface SocksUDPFrameDetails {
    frameNumber?: number;
    remoteHost: SocksRemoteHost;
    data: Buffer;
}
export { DEFAULT_TIMEOUT, ERRORS, SocksProxyType, SocksCommand, Socks4Response, Socks5Auth, Socks5HostType, Socks5Response, SocksClientState, SocksProxy, SocksRemoteHost, SocksCommandOption, SocksClientOptions, SocksClientChainOptions, SocksClientEstablishedEvent, SocksClientBoundEvent, SocksUDPFrameDetails, SOCKS_INCOMING_PACKET_SIZES, SOCKS5_CUSTOM_AUTH_START, SOCKS5_CUSTOM_AUTH_END, SOCKS5_NO_ACCEPTABLE_AUTH, };
