Skip to content
This repository was archived by the owner on May 16, 2019. It is now read-only.

Commit 3fecf84

Browse files
committed
Merge pull request #1487 from rmisio/selective-local-server-start
Selective local server start
2 parents 407578e + e22d454 commit 3fecf84

File tree

3 files changed

+115
-33
lines changed

3 files changed

+115
-33
lines changed

js/main.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ window.onblur = function() {
2525

2626
var Polyglot = require('node-polyglot'),
2727
ipcRenderer = require('ipc-renderer'),
28+
remote = require('electron').remote,
2829
getBTPrice = require('./utils/getBitcoinPrice'),
2930
router = require('./router'),
3031
userModel = require('./models/userMd'),
@@ -46,8 +47,6 @@ var Polyglot = require('node-polyglot'),
4647
ServerConnectModal = require('./views/serverConnectModal'),
4748
OnboardingModal = require('./views/onboardingModal'),
4849
PageConnectModal = require('./views/pageConnectModal'),
49-
serverConfigMd = app.serverConfig,
50-
heartbeat = app.getHeartbeatSocket(),
5150
loadProfileNeeded = true,
5251
startUpConnectMaxRetries = 2,
5352
startUpConnectRetryDelay = 2 * 1000,
@@ -141,6 +140,12 @@ app.serverConfigs.fetch().done(() => {
141140
}
142141
});
143142

