From 313a2acbf66125feb4b145a5636351ed03e666da Mon Sep 17 00:00:00 2001 From: lolka1333 Date: Sat, 3 Jan 2026 05:26:00 +0100 Subject: feat: Add WebSocket support for real-time updates and enhance VLESS settings (#3605) * feat: add support for trusted X-Forwarded-For and testseed parameters in VLESS settings * chore: update Xray Core version to 25.12.8 in release workflow * chore: update Xray Core version to 25.12.8 in Docker initialization script * chore: bump version to 2.8.6 and add watcher for security changes in inbound modal * refactor: remove default and random seed buttons from outbound form * refactor: update VLESS form to rename 'Test Seed' to 'Vision Seed' and change button functionality for seed generation * refactor: enhance TLS settings form layout with improved button styling and spacing * feat: integrate WebSocket support for real-time updates on inbounds and Xray service status * chore: downgrade version to 2.8.5 * refactor: translate comments to English * fix: ensure testseed is initialized correctly for VLESS protocol and improve client handling in inbound modal * refactor: simplify VLESS divider condition by removing unnecessary flow checks * fix: add fallback date formatting for cases when IntlUtil is not available * refactor: simplify WebSocket message handling by removing batching and ensuring individual message delivery * refactor: disable WebSocket notifications in inbound and index HTML files * refactor: enhance VLESS testseed initialization and button functionality in inbound modal * fix: * refactor: ensure proper WebSocket URL construction by normalizing basePath * fix: * fix: * fix: * refactor: update testseed methods for improved reactivity and binding in VLESS form * logger info to debug --------- Co-authored-by: lolka1333 --- web/web.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'web/web.go') diff --git a/web/web.go b/web/web.go index c7a2ce1f..7dae08e3 100644 --- a/web/web.go +++ b/web/web.go @@ -25,6 +25,7 @@ import ( "github.com/mhsanaei/3x-ui/v2/web/middleware" "github.com/mhsanaei/3x-ui/v2/web/network" "github.com/mhsanaei/3x-ui/v2/web/service" + "github.com/mhsanaei/3x-ui/v2/web/websocket" "github.com/gin-contrib/gzip" "github.com/gin-contrib/sessions" @@ -98,11 +99,14 @@ type Server struct { index *controller.IndexController panel *controller.XUIController api *controller.APIController + ws *controller.WebSocketController xrayService service.XrayService settingService service.SettingService tgbotService service.Tgbot + wsHub *websocket.Hub + cron *cron.Cron ctx context.Context @@ -266,6 +270,15 @@ func (s *Server) initRouter() (*gin.Engine, error) { s.panel = controller.NewXUIController(g) s.api = controller.NewAPIController(g) + // Initialize WebSocket hub + s.wsHub = websocket.NewHub() + go s.wsHub.Run() + + // Initialize WebSocket controller + s.ws = controller.NewWebSocketController(s.wsHub) + // Register WebSocket route with basePath (g already has basePath prefix) + g.GET("/ws", s.ws.HandleWebSocket) + // Chrome DevTools endpoint for debugging web apps engine.GET("/.well-known/appspecific/com.chrome.devtools.json", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{}) @@ -448,6 +461,10 @@ func (s *Server) Stop() error { if s.tgbotService.IsRunning() { s.tgbotService.Stop() } + // Gracefully stop WebSocket hub + if s.wsHub != nil { + s.wsHub.Stop() + } var err1 error var err2 error if s.httpServer != nil { @@ -468,3 +485,8 @@ func (s *Server) GetCtx() context.Context { func (s *Server) GetCron() *cron.Cron { return s.cron } + +// GetWSHub returns the WebSocket hub instance. +func (s *Server) GetWSHub() interface{} { + return s.wsHub +} -- cgit v1.2.3