mu-grpc-server 0.2.0.0 → 0.3.0.0
raw patch · 3 files changed
+195/−146 lines, 3 filesdep +avrodep ~mu-grpc-commondep ~mu-protobufdep ~mu-rpcPVP ok
version bump matches the API change (PVP)
Dependencies added: avro
Dependency ranges changed: mu-grpc-common, mu-protobuf, mu-rpc, mu-schema, warp-grpc
API changes (from Hackage documentation)
- Mu.GRpc.Server: instance (Mu.GRpc.Server.GRpcInputWrapper p vref v, Mu.GRpc.Server.GRpcOutputWrapper p rref r) => Mu.GRpc.Server.GRpcMethodHandler p m '[ 'Mu.Rpc.ArgSingle vref] ('Mu.Rpc.RetSingle rref) (v -> m r)
- Mu.GRpc.Server: instance (Mu.GRpc.Server.GRpcInputWrapper p vref v, Mu.GRpc.Server.GRpcOutputWrapper p rref r, Control.Monad.IO.Class.MonadIO m) => Mu.GRpc.Server.GRpcMethodHandler p m '[ 'Mu.Rpc.ArgSingle vref] ('Mu.Rpc.RetStream rref) (v -> Data.Conduit.Internal.Conduit.ConduitT r Data.Void.Void m () -> m ())
- Mu.GRpc.Server: instance (Mu.GRpc.Server.GRpcInputWrapper p vref v, Mu.GRpc.Server.GRpcOutputWrapper p rref r, Control.Monad.IO.Class.MonadIO m) => Mu.GRpc.Server.GRpcMethodHandler p m '[ 'Mu.Rpc.ArgStream vref] ('Mu.Rpc.RetSingle rref) (Data.Conduit.Internal.Conduit.ConduitT () v m () -> m r)
- Mu.GRpc.Server: instance (Mu.GRpc.Server.GRpcInputWrapper p vref v, Mu.GRpc.Server.GRpcOutputWrapper p rref r, Control.Monad.IO.Class.MonadIO m) => Mu.GRpc.Server.GRpcMethodHandler p m '[ 'Mu.Rpc.ArgStream vref] ('Mu.Rpc.RetStream rref) (Data.Conduit.Internal.Conduit.ConduitT () v m () -> Data.Conduit.Internal.Conduit.ConduitT r Data.Void.Void m () -> m ())
- Mu.GRpc.Server: instance (Mu.GRpc.Server.GRpcInputWrapper p vref v, Network.GRPC.HTTP2.Encoding.GRPCOutput (Mu.GRpc.Bridge.RPCTy p) ()) => Mu.GRpc.Server.GRpcMethodHandler p m '[ 'Mu.Rpc.ArgSingle vref] 'Mu.Rpc.RetNothing (v -> m ())
- Mu.GRpc.Server: instance (Network.GRPC.HTTP2.Encoding.GRPCInput (Mu.GRpc.Bridge.RPCTy p) (), Mu.GRpc.Server.GRpcOutputWrapper p rref r) => Mu.GRpc.Server.GRpcMethodHandler p m '[] ('Mu.Rpc.RetSingle rref) (m r)
- Mu.GRpc.Server: instance (Network.GRPC.HTTP2.Encoding.GRPCInput (Mu.GRpc.Bridge.RPCTy p) (), Mu.GRpc.Server.GRpcOutputWrapper p rref r, Control.Monad.IO.Class.MonadIO m) => Mu.GRpc.Server.GRpcMethodHandler p m '[] ('Mu.Rpc.RetStream rref) (Data.Conduit.Internal.Conduit.ConduitT r Data.Void.Void m () -> m ())
- Mu.GRpc.Server: instance (Network.GRPC.HTTP2.Encoding.GRPCInput (Mu.GRpc.Bridge.RPCTy p) (), Network.GRPC.HTTP2.Encoding.GRPCOutput (Mu.GRpc.Bridge.RPCTy p) ()) => Mu.GRpc.Server.GRpcMethodHandler p m '[] 'Mu.Rpc.RetNothing (m ())
- Mu.GRpc.Server: instance Mu.Adapter.ProtoBuf.Via.FromProtoBufTypeRef ref r => Mu.GRpc.Server.GRpcInputWrapper 'Mu.GRpc.Bridge.MsgProtoBuf ref r
- Mu.GRpc.Server: instance Mu.Adapter.ProtoBuf.Via.ToProtoBufTypeRef ref r => Mu.GRpc.Server.GRpcOutputWrapper 'Mu.GRpc.Bridge.MsgProtoBuf ref r
- Mu.GRpc.Server: instance Mu.GRpc.Server.GRpcMethodHandlers p m '[] '[]
- Mu.GRpc.Server: instance forall mnm (name :: mnm) (p :: Mu.GRpc.Bridge.GRpcMessageProtocol) (m :: * -> *) (args :: [Mu.Rpc.Argument]) (r :: Mu.Rpc.Return) h (rest :: [Mu.Rpc.Method mnm]) (hs :: [*]) (anns :: [Mu.Rpc.ServiceAnnotation]). (Mu.Schema.Definition.KnownName name, Mu.GRpc.Server.GRpcMethodHandler p m args r h, Mu.GRpc.Server.GRpcMethodHandlers p m rest hs, Mu.GRpc.Bridge.MkRPC p) => Mu.GRpc.Server.GRpcMethodHandlers p m ('Mu.Rpc.Method name anns args r : rest) (h : hs)
- Mu.GRpc.Server: instance forall typeName fieldName (sch :: Mu.Schema.Definition.Schema typeName fieldName) (sty :: typeName) r. Network.GRPC.HTTP2.Encoding.GRPCInput Mu.GRpc.Avro.AvroRPC (Mu.GRpc.Avro.ViaFromAvroTypeRef ('Mu.Rpc.ViaSchema sch sty) r) => Mu.GRpc.Server.GRpcInputWrapper 'Mu.GRpc.Bridge.MsgAvro ('Mu.Rpc.ViaSchema sch sty) r
- Mu.GRpc.Server: instance forall typeName fieldName (sch :: Mu.Schema.Definition.Schema typeName fieldName) (sty :: typeName) r. Network.GRPC.HTTP2.Encoding.GRPCOutput Mu.GRpc.Avro.AvroRPC (Mu.GRpc.Avro.ViaToAvroTypeRef ('Mu.Rpc.ViaSchema sch sty) r) => Mu.GRpc.Server.GRpcOutputWrapper 'Mu.GRpc.Bridge.MsgAvro ('Mu.Rpc.ViaSchema sch sty) r
+ Mu.GRpc.Server: gRpcAppTrans :: (KnownName name, GRpcServiceHandlers protocol m chn services handlers) => Proxy protocol -> (forall a. m a -> ServerErrorIO a) -> ServerT chn ('Package ('Just name) services) m handlers -> Application
+ Mu.GRpc.Server: instance (Control.Monad.IO.Class.MonadIO m, Network.GRPC.HTTP2.Encoding.GRPCInput (Mu.GRpc.Bridge.RPCTy p) (), Network.GRPC.HTTP2.Encoding.GRPCOutput (Mu.GRpc.Bridge.RPCTy p) ()) => Mu.GRpc.Server.GRpcMethodHandler p m '[] 'Mu.Rpc.RetNothing (m ())
+ Mu.GRpc.Server: instance (Mu.Schema.Class.FromSchema sch sty r, Data.Avro.Encoding.FromAvro.FromAvro (Mu.Schema.Class.WithSchema sch sty r), Data.Avro.HasAvroSchema.HasAvroSchema (Mu.Schema.Class.WithSchema sch sty r)) => Mu.GRpc.Server.GRpcInputWrapper 'Mu.GRpc.Bridge.MsgAvro ('Mu.Rpc.SchemaRef sch sty) r
+ Mu.GRpc.Server: instance (Mu.Schema.Class.ToSchema sch sty r, Data.Avro.Encoding.ToAvro.ToAvro (Mu.Schema.Class.WithSchema sch sty r), Data.Avro.HasAvroSchema.HasAvroSchema (Mu.Schema.Class.WithSchema sch sty r)) => Mu.GRpc.Server.GRpcOutputWrapper 'Mu.GRpc.Bridge.MsgAvro ('Mu.Rpc.SchemaRef sch sty) r
+ Mu.GRpc.Server: instance forall mnm serviceName anm (name :: mnm) (p :: Mu.GRpc.Bridge.GRpcMessageProtocol) (m :: * -> *) (args :: [Mu.Rpc.Argument serviceName anm]) (r :: Mu.Rpc.Return serviceName) h (chn :: Mu.Server.ServiceChain serviceName) (rest :: [Mu.Rpc.Method serviceName mnm anm]) (hs :: [*]) (anns :: [Mu.Rpc.ServiceAnnotation]). (Mu.Schema.Definition.KnownName name, Mu.GRpc.Bridge.MkRPC p, Mu.GRpc.Server.GRpcMethodHandler p m args r h, Mu.GRpc.Server.GRpcMethodHandlers p m chn () rest hs) => Mu.GRpc.Server.GRpcMethodHandlers p m chn () ('Mu.Rpc.Method name anns args r : rest) (h : hs)
+ Mu.GRpc.Server: instance forall serviceName k (m :: * -> *) (p :: Mu.GRpc.Bridge.GRpcMessageProtocol) (rref :: Mu.Rpc.TypeRef serviceName) r. (Control.Monad.IO.Class.MonadIO m, Network.GRPC.HTTP2.Encoding.GRPCInput (Mu.GRpc.Bridge.RPCTy p) (), Mu.GRpc.Server.GRpcOutputWrapper p rref r) => Mu.GRpc.Server.GRpcMethodHandler p m '[] ('Mu.Rpc.RetSingle rref) (m r)
+ Mu.GRpc.Server: instance forall serviceName k (m :: * -> *) (p :: Mu.GRpc.Bridge.GRpcMessageProtocol) (rref :: Mu.Rpc.TypeRef serviceName) r. (Control.Monad.IO.Class.MonadIO m, Network.GRPC.HTTP2.Encoding.GRPCInput (Mu.GRpc.Bridge.RPCTy p) (), Mu.GRpc.Server.GRpcOutputWrapper p rref r, Control.Monad.IO.Class.MonadIO m) => Mu.GRpc.Server.GRpcMethodHandler p m '[] ('Mu.Rpc.RetStream rref) (Data.Conduit.Internal.Conduit.ConduitT r Data.Void.Void m () -> m ())
+ Mu.GRpc.Server: instance forall serviceName mnm anm (name :: serviceName) (p :: Mu.GRpc.Bridge.GRpcMessageProtocol) (m :: * -> *) (chn :: Mu.Server.ServiceChain serviceName) (methods :: [Mu.Rpc.Method serviceName mnm anm]) (h :: [*]) (rest :: [Mu.Rpc.Service serviceName mnm anm]) (hs :: [[*]]) (anns :: [Mu.Rpc.ServiceAnnotation]). (Mu.Schema.Definition.KnownName name, Mu.GRpc.Server.GRpcMethodHandlers p m chn (Mu.Schema.Definition.MappingRight chn name) methods h, Mu.GRpc.Server.GRpcServiceHandlers p m chn rest hs) => Mu.GRpc.Server.GRpcServiceHandlers p m chn ('Mu.Rpc.Service name anns methods : rest) (h : hs)
+ Mu.GRpc.Server: instance forall serviceName1 argName serviceName2 (m :: * -> *) (p :: Mu.GRpc.Bridge.GRpcMessageProtocol) (vref :: Mu.Rpc.TypeRef serviceName1) v (aname :: GHC.Maybe.Maybe argName) (anns :: [Mu.Rpc.ServiceAnnotation]). (Control.Monad.IO.Class.MonadIO m, Mu.GRpc.Server.GRpcInputWrapper p vref v, Network.GRPC.HTTP2.Encoding.GRPCOutput (Mu.GRpc.Bridge.RPCTy p) ()) => Mu.GRpc.Server.GRpcMethodHandler p m '[ 'Mu.Rpc.ArgSingle aname anns vref] 'Mu.Rpc.RetNothing (v -> m ())
+ Mu.GRpc.Server: instance forall serviceName1 argName serviceName2 (m :: * -> *) (p :: Mu.GRpc.Bridge.GRpcMessageProtocol) (vref :: Mu.Rpc.TypeRef serviceName1) v (aname :: GHC.Maybe.Maybe argName) (anns :: [Mu.Rpc.ServiceAnnotation]). (Control.Monad.IO.Class.MonadIO m, Mu.GRpc.Server.GRpcInputWrapper p vref v, Network.GRPC.HTTP2.Encoding.GRPCOutput (Mu.GRpc.Bridge.RPCTy p) (), Control.Monad.IO.Class.MonadIO m) => Mu.GRpc.Server.GRpcMethodHandler p m '[ 'Mu.Rpc.ArgStream aname anns vref] 'Mu.Rpc.RetNothing (Data.Conduit.Internal.Conduit.ConduitT () v m () -> m ())
+ Mu.GRpc.Server: instance forall serviceName1 serviceName2 argName (m :: * -> *) (p :: Mu.GRpc.Bridge.GRpcMessageProtocol) (vref :: Mu.Rpc.TypeRef serviceName1) v (rref :: Mu.Rpc.TypeRef serviceName2) r (aname :: GHC.Maybe.Maybe argName) (anns :: [Mu.Rpc.ServiceAnnotation]). (Control.Monad.IO.Class.MonadIO m, Mu.GRpc.Server.GRpcInputWrapper p vref v, Mu.GRpc.Server.GRpcOutputWrapper p rref r) => Mu.GRpc.Server.GRpcMethodHandler p m '[ 'Mu.Rpc.ArgSingle aname anns vref] ('Mu.Rpc.RetSingle rref) (v -> m r)
+ Mu.GRpc.Server: instance forall serviceName1 serviceName2 argName (m :: * -> *) (p :: Mu.GRpc.Bridge.GRpcMessageProtocol) (vref :: Mu.Rpc.TypeRef serviceName1) v (rref :: Mu.Rpc.TypeRef serviceName2) r (aname :: GHC.Maybe.Maybe argName) (anns :: [Mu.Rpc.ServiceAnnotation]). (Control.Monad.IO.Class.MonadIO m, Mu.GRpc.Server.GRpcInputWrapper p vref v, Mu.GRpc.Server.GRpcOutputWrapper p rref r, Control.Monad.IO.Class.MonadIO m) => Mu.GRpc.Server.GRpcMethodHandler p m '[ 'Mu.Rpc.ArgStream aname anns vref] ('Mu.Rpc.RetSingle rref) (Data.Conduit.Internal.Conduit.ConduitT () v m () -> m r)
+ Mu.GRpc.Server: instance forall serviceName1 serviceName2 argName (p :: Mu.GRpc.Bridge.GRpcMessageProtocol) (vref :: Mu.Rpc.TypeRef serviceName1) v (rref :: Mu.Rpc.TypeRef serviceName2) r (m :: * -> *) (aname :: GHC.Maybe.Maybe argName) (anns :: [Mu.Rpc.ServiceAnnotation]). (Mu.GRpc.Server.GRpcInputWrapper p vref v, Mu.GRpc.Server.GRpcOutputWrapper p rref r, Control.Monad.IO.Class.MonadIO m) => Mu.GRpc.Server.GRpcMethodHandler p m '[ 'Mu.Rpc.ArgSingle aname anns vref] ('Mu.Rpc.RetStream rref) (v -> Data.Conduit.Internal.Conduit.ConduitT r Data.Void.Void m () -> m ())
+ Mu.GRpc.Server: instance forall serviceName1 serviceName2 argName (p :: Mu.GRpc.Bridge.GRpcMessageProtocol) (vref :: Mu.Rpc.TypeRef serviceName1) v (rref :: Mu.Rpc.TypeRef serviceName2) r (m :: * -> *) (aname :: GHC.Maybe.Maybe argName) (anns :: [Mu.Rpc.ServiceAnnotation]). (Mu.GRpc.Server.GRpcInputWrapper p vref v, Mu.GRpc.Server.GRpcOutputWrapper p rref r, Control.Monad.IO.Class.MonadIO m) => Mu.GRpc.Server.GRpcMethodHandler p m '[ 'Mu.Rpc.ArgStream aname anns vref] ('Mu.Rpc.RetStream rref) (Data.Conduit.Internal.Conduit.ConduitT () v m () -> Data.Conduit.Internal.Conduit.ConduitT r Data.Void.Void m () -> m ())
+ Mu.GRpc.Server: instance forall snm (ref :: Mu.Rpc.TypeRef snm) r. Mu.Adapter.ProtoBuf.Via.FromProtoBufTypeRef ref r => Mu.GRpc.Server.GRpcInputWrapper 'Mu.GRpc.Bridge.MsgProtoBuf ref r
+ Mu.GRpc.Server: instance forall snm (ref :: Mu.Rpc.TypeRef snm) r. Mu.Adapter.ProtoBuf.Via.ToProtoBufTypeRef ref r => Mu.GRpc.Server.GRpcOutputWrapper 'Mu.GRpc.Bridge.MsgProtoBuf ref r
+ Mu.GRpc.Server: instance forall snm mnm anm (p :: Mu.GRpc.Bridge.GRpcMessageProtocol) (m :: * -> *) (chn :: Mu.Server.ServiceChain snm) inh. Mu.GRpc.Server.GRpcMethodHandlers p m chn inh '[] '[]
+ Mu.GRpc.Server: instance forall snm mnm anm (p :: Mu.GRpc.Bridge.GRpcMessageProtocol) (m :: * -> *) (chn :: Mu.Server.ServiceChain snm). Mu.GRpc.Server.GRpcServiceHandlers p m chn '[] '[]
- Mu.GRpc.Server: gRpcApp :: (KnownName name, KnownName (FindPackageName anns), GRpcMethodHandlers protocol ServerErrorIO methods handlers) => Proxy protocol -> ServerT f ('Service name anns methods) ServerErrorIO handlers -> Application
+ Mu.GRpc.Server: gRpcApp :: (KnownName name, GRpcServiceHandlers protocol ServerErrorIO chn services handlers) => Proxy protocol -> ServerT chn ('Package ('Just name) services) ServerErrorIO handlers -> Application
- Mu.GRpc.Server: runGRpcApp :: (KnownName name, KnownName (FindPackageName anns), GRpcMethodHandlers protocol ServerErrorIO methods handlers) => Proxy protocol -> Port -> ServerT f ('Service name anns methods) ServerErrorIO handlers -> IO ()
+ Mu.GRpc.Server: runGRpcApp :: (KnownName name, GRpcServiceHandlers protocol ServerErrorIO chn services handlers) => Proxy protocol -> Port -> ServerT chn ('Package ('Just name) services) ServerErrorIO handlers -> IO ()
- Mu.GRpc.Server: runGRpcAppSettings :: (KnownName name, KnownName (FindPackageName anns), GRpcMethodHandlers protocol m methods handlers) => Proxy protocol -> Settings -> (forall a. m a -> ServerErrorIO a) -> ServerT f ('Service name anns methods) m handlers -> IO ()
+ Mu.GRpc.Server: runGRpcAppSettings :: (KnownName name, GRpcServiceHandlers protocol m chn services handlers) => Proxy protocol -> Settings -> (forall a. m a -> ServerErrorIO a) -> ServerT chn ('Package ('Just name) services) m handlers -> IO ()
- Mu.GRpc.Server: runGRpcAppTLS :: (KnownName name, KnownName (FindPackageName anns), GRpcMethodHandlers protocol m methods handlers) => Proxy protocol -> TLSSettings -> Settings -> (forall a. m a -> ServerErrorIO a) -> ServerT f ('Service name anns methods) m handlers -> IO ()
+ Mu.GRpc.Server: runGRpcAppTLS :: (KnownName name, GRpcServiceHandlers protocol m chn services handlers) => Proxy protocol -> TLSSettings -> Settings -> (forall a. m a -> ServerErrorIO a) -> ServerT chn ('Package ('Just name) services) m handlers -> IO ()
- Mu.GRpc.Server: runGRpcAppTrans :: (KnownName name, KnownName (FindPackageName anns), GRpcMethodHandlers protocol m methods handlers) => Proxy protocol -> Port -> (forall a. m a -> ServerErrorIO a) -> ServerT f ('Service name anns methods) m handlers -> IO ()
+ Mu.GRpc.Server: runGRpcAppTrans :: (KnownName name, GRpcServiceHandlers protocol m chn services handlers) => Proxy protocol -> Port -> (forall a. m a -> ServerErrorIO a) -> ServerT chn ('Package ('Just name) services) m handlers -> IO ()
Files
- mu-grpc-server.cabal +15/−13
- src/ExampleServer.hs +4/−5
- src/Mu/GRpc/Server.hs +176/−128
mu-grpc-server.cabal view
@@ -1,5 +1,5 @@ name: mu-grpc-server-version: 0.2.0.0+version: 0.3.0.0 synopsis: gRPC servers for Mu definitions description: With @mu-grpc-server@ you can easily build gRPC servers for mu-haskell!@@ -24,22 +24,23 @@ exposed-modules: Mu.GRpc.Server build-depends: async- , base >=4.12 && <5+ , avro >=0.5+ , base >=4.12 && <5 , binary , bytestring , conduit , http2-grpc-types , mtl- , mu-grpc-common >=0.2.0- , mu-protobuf >=0.2.0- , mu-rpc >=0.2.0- , mu-schema >=0.2.0+ , mu-grpc-common >=0.3.0+ , mu-protobuf >=0.3.0+ , mu-rpc >=0.3.0+ , mu-schema >=0.3.0 , sop-core , stm , stm-conduit , wai , warp- , warp-grpc+ , warp-grpc >=0.4.0.1 , warp-tls hs-source-dirs: src@@ -51,22 +52,23 @@ other-modules: Mu.GRpc.Server build-depends: async- , base >=4.12 && <5+ , avro >=0.4.7+ , base >=4.12 && <5 , binary , bytestring , conduit , http2-grpc-types , mtl- , mu-grpc-common >=0.2.0- , mu-protobuf >=0.2.0- , mu-rpc >=0.2.0- , mu-schema >=0.2.0+ , mu-grpc-common >=0.3.0+ , mu-protobuf >=0.3.0+ , mu-rpc >=0.3.0+ , mu-schema >=0.3.0 , sop-core , stm , stm-conduit , wai , warp- , warp-grpc+ , warp-grpc >=0.4.0.1 , warp-tls hs-source-dirs: src
src/ExampleServer.hs view
@@ -1,6 +1,5 @@ {-# language DataKinds #-} {-# language OverloadedStrings #-}-{-# language TypeApplications #-} {-# language TypeFamilies #-} module Main where @@ -10,11 +9,11 @@ import Mu.Schema type instance AnnotatedSchema ProtoBufAnnotation QuickstartSchema- = '[ 'AnnField "HelloRequest" "name" ('ProtoBufId 1)- , 'AnnField "HelloResponse" "message" ('ProtoBufId 1)- , 'AnnField "HiRequest" "number" ('ProtoBufId 1) ]+ = '[ 'AnnField "HelloRequest" "name" ('ProtoBufId 1 'True)+ , 'AnnField "HelloResponse" "message" ('ProtoBufId 1 'True)+ , 'AnnField "HiRequest" "number" ('ProtoBufId 1 'True) ] main :: IO () main = do putStrLn "running quickstart application"- runGRpcApp msgProtoBuf 8080 (quickstartServer @_ @Maybe)+ runGRpcApp msgProtoBuf 8080 quickstartServer
src/Mu/GRpc/Server.hs view
@@ -28,7 +28,7 @@ , runGRpcAppSettings, Settings , runGRpcAppTLS, TLSSettings -- * Convert a 'Server' into a WAI application-, gRpcApp+, gRpcApp, gRpcAppTrans -- * Raise errors as exceptions in IO , raiseErrors, liftServerConduit -- * Re-export useful instances@@ -36,27 +36,28 @@ ) where import Control.Concurrent.Async-import Control.Concurrent.STM (atomically)+import Control.Concurrent.STM (atomically) import Control.Concurrent.STM.TMVar import Control.Exception import Control.Monad.Except-import Data.ByteString (ByteString)-import qualified Data.ByteString.Char8 as BS+import Data.Avro+import Data.ByteString (ByteString)+import qualified Data.ByteString.Char8 as BS import Data.Conduit import Data.Conduit.TMChan import Data.Kind import Data.Proxy-import Network.GRPC.HTTP2.Encoding (GRPCInput, GRPCOutput, gzip, uncompressed)-import Network.GRPC.HTTP2.Types (GRPCStatus (..), GRPCStatusCode (..))-import Network.GRPC.Server.Handlers-import Network.GRPC.Server.Wai as Wai-import Network.Wai (Application)-import Network.Wai.Handler.Warp (Port, Settings, run, runSettings)-import Network.Wai.Handler.WarpTLS (TLSSettings, runTLS)+import Network.GRPC.HTTP2.Encoding (GRPCInput, GRPCOutput, gzip, uncompressed)+import Network.GRPC.HTTP2.Types (GRPCStatus (..), GRPCStatusCode (..))+import Network.GRPC.Server.Handlers.Trans+import Network.GRPC.Server.Wai as Wai+import Network.Wai (Application)+import Network.Wai.Handler.Warp (Port, Settings, run, runSettings)+import Network.Wai.Handler.WarpTLS (TLSSettings, runTLS) import Mu.Adapter.ProtoBuf.Via import Mu.GRpc.Avro-import qualified Mu.GRpc.Avro as Avro+import qualified Mu.GRpc.Avro as Avro import Mu.GRpc.Bridge import Mu.Rpc import Mu.Schema@@ -64,22 +65,20 @@ -- | Run a Mu 'Server' on the given port. runGRpcApp- :: ( KnownName name, KnownName (FindPackageName anns)- , GRpcMethodHandlers protocol ServerErrorIO methods handlers )+ :: ( KnownName name, GRpcServiceHandlers protocol ServerErrorIO chn services handlers ) => Proxy protocol -> Port- -> ServerT f ('Service name anns methods) ServerErrorIO handlers+ -> ServerT chn ('Package ('Just name) services) ServerErrorIO handlers -> IO () runGRpcApp protocol port = runGRpcAppTrans protocol port id -- | Run a Mu 'Server' on the given port. runGRpcAppTrans- :: ( KnownName name, KnownName (FindPackageName anns)- , GRpcMethodHandlers protocol m methods handlers )+ :: ( KnownName name, GRpcServiceHandlers protocol m chn services handlers ) => Proxy protocol -> Port -> (forall a. m a -> ServerErrorIO a)- -> ServerT f ('Service name anns methods) m handlers+ -> ServerT chn ('Package ('Just name) services) m handlers -> IO () runGRpcAppTrans protocol port f svr = run port (gRpcAppTrans protocol f svr) @@ -87,12 +86,11 @@ -- -- Go to 'Network.Wai.Handler.Warp' to declare 'Settings'. runGRpcAppSettings- :: ( KnownName name, KnownName (FindPackageName anns)- , GRpcMethodHandlers protocol m methods handlers )+ :: ( KnownName name, GRpcServiceHandlers protocol m chn services handlers ) => Proxy protocol -> Settings -> (forall a. m a -> ServerErrorIO a)- -> ServerT f ('Service name anns methods) m handlers+ -> ServerT chn ('Package ('Just name) services) m handlers -> IO () runGRpcAppSettings protocol st f svr = runSettings st (gRpcAppTrans protocol f svr) @@ -101,12 +99,11 @@ -- Go to 'Network.Wai.Handler.WarpTLS' to declare 'TLSSettings' -- and to 'Network.Wai.Handler.Warp' to declare 'Settings'. runGRpcAppTLS- :: ( KnownName name, KnownName (FindPackageName anns)- , GRpcMethodHandlers protocol m methods handlers )+ :: ( KnownName name, GRpcServiceHandlers protocol m chn services handlers ) => Proxy protocol -> TLSSettings -> Settings -> (forall a. m a -> ServerErrorIO a)- -> ServerT f ('Service name anns methods) m handlers+ -> ServerT chn ('Package ('Just name) services) m handlers -> IO () runGRpcAppTLS protocol tls st f svr = runTLS tls st (gRpcAppTrans protocol f svr) @@ -116,10 +113,9 @@ -- for example, @wai-routes@, or you can add middleware -- from @wai-extra@, among others. gRpcApp- :: ( KnownName name, KnownName (FindPackageName anns)- , GRpcMethodHandlers protocol ServerErrorIO methods handlers )+ :: ( KnownName name, GRpcServiceHandlers protocol ServerErrorIO chn services handlers ) => Proxy protocol- -> ServerT f ('Service name anns methods) ServerErrorIO handlers+ -> ServerT chn ('Package ('Just name) services) ServerErrorIO handlers -> Application gRpcApp protocol = gRpcAppTrans protocol id @@ -129,40 +125,58 @@ -- for example, @wai-routes@, or you can add middleware -- from @wai-extra@, among others. gRpcAppTrans- :: ( KnownName name, KnownName (FindPackageName anns)- , GRpcMethodHandlers protocol m methods handlers )+ :: ( KnownName name, GRpcServiceHandlers protocol m chn services handlers ) => Proxy protocol -> (forall a. m a -> ServerErrorIO a)- -> ServerT f ('Service name anns methods) m handlers+ -> ServerT chn ('Package ('Just name) services) m handlers -> Application gRpcAppTrans protocol f svr = Wai.grpcApp [uncompressed, gzip]- (gRpcServiceHandlers protocol f svr)+ (gRpcServerHandlers protocol f svr) -gRpcServiceHandlers- :: forall name anns methods handlers m protocol w.- ( KnownName name, KnownName (FindPackageName anns)- , GRpcMethodHandlers protocol m methods handlers )+gRpcServerHandlers+ :: forall name services handlers m protocol chn.+ ( KnownName name, GRpcServiceHandlers protocol m chn services handlers ) => Proxy protocol -> (forall a. m a -> ServerErrorIO a)- -> ServerT w ('Service name anns methods) m handlers+ -> ServerT chn ('Package ('Just name) services) m handlers -> [ServiceHandler]-gRpcServiceHandlers pr f (Server svr) = gRpcMethodHandlers f pr packageName serviceName svr- where packageName = BS.pack (nameVal (Proxy @(FindPackageName anns)))- serviceName = BS.pack (nameVal (Proxy @name))+gRpcServerHandlers pr f (Services svr) = gRpcServiceHandlers f pr packageName svr+ where packageName = BS.pack (nameVal (Proxy @name)) +class GRpcServiceHandlers (p :: GRpcMessageProtocol) (m :: Type -> Type)+ (chn :: ServiceChain snm)+ (ss :: [Service snm mnm anm]) (hs :: [[Type]]) where+ gRpcServiceHandlers :: (forall a. m a -> ServerErrorIO a)+ -> Proxy p -> ByteString+ -> ServicesT chn ss m hs -> [ServiceHandler]++instance GRpcServiceHandlers p m chn '[] '[] where+ gRpcServiceHandlers _ _ _ S0 = []+instance ( KnownName name, GRpcMethodHandlers p m chn (MappingRight chn name) methods h+ , GRpcServiceHandlers p m chn rest hs )+ => GRpcServiceHandlers p m chn ('Service name anns methods ': rest) (h ': hs) where+ gRpcServiceHandlers f pr packageName (svr :<&>: rest)+ = gRpcMethodHandlers f pr packageName serviceName svr+ ++ gRpcServiceHandlers f pr packageName rest+ where serviceName = BS.pack (nameVal (Proxy @name))++ class GRpcMethodHandlers (p :: GRpcMessageProtocol) (m :: Type -> Type)- (ms :: [Method mnm]) (hs :: [Type]) where+ (chn :: ServiceChain snm) (inh :: Type)+ (ms :: [Method snm mnm anm]) (hs :: [Type]) where gRpcMethodHandlers :: (forall a. m a -> ServerErrorIO a) -> Proxy p -> ByteString -> ByteString- -> HandlersT f ms m hs -> [ServiceHandler]+ -> HandlersT chn inh ms m hs -> [ServiceHandler] -instance GRpcMethodHandlers p m '[] '[] where+instance GRpcMethodHandlers p m chn inh '[] '[] where gRpcMethodHandlers _ _ _ _ H0 = []-instance (KnownName name, GRpcMethodHandler p m args r h, GRpcMethodHandlers p m rest hs, MkRPC p)- => GRpcMethodHandlers p m ('Method name anns args r ': rest) (h ': hs) where- gRpcMethodHandlers f pr p s (h :<|>: rest)- = gRpcMethodHandler f pr (Proxy @args) (Proxy @r) (mkRPC pr p s methodName) h+instance ( KnownName name, MkRPC p+ , GRpcMethodHandler p m args r h+ , GRpcMethodHandlers p m chn () rest hs)+ => GRpcMethodHandlers p m chn () ('Method name anns args r ': rest) (h ': hs) where+ gRpcMethodHandlers f pr p s (h :<||>: rest)+ = gRpcMethodHandler f pr (Proxy @args) (Proxy @r) (mkRPC pr p s methodName) (h ()) : gRpcMethodHandlers f pr p s rest where methodName = BS.pack (nameVal (Proxy @name)) @@ -195,7 +209,7 @@ = liftIO $ do h' <- runExceptT h case h' of- Right r -> return r+ Right r -> pure r Left (ServerError code msg) -> closeEarly $ GRPCStatus (serverErrorToGRpcError code) (BS.pack msg)@@ -222,7 +236,7 @@ -- the choice of message protocol (PB or Avro) class GRPCOutput (RPCTy p) (GRpcOWTy p ref r)- => GRpcOutputWrapper (p :: GRpcMessageProtocol) (ref :: TypeRef) (r :: Type) where+ => GRpcOutputWrapper (p :: GRpcMessageProtocol) (ref :: TypeRef snm) (r :: Type) where type GRpcOWTy p ref r :: Type buildGRpcOWTy :: Proxy p -> Proxy ref -> r -> GRpcOWTy p ref r @@ -231,13 +245,16 @@ type GRpcOWTy 'MsgProtoBuf ref r = ViaToProtoBufTypeRef ref r buildGRpcOWTy _ _ = ViaToProtoBufTypeRef -instance (GRPCOutput AvroRPC (ViaToAvroTypeRef ('ViaSchema sch sty) r))- => GRpcOutputWrapper 'MsgAvro ('ViaSchema sch sty) r where- type GRpcOWTy 'MsgAvro ('ViaSchema sch sty) r = ViaToAvroTypeRef ('ViaSchema sch sty) r+instance forall (sch :: Schema') sty (r :: Type).+ ( ToSchema sch sty r+ , ToAvro (WithSchema sch sty r)+ , HasAvroSchema (WithSchema sch sty r) )+ => GRpcOutputWrapper 'MsgAvro ('SchemaRef sch sty) r where+ type GRpcOWTy 'MsgAvro ('SchemaRef sch sty) r = ViaToAvroTypeRef ('SchemaRef sch sty) r buildGRpcOWTy _ _ = ViaToAvroTypeRef class GRPCInput (RPCTy p) (GRpcIWTy p ref r)- => GRpcInputWrapper (p :: GRpcMessageProtocol) (ref :: TypeRef) (r :: Type) where+ => GRpcInputWrapper (p :: GRpcMessageProtocol) (ref :: TypeRef snm) (r :: Type) where type GRpcIWTy p ref r :: Type unGRpcIWTy :: Proxy p -> Proxy ref -> GRpcIWTy p ref r -> r @@ -246,150 +263,181 @@ type GRpcIWTy 'MsgProtoBuf ref r = ViaFromProtoBufTypeRef ref r unGRpcIWTy _ _ = unViaFromProtoBufTypeRef -instance (GRPCInput AvroRPC (ViaFromAvroTypeRef ('ViaSchema sch sty) r))- => GRpcInputWrapper 'MsgAvro ('ViaSchema sch sty) r where- type GRpcIWTy 'MsgAvro ('ViaSchema sch sty) r = ViaFromAvroTypeRef ('ViaSchema sch sty) r+instance forall (sch :: Schema') sty (r :: Type).+ ( FromSchema sch sty r+ , FromAvro (WithSchema sch sty r)+ , HasAvroSchema (WithSchema sch sty r) )+ => GRpcInputWrapper 'MsgAvro ('SchemaRef sch sty) r where+ type GRpcIWTy 'MsgAvro ('SchemaRef sch sty) r = ViaFromAvroTypeRef ('SchemaRef sch sty) r unGRpcIWTy _ _ = unViaFromAvroTypeRef --- -instance (GRPCInput (RPCTy p) (), GRPCOutput (RPCTy p) ())+instance (MonadIO m, GRPCInput (RPCTy p) (), GRPCOutput (RPCTy p) ()) => GRpcMethodHandler p m '[ ] 'RetNothing (m ()) where gRpcMethodHandler f _ _ _ rpc h- = unary @_ @() @() rpc (\_ _ -> raiseErrors (f h))+ = unary @m @_ @() @() (raiseErrors . f) rpc (\_ _ -> h) ----- -instance (GRPCInput (RPCTy p) (), GRpcOutputWrapper p rref r)+instance (MonadIO m, GRPCInput (RPCTy p) (), GRpcOutputWrapper p rref r) => GRpcMethodHandler p m '[ ] ('RetSingle rref) (m r) where gRpcMethodHandler f _ _ _ rpc h- = unary @_ @() @(GRpcOWTy p rref r)- rpc (\_ _ -> buildGRpcOWTy (Proxy @p) (Proxy @rref) <$> raiseErrors (f h))+ = unary @m @_ @() @(GRpcOWTy p rref r)+ (raiseErrors . f) rpc (\_ _ -> buildGRpcOWTy (Proxy @p) (Proxy @rref) <$> h) ----- -instance (GRPCInput (RPCTy p) (), GRpcOutputWrapper p rref r, MonadIO m)+instance (MonadIO m, GRPCInput (RPCTy p) (), GRpcOutputWrapper p rref r, MonadIO m) => GRpcMethodHandler p m '[ ] ('RetStream rref) (ConduitT r Void m () -> m ()) where gRpcMethodHandler f _ _ _ rpc h- = serverStream @_ @() @(GRpcOWTy p rref r) rpc sstream+ = serverStream @m @_ @() @(GRpcOWTy p rref r) (raiseErrors . f) rpc sstream where sstream :: req -> ()- -> IO ((), ServerStream (GRpcOWTy p rref r) ())+ -> m ((), ServerStream m (GRpcOWTy p rref r) ()) sstream _ _ = do -- Variable to connect input and output- var <- newEmptyTMVarIO :: IO (TMVar (Maybe r))+ var <- liftIO newEmptyTMVarIO :: m (TMVar (Maybe r)) -- Start executing the handler- promise <- async (raiseErrors $ f (h (toTMVarConduit var)))- -- Return the information+ promise <- liftIO $ async (raiseErrors $ f (h (toTMVarConduit var)))+ -- Return the information let readNext _- = do nextOutput <- atomically $ takeTMVar var+ = do nextOutput <- liftIO $ atomically $ takeTMVar var case nextOutput of- Just o -> return $ Just ((), buildGRpcOWTy (Proxy @p) (Proxy @rref) o)- Nothing -> do cancel promise- return Nothing- return ((), ServerStream readNext)+ Just o -> pure $ Just ((), buildGRpcOWTy (Proxy @p) (Proxy @rref) o)+ Nothing -> do liftIO $ cancel promise+ pure Nothing+ pure ((), ServerStream readNext) ----- -instance (GRpcInputWrapper p vref v, GRPCOutput (RPCTy p) ())- => GRpcMethodHandler p m '[ 'ArgSingle vref ] 'RetNothing (v -> m ()) where+instance (MonadIO m, GRpcInputWrapper p vref v, GRPCOutput (RPCTy p) ())+ => GRpcMethodHandler p m '[ 'ArgSingle aname anns vref ] 'RetNothing (v -> m ()) where gRpcMethodHandler f _ _ _ rpc h- = unary @_ @(GRpcIWTy p vref v) @()- rpc (\_ -> raiseErrors . f . h . unGRpcIWTy (Proxy @p) (Proxy @vref))+ = unary @m @_ @(GRpcIWTy p vref v) @()+ (raiseErrors . f) rpc (\_ -> h . unGRpcIWTy (Proxy @p) (Proxy @vref)) ----- -instance (GRpcInputWrapper p vref v, GRpcOutputWrapper p rref r)- => GRpcMethodHandler p m '[ 'ArgSingle vref ] ('RetSingle rref) (v -> m r) where+instance (MonadIO m, GRpcInputWrapper p vref v, GRpcOutputWrapper p rref r)+ => GRpcMethodHandler p m '[ 'ArgSingle aname anns vref ] ('RetSingle rref) (v -> m r) where gRpcMethodHandler f _ _ _ rpc h- = unary @_ @(GRpcIWTy p vref v) @(GRpcOWTy p rref r)- rpc (\_ -> (buildGRpcOWTy (Proxy @p) (Proxy @rref) <$>)- . raiseErrors . f . h- . unGRpcIWTy (Proxy @p) (Proxy @vref))+ = unary @m @_ @(GRpcIWTy p vref v) @(GRpcOWTy p rref r)+ (raiseErrors . f) rpc+ (\_ -> (buildGRpcOWTy (Proxy @p) (Proxy @rref) <$>)+ . h+ . unGRpcIWTy (Proxy @p) (Proxy @vref)) ----- instance (GRpcInputWrapper p vref v, GRpcOutputWrapper p rref r, MonadIO m)- => GRpcMethodHandler p m '[ 'ArgStream vref ] ('RetSingle rref)- (ConduitT () v m () -> m r) where+ => GRpcMethodHandler p m '[ 'ArgSingle aname anns vref ] ('RetStream rref)+ (v -> ConduitT r Void m () -> m ()) where gRpcMethodHandler f _ _ _ rpc h- = clientStream @_ @(GRpcIWTy p vref v) @(GRpcOWTy p rref r)- rpc cstream+ = serverStream @m @_ @(GRpcIWTy p vref v) @(GRpcOWTy p rref r)+ (raiseErrors . f) rpc sstream+ where sstream :: req -> GRpcIWTy p vref v+ -> m ((), ServerStream m (GRpcOWTy p rref r) ())+ sstream _ v = do+ -- Variable to connect input and output+ var <- liftIO newEmptyTMVarIO :: m (TMVar (Maybe r))+ -- Start executing the handler+ let v' = unGRpcIWTy (Proxy @p) (Proxy @vref) v+ promise <- liftIO $ async (raiseErrors $ f (h v' (toTMVarConduit var)))+ -- Return the information+ let readNext _+ = do nextOutput <- liftIO $ atomically $ takeTMVar var+ case nextOutput of+ Just o -> pure $ Just ((), buildGRpcOWTy (Proxy @p) (Proxy @rref) o)+ Nothing -> do liftIO $ cancel promise+ pure Nothing+ pure ((), ServerStream readNext)++-----++instance (MonadIO m, GRpcInputWrapper p vref v, GRPCOutput (RPCTy p) (), MonadIO m)+ => GRpcMethodHandler p m '[ 'ArgStream aname anns vref ] 'RetNothing+ (ConduitT () v m () -> m ()) where+ gRpcMethodHandler f _ _ _ rpc h+ = clientStream @m @_ @(GRpcIWTy p vref v) @()+ (raiseErrors . f) rpc cstream where cstream :: req- -> IO ((), ClientStream (GRpcIWTy p vref v)- (GRpcOWTy p rref r) ())+ -> m ((), ClientStream m (GRpcIWTy p vref v) () ()) cstream _ = do -- Create a new TMChan- chan <- newTMChanIO :: IO (TMChan v)+ chan <- liftIO newTMChanIO :: m (TMChan v) let producer = sourceTMChan @m chan -- Start executing the handler in another thread- promise <- async (raiseErrors $ buildGRpcOWTy (Proxy @p) (Proxy @rref) <$> f (h producer))+ promise <- liftIO $ async (raiseErrors $ f (h producer)) -- Build the actual handler let cstreamHandler _ newInput- = atomically (writeTMChan chan (unGRpcIWTy (Proxy @p) (Proxy @vref) newInput))+ = liftIO $ atomically $+ writeTMChan chan (unGRpcIWTy (Proxy @p) (Proxy @vref) newInput) cstreamFinalizer _- = atomically (closeTMChan chan) >> wait promise+ = liftIO $ atomically (closeTMChan chan) >> wait promise -- Return the information- return ((), ClientStream cstreamHandler cstreamFinalizer)+ pure ((), ClientStream cstreamHandler cstreamFinalizer) ----- -instance (GRpcInputWrapper p vref v, GRpcOutputWrapper p rref r, MonadIO m)- => GRpcMethodHandler p m '[ 'ArgSingle vref ] ('RetStream rref)- (v -> ConduitT r Void m () -> m ()) where+instance (MonadIO m, GRpcInputWrapper p vref v, GRpcOutputWrapper p rref r, MonadIO m)+ => GRpcMethodHandler p m '[ 'ArgStream aname anns vref ] ('RetSingle rref)+ (ConduitT () v m () -> m r) where gRpcMethodHandler f _ _ _ rpc h- = serverStream @_ @(GRpcIWTy p vref v) @(GRpcOWTy p rref r)- rpc sstream- where sstream :: req -> GRpcIWTy p vref v- -> IO ((), ServerStream (GRpcOWTy p rref r) ())- sstream _ v = do- -- Variable to connect input and output- var <- newEmptyTMVarIO :: IO (TMVar (Maybe r))- -- Start executing the handler- let v' = unGRpcIWTy (Proxy @p) (Proxy @vref) v- promise <- async (raiseErrors $ f (h v' (toTMVarConduit var)))- -- Return the information- let readNext _- = do nextOutput <- atomically $ takeTMVar var- case nextOutput of- Just o -> return $ Just ((), buildGRpcOWTy (Proxy @p) (Proxy @rref) o)- Nothing -> do cancel promise- return Nothing- return ((), ServerStream readNext)+ = clientStream @m @_ @(GRpcIWTy p vref v) @(GRpcOWTy p rref r)+ (raiseErrors . f) rpc cstream+ where cstream :: req+ -> m ((), ClientStream m (GRpcIWTy p vref v)+ (GRpcOWTy p rref r) ())+ cstream _ = do+ -- Create a new TMChan+ chan <- liftIO newTMChanIO :: m (TMChan v)+ let producer = sourceTMChan @m chan+ -- Start executing the handler in another thread+ promise <- liftIO $ async (raiseErrors $ buildGRpcOWTy (Proxy @p) (Proxy @rref) <$> f (h producer))+ -- Build the actual handler+ let cstreamHandler _ newInput+ = liftIO $ atomically $+ writeTMChan chan (unGRpcIWTy (Proxy @p) (Proxy @vref) newInput)+ cstreamFinalizer _+ = liftIO $ atomically (closeTMChan chan) >> wait promise+ -- Return the information+ pure ((), ClientStream cstreamHandler cstreamFinalizer) ----- instance (GRpcInputWrapper p vref v, GRpcOutputWrapper p rref r, MonadIO m)- => GRpcMethodHandler p m '[ 'ArgStream vref ] ('RetStream rref)+ => GRpcMethodHandler p m '[ 'ArgStream aname anns vref ] ('RetStream rref) (ConduitT () v m () -> ConduitT r Void m () -> m ()) where gRpcMethodHandler f _ _ _ rpc h- = generalStream @_ @(GRpcIWTy p vref v) @(GRpcOWTy p rref r)- rpc bdstream- where bdstream :: req -> IO ( (), IncomingStream (GRpcIWTy p vref v) ()- , (), OutgoingStream (GRpcOWTy p rref r) () )+ = generalStream @m @_ @(GRpcIWTy p vref v) @(GRpcOWTy p rref r)+ (raiseErrors . f) rpc bdstream+ where bdstream :: req -> m ( (), IncomingStream m (GRpcIWTy p vref v) ()+ , (), OutgoingStream m (GRpcOWTy p rref r) () ) bdstream _ = do -- Create a new TMChan and a new variable- chan <- newTMChanIO :: IO (TMChan v)+ chan <- liftIO newTMChanIO :: m (TMChan v) let producer = sourceTMChan @m chan- var <- newEmptyTMVarIO :: IO (TMVar (Maybe r))+ var <- liftIO newEmptyTMVarIO :: m (TMVar (Maybe r)) -- Start executing the handler- promise <- async (raiseErrors $ f $ h producer (toTMVarConduit var))+ promise <- liftIO $ async (raiseErrors $ f $ h producer (toTMVarConduit var)) -- Build the actual handler let cstreamHandler _ newInput- = atomically (writeTMChan chan (unGRpcIWTy (Proxy @p) (Proxy @vref) newInput))+ = liftIO $ atomically $+ writeTMChan chan (unGRpcIWTy (Proxy @p) (Proxy @vref) newInput) cstreamFinalizer _- = atomically (closeTMChan chan) >> wait promise+ = liftIO $ atomically (closeTMChan chan) >> wait promise readNext _- = do nextOutput <- atomically $ tryTakeTMVar var+ = do nextOutput <- liftIO $ atomically $ tryTakeTMVar var case nextOutput of Just (Just o) ->- return $ Just ((), buildGRpcOWTy (Proxy @p) (Proxy @rref) o)+ pure $ Just ((), buildGRpcOWTy (Proxy @p) (Proxy @rref) o) Just Nothing -> do- cancel promise- return Nothing+ liftIO $ cancel promise+ pure Nothing Nothing -> -- no new elements to output readNext ()- return ((), IncomingStream cstreamHandler cstreamFinalizer, (), OutgoingStream readNext)+ pure ((), IncomingStream cstreamHandler cstreamFinalizer, (), OutgoingStream readNext) -----