import { expect, tap } from '@git.zone/tstest/tapbundle'; import * as net from 'net'; import { SmartProxy } from '../ts/proxies/smart-proxy/smart-proxy.js'; let echoServer: net.Server; let proxy: SmartProxy; const ECHO_PORT = 47400; const PROXY_PORT_1 = 47401; const PROXY_PORT_2 = 47402; tap.test('port forwarding should not immediately close connections', async (tools) => { // Set a timeout for this test tools.timeout(10000); // 10 seconds // Create an echo server echoServer = await new Promise((resolve, reject) => { const server = net.createServer((socket) => { socket.on('data', (data) => { socket.write(`ECHO: ${data}`); }); }); server.on('error', (err) => { console.error(`Echo server error: ${err.message}`); reject(err); }); server.listen(ECHO_PORT, () => { console.log(`Echo server listening on port ${ECHO_PORT}`); resolve(server); }); }); // Create proxy with forwarding route proxy = new SmartProxy({ routes: [{ name: 'test-forward', match: { ports: PROXY_PORT_1 }, action: { type: 'forward', targets: [{ host: 'localhost', port: ECHO_PORT }] } }] }); await proxy.start(); // Test connection through proxy const client = net.createConnection(PROXY_PORT_1, 'localhost'); const result = await new Promise((resolve, reject) => { client.on('data', (data) => { const response = data.toString(); client.end(); // Close the connection after receiving data resolve(response); }); client.on('error', reject); client.write('Hello'); }); expect(result).toEqual('ECHO: Hello'); // Stop proxy from test 1 before test 2 reassigns the variable await proxy.stop(); }); tap.test('TLS passthrough should work correctly', async () => { // Create proxy with TLS passthrough proxy = new SmartProxy({ routes: [{ name: 'tls-test', match: { ports: PROXY_PORT_2, domains: 'test.example.com' }, action: { type: 'forward', tls: { mode: 'passthrough' }, targets: [{ host: 'localhost', port: 443 }] } }] }); await proxy.start(); // For now just verify the proxy starts correctly with TLS passthrough route expect(proxy).toBeDefined(); await proxy.stop(); }); tap.test('cleanup', async () => { if (echoServer) { await new Promise((resolve) => { echoServer.close(() => { console.log('Echo server closed'); resolve(); }); }); } }); export default tap.start();