/// <summary> /// Retrieve all node information and store it in IDistributedCache object /// </summary> private async Task BuildCacheAsync() { this.logger.LogInformation($"Refresh the Dashboard Data"); await nodeDataServiceMainchain.Update(); await nodeDataServiceSidechain.Update(); var stratisPeers = new List <Peer>(); var stratisFederationMembers = new List <Peer>(); var sidechainPeers = new List <Peer>(); var sidechainFederationMembers = new List <Peer>(); try { if (this.is50K) { this.ParsePeers(nodeDataServiceMainchain, stratisPeers, stratisFederationMembers); this.ParsePeers(nodeDataServiceSidechain, sidechainPeers, sidechainFederationMembers); } else { this.ParsePeers(nodeDataServiceMainchain, stratisPeers); this.ParsePeers(nodeDataServiceSidechain, sidechainPeers); } } catch (Exception e) { this.logger.LogError(e, "Unable to parse feeds"); } var dashboardModel = new DashboardModel(); try { dashboardModel.Status = true; dashboardModel.IsCacheBuilt = true; dashboardModel.MainchainWalletAddress = this.is50K ? ((NodeGetDataServiceMultisig)nodeDataServiceMainchain).FedAddress : string.Empty; dashboardModel.SidechainWalletAddress = this.is50K ? ((NodeDataServiceSidechainMultisig)nodeDataServiceSidechain).FedAddress : string.Empty; dashboardModel.MiningPublicKeys = nodeDataServiceMainchain.FedInfoResponse?.Content?.federationMultisigPubKeys ?? new JArray(); var stratisNode = new StratisNodeModel(); stratisNode.History = this.is50K ? ((NodeGetDataServiceMultisig)nodeDataServiceMainchain).WalletHistory : new JArray(); stratisNode.ConfirmedBalanceFed = this.is50K ? ((NodeGetDataServiceMultisig)nodeDataServiceMainchain).FedWalletBalance.confirmedBalance : -1; stratisNode.UnconfirmedBalanceFed = this.is50K ? ((NodeGetDataServiceMultisig)nodeDataServiceMainchain).FedWalletBalance.unconfirmedBalance : -1; stratisNode.WebAPIUrl = UriHelper.BuildUri(this.defaultEndpointsSettings.StratisNode, "/api").ToString(); stratisNode.SwaggerUrl = UriHelper.BuildUri(this.defaultEndpointsSettings.StratisNode, "/swagger").ToString(); stratisNode.SyncingStatus = nodeDataServiceMainchain.NodeStatus.SyncingProgress; stratisNode.Peers = stratisPeers; stratisNode.FederationMembers = stratisFederationMembers; stratisNode.BlockHash = nodeDataServiceMainchain.BestHash; stratisNode.BlockHeight = (int)nodeDataServiceMainchain.NodeStatus.BlockStoreHeight; stratisNode.MempoolSize = nodeDataServiceMainchain.RawMempool; stratisNode.CoinTicker = "STRAT"; stratisNode.LogRules = nodeDataServiceMainchain.LogRules; stratisNode.Uptime = nodeDataServiceMainchain.NodeStatus.Uptime; stratisNode.IsMining = this.nodeDataServiceMainchain.NodeDashboardStats?.IsMining ?? false; stratisNode.AddressIndexer = this.nodeDataServiceMainchain.NodeDashboardStats?.AddressIndexerHeight ?? 0; stratisNode.HeaderHeight = this.nodeDataServiceMainchain.NodeDashboardStats?.HeaderHeight ?? 0; stratisNode.AsyncLoops = this.nodeDataServiceMainchain.NodeDashboardStats?.AsyncLoops ?? string.Empty; stratisNode.OrphanSize = this.nodeDataServiceMainchain.NodeDashboardStats?.OrphanSize ?? string.Empty; dashboardModel.StratisNode = stratisNode; var sidechainNode = new SidechainNodeModel(); sidechainNode.History = this.is50K ? ((NodeDataServiceSidechainMultisig)nodeDataServiceSidechain).WalletHistory : new JArray(); sidechainNode.ConfirmedBalanceFed = this.is50K ? ((NodeDataServiceSidechainMultisig)nodeDataServiceSidechain).FedWalletBalance.confirmedBalance : -1; sidechainNode.UnconfirmedBalanceFed = this.is50K ? ((NodeDataServiceSidechainMultisig)nodeDataServiceSidechain).FedWalletBalance.unconfirmedBalance : -1; sidechainNode.WebAPIUrl = UriHelper.BuildUri(this.defaultEndpointsSettings.SidechainNode, "/api").ToString(); sidechainNode.SwaggerUrl = UriHelper.BuildUri(this.defaultEndpointsSettings.SidechainNode, "/swagger").ToString(); sidechainNode.SyncingStatus = nodeDataServiceSidechain.NodeStatus.SyncingProgress; sidechainNode.Peers = sidechainPeers; sidechainNode.FederationMembers = sidechainFederationMembers; sidechainNode.BlockHash = nodeDataServiceSidechain.BestHash; sidechainNode.BlockHeight = (int)nodeDataServiceSidechain.NodeStatus.BlockStoreHeight; sidechainNode.MempoolSize = nodeDataServiceSidechain.RawMempool; sidechainNode.CoinTicker = "CRS"; sidechainNode.LogRules = nodeDataServiceSidechain.LogRules; sidechainNode.PoAPendingPolls = nodeDataServiceSidechain.PendingPolls; sidechainNode.Uptime = nodeDataServiceSidechain.NodeStatus.Uptime; sidechainNode.IsMining = this.nodeDataServiceSidechain.NodeDashboardStats?.IsMining ?? false; sidechainNode.AddressIndexer = this.nodeDataServiceSidechain.NodeDashboardStats?.AddressIndexerHeight ?? 0; sidechainNode.HeaderHeight = this.nodeDataServiceSidechain.NodeDashboardStats?.HeaderHeight ?? 0; sidechainNode.AsyncLoops = this.nodeDataServiceSidechain.NodeDashboardStats?.AsyncLoops ?? string.Empty; sidechainNode.OrphanSize = this.nodeDataServiceSidechain.NodeDashboardStats?.OrphanSize ?? string.Empty; sidechainNode.FedMemberCount = this.nodeDataServiceSidechain.FedMemberCount; sidechainNode.BlockProducerHits = this.nodeDataServiceSidechain.NodeDashboardStats?.BlockProducerHits ?? string.Empty; sidechainNode.BlockProducerHitsValue = this.nodeDataServiceSidechain.NodeDashboardStats?.BlockProducerHitsValue ?? 0; sidechainNode.ConfirmedBalance = this.nodeDataServiceSidechain.WalletBalance.confirmedBalance; sidechainNode.UnconfirmedBalance = this.nodeDataServiceSidechain.WalletBalance.unconfirmedBalance; dashboardModel.SidechainNode = sidechainNode; } catch (Exception e) { this.logger.LogError(e, "Unable to fetch feeds."); return; } if (!string.IsNullOrEmpty(this.distributedCache.GetString("DashboardData"))) { if (JToken.DeepEquals(this.distributedCache.GetString("DashboardData"), JsonConvert.SerializeObject(dashboardModel)) == false) { await this.updaterHub.Clients.All.SendAsync("CacheIsDifferent"); } } this.distributedCache.SetString("DashboardData", JsonConvert.SerializeObject(dashboardModel)); }
/// <summary> /// Retrieve all node information and store it in IDistributedCache object /// </summary> private async Task BuildCacheAsync(bool mainChainUp, bool sideChainUp) { this.logger.LogInformation($"Refresh the Dashboard Data"); // Clear the cached dashboard data. await this.distributedCache.RemoveAsync("DashboardData").ConfigureAwait(false); var dashboardModel = new DashboardModel { Status = true, MiningPublicKeys = nodeDataServiceMainchain.FedInfoResponse?.Content?.federationMultisigPubKeys ?? new JArray() }; var stratisPeers = new List <Peer>(); var stratisFederationMembers = new List <Peer>(); var sidechainPeers = new List <Peer>(); var sidechainFederationMembers = new List <Peer>(); if (mainChainUp) { await nodeDataServiceMainchain.Update().ConfigureAwait(false); try { if (this.multiSigNode) { this.ParsePeers(nodeDataServiceMainchain, stratisPeers, stratisFederationMembers); } else { this.ParsePeers(nodeDataServiceMainchain, stratisPeers); } } catch (Exception e) { this.logger.LogError(e, "Unable to parse peer data for the mainchain."); } try { var mainchainNode = new StratisNodeModel { History = this.multiSigNode ? ((MultiSigService)nodeDataServiceMainchain).WalletHistory : new JArray(), ConfirmedBalanceFed = this.multiSigNode ? ((MultiSigService)nodeDataServiceMainchain).FedWalletBalance.confirmedBalance : -1, UnconfirmedBalanceFed = this.multiSigNode ? ((MultiSigService)nodeDataServiceMainchain).FedWalletBalance.unconfirmedBalance : -1, WebAPIUrl = UriHelper.BuildUri(this.defaultEndpointsSettings.StratisNode, "/api").ToString(), SwaggerUrl = UriHelper.BuildUri(this.defaultEndpointsSettings.StratisNode, "/swagger").ToString(), SyncingStatus = nodeDataServiceMainchain.NodeStatus.SyncingProgress, Peers = stratisPeers, FederationMembers = stratisFederationMembers, BlockHash = nodeDataServiceMainchain.BestHash, BlockHeight = (int)nodeDataServiceMainchain.NodeStatus.BlockStoreHeight, HeaderHeight = (int)nodeDataServiceMainchain.NodeStatus.HeaderHeight, MempoolSize = nodeDataServiceMainchain.RawMempool, LogRules = nodeDataServiceMainchain.LogRules, Uptime = nodeDataServiceMainchain.NodeStatus.Uptime, AddressIndexer = this.nodeDataServiceMainchain.AddressIndexerHeight, OrphanSize = this.nodeDataServiceMainchain.NodeDashboardStats?.OrphanSize ?? string.Empty, AgentVersion = this.nodeDataServiceMainchain.NodeStatus.Version }; dashboardModel.MainchainNode = mainchainNode; this.successfullyBuilt = true; } catch (Exception ex) { this.logger.LogError(ex, "Unable to refresh the mainchain feed."); } } if (sideChainUp) { await nodeDataServiceSidechain.Update().ConfigureAwait(false); try { if (this.multiSigNode) { this.ParsePeers(nodeDataServiceSidechain, sidechainPeers, sidechainFederationMembers); } else { this.ParsePeers(nodeDataServiceSidechain, sidechainPeers); } } catch (Exception e) { this.logger.LogError(e, "Unable to parse peer data for the sidechain."); } try { // Sidechain Node var sidechainNode = new SidechainNodeModel { History = this.multiSigNode ? ((MultiSigSideChainService)nodeDataServiceSidechain).WalletHistory : new JArray(), ConfirmedBalanceFed = this.multiSigNode ? ((MultiSigSideChainService)nodeDataServiceSidechain).FedWalletBalance.confirmedBalance : -1, UnconfirmedBalanceFed = this.multiSigNode ? ((MultiSigSideChainService)nodeDataServiceSidechain).FedWalletBalance.unconfirmedBalance : -1, WebAPIUrl = UriHelper.BuildUri(this.defaultEndpointsSettings.SidechainNode, "/api").ToString(), SwaggerUrl = UriHelper.BuildUri(this.defaultEndpointsSettings.SidechainNode, "/swagger").ToString(), SyncingStatus = nodeDataServiceSidechain.NodeStatus.SyncingProgress, Peers = sidechainPeers, FederationMembers = sidechainFederationMembers, BlockHash = nodeDataServiceSidechain.BestHash, BlockHeight = (int)nodeDataServiceSidechain.NodeStatus.BlockStoreHeight, HeaderHeight = (int)nodeDataServiceSidechain.NodeStatus.HeaderHeight, MempoolSize = nodeDataServiceSidechain.RawMempool, AgentVersion = nodeDataServiceSidechain.NodeStatus.Version, LogRules = nodeDataServiceSidechain.LogRules, PoAPendingPolls = nodeDataServiceSidechain.PendingPolls, Uptime = nodeDataServiceSidechain.NodeStatus.Uptime, BlockProducerHits = this.nodeDataServiceSidechain.SidechainMinerStats.BlockProducerHits, BlockProducerHitsValue = this.nodeDataServiceSidechain.SidechainMinerStats.BlockProducerHitsValue, IsMining = this.nodeDataServiceSidechain.SidechainMinerStats.ProducedBlockInLastRound, SidechainMiningAddress = this.nodeDataServiceSidechain.SidechainMinerStats.MiningAddress, OrphanSize = this.nodeDataServiceSidechain.NodeDashboardStats?.OrphanSize ?? string.Empty, FederationMemberCount = this.nodeDataServiceSidechain.FederationMemberCount, ConfirmedBalance = this.nodeDataServiceSidechain.WalletBalance.confirmedBalance, UnconfirmedBalance = this.nodeDataServiceSidechain.WalletBalance.unconfirmedBalance, KickFederationMemberPolls = nodeDataServiceSidechain.KickFederationMememberPendingPolls }; dashboardModel.SidechainNode = sidechainNode; this.successfullyBuilt = true; } catch (Exception ex) { this.logger.LogError(ex, "Unable to refresh the sidechain feed."); } } this.logger.LogInformation("Feeds updated..."); await this.updaterHub.Clients.All.SendAsync("RefreshDashboard").ConfigureAwait(false); this.distributedCache.SetString("DashboardData", JsonConvert.SerializeObject(dashboardModel)); }