   connected: ->
     @reset()
     @pingedAt = now()
+    delete @disconnectedAt
 
   disconnected: ->
+    @disconnectedAt = now()
 
   received: ->
     @pingedAt = now()

    , @getInterval()

  getInterval: ->
    {min, max} = @pollInterval
    interval = 4 * Math.log(@reconnectAttempts + 1)
    clamp(interval, min, max) * 1000

  reconnectIfStale: ->
    if @connectionIsStale()
      @reconnectAttempts++
      @consumer.connection.reopen()

  connectionIsStale: ->
    if @pingedAt
      secondsSince(@pingedAt) > @staleThreshold.pingedAt
    else
      secondsSince(@startedAt) > @staleThreshold.startedAt

  visibilityDidChange: =>
    if document.visibilityState is "visible"

# 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.
class Cable.ConnectionMonitor
  @pollInterval:
    min: 3
    max: 30

  @staleThreshold: 6 # Server::Connections::BEAT_INTERVAL * 2 (missed two pings)

  identifier: Cable.PING_IDENTIFIER

  constructor: (@consumer) ->
    @consumer.subscriptions.add(this)
