import { expect, tap } from '@git.zone/tstest/tapbundle'; import * as net from 'net'; import { SmartProxy } from '../ts/proxies/smart-proxy/smart-proxy.js'; // Test to verify port forwarding works correctly tap.test('forward connections should not be immediately closed', async (t) => { // Create a backend server that accepts connections const testServer = net.createServer((socket) => { console.log('Client connected to test server'); socket.write('Welcome from test server\n'); socket.on('data', (data) => { console.log('Test server received:', data.toString()); socket.write(`Echo: ${data}`); }); socket.on('error', (err) => { console.error('Test server socket error:', err); }); }); // Listen on a non-privileged port await new Promise((resolve) => { testServer.listen(9090, '127.0.0.1', () => { console.log('Test server listening on port 9090'); resolve(); }); }); // Create SmartProxy with a forward route const smartProxy = new SmartProxy({ enableDetailedLogging: true, routes: [ { id: 'forward-test', name: 'Forward Test Route', match: { ports: 8080, }, action: { type: 'forward', target: { host: '127.0.0.1', port: 9090, }, }, }, ], }); await smartProxy.start(); // Create a client connection through the proxy const client = net.createConnection({ port: 8080, host: '127.0.0.1', }); let connectionClosed = false; let dataReceived = false; let welcomeMessage = ''; client.on('connect', () => { console.log('Client connected to proxy'); }); client.on('data', (data) => { console.log('Client received:', data.toString()); dataReceived = true; welcomeMessage = data.toString(); }); client.on('close', () => { console.log('Client connection closed'); connectionClosed = true; }); client.on('error', (err) => { console.error('Client error:', err); }); // Wait for the welcome message let waitTime = 0; while (!dataReceived && waitTime < 2000) { await new Promise(resolve => setTimeout(resolve, 100)); waitTime += 100; } if (!dataReceived) { throw new Error('Data should be received from the server'); } // Verify we got the welcome message expect(welcomeMessage).toContain('Welcome from test server'); // Send some data client.write('Hello from client'); // Wait a bit to make sure connection isn't immediately closed await new Promise(resolve => setTimeout(resolve, 100)); // Connection should still be open expect(connectionClosed).toEqual(false); // Clean up client.end(); await smartProxy.stop(); testServer.close(); }); export default tap.start();