SystemMessageManager.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. const { SystemMessage } = require('../../models/SystemMessage')
  2. const {
  3. addRequiredCleanupHandlerBeforeDrainingConnections,
  4. } = require('../../infrastructure/GracefulShutdown')
  5. const { callbackifyAll } = require('@overleaf/promise-utils')
  6. const logger = require('@overleaf/logger')
  7. const SystemMessageManager = {
  8. getMessages() {
  9. return this._cachedMessages
  10. },
  11. async getMessagesFromDB() {
  12. return await SystemMessage.find({}).exec()
  13. },
  14. async clearMessages() {
  15. await SystemMessage.deleteMany({}).exec()
  16. },
  17. async createMessage(content) {
  18. const message = new SystemMessage({ content })
  19. await message.save()
  20. },
  21. refreshCache() {
  22. this.getMessagesFromDB()
  23. .then(messages => {
  24. this._cachedMessages = messages
  25. })
  26. .catch(err => {
  27. logger.warn({ err }, 'failed to refresh system messages cache')
  28. })
  29. },
  30. }
  31. const CACHE_TIMEOUT = 10 * 1000 * (Math.random() + 2) // 20-30 seconds
  32. SystemMessageManager.refreshCache()
  33. const intervalHandle = setInterval(
  34. () => SystemMessageManager.refreshCache(),
  35. CACHE_TIMEOUT
  36. )
  37. addRequiredCleanupHandlerBeforeDrainingConnections(
  38. 'update system messages',
  39. () => {
  40. clearInterval(intervalHandle)
  41. }
  42. )
  43. module.exports = {
  44. getMessages: SystemMessageManager.getMessages.bind(SystemMessageManager),
  45. ...callbackifyAll(SystemMessageManager, { without: ['getMessages'] }),
  46. promises: SystemMessageManager,
  47. }