Skip to content
Merged
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
2 changes: 1 addition & 1 deletion config.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ var path = require('path');
var fs = require('fs');
var mkdirp = require('mkdirp');

var rootPath = path.normalize(__dirname + '/..'),
var rootPath = path.normalize(__dirname),
env,
db,
port,
Expand Down
4 changes: 2 additions & 2 deletions lib/logger.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
var winston = require('winston');
var config = require('../config/config');
var config = require('../config');

var logger = new winston.Logger({
transports: [
Expand All @@ -10,4 +10,4 @@ var logger = new winston.Logger({
});
logger.transports.console.level = config.loggerLevel;

module.exports.logger = logger;
module.exports = logger;
55 changes: 55 additions & 0 deletions lib/networkmonitor.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
'use strict';

var util = require('util');
var EventEmitter = require('events').EventEmitter;

var bitcore = require('bitcore');
var Networks = bitcore.Networks;
var $ = bitcore.util.preconditions;
var p2p = require('bitcore-p2p');
var Peer = p2p.Peer;
var Messages = p2p.Messages;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you sort this list? A good practice is to separate it in 3 groups:

1 - Third party libraries
2 - Our external libraries (bitcore)
3 - Project specific clases

E.g:

var util = require('util');
var Promise = require('bluebird');
var EventEmitter = require('events').EventEmitter;

var bitcore = require('bitcore');
var Networks = bitcore.Networks;
var $ = bitcore.util.preconditions;
var _ = bitcore.deps._;
var p2p = require('bitcore-p2p');
var Peer = p2p.Peer;
var Messages = p2p.Messages;

var EventBus = require('./eventbus');


function NetworkMonitor(eventBus, peer) {
$.checkArgument(eventBus);
$.checkArgument(peer);
this.bus = eventBus;
this.peer = peer;
this.setupPeer(peer);
}
util.inherits(NetworkMonitor, EventEmitter);

NetworkMonitor.create = function(eventBus, opts) {
opts = opts || {};
opts.network = opts.network || Networks.defaultNetwork;
opts.host = opts.host || 'localhost';
opts.port = opts.port || Networks.defaultNetwork.port;

var peer = new Peer(opts.host, opts.port, opts.network);
return new NetworkMonitor(eventBus, peer);
};

NetworkMonitor.prototype.setupPeer = function(peer) {
var self = this;

peer.on('ready', function() {
self.emit('ready');
});
peer.on('inv', function(m) {
// TODO only ask for data if tx or block is unknown
peer.sendMessage(new Messages.GetData(m.inventory));
});
peer.on('tx', function(m) {
self.bus.process(m.transaction);
});
peer.on('block', function(m) {
self.bus.process(m.block);
});
};

NetworkMonitor.prototype.start = function() {
this.peer.connect();
};


module.exports = NetworkMonitor;
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,10 @@
"dependencies": {
"async": "0.9.0",
"bignum": "*",
"bitcore": "0.10.4",
"bitcore": "bitpay/bitcore",
"bitcore-p2p": "bitpay/bitcore-p2p",
"bluebird": "^2.9.12",
"bufferput": "git://github.com/bitpay/node-bufferput.git",
"bufferput": "bitpay/node-bufferput",
"buffertools": "*",
"commander": "^2.3.0",
"cron": "^1.0.4",
Expand Down
98 changes: 98 additions & 0 deletions test/networkmonitor.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
'use strict';

var chai = require('chai');
var should = chai.should();
var bitcore = require('bitcore');
var Networks = bitcore.Networks;
var sinon = require('sinon');
var util = require('util');
var Transaction = bitcore.Transaction;
var Block = bitcore.Block;
var EventEmitter = require('events').EventEmitter;

var NetworkMonitor = require('../lib/networkmonitor');
var EventBus = require('../lib/eventbus');

describe('NetworkMonitor', function() {

// mocks
var mockTx, mockBlock, busMock, peerMock;
beforeEach(function() {
mockTx = new Transaction();
var genesishex = '0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000';
var genesisbuf = new Buffer(genesishex, 'hex');
mockBlock = new Block(genesisbuf);
mockBlock.id = 'asd';
busMock = new EventBus();
peerMock = new EventEmitter();
peerMock.sendMessage = sinon.spy();
peerMock.connect = function() {
this.emit('ready');
this.emit('inv', {
inventory: []
});
this.emit('tx', {
transaction: mockTx
});
this.emit('block', {
block: mockBlock
});
};
});

it('instantiates correctly from constructor', function() {
var nm = new NetworkMonitor(busMock, peerMock);
should.exist(nm);
});

it('instantiates correctly from create', function() {
var nm = NetworkMonitor.create(busMock);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you test that opts are being used to create a Peer object

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should.exist(nm);
});

it('instantiates correctly from create with opts', function() {
var opts = {
network: Networks.livenet,
host: '8.8.8.8',
port: 3001
};
var nm = NetworkMonitor.create(busMock);
should.exist(nm);
});

it('start', function() {
var nm = new NetworkMonitor(busMock, peerMock);
nm.start.bind(nm).should.not.throw();
});

it('broadcasts ready after start', function(cb) {
var nm = new NetworkMonitor(busMock, peerMock);
nm.on('ready', cb)
nm.start();
});

it('sends getdatas when receiving invs', function() {
var nm = new NetworkMonitor(busMock, peerMock);
nm.start();
peerMock.sendMessage.calledOnce.should.equal(true);
});

it('sends transactions to bus', function(cb) {
var nm = new NetworkMonitor(busMock, peerMock);
busMock.register(bitcore.Transaction, function(tx) {
tx.id.should.equal(mockTx.id);
cb();
});
nm.start();
});

it('sends blocks to bus', function(cb) {
var nm = new NetworkMonitor(busMock, peerMock);
busMock.register(bitcore.Block, function(block) {
block.id.should.equal(mockBlock.id);
cb();
});
nm.start();
});

});