RealTimeClient.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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('@overleaf/settings')
  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('sess:' + sessionId, JSON.stringify(session), error => {
  44. if (error != null) {
  45. return callback(error)
  46. }
  47. const secret = Settings.security.sessionSecret
  48. const cookieKey = 's:' + signature.sign(sessionId, secret)
  49. Client.cookie = `${Settings.cookieName}=${cookieKey}`
  50. return callback()
  51. })
  52. },
  53. unsetSession(callback) {
  54. if (callback == null) {
  55. callback = function (error) {}
  56. }
  57. Client.cookie = null
  58. return callback()
  59. },
  60. connect(cookie) {
  61. const client = io.connect('http://localhost:3026', {
  62. 'force new connection': true,
  63. })
  64. client.on(
  65. 'connectionAccepted',
  66. (_, publicId) => (client.publicId = publicId)
  67. )
  68. return client
  69. },
  70. getConnectedClients(callback) {
  71. if (callback == null) {
  72. callback = function (error, clients) {}
  73. }
  74. return request.get(
  75. {
  76. url: 'http://localhost:3026/clients',
  77. json: true,
  78. },
  79. (error, response, data) => callback(error, data)
  80. )
  81. },
  82. getConnectedClient(client_id, callback) {
  83. if (callback == null) {
  84. callback = function (error, clients) {}
  85. }
  86. return request.get(
  87. {
  88. url: `http://localhost:3026/clients/${client_id}`,
  89. json: true,
  90. },
  91. (error, response, data) => callback(error, data)
  92. )
  93. },
  94. disconnectClient(client_id, callback) {
  95. request.post(
  96. {
  97. url: `http://localhost:3026/client/${client_id}/disconnect`,
  98. auth: {
  99. user: Settings.internal.realTime.user,
  100. pass: Settings.internal.realTime.pass,
  101. },
  102. },
  103. (error, response, data) => callback(error, data)
  104. )
  105. return null
  106. },
  107. disconnectAllClients(callback) {
  108. return Client.getConnectedClients((error, clients) =>
  109. async.each(
  110. clients,
  111. (clientView, cb) => Client.disconnectClient(clientView.client_id, cb),
  112. callback
  113. )
  114. )
  115. },
  116. }