From 866859a9375a454db8656735eb588a6214a2c835 Mon Sep 17 00:00:00 2001 From: Jesse Mazzella Date: Thu, 6 Oct 2022 12:41:38 -0700 Subject: [PATCH] [CouchDB] Re-establish feed connection if EventSource is closed due to error (#5845) * Re-establish feed connection if EventSource is closed due to error * Use keepAlive timer * Get rid of magic numbers and add comment --- .../persistence/couch/CouchChangesFeed.js | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/plugins/persistence/couch/CouchChangesFeed.js b/src/plugins/persistence/couch/CouchChangesFeed.js index 3c1445cec7..4547c6c9e4 100644 --- a/src/plugins/persistence/couch/CouchChangesFeed.js +++ b/src/plugins/persistence/couch/CouchChangesFeed.js @@ -2,6 +2,9 @@ const connections = []; let connected = false; let couchEventSource; + let changesFeedUrl; + const keepAliveTime = 20 * 1000; + let keepAliveTimer; const controller = new AbortController(); self.onconnect = function (e) { @@ -35,7 +38,8 @@ return; } - self.listenForChanges(event.data.url); + changesFeedUrl = event.data.url; + self.listenForChanges(); } }; @@ -63,17 +67,28 @@ }); }; - self.listenForChanges = function (url) { - console.debug('⇿ Opening CouchDB change feed connection ⇿'); + self.listenForChanges = function () { + if (keepAliveTimer) { + clearTimeout(keepAliveTimer); + } - couchEventSource = new EventSource(url); - couchEventSource.onerror = self.onerror; - couchEventSource.onopen = self.onopen; + /** + * Once the connection has been opened, poll every 20 seconds to see if the EventSource has closed unexpectedly. + * If it has, attempt to reconnect. + */ + keepAliveTimer = setTimeout(self.listenForChanges, keepAliveTime); - // start listening for events - couchEventSource.addEventListener('message', self.onCouchMessage); - connected = true; - console.debug('⇿ Opened connection ⇿'); + if (!couchEventSource || couchEventSource.readyState === EventSource.CLOSED) { + console.debug('⇿ Opening CouchDB change feed connection ⇿'); + couchEventSource = new EventSource(changesFeedUrl); + couchEventSource.onerror = self.onerror; + couchEventSource.onopen = self.onopen; + + // start listening for events + couchEventSource.addEventListener('message', self.onCouchMessage); + connected = true; + console.debug('⇿ Opened connection ⇿'); + } }; self.updateCouchStateIndicator = function () {