{-| Publishing of results/errors back to the AWS Lambda runtime API -} module Aws.Lambda.Runtime.Publish ( result , invocationError , parsingError , runtimeInitError ) where import Control.Monad (void) import Data.Aeson import qualified Data.Text.Encoding as T import qualified Network.HTTP.Client as Http 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 -- | Publishes the result back to AWS Lambda result :: LambdaResult -> String -> Context context -> Http.Manager -> IO () result lambdaResult lambdaApi context manager = do let Endpoints.Endpoint endpoint = Endpoints.response lambdaApi (awsRequestId context) rawRequest <- Http.parseRequest endpoint let requestBody = case lambdaResult of (StandaloneLambdaResult res) -> Http.RequestBodyBS (T.encodeUtf8 . unLambdaResponseBody $ res) (ApiGatewayResult 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 -> String -> 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 -> String -> 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 -> String -> 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 endpoint let requestBody = Http.RequestBodyLBS (encode err) request = rawRequest { Http.method = "POST" , Http.requestBody = requestBody } void $ Http.httpNoBody request manager