-- |
-- Module      : Network.TLS.Session
-- License     : BSD-style
-- Maintainer  : Vincent Hanquez <vincent@snarc.org>
-- Stability   : experimental
-- Portability : unknown
--
module Network.TLS.Session
    ( SessionManager(..)
    , noSessionManager
    ) where

import Network.TLS.Types

-- | A session manager
data SessionManager = SessionManager
    { -- | used on server side to decide whether to resume a client session.
      sessionResume         :: SessionID -> IO (Maybe SessionData)
      -- | used on server side to decide whether to resume a client session for TLS 1.3 0RTT. For a given 'SessionID', the implementation must return its 'SessionData' only once and must not return the same 'SessionData' after the call.
    , sessionResumeOnlyOnce :: SessionID -> IO (Maybe SessionData)
      -- | used when a session is established.
    , sessionEstablish      :: SessionID -> SessionData -> IO ()
      -- | used when a session is invalidated.
    , sessionInvalidate     :: SessionID -> IO ()
    }

-- | The session manager to do nothing.
noSessionManager :: SessionManager
noSessionManager = SessionManager
    { sessionResume         = \_   -> return Nothing
    , sessionResumeOnlyOnce = \_   -> return Nothing
    , sessionEstablish      = \_ _ -> return ()
    , sessionInvalidate     = \_   -> return ()
    }