RealTimeClient.js 3.2 KB

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