From 63cec660ca7fddce7803e64825c6b6b7f569b879 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Wed, 8 Jun 2016 16:21:25 +0200 Subject: [PATCH] Solve a race condition that could cause 401 responses and a broken UI Closes #1364. See ticket for details. --- src/octoprint/static/js/app/dataupdater.js | 15 +++++++-- src/octoprint/static/js/app/main.js | 31 ++++++++++++------- .../static/js/app/viewmodels/files.js | 6 +--- .../static/js/app/viewmodels/loginstate.js | 7 ++--- 4 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/octoprint/static/js/app/dataupdater.js b/src/octoprint/static/js/app/dataupdater.js index 6296e530..8ffb4c1f 100644 --- a/src/octoprint/static/js/app/dataupdater.js +++ b/src/octoprint/static/js/app/dataupdater.js @@ -16,12 +16,16 @@ function DataUpdater(allViewModels) { self._lastProcessingTimes = []; self._lastProcessingTimesSize = 20; - self.connect = function() { + self._connectCallback = undefined; + + self.connect = function(callback) { var options = {}; if (SOCKJS_DEBUG) { options["debug"] = true; } + self._connectCallback = callback; + self._socket = new SockJS(SOCKJS_URI, undefined, options); self._socket.onopen = self._onconnect; self._socket.onclose = self._onclose; @@ -184,6 +188,13 @@ function DataUpdater(allViewModels) { self.setThrottle(1); + log.info("Connected to the server"); + + if (self._connectCallback) { + self._connectCallback(); + self._connectCallback = undefined; + } + break; } case "history": { @@ -334,6 +345,4 @@ function DataUpdater(allViewModels) { } } }; - - self.connect(); } diff --git a/src/octoprint/static/js/app/main.js b/src/octoprint/static/js/app/main.js index 7c9ff6fb..2ead5fc7 100644 --- a/src/octoprint/static/js/app/main.js +++ b/src/octoprint/static/js/app/main.js @@ -276,8 +276,6 @@ $(function() { } log.info("... dependency resolution done"); - var dataUpdater = new DataUpdater(allViewModels); - //~~ Custom knockout.js bindings ko.bindingHandlers.popover = { @@ -517,14 +515,6 @@ $(function() { // reload overlay $("#reloadui_overlay_reload").click(function() { location.reload(); }); - //~~ Starting up the app - - _.each(allViewModels, function(viewModel) { - if (viewModel.hasOwnProperty("onStartup")) { - viewModel.onStartup(); - } - }); - //~~ view model binding var bindViewModels = function() { @@ -614,12 +604,31 @@ $(function() { } }); }); + + log.info("Application startup complete"); }; if (!_.has(viewModelMap, "settingsViewModel")) { throw new Error("settingsViewModel is missing, can't run UI") } - viewModelMap["settingsViewModel"].requestData(bindViewModels); + + var dataUpdaterConnectCallback = function() { + log.info("Finalizing application startup"); + + //~~ Starting up the app + + _.each(allViewModels, function(viewModel) { + if (viewModel.hasOwnProperty("onStartup")) { + viewModel.onStartup(); + } + }); + + viewModelMap["settingsViewModel"].requestData(bindViewModels); + }; + + log.info("Initial application setup done, connecting to server..."); + var dataUpdater = new DataUpdater(allViewModels); + dataUpdater.connect(dataUpdaterConnectCallback); } ); diff --git a/src/octoprint/static/js/app/viewmodels/files.js b/src/octoprint/static/js/app/viewmodels/files.js index 9f0d6cb2..1e2a063a 100644 --- a/src/octoprint/static/js/app/viewmodels/files.js +++ b/src/octoprint/static/js/app/viewmodels/files.js @@ -446,11 +446,7 @@ $(function() { self._enableDragNDrop(true); self.requestData(); }; - - self.onServerReconnect = function(payload) { - self._enableDragNDrop(true); - self.requestData(); - }; + self.onServerReconnect = self.onServerConnect; self.onServerDisconnect = function(payload) { self._enableDragNDrop(false); diff --git a/src/octoprint/static/js/app/viewmodels/loginstate.js b/src/octoprint/static/js/app/viewmodels/loginstate.js index 8b529936..36f6f0ff 100644 --- a/src/octoprint/static/js/app/viewmodels/loginstate.js +++ b/src/octoprint/static/js/app/viewmodels/loginstate.js @@ -129,13 +129,10 @@ $(function() { self.allViewModels = allViewModels; }; - self.onDataUpdaterReconnect = function() { - self.requestData(); - }; - - self.onStartupComplete = function() { + self.onServerConnect = function() { self.requestData(); }; + self.onServerReconnect = self.onServerConnect; } OCTOPRINT_VIEWMODELS.push([