@@ -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,59 @@ 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 =
59+ Method (mkNonStreaming readParamsMethod) NoMoreMethods
60+
5061runRpcServer
5162 :: Tracer IO String
5263 -> IO (RpcConfig , NetworkMagic )
5364 -- ^ action which reloads RPC configuration
5465 -> IO ()
55- runRpcServer tracer loadRpcConfig = handleExceptions $ do
56- ( RpcConfig
66+ runRpcServer tracer loadRpcConfig = handleFatalExceptions $ do
67+ ( rpcConfig @ RpcConfig
5768 { isEnabled = Identity isEnabled
5869 , rpcSocketPath = Identity (File rpcSocketPathFp)
70+ , nodeSocketPath = Identity nodeSocketPath
5971 }
60- , _networkMagic
72+ , networkMagic
6173 ) <-
6274 loadRpcConfig
6375 let config =
6476 ServerConfig
6577 { serverInsecure = Just $ InsecureUnix rpcSocketPathFp
6678 , serverSecure = Nothing
6779 }
80+ rpcEnv =
81+ RpcEnv
82+ { config = rpcConfig
83+ , tracer = natTracer liftIO tracer
84+ , rpcLocalNodeConnectInfo = mkLocalNodeConnectInfo nodeSocketPath networkMagic
85+ }
6886
6987 -- TODO this is logged by node configuration already, so it would make sense to log it again when
7088 -- configuration gets reloaded
71- -- putTrace $ "RPC configuration: " <> show rpcConfig
89+ -- traceWith $ "RPC configuration: " <> show rpcConfig
7290
7391 when isEnabled $
74- runServerWithHandlers def config $
75- mconcat
76- [ fromMethods methodsNodeRpc
77- ]
92+ runRIO rpcEnv $
93+ withRunInIO $ \ runInIO ->
94+ runServerWithHandlers serverParams config . fmap (hoistSomeRpcHandler runInIO) $
95+ mconcat
96+ [ fromMethods methodsNodeRpc
97+ , fromMethods methodsUtxoRpc
98+ ]
7899 where
79- handleExceptions :: (HasCallStack => IO () ) -> IO ()
80- handleExceptions = handleAny $ \ e ->
81- putTrace $ " RPC server fatal error: " <> displayException e
100+ serverParams :: ServerParams
101+ serverParams = def{serverTopLevel = topLevelHandler}
102+
103+ -- Top level hook for request handlers, handle exceptions
104+ topLevelHandler :: RequestHandler () -> RequestHandler ()
105+ topLevelHandler h unmask req resp = catchAny (h unmask req resp) $ \ e ->
106+ traceWith tracer $ " Exception when processing RPC request:\n " <> displayException e
82107
83- putTrace = traceWith tracer
108+ handleFatalExceptions :: (HasCallStack => IO () ) -> IO ()
109+ handleFatalExceptions = handleAny $ \ e ->
110+ traceWith tracer $ " RPC server fatal error: " <> displayException e
0 commit comments