package socket import ( protoSocket "git.toki-labs.com/toki/proto-socket/go" "nhooyr.io/websocket" altv1 "git.toki-labs.com/toki/alt/packages/contracts/gen/go/alt/v1" "git.toki-labs.com/toki/alt/services/api/internal/config" apiContracts "git.toki-labs.com/toki/alt/services/api/internal/contracts" ) const ( serverName = "alt-api" serverVersion = "dev" defaultAltProtocolVersion = "alt.v1" ) func NewServer(cfg config.Config) *protoSocket.WsServer { options := protoSocket.WsServerOptions{} if len(cfg.WSOriginPatterns) > 0 { options.AcceptOptions = &websocket.AcceptOptions{ OriginPatterns: cfg.WSOriginPatterns, } } server := protoSocket.NewWsServerWithOptions(cfg.Host, cfg.Port, cfg.SocketPath, options, func(conn *websocket.Conn) *protoSocket.WsClient { return protoSocket.NewWsClient(conn, cfg.HeartbeatIntervalSec, cfg.HeartbeatWaitSec, apiContracts.ParserMap()) }) server.OnClientConnected = registerSessionHandlers return server } func registerSessionHandlers(client *protoSocket.WsClient) { protoSocket.AddRequestListenerTyped[*altv1.HelloRequest, *altv1.HelloResponse](&client.Communicator, func(req *altv1.HelloRequest) (*altv1.HelloResponse, error) { protocolVersion := req.GetAltProtocolVersion() if protocolVersion == "" { protocolVersion = defaultAltProtocolVersion } return &altv1.HelloResponse{ ServerName: serverName, ServerVersion: serverVersion, AltProtocolVersion: protocolVersion, Capabilities: []string{ "hello", "request-response", }, }, nil }) }