packages feed

aws-lambda-haskell-runtime-4.0.0: src/Aws/Lambda/Runtime/Context.hs

module Aws.Lambda.Runtime.Context
  ( Context (..),
    initialize,
    setEventData,
  )
where

import qualified Aws.Lambda.Runtime.ApiInfo as ApiInfo
import qualified Aws.Lambda.Runtime.Environment as Environment
import qualified Aws.Lambda.Runtime.Error as Error
import Control.Exception.Safe.Checked (Throws)
import Data.IORef (IORef)
import Data.Text (Text)

-- | Context that is passed to all the handlers
data Context context = Context
  { memoryLimitInMb :: !Int,
    functionName :: !Text,
    functionVersion :: !Text,
    invokedFunctionArn :: !Text,
    awsRequestId :: !Text,
    xrayTraceId :: !Text,
    logStreamName :: !Text,
    logGroupName :: !Text,
    deadline :: !Int,
    customContext :: !(IORef context)
  }

-- | Initializes the context out of the environment
initialize ::
  Throws Error.Parsing =>
  Throws Error.EnvironmentVariableNotSet =>
  IORef context ->
  IO (Context context)
initialize customContextRef = do
  functionName <- Environment.functionName
  version <- Environment.functionVersion
  logStream <- Environment.logStreamName
  logGroup <- Environment.logGroupName
  memoryLimitInMb <- Environment.functionMemory

  pure $
    Context
      { functionName = functionName,
        functionVersion = version,
        logStreamName = logStream,
        logGroupName = logGroup,
        memoryLimitInMb = memoryLimitInMb,
        customContext = customContextRef,
        -- We set those to "empty" values because they will be assigned
        -- from the incoming event once one has been received. (see setEventData)
        invokedFunctionArn = mempty,
        xrayTraceId = mempty,
        awsRequestId = mempty,
        deadline = 0
      }

-- | Sets the context's event data
setEventData ::
  Context context ->
  ApiInfo.Event ->
  IO (Context context)
setEventData context ApiInfo.Event {..} = do
  Environment.setXRayTrace traceId

  return $
    context
      { invokedFunctionArn = invokedFunctionArn,
        xrayTraceId = traceId,
        awsRequestId = awsRequestId,
        deadline = deadlineMs
      }