const getLogStores = require('./getLogStores'); const { isEnabled } = require('../server/utils'); const { USE_REDIS, LIMIT_CONCURRENT_MESSAGES } = process.env ?? {}; const ttl = 1000 * 60 * 1; /** * Clear or decrement pending requests from the cache. * Checks the environmental variable LIMIT_CONCURRENT_MESSAGES; * if the rule is enabled ('true'), it either decrements the count of pending requests * or deletes the key if the count is less than or equal to 1. * * @module clearPendingReq * @requires ./getLogStores * @requires ../server/utils * @requires process * * @async * @function * @param {Object} params - The parameters object. * @param {string} params.userId - The user ID for which the pending requests are to be cleared or decremented. * @param {Object} [params.cache] - An optional cache object to use. If not provided, a default cache will be fetched using getLogStores. * @returns {Promise} A promise that either decrements the 'pendingRequests' count, deletes the key from the store, or resolves with no value. */ const clearPendingReq = async ({ userId, cache: _cache }) => { if (!userId) { return; } else if (!isEnabled(LIMIT_CONCURRENT_MESSAGES)) { return; } const namespace = 'pending_req'; const cache = _cache ?? getLogStores(namespace); if (!cache) { return; } const key = `${USE_REDIS ? namespace : ''}:${userId ?? ''}`; const currentReq = +((await cache.get(key)) ?? 0); if (currentReq && currentReq >= 1) { await cache.set(key, currentReq - 1, ttl); } else { await cache.delete(key); } }; module.exports = clearPendingReq;