Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 25 additions & 5 deletions src/main/scala/encry/api/http/DataHolderForApi.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import encry.local.miner.Miner.{DisableMining, EnableMining, MinerStatus, StartM
import encry.network.BlackList.BanReason.InvalidNetworkMessage
import encry.network.BlackList.{BanReason, BanTime, BanType}
import encry.network.ConnectedPeersCollection
import encry.network.DeliveryManager.FullBlockChainIsSynced
import encry.network.NodeViewSynchronizer.ReceivableMessages._
import encry.network.PeerConnectionHandler.ConnectedPeer
import encry.network.PeersKeeper.BanPeerFromAPI
Expand Down Expand Up @@ -69,7 +70,8 @@ class DataHolderForApi(settings: EncryAppSettings, ntp: NetworkTimeProvider)
minerStatus: MinerStatus = MinerStatus(isMining = false, None),
blockInfo: BlockAndHeaderInfo = BlockAndHeaderInfo(None, None),
allPeers: Seq[InetSocketAddress] = Seq.empty,
connectedPeersCollection: ConnectedPeersCollection = ConnectedPeersCollection()): Receive = {
connectedPeersCollection: ConnectedPeersCollection = ConnectedPeersCollection(),
isSynced: Boolean = false): Receive = {

case UpdatingTransactionsNumberForApi(qty) =>
context.become(
Expand Down Expand Up @@ -281,10 +283,26 @@ class DataHolderForApi(settings: EncryAppSettings, ntp: NetworkTimeProvider)
settings.constants
)).pipeTo(sender())

