rm websockets
This commit is contained in:
parent
06a3aa4e23
commit
4a2b92bcb0
|
@ -13,7 +13,6 @@ var Locker = require('locker-server');
|
||||||
var BlockchainMonitor = require('../lib/blockchainmonitor');
|
var BlockchainMonitor = require('../lib/blockchainmonitor');
|
||||||
var EmailService = require('../lib/emailservice');
|
var EmailService = require('../lib/emailservice');
|
||||||
var ExpressApp = require('../lib/expressapp');
|
var ExpressApp = require('../lib/expressapp');
|
||||||
var WsApp = require('../lib/wsapp');
|
|
||||||
var child_process = require('child_process');
|
var child_process = require('child_process');
|
||||||
var spawn = child_process.spawn;
|
var spawn = child_process.spawn;
|
||||||
var EventEmitter = require('events').EventEmitter;
|
var EventEmitter = require('events').EventEmitter;
|
||||||
|
@ -110,7 +109,6 @@ Service.prototype._getConfiguration = function() {
|
||||||
Service.prototype._startWalletService = function(config, next) {
|
Service.prototype._startWalletService = function(config, next) {
|
||||||
var self = this;
|
var self = this;
|
||||||
var expressApp = new ExpressApp();
|
var expressApp = new ExpressApp();
|
||||||
var wsApp = new WsApp();
|
|
||||||
|
|
||||||
if (self.https) {
|
if (self.https) {
|
||||||
var serverOpts = self._readHttpsOptions();
|
var serverOpts = self._readHttpsOptions();
|
||||||
|
@ -119,15 +117,7 @@ Service.prototype._startWalletService = function(config, next) {
|
||||||
self.server = http.Server(expressApp.app);
|
self.server = http.Server(expressApp.app);
|
||||||
}
|
}
|
||||||
|
|
||||||
async.parallel([
|
expressApp.start(config, function(err){
|
||||||
|
|
||||||
function(done) {
|
|
||||||
expressApp.start(config, done);
|
|
||||||
},
|
|
||||||
function(done) {
|
|
||||||
wsApp.start(self.server, config, done);
|
|
||||||
},
|
|
||||||
], function(err) {
|
|
||||||
if (err) {
|
if (err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
|
|
113
bws.js
113
bws.js
|
@ -4,9 +4,7 @@ var async = require('async');
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
|
|
||||||
var ExpressApp = require('./lib/expressapp');
|
var ExpressApp = require('./lib/expressapp');
|
||||||
var WsApp = require('./lib/wsapp');
|
|
||||||
var config = require('./config');
|
var config = require('./config');
|
||||||
var sticky = require('sticky-session');
|
|
||||||
var log = require('npmlog');
|
var log = require('npmlog');
|
||||||
log.debug = log.verbose;
|
log.debug = log.verbose;
|
||||||
log.disableColor();
|
log.disableColor();
|
||||||
|
@ -41,60 +39,71 @@ if (config.https) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
var start = function(cb) {
|
|
||||||
var expressApp = new ExpressApp();
|
|
||||||
var wsApp = new WsApp();
|
|
||||||
|
|
||||||
function doStart(cb) {
|
|
||||||
var server = config.https ? serverModule.createServer(serverOpts, expressApp.app) : serverModule.Server(expressApp.app);
|
|
||||||
|
|
||||||
server.on('connection', function(socket) {
|
|
||||||
socket.setTimeout(300 * 1000);
|
|
||||||
})
|
|
||||||
|
|
||||||
async.parallel([
|
|
||||||
|
|
||||||
function(done) {
|
|
||||||
expressApp.start(config, done);
|
|
||||||
},
|
|
||||||
function(done) {
|
|
||||||
wsApp.start(server, config, done);
|
|
||||||
},
|
|
||||||
], function(err) {
|
|
||||||
if (err) {
|
|
||||||
log.error('Could not start BWS instance', err);
|
|
||||||
}
|
|
||||||
if (cb) return cb(err);
|
|
||||||
});
|
|
||||||
|
|
||||||
return server;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (config.cluster) {
|
|
||||||
var server = sticky(clusterInstances, function() {
|
|
||||||
return doStart();
|
|
||||||
});
|
|
||||||
return cb(null, server);
|
|
||||||
} else {
|
|
||||||
var server = doStart(function(err) {
|
|
||||||
return cb(err, server);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (config.cluster && !config.lockOpts.lockerServer)
|
if (config.cluster && !config.lockOpts.lockerServer)
|
||||||
throw 'When running in cluster mode, locker server need to be configured';
|
throw 'When running in cluster mode, locker server need to be configured';
|
||||||
|
|
||||||
if (config.cluster && !config.messageBrokerOpts.messageBrokerServer)
|
if (config.cluster && !config.messageBrokerOpts.messageBrokerServer)
|
||||||
throw 'When running in cluster mode, message broker server need to be configured';
|
throw 'When running in cluster mode, message broker server need to be configured';
|
||||||
|
|
||||||
start(function(err, server) {
|
var expressApp = new ExpressApp();
|
||||||
if (err) {
|
|
||||||
console.log('Could not start BWS:', err);
|
function startInstance(cb) {
|
||||||
process.exit(0);
|
var server = config.https ? serverModule.createServer(serverOpts, expressApp.app) : serverModule.Server(expressApp.app);
|
||||||
}
|
|
||||||
server.listen(port, function(err) {
|
server.on('connection', function(socket) {
|
||||||
if (err) console.log('ERROR: ', err);
|
socket.setTimeout(300 * 1000);
|
||||||
log.info('Bitcore Wallet Service running on port ' + port);
|
})
|
||||||
|
|
||||||
|
expressApp.start(config, function(err) {
|
||||||
|
if (err) {
|
||||||
|
log.error('Could not start BWS instance', err);
|
||||||
|
return cb(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
server.listen(port);
|
||||||
|
return cb();
|
||||||
});
|
});
|
||||||
});
|
};
|
||||||
|
|
||||||
|
|
||||||
|
var logStart = function(err) {
|
||||||
|
if (err) {
|
||||||
|
log.error('Error:' + err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cluster.worker)
|
||||||
|
log.info('BWS Instance ' + cluster.worker.id + ' running');
|
||||||
|
else
|
||||||
|
log.info('BWS running');
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
if (config.cluster) {
|
||||||
|
|
||||||
|
if (cluster.isMaster) {
|
||||||
|
|
||||||
|
// Count the machine's CPUs
|
||||||
|
var instances = config.clusterInstances || require('os').cpus().length;
|
||||||
|
|
||||||
|
log.info('Starting ' + instances + ' instances on port:' + port);
|
||||||
|
|
||||||
|
// Create a worker for each CPU
|
||||||
|
for (var i = 0; i < instances; i += 1) {
|
||||||
|
cluster.fork();
|
||||||
|
|
||||||
|
// Listen for dying workers
|
||||||
|
cluster.on('exit', function(worker) {
|
||||||
|
// Replace the dead worker,
|
||||||
|
log.error('Worker ' + worker.id + ' died :(');
|
||||||
|
cluster.fork();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// Code to run if we're in a worker process
|
||||||
|
} else {
|
||||||
|
startInstance(logStart);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.info('Starting on port: ' + port);
|
||||||
|
startInstance(logStart);
|
||||||
|
};
|
||||||
|
|
|
@ -3,7 +3,7 @@ var config = {
|
||||||
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
|
||||||
// clusterInstances: 4,
|
// clusterInstances: 4,
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,15 @@ ExpressApp.prototype.start = function(opts, cb) {
|
||||||
var POST_LIMIT = 1024 * 100 /* Max POST 100 kb */ ;
|
var POST_LIMIT = 1024 * 100 /* Max POST 100 kb */ ;
|
||||||
|
|
||||||
this.app.use(bodyParser.json({
|
this.app.use(bodyParser.json({
|
||||||
limit: POST_LIMIT
|
limit: POST_LIMIT,
|
||||||
|
verify: function(req, res, buf, encoding) {
|
||||||
|
|
||||||
|
// get rawBody
|
||||||
|
req.rawBody = buf.toString();
|
||||||
|
console.log("rawBody", req.rawBody);
|
||||||
|
console.log("headers", req.headers);
|
||||||
|
|
||||||
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
if (opts.disableLogs) {
|
if (opts.disableLogs) {
|
||||||
|
|
|
@ -49,7 +49,8 @@ Storage.prototype._createIndexes = function() {
|
||||||
});
|
});
|
||||||
this.db.collection(collections.TXS).createIndex({
|
this.db.collection(collections.TXS).createIndex({
|
||||||
walletId: 1,
|
walletId: 1,
|
||||||
createdOn: -1,
|
isPending: 1,
|
||||||
|
createdOn: 1
|
||||||
});
|
});
|
||||||
this.db.collection(collections.NOTIFICATIONS).createIndex({
|
this.db.collection(collections.NOTIFICATIONS).createIndex({
|
||||||
walletId: 1,
|
walletId: 1,
|
||||||
|
@ -74,6 +75,7 @@ Storage.prototype._createIndexes = function() {
|
||||||
walletId: 1,
|
walletId: 1,
|
||||||
txid: 1,
|
txid: 1,
|
||||||
});
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Storage.prototype.connect = function(opts, cb) {
|
Storage.prototype.connect = function(opts, cb) {
|
||||||
|
|
65
lib/wsapp.js
65
lib/wsapp.js
|
@ -1,65 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var $ = require('preconditions').singleton();
|
|
||||||
var _ = require('lodash');
|
|
||||||
var async = require('async');
|
|
||||||
var log = require('npmlog');
|
|
||||||
log.debug = log.verbose;
|
|
||||||
var Uuid = require('uuid');
|
|
||||||
|
|
||||||
var WalletService = require('./server');
|
|
||||||
var MessageBroker = require('./messagebroker');
|
|
||||||
|
|
||||||
log.level = 'debug';
|
|
||||||
|
|
||||||
var WsApp = function() {};
|
|
||||||
|
|
||||||
WsApp.prototype._unauthorized = function(socket) {
|
|
||||||
socket.emit('unauthorized');
|
|
||||||
socket.disconnect();
|
|
||||||
};
|
|
||||||
|
|
||||||
WsApp.prototype._handleNotification = function(notification) {
|
|
||||||
var room = notification.walletId ? this.io.to(notification.walletId) : this.io;
|
|
||||||
room.emit('notification', notification);
|
|
||||||
};
|
|
||||||
|
|
||||||
WsApp.prototype.start = function(server, opts, cb) {
|
|
||||||
opts = opts || {};
|
|
||||||
$.checkState(opts.messageBrokerOpts);
|
|
||||||
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
this.io = require('socket.io')(server);
|
|
||||||
|
|
||||||
async.series([
|
|
||||||
|
|
||||||
function(done) {
|
|
||||||
self.messageBroker = new MessageBroker(opts.messageBrokerOpts);
|
|
||||||
self.messageBroker.onMessage(_.bind(self._handleNotification, self));
|
|
||||||
done();
|
|
||||||
},
|
|
||||||
function(done) {
|
|
||||||
self.io.on('connection', function(socket) {
|
|
||||||
socket.nonce = Uuid.v4();
|
|
||||||
socket.on('authorize', function(data) {
|
|
||||||
if (data.message != socket.nonce) return self._unauthorized(socket);
|
|
||||||
|
|
||||||
WalletService.getInstanceWithAuth(data, function(err, service) {
|
|
||||||
if (err) return self._unauthorized(socket);
|
|
||||||
|
|
||||||
socket.join(service.walletId);
|
|
||||||
socket.emit('authorized');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
socket.emit('challenge', socket.nonce);
|
|
||||||
});
|
|
||||||
done();
|
|
||||||
},
|
|
||||||
], function(err) {
|
|
||||||
if (cb) return cb(err);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = WsApp;
|
|
|
@ -138,45 +138,6 @@ describe('Bitcore Node Service', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
describe('#_startWalletService', function() {
|
describe('#_startWalletService', function() {
|
||||||
it('will start express and web socket servers', function(done) {
|
|
||||||
function TestExpressApp() {}
|
|
||||||
TestExpressApp.prototype.start = sinon.stub().callsArg(1);
|
|
||||||
function TestWSApp() {}
|
|
||||||
TestWSApp.prototype.start = sinon.stub().callsArg(2);
|
|
||||||
var listen = sinon.stub().callsArg(1);
|
|
||||||
var TestService = proxyquire('../bitcorenode', {
|
|
||||||
'../lib/expressapp': TestExpressApp,
|
|
||||||
'../lib/wsapp': TestWSApp,
|
|
||||||
'http': {
|
|
||||||
Server: sinon.stub().returns({
|
|
||||||
listen: listen
|
|
||||||
})
|
|
||||||
}
|
|
||||||
});
|
|
||||||
var options = {
|
|
||||||
node: {
|
|
||||||
bwsPort: 3232
|
|
||||||
}
|
|
||||||
};
|
|
||||||
var service = new TestService(options);
|
|
||||||
var config = {};
|
|
||||||
service._startWalletService(config, function(err) {
|
|
||||||
if (err) {
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
TestExpressApp.prototype.start.callCount.should.equal(1);
|
|
||||||
TestExpressApp.prototype.start.args[0][0].should.equal(config);
|
|
||||||
TestExpressApp.prototype.start.args[0][1].should.be.a('function');
|
|
||||||
TestWSApp.prototype.start.callCount.should.equal(1);
|
|
||||||
TestWSApp.prototype.start.args[0][0].should.equal(service.server);
|
|
||||||
TestWSApp.prototype.start.args[0][1].should.equal(config);
|
|
||||||
TestWSApp.prototype.start.args[0][2].should.be.a('function');
|
|
||||||
listen.callCount.should.equal(1);
|
|
||||||
listen.args[0][0].should.equal(3232);
|
|
||||||
listen.args[0][1].should.be.a('function');
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
it('error from express', function(done) {
|
it('error from express', function(done) {
|
||||||
function TestExpressApp() {}
|
function TestExpressApp() {}
|
||||||
TestExpressApp.prototype.start = sinon.stub().callsArgWith(1, new Error('test'));
|
TestExpressApp.prototype.start = sinon.stub().callsArgWith(1, new Error('test'));
|
||||||
|
@ -204,33 +165,6 @@ describe('Bitcore Node Service', function() {
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('error from web socket', function(done) {
|
|
||||||
function TestExpressApp() {}
|
|
||||||
TestExpressApp.prototype.start = sinon.stub().callsArg(1);
|
|
||||||
function TestWSApp() {}
|
|
||||||
TestWSApp.prototype.start = sinon.stub().callsArgWith(2, new Error('test'));
|
|
||||||
var listen = sinon.stub().callsArg(1);
|
|
||||||
var TestService = proxyquire('../bitcorenode', {
|
|
||||||
'../lib/expressapp': TestExpressApp,
|
|
||||||
'../lib/wsapp': TestWSApp,
|
|
||||||
'http': {
|
|
||||||
Server: sinon.stub().returns({
|
|
||||||
listen: listen
|
|
||||||
})
|
|
||||||
}
|
|
||||||
});
|
|
||||||
var options = {
|
|
||||||
node: {
|
|
||||||
bwsPort: 3232
|
|
||||||
}
|
|
||||||
};
|
|
||||||
var service = new TestService(options);
|
|
||||||
var config = {};
|
|
||||||
service._startWalletService(config, function(err) {
|
|
||||||
err.message.should.equal('test');
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
it('error from server.listen', function(done) {
|
it('error from server.listen', function(done) {
|
||||||
var app = {};
|
var app = {};
|
||||||
function TestExpressApp() {
|
function TestExpressApp() {
|
||||||
|
|
Loading…
Reference in New Issue