{-# 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 qualified Data.ByteString.Lazy as LBS
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 (StandaloneLambdaResponseBodyPlain res)) ->
Http.RequestBodyBS (T.encodeUtf8 res)
(StandaloneLambdaResult (StandaloneLambdaResponseBodyJson res)) ->
Http.RequestBodyLBS 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 (Error.Invocation 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
(encode 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 (encode err) (Endpoints.runtimeInitError lambdaApi)
publish :: LBS.ByteString -> Endpoints.Endpoint -> Context context -> Http.Manager -> IO ()
publish err (Endpoints.Endpoint endpoint) _context manager = do
rawRequest <- Http.parseRequest . unpack $ endpoint
let requestBody = Http.RequestBodyLBS err
request =
rawRequest
{ Http.method = "POST",
Http.requestBody = requestBody
}
void $ Http.httpNoBody request manager