diff --git a/cmd/rpcdaemon/cli/config.go b/cmd/rpcdaemon/cli/config.go index f32ac5cadd1..2d8b381a254 100644 --- a/cmd/rpcdaemon/cli/config.go +++ b/cmd/rpcdaemon/cli/config.go @@ -630,6 +630,27 @@ func startRegularRpcServer(ctx context.Context, cfg *httpcfg.HttpCfg, rpcAPI []r return err } + // Separate Websocket handler if websocket port flag specified + if cfg.WebsocketEnabled && cfg.WebsocketPort != cfg.HttpPort { + wsEndpoint := fmt.Sprintf("tcp://%s:%d", cfg.HttpListenAddress, cfg.WebsocketPort) + wsApiHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if isWebsocket(r) { + wsHandler.ServeHTTP(w, r) + } + }) + wsListener, wsAddr, err := node.StartHTTPEndpoint(wsEndpoint, &node.HttpEndpointConfig{Timeouts: cfg.HTTPTimeouts}, wsApiHandler) + if err != nil { + return fmt.Errorf("could not start separate Websocket RPC api at port %d: %w", cfg.WebsocketPort, err) + } + info = append(info, "websocket.url", wsAddr) + defer func() { + shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + _ = wsListener.Shutdown(shutdownCtx) + logger.Info("HTTP endpoint closed", "url", wsAddr) + }() + } + if cfg.HttpServerEnabled { httpEndpoint := fmt.Sprintf("tcp://%s:%d", cfg.HttpListenAddress, cfg.HttpPort) if cfg.HttpURL != "" { diff --git a/cmd/rpcdaemon/cli/httpcfg/http_cfg.go b/cmd/rpcdaemon/cli/httpcfg/http_cfg.go index 96aa1d72d60..7a0930750f2 100644 --- a/cmd/rpcdaemon/cli/httpcfg/http_cfg.go +++ b/cmd/rpcdaemon/cli/httpcfg/http_cfg.go @@ -43,6 +43,7 @@ type HttpCfg struct { API []string Gascap uint64 MaxTraces uint64 + WebsocketPort int WebsocketEnabled bool WebsocketCompression bool RpcAllowListFilePath string diff --git a/turbo/cli/default_flags.go b/turbo/cli/default_flags.go index db14ae1011c..c5a722d9868 100644 --- a/turbo/cli/default_flags.go +++ b/turbo/cli/default_flags.go @@ -63,6 +63,7 @@ var DefaultFlags = []cli.Flag{ &utils.HTTPVirtualHostsFlag, &utils.AuthRpcVirtualHostsFlag, &utils.HTTPApiFlag, + &utils.WSPortFlag, &utils.WSEnabledFlag, &utils.WsCompressionFlag, &utils.HTTPTraceFlag, diff --git a/turbo/cli/flags.go b/turbo/cli/flags.go index 958503c6628..29d7b023056 100644 --- a/turbo/cli/flags.go +++ b/turbo/cli/flags.go @@ -386,8 +386,8 @@ func setEmbeddedRpcDaemon(ctx *cli.Context, cfg *nodecfg.Config, logger log.Logg WriteTimeout: ctx.Duration(AuthRpcWriteTimeoutFlag.Name), IdleTimeout: ctx.Duration(HTTPIdleTimeoutFlag.Name), }, - EvmCallTimeout: ctx.Duration(EvmCallTimeoutFlag.Name), - + EvmCallTimeout: ctx.Duration(EvmCallTimeoutFlag.Name), + WebsocketPort: ctx.Int(utils.WSPortFlag.Name), WebsocketEnabled: ctx.IsSet(utils.WSEnabledFlag.Name), RpcBatchConcurrency: ctx.Uint(utils.RpcBatchConcurrencyFlag.Name), RpcStreamingDisable: ctx.Bool(utils.RpcStreamingDisableFlag.Name),