(socket: tls.TLSSocket | net.Socket | stream.Duplex)
| 35 | public async createProxy(socket: tls.TLSSocket | net.Socket): Promise<net.Socket> |
| 36 | public async createProxy(socket: stream.Duplex): Promise<stream.Duplex> |
| 37 | public async createProxy(socket: tls.TLSSocket | net.Socket | stream.Duplex): Promise<net.Socket | stream.Duplex> { |
| 38 | if (!(socket instanceof tls.TLSSocket)) { |
| 39 | return socket |
| 40 | } |
| 41 | |
| 42 | await this.startProxyServer() |
| 43 | |
| 44 | return new Promise((resolve, reject) => { |
| 45 | const id = generateUuid() |
| 46 | const proxy = net.connect(this.proxyPipe) |
| 47 | proxy.once("connect", () => proxy.write(id)) |
| 48 | |
| 49 | const timeout = setTimeout(() => { |
| 50 | listener.dispose() |
| 51 | socket.destroy() |
| 52 | proxy.destroy() |
| 53 | reject(new Error("TLS socket proxy timed out")) |
| 54 | }, this.proxyTimeout) |
| 55 | |
| 56 | const listener = this.onProxyConnect.event((connection) => { |
| 57 | connection.once("data", (data) => { |
| 58 | if (!socket.destroyed && !proxy.destroyed && data.toString() === id) { |
| 59 | clearTimeout(timeout) |
| 60 | listener.dispose() |
| 61 | ;[ |
| 62 | [proxy, socket], |
| 63 | [socket, proxy], |
| 64 | ].forEach(([a, b]) => { |
| 65 | a.pipe(b) |
| 66 | a.on("error", () => b.destroy()) |
| 67 | a.on("close", () => b.destroy()) |
| 68 | a.on("end", () => b.end()) |
| 69 | }) |
| 70 | resolve(connection) |
| 71 | } |
| 72 | }) |
| 73 | }) |
| 74 | }) |
| 75 | } |
| 76 | |
| 77 | private async startProxyServer(): Promise<net.Server> { |
| 78 | if (!this._proxyServer) { |
no test coverage detected