111 lines
2.8 KiB
TypeScript
111 lines
2.8 KiB
TypeScript
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<void>((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(); |