RealTimeClient.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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 {
  16. XMLHttpRequest
  17. } = require("../../libs/XMLHttpRequest");
  18. const io = require("socket.io-client");
  19. const async = require("async");
  20. const request = require("request");
  21. const Settings = require("settings-sharelatex");
  22. const redis = require("redis-sharelatex");
  23. const rclient = redis.createClient(Settings.redis.websessions);
  24. const uid = require('uid-safe').sync;
  25. const signature = require("cookie-signature");
  26. io.util.request = function() {
  27. const xhr = new XMLHttpRequest();
  28. const _open = xhr.open;
  29. xhr.open = function() {
  30. _open.apply(xhr, arguments);
  31. if (Client.cookie != null) {
  32. return xhr.setRequestHeader("Cookie", Client.cookie);
  33. }
  34. };
  35. return xhr;
  36. };
  37. module.exports = (Client = {
  38. cookie: null,
  39. setSession(session, callback) {
  40. if (callback == null) { callback = function(error) {}; }
  41. const sessionId = uid(24);
  42. session.cookie = {};
  43. return rclient.set("sess:" + sessionId, JSON.stringify(session), (error) => {
  44. if (error != null) { return callback(error); }
  45. const secret = Settings.security.sessionSecret;
  46. const cookieKey = 's:' + signature.sign(sessionId, secret);
  47. Client.cookie = `${Settings.cookieName}=${cookieKey}`;
  48. return callback();
  49. });
  50. },
  51. unsetSession(callback) {
  52. if (callback == null) { callback = function(error) {}; }
  53. Client.cookie = null;
  54. return callback();
  55. },
  56. connect(cookie) {
  57. const client = io.connect("http://localhost:3026", {'force new connection': true});
  58. client.on('connectionAccepted', (_, publicId) => client.publicId = publicId);
  59. return client;
  60. },
  61. getConnectedClients(callback) {
  62. if (callback == null) { callback = function(error, clients) {}; }
  63. return request.get({
  64. url: "http://localhost:3026/clients",
  65. json: true
  66. }, (error, response, data) => callback(error, data));
  67. },
  68. getConnectedClient(client_id, callback) {
  69. if (callback == null) { callback = function(error, clients) {}; }
  70. return request.get({
  71. url: `http://localhost:3026/clients/${client_id}`,
  72. json: true
  73. }, (error, response, data) => callback(error, data));
  74. },
  75. disconnectClient(client_id, callback) {
  76. request.post({
  77. url: `http://localhost:3026/client/${client_id}/disconnect`,
  78. auth: {
  79. user: Settings.internal.realTime.user,
  80. pass: Settings.internal.realTime.pass
  81. }
  82. }, (error, response, data) => callback(error, data));
  83. return null;
  84. },
  85. disconnectAllClients(callback) {
  86. return Client.getConnectedClients((error, clients) => async.each(clients, (clientView, cb) => Client.disconnectClient(clientView.client_id, cb)
  87. , callback));
  88. }
  89. });