feat(smart-proxy): add UDP transport support with QUIC/HTTP3 routing and datagram handler relay
This commit is contained in:
@@ -5,6 +5,7 @@ import { logger } from '../../core/utils/logger.js';
|
||||
import { RustProxyBridge } from './rust-proxy-bridge.js';
|
||||
import { RoutePreprocessor } from './route-preprocessor.js';
|
||||
import { SocketHandlerServer } from './socket-handler-server.js';
|
||||
import { DatagramHandlerServer } from './datagram-handler-server.js';
|
||||
import { RustMetricsAdapter } from './rust-metrics-adapter.js';
|
||||
|
||||
// Route management
|
||||
@@ -36,6 +37,7 @@ export class SmartProxy extends plugins.EventEmitter {
|
||||
private bridge: RustProxyBridge;
|
||||
private preprocessor: RoutePreprocessor;
|
||||
private socketHandlerServer: SocketHandlerServer | null = null;
|
||||
private datagramHandlerServer: DatagramHandlerServer | null = null;
|
||||
private metricsAdapter: RustMetricsAdapter;
|
||||
private routeUpdateLock: Mutex;
|
||||
private stopping = false;
|
||||
@@ -145,6 +147,16 @@ export class SmartProxy extends plugins.EventEmitter {
|
||||
await this.socketHandlerServer.start();
|
||||
}
|
||||
|
||||
// Check if any routes need datagram handler relay (UDP socket-handler routes)
|
||||
const hasDatagramHandlers = this.settings.routes.some(
|
||||
(r) => r.action.type === 'socket-handler' && r.action.datagramHandler
|
||||
);
|
||||
if (hasDatagramHandlers) {
|
||||
const dgPath = `/tmp/smartproxy-dgram-relay-${process.pid}.sock`;
|
||||
this.datagramHandlerServer = new DatagramHandlerServer(dgPath, this.preprocessor);
|
||||
await this.datagramHandlerServer.start();
|
||||
}
|
||||
|
||||
// Preprocess routes (strip JS functions, convert socket-handler routes)
|
||||
const rustRoutes = this.preprocessor.preprocessForRust(this.settings.routes);
|
||||
|
||||
@@ -167,6 +179,11 @@ export class SmartProxy extends plugins.EventEmitter {
|
||||
await this.bridge.setSocketHandlerRelay(this.socketHandlerServer.getSocketPath());
|
||||
}
|
||||
|
||||
// Configure datagram handler relay
|
||||
if (this.datagramHandlerServer) {
|
||||
await this.bridge.setDatagramHandlerRelay(this.datagramHandlerServer.getSocketPath());
|
||||
}
|
||||
|
||||
// Load default self-signed fallback certificate (domain: '*')
|
||||
if (!this.settings.disableDefaultCert) {
|
||||
try {
|
||||
@@ -240,6 +257,12 @@ export class SmartProxy extends plugins.EventEmitter {
|
||||
this.socketHandlerServer = null;
|
||||
}
|
||||
|
||||
// Stop datagram handler relay
|
||||
if (this.datagramHandlerServer) {
|
||||
await this.datagramHandlerServer.stop();
|
||||
this.datagramHandlerServer = null;
|
||||
}
|
||||
|
||||
logger.log('info', 'SmartProxy shutdown complete.', { component: 'smart-proxy' });
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user