143+
ipcRenderer.send('activeServerChange', app.serverConfigs.getActive().toJSON());
144+
145+
app.serverConfigs.on('activeServerChange', (server) => {
146+
ipcRenderer.send('activeServerChange', server.toJSON());
147+
});
148+
144149
//keep user and profile urls synced with the active server configuration
145150
(setServerUrl = function() {
146151
var baseServerUrl = app.serverConfigs.getActive().getServerBaseUrl();
@@ -360,7 +365,7 @@ var loadProfile = function(landingRoute, onboarded) {
360365

361366
//get user bitcoin price before loading pages
362367
setCurrentBitCoin(cCode, user, function() {
363-
newSocketView = new socketView({model: serverConfigMd});
368+
newSocketView = new socketView();
364369

365370
newPageNavView = new pageNavView({
366371
model: user,
@@ -425,7 +430,6 @@ launchOnboarding = function(guidCreating) {
425430
onboardingModal = new OnboardingModal({
426431
model: user,
427432
userProfile: userProfile,
428-
serverConfig: serverConfigMd,
429433
guidCreationPromise: guidCreating
430434
});
431435
onboardingModal.render().open();
@@ -465,7 +469,7 @@ app.connectHeartbeatSocket();
465469
app.serverConnectModal = new ServerConnectModal().render();
466470
app.serverConnectModal.on('connected', () => {
467471
if (profileLoaded) {
468-
// If we've already called loadProfile() and then, we connect
472+
// If we've already loaded called loadProfile() and then, we connect
469473
// to a new server (or reconnect to the same server) we'll reload the
470474
// app since some of the "global" components (Router, PageNav,
471475
// SocketView...) were not designed to handle a new connection.
@@ -584,4 +588,4 @@ app.getHeartbeatSocket().on('message', function(e) {
584588
}
585589
}
586590
});
587-
// end - server connection and app initialization flow
591+
// end - server connection and app initialization flow

js/views/serverConnectModal.js

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
var __ = require('underscore'),
44
Backbone = require('backbone'),
55
loadTemplate = require('../utils/loadTemplate'),
6-
app = require('../App.js').getApp(),
6+
app = require('../App.js').getApp(),
7+
remote = require('electron').remote,
78
ServerConfigMd = require('../models/serverConfigMd'),
89
ServerConfigsCl = require('../collections/serverConfigsCl'),
910
BaseModal = require('./baseModal'),
@@ -203,7 +204,15 @@ module.exports = BaseModal.extend({
203204
},
204205

205206
connect: function(configMd) {
206-
var connectAttempt;
207+
var deferred = $.Deferred(),
208+
promise = deferred.promise(),
209+
attempt = 1,
210+
maxAttempts = 5,
211+
timeoutBetweenAttempts = 2 * 1000,
212+
maxAttemptsTime = 20 * 1000,
213+
startTime = Date.now(),
214+
attemptConnection,
215+
connectAttempt;
207216

208217
configMd = configMd || this.serverConfigs.getActive();
209218

@@ -232,18 +241,41 @@ module.exports = BaseModal.extend({
232241
this.setModalOptions({ showCloseButton: false });
233242
this.serverConfigs.setActive(configMd.id);
234243

235-
this._connectAttempt = this.attemptConnection().done(() => {
236-
this.succeedConnection(configMd);
237-
}).fail((reason) => {
238-
this.failConnection(reason, configMd)
239-
}).always(() => {
244+
(attemptConnection = () => {
245+
connectAttempt = this.attemptConnection().done(() => {
246+
deferred.resolve();
247+
this.succeedConnection(configMd);
248+
}).fail((reason) => {
249+
// If we're using the client launched from the installer
250+
// and we're trying to connect to the default server, it will
251+
// take some time for the server to launch, so we'll retry a few
252+
// times.
253+
if (
254+
remote.getGlobal('launched_from_installer') && configMd.get('default') &&
255+
attempt < maxAttempts && Date.now() < (startTime + maxAttemptsTime) &&
256+
reason !== 'canceled'
257+
) {
258+
attempt += 1;
259+
attemptConnection();
260+
} else {
261+
deferred.reject(reason);
262+
this.failConnection(reason, configMd)
263+
}
264+
});
265+
})();
266+
267+
deferred.always(() => {
240268
this._connectAttempt = null;
241269
});
270+
271+
promise.serverId = configMd.id;
272+
promise.cancel = function() {
273+
connectAttempt && connectAttempt.cancel();
274+
};
275+
276+
this._connectAttempt = promise;
242277

243-
this._connectAttempt.serverId = configMd.id;
244-
connectAttempt = this._connectAttempt;
245-
246-
return connectAttempt;
278+
return promise;
247279
},
248280

249281
attemptConnection: function(options) {

main.js

Lines changed: 62 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,49 @@ if(platform == "mac" || platform == "linux") {
100100
daemon = "openbazaard";
101101
}
102102

103-
var serverPath = __dirname + path.sep + '..' + path.sep + 'OpenBazaar-Server' + path.sep;
104-
var serverOut = '';
103+
var serverPath = __dirname + path.sep + '..' + path.sep + 'OpenBazaar-Server' + path.sep,
104+
serverOut = '',
105+
serverRunning = false,
106+
pendingKill,
107+
startAfterClose;
108+
109+
var kill_local_server = function() {
110+
if (subpy) {
111+
if (pendingKill) {
112+
startAfterClose && pendingKill.removeListener('close', startAfterClose);
113+
return;
114+
} else if (!serverRunning) {
115+
return;
116+
} else {
117+
pendingKill = subpy;
118+
pendingKill.once('close', () => {
119+
pendingKill = null;
120+
});
121+
}
122+
123+
console.log('Shutting down server daemon');
124+
125+
if(platform == "mac" || platform == "linux") {
126+
subpy.kill('SIGINT');
127+
} else {
128+
require('child_process').spawn("taskkill", ["/pid", subpy.pid, '/f', '/t']);
129+
}
130+
}
131+
}
105132

106133
var start_local_server = function() {
107134
if(fs.existsSync(serverPath)) {
135+
if (pendingKill) {
136+
pendingKill.once('close', (startAfterClose = () => {
137+
start_local_server();
138+
}));
139+
140+
return;
141+
}
142+
143+
if (serverRunning) return;
144+
145+
console.log('Starting OpenBazaar Server');
108146

109147
var random_port = Math.floor((Math.random() * 10000) + 30000);
110148

@@ -113,6 +151,8 @@ var start_local_server = function() {
113151
cwd: __dirname + path.sep + '..' + path.sep + 'OpenBazaar-Server'
114152
});
115153

154+
serverRunning = true;
155+
116156
var stdout = '';
117157
var stderr = '';
118158

@@ -132,6 +172,7 @@ var start_local_server = function() {
132172
console.log('exited with ' + code);
133173
console.log('[END] stdout "%s"', stdout);
134174
console.log('[END] stderr "%s"', stderr);
175+
serverRunning = false;
135176
});
136177
subpy.unref();
137178
}
@@ -142,11 +183,19 @@ var start_local_server = function() {
142183

143184
// Check if we need to kick off the python server-daemon (Desktop app)
144185
if(fs.existsSync(__dirname + path.sep + ".." + path.sep + "OpenBazaar-Server" + path.sep + daemon)) {
145-
launched_from_installer = true;
146-
console.log('Starting OpenBazaar Server');
147-
start_local_server();
186+
global.launched_from_installer = launched_from_installer = true;
148187
}
149188

189+
ipcMain.on('activeServerChange', function(event, server) {
190+
if (launched_from_installer) {
191+
if (server.default) {
192+
start_local_server();
193+
} else {
194+
kill_local_server();
195+
}
196+
}
197+
});
198+
150199
// Report crashes to our server.
151200
//require('crash-reporter').start();
152201

@@ -261,9 +310,8 @@ app.on('window-all-closed', function() {
261310
app.on('before-quit', function (e) {
262311
// Handle menu-item or keyboard shortcut quit here
263312
console.log('Closing Application');
264-
if(launched_from_installer) {
265-
console.log('Shutting down server daemon');
266-
subpy.kill();
313+
if (launched_from_installer) {
314+
kill_local_server();
267315
}
268316
});
269317

@@ -440,14 +488,7 @@ app.on('ready', function() {
440488
// when you should delete the corresponding element.
441489
mainWindow = null;
442490

443-
if(subpy) {
444-
if(platform == "mac" || platform == "linux") {
445-
subpy.kill('SIGINT');
446-
} else {
447-
require('child_process').spawn("taskkill", ["/pid", subpy.pid, '/f', '/t']);
448-
}
449-
}
450-
491+
if (launched_from_installer) kill_local_server();
451492
});
452493

453494
mainWindow.on('close', function() {
@@ -510,3 +551,8 @@ app.on('open-url', function(event, uri) {
510551
openURL(uri);
511552
event.preventDefault();
512553
});
554+
555+
// some cleanup when our app is exiting
556+
process.on('exit', () => {
557+
kill_local_server();
558+
});

0 commit comments

Comments
 (0)