Introduced bundle project and created main class that runs server and then gui (#1531)

Co-authored-by: nkohen <nadavk25@gmail.com>
This commit is contained in:
Chris Stewart 2020-06-08 08:32:38 -05:00 committed by GitHub
parent f6e7764aad
commit b52ec8b041
5 changed files with 51 additions and 1 deletions

10
app/bundle/bundle.sbt Normal file
View file

@ -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

View file

@ -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)
}

View file

@ -121,4 +121,8 @@ object WalletGUI extends JFXApp {
model.taskRunner = taskRunner model.taskRunner = taskRunner
Platform.runLater(sendButton.requestFocus()) Platform.runLater(sendButton.requestFocus())
override def stopApp(): Unit = {
sys.exit(0) // Kills the server if GUI is closed in AppBundle
}
} }

View file

@ -6,6 +6,7 @@ import java.nio.file.{Files, Paths}
import akka.actor.ActorSystem import akka.actor.ActorSystem
import org.bitcoins.chain.api.ChainApi import org.bitcoins.chain.api.ChainApi
import org.bitcoins.chain.blockchain.ChainHandler import org.bitcoins.chain.blockchain.ChainHandler
import akka.http.scaladsl.Http
import org.bitcoins.chain.config.ChainAppConfig import org.bitcoins.chain.config.ChainAppConfig
import org.bitcoins.chain.models.{BlockHeaderDAO, CompactFilterDAO, CompactFilterHeaderDAO} import org.bitcoins.chain.models.{BlockHeaderDAO, CompactFilterDAO, CompactFilterHeaderDAO}
import org.bitcoins.core.Core import org.bitcoins.core.Core
@ -25,7 +26,7 @@ import org.bitcoins.wallet.config.WalletAppConfig
import org.bitcoins.wallet.models.AccountDAO import org.bitcoins.wallet.models.AccountDAO
import scala.concurrent.duration._ import scala.concurrent.duration._
import scala.concurrent.{Await, ExecutionContext, Future} import scala.concurrent.{Await, ExecutionContext, Future, Promise}
object Main extends App { object Main extends App {
implicit val system = ActorSystem("bitcoin-s") implicit val system = ActorSystem("bitcoin-s")
@ -131,6 +132,8 @@ object Main extends App {
start start
} }
BitcoinSServer.startedFP.success(startFut)
startFut.failed.foreach { err => startFut.failed.foreach { err =>
logger.error(s"Error on server startup!", err) logger.error(s"Error on server startup!", err)
} }
@ -306,3 +309,18 @@ object Main extends App {
} yield chainApiWithWork } 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
}

View file

@ -62,6 +62,7 @@ lazy val `bitcoin-s` = project
bench, bench,
eclairRpc, eclairRpc,
eclairRpcTest, eclairRpcTest,
bundle,
gui, gui,
keyManager, keyManager,
keyManagerTest, keyManagerTest,
@ -265,6 +266,11 @@ lazy val cliTest = project
testkit testkit
) )
lazy val bundle = project
.in(file("app/bundle"))
.settings(CommonSettings.prodSettings: _*)
.dependsOn(appServer, gui)
lazy val gui = project lazy val gui = project
.in(file("app/gui")) .in(file("app/gui"))
.settings(CommonSettings.prodSettings: _*) .settings(CommonSettings.prodSettings: _*)