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))
throw 'When running in cluster mode, multilevel and locker server need to be configured';
if (config.cluster && !config.lockOpts.lockerServer)
throw 'When running in cluster mode, locker server need to be configured';
start();

20
config.js

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

3
lib/server.js

@ -57,7 +57,8 @@ WalletService.onNotification = function(func) {
WalletService.initialize = function(opts) {
opts = opts || {};
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;
blockchainExplorerOpts = opts.blockchainExplorerOpts;
initialized = true;

30
lib/storage.js

@ -19,21 +19,27 @@ var collections = {
NOTIFICATIONS: 'notifications',
};
var Storage = function(opts) {
var Storage = function() {};
Storage.prototype.connect = function(opts, cb) {
var self = this;
opts = opts || {};
this.db = opts.db;
if (!this.db) {
var url = 'mongodb://localhost:27017/bws';
mongodb.MongoClient.connect(url, function(err, db) {
if (err) {
log.error('Unable to connect to the mongoDB server. Error:', err);
return;
}
this.db = db;
console.log('Connection established to ', url);
});
}
if (this.db) return cb();
var config = opts.mongoDb || {};
var url = 'mongodb://' + (config.host || 'localhost') + ':' + (config.port ||  27017) + '/bws';
mongodb.MongoClient.connect(url, function(err, db) {
if (err) {
log.error('Unable to connect to the mongoDB server.');
return cb(err);
}
self.db = db;
console.log('Connection established to ', url);
return 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() {
beforeEach(function(done) {
openDb(function() {
storage = new Storage({
storage = new Storage();
storage.connect({
db: db
});
blockchainExplorer = sinon.stub();
}, function(err) {
should.not.exist(err);
blockchainExplorer = sinon.stub();
WalletService.initialize({
storage: storage,
blockchainExplorer: blockchainExplorer,
WalletService.initialize({
storage: storage,
blockchainExplorer: blockchainExplorer,
});
helpers.offset = 0;
done();
});
helpers.offset = 0;
done();
});
});
after(function(done) {
@ -3055,18 +3058,21 @@ describe('Blockchain monitor', function() {
sinon.stub(BlockchainMonitor.prototype, '_getAddressSubscriber').onFirstCall().returns(addressSubscriber);
openDb(function() {
storage = new Storage({
storage = new Storage();
storage.connect({
db: db
});
blockchainExplorer = sinon.stub();
}, function(err) {
should.not.exist(err);
blockchainExplorer = sinon.stub();
WalletService.initialize({
storage: storage,
blockchainExplorer: blockchainExplorer,
});
helpers.offset = 0;
WalletService.initialize({
storage: storage,
blockchainExplorer: blockchainExplorer,
});
helpers.offset = 0;
done();
done();
});
});
});
afterEach(function() {

7
test/storage.js

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

Loading…
Cancel
Save