Router.coffee 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. Metrics = require "metrics-sharelatex"
  2. logger = require "logger-sharelatex"
  3. WebsocketController = require "./WebsocketController"
  4. HttpController = require "./HttpController"
  5. Utils = require "./Utils"
  6. module.exports = Router =
  7. _handleError: (callback, error, client, method, extraAttrs = {}) ->
  8. Utils.getClientAttributes client, ["project_id", "doc_id", "user_id"], (_, attrs) ->
  9. for key, value of extraAttrs
  10. attrs[key] = value
  11. attrs.client_id = client.id
  12. attrs.err = error
  13. logger.error attrs, "server side error in #{method}"
  14. # Don't return raw error to prevent leaking server side info
  15. console.log "CALLING CALLBACK", callback
  16. return callback {message: "Something went wrong"}
  17. configure: (app, io, session) ->
  18. app.set("io", io)
  19. app.get "/clients", HttpController.getConnectedClients
  20. app.get "/clients/:client_id", HttpController.getConnectedClient
  21. session.on 'connection', (error, client, session) ->
  22. if error?
  23. logger.err err: error, "error when client connected"
  24. client?.disconnect()
  25. return
  26. Metrics.inc('socket-io.connection')
  27. logger.log session: session, client_id: client.id, "client connected"
  28. user = session.user
  29. if !user? or !user._id?
  30. logger.log "terminating session without authenticated user"
  31. client.disconnect()
  32. return
  33. client.on "joinProject", (data = {}, callback) ->
  34. WebsocketController.joinProject client, user, data.project_id, (err, args...) ->
  35. if err?
  36. Router._handleError callback, err, client, "joinProject", {project_id: data.project_id, user_id: user?.id}
  37. else
  38. callback(null, args...)
  39. client.on "joinDoc", (doc_id, fromVersion, callback) ->
  40. # fromVersion is optional
  41. if typeof fromVersion == "function"
  42. callback = fromVersion
  43. fromVersion = -1
  44. WebsocketController.joinDoc client, doc_id, fromVersion, (err, args...) ->
  45. if err?
  46. Router._handleError callback, err, client, "joinDoc", {doc_id, fromVersion}
  47. else
  48. callback(null, args...)
  49. client.on "leaveDoc", (doc_id, callback) ->
  50. WebsocketController.leaveDoc client, doc_id, (err, args...) ->
  51. if err?
  52. Router._handleError callback, err, client, "leaveDoc"
  53. else
  54. callback(null, args...)
  55. client.on "clientTracking.getConnectedUsers", (callback = (error, users) ->) ->
  56. WebsocketController.getConnectedUsers client, (err, users) ->
  57. if err?
  58. Router._handleError callback, err, client, "clientTracking.getConnectedUsers"
  59. else
  60. callback(null, users)
  61. client.on "clientTracking.updatePosition", (cursorData, callback = (error) ->) ->
  62. WebsocketController.updateClientPosition client, cursorData, (err) ->
  63. if err?
  64. Router._handleError callback, err, client, "clientTracking.updatePosition"
  65. else
  66. callback()
  67. client.on "applyOtUpdate", (doc_id, update, callback = (error) ->) ->
  68. WebsocketController.applyOtUpdate client, doc_id, update, (err) ->
  69. if err?
  70. Router._handleError callback, err, client, "applyOtUpdate", {doc_id, update}
  71. else
  72. callback()