commit
6a185c2191
|
@ -31,4 +31,5 @@ node_modules
|
||||||
*.swp
|
*.swp
|
||||||
out/
|
out/
|
||||||
db/*
|
db/*
|
||||||
|
multilevel/db/*
|
||||||
|
|
||||||
|
|
8
app.js
8
app.js
|
@ -2,18 +2,16 @@
|
||||||
|
|
||||||
var ExpressApp = require('./lib/expressapp');
|
var ExpressApp = require('./lib/expressapp');
|
||||||
var WsApp = require('./lib/wsapp');
|
var WsApp = require('./lib/wsapp');
|
||||||
|
var config = require('./config');
|
||||||
|
|
||||||
var basePath = process.env.BWS_BASE_PATH || '/bws/api';
|
|
||||||
var port = process.env.BWS_PORT || 3001;
|
var port = process.env.BWS_PORT || 3001;
|
||||||
|
|
||||||
var app = ExpressApp.start({
|
var app = ExpressApp.start(config);
|
||||||
basePath: basePath,
|
|
||||||
});
|
|
||||||
//app.listen(port);
|
//app.listen(port);
|
||||||
|
|
||||||
var server = require('http').Server(app);
|
var server = require('http').Server(app);
|
||||||
|
|
||||||
var ws = WsApp.start(server);
|
var ws = WsApp.start(server, config);
|
||||||
|
|
||||||
server.listen(port);
|
server.listen(port);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
var config = {
|
||||||
|
basePath: '/bws/api',
|
||||||
|
disableLogs: false,
|
||||||
|
BlockchainMonitor: {
|
||||||
|
livenet: {
|
||||||
|
name: 'insight',
|
||||||
|
url: 'https://insight.bitpay.com:443',
|
||||||
|
},
|
||||||
|
testnet: {
|
||||||
|
name: 'insight',
|
||||||
|
url: 'https://test-insight.bitpay.com:443',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
WalletService: {
|
||||||
|
storageOpts: {
|
||||||
|
dbPath: './db',
|
||||||
|
/* To use multilevel, uncomment this:
|
||||||
|
multiLevel: {
|
||||||
|
host: 'localhost',
|
||||||
|
port: 3002,
|
||||||
|
},
|
||||||
|
*/
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
module.exports = config;
|
|
@ -14,19 +14,13 @@ function BlockChainExplorer(opts) {
|
||||||
$.checkArgument(opts);
|
$.checkArgument(opts);
|
||||||
var provider = opts.provider || 'insight';
|
var provider = opts.provider || 'insight';
|
||||||
var network = opts.network || 'livenet';
|
var network = opts.network || 'livenet';
|
||||||
|
var dfltUrl = network == 'livenet' ? 'https://insight.bitpay.com:443' :
|
||||||
|
'https://test-insight.bitpay.com:443';
|
||||||
|
var url = opts.url || dfltUrl;
|
||||||
|
|
||||||
var url;
|
var url;
|
||||||
switch (provider) {
|
switch (provider) {
|
||||||
case 'insight':
|
case 'insight':
|
||||||
switch (network) {
|
|
||||||
default:
|
|
||||||
case 'livenet':
|
|
||||||
url = 'https://insight.bitpay.com:443';
|
|
||||||
break;
|
|
||||||
case 'testnet':
|
|
||||||
url = 'https://test-insight.bitpay.com:443'
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
var explorer = new Explorers.Insight(url, network);
|
var explorer = new Explorers.Insight(url, network);
|
||||||
explorer.getTransactions = _.bind(getTransactionsInsight, explorer, url);
|
explorer.getTransactions = _.bind(getTransactionsInsight, explorer, url);
|
||||||
explorer.getAddressActivity = _.bind(getAddressActivityInsight, explorer, url);
|
explorer.getAddressActivity = _.bind(getAddressActivityInsight, explorer, url);
|
||||||
|
|
|
@ -17,12 +17,16 @@ var BlockchainExplorer = require('./blockchainexplorer');
|
||||||
|
|
||||||
var Notification = require('./model/notification');
|
var Notification = require('./model/notification');
|
||||||
|
|
||||||
function BlockchainMonitor() {
|
function BlockchainMonitor(opts) {
|
||||||
|
opts = opts || {};
|
||||||
var self = this;
|
var self = this;
|
||||||
this.subscriptions = {};
|
this.subscriptions = {};
|
||||||
this.subscriber = {};
|
this.subscriber = {};
|
||||||
this.subscriber['livenet'] = self._getAddressSubscriber('insight', 'livenet');
|
_.each(['livenet', 'testnet'], function(network) {
|
||||||
this.subscriber['testnet'] = self._getAddressSubscriber('insight', 'testnet');
|
opts[network] = opts[network] || {};
|
||||||
|
self.subscriber[network] = self._getAddressSubscriber(
|
||||||
|
opts[network].name, network, opts[network].url);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
nodeutil.inherits(BlockchainMonitor, events.EventEmitter);
|
nodeutil.inherits(BlockchainMonitor, events.EventEmitter);
|
||||||
|
|
|
@ -52,7 +52,7 @@ WalletService.onNotification = function(func) {
|
||||||
*/
|
*/
|
||||||
WalletService.initialize = function(opts) {
|
WalletService.initialize = function(opts) {
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
storage = opts.storage || new Storage();
|
storage = opts.storage || new Storage(opts.storageOpts);
|
||||||
blockchainExplorer = opts.blockchainExplorer;
|
blockchainExplorer = opts.blockchainExplorer;
|
||||||
initialized = true;
|
initialized = true;
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
var levelup = require('levelup');
|
var levelup = require('levelup');
|
||||||
|
var multilevel = require('multilevel');
|
||||||
|
var net = require('net');
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var $ = require('preconditions').singleton();
|
var $ = require('preconditions').singleton();
|
||||||
var log = require('npmlog');
|
var log = require('npmlog');
|
||||||
|
@ -16,9 +18,20 @@ var Notification = require('./model/notification');
|
||||||
|
|
||||||
var Storage = function(opts) {
|
var Storage = function(opts) {
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
this.db = opts.db || levelup(opts.dbPath || './db/bws.db', {
|
this.db = opts.db;
|
||||||
valueEncoding: 'json'
|
|
||||||
});
|
if (!this.db) {
|
||||||
|
if (opts.multiLevel) {
|
||||||
|
this.db = multilevel.client();
|
||||||
|
var con = net.connect(opts.multiLevel);
|
||||||
|
con.pipe(this.db.createRpcStream()).pipe(con);
|
||||||
|
console.log('Connected to multilevel server at:', opts.multiLevel);
|
||||||
|
} else {
|
||||||
|
this.db = levelup(opts.dbPath || './db/bws.db', {
|
||||||
|
valueEncoding: 'json'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var zeroPad = function(x, length) {
|
var zeroPad = function(x, length) {
|
||||||
|
@ -134,9 +147,9 @@ Storage.prototype.fetchPendingTxs = function(walletId, cb) {
|
||||||
var txs = [];
|
var txs = [];
|
||||||
var key = KEY.PENDING_TXP(walletId);
|
var key = KEY.PENDING_TXP(walletId);
|
||||||
this.db.createReadStream({
|
this.db.createReadStream({
|
||||||
gte: key,
|
gte: key,
|
||||||
lt: key + '~'
|
lt: key + '~'
|
||||||
})
|
})
|
||||||
.on('data', function(data) {
|
.on('data', function(data) {
|
||||||
txs.push(TxProposal.fromObj(data.value));
|
txs.push(TxProposal.fromObj(data.value));
|
||||||
})
|
})
|
||||||
|
@ -170,11 +183,11 @@ Storage.prototype.fetchTxs = function(walletId, opts, cb) {
|
||||||
var endkey = KEY.TXP(walletId, opts.maxTs);
|
var endkey = KEY.TXP(walletId, opts.maxTs);
|
||||||
|
|
||||||
this.db.createReadStream({
|
this.db.createReadStream({
|
||||||
gt: key,
|
gt: key,
|
||||||
lt: endkey + '~',
|
lt: endkey + '~',
|
||||||
reverse: true,
|
reverse: true,
|
||||||
limit: opts.limit,
|
limit: opts.limit,
|
||||||
})
|
})
|
||||||
.on('data', function(data) {
|
.on('data', function(data) {
|
||||||
txs.push(TxProposal.fromObj(data.value));
|
txs.push(TxProposal.fromObj(data.value));
|
||||||
})
|
})
|
||||||
|
@ -207,11 +220,11 @@ Storage.prototype.fetchNotifications = function(walletId, opts, cb) {
|
||||||
var endkey = KEY.NOTIFICATION(walletId, opts.maxTs);
|
var endkey = KEY.NOTIFICATION(walletId, opts.maxTs);
|
||||||
|
|
||||||
this.db.createReadStream({
|
this.db.createReadStream({
|
||||||
gt: key,
|
gt: key,
|
||||||
lt: endkey + '~',
|
lt: endkey + '~',
|
||||||
reverse: opts.reverse,
|
reverse: opts.reverse,
|
||||||
limit: opts.limit,
|
limit: opts.limit,
|
||||||
})
|
})
|
||||||
.on('data', function(data) {
|
.on('data', function(data) {
|
||||||
txs.push(Notification.fromObj(data.value));
|
txs.push(Notification.fromObj(data.value));
|
||||||
})
|
})
|
||||||
|
@ -271,9 +284,9 @@ Storage.prototype._delByKey = function(key, cb) {
|
||||||
var self = this;
|
var self = this;
|
||||||
var keys = [];
|
var keys = [];
|
||||||
this.db.createKeyStream({
|
this.db.createKeyStream({
|
||||||
gte: key,
|
gte: key,
|
||||||
lt: key + '~',
|
lt: key + '~',
|
||||||
})
|
})
|
||||||
.on('data', function(key) {
|
.on('data', function(key) {
|
||||||
keys.push(key);
|
keys.push(key);
|
||||||
})
|
})
|
||||||
|
@ -328,9 +341,9 @@ Storage.prototype.fetchAddresses = function(walletId, cb) {
|
||||||
var addresses = [];
|
var addresses = [];
|
||||||
var key = KEY.ADDRESS(walletId);
|
var key = KEY.ADDRESS(walletId);
|
||||||
this.db.createReadStream({
|
this.db.createReadStream({
|
||||||
gte: key,
|
gte: key,
|
||||||
lt: key + '~'
|
lt: key + '~'
|
||||||
})
|
})
|
||||||
.on('data', function(data) {
|
.on('data', function(data) {
|
||||||
addresses.push(Address.fromObj(data.value));
|
addresses.push(Address.fromObj(data.value));
|
||||||
})
|
})
|
||||||
|
|
|
@ -32,10 +32,9 @@ WsApp.handleNotification = function(service, notification) {
|
||||||
io.to(notification.walletId).emit('notification', notification);
|
io.to(notification.walletId).emit('notification', notification);
|
||||||
};
|
};
|
||||||
|
|
||||||
WsApp.start = function(server) {
|
WsApp.start = function(server, config) {
|
||||||
io = require('socket.io')(server);
|
io = require('socket.io')(server);
|
||||||
|
bcMonitor = new BlockchainMonitor(config.BlockchainMonitor);
|
||||||
bcMonitor = new BlockchainMonitor();
|
|
||||||
|
|
||||||
function handleNotification(notification) {
|
function handleNotification(notification) {
|
||||||
if (notification.type == 'NewAddress') {
|
if (notification.type == 'NewAddress') {
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
var multilevel = require('multilevel');
|
||||||
|
var net = require('net');
|
||||||
|
var level = require('levelup');
|
||||||
|
|
||||||
|
var db = level('./db', {
|
||||||
|
valueEncoding: 'json'
|
||||||
|
});
|
||||||
|
var PORT = 3002;
|
||||||
|
|
||||||
|
|
||||||
|
console.log('Server started at port ' + PORT + '...');
|
||||||
|
net.createServer(function(con) {
|
||||||
|
con.pipe(multilevel.server(db)).pipe(con);
|
||||||
|
}).listen(PORT);
|
|
@ -31,6 +31,7 @@
|
||||||
"lodash": "^3.3.1",
|
"lodash": "^3.3.1",
|
||||||
"mocha-lcov-reporter": "0.0.1",
|
"mocha-lcov-reporter": "0.0.1",
|
||||||
"morgan": "*",
|
"morgan": "*",
|
||||||
|
"multilevel": "^6.1.0",
|
||||||
"npmlog": "^0.1.1",
|
"npmlog": "^0.1.1",
|
||||||
"preconditions": "^1.0.7",
|
"preconditions": "^1.0.7",
|
||||||
"read": "^1.0.5",
|
"read": "^1.0.5",
|
||||||
|
|
Loading…
Reference in New Issue