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
}