Browse Source

Fix #40 - Peer details page

fix-133-memory-crash
Dan Janosik 6 years ago
parent
commit
cd0e2b67b1
  1. 81
      app/api/coreApi.js
  2. 7
      app/api/rpcApi.js
  3. 13
      routes/baseActionsRouter.js
  4. 2
      views/layout.pug
  5. 86
      views/peers.pug

81
app/api/coreApi.js

@ -70,6 +70,84 @@ function getUptimeSeconds() {
return tryCacheThenRpcApi(miscCache, "getUptimeSeconds", 1000, rpcApi.getUptimeSeconds); return tryCacheThenRpcApi(miscCache, "getUptimeSeconds", 1000, rpcApi.getUptimeSeconds);
} }
function getPeerSummary() {
return new Promise(function(resolve, reject) {
tryCacheThenRpcApi(miscCache, "getpeerinfo", 1000, rpcApi.getPeerInfo).then(function(getpeerinfo) {
var result = {};
result.getpeerinfo = getpeerinfo;
var versionSummaryMap = {};
for (var i = 0; i < getpeerinfo.length; i++) {
var x = getpeerinfo[i];
if (versionSummaryMap[x.subver] == null) {
versionSummaryMap[x.subver] = 0;
}
versionSummaryMap[x.subver]++;
}
var versionSummary = [];
for (var prop in versionSummaryMap) {
if (versionSummaryMap.hasOwnProperty(prop)) {
versionSummary.push([prop, versionSummaryMap[prop]]);
}
}
versionSummary.sort(function(a, b) {
if (b[1] > a[1]) {
return 1;
} else if (b[1] < a[1]) {
return -1;
} else {
return a[0].localeCompare(b[0]);
}
});
var servicesSummaryMap = {};
for (var i = 0; i < getpeerinfo.length; i++) {
var x = getpeerinfo[i];
if (servicesSummaryMap[x.services] == null) {
servicesSummaryMap[x.services] = 0;
}
servicesSummaryMap[x.services]++;
}
var servicesSummary = [];
for (var prop in servicesSummaryMap) {
if (servicesSummaryMap.hasOwnProperty(prop)) {
servicesSummary.push([prop, servicesSummaryMap[prop]]);
}
}
servicesSummary.sort(function(a, b) {
if (b[1] > a[1]) {
return 1;
} else if (b[1] < a[1]) {
return -1;
} else {
return a[0].localeCompare(b[0]);
}
});
result.versionSummary = versionSummary;
result.servicesSummary = servicesSummary;
resolve(result);
});
});
}
function getMempoolStats() { function getMempoolStats() {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
tryCacheThenRpcApi(miscCache, "getRawMempool", 5000, rpcApi.getRawMempool).then(function(result) { tryCacheThenRpcApi(miscCache, "getRawMempool", 5000, rpcApi.getRawMempool).then(function(result) {
@ -430,5 +508,6 @@ module.exports = {
getHelp: getHelp, getHelp: getHelp,
getRpcMethodHelp: getRpcMethodHelp, getRpcMethodHelp: getRpcMethodHelp,
getAddress: getAddress, getAddress: getAddress,
logCacheSizes: logCacheSizes logCacheSizes: logCacheSizes,
getPeerSummary: getPeerSummary
}; };

7
app/api/rpcApi.js

@ -23,6 +23,10 @@ function getUptimeSeconds() {
return getRpcData("uptime"); return getRpcData("uptime");
} }
function getPeerInfo() {
return getRpcData("getpeerinfo");
}
function getRawMempool() { function getRawMempool() {
return getRpcDataWithParams("getrawmempool", true); return getRpcDataWithParams("getrawmempool", true);
} }
@ -405,5 +409,6 @@ module.exports = {
getUptimeSeconds: getUptimeSeconds, getUptimeSeconds: getUptimeSeconds,
getHelp: getHelp, getHelp: getHelp,
getRpcMethodHelp: getRpcMethodHelp, getRpcMethodHelp: getRpcMethodHelp,
getAddress: getAddress getAddress: getAddress,
getPeerInfo: getPeerInfo
}; };

13
routes/baseActionsRouter.js

@ -106,6 +106,19 @@ router.get("/mempool-summary", function(req, res) {
}); });
}); });
router.get("/peers", function(req, res) {
coreApi.getPeerSummary().then(function(peerSummary) {
res.locals.peerSummary = peerSummary;
res.render("peers");
}).catch(function(err) {
res.locals.userMessage = "Error: " + err;
res.render("peers");
});
});
router.post("/connect", function(req, res) { router.post("/connect", function(req, res) {
var host = req.body.host; var host = req.body.host;
var port = req.body.port; var port = req.body.port;

2
views/layout.pug

@ -87,6 +87,8 @@ html
ul(class="nav") ul(class="nav")
li(class="nav-item") li(class="nav-item")
a(href="/node-status", class="nav-link") Node Status a(href="/node-status", class="nav-link") Node Status
li(class="nav-item")
a(href="/peers", class="nav-link") Peers
li(class="nav-item") li(class="nav-item")
a(href="/rpc-browser", class="nav-link") RPC Browser a(href="/rpc-browser", class="nav-link") RPC Browser
li(class="nav-item") li(class="nav-item")

86
views/peers.pug

@ -0,0 +1,86 @@
extends layout
block headContent
title Peers
block content
h1(class="h2") Peers
hr
ul(class='nav nav-tabs mb-3')
li(class="nav-item")
a(data-toggle="tab", href="#tab-summary", class="nav-link active", role="tab") Summary
li(class="nav-item")
a(data-toggle="tab", href="#tab-details", class="nav-link", role="tab") Details
li(class="nav-item")
a(data-toggle="tab", href="#tab-raw", class="nav-link", role="tab") Raw
div(class="tab-content")
div(id="tab-summary", class="tab-pane active", role="tabpanel")
h2(class="h3") Versions
hr
table(class="table table-striped table-responsive-sm mt-4")
thead
tr
th
th(class="data-header") Version
th(class="data-header") Count
tbody
each item, index in peerSummary.versionSummary
tr
th(class="data-cell") #{index + 1}
td(class="data-cell") #{item[0]}
td(class="data-cell") #{item[1].toLocaleString()}
h2(class="h3") Services
hr
table(class="table table-striped table-responsive-sm mt-4")
thead
tr
th
th(class="data-header") Services
th(class="data-header") Count
tbody
each item, index in peerSummary.servicesSummary
tr
th(class="data-cell") #{index + 1}
td(class="data-cell") #{item[0]}
td(class="data-cell") #{item[1].toLocaleString()}
div(id="tab-details", class="tab-pane", role="tabpanel")
h2(class="h3") Peers List
hr
table(class="table table-striped table-responsive-sm mt-4")
thead
tr
th
th(class="data-header") Version
th(class="data-header") Address
th(class="data-header") Services
th(class="data-header") Last Send / Receive
tbody
each item, index in peerSummary.getpeerinfo
- var lastSendAgo = moment.duration(moment.utc(new Date()).diff(moment.utc(new Date(parseInt(item.lastsend) * 1000)))).format().replace("milliseconds", "ms");
- var lastRecvAgo = moment.duration(moment.utc(new Date()).diff(moment.utc(new Date(parseInt(item.lastrecv) * 1000)))).format().replace("milliseconds", "ms");
tr
th(class="data-cell") #{index + 1}
td(class="data-cell") #{item.subver}
td(class="data-cell") #{item.addr}
td(class="data-cell") #{item.services}
td(class="data-cell") #{lastSendAgo} / #{lastRecvAgo}
div(id="tab-raw", class="tab-pane", role="tabpanel")
pre
code #{JSON.stringify(peerSummary.getpeerinfo, null, 4)}
Loading…
Cancel
Save