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
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
invocationError :: Error.Invocation -> String -> Context context -> Http.Manager -> IO ()
invocationError err lambdaApi context =
publish err (Endpoints.invocationError lambdaApi $ awsRequestId context) context
parsingError :: Error.Parsing -> String -> Context context -> Http.Manager -> IO ()
parsingError err lambdaApi context =
publish err (Endpoints.invocationError lambdaApi $ awsRequestId context)
context
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