Merge pull request #170 from matiu/feat/multilevel

Feat/multilevel
This commit is contained in:
Ivan Socolsky 2015-04-06 10:59:28 -03:00
commit 6a185c2191
10 changed files with 93 additions and 43 deletions

1
.gitignore vendored
View File

@ -31,4 +31,5 @@ node_modules
*.swp *.swp
out/ out/
db/* db/*
multilevel/db/*

8
app.js
View File

@ -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);

26
config.js Normal file
View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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;
}; };

View File

@ -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));
}) })

View File

@ -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') {

14
multilevel/start.js Executable file
View File

@ -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);

View File

@ -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",