SystemMessageManager.js 1.5 KB

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