added socket functionality
This commit is contained in:
parent
8954fbae16
commit
dd0dcd00da
116
app.js
116
app.js
@ -1,20 +1,18 @@
|
|||||||
var express = require('express.io');
|
var express = require('express');
|
||||||
|
var app = express();
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
var favicon = require('serve-favicon');
|
var favicon = require('serve-favicon');
|
||||||
var bodyParser = require('body-parser');
|
var bodyParser = require('body-parser');
|
||||||
var Node = require('./models/node');
|
|
||||||
|
|
||||||
var Primus = require('primus'),
|
var Primus = require('primus'),
|
||||||
http = require('http'),
|
|
||||||
server,
|
|
||||||
api,
|
api,
|
||||||
client;
|
client;
|
||||||
|
|
||||||
var Collection = require('./models/collection');
|
var Collection = require('./models/collection');
|
||||||
|
|
||||||
var Nodes = new Collection();
|
var Nodes = new Collection();
|
||||||
|
|
||||||
server = http.createServer();
|
var server = require('http').createServer(app);
|
||||||
|
|
||||||
api = new Primus(server, {
|
api = new Primus(server, {
|
||||||
transformer: 'websockets',
|
transformer: 'websockets',
|
||||||
pathname: '/api',
|
pathname: '/api',
|
||||||
@ -23,23 +21,6 @@ api = new Primus(server, {
|
|||||||
|
|
||||||
api.use('emit', require('primus-emit'));
|
api.use('emit', require('primus-emit'));
|
||||||
|
|
||||||
api.on('connection', function(spark) {
|
|
||||||
console.log(spark.id);
|
|
||||||
console.log(spark.address);
|
|
||||||
console.log(spark.query);
|
|
||||||
|
|
||||||
spark.on('hello', function(data){
|
|
||||||
console.log('got hello data from ' + spark.id);
|
|
||||||
console.log(data);
|
|
||||||
Nodes.add(data);
|
|
||||||
});
|
|
||||||
|
|
||||||
spark.on('update', function(data){
|
|
||||||
console.log('got update from ' + spark.id);
|
|
||||||
console.log(data);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
var client = new Primus(server, {
|
var client = new Primus(server, {
|
||||||
transformer: 'websockets',
|
transformer: 'websockets',
|
||||||
pathname: '/primus',
|
pathname: '/primus',
|
||||||
@ -48,65 +29,63 @@ var client = new Primus(server, {
|
|||||||
|
|
||||||
client.use('emit', require('primus-emit'));
|
client.use('emit', require('primus-emit'));
|
||||||
|
|
||||||
client.on('connection', function(spark) {
|
api.on('connection', function(spark) {
|
||||||
console.log(spark);
|
|
||||||
|
|
||||||
console.log(spark.id);
|
console.log(spark.id);
|
||||||
console.log(spark.headers);
|
|
||||||
console.log(spark.address);
|
console.log(spark.address);
|
||||||
console.log(spark.query);
|
console.log(spark.query);
|
||||||
spark.write({give: 'identity'});
|
|
||||||
|
spark.on('hello', function(data){
|
||||||
|
console.log('got hello data from ' + spark.id);
|
||||||
|
console.log(data);
|
||||||
|
|
||||||
|
if(typeof data.id !== 'undefined' && typeof data.info !== 'undefined')
|
||||||
|
{
|
||||||
|
data.ip = spark.address.ip;
|
||||||
|
|
||||||
|
var info = Nodes.add(data);
|
||||||
|
spark.emit('ready');
|
||||||
|
|
||||||
|
client.emit('new', info);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
spark.on('update', function(data){
|
||||||
|
console.log('got update from ' + spark.id);
|
||||||
|
console.log(data);
|
||||||
|
|
||||||
|
if(typeof data.id !== 'undefined' && typeof data.stats !== 'undefined')
|
||||||
|
{
|
||||||
|
var stats = Nodes.update(data.id, data.stats);
|
||||||
|
|
||||||
|
client.emit('updated', stats);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
server.listen(process.env.API_PORT || 3000);
|
client.on('connection', function(spark) {
|
||||||
|
console.log(spark.id);
|
||||||
|
console.log(spark.address);
|
||||||
|
console.log(spark.query);
|
||||||
|
|
||||||
// if(fs.existsSync('./config/nodes.js')){
|
spark.on('ready', function(data){
|
||||||
// config = require('./config/nodes');
|
console.log('got hello data from ' + spark.id);
|
||||||
// } else {
|
console.log(data);
|
||||||
// config = require('./config/nodes.default');
|
|
||||||
// }
|
|
||||||
|
|
||||||
// var Node = require('./models/node');
|
spark.emit('init', {nodes: Nodes.all()});
|
||||||
|
});
|
||||||
var app = express();
|
});
|
||||||
app.http().io();
|
|
||||||
|
|
||||||
// view engine setup
|
// view engine setup
|
||||||
app.set('views', path.join(__dirname, 'views'));
|
app.set('views', path.join(__dirname, 'views'));
|
||||||
app.set('view engine', 'jade');
|
app.set('view engine', 'jade');
|
||||||
|
|
||||||
// uncomment after placing favicon in /public
|
|
||||||
//app.use(favicon(__dirname + '/public/favicon.ico'));
|
//app.use(favicon(__dirname + '/public/favicon.ico'));
|
||||||
app.use(bodyParser.json());
|
app.use(bodyParser.json());
|
||||||
app.use(bodyParser.urlencoded({ extended: false }));
|
app.use(bodyParser.urlencoded({ extended: false }));
|
||||||
app.use(express.static(path.join(__dirname, 'public')));
|
app.use(express.static(path.join(__dirname, 'public')));
|
||||||
|
|
||||||
// var nodes = [],
|
app.get('/', function(req, res) {
|
||||||
// nodeStatus = [],
|
res.render('index', { title: 'Ethereum Network Status' });
|
||||||
// nodeInterval;
|
});
|
||||||
|
|
||||||
// for(i in config) {
|
|
||||||
// nodes[i] = new Node(config[i], i);
|
|
||||||
// console.log(nodes[i]);
|
|
||||||
// nodeStatus[i] = nodes[i].update();
|
|
||||||
// }
|
|
||||||
|
|
||||||
// nodeInterval = setInterval(function(){
|
|
||||||
// for(i in nodes){
|
|
||||||
// app.io.broadcast('update', nodes[i].update());
|
|
||||||
// }
|
|
||||||
// }, 10000);
|
|
||||||
|
|
||||||
// app.get('/', function(req, res) {
|
|
||||||
// res.render('index', { title: 'Ethereum Network Status' });
|
|
||||||
// });
|
|
||||||
|
|
||||||
// app.io.route('ready', function(req) {
|
|
||||||
// req.io.emit('init', {
|
|
||||||
// nodes: nodeStatus
|
|
||||||
// });
|
|
||||||
// console.log('emited');
|
|
||||||
// });
|
|
||||||
|
|
||||||
// catch 404 and forward to error handler
|
// catch 404 and forward to error handler
|
||||||
app.use(function(req, res, next) {
|
app.use(function(req, res, next) {
|
||||||
@ -116,9 +95,6 @@ app.use(function(req, res, next) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// error handlers
|
// error handlers
|
||||||
|
|
||||||
// development error handler
|
|
||||||
// will print stacktrace
|
|
||||||
if (app.get('env') === 'development') {
|
if (app.get('env') === 'development') {
|
||||||
app.use(function(err, req, res, next) {
|
app.use(function(err, req, res, next) {
|
||||||
res.status(err.status || 500);
|
res.status(err.status || 500);
|
||||||
@ -130,7 +106,6 @@ if (app.get('env') === 'development') {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// production error handler
|
// production error handler
|
||||||
// no stacktraces leaked to user
|
|
||||||
app.use(function(err, req, res, next) {
|
app.use(function(err, req, res, next) {
|
||||||
res.status(err.status || 500);
|
res.status(err.status || 500);
|
||||||
res.render('error', {
|
res.render('error', {
|
||||||
@ -139,5 +114,6 @@ app.use(function(err, req, res, next) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
server.listen(process.env.PORT || 3000);
|
||||||
|
|
||||||
module.exports = app;
|
module.exports = app;
|
||||||
|
8
bin/www
8
bin/www
@ -2,8 +2,8 @@
|
|||||||
var debug = require('debug')('eth-netstats');
|
var debug = require('debug')('eth-netstats');
|
||||||
var app = require('../app');
|
var app = require('../app');
|
||||||
|
|
||||||
app.set('port', process.env.PORT || 3000);
|
// app.set('port', process.env.PORT || 3000);
|
||||||
|
|
||||||
var server = app.listen(app.get('port'), function() {
|
// var server = app.listen(app.get('port'), function() {
|
||||||
debug('Express server listening on port ' + server.address().port);
|
// debug('Express server listening on port ' + server.address().port);
|
||||||
});
|
// });
|
||||||
|
@ -10,44 +10,63 @@ var Collection = function Collection()
|
|||||||
|
|
||||||
Collection.prototype.add = function(data)
|
Collection.prototype.add = function(data)
|
||||||
{
|
{
|
||||||
if(typeof data.id == 'undefined')
|
var node = this.getNodeOrNew({ id : data.id }, data);
|
||||||
return false;
|
|
||||||
|
|
||||||
var node = this.getNodeOrNew({ id : data.id });
|
return node.getInfo();
|
||||||
|
|
||||||
node.info = data.info;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Collection.prototype.get = function(id)
|
Collection.prototype.update = function(id, stats)
|
||||||
{
|
{
|
||||||
return this.getNode(id);
|
var node = this.getNode({ id: id });
|
||||||
|
|
||||||
|
if(!node)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
node.stats = stats;
|
||||||
|
|
||||||
|
console.log(this.all());
|
||||||
|
|
||||||
|
return node.getStats();
|
||||||
}
|
}
|
||||||
|
|
||||||
Collection.prototype.getIndex = function(search)
|
Collection.prototype.getIndex = function(search)
|
||||||
{
|
{
|
||||||
return _.findIndex(this._list, search);
|
return _.findIndex(this._list, search);
|
||||||
|
|
||||||
return (index >= 0 ? index : false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Collection.prototype.getNode = function(search)
|
Collection.prototype.getNode = function(search)
|
||||||
{
|
{
|
||||||
var index = this.getIndex(search);
|
var index = this.getIndex(search);
|
||||||
|
|
||||||
if(index)
|
if(index >= 0)
|
||||||
return this._list[index];
|
return this._list[index];
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Collection.prototype.getIndexOrNew = function(search)
|
Collection.prototype.getNodeByIndex = function(index)
|
||||||
{
|
{
|
||||||
var index = this.getIndex(search) || this._list.push(new Node());
|
if(this._list[index])
|
||||||
|
return this._list[index];
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Collection.prototype.getNodeOrNew = function(search)
|
Collection.prototype.getIndexOrNew = function(search, data)
|
||||||
{
|
{
|
||||||
return this.getNode(this.getIndexOrNew(search));
|
var index = this.getIndex(search);
|
||||||
|
|
||||||
|
return (index >= 0 ? index : this._list.push(new Node(data)) - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Collection.prototype.getNodeOrNew = function(search, data)
|
||||||
|
{
|
||||||
|
return this.getNodeByIndex(this.getIndexOrNew(search, data));
|
||||||
|
}
|
||||||
|
|
||||||
|
Collection.prototype.all = function()
|
||||||
|
{
|
||||||
|
return this._list;
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = Collection;
|
module.exports = Collection;
|
@ -1,6 +1,6 @@
|
|||||||
var geoip = require('geoip-lite');
|
var geoip = require('geoip-lite');
|
||||||
|
|
||||||
var Node = function Node()
|
var Node = function Node(data)
|
||||||
{
|
{
|
||||||
this.id = null;
|
this.id = null;
|
||||||
this.info = {};
|
this.info = {};
|
||||||
@ -15,20 +15,35 @@ var Node = function Node()
|
|||||||
block: {},
|
block: {},
|
||||||
blocktimeAvg: 0,
|
blocktimeAvg: 0,
|
||||||
difficulty: [],
|
difficulty: [],
|
||||||
uptime: {
|
uptime: 0,
|
||||||
down: 0,
|
|
||||||
inc: 0,
|
|
||||||
total: 0
|
|
||||||
},
|
|
||||||
lastUpdate: 0
|
lastUpdate: 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if(typeof data.id !== 'undefined')
|
||||||
|
this.id = data.id;
|
||||||
|
|
||||||
|
if(typeof data.info !== 'undefined')
|
||||||
|
this.info = data.info;
|
||||||
|
|
||||||
|
if(typeof data.ip !== 'undefined')
|
||||||
|
this.setGeo(data.ip);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Node.prototype.setGeo = function()
|
Node.prototype.setGeo = function(ip)
|
||||||
{
|
{
|
||||||
this.geo = geoip.lookup(ip);
|
this.geo = geoip.lookup(ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Node.prototype.getInfo = function()
|
||||||
|
{
|
||||||
|
return {id: this.id, info: this.info, geo: this.geo};
|
||||||
|
}
|
||||||
|
|
||||||
|
Node.prototype.getStats = function()
|
||||||
|
{
|
||||||
|
return {id: this.id, stats: this.stats};
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = Node;
|
module.exports = Node;
|
||||||
|
@ -18,10 +18,27 @@ function StatsCtrl($scope, $filter, socket, _) {
|
|||||||
// Socket listeners
|
// Socket listeners
|
||||||
// ----------------
|
// ----------------
|
||||||
|
|
||||||
|
socket = new Primus();
|
||||||
|
|
||||||
|
socket.on('open', function open() {
|
||||||
socket.emit('ready');
|
socket.emit('ready');
|
||||||
|
console.log('The connection has been opened.');
|
||||||
|
}).on('end', function end() {
|
||||||
|
self._socket = false;
|
||||||
|
}).on('error', function error(err) {
|
||||||
|
console.log(err);
|
||||||
|
}).on('reconnecting', function reconnecting(opts) {
|
||||||
|
console.log('We are scheduling a reconnect operation', opts);
|
||||||
|
}).on('data', function incoming(data) {
|
||||||
|
console.log('Received some data', data);
|
||||||
|
});
|
||||||
|
|
||||||
|
// socket.emit('ready', 'test');
|
||||||
|
|
||||||
socket.on('init', function(data)
|
socket.on('init', function(data)
|
||||||
{
|
{
|
||||||
|
console.log(data);
|
||||||
|
|
||||||
$scope.nodes = data.nodes;
|
$scope.nodes = data.nodes;
|
||||||
|
|
||||||
updateStats();
|
updateStats();
|
||||||
@ -29,6 +46,8 @@ function StatsCtrl($scope, $filter, socket, _) {
|
|||||||
|
|
||||||
socket.on('update', function(data)
|
socket.on('update', function(data)
|
||||||
{
|
{
|
||||||
|
console.log(data);
|
||||||
|
|
||||||
$scope.nodes[data.id] = data;
|
$scope.nodes[data.id] = data;
|
||||||
|
|
||||||
updateStats();
|
updateStats();
|
||||||
@ -51,7 +70,7 @@ function StatsCtrl($scope, $filter, socket, _) {
|
|||||||
}).stats.block.timestamp;
|
}).stats.block.timestamp;
|
||||||
|
|
||||||
$scope.upTimeTotal = _.reduce($scope.nodes, function(total, node) {
|
$scope.upTimeTotal = _.reduce($scope.nodes, function(total, node) {
|
||||||
return total + node.stats.uptime.total;
|
return total + node.stats.uptime;
|
||||||
}, 0) / $scope.nodes.length;
|
}, 0) / $scope.nodes.length;
|
||||||
|
|
||||||
$scope.map = _.map($scope.nodes, function(node) {
|
$scope.map = _.map($scope.nodes, function(node) {
|
||||||
@ -69,5 +88,7 @@ function StatsCtrl($scope, $filter, socket, _) {
|
|||||||
longitude: 0
|
longitude: 0
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$scope.$apply();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,10 +1,4 @@
|
|||||||
(function() {
|
(function() {
|
||||||
var socket = io.connect();
|
|
||||||
|
|
||||||
socket.on('init', function(data){
|
|
||||||
console.log(data);
|
|
||||||
});
|
|
||||||
|
|
||||||
$('body').on('mouseenter', '[data-toggle="tooltip"]', function( event ) {
|
$('body').on('mouseenter', '[data-toggle="tooltip"]', function( event ) {
|
||||||
$(this).tooltip('show');
|
$(this).tooltip('show');
|
||||||
}).on('mouseleave', '[data-toggle="tooltip"]', function( event ) {
|
}).on('mouseleave', '[data-toggle="tooltip"]', function( event ) {
|
||||||
|
@ -3,27 +3,28 @@
|
|||||||
/* Services */
|
/* Services */
|
||||||
|
|
||||||
app.factory('socket', function ($rootScope) {
|
app.factory('socket', function ($rootScope) {
|
||||||
var socket = io.connect();
|
var socket;// = new Primus();
|
||||||
return {
|
return socket;
|
||||||
on: function (eventName, callback) {
|
// return {
|
||||||
socket.on(eventName, function () {
|
// on: function (eventName, callback) {
|
||||||
var args = arguments;
|
// socket.on(eventName, function () {
|
||||||
$rootScope.$apply(function () {
|
// var args = arguments;
|
||||||
callback.apply(socket, args);
|
// $rootScope.$apply(function () {
|
||||||
});
|
// callback.apply(socket, args);
|
||||||
});
|
// });
|
||||||
},
|
// });
|
||||||
emit: function (eventName, data, callback) {
|
// },
|
||||||
socket.emit(eventName, data, function () {
|
// emit: function (eventName, data, callback) {
|
||||||
var args = arguments;
|
// socket.emit(eventName, data, function () {
|
||||||
$rootScope.$apply(function () {
|
// var args = arguments;
|
||||||
if (callback) {
|
// $rootScope.$apply(function () {
|
||||||
callback.apply(socket, args);
|
// if (callback) {
|
||||||
}
|
// callback.apply(socket, args);
|
||||||
});
|
// }
|
||||||
})
|
// });
|
||||||
}
|
// })
|
||||||
};
|
// }
|
||||||
|
// };
|
||||||
});
|
});
|
||||||
|
|
||||||
var underscore = angular.module('underscore', []);
|
var underscore = angular.module('underscore', []);
|
||||||
|
@ -75,10 +75,10 @@ block content
|
|||||||
tbody
|
tbody
|
||||||
tr(ng-repeat='node in nodes', class="{{ node.stats | mainClass : bestBlock }}")
|
tr(ng-repeat='node in nodes', class="{{ node.stats | mainClass : bestBlock }}")
|
||||||
td(rel="{{node.id}}")
|
td(rel="{{node.id}}")
|
||||||
span(data-toggle="tooltip", data-placement="top", data-original-title="{{node.geo | geoTooltip}}") {{node.name}}
|
span(data-toggle="tooltip", data-placement="top", data-original-title="{{node.geo | geoTooltip}}") {{node.info.name}}
|
||||||
div.small {{node.ip}}
|
div.small {{node.info.ip}}
|
||||||
td {{node.type}}
|
td {{node.info.node}}
|
||||||
div.small {{node.os}}
|
div.small {{node.info.os}}, {{node.info.os_v}}
|
||||||
td(class="{{ node.stats.peers | peerClass }}") {{node.stats.peers}}
|
td(class="{{ node.stats.peers | peerClass }}") {{node.stats.peers}}
|
||||||
td(class="{{ node.stats.mining | miningClass }}")
|
td(class="{{ node.stats.mining | miningClass }}")
|
||||||
i(class="{{ node.stats.mining | miningIconClass }}")
|
i(class="{{ node.stats.mining | miningIconClass }}")
|
||||||
@ -87,4 +87,4 @@ block content
|
|||||||
span.small {{node.stats.block.hash}}
|
span.small {{node.stats.block.hash}}
|
||||||
div.small Difficulty: {{node.stats.block.difficulty | gasFilter}} | Gas used: {{node.stats.block.gasUsed | gasFilter}} | Min gas price: {{node.stats.block.minGasPrice | gasFilter}} | Gas limit: {{node.stats.block.gasLimit | gasFilter}}
|
div.small Difficulty: {{node.stats.block.difficulty | gasFilter}} | Gas used: {{node.stats.block.gasUsed | gasFilter}} | Min gas price: {{node.stats.block.minGasPrice | gasFilter}} | Gas limit: {{node.stats.block.gasLimit | gasFilter}}
|
||||||
td(am-time-ago="node.stats.block.timestamp", am-preprocess="unix", class="{{ node.stats.block.timestamp | timeClass }}") ∞
|
td(am-time-ago="node.stats.block.timestamp", am-preprocess="unix", class="{{ node.stats.block.timestamp | timeClass }}") ∞
|
||||||
td(class="{{ node.stats.uptime.total | upTimeClass }}") {{ node.stats.uptime.total | upTimeFilter }}
|
td(class="{{ node.stats.uptime | upTimeClass }}") {{ node.stats.uptime | upTimeFilter }}
|
||||||
|
@ -12,7 +12,7 @@ html(ng-app="netStatsApp")
|
|||||||
block content
|
block content
|
||||||
|
|
||||||
script(src="/js/lib/angular.min.js")
|
script(src="/js/lib/angular.min.js")
|
||||||
script(src="/socket.io/socket.io.js")
|
script(src="/primus/primus.js")
|
||||||
script(src="/js/lib/underscore.min.js")
|
script(src="/js/lib/underscore.min.js")
|
||||||
script(src="/js/lib/jquery.min.js")
|
script(src="/js/lib/jquery.min.js")
|
||||||
script(src="/js/lib/d3.v3.min.js")
|
script(src="/js/lib/d3.v3.min.js")
|
||||||
|
Loading…
Reference in New Issue
Block a user