| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- const { SystemMessage } = require('../../models/SystemMessage')
- const {
- addRequiredCleanupHandlerBeforeDrainingConnections,
- } = require('../../infrastructure/GracefulShutdown')
- const { callbackifyAll } = require('@overleaf/promise-utils')
- const logger = require('@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)
- }
- )
- module.exports = {
- getMessages: SystemMessageManager.getMessages.bind(SystemMessageManager),
- ...callbackifyAll(SystemMessageManager, { without: ['getMessages'] }),
- promises: SystemMessageManager,
- }
|