diff --git a/.scalafmt.conf b/.scalafmt.conf index 4e1598f..5eef37c 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,2 +1,2 @@ -version = 3.8.3 +version = 3.10.7 runner.dialect = scala3 \ No newline at end of file diff --git a/build.sbt b/build.sbt index fa69172..05fec60 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,6 @@ import scala.concurrent.duration.DurationInt -ThisBuild / scalaVersion := "3.3.4" +ThisBuild / scalaVersion := "3.3.7" ThisBuild / version := "0.1.0-SNAPSHOT" ThisBuild / organization := "io.adamnfish" ThisBuild / organizationName := "adamnfish" @@ -17,22 +17,22 @@ ThisBuild / scalacOptions ++= Seq( "64" ) -val circeVersion = "0.14.10" -val scanamoVersion = "3.0.0" -val awsJavaSdkVersion = "2.29.43" +val circeVersion = "0.14.15" +val scanamoVersion = "6.0.0" +val awsJavaSdkVersion = "2.42.6" val commonDeps = Seq( "org.scalatest" %% "scalatest" % "3.2.19" % Test, - "org.scalameta" %% "munit" % "1.0.3" % Test, - "org.scalameta" %% "munit-scalacheck" % "1.0.0" % Test, + "org.scalameta" %% "munit" % "1.2.4" % Test, + "org.scalameta" %% "munit-scalacheck" % "1.2.0" % Test, "org.typelevel" %% "scalacheck-effect-munit" % "1.0.4" % Test, - "org.typelevel" %% "munit-cats-effect" % "2.0.0" % Test, - "org.scalacheck" %% "scalacheck" % "1.18.1" % Test, - "org.scalatestplus" %% "scalacheck-1-18" % "3.2.19.0" % Test + "org.typelevel" %% "munit-cats-effect" % "2.1.0" % Test, + "org.scalacheck" %% "scalacheck" % "1.19.0" % Test, + "org.scalatestplus" %% "scalacheck-1-19" % "3.2.19.0" % Test ) val loggingDeps = Seq( - "org.typelevel" %% "log4cats-slf4j" % "2.7.0", - "ch.qos.logback" % "logback-classic" % "1.5.15", - "com.typesafe.scala-logging" %% "scala-logging" % "3.9.5" + "org.typelevel" %% "log4cats-slf4j" % "2.7.1", + "ch.qos.logback" % "logback-classic" % "1.5.32", + "com.typesafe.scala-logging" %% "scala-logging" % "3.9.6" ) // https://aws.amazon.com/blogs/developer/tuning-the-aws-java-sdk-2-x-to-reduce-startup-time/ @@ -54,8 +54,8 @@ lazy val core = (project in file("core")) .settings( name := "core", libraryDependencies ++= Seq( - "org.typelevel" %% "cats-core" % "2.12.0", - "org.typelevel" %% "cats-effect" % "3.5.7", + "org.typelevel" %% "cats-core" % "2.13.0", + "org.typelevel" %% "cats-effect" % "3.6.3", "io.circe" %% "circe-core" % circeVersion, "io.circe" %% "circe-generic" % circeVersion, "io.circe" %% "circe-parser" % circeVersion, @@ -70,9 +70,9 @@ lazy val lambda = (project in file("lambda")) .settings( name := "lambda", libraryDependencies ++= Seq( - "com.amazonaws" % "aws-lambda-java-core" % "1.2.3", - "com.amazonaws" % "aws-lambda-java-events" % "3.14.0", - "com.amazonaws" % "aws-xray-recorder-sdk-core" % "2.18.2", + "com.amazonaws" % "aws-lambda-java-core" % "1.4.0", + "com.amazonaws" % "aws-lambda-java-events" % "3.16.1", + "com.amazonaws" % "aws-xray-recorder-sdk-core" % "2.20.0", "software.amazon.awssdk" % "apigatewaymanagementapi" % awsJavaSdkVersion, // TODO: use the async crt version for everything "software.amazon.awssdk" % "url-connection-client" % awsJavaSdkVersion, @@ -97,7 +97,7 @@ lazy val integration = (project in file("integration")) .settings( name := "integration", libraryDependencies ++= Seq( - "org.typelevel" %% "cats-effect-testing-scalatest" % "1.6.0" % Test, + "org.typelevel" %% "cats-effect-testing-scalatest" % "1.7.0" % Test, // TODO: use the async crt version for everything "software.amazon.awssdk" % "url-connection-client" % awsJavaSdkVersion % Test, "software.amazon.awssdk" % "aws-crt-client" % awsJavaSdkVersion % Test, @@ -125,7 +125,7 @@ lazy val devServer = (project in file("devserver")) .settings( name := "devserver", libraryDependencies ++= Seq( - "io.javalin" % "javalin" % "5.6.3", // TODO: v6 is now out + "io.javalin" % "javalin" % "7.0.1", "software.amazon.awssdk" % "dynamodb" % awsJavaSdkVersion, // TODO: use the async crt version for everything "software.amazon.awssdk" % "url-connection-client" % awsJavaSdkVersion, diff --git a/devserver/src/main/scala/io/adamnfish/pokerdot/DevServer.scala b/devserver/src/main/scala/io/adamnfish/pokerdot/DevServer.scala index ab4cf7e..d638c2b 100644 --- a/devserver/src/main/scala/io/adamnfish/pokerdot/DevServer.scala +++ b/devserver/src/main/scala/io/adamnfish/pokerdot/DevServer.scala @@ -19,10 +19,7 @@ import software.amazon.awssdk.auth.credentials.{ StaticCredentialsProvider } import software.amazon.awssdk.regions.Region -import software.amazon.awssdk.services.dynamodb.{ - DynamoDbAsyncClient, - DynamoDbClient -} +import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient import java.net.URI import java.security.SecureRandom @@ -87,9 +84,51 @@ object CatsDevServer extends IOApp: app <- Resource.make { IO.blocking { - val app = Javalin.create() - app.start(7000) - app + Javalin.create { config => + config.routes.ws( + "/api", + { ws => + ws.onConnect { wctx => + val result = for { + _ <- connectionPrinter(wctx.sessionId, true) + _ <- IO.blocking(messaging.connect(wctx)) + } yield () + result.unsafeRunSync() + } + ws.onClose { wctx => + val result = for { + _ <- connectionPrinter(wctx.sessionId, false) + _ <- IO.blocking(messaging.disconnect(wctx)) + } yield () + result.unsafeRunSync() + } + ws.onMessage { wctx => + val result = + for + _ <- messagePrinter(Inbound)( + wctx.sessionId, + wctx.message() + ) + traceId <- IO(TraceId(UUID.randomUUID().toString)) + appContext = appContextBuilder( + PlayerAddress(wctx.sessionId), + traceId + ) + operation <- PokerDot.pokerdot(wctx.message(), appContext) + _ <- logger.info(s"completed $operation") + yield () + result + .onError { + case failures: Failures => + logger.error(failures)(s"error: ${failures.logString}") + case err => + logger.error(err)(s"exception: ${err.getMessage}") + } + .unsafeRunSync() + } + } + ) + } } } { app => IO.blocking(app.stop()) @@ -100,66 +139,13 @@ object CatsDevServer extends IOApp: messagePrinter, connectionPrinter, messaging - // TODO add separate comection manager here? + // TODO add separate connection manager here? ) override def run(args: List[String]): IO[ExitCode] = components(args).use: components => - IO { - components.app.ws( - "/api", - { ws => - ws.onConnect { wctx => - val traceId = TraceId("connect") - val appContext = components.appContextBuilder( - PlayerAddress(wctx.getSessionId), - traceId - ) - val result = for { - _ <- components.connectionPrinter(wctx.getSessionId, true) - _ <- IO.blocking(components.messaging.connect(wctx)) - } yield () - result.unsafeRunSync() - } - ws.onClose { wctx => - val traceId = TraceId("close") - val appContext = components.appContextBuilder( - PlayerAddress(wctx.getSessionId), - traceId - ) - val result = for { - _ <- components.connectionPrinter(wctx.getSessionId, false) - _ <- IO.blocking(components.messaging.disconnect(wctx)) - } yield () - result.unsafeRunSync() - } - ws.onMessage { wctx => - val result = - for - _ <- components.messagePrinter(Inbound)( - wctx.getSessionId, - wctx.message - ) - traceId <- IO(TraceId(UUID.randomUUID().toString)) - appContext = components.appContextBuilder( - PlayerAddress(wctx.getSessionId), - traceId - ) - operation <- PokerDot.pokerdot(wctx.message, appContext) - _ <- logger.info(s"completed $operation") - yield () - result - .onError { - case failures: Failures => - logger.error(failures)(s"error: ${failures.logString}") - case err => - logger.error(err)(s"exception: ${err.getMessage}") - } - .unsafeRunSync() - } - } - ) - }.as(ExitCode.Success) >> IO.never + IO.blocking(components.app.start(7000)) >> + IO.never.as(ExitCode.Success) case class DevServerComponents( app: Javalin, diff --git a/devserver/src/main/scala/io/adamnfish/pokerdot/services/DevMessaging.scala b/devserver/src/main/scala/io/adamnfish/pokerdot/services/DevMessaging.scala index 72facd0..22e4d20 100644 --- a/devserver/src/main/scala/io/adamnfish/pokerdot/services/DevMessaging.scala +++ b/devserver/src/main/scala/io/adamnfish/pokerdot/services/DevMessaging.scala @@ -13,7 +13,7 @@ class DevMessaging[F[_] : Sync : MonadThrow](logMessage: (String, String) => F[U private val connections = new mutable.HashMap[String, WsContext] def connect(wctx: WsContext): String = { - val playerAddress = wctx.getSessionId + val playerAddress = wctx.sessionId connections.put(playerAddress, wctx) playerAddress } diff --git a/project/build.properties b/project/build.properties index cc68b53..b49295c 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.11 +sbt.version=1.12.5