SystemMessageManager.mjs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { SystemMessage } from '../../models/SystemMessage.mjs'
  2. import { addRequiredCleanupHandlerBeforeDrainingConnections } from '../../infrastructure/GracefulShutdown.mjs'
  3. import { callbackifyAll } from '@overleaf/promise-utils'
  4. import logger from '@overleaf/logger'
  5. const SystemMessageManager = {
  6. _cachedMessages: [],
  7. getMessages() {
  8. return this._cachedMessages
  9. },
  10. async getMessagesFromDB() {
  11. return await SystemMessage.find({}).exec()
  12. },
  13. async clearMessages() {
  14. await SystemMessage.deleteMany({}).exec()
  15. await this.refreshCache()
  16. },
  17. async createMessage(content) {
  18. const message = new SystemMessage({ content })
  19. await message.save()
  20. await this.refreshCache()
  21. },
  22. async refreshCache() {
  23. this._cachedMessages = await this.getMessagesFromDB()
  24. },
  25. refreshCacheInBackground() {
  26. this.refreshCache().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.refreshCacheInBackground()
  33. const intervalHandle = setInterval(
  34. () => SystemMessageManager.refreshCacheInBackground(),
  35. CACHE_TIMEOUT
  36. )
  37. addRequiredCleanupHandlerBeforeDrainingConnections(
  38. 'update system messages',
  39. () => {
  40. clearInterval(intervalHandle)
  41. }
  42. )
  43. export default {
  44. getMessages: SystemMessageManager.getMessages.bind(SystemMessageManager),
  45. ...callbackifyAll(SystemMessageManager, { without: ['getMessages'] }),
  46. promises: SystemMessageManager,
  47. }