/// /// 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; }