Skip to content

Commit

Permalink
Merge pull request #313 from exoego/fix-handle
Browse files Browse the repository at this point in the history
Change (Async)Handler to js.Function so it can be handler directly
  • Loading branch information
exoego committed Dec 24, 2021
2 parents 3d6ae0e + 34c5384 commit bbd83be
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 79 deletions.
97 changes: 27 additions & 70 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
11 changes: 2 additions & 9 deletions src/main/scala/net/exoego/facade/aws_lambda/Handler.scala
Original file line number Diff line number Diff line change
@@ -1,28 +1,21 @@
package net.exoego.facade.aws_lambda

import scala.scalajs.js
import scala.scalajs.js.annotation.JSName
import scala.scalajs.js.|

/** Callback-style handler
*
* @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 {
Expand Down

0 comments on commit bbd83be

Please sign in to comment.