///
///
import { Proxy, ReadData, WriteData, AuthData, AcceptSocket } from "../types";
import EventEmitter from "eventemitter3";
import { net } from "../adapter";
import { AigoSocket, IOSocket, ISocket, SecretSocket } from "../stream";
import Peer from "../stream/peer/peer";
import ConnectFactor from ".";
import { ConnectProtocol } from "./types";
export type Callback = (error: Error | undefined, socket: ISocket) => void;
export type EventType = {
open: () => void;
in: (data: ReadData) => void;
out: (data: WriteData) => void;
auth: (data: AuthData) => void;
close: (socket: net.Socket) => void;
timeout: (socket?: net.Socket) => void;
error: (err: Error) => void;
connect: (socket: IOSocket) => void;
};
export type ConnectHeaders = {
host: string;
port: number;
sessionId?: string;
};
/**
* 连接远程代理服务器的抽象类
*/
export default abstract class Connect extends EventEmitter {
readonly options: {
protocol: ConnectProtocol;
};
readonly connectFactor?: ConnectFactor | undefined;
id: string;
timeout: number;
protocol: ConnectProtocol;
peer: Peer;
constructor(options: {
protocol: ConnectProtocol;
}, connectFactor?: ConnectFactor | undefined);
setTimeout(ttl?: number): void;
setPeer(peer: Peer): void;
/**
* 连接代理目标,采用socket,websocket, peersocket等方式,自己选择方式连接目标
* @param proxy
* @param callback
* @returns
*/
protected connectProxyTarget(proxy: {
host: string;
port: number;
}, callback: (socket: SecretSocket) => void): AcceptSocket;
/**
* 连接远程代理主机
* @param host 目标主机ip或域名
* @param port 目标主机端口
* @param proxy 代理服务器信息
* @param callback 连接成功后的回调方法
*/
abstract connect(headers: ConnectHeaders, proxy: Proxy, callback: Callback): void;
/**
* 握手
* @param socket 代理socket
* @param targetInfo 目标主机信息
* @param proxy 代理信息
* @param callback 回调
*/
handshake(socket: ISocket, targetInfo: {
host: string;
port: number;
}, proxy: Proxy, callback: Callback): Promise;
/**
* 连接链
* @param aigoSocket
* @param targetInfo
* @param chain
* @param callback
*/
protected connectChain(aigoSocket: AigoSocket, targetInfo: {
host: string;
port: number;
}, chain: Proxy, callback: Callback): void;
pipe(sourceSocket: IOSocket, targetSocket: IOSocket, chunk: Buffer): void;
protected ok(checked: boolean, msg: string, socket: ISocket): boolean;
}