diff --git a/.sbtopts b/.sbtopts new file mode 100644 index 00000000..cd59c68e --- /dev/null +++ b/.sbtopts @@ -0,0 +1,2 @@ +-J-Xmx2G +-J-XX:+UseG1GC diff --git a/build.sbt b/build.sbt index dc2a3a3f..dcaa25e4 100644 --- a/build.sbt +++ b/build.sbt @@ -56,12 +56,15 @@ val commonSettings = List( Libraries.kittens.value, Libraries.ip4sCore.value, Libraries.monocleCore.value, - Libraries.catsLaws % Test, - Libraries.monocleLaw % Test, - Libraries.scalacheck % Test, - Libraries.weaverCats % Test, - Libraries.weaverDiscipline % Test, - Libraries.weaverScalaCheck % Test + Libraries.ironCore.value, + Libraries.ironCats.value, + Libraries.ironCirce.value, + Libraries.catsLaws.value % Test, + Libraries.monocleLaw.value % Test, + Libraries.scalacheck.value % Test, + Libraries.weaverCats.value % Test, + Libraries.weaverDiscipline.value % Test, + Libraries.weaverScalaCheck.value % Test ) ) @@ -71,9 +74,6 @@ val commonJvmSettings = List( Libraries.http4sDsl, Libraries.http4sMetrics, Libraries.http4sServer, - Libraries.ironCore.value, - Libraries.ironCats.value, - Libraries.ironCirce.value, Libraries.neutronCore, Libraries.odin, Libraries.redis4catsEffects @@ -99,7 +99,7 @@ lazy val domain = crossProject(JSPlatform, JVMPlatform) .settings(commonSettings: _*) .jvmSettings(commonJvmSettings) .jsSettings( - test := {}, + libraryDependencies += Libraries.scalajsTime.value, scalacOptions := List("-scalajs") ) @@ -124,7 +124,7 @@ lazy val feed = (project in file("modules/feed")) .settings(commonSettings: _*) .settings(dockerSettings("feed")) .settings( - libraryDependencies += Libraries.scalacheck + libraryDependencies += Libraries.scalacheck.value ) .dependsOn(core) .dependsOn(domain.jvm % "compile->compile;compile->test") diff --git a/modules/domain/js/src/main/scala/trading/domain/Symbol.scala b/modules/domain/js/src/main/scala/trading/domain/Symbol.scala deleted file mode 100644 index 1ba9fd78..00000000 --- a/modules/domain/js/src/main/scala/trading/domain/Symbol.scala +++ /dev/null @@ -1,27 +0,0 @@ -package trading.domain - -import trading.Newtype - -import cats.* -import cats.derived.* -import io.circe.* - -// JS definition does not use refinement types (iron does not support Scala.JS yet) -type Symbol = Symbol.Type -object Symbol extends Newtype[String]: - val CHFEUR = Symbol("CHFEUR") - val EURPLN = Symbol("EURPLN") - val EURUSD = Symbol("EURUSD") - val GBPUSD = Symbol("GBPUSD") - val AUDCAD = Symbol("AUDCAD") - val USDCAD = Symbol("USDCAD") - val CHFGBP = Symbol("CHFGBP") - val XEMPTY = Symbol("XXXXXX") - - given Monoid[Symbol] with - def empty: Symbol = XEMPTY - def combine(x: Symbol, y: Symbol): Symbol = - (x, y) match - case (XEMPTY, z) => z - case (z, XEMPTY) => z - case (_, z) => z diff --git a/modules/domain/jvm/src/main/scala/trading/domain/Symbol.scala b/modules/domain/shared/src/main/scala/trading/domain/Symbol.scala similarity index 100% rename from modules/domain/jvm/src/main/scala/trading/domain/Symbol.scala rename to modules/domain/shared/src/main/scala/trading/domain/Symbol.scala diff --git a/modules/domain/jvm/src/test/scala/trading/commands/TradeCommandSuite.scala b/modules/domain/shared/src/test/scala/trading/commands/TradeCommandSuite.scala similarity index 100% rename from modules/domain/jvm/src/test/scala/trading/commands/TradeCommandSuite.scala rename to modules/domain/shared/src/test/scala/trading/commands/TradeCommandSuite.scala diff --git a/modules/domain/jvm/src/test/scala/trading/domain/PriceUpdateCodecSuite.scala b/modules/domain/shared/src/test/scala/trading/domain/PriceUpdateCodecSuite.scala similarity index 100% rename from modules/domain/jvm/src/test/scala/trading/domain/PriceUpdateCodecSuite.scala rename to modules/domain/shared/src/test/scala/trading/domain/PriceUpdateCodecSuite.scala diff --git a/modules/domain/jvm/src/test/scala/trading/domain/SymbolSuite.scala b/modules/domain/shared/src/test/scala/trading/domain/SymbolSuite.scala similarity index 100% rename from modules/domain/jvm/src/test/scala/trading/domain/SymbolSuite.scala rename to modules/domain/shared/src/test/scala/trading/domain/SymbolSuite.scala diff --git a/modules/domain/jvm/src/test/scala/trading/domain/generators.scala b/modules/domain/shared/src/test/scala/trading/domain/generators.scala similarity index 100% rename from modules/domain/jvm/src/test/scala/trading/domain/generators.scala rename to modules/domain/shared/src/test/scala/trading/domain/generators.scala diff --git a/modules/domain/jvm/src/test/scala/trading/state/TradeStateSuite.scala b/modules/domain/shared/src/test/scala/trading/state/TradeStateSuite.scala similarity index 100% rename from modules/domain/jvm/src/test/scala/trading/state/TradeStateSuite.scala rename to modules/domain/shared/src/test/scala/trading/state/TradeStateSuite.scala diff --git a/modules/domain/jvm/src/test/scala/trading/ws/WsCodecSuite.scala b/modules/domain/shared/src/test/scala/trading/ws/WsCodecSuite.scala similarity index 100% rename from modules/domain/jvm/src/test/scala/trading/ws/WsCodecSuite.scala rename to modules/domain/shared/src/test/scala/trading/ws/WsCodecSuite.scala diff --git a/modules/ws-client/src/main/scala/trading/client/Update.scala b/modules/ws-client/src/main/scala/trading/client/Update.scala index f34f0d92..9c1b65ec 100644 --- a/modules/ws-client/src/main/scala/trading/client/Update.scala +++ b/modules/ws-client/src/main/scala/trading/client/Update.scala @@ -1,13 +1,12 @@ package trading.client -import trading.client.Model.* -import trading.domain.* -import trading.ws.{ WsIn, WsOut } - import cats.effect.IO import cats.syntax.all.* - +import io.github.iltotore.iron.* import org.scalajs.dom +import trading.client.Model.* +import trading.domain.* +import trading.ws.{ WsIn, WsOut } import tyrian.* import tyrian.cmds.Dom @@ -32,7 +31,9 @@ def runUpdates(model: Model): Msg => (Model, Cmd[IO, Msg]) = model.copy(error = None, sub = None, unsub = None) -> refocusInput case Msg.SymbolChanged(in) if in.length == 6 => - model.copy(symbol = Symbol(in), input = in) -> Cmd.None + in.trim.refineEither[SymbolR].map(Symbol(_)).toOption.fold(model -> Cmd.None) { sym => + model.copy(symbol = sym, input = in) -> Cmd.None + } case Msg.SymbolChanged(in) => model.copy(input = in) -> Cmd.None diff --git a/project/Dependencies.scala b/project/Dependencies.scala index f0176534..075fe046 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -26,7 +26,7 @@ object Dependencies { val redis4cats = "1.4.1" val refined = "0.10.3" - val scalajsTime = "2.4.0" + val scalajsTime = "2.5.0" val tyrian = "0.6.1" val scalacheck = "1.17.0" @@ -88,12 +88,12 @@ object Dependencies { val tyrianIO = Def.setting("io.indigoengine" %%% "tyrian-io" % V.tyrian) // test - val catsLaws = "org.typelevel" %% "cats-laws" % V.cats - val monocleLaw = "dev.optics" %% "monocle-law" % V.monocle - val scalacheck = "org.scalacheck" %% "scalacheck" % V.scalacheck - val weaverCats = "com.disneystreaming" %% "weaver-cats" % V.weaver - val weaverDiscipline = "com.disneystreaming" %% "weaver-discipline" % V.weaver - val weaverScalaCheck = "com.disneystreaming" %% "weaver-scalacheck" % V.weaver + val catsLaws = Def.setting("org.typelevel" %%% "cats-laws" % V.cats) + val monocleLaw = Def.setting("dev.optics" %%% "monocle-law" % V.monocle) + val scalacheck = Def.setting("org.scalacheck" %%% "scalacheck" % V.scalacheck) + val weaverCats = Def.setting("com.disneystreaming" %%% "weaver-cats" % V.weaver) + val weaverDiscipline = Def.setting("com.disneystreaming" %%% "weaver-discipline" % V.weaver) + val weaverScalaCheck = Def.setting("com.disneystreaming" %%% "weaver-scalacheck" % V.weaver) // only for demo val fs2Kafka = "com.github.fd4s" %% "fs2-kafka" % V.fs2Kafka diff --git a/web-app/js/WsPorts.js b/web-app/js/WsPorts.js index 5d32f59c..dabe9638 100644 --- a/web-app/js/WsPorts.js +++ b/web-app/js/WsPorts.js @@ -5,7 +5,7 @@ function wsPortsHook(app) { function keepAlive() { var timeout = 20000; - if (socket.readyState == socket.OPEN) { + if (socket.readyState === socket.OPEN) { console.log('[info] Sending heartbeat 💓'); socket.send('{ "Heartbeat": {} }'); } @@ -52,7 +52,7 @@ function wsPortsHook(app) { socket.onerror = function(error) { console.log(`[error] ${error.message}, ws status: ${socket.readyState}`); - if (socket.readyState == socket.CLOSED) { + if (socket.readyState === socket.CLOSED) { if ( error != null && error.message != null) { app.ports.connectionError.send(error.message); } else {