Browse Source

Merge pull request #170 from matiu/feat/multilevel

Feat/multilevel
activeAddress
Ivan Socolsky 10 years ago
parent
commit
6a185c2191
  1. 1
      .gitignore
  2. 8
      app.js
  3. 26
      config.js
  4. 12
      lib/blockchainexplorer.js
  5. 10
      lib/blockchainmonitor.js
  6. 2
      lib/server.js
  7. 57
      lib/storage.js
  8. 5
      lib/wsapp.js
  9. 14
      multilevel/start.js
  10. 1
      package.json

1
.gitignore

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

8
app.js

@ -2,18 +2,16 @@
var ExpressApp = require('./lib/expressapp');
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 app = ExpressApp.start({
basePath: basePath,
});
var app = ExpressApp.start(config);
//app.listen(port);
var server = require('http').Server(app);
var ws = WsApp.start(server);
var ws = WsApp.start(server, config);
server.listen(port);

26
config.js

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

12
lib/blockchainexplorer.js

@ -14,19 +14,13 @@ function BlockChainExplorer(opts) {
$.checkArgument(opts);
var provider = opts.provider || 'insight';
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;
switch (provider) {
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);
explorer.getTransactions = _.bind(getTransactionsInsight, explorer, url);
explorer.getAddressActivity = _.bind(getAddressActivityInsight, explorer, url);

10
lib/blockchainmonitor.js

@ -17,12 +17,16 @@ var BlockchainExplorer = require('./blockchainexplorer');
var Notification = require('./model/notification');
function BlockchainMonitor() {
function BlockchainMonitor(opts) {
opts = opts || {};
var self = this;
this.subscriptions = {};
this.subscriber = {};
this.subscriber['livenet'] = self._getAddressSubscriber('insight', 'livenet');
this.subscriber['testnet'] = self._getAddressSubscriber('insight', 'testnet');
_.each(['livenet', 'testnet'], function(network) {
opts[network] = opts[network] || {};
self.subscriber[network] = self._getAddressSubscriber(
opts[network].name, network, opts[network].url);
});
};
nodeutil.inherits(BlockchainMonitor, events.EventEmitter);

2
lib/server.js

@ -52,7 +52,7 @@ WalletService.onNotification = function(func) {
*/
WalletService.initialize = function(opts) {
opts = opts || {};
storage = opts.storage ||  new Storage();
storage = opts.storage ||  new Storage(opts.storageOpts);
blockchainExplorer = opts.blockchainExplorer;
initialized = true;
};

57
lib/storage.js

@ -2,6 +2,8 @@
var _ = require('lodash');
var levelup = require('levelup');
var multilevel = require('multilevel');
var net = require('net');
var async = require('async');
var $ = require('preconditions').singleton();
var log = require('npmlog');
@ -16,9 +18,20 @@ var Notification = require('./model/notification');
var Storage = function(opts) {
opts = opts || {};
this.db = opts.db || levelup(opts.dbPath || './db/bws.db', {
valueEncoding: 'json'
});
this.db = opts.db;
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) {
@ -134,9 +147,9 @@ Storage.prototype.fetchPendingTxs = function(walletId, cb) {
var txs = [];
var key = KEY.PENDING_TXP(walletId);
this.db.createReadStream({
gte: key,
lt: key + '~'
})
gte: key,
lt: key + '~'
})
.on('data', function(data) {
txs.push(TxProposal.fromObj(data.value));
})
@ -170,11 +183,11 @@ Storage.prototype.fetchTxs = function(walletId, opts, cb) {
var endkey = KEY.TXP(walletId, opts.maxTs);
this.db.createReadStream({
gt: key,
lt: endkey + '~',
reverse: true,
limit: opts.limit,
})
gt: key,
lt: endkey + '~',
reverse: true,
limit: opts.limit,
})
.on('data', function(data) {
txs.push(TxProposal.fromObj(data.value));
})
@ -207,11 +220,11 @@ Storage.prototype.fetchNotifications = function(walletId, opts, cb) {
var endkey = KEY.NOTIFICATION(walletId, opts.maxTs);
this.db.createReadStream({
gt: key,
lt: endkey + '~',
reverse: opts.reverse,
limit: opts.limit,
})
gt: key,
lt: endkey + '~',
reverse: opts.reverse,
limit: opts.limit,
})
.on('data', function(data) {
txs.push(Notification.fromObj(data.value));
})
@ -271,9 +284,9 @@ Storage.prototype._delByKey = function(key, cb) {
var self = this;
var keys = [];
this.db.createKeyStream({
gte: key,
lt: key + '~',
})
gte: key,
lt: key + '~',
})
.on('data', function(key) {
keys.push(key);
})
@ -328,9 +341,9 @@ Storage.prototype.fetchAddresses = function(walletId, cb) {
var addresses = [];
var key = KEY.ADDRESS(walletId);
this.db.createReadStream({
gte: key,
lt: key + '~'
})
gte: key,
lt: key + '~'
})
.on('data', function(data) {
addresses.push(Address.fromObj(data.value));
})

5
lib/wsapp.js

@ -32,10 +32,9 @@ WsApp.handleNotification = function(service, notification) {
io.to(notification.walletId).emit('notification', notification);
};
WsApp.start = function(server) {
WsApp.start = function(server, config) {
io = require('socket.io')(server);
bcMonitor = new BlockchainMonitor();
bcMonitor = new BlockchainMonitor(config.BlockchainMonitor);
function handleNotification(notification) {
if (notification.type == 'NewAddress') {

14
multilevel/start.js

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

1
package.json

@ -31,6 +31,7 @@
"lodash": "^3.3.1",
"mocha-lcov-reporter": "0.0.1",
"morgan": "*",
"multilevel": "^6.1.0",
"npmlog": "^0.1.1",
"preconditions": "^1.0.7",
"read": "^1.0.5",

Loading…
Cancel
Save