1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Tweak reconnect timing

This commit is contained in:
Javan Makhmali 2015-10-14 18:07:08 -05:00
parent 889d8ae3d7
commit c0e554c943

View file

@ -1,15 +1,13 @@
# Responsible for ensuring the cable connection is in good health by validating the heartbeat pings sent from the server, and attempting # Responsible for ensuring the cable connection is in good health by validating the heartbeat pings sent from the server, and attempting
# revival reconnections if things go astray. Internal class, not intended for direct user manipulation. # revival reconnections if things go astray. Internal class, not intended for direct user manipulation.
class Cable.ConnectionMonitor class Cable.ConnectionMonitor
identifier: Cable.PING_IDENTIFIER @pollInterval:
min: 3
pollInterval:
min: 2
max: 30 max: 30
staleThreshold: @staleThreshold: 6 # Server::Connections::BEAT_INTERVAL * 2 (missed two pings)
startedAt: 4
pingedAt: 8 identifier: Cable.PING_IDENTIFIER
constructor: (@consumer) -> constructor: (@consumer) ->
@consumer.subscriptions.add(this) @consumer.subscriptions.add(this)
@ -18,8 +16,10 @@ class Cable.ConnectionMonitor
connected: -> connected: ->
@reset() @reset()
@pingedAt = now() @pingedAt = now()
delete @disconnectedAt
disconnected: -> disconnected: ->
@disconnectedAt = now()
received: -> received: ->
@pingedAt = now() @pingedAt = now()
@ -46,20 +46,21 @@ class Cable.ConnectionMonitor
, @getInterval() , @getInterval()
getInterval: -> getInterval: ->
{min, max} = @pollInterval {min, max} = @constructor.pollInterval
interval = 4 * Math.log(@reconnectAttempts + 1) interval = 5 * Math.log(@reconnectAttempts + 1)
clamp(interval, min, max) * 1000 clamp(interval, min, max) * 1000
reconnectIfStale: -> reconnectIfStale: ->
if @connectionIsStale() if @connectionIsStale()
@reconnectAttempts++ @reconnectAttempts++
unless @disconnectedRecently()
@consumer.connection.reopen() @consumer.connection.reopen()
connectionIsStale: -> connectionIsStale: ->
if @pingedAt secondsSince(@pingedAt ? @startedAt) > @constructor.staleThreshold
secondsSince(@pingedAt) > @staleThreshold.pingedAt
else disconnectedRecently: ->
secondsSince(@startedAt) > @staleThreshold.startedAt @disconnectedAt and secondsSince(@disconnectedAt) < @constructor.staleThreshold
visibilityDidChange: => visibilityDidChange: =>
if document.visibilityState is "visible" if document.visibilityState is "visible"