RealTimeClient.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /* eslint-disable
  2. camelcase,
  3. no-return-assign,
  4. */
  5. // TODO: This file was created by bulk-decaffeinate.
  6. // Fix any style issues and re-enable lint.
  7. /*
  8. * decaffeinate suggestions:
  9. * DS102: Remove unnecessary code created because of implicit returns
  10. * DS207: Consider shorter variations of null checks
  11. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  12. */
  13. let Client
  14. const { XMLHttpRequest } = require('../../libs/XMLHttpRequest')
  15. const io = require('socket.io-client')
  16. const async = require('async')
  17. const request = require('request')
  18. const Settings = require('@overleaf/settings')
  19. const redis = require('@overleaf/redis-wrapper')
  20. const rclient = redis.createClient(Settings.redis.websessions)
  21. const uid = require('uid-safe').sync
  22. const signature = require('cookie-signature')
  23. io.util.request = function () {
  24. const xhr = new XMLHttpRequest()
  25. const _open = xhr.open
  26. xhr.open = function () {
  27. _open.apply(xhr, arguments)
  28. if (Client.cookie != null) {
  29. return xhr.setRequestHeader('Cookie', Client.cookie)
  30. }
  31. }
  32. return xhr
  33. }
  34. module.exports = Client = {
  35. cookie: null,
  36. setSession(session, callback) {
  37. if (callback == null) {
  38. callback = function () {}
  39. }
  40. const sessionId = uid(24)
  41. session.cookie = {}
  42. return rclient.set('sess:' + sessionId, JSON.stringify(session), error => {
  43. if (error != null) {
  44. return callback(error)
  45. }
  46. const secret = Settings.security.sessionSecret
  47. const cookieKey = 's:' + signature.sign(sessionId, secret)
  48. Client.cookie = `${Settings.cookieName}=${cookieKey}`
  49. return callback()
  50. })
  51. },
  52. unsetSession(callback) {
  53. if (callback == null) {
  54. callback = function () {}
  55. }
  56. Client.cookie = null
  57. return callback()
  58. },
  59. connect(cookie) {
  60. const client = io.connect('http://localhost:3026', {
  61. 'force new connection': true,
  62. })
  63. client.on(
  64. 'connectionAccepted',
  65. (_, publicId) => (client.publicId = publicId)
  66. )
  67. return client
  68. },
  69. getConnectedClients(callback) {
  70. if (callback == null) {
  71. callback = function () {}
  72. }
  73. return request.get(
  74. {
  75. url: 'http://localhost:3026/clients',
  76. json: true,
  77. },
  78. (error, response, data) => callback(error, data)
  79. )
  80. },
  81. getConnectedClient(client_id, callback) {
  82. if (callback == null) {
  83. callback = function () {}
  84. }
  85. return request.get(
  86. {
  87. url: `http://localhost:3026/clients/${client_id}`,
  88. json: true,
  89. },
  90. (error, response, data) => callback(error, data)
  91. )
  92. },
  93. disconnectClient(client_id, callback) {
  94. request.post(
  95. {
  96. url: `http://localhost:3026/client/${client_id}/disconnect`,
  97. },
  98. (error, response, data) => callback(error, data)
  99. )
  100. return null
  101. },
  102. disconnectAllClients(callback) {
  103. return Client.getConnectedClients((error, clients) => {
  104. if (error) return callback(error)
  105. async.each(
  106. clients,
  107. (clientView, cb) => Client.disconnectClient(clientView.client_id, cb),
  108. callback
  109. )
  110. })
  111. },
  112. }