bitcore-lib-zcash/lib/NetworkMonitor.js

84 lines
2.2 KiB
JavaScript

var log = require('../util/log');
var networks = require('../networks');
var Address = require('./Address');
var Peer = require('./Peer');
var PeerManager = require('./PeerManager');
var util = require('util');
var EventEmitter = require('events').EventEmitter;
var preconditions = require('preconditions').singleton();
var NetworkMonitor = function(peerman) {
preconditions.checkArgument(peerman);
this.peerman = peerman;
this.networkName = peerman.config.network;
this.init();
}
util.inherits(NetworkMonitor, EventEmitter);
NetworkMonitor.create = function(config) {
this.config = config;
var peerman = new PeerManager({
network: config.networkName
});
peerman.addPeer(new Peer(config.host, config.port));
return new NetworkMonitor(peerman);
};
NetworkMonitor.prototype.init = function() {
var self = this;
var handleInv = function(info) {
var invs = info.message.invs;
info.conn.sendGetData(invs);
};
var handleBlock = function(info) {
self.emit('block', info.message);
};
var handleTx = function(info) {
var tx = info.message.tx;
self.emit('tx', tx);
var from = tx.getSendingAddresses(self.networkName);
for (var i = 0; i < from.length; i++) {
var addr = from[i];
self.emit('out:'+addr, tx);
}
var to = tx.getReceivingAddresses(self.networkName);
for (var i = 0; i < to.length; i++) {
var addr = to[i];
self.emit('in:'+addr, tx);
}
};
this.peerman.on('connection', function(conn) {
if (self.connection) throw new Error('Cant handle more than one connection');
self.connection = conn;
conn.on('inv', handleInv);
conn.on('block', handleBlock);
conn.on('tx', handleTx);
});
};
NetworkMonitor.prototype.incoming = function(addrStr, callback) {
preconditions.checkArgument(Address.validate(addrStr));
this.on('in:'+addrStr, callback);
};
NetworkMonitor.prototype.outgoing = function(addrStr, callback) {
preconditions.checkArgument(Address.validate(addrStr));
this.on('out:'+addrStr, callback);
};
NetworkMonitor.prototype.start = function() {
this.peerman.start();
};
NetworkMonitor.prototype.stop = function() {
this.peerman.stop();
};
module.exports = NetworkMonitor;