content: -- | Session interface
  --
  -- A \"session\" is a series of messages exchanged by two nodes in a network;
  -- we might be a client and our peer might be a server, or we might be a
  -- server and our peer might be a client. Here we provide a abstraction which
  --
  -- * takes care of concurrency issues
  -- * is typed, with different types for inbound and outbound headers, messages
  --   and trailers
  -- * works the same way whether we are a client or a server.
  --
  -- Intended for qualified import.
  --
  -- > import Network.GRPC.Util.Session qualified as Session
  module Network.GRPC.Util.Session (
      -- * Session API
      DataFlow(..)
    , FlowStart(..)
    , IsSession(..)
    , InitiateSession(..)
    , NoTrailers(..)
      -- ** Raw request/response info
    , RequestInfo(..)
    , ResponseInfo(..)
      -- ** Exceptions
    , PeerException(..)
      -- * Channel
    , Channel(..)
      -- ** Working with an open channel
    , getInboundHeaders
    , send
    , recvBoth
    , recvEither
    , RecvFinal(..)
    , RecvAfterFinal(..)
    , SendAfterFinal(..)
      -- ** Closing
    , waitForOutbound
    , close
    , ChannelDiscarded(..)
    , ChannelAborted(..)
      -- ** Half-closing
    , AllowHalfClosed(..)
      -- ** Construction
      -- *** Client
    , ConnectionToServer(..)
    , CancelRequest
    , setupRequestChannel
      -- *** Server
    , ConnectionToClient(..)
    , setupResponseChannel
    ) where
  
  import Network.GRPC.Util.Session.API
  import Network.GRPC.Util.Session.Channel
  import Network.GRPC.Util.Session.Client
  import Network.GRPC.Util.Session.Server
  