()
| 907 | } |
| 908 | |
| 909 | func (n *nodeImpl) startRPC() ([]net.Listener, error) { |
| 910 | if n.config.Mode == config.ModeValidator { |
| 911 | pubKey, err := n.privValidator.GetPubKey(context.TODO()) |
| 912 | if pubKey == nil || err != nil { |
| 913 | return nil, fmt.Errorf("can't get pubkey: %w", err) |
| 914 | } |
| 915 | n.rpcEnv.PubKey = pubKey |
| 916 | } |
| 917 | if err := n.rpcEnv.InitGenesisChunks(); err != nil { |
| 918 | return nil, err |
| 919 | } |
| 920 | |
| 921 | listenAddrs := strings.SplitAndTrimEmpty(n.config.RPC.ListenAddress, ",", " ") |
| 922 | routes := n.rpcEnv.GetRoutes() |
| 923 | |
| 924 | if n.config.RPC.Unsafe { |
| 925 | n.rpcEnv.AddUnsafe(routes) |
| 926 | } |
| 927 | |
| 928 | cfg := rpcserver.DefaultConfig() |
| 929 | cfg.MaxBodyBytes = n.config.RPC.MaxBodyBytes |
| 930 | cfg.MaxHeaderBytes = n.config.RPC.MaxHeaderBytes |
| 931 | cfg.MaxOpenConnections = n.config.RPC.MaxOpenConnections |
| 932 | // If necessary adjust global WriteTimeout to ensure it's greater than |
| 933 | // TimeoutBroadcastTxCommit. |
| 934 | // See https://github.com/tendermint/tendermint/issues/3435 |
| 935 | if cfg.WriteTimeout <= n.config.RPC.TimeoutBroadcastTxCommit { |
| 936 | cfg.WriteTimeout = n.config.RPC.TimeoutBroadcastTxCommit + 1*time.Second |
| 937 | } |
| 938 | |
| 939 | // we may expose the rpc over both a unix and tcp socket |
| 940 | listeners := make([]net.Listener, len(listenAddrs)) |
| 941 | for i, listenAddr := range listenAddrs { |
| 942 | mux := http.NewServeMux() |
| 943 | rpcLogger := n.Logger.With("module", "rpc-server") |
| 944 | wmLogger := rpcLogger.With("protocol", "websocket") |
| 945 | wm := rpcserver.NewWebsocketManager(routes, |
| 946 | rpcserver.OnDisconnect(func(remoteAddr string) { |
| 947 | err := n.eventBus.UnsubscribeAll(context.Background(), remoteAddr) |
| 948 | if err != nil && err != tmpubsub.ErrSubscriptionNotFound { |
| 949 | wmLogger.Error("Failed to unsubscribe addr from events", "addr", remoteAddr, "err", err) |
| 950 | } |
| 951 | }), |
| 952 | rpcserver.ReadLimit(cfg.MaxBodyBytes), |
| 953 | rpcserver.WriteChanCapacity(n.config.RPC.WebSocketWriteBufferSize), |
| 954 | ) |
| 955 | wm.SetLogger(wmLogger) |
| 956 | mux.HandleFunc("/websocket", wm.WebsocketHandler) |
| 957 | rpcserver.RegisterRPCFuncs(mux, routes, rpcLogger) |
| 958 | listener, err := rpcserver.Listen( |
| 959 | listenAddr, |
| 960 | cfg.MaxOpenConnections, |
| 961 | ) |
| 962 | if err != nil { |
| 963 | return nil, err |
| 964 | } |
| 965 | |
| 966 | var rootHandler http.Handler = mux |
no test coverage detected