ConnectionManager.coffee 2.0 KB

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