Browse Source

refactor storage initialization

activeAddress
Ivan Socolsky 10 years ago
parent
commit
498392e72c
  1. 4
      bws.js
  2. 20
      config.js
  3. 3
      lib/server.js
  4. 30
      lib/storage.js
  5. 70
      multilevel/clientMultilevel.js
  6. 17
      multilevel/multilevel.js
  7. 40
      test/integration/server.js
  8. 7
      test/storage.js

4
bws.js

@ -51,7 +51,7 @@ var start = function() {
}); });
}; };
if (config.cluster && (!config.storageOpts.multiLevel || !config.lockOpts.lockerServer)) if (config.cluster && !config.lockOpts.lockerServer)
throw 'When running in cluster mode, multilevel and locker server need to be configured'; throw 'When running in cluster mode, locker server need to be configured';
start(); start();

20
config.js

@ -1,7 +1,7 @@
var config = { var config = {
basePath: '/bws/api', basePath: '/bws/api',
disableLogs: false, disableLogs: false,
port: 3232, port: 3232,
// Uncomment to make BWS a forking server // Uncomment to make BWS a forking server
// cluster: true, // cluster: true,
// Uncomment to use the nr of availalbe CPUs // Uncomment to use the nr of availalbe CPUs
@ -12,19 +12,17 @@ var config = {
// certificateFile: 'cert.pem', // certificateFile: 'cert.pem',
storageOpts: { storageOpts: {
dbPath: './db', mongoDb: {
// Uncomment to use multilevel server host: 'localhost',
// multiLevel: { port: 27017,
// host: 'localhost', },
// port: 3230,
// },
}, },
lockOpts: { lockOpts: {
// To use locker-server, uncomment this: // To use locker-server, uncomment this:
// lockerServer: { // lockerServer: {
// host: 'localhost', // host: 'localhost',
// port: 3231, // port: 3231,
// }, // },
}, },
blockchainExplorerOpts: { blockchainExplorerOpts: {
livenet: { livenet: {

3
lib/server.js

@ -57,7 +57,8 @@ WalletService.onNotification = function(func) {
WalletService.initialize = function(opts) { WalletService.initialize = function(opts) {
opts = opts || {}; opts = opts || {};
lock = opts.lock || new Lock(opts.lockOpts); lock = opts.lock || new Lock(opts.lockOpts);
storage = opts.storage || new Storage(opts.storageOpts); // TODO: This method needs to be async
storage = opts.storage || new Storage().connect(opts.storageOpts, function() {});
blockchainExplorer = opts.blockchainExplorer; blockchainExplorer = opts.blockchainExplorer;
blockchainExplorerOpts = opts.blockchainExplorerOpts; blockchainExplorerOpts = opts.blockchainExplorerOpts;
initialized = true; initialized = true;

30
lib/storage.js

@ -19,21 +19,27 @@ var collections = {
NOTIFICATIONS: 'notifications', NOTIFICATIONS: 'notifications',
}; };
var Storage = function(opts) { var Storage = function() {};
Storage.prototype.connect = function(opts, cb) {
var self = this;
opts = opts || {}; opts = opts || {};
this.db = opts.db; this.db = opts.db;
if (!this.db) { if (this.db) return cb();
var url = 'mongodb://localhost:27017/bws';
mongodb.MongoClient.connect(url, function(err, db) { var config = opts.mongoDb || {};
if (err) { var url = 'mongodb://' + (config.host || 'localhost') + ':' + (config.port ||  27017) + '/bws';
log.error('Unable to connect to the mongoDB server. Error:', err); mongodb.MongoClient.connect(url, function(err, db) {
return; if (err) {
} log.error('Unable to connect to the mongoDB server.');
this.db = db; return cb(err);
console.log('Connection established to ', url); }
}); self.db = db;
} console.log('Connection established to ', url);
return cb();
});
}; };
Storage.prototype.fetchWallet = function(id, cb) { Storage.prototype.fetchWallet = function(id, cb) {

70
multilevel/clientMultilevel.js

@ -1,70 +0,0 @@
#!/usr/bin/env node
var multilevel = require('multilevel');
var net = require('net');
var moment = require('moment');
var PORT = 3230;
var otherDate;
//trying to parse optional parameter to get stats on any given date
try {
otherDate = process.argv[2] && moment(process.argv[2]).isValid() ? moment(process.argv[2]) : null;
} catch (e) {
console.log('Enter the date in the format YYYY-MM-DD.');
}
var db = multilevel.client();
var con = net.connect(PORT);
con.pipe(db.createRpcStream()).pipe(con);
var Today = otherDate || moment();
var TotalTx = 0;
var TotalAmount = 0;
var TotalNewWallets = 0;
var IsToday = function(date) {
if (!date) return false;
var date = moment(date * 1000);
return (date >= Today.startOf('day') && date <= Today.endOf('day'));
}
var TotalTxpForToday = function(data) {
if (!data) return;
if (data.key.indexOf('!txp!') < 0) return;
if (!data.value || !IsToday(data.value.createdOn)) return;
TotalTx++;
TotalAmount = TotalAmount + data.value.amount;
};
var TotalNewWalletForToday = function(data) {
if (!data) return;
if (data.key.indexOf('!main') < 0) return;
if (!data.value || !IsToday(data.value.createdOn)) return;
TotalNewWallets++;
};
var PrintStats = function() {
console.log('Stats for date : ', Today.format("YYYY-MM-DD"));
console.log('New wallets : ', TotalNewWallets);
console.log('Total tx : ', TotalTx);
console.log('Total amount in tx (satoshis) : ', TotalAmount);
};
var ProcessData = function(data) {
TotalTxpForToday(data);
TotalNewWalletForToday(data);
};
// streams
db.createReadStream().on('data', function(data) {
ProcessData(data);
}).on('error', function(err) {
console.log('Error : ', err);
process.exit(code = 1);
}).on('close', function() {
PrintStats();
process.exit(code = 0);
});

17
multilevel/multilevel.js

@ -1,17 +0,0 @@
#!/usr/bin/env node
var multilevel = require('multilevel');
var net = require('net');
var level = require('levelup');
var db = level('./db', {
valueEncoding: 'json'
});
var HOST = 'localhost';
var PORT = 3230;
console.log('Server started at port ' + PORT + '...');
net.createServer(function(con) {
con.pipe(multilevel.server(db)).pipe(con);
}).listen(PORT, HOST);

40
test/integration/server.js

@ -244,17 +244,20 @@ function closeDb(cb) {
describe('Wallet service', function() { describe('Wallet service', function() {
beforeEach(function(done) { beforeEach(function(done) {
openDb(function() { openDb(function() {
storage = new Storage({ storage = new Storage();
storage.connect({
db: db db: db
}); }, function(err) {
blockchainExplorer = sinon.stub(); should.not.exist(err);
blockchainExplorer = sinon.stub();
WalletService.initialize({ WalletService.initialize({
storage: storage, storage: storage,
blockchainExplorer: blockchainExplorer, blockchainExplorer: blockchainExplorer,
});
helpers.offset = 0;
done();
}); });
helpers.offset = 0;
done();
}); });
}); });
after(function(done) { after(function(done) {
@ -3055,18 +3058,21 @@ describe('Blockchain monitor', function() {
sinon.stub(BlockchainMonitor.prototype, '_getAddressSubscriber').onFirstCall().returns(addressSubscriber); sinon.stub(BlockchainMonitor.prototype, '_getAddressSubscriber').onFirstCall().returns(addressSubscriber);
openDb(function() { openDb(function() {
storage = new Storage({ storage = new Storage();
storage.connect({
db: db db: db
}); }, function(err) {
blockchainExplorer = sinon.stub(); should.not.exist(err);
blockchainExplorer = sinon.stub();
WalletService.initialize({ WalletService.initialize({
storage: storage, storage: storage,
blockchainExplorer: blockchainExplorer, blockchainExplorer: blockchainExplorer,
}); });
helpers.offset = 0; helpers.offset = 0;
done(); done();
});
}); });
}); });
afterEach(function() { afterEach(function() {

7
test/storage.js

@ -27,10 +27,13 @@ describe('Storage', function() {
beforeEach(function(done) { beforeEach(function(done) {
initDb(function(err, db) { initDb(function(err, db) {
should.not.exist(err); should.not.exist(err);
storage = new Storage({ storage = new Storage();
storage.connect({
db: db db: db
}, function(err) {
should.not.exist(err);
done();
}); });
done();
}); });
}); });
describe('Store & fetch wallet', function() { describe('Store & fetch wallet', function() {

Loading…
Cancel
Save