import { tap, expect } from '@git.zone/tstest/tapbundle'; import { SmartProxy } from '../ts/index.js'; import * as net from 'net'; tap.test('should forward HTTP connections on port 8080 to HttpProxy', async (tapTest) => { // Create a simple echo server to act as our target const targetPort = 8181; let receivedData = ''; const targetServer = net.createServer((socket) => { console.log('Target server received connection'); socket.on('data', (data) => { receivedData += data.toString(); console.log('Target server received data:', data.toString().split('\n')[0]); // Send a simple HTTP response const response = 'HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 13\r\n\r\nHello, World!'; socket.write(response); }); }); await new Promise((resolve) => { targetServer.listen(targetPort, () => { console.log(`Target server listening on port ${targetPort}`); resolve(); }); }); // Create SmartProxy with port 8080 configured for HttpProxy const proxy = new SmartProxy({ useHttpProxy: [8080], // Enable HttpProxy for port 8080 httpProxyPort: 8844, enableDetailedLogging: true, routes: [{ name: 'test-route', match: { ports: 8080 }, action: { type: 'forward', target: { host: 'localhost', port: targetPort } } }] }); await proxy.start(); // Give the proxy a moment to fully initialize await new Promise(resolve => setTimeout(resolve, 500)); console.log('Making test connection to proxy on port 8080...'); // Create a simple TCP connection to test const client = new net.Socket(); const responsePromise = new Promise((resolve, reject) => { let response = ''; client.on('data', (data) => { response += data.toString(); console.log('Client received:', data.toString()); }); client.on('end', () => { resolve(response); }); client.on('error', reject); }); await new Promise((resolve, reject) => { client.connect(8080, 'localhost', () => { console.log('Client connected to proxy'); // Send a simple HTTP request client.write('GET / HTTP/1.1\r\nHost: test.local\r\n\r\n'); resolve(); }); client.on('error', reject); }); // Wait for response const response = await responsePromise; // Check that we got the response expect(response).toContain('Hello, World!'); expect(receivedData).toContain('GET / HTTP/1.1'); client.destroy(); await proxy.stop(); await new Promise((resolve) => { targetServer.close(() => resolve()); }); }); tap.start();