import { CacheOptions, caching, CachingConfig, multiCaching, StoreConfig, WrapArgsType } from 'cache-manager'; /** * be used for create cache {@link createCache} */ export type ICacheConfig = StoreConfig & CacheOptions & { // every storeConfig init a store instance storePackage?: string; }; /** * create a default cache config object * @returns {ICacheConfig} */ export function createDefaultCacheConfig(): ICacheConfig { return { ttl: 86400, // seconds max: 1000, store: 'memory', }; } /** * cache and multi cache common method and only keep promise method */ export interface Cache { set(key: string, value: T, options?: CachingConfig): Promise; set(key: string, value: T, ttl: number): Promise; wrap(...args: WrapArgsType[]): Promise; get(key: string): Promise; del(key: string): Promise; reset(): Promise; } /** * create cache *
if cacheConfig is array and length gt 1 then will be return multi cache, else will be return cache * @param {ICacheConfig | ICacheConfig[]} cacheConfig * @returns {Cache} */ export function createCache(cacheConfig: ICacheConfig | ICacheConfig[] = createDefaultCacheConfig()): Cache { if (Array.isArray(cacheConfig)) { // multi cache if (cacheConfig.length === 1) { return createCacheByICacheConfig(cacheConfig[0]); } else { let caches = []; for (const cacheConfigEle of cacheConfig) { caches.push(createCacheByICacheConfig(cacheConfigEle)); } return multiCaching(caches) as Cache; } } else { return createCacheByICacheConfig(cacheConfig); } } function createCacheByICacheConfig(cacheConfig: ICacheConfig): Cache { // if storePackage exist then load storePackage and instead store if (cacheConfig.storePackage) { cacheConfig.store = require(cacheConfig.storePackage); } return caching(cacheConfig); }