{-# LANGUAGE GADTs #-}
-- | Publishing of results/errors back to the
-- AWS Lambda runtime API
module Aws.Lambda.Runtime.Publish
( result,
invocationError,
parsingError,
runtimeInitError,
)
where
import qualified Aws.Lambda.Runtime.API.Endpoints as Endpoints
import Aws.Lambda.Runtime.Common
import Aws.Lambda.Runtime.Context (Context (..))
import qualified Aws.Lambda.Runtime.Error as Error
import Aws.Lambda.Runtime.StandaloneLambda.Types
import Control.Monad (void)
import Data.Aeson
import Data.Text (Text, unpack)
import qualified Data.Text.Encoding as T
import qualified Network.HTTP.Client as Http
-- | Publishes the result back to AWS Lambda
result :: LambdaResult handlerType -> Text -> Context context -> Http.Manager -> IO ()
result lambdaResult lambdaApi context manager = do
let Endpoints.Endpoint endpoint = Endpoints.response lambdaApi (awsRequestId context)
rawRequest <- Http.parseRequest . unpack $ endpoint
let requestBody = case lambdaResult of
(StandaloneLambdaResult res) -> Http.RequestBodyBS (T.encodeUtf8 . unStandaloneLambdaResponseBody $ res)
(APIGatewayResult res) -> Http.RequestBodyLBS (encode res)
(ALBResult res) -> Http.RequestBodyLBS (encode res)
request =
rawRequest
{ Http.method = "POST",
Http.requestBody = requestBody
}
void $ Http.httpNoBody request manager
-- | Publishes an invocation error back to AWS Lambda
invocationError :: Error.Invocation -> Text -> Context context -> Http.Manager -> IO ()
invocationError err lambdaApi context =
publish err (Endpoints.invocationError lambdaApi $ awsRequestId context) context
-- | Publishes a parsing error back to AWS Lambda
parsingError :: Error.Parsing -> Text -> Context context -> Http.Manager -> IO ()
parsingError err lambdaApi context =
publish
err
(Endpoints.invocationError lambdaApi $ awsRequestId context)
context
-- | Publishes a runtime initialization error back to AWS Lambda
runtimeInitError :: ToJSON err => err -> Text -> Context context -> Http.Manager -> IO ()
runtimeInitError err lambdaApi =
publish err (Endpoints.runtimeInitError lambdaApi)
publish :: ToJSON err => err -> Endpoints.Endpoint -> Context context -> Http.Manager -> IO ()
publish err (Endpoints.Endpoint endpoint) _context manager = do
rawRequest <- Http.parseRequest . unpack $ endpoint
let requestBody = Http.RequestBodyLBS (encode err)
request =
rawRequest
{ Http.method = "POST",
Http.requestBody = requestBody
}
void $ Http.httpNoBody request manager