120 lines
3.5 KiB
TypeScript
120 lines
3.5 KiB
TypeScript
|
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('localhost', 3000))
|
||
|
);
|
||
|
|
||
|
// Example 2: HTTPS termination with HTTP backend
|
||
|
await domainManager.addDomainConfig(
|
||
|
createDomainConfig('secure.example.com', helpers.tlsTerminateToHttp('localhost', 3000))
|
||
|
);
|
||
|
|
||
|
// Example 3: HTTPS termination with HTTPS backend
|
||
|
await domainManager.addDomainConfig(
|
||
|
createDomainConfig('api.example.com', helpers.tlsTerminateToHttps('localhost', 8443))
|
||
|
);
|
||
|
|
||
|
// Example 4: SNI passthrough
|
||
|
await domainManager.addDomainConfig(
|
||
|
createDomainConfig('passthrough.example.com', helpers.sniPassthrough('10.0.0.5', 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);
|
||
|
});
|