case GetDataFromHistory => history.foreach(sender() ! _)
case GetMinerStatus => sender() ! minerStatus
case GetAllPeers => sender() ! allPeers
case GetConnections => sender() ! connectedPeersCollection
case GetDataFromHistory => history.foreach(sender() ! _)
case FullBlockChainIsSynced =>
context.become(
workingCycle(
nvhRef,
blackList,
connectedPeers,
history,
state,
transactionsOnMinerActor,
minerStatus,
blockInfo,
allPeers,
connectedPeersCollection,
isSynced = true
))
case GetBlockChainSync => sender() ! isSynced
case GetMinerStatus => sender() ! minerStatus
case GetAllPeers => sender() ! allPeers
case GetConnections => sender() ! connectedPeersCollection
case PeerBanHelper(peer, msg) =>
context.system.eventStream.publish(BanPeerFromAPI(peer, InvalidNetworkMessage(msg)))
case StartMinerApiMessage =>
Expand Down Expand Up @@ -372,6 +390,8 @@ object DataHolderForApi { //scalastyle:ignore

case object GetAllInfo

case object GetBlockChainSync

case object GetConnections

def props(settings: EncryAppSettings, ntp: NetworkTimeProvider): Props = Props(new DataHolderForApi(settings, ntp))
Expand Down
34 changes: 25 additions & 9 deletions src/main/scala/encry/api/http/routes/BanPeersRoute.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import akka.http.scaladsl.model.{ContentTypes, HttpEntity}
import akka.http.scaladsl.server.Route
import akka.pattern._
import com.typesafe.scalalogging.StrictLogging
import encry.api.http.DataHolderForApi.GetBannedPeersHelper
import encry.api.http.DataHolderForApi.{GetBannedPeersHelper, GetBlockChainSync}
import encry.api.http.ScriptHelper
import encry.network.BlackList.{BanReason, BanTime, BanType}
import encry.settings.RESTApiSettings
Expand All @@ -24,7 +24,14 @@ case class BanPeersRoute(settings: RESTApiSettings, dataHolder: ActorRef)(
def peersAllF: Future[Seq[(InetAddress, (BanReason, BanTime, BanType))]] =
(dataHolder ? GetBannedPeersHelper).mapTo[Seq[(InetAddress, (BanReason, BanTime, BanType))]]

def peerScript(peers: Seq[(InetAddress, (BanReason, BanTime, BanType))] ): Text.TypedTag[String] = {
def syncIsDoneF: Future[Boolean] = (dataHolder ? GetBlockChainSync).mapTo[Boolean]

def info: Future[(Seq[(InetAddress, (BanReason, BanTime, BanType))], Boolean)] = for {
peers <- peersAllF
sync <- syncIsDoneF
} yield (peers, sync)

def peerScript(peers: Seq[(InetAddress, (BanReason, BanTime, BanType))], sync: Boolean): Text.TypedTag[String] = {

html(
scalatags.Text.all.head(
Expand Down Expand Up @@ -112,11 +119,20 @@ case class BanPeersRoute(settings: RESTApiSettings, dataHolder: ActorRef)(
i(cls := "ni ni-tv-2 text-primary"), "Info"
)
),
li(cls := "nav-item",
a(cls := "nav-link", href := "./webWallet",
i(cls := "ni ni-planet text-blue"), "Wallet"
if (sync) {
li(cls := "nav-item",
a(tpe := "button", cls := "nav-link", disabled := "disabled",
i(cls := "ni ni-planet text-blue"), "Wallet (n.a during sync)"
)
)
),
}
else {
li(cls := "nav-item",
a(cls := "nav-link", href := "./webWallet",
i(cls := "ni ni-planet text-blue"), "Wallet"
)
)
},
div(cls := "dropdown",
a(cls := "nav-link", href := "#", role := "button", data("toggle") := "dropdown", aria.haspopup := "true", aria.expanded := "false",
i(cls := "ni ni-bullet-list-67 text-orange"), "Peers"
Expand Down Expand Up @@ -294,9 +310,9 @@ case class BanPeersRoute(settings: RESTApiSettings, dataHolder: ActorRef)(

override def route: Route = (path("bannedPeers") & get) {
WebRoute.authRoute(
onComplete(peersAllF) {
case Success(info) =>
complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, peerScript(info).render))
onComplete(info) {
case Success((peers, isSynced)) =>
complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, peerScript(peers, isSynced).render))
case Failure(_) =>
complete(s"Couldn't load page with banned peers cause inner system is overloaded. Try it later!")
},
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/encry/api/http/routes/PeersApiRoute.scala
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,4 @@ object PeersApiRoute {
}

implicit val encodePeerInfoResponse: Encoder[PeerInfoResponse] = deriveEncoder
}
}
35 changes: 25 additions & 10 deletions src/main/scala/encry/api/http/routes/PeersConnectedRoute.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import akka.http.scaladsl.model.{ContentTypes, HttpEntity}
import akka.http.scaladsl.server.Route
import akka.pattern._
import com.typesafe.scalalogging.StrictLogging
import encry.api.http.DataHolderForApi.GetConnections
import encry.api.http.DataHolderForApi.{GetBlockChainSync, GetConnections}
import encry.api.http.ScriptHelper
import encry.network.ConnectedPeersCollection
import encry.settings.RESTApiSettings
Expand All @@ -16,14 +16,20 @@ import scala.concurrent.Future
import scala.language.implicitConversions
import scala.util.{Failure, Success}


case class PeersConnectedRoute(settings: RESTApiSettings, dataHolder: ActorRef)(
implicit val context: ActorRefFactory
) extends EncryBaseApiRoute with StrictLogging {

def connectedPeers: Future[ConnectedPeersCollection] = (dataHolder ? GetConnections).mapTo[ConnectedPeersCollection]

def peerScript(peersR: ConnectedPeersCollection): Text.TypedTag[String] = {
def syncIsDoneF: Future[Boolean] = (dataHolder ? GetBlockChainSync).mapTo[Boolean]

def info: Future[(ConnectedPeersCollection, Boolean)] = for {
peers <- connectedPeers
sync <- syncIsDoneF
} yield (peers, sync)

def peerScript(peersR: ConnectedPeersCollection, sync: Boolean): Text.TypedTag[String] = {

html(
scalatags.Text.all.head(
Expand Down Expand Up @@ -109,11 +115,20 @@ case class PeersConnectedRoute(settings: RESTApiSettings, dataHolder: ActorRef)(
i(cls := "ni ni-tv-2 text-primary"), "Info"
)
),
li(cls := "nav-item",
a(cls := "nav-link", href := "./webWallet",
i(cls := "ni ni-planet text-blue"), "Wallet"
if (sync) {
li(cls := "nav-item",
a(tpe := "button", cls := "nav-link", disabled := "disabled",
i(cls := "ni ni-planet text-blue"), "Wallet (n.a during sync)"
)
)
),
}
else {
li(cls := "nav-item",
a(cls := "nav-link", href := "./webWallet",
i(cls := "ni ni-planet text-blue"), "Wallet"
)
)
},
div(cls := "dropdown",
a(cls := "nav-link", href := "#", role := "button", data("toggle") := "dropdown", aria.haspopup := "true", aria.expanded := "false",
i(cls := "ni ni-bullet-list-67 text-orange"), "Peers"
Expand Down Expand Up @@ -296,9 +311,9 @@ case class PeersConnectedRoute(settings: RESTApiSettings, dataHolder: ActorRef)(
}

override def route: Route = (path("connectedPeers") & get) {
onComplete(connectedPeers) {
case Success(info) => complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, peerScript(info).render))
case Failure(_) => complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, peerScript(ConnectedPeersCollection()).render))
onComplete(info) {
case Success((peers, isSynced)) => complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, peerScript(peers, isSynced).render))
case Failure(_) => complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, peerScript(ConnectedPeersCollection(), false).render))
}
}

Expand Down
34 changes: 25 additions & 9 deletions src/main/scala/encry/api/http/routes/PeersRoute.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import akka.http.scaladsl.model.{ContentTypes, HttpEntity}
import akka.http.scaladsl.server.Route
import akka.pattern._
import com.typesafe.scalalogging.StrictLogging
import encry.api.http.DataHolderForApi.GetAllPeers
import encry.api.http.DataHolderForApi.{GetAllPeers, GetBlockChainSync}
import encry.settings.{NodeSettings, RESTApiSettings}
import io.circe.generic.auto._
import scalatags.Text
Expand All @@ -21,7 +21,14 @@ case class PeersRoute(settings: RESTApiSettings, nodeSettings: NodeSettings, dat

def peersAllF: Future[Seq[InetSocketAddress]] = (dataHolder ? GetAllPeers).mapTo[Seq[InetSocketAddress]]

def peerScript(peers: Seq[InetSocketAddress] ): Text.TypedTag[String] = {
def syncIsDoneF: Future[Boolean] = (dataHolder ? GetBlockChainSync).mapTo[Boolean]

def info: Future[(Seq[InetSocketAddress], Boolean)] = for {
peers <- peersAllF
sync <- syncIsDoneF
} yield (peers, sync)

def peerScript(peers: Seq[InetSocketAddress], sync: Boolean): Text.TypedTag[String] = {

html(
scalatags.Text.all.head(
Expand Down Expand Up @@ -82,11 +89,20 @@ case class PeersRoute(settings: RESTApiSettings, nodeSettings: NodeSettings, dat
i(cls := "ni ni-tv-2 text-primary"), "Info"
)
),
li(cls := "nav-item",
a(cls := "nav-link", href := "./webWallet",
i(cls := "ni ni-planet text-blue"), "Wallet"
if (sync) {
li(cls := "nav-item",
a(tpe := "button", cls := "nav-link", disabled := "disabled",
i(cls := "ni ni-planet text-blue"), "Wallet (n.a during sync)"
)
)
),
}
else {
li(cls := "nav-item",
a(cls := "nav-link", href := "./webWallet",
i(cls := "ni ni-planet text-blue"), "Wallet"
)
)
},
div(cls := "dropdown",
a(cls := "nav-link", href := "#", role := "button", data("toggle") := "dropdown", aria.haspopup := "true", aria.expanded := "false",
i(cls := "ni ni-bullet-list-67 text-orange"), "Peers"
Expand Down Expand Up @@ -203,9 +219,9 @@ case class PeersRoute(settings: RESTApiSettings, nodeSettings: NodeSettings, dat

override def route: Route = (path("allPeers") & get) {
WebRoute.authRoute(
onComplete(peersAllF) {
case Success(info) =>
complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, peerScript(info).render))
onComplete(info) {
case Success((peers, isSynced)) =>
complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, peerScript(peers, isSynced).render))
case Failure(_) => complete("Couldn't load page with peers cause of inner system is overloaded. Try it later!")
},
settings
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/encry/api/http/routes/WalletRoute.scala
Original file line number Diff line number Diff line change
Expand Up @@ -826,8 +826,8 @@ case class WalletRoute(settings: RESTApiSettings,
override def route: Route = path("webWallet") {
WebRoute.authRoute(
onComplete(info) {
case Success(info) =>
complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, walletScript(info._1).render))
case Success((balance, _)) =>
complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, walletScript(balance).render))
}, settings
)
}
Expand Down
32 changes: 22 additions & 10 deletions src/main/scala/encry/api/http/routes/WebRoute.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import akka.http.scaladsl.model.{ContentTypes, HttpEntity, StatusCodes}
import akka.http.scaladsl.server.{Route, ValidationRejection}
import akka.pattern._
import com.typesafe.scalalogging.StrictLogging
import encry.api.http.DataHolderForApi.{GetAllInfoHelper, GetMinerStatus, GetNodePassHashAndSalt}
import encry.api.http.DataHolderForApi.{GetAllInfoHelper, GetBlockChainSync, GetMinerStatus, GetNodePassHashAndSalt}
import encry.local.miner.Miner.MinerStatus
import encry.settings.{NodeSettings, RESTApiSettings}
import io.circe.generic.auto._
Expand Down Expand Up @@ -48,6 +48,8 @@ case class WebRoute(override val settings: RESTApiSettings, nodeSettings: NodeSe
def getPass: Future[String => Boolean] =
(dataHolder ? GetNodePassHashAndSalt).mapTo[String => Boolean]

def syncIsDoneF: Future[Boolean] = (dataHolder ? GetBlockChainSync).mapTo[Boolean]

def signUp: Text.TypedTag[String] = html(
scalatags.Text.all.head(
meta(charset := "utf-8"),
Expand Down Expand Up @@ -178,8 +180,8 @@ case class WebRoute(override val settings: RESTApiSettings, nodeSettings: NodeSe
path("web") {
WebRoute.authRoute(
onComplete(currentInfoF) {
case Success(info) =>
complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, webResponse(info._1, info._2).render))
case Success((nodeInfo, minerStatus, isSynced)) =>
complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, webResponse(nodeInfo, minerStatus, isSynced).render))
case Failure(exception) => complete(exception)
}, settings)
}
Expand All @@ -189,12 +191,13 @@ case class WebRoute(override val settings: RESTApiSettings, nodeSettings: NodeSe

def infoHelper: Future[Json] = (dataHolder ? GetAllInfoHelper).mapTo[Json]

def currentInfoF: Future[(Json, MinerStatus)] = for {
def currentInfoF: Future[(Json, MinerStatus, Boolean)] = for {
info <- infoHelper
status <- statusF
} yield (info, status)
sync <- syncIsDoneF
} yield (info, status, sync)

def webResponse(json: Json, minerStatus: MinerStatus): Text.TypedTag[String] = {
def webResponse(json: Json, minerStatus: MinerStatus, sync: Boolean): Text.TypedTag[String] = {
val nodeInfo = parser.decode[InfoApi](json.toString())

html(
Expand Down Expand Up @@ -282,11 +285,20 @@ case class WebRoute(override val settings: RESTApiSettings, nodeSettings: NodeSe
i(cls := "ni ni-tv-2 text-primary"), "Info"
)
),
li(cls := "nav-item",
a(cls := "nav-link", href := "./webWallet",
i(cls := "ni ni-planet text-blue"), "Wallet"
if (sync) {
li(cls := "nav-item",
a(tpe := "button", cls := "nav-link", disabled := "disabled",
i(cls := "ni ni-planet text-blue"), "Wallet (n.a during sync)"
)
)
),
}
else {
li(cls := "nav-item",
a(cls := "nav-link", href := "./webWallet",
i(cls := "ni ni-planet text-blue"), "Wallet"
)
)
},
div(cls := "dropdown",
a(cls := "nav-link", href := "#", role := "button", data("toggle") := "dropdown", aria.haspopup := "true", aria.expanded := "false",
i(cls := "ni ni-bullet-list-67 text-orange"), "Peers"
Expand Down
2 changes: 0 additions & 2 deletions src/main/scala/encry/local/miner/Miner.scala
Original file line number Diff line number Diff line change
Expand Up @@ -97,12 +97,10 @@ class Miner(dataHolder: ActorRef,
case TransactionsForMiner(txs) => transactionsPool = transactionsPool ++ txs
case StartMining => logger.info("Can't start mining because of chain is not synced!")
case DisableMining if context.children.nonEmpty =>
println(s"Miner -> Disable mining context.children.nonEmpty")
killAllWorkers()
candidateOpt = None
context.become(miningDisabled)
case DisableMining =>
println(s"Miner -> Disable mining")
killAllWorkers()
candidateOpt = None
context.become(miningDisabled)
Expand Down
1 change: 1 addition & 0 deletions src/main/scala/encry/network/NodeViewSynchronizer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ class NodeViewSynchronizer(influxRef: Option[ActorRef],
case FullBlockChainIsSynced =>
chainSynced = true
deliveryManager ! FullBlockChainIsSynced
dataHolder ! FullBlockChainIsSynced
peersKeeper ! FullBlockChainIsSynced
if (!settings.snapshotSettings.enableFastSynchronization) snapshotHolder ! FullBlockChainIsSynced
case StopTransactionsValidation =>
Expand Down