bitcore-wallet-service/lib/blockchainmonitor.js

101 lines
2.8 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;
var Uuid = require('uuid');
var inherits = require('inherits');
var events = require('events');
var nodeutil = require('util');
var WalletUtils = require('bitcore-wallet-utils');
var Bitcore = WalletUtils.Bitcore;
var WalletService = require('./server');
2015-03-31 08:04:02 -07:00
var BlockchainExplorer = require('./blockchainexplorer');
2015-03-30 15:44:16 -07:00
var Notification = require('./model/notification');
function BlockchainMonitor() {
2015-03-31 08:04:02 -07:00
var self = this;
2015-03-30 15:44:16 -07:00
this.subscriptions = {};
2015-03-31 08:29:28 -07:00
this.subscriber = {};
this.subscriber['livenet'] = self._getAddressSubscriber('insight', 'livenet');
this.subscriber['testnet'] = self._getAddressSubscriber('insight', 'testnet');
2015-03-30 15:44:16 -07:00
};
nodeutil.inherits(BlockchainMonitor, events.EventEmitter);
2015-03-31 08:29:28 -07:00
BlockchainMonitor.prototype._getAddressSubscriber = function(provider, network) {
$.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-03-31 08:29:28 -07:00
var socket = explorer.initSocket();
// TODO: Extract on its own class once more providers are implemented
return {
subscribe: function(address, handler) {
socket.emit('subscribe', address);
socket.on(address, handler);
},
};
2015-03-30 15:44:16 -07:00
};
BlockchainMonitor.prototype.subscribeAddresses = function(walletId, addresses) {
$.checkArgument(walletId);
var self = this;
if (!addresses || addresses.length == 0) return;
function handlerFor(address, txid) {
var notification = Notification.create({
walletId: this,
type: 'NewIncomingTx',
data: {
address: address,
txid: txid,
},
});
self.emit('notification', notification);
};
if (!self.subscriptions[walletId]) {
self.subscriptions[walletId] = {
addresses: [],
};
};
2015-03-31 08:04:02 -07:00
2015-03-30 15:44:16 -07:00
var addresses = [].concat(addresses);
var network = Bitcore.Address.fromString(addresses[0]).network.name;
2015-03-31 08:29:28 -07:00
var subscriber = self.subscriber[network];
2015-03-30 15:44:16 -07:00
_.each(addresses, function(address) {
self.subscriptions[walletId].addresses.push(address);
2015-03-31 08:29:28 -07:00
subscriber.subscribe(address, _.bind(handlerFor, walletId, address));
2015-03-30 15:44:16 -07:00
});
};
2015-03-31 08:04:02 -07:00
BlockchainMonitor.prototype.subscribeWallet = function(walletService, cb) {
2015-03-30 15:44:16 -07:00
var self = this;
var walletId = walletService.walletId;
if (self.subscriptions[walletId]) return;
walletService.getMainAddresses({}, function(err, addresses) {
if (err) {
delete self.subscriptions[walletId];
2015-03-31 08:04:02 -07:00
return cb(new Error('Could not subscribe to addresses for wallet ' + walletId));
2015-03-30 15:44:16 -07:00
}
self.subscribeAddresses(walletService.walletId, _.pluck(addresses, 'address'));
2015-03-31 08:04:02 -07:00
return cb();
2015-03-30 15:44:16 -07:00
});
};
module.exports = BlockchainMonitor;