ConnectionManager.coffee 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. @ide.pushEvent("connected")
  12. @hideModal()
  13. @cancelReconnect()
  14. @socket.on 'disconnect', () =>
  15. @connected = false
  16. @ide.pushEvent("disconnected")
  17. @ide.trigger "disconnect"
  18. setTimeout(=>
  19. ga('send', 'event', 'editor-interaction', 'disconnect')
  20. , 2000)
  21. if !@forcedDisconnect
  22. @showModalAndStartAutoReconnect()
  23. @socket.on 'forceDisconnect', (message) =>
  24. @showModal(message)
  25. @forcedDisconnect = true
  26. @socket.disconnect()
  27. @messageEl = $("#connectionLostMessage")
  28. $('#try-reconnect-now').on 'click', (e) =>
  29. e.preventDefault()
  30. @tryReconnect()
  31. @hideModal()
  32. reconnectImmediately: () ->
  33. @disconnect()
  34. @tryReconnect()
  35. disconnect: () ->
  36. @socket.disconnect()
  37. showModalAndStartAutoReconnect: () ->
  38. @hideModal()
  39. twoMinutes = 2 * 60 * 1000
  40. if @ide.editor? and @ide.editor.lastUpdated? and new Date() - @ide.editor.lastUpdated > twoMinutes
  41. # between 1 minute and 3 minutes
  42. @countdown = 60 + Math.floor(Math.random() * 120)
  43. else
  44. @countdown = 3 + Math.floor(Math.random() * 7)
  45. $("#reconnection-countdown").text(@countdown)
  46. setTimeout(=>
  47. if !@connected
  48. @showModal()
  49. @timeoutId = setTimeout (=> @decreaseCountdown()), 1000
  50. , 200)
  51. showModal: () =>
  52. @messageEl.show()
  53. $("#reconnecting").hide()
  54. $("#trying-reconnect").show()
  55. hideModal: () ->
  56. @messageEl.hide()
  57. cancelReconnect: () ->
  58. clearTimeout @timeoutId if @timeoutId?
  59. decreaseCountdown: () ->
  60. @countdown--
  61. $("#reconnection-countdown").text(@countdown)
  62. if @countdown <= 0
  63. @tryReconnect()
  64. else
  65. @timeoutId = setTimeout (=> @decreaseCountdown()), 1000
  66. tryReconnect: () ->
  67. @cancelReconnect()
  68. $("#reconnecting").show()
  69. $("#trying-reconnect").hide()
  70. @socket.socket.reconnect()
  71. setTimeout (=> @showModalAndStartAutoReconnect() if !@connected), 1000