bitcore-wallet-service/lib/wsapp.js

127 lines
3.3 KiB
JavaScript
Raw Normal View History

2015-03-23 14:26:47 -07:00
'use strict';
var $ = require('preconditions').singleton();
var _ = require('lodash');
var async = require('async');
var log = require('npmlog');
var express = require('express');
var querystring = require('querystring');
var bodyParser = require('body-parser')
var Uuid = require('uuid');
var WalletUtils = require('bitcore-wallet-utils');
var Bitcore = WalletUtils.Bitcore;
2015-03-23 14:26:47 -07:00
var WalletService = require('./server');
var BlockExplorer = require('./blockexplorer');
var Notification = require('./model/notification');
2015-03-23 14:26:47 -07:00
log.debug = log.verbose;
log.level = 'debug';
var io;
var blockExplorerSockets = {};
2015-03-30 14:37:34 -07:00
var subscriptions = {};
2015-03-23 14:26:47 -07:00
var WsApp = function() {};
2015-03-23 15:07:06 -07:00
WsApp._unauthorized = function() {
socket.emit('unauthorized');
socket.disconnect();
};
2015-03-30 08:40:58 -07:00
WsApp.subscribeAddresses = function(walletId, addresses) {
2015-03-30 14:37:34 -07:00
$.checkArgument(walletId);
if (!addresses || addresses.length == 0) return;
2015-03-30 14:37:34 -07:00
function handlerFor(address, txid) {
var notification = Notification.create({
2015-03-30 14:37:34 -07:00
walletId: this,
2015-03-30 13:22:45 -07:00
type: 'NewIncomingTx',
data: {
address: address,
txid: txid,
},
});
WsApp._sendNotification(notification);
};
2015-03-30 08:40:58 -07:00
2015-03-30 14:37:34 -07:00
if (!subscriptions[walletId]) {
subscriptions[walletId] = {
addresses: [],
};
};
var addresses = [].concat(addresses);
var network = Bitcore.Address.fromString(addresses[0]).network;
var socket = blockExplorerSockets[network];
_.each(addresses, function(address) {
2015-03-30 14:37:34 -07:00
subscriptions[walletId].addresses.push(address);
socket.emit('subscribe', address);
2015-03-30 14:37:34 -07:00
socket.on(address, _.bind(handlerFor, walletId, address));
2015-03-30 08:40:58 -07:00
});
};
WsApp.subscribeWallet = function(serviceInstance) {
var walletId = serviceInstance.walletId;
2015-03-30 14:37:34 -07:00
if (subscriptions[walletId]) return;
2015-03-30 08:40:58 -07:00
serviceInstance.getMainAddresses({}, function(err, addresses) {
if (err) {
2015-03-30 14:37:34 -07:00
delete subscriptions[walletId];
2015-03-30 08:40:58 -07:00
log.warn('Could not subscribe to addresses for wallet ' + serviceInstance.walletId);
return;
}
WsApp.subscribeAddresses(serviceInstance.walletId, _.pluck(addresses, 'address'));
2015-03-30 08:40:58 -07:00
});
};
WsApp._sendNotification = function(notification) {
if (notification.type == 'NewAddress') {
WsApp.subscribeAddresses(notification.walletId, notification.data.address);
}
io.to(notification.walletId).emit('notification', notification);
};
WsApp._initBlockExplorerSocket = function(provider, network) {
var explorer = new BlockExplorer({
provider: provider,
network: network,
});
blockExplorerSockets[network] = explorer.initSocket();
};
2015-03-23 14:26:47 -07:00
WsApp.start = function(server) {
io = require('socket.io')(server);
2015-03-23 14:26:47 -07:00
WsApp._initBlockExplorerSocket('insight', 'testnet');
WsApp._initBlockExplorerSocket('insight', 'livenet');
2015-03-23 14:26:47 -07:00
WalletService.onNotification(function(serviceInstance, notification) {
if (!notification.walletId) return;
2015-03-30 08:40:58 -07:00
WsApp._sendNotification(notification);
2015-03-23 14:26:47 -07:00
});
io.on('connection', function(socket) {
socket.nonce = Uuid.v4();
socket.emit('challenge', socket.nonce);
socket.on('authorize', function(data) {
2015-03-23 15:07:06 -07:00
if (data.message != socket.nonce) return WsApp.unauthorized();
WalletService.getInstanceWithAuth(data, function(err, service) {
2015-03-23 15:07:06 -07:00
if (err) return WsApp.unauthorized();
socket.join(service.walletId);
2015-03-23 14:26:47 -07:00
socket.emit('authorized');
2015-03-30 08:40:58 -07:00
WsApp.subscribeWallet(service);
2015-03-23 14:26:47 -07:00
});
});
});
};
module.exports = WsApp;