ConnectedUsersManager.coffee 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. _ = require("underscore")
  2. async = require("async")
  3. Settings = require('settings-sharelatex')
  4. logger = require("logger-sharelatex")
  5. redis = require('redis')
  6. rclient = redis.createClient(Settings.redis.web.port, Settings.redis.web.host)
  7. rclient.auth(Settings.redis.web.password)
  8. ONE_HOUR_IN_S = 60 * 60
  9. ONE_DAY_IN_S = ONE_HOUR_IN_S * 24
  10. FOUR_DAYS_IN_S = ONE_DAY_IN_S * 4
  11. USER_TIMEOUT_IN_S = ONE_HOUR_IN_S
  12. buildProjectSetKey = (project_id)-> return "clients_in_project:#{project_id}"
  13. buildUserKey = (project_id, client_id)-> return "connected_user:#{project_id}:#{client_id}"
  14. module.exports =
  15. markUserAsConnected: (project_id, client_id, user, callback = (err)->)->
  16. logger.log project_id:project_id, client_id:client_id, "marking user as connected"
  17. multi = rclient.multi()
  18. multi.sadd buildProjectSetKey(project_id), client_id
  19. multi.expire buildProjectSetKey(project_id), FOUR_DAYS_IN_S
  20. multi.hset buildUserKey(project_id, client_id), "connected_at", Date.now()
  21. multi.hset buildUserKey(project_id, client_id), "user_id", user._id
  22. multi.hset buildUserKey(project_id, client_id), "first_name", user.first_name
  23. multi.hset buildUserKey(project_id, client_id), "last_name", user.last_name
  24. multi.hset buildUserKey(project_id, client_id), "email", user.email
  25. multi.expire buildUserKey(project_id, client_id), USER_TIMEOUT_IN_S
  26. multi.exec (err)->
  27. if err?
  28. logger.err err:err, project_id:project_id, client_id:client_id, "problem marking user as connected"
  29. callback(err)
  30. markUserAsDisconnected: (project_id, client_id, callback)->
  31. logger.log project_id:project_id, client_id:client_id, "marking user as disconnected"
  32. multi = rclient.multi()
  33. multi.srem buildProjectSetKey(project_id), client_id
  34. multi.expire buildProjectSetKey(project_id), FOUR_DAYS_IN_S
  35. multi.del buildUserKey(project_id, client_id)
  36. multi.exec callback
  37. _getConnectedUser: (project_id, client_id, callback)->
  38. rclient.hgetall buildUserKey(project_id, client_id), (err, result)->
  39. if !result?
  40. result =
  41. connected : false
  42. client_id:client_id
  43. else
  44. result.connected = true
  45. result.client_id = client_id
  46. if result.cursorData?
  47. result.cursorData = JSON.parse(result.cursorData)
  48. callback err, result
  49. setUserCursorPosition: (project_id, client_id, cursorData, callback)->
  50. multi = rclient.multi()
  51. multi.hset buildUserKey(project_id, client_id), "cursorData", JSON.stringify(cursorData)
  52. multi.expire buildUserKey(project_id, client_id), USER_TIMEOUT_IN_S
  53. multi.exec callback
  54. getConnectedUsers: (project_id, callback)->
  55. self = @
  56. rclient.smembers buildProjectSetKey(project_id), (err, results)->
  57. jobs = results.map (client_id)->
  58. (cb)->
  59. self._getConnectedUser(project_id, client_id, cb)
  60. async.series jobs, (err, users)->
  61. users = _.filter users, (user)->
  62. user.connected
  63. callback err, users