HttpApiController.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import WebsocketLoadBalancer from './WebsocketLoadBalancer.js'
  2. import DrainManager from './DrainManager.js'
  3. import ConnectedUsersManager from './ConnectedUsersManager.js'
  4. import logger from '@overleaf/logger'
  5. export default {
  6. countConnectedClients(req, res) {
  7. const { projectId } = req.params
  8. ConnectedUsersManager.countConnectedClients(
  9. projectId,
  10. (err, nConnectedClients) => {
  11. if (err) {
  12. logger.err({ err, projectId }, 'count connected clients failed')
  13. return res.sendStatus(500)
  14. }
  15. res.json({ nConnectedClients })
  16. }
  17. )
  18. },
  19. sendMessage(req, res) {
  20. logger.debug({ message: req.params.message }, 'sending message')
  21. if (Array.isArray(req.body)) {
  22. for (const payload of req.body) {
  23. WebsocketLoadBalancer.emitToRoom(
  24. req.params.project_id,
  25. req.params.message,
  26. payload
  27. )
  28. }
  29. } else {
  30. WebsocketLoadBalancer.emitToRoom(
  31. req.params.project_id,
  32. req.params.message,
  33. req.body
  34. )
  35. }
  36. res.sendStatus(204)
  37. },
  38. startDrain(req, res) {
  39. const io = req.app.get('io')
  40. let rate = req.query.rate || '4'
  41. rate = parseFloat(rate) || 0
  42. logger.info({ rate }, 'setting client drain rate')
  43. DrainManager.startDrain(io, rate)
  44. res.sendStatus(204)
  45. },
  46. disconnectClient(req, res, next) {
  47. const io = req.app.get('io')
  48. const { client_id: clientId } = req.params
  49. const client = io.sockets.sockets[clientId]
  50. if (!client) {
  51. logger.debug({ clientId }, 'api: client already disconnected')
  52. res.sendStatus(404)
  53. return
  54. }
  55. logger.info({ clientId }, 'api: requesting client disconnect')
  56. client.on('disconnect', () => res.sendStatus(204))
  57. client.disconnect()
  58. },
  59. }