bitcore-wallet-service/lib/blockchainmonitor.js

104 lines
2.7 KiB
JavaScript
Raw Normal View History

2015-03-30 15:44:16 -07:00
'use strict';
var $ = require('preconditions').singleton();
var _ = require('lodash');
var async = require('async');
var log = require('npmlog');
log.debug = log.verbose;
2015-05-06 08:48:43 -07:00
2015-03-31 08:04:02 -07:00
var BlockchainExplorer = require('./blockchainexplorer');
2015-05-06 08:48:43 -07:00
var Storage = require('./storage');
var MessageBroker = require('./messagebroker');
2015-03-30 15:44:16 -07:00
var Notification = require('./model/notification');
2015-05-06 08:48:43 -07:00
var storage, messageBroker;
function BlockchainMonitor() {};
BlockchainMonitor.start = function(opts, cb) {
2015-04-05 09:56:56 -07:00
opts = opts || {};
2015-05-06 08:48:43 -07:00
$.checkArgument(opts.blockchainExplorerOpts);
$.checkArgument(opts.storageOpts);
async.parallel([
2015-03-30 15:44:16 -07:00
2015-05-06 08:48:43 -07:00
function(done) {
_.each(['livenet', 'testnet'], function(network) {
var config = opts.blockchainExplorerOpts[network] || {};
BlockchainMonitor._initExplorer(config.provider, network, config.url);
});
done();
},
function(done) {
storage = new Storage();
storage.connect(opts.storageOpts, done);
},
function(done) {
messageBroker = new MessageBroker(opts.messageBrokerOpts);
done();
},
], cb);
};
2015-03-30 15:44:16 -07:00
2015-05-06 08:48:43 -07:00
BlockchainMonitor._initExplorer = function(provider, network, url) {
2015-03-31 08:29:28 -07:00
$.checkArgument(provider == 'insight', 'Blockchain monitor ' + provider + ' not supported');
2015-03-31 08:04:02 -07:00
var explorer = new BlockchainExplorer({
2015-03-30 15:44:16 -07:00
provider: provider,
network: network,
2015-05-06 08:48:43 -07:00
url: url,
2015-03-30 15:44:16 -07:00
});
2015-03-31 08:29:28 -07:00
var socket = explorer.initSocket();
2015-05-06 08:48:43 -07:00
socket.emit('subscribe', 'inv');
socket.on('tx', BlockchainMonitor._handleIncommingTx);
2015-03-30 15:44:16 -07:00
};
2015-05-06 08:48:43 -07:00
BlockchainMonitor._handleIncommingTx = function(data) {
if (!data || !data.vout) return;
var outs = _.compact(_.map(data.vout, function(v) {
var addr = _.keys(v)[0];
if (addr.indexOf('3') != 0 && addr.indexOf('2') != 0) return;
2015-03-30 15:44:16 -07:00
2015-05-06 08:48:43 -07:00
return {
address: addr,
amount: +v[addr]
};
}));
if (_.isEmpty(outs)) return;
2015-03-30 15:44:16 -07:00
2015-05-06 08:48:43 -07:00
async.each(outs, function(out, next) {
2015-05-06 10:32:01 -07:00
storage.fetchAddress(out.address, function(err, address) {
if (err || !address) return next(err);
if (address.isChange) return next();
2015-03-30 15:44:16 -07:00
2015-05-06 10:32:01 -07:00
var walletId = address.walletId;
2015-05-06 08:48:43 -07:00
log.info('Incoming tx for wallet ' + walletId + ' (' + out.address + ' -> ' + out.amount + ')');
BlockchainMonitor._createNotification(walletId, data.txid, out.address, out.amount, next);
2015-03-30 15:44:16 -07:00
});
2015-05-06 08:48:43 -07:00
}, function(err) {
return;
2015-03-30 15:44:16 -07:00
});
};
2015-05-06 08:48:43 -07:00
BlockchainMonitor._createNotification = function(walletId, txid, address, amount, cb) {
var n = Notification.create({
type: 'NewIncomingTx',
data: {
txid: txid,
address: address,
amount: amount,
},
walletId: walletId,
});
storage.storeNotification(walletId, n, function() {
messageBroker.send(n)
2015-03-31 08:04:02 -07:00
return cb();
2015-03-30 15:44:16 -07:00
});
};
module.exports = BlockchainMonitor;