fix(routing): unify route based architecture
This commit is contained in:
130
examples/dynamic-port-management.ts
Normal file
130
examples/dynamic-port-management.ts
Normal file
@ -0,0 +1,130 @@
|
||||
/**
|
||||
* Dynamic Port Management Example
|
||||
*
|
||||
* This example demonstrates how to dynamically add and remove ports
|
||||
* while SmartProxy is running, without requiring a restart.
|
||||
*/
|
||||
|
||||
import { SmartProxy } from '../dist_ts/index.js';
|
||||
|
||||
async function main() {
|
||||
// Create a SmartProxy instance with initial routes
|
||||
const proxy = new SmartProxy({
|
||||
routes: [
|
||||
// Initial route on port 8080
|
||||
{
|
||||
match: {
|
||||
ports: 8080,
|
||||
domains: ['example.com', '*.example.com']
|
||||
},
|
||||
action: {
|
||||
type: 'forward',
|
||||
target: { host: 'localhost', port: 3000 }
|
||||
},
|
||||
name: 'Initial HTTP Route'
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
// Start the proxy
|
||||
await proxy.start();
|
||||
console.log('SmartProxy started with initial configuration');
|
||||
console.log('Listening on ports:', proxy.getListeningPorts());
|
||||
|
||||
// Wait 3 seconds
|
||||
console.log('Waiting 3 seconds before adding a new port...');
|
||||
await new Promise(resolve => setTimeout(resolve, 3000));
|
||||
|
||||
// Add a new port listener without changing routes yet
|
||||
await proxy.addListeningPort(8081);
|
||||
console.log('Added port 8081 without any routes yet');
|
||||
console.log('Now listening on ports:', proxy.getListeningPorts());
|
||||
|
||||
// Wait 3 more seconds
|
||||
console.log('Waiting 3 seconds before adding a route for the new port...');
|
||||
await new Promise(resolve => setTimeout(resolve, 3000));
|
||||
|
||||
// Get current routes and add a new one for port 8081
|
||||
const currentRoutes = proxy.settings.routes;
|
||||
|
||||
// Create a new route for port 8081
|
||||
const newRoute = {
|
||||
match: {
|
||||
ports: 8081,
|
||||
domains: ['api.example.com']
|
||||
},
|
||||
action: {
|
||||
type: 'forward',
|
||||
target: { host: 'localhost', port: 4000 }
|
||||
},
|
||||
name: 'API Route'
|
||||
};
|
||||
|
||||
// Update routes to include the new one
|
||||
await proxy.updateRoutes([...currentRoutes, newRoute]);
|
||||
console.log('Added new route for port 8081');
|
||||
|
||||
// Wait 3 more seconds
|
||||
console.log('Waiting 3 seconds before adding another port through updateRoutes...');
|
||||
await new Promise(resolve => setTimeout(resolve, 3000));
|
||||
|
||||
// Add a completely new port via updateRoutes, which will automatically start listening
|
||||
const thirdRoute = {
|
||||
match: {
|
||||
ports: 8082,
|
||||
domains: ['admin.example.com']
|
||||
},
|
||||
action: {
|
||||
type: 'forward',
|
||||
target: { host: 'localhost', port: 5000 }
|
||||
},
|
||||
name: 'Admin Route'
|
||||
};
|
||||
|
||||
// Update routes again to include the third route
|
||||
await proxy.updateRoutes([...currentRoutes, newRoute, thirdRoute]);
|
||||
console.log('Added new route for port 8082 through updateRoutes');
|
||||
console.log('Now listening on ports:', proxy.getListeningPorts());
|
||||
|
||||
// Wait 3 more seconds
|
||||
console.log('Waiting 3 seconds before removing port 8081...');
|
||||
await new Promise(resolve => setTimeout(resolve, 3000));
|
||||
|
||||
// Remove a port without changing routes
|
||||
await proxy.removeListeningPort(8081);
|
||||
console.log('Removed port 8081 (but route still exists)');
|
||||
console.log('Now listening on ports:', proxy.getListeningPorts());
|
||||
|
||||
// Wait 3 more seconds
|
||||
console.log('Waiting 3 seconds before stopping all routes on port 8082...');
|
||||
await new Promise(resolve => setTimeout(resolve, 3000));
|
||||
|
||||
// Remove all routes for port 8082
|
||||
const routesWithout8082 = currentRoutes.filter(route => {
|
||||
// Check if this route includes port 8082
|
||||
const ports = proxy.routeManager.expandPortRange(route.match.ports);
|
||||
return !ports.includes(8082);
|
||||
});
|
||||
|
||||
// Update routes without any for port 8082
|
||||
await proxy.updateRoutes([...routesWithout8082, newRoute]);
|
||||
console.log('Removed routes for port 8082 through updateRoutes');
|
||||
console.log('Now listening on ports:', proxy.getListeningPorts());
|
||||
|
||||
// Show statistics
|
||||
console.log('Statistics:', proxy.getStatistics());
|
||||
|
||||
// Wait 3 more seconds, then shut down
|
||||
console.log('Waiting 3 seconds before shutdown...');
|
||||
await new Promise(resolve => setTimeout(resolve, 3000));
|
||||
|
||||
// Stop the proxy
|
||||
await proxy.stop();
|
||||
console.log('SmartProxy stopped');
|
||||
}
|
||||
|
||||
// Run the example
|
||||
main().catch(err => {
|
||||
console.error('Error in example:', err);
|
||||
process.exit(1);
|
||||
});
|
Reference in New Issue
Block a user