From bd76632f46ce784eb7be964bcfe20125466ba107 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Fri, 27 Feb 2015 18:56:09 -0300 Subject: [PATCH 1/4] add BitcoreNode model --- config/default.yml | 9 ++++---- index.js | 51 ++++++++++++++++++++++++++++++++++-------- lib/eventbus.js | 2 +- lib/networkmonitor.js | 6 ++++- package.json | 3 ++- test/networkmonitor.js | 4 ++-- 6 files changed, 57 insertions(+), 18 deletions(-) diff --git a/config/default.yml b/config/default.yml index 007e6881..a5c41ca3 100644 --- a/config/default.yml +++ b/config/default.yml @@ -1,4 +1,5 @@ -NetworkMonitor: - network: livenet - host: localhost - port: 8333 +BitcoreNode: + NetworkMonitor: + network: livenet + host: localhost + port: 8333 diff --git a/index.js b/index.js index fe11a90c..0d8fe38f 100755 --- a/index.js +++ b/index.js @@ -2,25 +2,58 @@ var config = require('config'); +var util = require('util'); +var EventEmitter = require('eventemitter2').EventEmitter2; var bitcore = require('bitcore'); +var Unit = bitcore.Unit; var NetworkMonitor = require('./lib/networkmonitor'); var EventBus = require('./lib/eventbus'); +var BitcoreNode = function(bus, nm) { + var self = this; + this.bus = bus; + this.nm = nm; -var bus = new EventBus(); -var nm = NetworkMonitor.create(bus, config.get('NetworkMonitor')); + this.bus.register(bitcore.Transaction, function(tx) { + console.log('Transaction:', tx.id, 'total_out:', Unit.fromSatoshis(tx.outputAmount).toBTC()); + }); -bus.register(bitcore.Transaction, function(tx) { - console.log('Transaction:', tx.id); -}); + this.bus.register(bitcore.Block, function(block) { + console.log('Block:', block.id); + }); -bus.register(bitcore.Block, function(block) { - console.log('Block:', block.id); -}); + this.bus.onAny(function(value) { + self.emit(this.event, value); + }); + this.nm.on('error', function(err) { + self.emit('error', err); + }); +}; +util.inherits(BitcoreNode, EventEmitter); -nm.start(); +BitcoreNode.create = function(opts) { + var bus = new EventBus(); + var nm = NetworkMonitor.create(bus, opts.NetworkMonitor); + return new BitcoreNode(bus, nm); +}; + +BitcoreNode.prototype.start = function() { + this.nm.start(); +}; +if (require.main === module) { + var node = BitcoreNode.create(config.get('BitcoreNode')); + node.start(); + node.on('error', function(err) { + if (err.code === 'ECONNREFUSED') { + console.log('Connection to bitcoind failed'); + } else { + console.log('Unrecognized error: ', err); + } + }); +} +module.exports = BitcoreNode; diff --git a/lib/eventbus.js b/lib/eventbus.js index 20da9316..2859d9a8 100644 --- a/lib/eventbus.js +++ b/lib/eventbus.js @@ -5,7 +5,7 @@ var bitcore = require('bitcore'); var Promise = require('bluebird'); var $ = bitcore.util.preconditions; var _ = bitcore.deps._; -var EventEmitter = require('events').EventEmitter; +var EventEmitter = require('eventemitter2').EventEmitter2; var util = require('util'); function EventBus() { diff --git a/lib/networkmonitor.js b/lib/networkmonitor.js index 2f5a442d..e0194b2f 100644 --- a/lib/networkmonitor.js +++ b/lib/networkmonitor.js @@ -1,7 +1,7 @@ 'use strict'; var util = require('util'); -var EventEmitter = require('events').EventEmitter; +var EventEmitter = require('eventemitter2').EventEmitter2; var bitcore = require('bitcore'); var Networks = bitcore.Networks; @@ -44,6 +44,10 @@ NetworkMonitor.prototype.setupPeer = function(peer) { peer.on('block', function(m) { self.bus.process(m.block); }); + peer.on('error', function(err) { + self.emit('error', err); + }); + }; NetworkMonitor.prototype.start = function() { diff --git a/package.json b/package.json index 20437458..6ccafa87 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,8 @@ "compression": "^1.4.1", "cors": "^2.5.3", "cron": "^1.0.4", - "express": "4.11.1", + "eventemitter2": "^0.4.14", + "express": "~3.4.7", "glob": "*", "js-yaml": "^3.2.7", "leveldown": "~0.10.0", diff --git a/test/networkmonitor.js b/test/networkmonitor.js index f084e3f4..ab84dfaa 100644 --- a/test/networkmonitor.js +++ b/test/networkmonitor.js @@ -8,7 +8,7 @@ var sinon = require('sinon'); var util = require('util'); var Transaction = bitcore.Transaction; var Block = bitcore.Block; -var EventEmitter = require('events').EventEmitter; +var EventEmitter = require('eventemitter2').EventEmitter2; var NetworkMonitor = require('../lib/networkmonitor'); var EventBus = require('../lib/eventbus'); @@ -67,7 +67,7 @@ describe('NetworkMonitor', function() { it('broadcasts ready after start', function(cb) { var nm = new NetworkMonitor(busMock, peerMock); - nm.on('ready', cb) + nm.on('ready', cb); nm.start(); }); From 54a98d09e593ded5eaab32bbd1a34a9efecb7842 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Fri, 27 Feb 2015 18:59:45 -0300 Subject: [PATCH 2/4] express version corrected --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6ccafa87..a349d3cc 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "cors": "^2.5.3", "cron": "^1.0.4", "eventemitter2": "^0.4.14", - "express": "~3.4.7", + "express": "4.11.1", "glob": "*", "js-yaml": "^3.2.7", "leveldown": "~0.10.0", From 9065497cc942eeff55a6bd4753b6c3138ef8b781 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Mon, 2 Mar 2015 15:16:52 -0300 Subject: [PATCH 3/4] fix tests --- index.js | 3 ++- test/eventbus.js | 14 ++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/index.js b/index.js index 0d8fe38f..4b36501e 100755 --- a/index.js +++ b/index.js @@ -17,7 +17,8 @@ var BitcoreNode = function(bus, nm) { this.nm = nm; this.bus.register(bitcore.Transaction, function(tx) { - console.log('Transaction:', tx.id, 'total_out:', Unit.fromSatoshis(tx.outputAmount).toBTC()); + var tout = Unit.fromSatoshis(tx.outputAmount).toBTC(); + console.log('Transaction:', tx.id, 'total_out:', tout, 'BTC'); }); this.bus.register(bitcore.Block, function(block) { diff --git a/test/eventbus.js b/test/eventbus.js index b890f290..8c4989e9 100644 --- a/test/eventbus.js +++ b/test/eventbus.js @@ -57,18 +57,20 @@ describe('EventBus', function() { bus.process(foo); }); var b1 = new BarEvent(); - b1.x = 42; + b1.y = 42; var b2 = new BarEvent(); - b2.x = 69; - it('foo returns two bars', function() { + b2.y = 69; + it('foo returns two bars', function(cb) { var bus = new EventBus(); var spy = sinon.spy(); bus.register(FooEvent, function() { return [b1, b2]; }); bus.register(BarEvent, spy); - bus.process(foo); - spy.callCount.should.equal(2); + bus.process(foo).then(function() { + spy.callCount.should.equal(2); + cb(); + }); }); it('foo returns two bars and emits external events', function(cb) { var bus = new EventBus(); @@ -104,7 +106,7 @@ describe('EventBus', function() { return Promise.resolve([b1, b2]).delay(1); }); bus.register(BarEvent, function(e) { - if (e.x === b1.x) { + if (e.y === b1.y) { throw err; } }); From b3114b2152edac2aec2ad0a632969a64a5849963 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Mon, 2 Mar 2015 15:51:59 -0300 Subject: [PATCH 4/4] test BitcoreNode --- index.js | 43 +----------------------------------- lib/node.js | 50 ++++++++++++++++++++++++++++++++++++++++++ test/networkmonitor.js | 7 ++++++ test/node.js | 49 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 42 deletions(-) create mode 100644 lib/node.js create mode 100644 test/node.js diff --git a/index.js b/index.js index 4b36501e..3ad4398a 100755 --- a/index.js +++ b/index.js @@ -1,49 +1,8 @@ 'use strict'; - var config = require('config'); -var util = require('util'); -var EventEmitter = require('eventemitter2').EventEmitter2; - -var bitcore = require('bitcore'); -var Unit = bitcore.Unit; - -var NetworkMonitor = require('./lib/networkmonitor'); -var EventBus = require('./lib/eventbus'); - -var BitcoreNode = function(bus, nm) { - var self = this; - this.bus = bus; - this.nm = nm; - - this.bus.register(bitcore.Transaction, function(tx) { - var tout = Unit.fromSatoshis(tx.outputAmount).toBTC(); - console.log('Transaction:', tx.id, 'total_out:', tout, 'BTC'); - }); - - this.bus.register(bitcore.Block, function(block) { - console.log('Block:', block.id); - }); - - this.bus.onAny(function(value) { - self.emit(this.event, value); - }); - this.nm.on('error', function(err) { - self.emit('error', err); - }); -}; -util.inherits(BitcoreNode, EventEmitter); - -BitcoreNode.create = function(opts) { - var bus = new EventBus(); - var nm = NetworkMonitor.create(bus, opts.NetworkMonitor); - return new BitcoreNode(bus, nm); -}; - -BitcoreNode.prototype.start = function() { - this.nm.start(); -}; +var BitcoreNode = require('./lib/node.js'); if (require.main === module) { var node = BitcoreNode.create(config.get('BitcoreNode')); diff --git a/lib/node.js b/lib/node.js new file mode 100644 index 00000000..198fbb76 --- /dev/null +++ b/lib/node.js @@ -0,0 +1,50 @@ +'use strict'; + +var util = require('util'); +var EventEmitter = require('eventemitter2').EventEmitter2; + +var bitcore = require('bitcore'); +var Unit = bitcore.Unit; +var $ = bitcore.util.preconditions; + +var NetworkMonitor = require('./networkmonitor'); +var EventBus = require('./eventbus'); + +var BitcoreNode = function(bus, nm) { + $.checkArgument(bus); + $.checkArgument(nm); + var self = this; + this.bus = bus; + this.nm = nm; + + this.bus.register(bitcore.Transaction, function(tx) { + var tout = Unit.fromSatoshis(tx.outputAmount).toBTC(); + console.log('Transaction:', tx.id); + console.log('\ttotal_out:', tout, 'BTC'); + }); + + this.bus.register(bitcore.Block, function(block) { + console.log('Block:', block.id); + }); + + this.bus.onAny(function(value) { + self.emit(this.event, value); + }); + this.nm.on('error', function(err) { + self.emit('error', err); + }); +}; +util.inherits(BitcoreNode, EventEmitter); + +BitcoreNode.create = function(opts) { + opts = opts || {}; + var bus = new EventBus(); + var nm = NetworkMonitor.create(bus, opts.NetworkMonitor); + return new BitcoreNode(bus, nm); +}; + +BitcoreNode.prototype.start = function() { + this.nm.start(); +}; + +module.exports = BitcoreNode; diff --git a/test/networkmonitor.js b/test/networkmonitor.js index ab84dfaa..28660ca1 100644 --- a/test/networkmonitor.js +++ b/test/networkmonitor.js @@ -65,6 +65,13 @@ describe('NetworkMonitor', function() { nm.start.bind(nm).should.not.throw(); }); + it('broadcasts errors in underlying peer', function(cb) { + var nm = new NetworkMonitor(busMock, peerMock); + nm.on('error', cb); + nm.start(); + peerMock.emit('error'); + }); + it('broadcasts ready after start', function(cb) { var nm = new NetworkMonitor(busMock, peerMock); nm.on('ready', cb); diff --git a/test/node.js b/test/node.js new file mode 100644 index 00000000..fe9ca6e8 --- /dev/null +++ b/test/node.js @@ -0,0 +1,49 @@ +'use strict'; + +var chai = require('chai'); +var should = chai.should(); +var sinon = require('sinon'); + +var Promise = require('bluebird'); +var EventEmitter = require('eventemitter2').EventEmitter2; +var BitcoreNode = require('../lib/node'); +var EventBus = require('../lib/eventbus'); +Promise.longStackTraces(); + +describe('BitcoreNode', function() { + + // mocks + var busMock, nmMock; + beforeEach(function() { + busMock = new EventBus(); + nmMock = new EventEmitter(); + nmMock.start = function() {}; + }); + describe('instantiates', function() { + it('from constructor', function() { + var node = new BitcoreNode(busMock, nmMock); + should.exist(node); + }); + + it('from create', function() { + var node = BitcoreNode.create(); + should.exist(node); + }); + }); + + it('starts', function() { + var node = new BitcoreNode(busMock, nmMock); + node.start.bind(node).should.not.throw(); + }); + + it('broadcasts errors from network monitor', function(cb) { + var node = new BitcoreNode(busMock, nmMock); + node.on('error', cb); + nmMock.emit('error'); + }); + it('exposes all events from the event bus', function(cb) { + var node = new BitcoreNode(busMock, nmMock); + node.on('foo', cb); + busMock.emit('foo'); + }); +});