From 34c538420219bf3ffd1e6bd4f66a498729564630 Mon Sep 17 00:00:00 2001 From: TATSUNO Yasuhiro Date: Fri, 24 Dec 2021 10:32:00 +0900 Subject: [PATCH] Change (Async)Handler to js.Function so it can be handler directly --- README.md | 97 ++++++------------- .../exoego/facade/aws_lambda/Handler.scala | 11 +-- 2 files changed, 29 insertions(+), 79 deletions(-) diff --git a/README.md b/README.md index 2e1da2c..94dbab3 100644 --- a/README.md +++ b/README.md @@ -32,82 +32,39 @@ libraryDependencies += "net.exoego" %%% "aws-lambda-scalajs-facade" % "0.11.0" Import and code. ```scala +import scala.concurrent.{ExecutionContext, Future} import scala.scalajs.js +import scala.scalajs.js.JSConverters._ +import scala.scalajs.js.annotation._ import net.exoego.facade.aws_lambda._ -object MyFirstLambda extends APIGatewayProxyHandler { - @js.annotation.JSName("apply") - override def apply(event: APIGatewayProxyEvent, context: Context, callback: Callback[APIGatewayProxyResult]): Unit = ??? -} - -object MyFirstAsyncLambda extends AsyncAPIGatewayProxyHandler { - @js.annotation.JSName("apply") - override def apply(event: APIGatewayProxyEvent, context: Context): js.Promise[APIGatewayProxyResult] = ??? +object Main { + @JSExportTopLevel("handler") + val handler: AsyncAPIGatewayProxyHandler = (event, context) => { + val json = js.JSON.stringify(event) + js.Dynamic.global.console.log(json) + + implicit val ec = ExecutionContext.global + handle(event).toJSPromise + } + + private def handle(event: APIGatewayProxyEvent)(implicit ec: ExecutionContext): Future[APIGatewayProxyResult] = Future { + APIGatewayProxyResult( + statusCode = 200, + body = "hello " + event.body, + headers = js.defined(js.Dictionary("Content-Type" -> "text/plain")) + ) + } } ``` -Below is the available list of the pre-defined handler traits: - -* ALB - * ALBHandler -* API Gateway - * APIGatewayProxyHandler - * APIGatewayProxyHandlerV2 - * APIGatewayRequestAuthorizerHandler - * APIGatewayRequestAuthorizerWithContextHandler - * APIGatewayTokenAuthorizerHandler - * APIGatewayTokenAuthorizerWithContextHandler - * CustomAuthorizerHandler - * ProxyHandler (alias of APIGatewayProxyHandler) -* AppSync - * AppSyncResolverHandler -* CloudFormation - * CloudFormationCustomResourceHandler -* CloudFront - * CloudFrontRequestHandler - * CloudFrontResponseHandler -* CloudWatch - * CloudWatchLogsHandler - * ScheduledHandler -* CodeBuild - * CodeBuildCloudWatchStateHandler -* CodePipeline - * CodePipelineCloudWatchActionHandler - * CodePipelineCloudWatchHandler - * CodePipelineCloudWatchPipelineHandler - * CodePipelineCloudWatchStageHandler - * CodePipelineHandler -* Cognito - * CognitoUserPoolTriggerHandler - * CreateAuthChallengeTriggerHandler - * CustomMessageTriggerHandler - * DefineAuthChallengeTriggerHandler - * PostAuthenticationTriggerHandler - * PostConfirmationTriggerHandler - * PreAuthenticationTriggerHandler - * PreSignUpTriggerHandler - * PreTokenGenerationTriggerHandler - * UserMigrationTriggerHandler - * VerifyAuthChallengeResponseTriggerHandler -* DynamoDB - * DynamoDBStreamHandler -* EventBridge - * EventBridgeHandler -* Firehose - * FirehoseTransformationHandler -* Kinesis - * KinesisStreamHandler -* Lex - * LexHandler -* S3 - * S3BatchHandler - * S3Handler -* SES - * SESHandler -* SNS - * SNSHandler -* SQS - * SQSHandler +Some of pre-defined handler traits: + +* APIGatewayProxyHandlerV2 +* AppSyncResolverHandler +* DynamoDBStreamHandler +* S3Handler +* SNSHandler Each has `Async~` variant that returns `js.Promise` instead of accepting callback. diff --git a/src/main/scala/net/exoego/facade/aws_lambda/Handler.scala b/src/main/scala/net/exoego/facade/aws_lambda/Handler.scala index e8f4f7f..1d637b4 100644 --- a/src/main/scala/net/exoego/facade/aws_lambda/Handler.scala +++ b/src/main/scala/net/exoego/facade/aws_lambda/Handler.scala @@ -1,7 +1,6 @@ package net.exoego.facade.aws_lambda import scala.scalajs.js -import scala.scalajs.js.annotation.JSName import scala.scalajs.js.| /** Callback-style handler @@ -9,20 +8,14 @@ import scala.scalajs.js.| * @tparam TEvent * @tparam TResult */ -trait Handler[TEvent, TResult] extends js.Object { - @JSName("apply") - def apply(event: TEvent, context: Context, callback: Callback[TResult]): Unit -} +trait Handler[TEvent, TResult] extends js.Function3[TEvent, Context, Callback[TResult], Unit] {} /** Asynchronous-style handler that returns js.Promise. This can be used Node.js 8 runtime or more * * @tparam TEvent * @tparam TResult */ -trait AsyncHandler[TEvent, TResult] extends js.Object { - @JSName("apply") - def apply(event: TEvent, context: Context): js.Promise[TResult] -} +trait AsyncHandler[TEvent, TResult] extends js.Function2[TEvent, Context, js.Promise[TResult]] {} @js.native trait Context extends js.Object {