Merge pull request #18 from maraoz/add/networkmanager
Add NetworkMonitor
This commit is contained in:
commit
18aefe6a98
@ -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,
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
var winston = require('winston');
|
||||
var config = require('../config/config');
|
||||
var config = require('../config');
|
||||
|
||||
var logger = new winston.Logger({
|
||||
transports: [
|
||||
@ -10,4 +10,4 @@ var logger = new winston.Logger({
|
||||
});
|
||||
logger.transports.console.level = config.loggerLevel;
|
||||
|
||||
module.exports.logger = logger;
|
||||
module.exports = logger;
|
||||
|
||||
55
lib/networkmonitor.js
Normal file
55
lib/networkmonitor.js
Normal file
@ -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;
|
||||
|
||||
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;
|
||||
@ -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",
|
||||
|
||||
98
test/networkmonitor.js
Normal file
98
test/networkmonitor.js
Normal file
@ -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);
|
||||
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();
|
||||
});
|
||||
|
||||
});
|
||||
Loading…
Reference in New Issue
Block a user