diff --git a/example/index.js b/example/index.js index db844032..eef697a5 100755 --- a/example/index.js +++ b/example/index.js @@ -48,6 +48,10 @@ bitcoind.on('open', function(status) { print(bitcoind.getInfo()); print(bitcoind.getPeerInfo()); print(bitcoind.wallet.listAccounts()); + bitcoind.on('version', function(version) { + print('Version packet:'); + print(version); + }); }, 7000); } diff --git a/lib/bitcoind.js b/lib/bitcoind.js index 6f92faa0..17764bf3 100644 --- a/lib/bitcoind.js +++ b/lib/bitcoind.js @@ -252,6 +252,10 @@ Bitcoin.prototype.start = function(options, callback) { this._emitted = {}; this.on('newListener', function(name) { + if (name === 'version' || name === 'peer') { + self._pollPeers(); + return; + } if (name === 'block') { self._pollBlocks(); return; @@ -364,6 +368,33 @@ Bitcoin.prototype._pollMempool = function() { })(); }; +// XXX Not perfect - will not catch all version packets. +Bitcoin.prototype._pollPeers = function() { + var self = this; + if (this._pollingPeers) return; + this._pollingPeers = true; + var peers = bitcoindjs.getPeerInfo(); + (function next() { + var newPeers = bitcoindjs.getPeerInfo(); + newPeers = newPeers.filter(function(peer, i) { + return !peers[i] || peer.addr !== peers[i].addr; + }); + newPeers.forEach(function(peer) { + self.emit('peer', peer); + self.emit('version', { + version: peer.version, + services: peer.services, + time: peer.conntime, + nonce: null, + useragent: peer.subver, + startheight: peer.startingheight, + relay: null // peer.fRelayTxes + }); + }); + return setTimeout(next, self.pollInterval); + })(); +}; + Bitcoin.prototype.getBlock = function(blockHash, callback) { return bitcoindjs.getBlock(blockHash, function(err, block) { if (err) return callback(err); diff --git a/src/bitcoindjs.cc b/src/bitcoindjs.cc index cecbe493..0bfbd05d 100644 --- a/src/bitcoindjs.cc +++ b/src/bitcoindjs.cc @@ -1584,6 +1584,7 @@ NAN_METHOD(GetPeerInfo) { } obj->Set(NanNew("syncnode"), NanNew(stats.fSyncNode)); obj->Set(NanNew("whitelisted"), NanNew(stats.fWhitelisted)); + // obj->Set(NanNew("relaytxes"), NanNew(stats.fRelayTxes)); array->Set(i, obj); i++;