From b52ec8b041e84734b2799bec3badafe81ad53157 Mon Sep 17 00:00:00 2001 From: Chris Stewart Date: Mon, 8 Jun 2020 08:32:38 -0500 Subject: [PATCH] Introduced bundle project and created main class that runs server and then gui (#1531) Co-authored-by: nkohen --- app/bundle/bundle.sbt | 10 ++++++++++ .../scala/org/bitcoins/bundle/AppBundle.scala | 12 +++++++++++ .../scala/org/bitcoins/gui/WalletGUI.scala | 4 ++++ .../main/scala/org/bitcoins/server/Main.scala | 20 ++++++++++++++++++- build.sbt | 6 ++++++ 5 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 app/bundle/bundle.sbt create mode 100644 app/bundle/src/main/scala/org/bitcoins/bundle/AppBundle.scala diff --git a/app/bundle/bundle.sbt b/app/bundle/bundle.sbt new file mode 100644 index 0000000000..2a7b65eec1 --- /dev/null +++ b/app/bundle/bundle.sbt @@ -0,0 +1,10 @@ +name := "bitcoin-s-bundle" + +mainClass := Some("org.bitcoins.bundle.AppBundle") + +enablePlugins(JavaAppPackaging) + +publish / skip := true + +// Fork a new JVM for 'run' and 'test:run' to avoid JavaFX double initialization problems +fork := true diff --git a/app/bundle/src/main/scala/org/bitcoins/bundle/AppBundle.scala b/app/bundle/src/main/scala/org/bitcoins/bundle/AppBundle.scala new file mode 100644 index 0000000000..cb9e562e72 --- /dev/null +++ b/app/bundle/src/main/scala/org/bitcoins/bundle/AppBundle.scala @@ -0,0 +1,12 @@ +package org.bitcoins.bundle + +import org.bitcoins.gui.WalletGUI +import org.bitcoins.server.{BitcoinSServer, Main} + +import scala.concurrent.ExecutionContext + +object AppBundle extends App { + import ExecutionContext.Implicits.global + BitcoinSServer.startedF.map(_ => WalletGUI.main(args)) + Main.main(args) +} diff --git a/app/gui/src/main/scala/org/bitcoins/gui/WalletGUI.scala b/app/gui/src/main/scala/org/bitcoins/gui/WalletGUI.scala index 7d60c864a8..32b6bd618e 100644 --- a/app/gui/src/main/scala/org/bitcoins/gui/WalletGUI.scala +++ b/app/gui/src/main/scala/org/bitcoins/gui/WalletGUI.scala @@ -121,4 +121,8 @@ object WalletGUI extends JFXApp { model.taskRunner = taskRunner Platform.runLater(sendButton.requestFocus()) + + override def stopApp(): Unit = { + sys.exit(0) // Kills the server if GUI is closed in AppBundle + } } diff --git a/app/server/src/main/scala/org/bitcoins/server/Main.scala b/app/server/src/main/scala/org/bitcoins/server/Main.scala index 8e3226488f..e5ab35adef 100644 --- a/app/server/src/main/scala/org/bitcoins/server/Main.scala +++ b/app/server/src/main/scala/org/bitcoins/server/Main.scala @@ -6,6 +6,7 @@ import java.nio.file.{Files, Paths} import akka.actor.ActorSystem import org.bitcoins.chain.api.ChainApi import org.bitcoins.chain.blockchain.ChainHandler +import akka.http.scaladsl.Http import org.bitcoins.chain.config.ChainAppConfig import org.bitcoins.chain.models.{BlockHeaderDAO, CompactFilterDAO, CompactFilterHeaderDAO} import org.bitcoins.core.Core @@ -25,7 +26,7 @@ import org.bitcoins.wallet.config.WalletAppConfig import org.bitcoins.wallet.models.AccountDAO import scala.concurrent.duration._ -import scala.concurrent.{Await, ExecutionContext, Future} +import scala.concurrent.{Await, ExecutionContext, Future, Promise} object Main extends App { implicit val system = ActorSystem("bitcoin-s") @@ -131,6 +132,8 @@ object Main extends App { start } + BitcoinSServer.startedFP.success(startFut) + startFut.failed.foreach { err => logger.error(s"Error on server startup!", err) } @@ -306,3 +309,18 @@ object Main extends App { } yield chainApiWithWork } } + +object BitcoinSServer { + private[server] val startedFP = Promise[Future[Http.ServerBinding]]() + + /** Allows the above server to be bundled with other projects. + * + * Main.startFut will be null when called from elsewhere due + * to the delayed initialization of scala Apps. + * + * In contrast this Future will be initialized immediately and + * only initialized to to Main's startFut when that future has + * been initialized. + */ + val startedF: Future[Http.ServerBinding] = startedFP.future.flatten +} diff --git a/build.sbt b/build.sbt index 7eb2252e06..203c3c0eb9 100644 --- a/build.sbt +++ b/build.sbt @@ -62,6 +62,7 @@ lazy val `bitcoin-s` = project bench, eclairRpc, eclairRpcTest, + bundle, gui, keyManager, keyManagerTest, @@ -265,6 +266,11 @@ lazy val cliTest = project testkit ) +lazy val bundle = project + .in(file("app/bundle")) + .settings(CommonSettings.prodSettings: _*) + .dependsOn(appServer, gui) + lazy val gui = project .in(file("app/gui")) .settings(CommonSettings.prodSettings: _*)