diff --git a/auto/gui.files.go b/auto/gui.files.go index b29ad2ff..175db254 100644 --- a/auto/gui.files.go +++ b/auto/gui.files.go @@ -27,7 +27,7 @@ func Assets() map[string][]byte { bs, _ = ioutil.ReadAll(gr) assets["angular/angular.min.js"] = bs - bs, _ = base64.StdEncoding.DecodeString("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") + bs, _ = base64.StdEncoding.DecodeString("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") gr, _ = gzip.NewReader(bytes.NewBuffer(bs)) bs, _ = ioutil.ReadAll(gr) assets["app.js"] = bs diff --git a/gui/app.js b/gui/app.js index a2578412..5ef4b145 100644 --- a/gui/app.js +++ b/gui/app.js @@ -9,9 +9,6 @@ var syncthing = angular.module('syncthing', ['pascalprecht.translate']); var urlbase = 'rest'; -var requestTimeout = 300000; // Retry the REST request after 5 minutes without reply -var refreshTimeout = 5000; // Do not refresh the generic status faster than 5 seconds -var refreshQuickTimeout = 500; // Do not refresh the quick stats faster than 500 milliseconds syncthing.config(function ($httpProvider, $translateProvider) { $httpProvider.defaults.xsrfHeaderName = 'X-CSRF-Token'; @@ -252,19 +249,19 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http, $translate, $loca }); }); - var nextCall = {}; + var debouncedFuncs = {}; function refreshRepo(repo) { var key = "refreshRepo" + repo; - if (nextCall[key] && nextCall[key] > Date.now()) { - return; + if (!debouncedFuncs[key]) { + debouncedFuncs[key] = debounce(function () { + $http.get(urlbase + '/model?repo=' + encodeURIComponent(repo)).success(function (data) { + $scope.model[repo] = data; + console.log("refreshRepo", repo, data); + }); + }, 1000, true); } - nextCall[key] = Date.now() + requestTimeout; - $http.get(urlbase + '/model?repo=' + encodeURIComponent(repo)).success(function (data) { - nextCall[key] = Date.now() + refreshTimeout; - $scope.model[repo] = data; - console.log("refreshRepo", repo, data); - }); + debouncedFuncs[key](); } function updateLocalConfig(config) { @@ -295,13 +292,7 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http, $translate, $loca } function refreshSystem() { - var key = "refreshSystem" - if (nextCall[key] && nextCall[key] > Date.now()) { - return; - } - nextCall[key] = Date.now() + requestTimeout; $http.get(urlbase + '/system').success(function (data) { - nextCall[key] = Date.now() + refreshQuickTimeout; $scope.myID = data.myID; $scope.system = data; console.log("refreshSystem", data); @@ -314,40 +305,34 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http, $translate, $loca } var key = "refreshCompletion" + node + repo; - if (nextCall[key] && nextCall[key] > Date.now()) { - return; + if (!debouncedFuncs[key]) { + debouncedFuncs[key] = debounce(function () { + $http.get(urlbase + '/completion?node=' + node + '&repo=' + encodeURIComponent(repo)).success(function (data) { + if (!$scope.completion[node]) { + $scope.completion[node] = {}; + } + $scope.completion[node][repo] = data.completion; + + var tot = 0, + cnt = 0; + for (var cmp in $scope.completion[node]) { + if (cmp === "_total") { + continue; + } + tot += $scope.completion[node][cmp]; + cnt += 1; + } + $scope.completion[node]._total = tot / cnt; + + console.log("refreshCompletion", node, repo, $scope.completion[node]); + }); + }, 1000, true); } - nextCall[key] = Date.now() + requestTimeout; - $http.get(urlbase + '/completion?node=' + node + '&repo=' + encodeURIComponent(repo)).success(function (data) { - nextCall[key] = Date.now() + refreshTimeout; - if (!$scope.completion[node]) { - $scope.completion[node] = {}; - } - $scope.completion[node][repo] = data.completion; - - var tot = 0, - cnt = 0; - for (var cmp in $scope.completion[node]) { - if (cmp === "_total") { - continue; - } - tot += $scope.completion[node][cmp]; - cnt += 1; - } - $scope.completion[node]._total = tot / cnt; - - console.log("refreshCompletion", node, repo, $scope.completion[node]); - }); + debouncedFuncs[key](); } function refreshConnectionStats() { - var key = "refreshConnectionStats" - if (nextCall[key] && nextCall[key] > Date.now()) { - return; - } - nextCall[key] = Date.now() + requestTimeout; $http.get(urlbase + '/connections').success(function (data) { - nextCall[key] = Date.now() + refreshQuickTimeout; var now = Date.now(), td = (now - prevDate) / 1000, id; @@ -371,13 +356,7 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http, $translate, $loca } function refreshErrors() { - var key = "refreshErrors" - if (nextCall[key] && nextCall[key] > Date.now()) { - return; - } - nextCall[key] = Date.now() + requestTimeout; $http.get(urlbase + '/errors').success(function (data) { - nextCall[key] = Date.now() + refreshQuickTimeout; $scope.errors = data.errors; console.log("refreshErrors", data); }); @@ -394,14 +373,8 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http, $translate, $loca }); } - var refreshNodeStats = function () { - var key = "refreshNode"; - if (nextCall[key] && nextCall[key] > Date.now()) { - return; - } - nextCall[key] = Date.now() + requestTimeout; + var refreshNodeStats = debounce(function () { $http.get(urlbase + "/stats/node").success(function (data) { - nextCall[key] = Date.now() + refreshTimeout; $scope.stats = data; for (var node in $scope.stats) { $scope.stats[node].LastSeen = new Date($scope.stats[node].LastSeen); @@ -409,7 +382,7 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http, $translate, $loca } console.log("refreshNodeStats", data); }); - } + }, 500); $scope.init = function () { refreshSystem(); @@ -1061,6 +1034,40 @@ function isEmptyObject(obj) { return true; } +function debounce(func, wait) { + var timeout, args, context, timestamp, result, again; + + var later = function () { + var last = Date.now() - timestamp; + if (last < wait) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + if (again) { + again = false; + result = func.apply(context, args); + context = args = null; + } + } + }; + + return function () { + context = this; + args = arguments; + timestamp = Date.now(); + var callNow = !timeout; + if (!timeout) { + timeout = setTimeout(later, wait); + result = func.apply(context, args); + context = args = null; + } else { + again = true; + } + + return result; + }; +} + syncthing.filter('natural', function () { return function (input, valid) { return input.toFixed(decimals(input, valid));