UNPKG

@jss-rule-engine/edge

Version:

93 lines (83 loc) 2.72 kB
import { Cache, CacheClass } from 'memory-cache'; /** * An interface for cache clients. * @template T The type of data being cached. */ export interface CacheClient<T> { /** * Adds a value to the cache for the specified cache key. * @param {string} key The cache key. * @param {T} value The value to cache. * @returns The value added to the cache. */ setCacheValue(key: string, value: T): T; /** * Retrieves a value from the cache. * @param {string} key The cache key. * @returns The cache value as {T}, or null if the specified key was not found in the cache. */ getCacheValue(key: string): T | null; } /** * Default cache configuration */ const DEFAULTS = Object.freeze({ cacheTimeout: 60, cacheEnabled: true, }); /** * Minimum configuration options for classes that implement @see CacheClient */ export interface CacheOptions { /** * Enable/disable caching mechanism * @default true */ cacheEnabled?: boolean; /** * Cache timeout (sec) * @default 60 */ cacheTimeout?: number; } /** * A cache client that uses the 'memory-cache' library (https://github.com/ptarjan/node-cache). * This class is meant to be extended or used as a mixin; it's not meant to be used directly. * @template T The type of data being cached. * @mixin */ export class MemoryCacheClient<T> implements CacheClient<T> { private cache: CacheClass<string, T>; /** * Initializes a new instance of @see MemoryCacheClient using the provided @see CacheOptions * @param {CacheOptions} options Configuration options */ constructor(public options: CacheOptions) { this.cache = new Cache(); this.options.cacheTimeout = (this.options.cacheTimeout ?? DEFAULTS.cacheTimeout) * 1000; if (this.options.cacheEnabled === undefined) { this.options.cacheEnabled = DEFAULTS.cacheEnabled; } } /** * Retrieves a value from the cache. * @template T The type of data being cached. * @param {string} key The cache key. * @returns The cache value as {T}, or null if the specified key is not found in the cache. */ getCacheValue(key: string): T | null { return this.options.cacheEnabled ? this.cache.get(key) : null; } /** * Adds a value to the cache for the specified cache key. * @template T The type of data being cached. * @param {string} key The cache key. * @param {T} value The value to cache. * @returns The value added to the cache. */ setCacheValue(key: string, value: T): T { return this.options.cacheEnabled ? this.cache.put(key, value, this.options.cacheTimeout) : value; } }