(
target: Deno.Listener,
source: { hostname: string; port: number },
)
| 14 | import { getSocketName } from "../utils/utils.ts"; |
| 15 | |
| 16 | function createProxy( |
| 17 | target: Deno.Listener, |
| 18 | source: { hostname: string; port: number }, |
| 19 | ): { aborter: AbortController; proxy: Promise<void> } { |
| 20 | const aborter = new AbortController(); |
| 21 | |
| 22 | const proxy = (async () => { |
| 23 | for await (const conn of target) { |
| 24 | const outbound = await Deno.connect({ |
| 25 | hostname: source.hostname, |
| 26 | port: source.port, |
| 27 | }); |
| 28 | |
| 29 | aborter.signal.addEventListener("abort", () => { |
| 30 | conn.close(); |
| 31 | outbound.close(); |
| 32 | }); |
| 33 | |
| 34 | await Promise.all([ |
| 35 | conn.readable.pipeTo(outbound.writable), |
| 36 | outbound.readable.pipeTo(conn.writable), |
| 37 | ]).catch(() => {}); |
| 38 | } |
| 39 | })(); |
| 40 | |
| 41 | return { aborter, proxy }; |
| 42 | } |
| 43 | |
| 44 | function getRandomString() { |
| 45 | return Math.random().toString(36).substring(7); |
no test coverage detected