-- | 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