aboutsummaryrefslogtreecommitdiffstats
path: root/lib/assets/javascripts/cable/connection_monitor.js.coffee
diff options
context:
space:
mode:
Diffstat (limited to 'lib/assets/javascripts/cable/connection_monitor.js.coffee')
-rw-r--r--lib/assets/javascripts/cable/connection_monitor.js.coffee41
1 files changed, 41 insertions, 0 deletions
diff --git a/lib/assets/javascripts/cable/connection_monitor.js.coffee b/lib/assets/javascripts/cable/connection_monitor.js.coffee
new file mode 100644
index 0000000000..078e1d3b26
--- /dev/null
+++ b/lib/assets/javascripts/cable/connection_monitor.js.coffee
@@ -0,0 +1,41 @@
+class Cable.ConnectionMonitor
+ MAX_CONNECTION_INTERVAL: 5 * 1000
+ PING_STALE_INTERVAL: 8 * 1000
+
+ identifier: Cable.PING_IDENTIFIER
+
+ constructor: (@cable) ->
+ @reset()
+ @cable.subscribers.add(this)
+ @pollConnection()
+
+ connected: ->
+ @reset()
+ @pingedAt = now()
+
+ received: ->
+ @pingedAt = now()
+
+ reset: ->
+ @connectionAttempts = 1
+
+ pollConnection: ->
+ setTimeout =>
+ @reconnect() if @connectionIsStale()
+ @pollConnection()
+ , @getPollTimeout()
+
+ getPollTimeout: ->
+ interval = (Math.pow(2, @connectionAttempts) - 1) * 1000
+ if interval > @MAX_CONNECTION_INTERVAL then @MAX_CONNECTION_INTERVAL else interval
+
+ connectionIsStale: ->
+ @pingedAt? and (now() - @pingedAt) > @PING_STALE_INTERVAL
+
+ reconnect: ->
+ console.log "Ping took too long to arrive. Reconnecting.."
+ @connectionAttempts += 1
+ @cable.connection.connect()
+
+ now = ->
+ new Date().getTime()