-- | Integration of "Freckle.App" tooling with "Network.Wai"
module Freckle.App.Wai
  ( noCacheMiddleware
  , denyFrameEmbeddingMiddleware

    -- * CORS
  , corsMiddleware

    -- * Logs
  , requestLogger
  , addThreadContextFromRequest

    -- * Tracing
  , newOpenTelemetryWaiMiddleware
  , addThreadContextFromTracing

    -- * Metrics
  , addThreadContextFromStatsTags
  , requestStats
  ) where

import Freckle.App.Prelude

import Freckle.App.OpenTelemetry.ThreadContext
import Network.Wai
import Network.Wai.Middleware.AddHeaders
import Network.Wai.Middleware.Cors
import Network.Wai.Middleware.Logging
import Network.Wai.Middleware.Stats
import OpenTelemetry.Instrumentation.Wai

-- | Middleware that adds header to disable all caching
noCacheMiddleware :: Middleware
noCacheMiddleware :: Middleware
noCacheMiddleware =
  [(ByteString, ByteString)] -> Middleware
addHeaders [(ByteString
"Cache-Control", ByteString
"no-cache, no-store, max-age=0, private")]

-- | Middleware that adds header to deny all frame embedding
denyFrameEmbeddingMiddleware :: Middleware
denyFrameEmbeddingMiddleware :: Middleware
denyFrameEmbeddingMiddleware = [(ByteString, ByteString)] -> Middleware
addHeaders [(ByteString
"X-Frame-Options", ByteString
"DENY")]

-- | Middleware that adds trace context to logging context
addThreadContextFromTracing :: Middleware
addThreadContextFromTracing :: Middleware
addThreadContextFromTracing Application
app Request
req = IO ResponseReceived -> IO ResponseReceived
forall (m :: * -> *) a. (MonadIO m, MonadMask m) => m a -> m a
withTraceContext (IO ResponseReceived -> IO ResponseReceived)
-> ((Response -> IO ResponseReceived) -> IO ResponseReceived)
-> (Response -> IO ResponseReceived)
-> IO ResponseReceived
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Application
app Request
req