@@ -16,15 +16,20 @@ where
1616
1717import Cardano.Api
1818import Cardano.Rpc.Proto.Api.Node qualified as Rpc
19+ import Cardano.Rpc.Proto.Api.UtxoRpc.Query qualified as UtxoRpc
1920import Cardano.Rpc.Server.Config
21+ import Cardano.Rpc.Server.Internal.Env
2022import Cardano.Rpc.Server.Internal.Monad
23+ import Cardano.Rpc.Server.Internal.Orphans ()
24+ import Cardano.Rpc.Server.Internal.UtxoRpc.Query
2125
2226import RIO
2327
2428import Control.Tracer
2529import Data.ProtoLens (defMessage )
2630import Data.ProtoLens.Field (field )
2731import Network.GRPC.Common
32+ import Network.GRPC.Server
2833import Network.GRPC.Server.Protobuf
2934import Network.GRPC.Server.Run
3035import Network.GRPC.Server.StreamType
@@ -47,37 +52,66 @@ methodsNodeRpc
4752 => Methods m (ProtobufMethodsOf Rpc. Node )
4853methodsNodeRpc = Method (mkNonStreaming getEraMethod) NoMoreMethods
4954
55+ methodsUtxoRpc
56+ :: MonadRpc e m
57+ => Methods m (ProtobufMethodsOf UtxoRpc. QueryService )
58+ methodsUtxoRpc = do
59+ Method (mkNonStreaming readDataMethod)
60+ . Method (mkNonStreaming readEraSummaryMethod)
61+ . Method (mkNonStreaming readGenesisMethod)
62+ . Method (mkNonStreaming readParamsMethod)
63+ . Method (mkNonStreaming readTxMethod)
64+ . Method (mkNonStreaming readUtxosMethod)
65+ . Method (mkNonStreaming searchUtxosMethod)
66+ $ NoMoreMethods
67+
5068runRpcServer
5169 :: Tracer IO String
5270 -> IO (RpcConfig , NetworkMagic )
5371 -- ^ action which reloads RPC configuration
5472 -> IO ()
55- runRpcServer tracer loadRpcConfig = handleExceptions $ do
56- ( RpcConfig
73+ runRpcServer tracer loadRpcConfig = handleFatalExceptions $ do
74+ ( rpcConfig @ RpcConfig
5775 { isEnabled = Identity isEnabled
5876 , rpcSocketPath = Identity (File rpcSocketPathFp)
77+ , nodeSocketPath = Identity nodeSocketPath
5978 }
60- , _networkMagic
79+ , networkMagic
6180 ) <-
6281 loadRpcConfig
6382 let config =
6483 ServerConfig
6584 { serverInsecure = Just $ InsecureUnix rpcSocketPathFp
6685 , serverSecure = Nothing
6786 }
87+ rpcEnv =
88+ RpcEnv
89+ { config = rpcConfig
90+ , tracer = natTracer liftIO tracer
91+ , rpcLocalNodeConnectInfo = mkLocalNodeConnectInfo nodeSocketPath networkMagic
92+ }
6893
6994 -- TODO this is logged by node configuration already, so it would make sense to log it again when
7095 -- configuration gets reloaded
71- -- putTrace $ "RPC configuration: " <> show rpcConfig
96+ -- traceWith $ "RPC configuration: " <> show rpcConfig
7297
7398 when isEnabled $
74- runServerWithHandlers def config $
75- mconcat
76- [ fromMethods methodsNodeRpc
77- ]
99+ runRIO rpcEnv $
100+ withRunInIO $ \ runInIO ->
101+ runServerWithHandlers serverParams config . fmap (hoistSomeRpcHandler runInIO) $
102+ mconcat
103+ [ fromMethods methodsNodeRpc
104+ , fromMethods methodsUtxoRpc
105+ ]
78106 where
79- handleExceptions :: (HasCallStack => IO () ) -> IO ()
80- handleExceptions = handleAny $ \ e ->
81- putTrace $ " RPC server fatal error: " <> displayException e
107+ serverParams :: ServerParams
108+ serverParams = def{serverTopLevel = topLevelHandler}
109+
110+ -- Top level hook for request handlers, handle exceptions
111+ topLevelHandler :: RequestHandler () -> RequestHandler ()
112+ topLevelHandler h unmask req resp = catchAny (h unmask req resp) $ \ e ->
113+ traceWith tracer $ " Exception when processing RPC request:\n " <> displayException e
82114
83- putTrace = traceWith tracer
115+ handleFatalExceptions :: (HasCallStack => IO () ) -> IO ()
116+ handleFatalExceptions = handleAny $ \ e ->
117+ traceWith tracer $ " RPC server fatal error: " <> displayException e
0 commit comments