ConnectionManager.coffee 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. define [
  2. "utils/Modal"
  3. "libs/backbone"
  4. ], (Modal) ->
  5. class ConnectionManager
  6. constructor: (@ide) ->
  7. @connected = false
  8. @socket = @ide.socket
  9. @socket.on "connect", () =>
  10. @connected = true
  11. @hideModal()
  12. @cancelReconnect()
  13. @socket.on 'disconnect', () =>
  14. @connected = false
  15. @ide.trigger "disconnect"
  16. setTimeout(=>
  17. ga('send', 'event', 'editor-interaction', 'disconnect')
  18. , 2000)
  19. if !@forcedDisconnect
  20. @showModalAndStartAutoReconnect()
  21. @socket.on 'forceDisconnect', (message) =>
  22. @showModal(message)
  23. @forcedDisconnect = true
  24. @socket.disconnect()
  25. @messageEl = $("#connectionLostMessage")
  26. $('#try-reconnect-now').on 'click', (e) =>
  27. e.preventDefault()
  28. @tryReconnect()
  29. @hideModal()
  30. showModalAndStartAutoReconnect: () ->
  31. @hideModal()
  32. twoMinutes = 2 * 60 * 1000
  33. if @ide.editor? and @ide.editor.lastUpdated? and new Date() - @ide.editor.lastUpdated > twoMinutes
  34. # between 1 minute and 3 minutes
  35. @countdown = 60 + Math.floor(Math.random() * 120)
  36. else
  37. @countdown = 3 + Math.floor(Math.random() * 7)
  38. $("#reconnection-countdown").text(@countdown)
  39. setTimeout(=>
  40. if !@connected
  41. @showModal()
  42. @timeoutId = setTimeout (=> @decreaseCountdown()), 1000
  43. , 200)
  44. showModal: () =>
  45. @messageEl.show()
  46. $("#reconnecting").hide()
  47. $("#trying-reconnect").show()
  48. hideModal: () ->
  49. @messageEl.hide()
  50. cancelReconnect: () ->
  51. clearTimeout @timeoutId if @timeoutId?
  52. decreaseCountdown: () ->
  53. @countdown--
  54. $("#reconnection-countdown").text(@countdown)
  55. if @countdown <= 0
  56. @tryReconnect()
  57. else
  58. @timeoutId = setTimeout (=> @decreaseCountdown()), 1000
  59. tryReconnect: () ->
  60. @cancelReconnect()
  61. $("#reconnecting").show()
  62. $("#trying-reconnect").hide()
  63. @socket.socket.reconnect()
  64. setTimeout (=> @showModalAndStartAutoReconnect() if !@connected), 1000