helics-wai-0.4.0: src/Network/Helics/Wai/Safe.hs
module Network.Helics.Wai.Safe
( HelicsMiddlewareConfig(..)
-- * middleware
, helics
, dummyHelics
-- * getter
, transactionId
, lookupTransactionId
-- * reexports
, def
) where
import Network.Wai
import Network.Helics
import Network.Helics.Internal.Types (TransactionId(..))
import Data.IORef
import Data.Default.Class
import Data.Vault.Lazy as V
import qualified Data.ByteString as S
newtype HelicsMiddlewareConfig = HelicsMiddlewareConfig
{ transactionName :: Request -> S.ByteString
}
instance Default HelicsMiddlewareConfig where
def = HelicsMiddlewareConfig rawPathInfo
-- | helics middleware.
helics :: Key TransactionId -> HelicsMiddlewareConfig -> Middleware
helics key conf app req send =
withTransaction (transactionName conf req) def $ \tid -> do
setRequestUrl (rawPathInfo req) tid
app req { vault = insert key tid (vault req) } send
-- | Middleware which add dummy TransactionId to Request. since v0.4.0.
dummyHelics :: Key TransactionId -> Middleware
dummyHelics key app req send = do
err <- newIORef Nothing
app req { vault = insert key (TransactionId 0 err) (vault req) } send
-- | get TransactionId from request.
transactionId :: Key TransactionId -> Request -> TransactionId
transactionId key req = maybe (error "helics middleware is not installed.") id $
lookupTransactionId key req
-- | get TransactionId when middleware installed.
lookupTransactionId :: Key TransactionId -> Request -> Maybe TransactionId
lookupTransactionId key req = V.lookup key (vault req)