| | 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 }; |
| |
|