import * as plugins from '../plugins.js'; import { createServer } from 'http'; import { Socket } from 'net'; import { DomainManager, DomainManagerEvents, createDomainConfig, helpers } from '../smartproxy/forwarding/index.js'; /** * Example showing how to use the unified forwarding system */ async function main() { console.log('Initializing forwarding example...'); // Create the domain manager const domainManager = new DomainManager(); // Set up event listeners domainManager.on(DomainManagerEvents.DOMAIN_ADDED, (data) => { console.log(`Domain added: ${data.domains.join(', ')} (${data.forwardingType})`); }); domainManager.on(DomainManagerEvents.DOMAIN_MATCHED, (data) => { console.log(`Domain matched: ${data.domain} (${data.handlerType})`); }); domainManager.on(DomainManagerEvents.DOMAIN_MATCH_FAILED, (data) => { console.log(`Domain match failed: ${data.domain}`); }); domainManager.on(DomainManagerEvents.ERROR, (data) => { console.error(`Error:`, data); }); // Add example domains with different forwarding types // Example 1: HTTP-only forwarding await domainManager.addDomainConfig( createDomainConfig('example.com', helpers.httpOnly({ target: { host: 'localhost', port: 3000 } })) ); // Example 2: HTTPS termination with HTTP backend await domainManager.addDomainConfig( createDomainConfig('secure.example.com', helpers.tlsTerminateToHttp({ target: { host: 'localhost', port: 3000 } })) ); // Example 3: HTTPS termination with HTTPS backend await domainManager.addDomainConfig( createDomainConfig('api.example.com', helpers.tlsTerminateToHttps({ target: { host: 'localhost', port: 8443 } })) ); // Example 4: SNI passthrough await domainManager.addDomainConfig( createDomainConfig('passthrough.example.com', helpers.sniPassthrough({ target: { host: '10.0.0.5', port: 443 } })) ); // Example 5: Custom configuration for a more complex setup await domainManager.addDomainConfig( createDomainConfig(['*.example.com', '*.example.org'], { type: 'https-terminate-to-http', target: { host: ['10.0.0.10', '10.0.0.11'], // Round-robin load balancing port: 8080 }, http: { enabled: true, redirectToHttps: false // Allow both HTTP and HTTPS }, acme: { enabled: true, maintenance: true, production: false, // Use staging for testing forwardChallenges: { host: '192.168.1.100', port: 8080 } }, security: { allowedIps: ['10.0.0.*', '192.168.1.*'], maxConnections: 100 }, advanced: { headers: { 'X-Forwarded-For': '{clientIp}', 'X-Forwarded-Host': '{sni}' } } }) ); // Create a simple HTTP server to demonstrate HTTP handler const httpServer = createServer((req, res) => { // Extract the domain from the Host header const domain = req.headers.host?.split(':')[0] || 'unknown'; // Forward the request to the appropriate handler if (!domainManager.handleHttpRequest(domain, req, res)) { // No handler found, send a default response res.statusCode = 404; res.end(`No handler found for domain: ${domain}`); } }); // Listen on HTTP port httpServer.listen(80, () => { console.log('HTTP server listening on port 80'); }); // For HTTPS and SNI, we would need to set up a TLS server // This is a simplified example that just shows how the domain manager works console.log('Forwarding example initialized successfully'); } // Run the example main().catch(error => { console.error('Error running example:', error); });