Files
kandev/apps/backend/internal/gateway/websocket/setup.go
T
2026-02-19 22:18:01 +00:00

65 lines
2.1 KiB
Go

package websocket
import (
"github.com/gin-gonic/gin"
"github.com/kandev/kandev/internal/agent/lifecycle"
"github.com/kandev/kandev/internal/common/logger"
"github.com/kandev/kandev/internal/common/scripts"
"github.com/kandev/kandev/internal/lsp/installer"
ws "github.com/kandev/kandev/pkg/websocket"
)
// Gateway represents the unified WebSocket gateway
type Gateway struct {
Hub *Hub
Dispatcher *ws.Dispatcher
Handler *Handler
TerminalHandler *TerminalHandler
LSPHandler *LSPHandler
logger *logger.Logger
}
// NewGateway creates a new WebSocket gateway with all components initialized
func NewGateway(log *logger.Logger) *Gateway {
dispatcher := ws.NewDispatcher()
hub := NewHub(dispatcher, log)
handler := NewHandler(hub, log)
// Register health check handler
RegisterHealthHandler(dispatcher)
return &Gateway{
Hub: hub,
Dispatcher: dispatcher,
Handler: handler,
logger: log,
}
}
// SetLifecycleManager enables the dedicated terminal WebSocket handler for passthrough mode.
// This must be called before SetupRoutes if terminal passthrough is needed.
func (g *Gateway) SetLifecycleManager(lifecycleMgr *lifecycle.Manager, userService UserService, scriptService scripts.ScriptService) {
g.TerminalHandler = NewTerminalHandler(lifecycleMgr, userService, scriptService, g.logger)
}
// SetLSPHandler enables the LSP WebSocket handler.
func (g *Gateway) SetLSPHandler(lifecycleMgr *lifecycle.Manager, userService LSPUserService, installerRegistry *installer.Registry) {
g.LSPHandler = NewLSPHandler(lifecycleMgr, userService, installerRegistry, g.logger)
}
// SetupRoutes adds the WebSocket routes to the Gin engine
func (g *Gateway) SetupRoutes(router *gin.Engine) {
router.GET("/ws", g.Handler.HandleConnection)
// Add dedicated terminal WebSocket route if terminal handler is configured
if g.TerminalHandler != nil {
router.GET("/terminal/:sessionId", g.TerminalHandler.HandleTerminalWS)
}
// Add LSP routes if LSP handler is configured
if g.LSPHandler != nil {
router.GET("/lsp/:sessionId", g.LSPHandler.HandleLSPConnection)
}
}