Files
Verso/services/web/app/src/Features/SystemMessages/SystemMessageManager.mjs
T
Andrew Rumble d748d8d606 Merge pull request #29795 from overleaf/ar-last-infrastructure-conversions
[web] last infrastructure conversions

GitOrigin-RevId: 68aa11625a9bc6d0d5324ecd95bb5ac52af8ee96
2025-11-27 09:05:30 +00:00

58 lines
1.5 KiB
JavaScript

import { SystemMessage } from '../../models/SystemMessage.mjs'
import { addRequiredCleanupHandlerBeforeDrainingConnections } from '../../infrastructure/GracefulShutdown.mjs'
import { callbackifyAll } from '@overleaf/promise-utils'
import logger from '@overleaf/logger'
const SystemMessageManager = {
_cachedMessages: [],
getMessages() {
return this._cachedMessages
},
async getMessagesFromDB() {
return await SystemMessage.find({}).exec()
},
async clearMessages() {
await SystemMessage.deleteMany({}).exec()
await this.refreshCache()
},
async createMessage(content) {
const message = new SystemMessage({ content })
await message.save()
await this.refreshCache()
},
async refreshCache() {
this._cachedMessages = await this.getMessagesFromDB()
},
refreshCacheInBackground() {
this.refreshCache().catch(err => {
logger.warn({ err }, 'failed to refresh system messages cache')
})
},
}
const CACHE_TIMEOUT = 10 * 1000 * (Math.random() + 2) // 20-30 seconds
SystemMessageManager.refreshCacheInBackground()
const intervalHandle = setInterval(
() => SystemMessageManager.refreshCacheInBackground(),
CACHE_TIMEOUT
)
addRequiredCleanupHandlerBeforeDrainingConnections(
'update system messages',
() => {
clearInterval(intervalHandle)
}
)
export default {
getMessages: SystemMessageManager.getMessages.bind(SystemMessageManager),
...callbackifyAll(SystemMessageManager, { without: ['getMessages'] }),
promises: SystemMessageManager,
}