From 2d772eaaa8dfe6a8aeba9a67b50fafd2c74c0c0c Mon Sep 17 00:00:00 2001
From: Christoph Wurst <christoph@winzerhof-wurst.at>
Date: Thu, 14 Apr 2016 11:12:15 +0200
Subject: [PATCH] Debounce heartbeat ajax calls to lower the number of requests
 fixes #22397

---
 core/js/js.js                   | 12 +++++++++---
 core/js/tests/specs/coreSpec.js |  4 +++-
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/core/js/js.js b/core/js/js.js
index 598e0dcd185..802b5de7e18 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -1498,9 +1498,15 @@ function initCore() {
 			interval = maxInterval;
 		}
 		var url = OC.generateUrl('/heartbeat');
-		setInterval(function(){
-			$.post(url);
-		}, interval * 1000);
+		var heartBeatTimeout = null;
+		var heartBeat = function() {
+			clearTimeout(heartBeatTimeout);
+			heartBeatTimeout = setInterval(function() {
+				$.post(url);
+			}, interval * 1000);
+		};
+		$(document).ajaxComplete(heartBeat);
+		heartBeat();
 	}
 
 	// session heartbeat (defaults to enabled)
diff --git a/core/js/tests/specs/coreSpec.js b/core/js/tests/specs/coreSpec.js
index f18ecbc1a44..09271f1ab9a 100644
--- a/core/js/tests/specs/coreSpec.js
+++ b/core/js/tests/specs/coreSpec.js
@@ -305,6 +305,7 @@ describe('Core base tests', function() {
 				counter++;
 				xhr.respond(200, {'Content-Type': 'application/json'}, '{}');
 			});
+			$(document).off('ajaxComplete'); // ignore previously registered heartbeats
 		});
 		afterEach(function() {
 			clock.restore();
@@ -312,6 +313,7 @@ describe('Core base tests', function() {
 			window.oc_config = oldConfig;
 			routeStub.restore();
 			$(document).off('ajaxError');
+			$(document).off('ajaxComplete');
 		});
 		it('sends heartbeat half the session lifetime when heartbeat enabled', function() {
 			/* jshint camelcase: false */
@@ -340,7 +342,7 @@ describe('Core base tests', function() {
 			clock.tick(20 * 1000);
 			expect(counter).toEqual(2);
 		});
-		it('does no send heartbeat when heartbeat disabled', function() {
+		it('does not send heartbeat when heartbeat disabled', function() {
 			/* jshint camelcase: false */
 			window.oc_config = {
 				session_keepalive: false,
-- 
GitLab