import Keyv , { Options } from 'keyv' ; import ms from 'ms' ; import env from './env' ; import logger from './logger' ; import { getConfigFromEnv } from './utils/get-config-from-env' ; import { validateEnv } from './utils/validate-env' ; let cache = null ; let systemCache = null ; export function getCache ( ) { if ( env . CACHE_ENABLED === true && cache === null ) { validateEnv ( [ 'CACHE_NAMESPACE' , 'CACHE_TTL' , 'CACHE_STORE' ] ) ; cache = getKeyvInstance ( ms ( env . CACHE_TTL as string ) ) ; cache . on ( 'error' , ( err ) => logger . warn ( err , `[cache] ${ err }` ) ) ; } if ( systemCache === null ) { systemCache = getKeyvInstance ( undefined , '_system' ) ; systemCache . on ( 'error' , ( err ) => logger . warn ( err , `[cache] ${ err }` ) ) ; } return { cache , systemCache } ; } export async function flushCaches ( ) { const { systemCache , cache } = getCache ( ) ; await systemCache ?. clear ( ) ; await cache ?. clear ( ) ; } function getKeyvInstance ( ttl , namespaceSuffix ? ) { switch ( env . CACHE_STORE ) { case 'redis' : return new Keyv ( getConfig ( 'redis' , ttl , namespaceSuffix ) ) ; case 'memcache' : return new Keyv ( getConfig ( 'memcache' , ttl , namespaceSuffix ) ) ; case 'memory' : default : return new Keyv ( getConfig ( 'memory' , ttl , namespaceSuffix ) ) ; } } function getConfig ( store = 'memory' , ttl , namespaceSuffix = '' ) { const config = { namespace : `${ env . CACHE_NAMESPACE }${ namespaceSuffix }` , ttl , } ; if ( store === 'redis' ) { const KeyvRedis = require ( '@keyv/redis' ) ; config . store = new KeyvRedis ( env . CACHE_REDIS || getConfigFromEnv ( 'CACHE_REDIS_' ) ) ; } if ( store === 'memcache' ) { const KeyvMemcache = require ( 'keyv-memcache' ) ; const cacheMemcache = Array . isArray ( env . CACHE_MEMCACHE ) ? env . CACHE_MEMCACHE . join ( ',' ) : env . CACHE_MEMCACHE ; config . store = new KeyvMemcache ( cacheMemcache ) ; } return config ; }