| import { readFileSync, existsSync } from 'fs'; |
| import { logger } from '@librechat/data-schemas'; |
| import { CacheKeys } from 'librechat-data-provider'; |
| import { math, isEnabled } from '~/utils'; |
|
|
| |
| |
| |
| const REDIS_KEY_PREFIX_VAR = process.env.REDIS_KEY_PREFIX_VAR; |
| const REDIS_KEY_PREFIX = process.env.REDIS_KEY_PREFIX; |
| if (REDIS_KEY_PREFIX_VAR && REDIS_KEY_PREFIX) { |
| throw new Error('Only either REDIS_KEY_PREFIX_VAR or REDIS_KEY_PREFIX can be set.'); |
| } |
|
|
| const USE_REDIS = isEnabled(process.env.USE_REDIS); |
| if (USE_REDIS && !process.env.REDIS_URI) { |
| throw new Error('USE_REDIS is enabled but REDIS_URI is not set.'); |
| } |
|
|
| |
| |
| const FORCED_IN_MEMORY_CACHE_NAMESPACES = process.env.FORCED_IN_MEMORY_CACHE_NAMESPACES |
| ? process.env.FORCED_IN_MEMORY_CACHE_NAMESPACES.split(',').map((key) => key.trim()) |
| : []; |
|
|
| |
| if (FORCED_IN_MEMORY_CACHE_NAMESPACES.length > 0) { |
| const validKeys = Object.values(CacheKeys) as string[]; |
| const invalidKeys = FORCED_IN_MEMORY_CACHE_NAMESPACES.filter((key) => !validKeys.includes(key)); |
|
|
| if (invalidKeys.length > 0) { |
| throw new Error( |
| `Invalid cache keys in FORCED_IN_MEMORY_CACHE_NAMESPACES: ${invalidKeys.join(', ')}. Valid keys: ${validKeys.join(', ')}`, |
| ); |
| } |
| } |
|
|
| |
| |
| |
| const getRedisCA = (): string | null => { |
| const caPath = process.env.REDIS_CA; |
| if (!caPath) { |
| return null; |
| } |
|
|
| try { |
| if (existsSync(caPath)) { |
| return readFileSync(caPath, 'utf8'); |
| } else { |
| logger.warn(`Redis CA certificate file not found: ${caPath}`); |
| return null; |
| } |
| } catch (error) { |
| logger.error(`Failed to read Redis CA certificate file '${caPath}':`, error); |
| return null; |
| } |
| }; |
|
|
| const cacheConfig = { |
| FORCED_IN_MEMORY_CACHE_NAMESPACES, |
| USE_REDIS, |
| REDIS_URI: process.env.REDIS_URI, |
| REDIS_USERNAME: process.env.REDIS_USERNAME, |
| REDIS_PASSWORD: process.env.REDIS_PASSWORD, |
| REDIS_CA: getRedisCA(), |
| REDIS_KEY_PREFIX: process.env[REDIS_KEY_PREFIX_VAR ?? ''] || REDIS_KEY_PREFIX || '', |
| GLOBAL_PREFIX_SEPARATOR: '::', |
| REDIS_MAX_LISTENERS: math(process.env.REDIS_MAX_LISTENERS, 40), |
| REDIS_PING_INTERVAL: math(process.env.REDIS_PING_INTERVAL, 0), |
| |
| REDIS_RETRY_MAX_DELAY: math(process.env.REDIS_RETRY_MAX_DELAY, 3000), |
| |
| REDIS_RETRY_MAX_ATTEMPTS: math(process.env.REDIS_RETRY_MAX_ATTEMPTS, 10), |
| |
| REDIS_CONNECT_TIMEOUT: math(process.env.REDIS_CONNECT_TIMEOUT, 10000), |
| |
| REDIS_ENABLE_OFFLINE_QUEUE: isEnabled(process.env.REDIS_ENABLE_OFFLINE_QUEUE ?? 'true'), |
| |
| |
| REDIS_USE_ALTERNATIVE_DNS_LOOKUP: isEnabled(process.env.REDIS_USE_ALTERNATIVE_DNS_LOOKUP), |
| |
| USE_REDIS_CLUSTER: isEnabled(process.env.USE_REDIS_CLUSTER ?? 'false'), |
| CI: isEnabled(process.env.CI), |
| DEBUG_MEMORY_CACHE: isEnabled(process.env.DEBUG_MEMORY_CACHE), |
|
|
| BAN_DURATION: math(process.env.BAN_DURATION, 7200000), |
| }; |
|
|
| export { cacheConfig }; |
|
|