mirror of
https://github.com/unclechu/gRPC-haskell.git
synced 2024-09-30 10:17:24 +02:00
6382857e2c
* .gitignore * release.nix: Minor cleanup * Fix warning * Expose max receive message length channel arg in `ServiceOptions` * Fix warning * Bump upstream dependencies and patch parameterized-0.5.0.0 * grpc-haskell 0.0.1.0 -> 0.0.2.0
101 lines
3.7 KiB
Haskell
101 lines
3.7 KiB
Haskell
|
|
{-# LANGUAGE TypeFamilies #-}
|
|
{-# LANGUAGE DataKinds #-}
|
|
{-# LANGUAGE RankNTypes #-}
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
module Network.GRPC.HighLevel.Generated (
|
|
-- * Types
|
|
MetadataMap(..)
|
|
, MethodName(..)
|
|
, GRPCMethodType(..)
|
|
, GRPCImpl(..)
|
|
, MkHandler
|
|
, Host(..)
|
|
, Port(..)
|
|
, StatusDetails(..)
|
|
, StatusCode(..)
|
|
, GRPCIOError(..)
|
|
|
|
-- * Server
|
|
, ServiceOptions(..)
|
|
, defaultServiceOptions
|
|
, ServerCall(..)
|
|
, serverCallCancel
|
|
, serverCallIsExpired
|
|
, ServerRequest(..)
|
|
, ServerResponse(..)
|
|
|
|
-- * Server Auth
|
|
, ServerSSLConfig(..)
|
|
|
|
-- * Client
|
|
, withGRPCClient
|
|
, ClientConfig(..)
|
|
, ClientError(..)
|
|
, ClientRequest(..)
|
|
, ClientResult(..)
|
|
)
|
|
where
|
|
|
|
import Network.GRPC.HighLevel.Server
|
|
import Network.GRPC.HighLevel.Client
|
|
import Network.GRPC.LowLevel
|
|
import Network.GRPC.LowLevel.Call
|
|
import Numeric.Natural
|
|
import System.IO (hPutStrLn, stderr)
|
|
|
|
-- | Used at the kind level as a parameter to service definitions
|
|
-- generated by the grpc compiler, with the effect of having the
|
|
-- field types reduce to the appropriate types for the method types.
|
|
data GRPCImpl = ServerImpl | ClientImpl
|
|
|
|
-- | GHC does not let us partially apply a type family. However, we
|
|
-- can define a type to use as an 'interpreter', and then use this
|
|
-- 'interpreter' type fully applied to get the same effect.
|
|
type family MkHandler (impl :: GRPCImpl) (methodType :: GRPCMethodType) i o
|
|
|
|
type instance MkHandler 'ServerImpl 'Normal i o = ServerHandler i o
|
|
type instance MkHandler 'ServerImpl 'ClientStreaming i o = ServerReaderHandler i o
|
|
type instance MkHandler 'ServerImpl 'ServerStreaming i o = ServerWriterHandler i o
|
|
type instance MkHandler 'ServerImpl 'BiDiStreaming i o = ServerRWHandler i o
|
|
|
|
-- | Options for a service that was generated from a .proto file. This is
|
|
-- essentially 'ServerOptions' with the handler fields removed.
|
|
data ServiceOptions = ServiceOptions
|
|
{ serverHost :: Host
|
|
-- ^ Name of the host the server is running on.
|
|
, serverPort :: Port
|
|
-- ^ Port on which to listen for requests.
|
|
, useCompression :: Bool
|
|
-- ^ Whether to use compression when communicating with the client.
|
|
, userAgentPrefix :: String
|
|
-- ^ Optional custom prefix to add to the user agent string.
|
|
, userAgentSuffix :: String
|
|
-- ^ Optional custom suffix to add to the user agent string.
|
|
, initialMetadata :: MetadataMap
|
|
-- ^ Metadata to send at the beginning of each call.
|
|
, sslConfig :: Maybe ServerSSLConfig
|
|
-- ^ Security configuration.
|
|
, logger :: String -> IO ()
|
|
-- ^ Logging function to use to log errors in handling calls.
|
|
, serverMaxReceiveMessageLength :: Maybe Natural
|
|
-- ^ Maximum length (in bytes) that the service may receive in a single message
|
|
}
|
|
|
|
defaultServiceOptions :: ServiceOptions
|
|
defaultServiceOptions = ServiceOptions
|
|
-- names are fully qualified because we use the same fields in LowLevel.
|
|
{ Network.GRPC.HighLevel.Generated.serverHost = "localhost"
|
|
, Network.GRPC.HighLevel.Generated.serverPort = 50051
|
|
, Network.GRPC.HighLevel.Generated.useCompression = False
|
|
, Network.GRPC.HighLevel.Generated.userAgentPrefix = "grpc-haskell/0.0.0"
|
|
, Network.GRPC.HighLevel.Generated.userAgentSuffix = ""
|
|
, Network.GRPC.HighLevel.Generated.initialMetadata = mempty
|
|
, Network.GRPC.HighLevel.Generated.sslConfig = Nothing
|
|
, Network.GRPC.HighLevel.Generated.logger = hPutStrLn stderr
|
|
, Network.GRPC.HighLevel.Generated.serverMaxReceiveMessageLength = Nothing
|
|
}
|
|
|
|
withGRPCClient :: ClientConfig -> (Client -> IO a) -> IO a
|
|
withGRPCClient c f = withGRPC $ \grpc -> withClient grpc c $ \client -> f client
|