UNPKG

@avanio/expire-cache

Version:

Typescript/Javascript cache with expiration

1 lines 36.2 kB
{"version":3,"sources":["../src/ExpireCache.mts","../src/ExpireTimeoutCache.mts","../src/TieredCache.mts"],"sourcesContent":["import {EventEmitter} from 'events';\nimport {type ILoggerLike, LogLevel, type LogMapInfer, MapLogger} from '@avanio/logger-like';\nimport {type CacheEventsMap, type ICacheWithEvents} from '@luolapeikko/cache-types';\n\n/**\n * The default log mapping for the ExpireCache class.\n * This maps each method to a log level, allowing you to control the logging output.\n * By default, all logs are disabled (None level)\n * @example\n * const cache = new ExpireCache<string>(console, {\n * get: LogLevel.Info,\n * set: LogLevel.Debug,\n * delete: LogLevel.Warn,\n * });\n */\nconst defaultLogMap = {\n\tcleanExpired: LogLevel.None,\n\tclear: LogLevel.None,\n\tconstructor: LogLevel.None,\n\tdelete: LogLevel.None,\n\texpires: LogLevel.None,\n\tget: LogLevel.None,\n\thas: LogLevel.None,\n\tonExpire: LogLevel.None,\n\tset: LogLevel.None,\n\tsize: LogLevel.None,\n} as const;\n\nexport type ExpireCacheLogMapType = LogMapInfer<typeof defaultLogMap>;\n\n/**\n * ExpireCache class that implements the ICache interface with value expiration and expires on read operations\n * @template Payload - The type of the cached data\n * @template Key - (optional) The type of the cache key (default is string)\n * @since v0.6.5\n */\nexport class ExpireCache<Payload, Key = string> extends EventEmitter<CacheEventsMap<Payload, Key>> implements ICacheWithEvents<Payload, Key> {\n\tprivate readonly cache = new Map<Key, Payload>();\n\tprivate readonly cacheTtl = new Map<Key, number | undefined>();\n\tpublic readonly logger: MapLogger<ExpireCacheLogMapType>;\n\tprivate defaultExpireMs: undefined | number;\n\n\t/**\n\t * Creates a new instance of the ExpireCache class\n\t * @param logger - The logger to use (optional)\n\t * @param logMapping - The log mapping to use (optional). Default is all logging disabled\n\t * @param defaultExpireMs - The default expiration time in milliseconds (optional)\n\t */\n\tconstructor(logger?: ILoggerLike, logMapping?: Partial<ExpireCacheLogMapType>, defaultExpireMs?: number) {\n\t\tsuper();\n\t\tthis.logger = new MapLogger<ExpireCacheLogMapType>(logger, Object.assign({}, defaultLogMap, logMapping));\n\t\tthis.logger.logKey('constructor', `ExpireCache created, defaultExpireMs: ${String(defaultExpireMs)}`);\n\t\tthis.defaultExpireMs = defaultExpireMs;\n\t}\n\n\tpublic set(key: Key, data: Payload, expires?: Date) {\n\t\tconst expireTs: number | undefined = this.getExpireDate(expires)?.getTime();\n\t\tthis.logger.logKey('set', `ExpireCache set key: ${String(key)}, expireTs: ${String(expireTs)}`);\n\t\tthis.emit('set', key, data, this.getExpireDate(expires));\n\t\tthis.cache.set(key, data);\n\t\tthis.cacheTtl.set(key, expireTs);\n\t}\n\n\tpublic get(key: Key) {\n\t\tthis.logger.logKey('get', `ExpireCache get key: ${String(key)}`);\n\t\tthis.emit('get', key);\n\t\tthis.cleanExpired();\n\t\treturn this.cache.get(key);\n\t}\n\n\tpublic has(key: Key) {\n\t\tthis.logger.logKey('has', `ExpireCache has key: ${String(key)}`);\n\t\tthis.cleanExpired();\n\t\treturn this.cache.has(key);\n\t}\n\n\tpublic expires(key: Key): Date | undefined {\n\t\tthis.logger.logKey('expires', `ExpireCache get expire for key: ${String(key)}`);\n\t\tconst expires = this.cacheTtl.get(key);\n\t\tthis.cleanExpired();\n\t\treturn expires ? new Date(expires) : undefined;\n\t}\n\n\tpublic delete(key: Key) {\n\t\tthis.logger.logKey('delete', `ExpireCache delete key: ${String(key)}`);\n\t\tconst entry = this.cache.get(key);\n\t\tif (entry) {\n\t\t\tthis.notifyExpires(new Map<Key, Payload>([[key, entry]]));\n\t\t\tthis.emit('delete', key);\n\t\t}\n\t\tthis.cacheTtl.delete(key);\n\t\treturn this.cache.delete(key);\n\t}\n\n\tpublic clear() {\n\t\tthis.logger.logKey('clear', `ExpireCache clear`);\n\t\tconst copy = new Map<Key, Payload>(this.cache);\n\t\tthis.notifyExpires(copy);\n\t\tthis.emit('clear', copy);\n\t\tthis.cache.clear();\n\t\tthis.cacheTtl.clear();\n\t}\n\n\tpublic size() {\n\t\tthis.logger.logKey('size', `ExpireCache size: ${this.cache.size.toString()}`);\n\t\treturn this.cache.size;\n\t}\n\n\tpublic entries(): IterableIterator<[Key, Payload]> {\n\t\tthis.cleanExpired();\n\t\treturn new Map(this.cache).entries();\n\t}\n\n\tpublic keys(): IterableIterator<Key> {\n\t\tthis.cleanExpired();\n\t\treturn new Map(this.cache).keys();\n\t}\n\n\tpublic values(): IterableIterator<Payload> {\n\t\tthis.cleanExpired();\n\t\treturn new Map(this.cache).values();\n\t}\n\n\t/**\n\t * Sets the default expiration time in milliseconds\n\t * @param expireMs - The default expiration time in milliseconds\n\t */\n\tpublic setExpireMs(expireMs: number | undefined) {\n\t\tthis.defaultExpireMs = expireMs;\n\t}\n\n\t/**\n\t * Cleans expired cache entries\n\t */\n\tprivate cleanExpired() {\n\t\tconst now = new Date().getTime();\n\t\tconst deleteEntries = new Map<Key, Payload>();\n\t\tfor (const [key, expire] of this.cacheTtl.entries()) {\n\t\t\tif (expire !== undefined && expire < now) {\n\t\t\t\tconst value = this.cache.get(key);\n\t\t\t\tif (value) {\n\t\t\t\t\tdeleteEntries.set(key, value);\n\t\t\t\t\tthis.cache.delete(key);\n\t\t\t\t}\n\t\t\t\tthis.cacheTtl.delete(key);\n\t\t\t}\n\t\t}\n\t\tif (deleteEntries.size > 0) {\n\t\t\tthis.notifyExpires(deleteEntries);\n\t\t\tthis.logger.logKey('cleanExpired', `ExpireCache expired count: ${deleteEntries.size.toString()}`);\n\t\t}\n\t}\n\n\tprivate notifyExpires(entries: Map<Key, Payload>) {\n\t\tfor (const [key, value] of entries.entries()) {\n\t\t\tthis.emit('expires', key, value);\n\t\t}\n\t}\n\n\tprivate getExpireDate(expires: Date | undefined): Date | undefined {\n\t\tconst defaultExpireDate: Date | undefined = this.defaultExpireMs ? new Date(Date.now() + this.defaultExpireMs) : undefined;\n\t\treturn expires ?? defaultExpireDate;\n\t}\n}\n","import {EventEmitter} from 'events';\nimport {type ILoggerLike, LogLevel, type LogMapInfer, MapLogger} from '@avanio/logger-like';\nimport {type CacheEventsMap, type ICacheWithEvents} from '@luolapeikko/cache-types';\nimport {type ExpireCacheLogMapType} from './ExpireCache.mjs';\n\n/**\n * The default log mapping for the ExpireCache class.\n * This maps each method to a log level, allowing you to control the logging output.\n * By default, all logs are disabled (None level)\n * @example\n * const cache = new ExpireCache<string>(console, {\n * get: LogLevel.Info,\n * set: LogLevel.Debug,\n * delete: LogLevel.Warn,\n * });\n */\nconst defaultLogMap = {\n\tcleanExpired: LogLevel.None,\n\tclear: LogLevel.None,\n\tconstructor: LogLevel.None,\n\tdelete: LogLevel.None,\n\texpires: LogLevel.None,\n\tget: LogLevel.None,\n\thas: LogLevel.None,\n\tonExpire: LogLevel.None,\n\tset: LogLevel.None,\n\tsize: LogLevel.None,\n} satisfies ExpireCacheLogMapType;\n\nexport type ExpireTimeoutCacheLogMapType = LogMapInfer<typeof defaultLogMap>;\n\ntype TimeoutObjectType = {timeout: ReturnType<typeof setTimeout> | undefined; expires: Date | undefined};\n\n/**\n * ExpireCache class that implements the ICache interface with value expiration and expires with setTimeout\n * @template Payload - The type of the cached data\n * @template Key - (optional) The type of the cache key (default is string)\n * @since v0.6.5\n */\nexport class ExpireTimeoutCache<Payload, Key = string> extends EventEmitter<CacheEventsMap<Payload, Key>> implements ICacheWithEvents<Payload, Key> {\n\tprivate readonly cache = new Map<Key, Payload>();\n\tprivate readonly cacheTimeout = new Map<Key, TimeoutObjectType>();\n\tpublic readonly logger: MapLogger<ExpireTimeoutCacheLogMapType>;\n\tprivate defaultExpireMs: undefined | number;\n\t/**\n\t * Creates a new instance of the ExpireTimeoutCache class\n\t * @param logger - The logger to use (optional)\n\t * @param logMapping - The log mapping to use (optional). Default is all logging disabled\n\t * @param defaultExpireMs - The default expiration time in milliseconds (optional)\n\t */\n\tconstructor(logger?: ILoggerLike, logMapping?: Partial<ExpireTimeoutCacheLogMapType>, defaultExpireMs?: number) {\n\t\tsuper();\n\t\tthis.logger = new MapLogger<ExpireTimeoutCacheLogMapType>(logger, Object.assign({}, defaultLogMap, logMapping));\n\t\tthis.logger.logKey('constructor', `ExpireTimeoutCache created, defaultExpireMs: ${String(defaultExpireMs)}`);\n\t\tthis.defaultExpireMs = defaultExpireMs;\n\t}\n\n\tpublic set(key: Key, data: Payload, expires?: Date) {\n\t\tthis.clearTimeout(key);\n\t\tconst {expiresInMs, ...options} = this.handleTimeoutSetup(key, this.getExpireDate(expires));\n\t\tconst expireString = expiresInMs ? `${expiresInMs.toString()} ms` : 'undefined';\n\t\tthis.logger.logKey('set', `ExpireTimeoutCache set key: ${String(key)}, expireTs: ${expireString}`);\n\t\tthis.cache.set(key, data);\n\t\tthis.cacheTimeout.set(key, options);\n\t}\n\n\tpublic get(key: Key) {\n\t\tthis.logger.logKey('get', `ExpireTimeoutCache get key: ${String(key)}`);\n\t\tthis.emit('get', key);\n\t\treturn this.cache.get(key);\n\t}\n\n\tpublic has(key: Key) {\n\t\tthis.logger.logKey('has', `ExpireTimeoutCache has key: ${String(key)}`);\n\t\treturn this.cache.has(key);\n\t}\n\n\tpublic expires(key: Key): Date | undefined {\n\t\tthis.logger.logKey('expires', `ExpireTimeoutCache get expire for key: ${String(key)}`);\n\t\treturn this.cacheTimeout.get(key)?.expires;\n\t}\n\n\tpublic delete(key: Key) {\n\t\tthis.logger.logKey('delete', `ExpireTimeoutCache delete key: ${String(key)}`);\n\t\tthis.clearTimeout(key);\n\t\tconst entry = this.cache.get(key);\n\t\tif (entry) {\n\t\t\tthis.emit('delete', key);\n\t\t\tthis.notifyExpires(new Map<Key, Payload>([[key, entry]]));\n\t\t}\n\t\treturn this.cache.delete(key);\n\t}\n\n\tpublic clear() {\n\t\tthis.logger.logKey('clear', `ExpireTimeoutCache clear`);\n\t\tthis.cacheTimeout.forEach((_value, key) => this.clearTimeout(key));\n\t\tconst copy = new Map<Key, Payload>(this.cache);\n\t\tthis.notifyExpires(copy);\n\t\tthis.emit('clear', copy);\n\t\tthis.cache.clear();\n\t\tthis.cacheTimeout.clear();\n\t}\n\n\tpublic size() {\n\t\tthis.logger.logKey('size', `ExpireTimeoutCache size: ${this.cache.size.toString()}`);\n\t\treturn this.cache.size;\n\t}\n\n\tpublic entries(): IterableIterator<[Key, Payload]> {\n\t\treturn new Map(this.cache).entries();\n\t}\n\n\tpublic keys(): IterableIterator<Key> {\n\t\treturn new Map(this.cache).keys();\n\t}\n\n\tpublic values(): IterableIterator<Payload> {\n\t\treturn new Map(this.cache).values();\n\t}\n\n\t/**\n\t * Set the default expiration time in milliseconds\n\t * @param expireMs - The default expiration time in milliseconds\n\t */\n\tpublic setExpireMs(expireMs: number | undefined) {\n\t\tthis.defaultExpireMs = expireMs;\n\t}\n\n\tprivate clearTimeout(key: Key) {\n\t\tconst entry = this.cacheTimeout.get(key);\n\t\tif (entry?.timeout) {\n\t\t\tclearTimeout(entry.timeout);\n\t\t\tentry.timeout = undefined;\n\t\t}\n\t}\n\n\tprivate notifyExpires(entries: Map<Key, Payload>) {\n\t\tfor (const [key, value] of entries.entries()) {\n\t\t\tthis.emit('expires', key, value);\n\t\t}\n\t}\n\n\tprivate getExpireDate(expires: Date | undefined): Date | undefined {\n\t\tconst defaultExpireDate: Date | undefined = this.defaultExpireMs ? new Date(Date.now() + this.defaultExpireMs) : undefined;\n\t\treturn expires ?? defaultExpireDate;\n\t}\n\n\tprivate handleExpiredCallback(key: Key) {\n\t\tthis.logger.logKey('onExpire', `ExpireTimeoutCache onExpire key: ${String(key)}`);\n\t\tthis.delete(key);\n\t}\n\n\tprivate handleTimeoutSetup(key: Key, expiresDate: Date | undefined): TimeoutObjectType & {expiresInMs: number | undefined} {\n\t\tconst expiresInMs = expiresDate && expiresDate.getTime() - Date.now();\n\t\tconst timeout = expiresInMs !== undefined ? setTimeout(() => this.handleExpiredCallback(key), expiresInMs) : undefined;\n\t\treturn {expiresInMs, timeout, expires: expiresDate};\n\t}\n}\n","import {EventEmitter} from 'events';\nimport {type ILoggerLike, LogLevel, type LogMapInfer, MapLogger} from '@avanio/logger-like';\nimport {type ExpireCacheLogMapType} from './ExpireCache.mjs';\n\nexport type TierType<Data, Tier extends string> = {tier: Tier; data: Data};\n\n/**\n * Helper type to build cache tier getter methods\n */\nexport type GetCacheTier<T extends TierType<unknown, string>[], Key> = {\n\t[K in T[number] as `get${Capitalize<K['tier']>}`]: (key: Key, cache: T[number]) => Promise<K['data'] | undefined> | K['data'] | undefined;\n};\n\nexport type TierStatusRecord<T extends TierType<unknown, string>[]> = Record<T[number]['tier'], number>;\n\nexport type TierStatusInitialRecord<T extends TierType<unknown, string>[]> = Record<T[number]['tier'], 0>;\n\nexport type TieredCacheStatus<T extends TierType<unknown, string>[]> = {\n\tsize: number;\n\ttiers: TierStatusRecord<T>;\n};\n\ntype MultiTierCacheEvents<T extends TierType<unknown, string>[], Key> = {\n\tupdate: [status: Readonly<TieredCacheStatus<T>>];\n\tset: [Iterable<Key>];\n\tdelete: [Iterable<Key>];\n\tclear: [];\n};\n\nconst defaultLogMap = {\n\tclear: LogLevel.None,\n\tclearTimeoutKey: LogLevel.None,\n\tconstructor: LogLevel.None,\n\tdelete: LogLevel.None,\n\tget: LogLevel.None,\n\thas: LogLevel.None,\n\trunTimeout: LogLevel.None,\n\tset: LogLevel.None,\n\tsetTimeout: LogLevel.None,\n\tsize: LogLevel.None,\n} as const;\n\nexport type TieredCacheLogMapType = LogMapInfer<typeof defaultLogMap>;\n\n/**\n * Multi tier cache with timeout support to change tier based on timeout\n * @since v0.6.0\n */\nexport abstract class TieredCache<Tiers extends TierType<unknown, string>[], TimeoutEnum extends number, Key> extends EventEmitter<\n\tMultiTierCacheEvents<Tiers, Key>\n> {\n\tpublic abstract readonly cacheName: string;\n\tprotected readonly cache = new Map<Key, Tiers[number]>();\n\tprivate readonly cacheTimeout = new Map<Key, ReturnType<typeof setTimeout> | undefined>();\n\tpublic readonly logger: MapLogger<TieredCacheLogMapType>;\n\tprivate statusData: Readonly<TieredCacheStatus<Tiers>>;\n\tconstructor(logger?: ILoggerLike, logMapping?: Partial<ExpireCacheLogMapType>) {\n\t\tsuper();\n\t\tthis.logger = new MapLogger<TieredCacheLogMapType>(logger, Object.assign({}, defaultLogMap, logMapping));\n\t\tthis.logCacheName();\n\t\tthis.handleCacheEntry = this.handleCacheEntry.bind(this);\n\t\tthis.statusData = {size: 0, tiers: {...this.getInitialStatusData()}};\n\t}\n\n\t/**\n\t * Get cache entry from cache\n\t * @param key - cache key\n\t * @param tier - cache tier\n\t * @param timeout - optional update to new timeout for cache entry (if not provided, default timeout for tier will be used)\n\t * @returns - promise that resolves when cache entry is set\n\t */\n\tpublic async get<T extends Tiers[number]>(key: Key, tier: T['tier'], timeout?: TimeoutEnum): Promise<Promise<T['data'] | undefined> | T['data'] | undefined> {\n\t\tthis.logger.logKey('get', `MultiTierCache ${this.cacheName} get: '${String(key)}' tier: ${tier}`);\n\t\tconst entry = this.cache.get(key);\n\t\tconst value = await this.handleCacheEntry(key, tier, entry);\n\t\t// if we found entry, let's extend timeout\n\t\tif (value) {\n\t\t\tthis.setTimeout(key, timeout ?? this.handleTierDefaultTimeout(tier));\n\t\t}\n\t\treturn value;\n\t}\n\n\t/**\n\t * Set cache entry\n\t * @param key - cache key\n\t * @param tier - cache tier\n\t * @param data - cache data\n\t * @param timeout - optional timeout for cache entry. Else timeout will be checked from handleTimeoutValue or default timeout for tier.\n\t */\n\tpublic async set<T extends Tiers[number]>(key: Key, tier: T['tier'], data: T['data'], timeout?: TimeoutEnum): Promise<void> {\n\t\tthis.logger.logKey('set', `MultiTierCache ${this.cacheName} set: '${String(key)}' tier: ${tier}`);\n\t\tawait this.handleSetValue(key, tier, data, timeout);\n\t\tthis.emit('set', [key]);\n\t\tthis.emit('update', this.buildStatus(true));\n\t}\n\n\t/**\n\t * Set multiple cache entries\n\t * @param tier - cache tier\n\t * @param entries - iterable of key, data pairs\n\t * @param timeout - optional timeout for cache entry. Else timeout will be checked from handleTimeoutValue or default timeout for tier.\n\t */\n\tpublic async setEntries<T extends Tiers[number]>(tier: T['tier'], entries: Iterable<[Key, T['data']]>, timeout?: TimeoutEnum): Promise<void> {\n\t\tconst entriesArray = Array.from(entries);\n\t\tthis.logger.logKey('set', `MultiTierCache ${this.cacheName} setEntries (count: ${entriesArray.length.toString()}) tier: ${tier}`);\n\t\tfor (const [key, data] of entriesArray) {\n\t\t\tawait this.handleSetValue(key, tier, data, timeout);\n\t\t}\n\t\tthis.emit(\n\t\t\t'set',\n\t\t\tentriesArray.map(([key]) => key),\n\t\t);\n\t\tthis.emit('update', this.buildStatus(true));\n\t}\n\n\t/**\n\t * Get tier type for current key\n\t */\n\tpublic getTier(key: Key): Tiers[number]['tier'] | undefined {\n\t\tconst entry = this.cache.get(key);\n\t\treturn entry?.tier;\n\t}\n\n\t/**\n\t * Iterate this.cache values and use handleCacheEntry to get data\n\t * @param tier\n\t */\n\tpublic tierValues(tier: Tiers[number]['tier']): AsyncIterable<Tiers[number]['data']> {\n\t\tconst iterator = this.cache.entries();\n\t\tconst currentTierResolve = this.handleCacheEntry.bind(this);\n\t\treturn {\n\t\t\t[Symbol.asyncIterator]: () => {\n\t\t\t\treturn {\n\t\t\t\t\tasync next() {\n\t\t\t\t\t\tconst {value, done} = iterator.next();\n\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\treturn {value: undefined, done};\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn {value: await currentTierResolve(value[0], tier, value[1]), done};\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t}\n\n\tpublic tierEntries(tier: Tiers[number]['tier']): AsyncIterable<[Key, Tiers[number]['data']]> {\n\t\tconst iterator = this.cache.entries();\n\t\tconst currentTierResolve = this.handleCacheEntry.bind(this);\n\t\treturn {\n\t\t\t[Symbol.asyncIterator]: () => {\n\t\t\t\treturn {\n\t\t\t\t\tasync next() {\n\t\t\t\t\t\tconst {value, done} = iterator.next();\n\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\treturn {value, done: true};\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn {value: [value[0], await currentTierResolve(value[0], tier, value[1])], done: false};\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t}\n\n\tpublic keys(): Iterable<Key> {\n\t\treturn this.cache.keys();\n\t}\n\n\tpublic has(key: Key) {\n\t\tthis.logger.logKey('has', `MultiTierCache ${this.cacheName} has: '${String(key)}'`);\n\t\treturn this.cache.has(key);\n\t}\n\n\tpublic size() {\n\t\tthis.logger.logKey('size', `MultiTierCache ${this.cacheName} size: ${this.cache.size.toString()}`);\n\t\treturn this.cache.size;\n\t}\n\n\tpublic clear() {\n\t\tconst keys = new Set(this.cache.keys());\n\t\tthis.clearAllTimeouts();\n\t\tthis.cache.clear();\n\t\tthis.logger.logKey('clear', `MultiTierCache ${this.cacheName} clear`);\n\t\tthis.emit('delete', keys);\n\t\tthis.emit('clear');\n\t\tthis.emit('update', this.buildStatus(true));\n\t}\n\n\tpublic delete(key: Key): boolean {\n\t\tconst isDeleted = this.handleDeleteValue(key);\n\t\tif (isDeleted) {\n\t\t\tthis.logger.logKey('delete', `MultiTierCache ${this.cacheName} delete: '${String(key)}'`);\n\t\t\tthis.emit('delete', [key]);\n\t\t\tthis.emit('update', this.buildStatus(true));\n\t\t}\n\t\treturn isDeleted;\n\t}\n\n\tpublic deleteKeys(keys: Iterable<Key>): number {\n\t\tconst deleteKeys: Key[] = [];\n\t\tfor (const key of keys) {\n\t\t\tthis.clearTimeoutKey(key);\n\t\t\tif (this.cache.delete(key)) {\n\t\t\t\tdeleteKeys.push(key);\n\t\t\t}\n\t\t}\n\t\tthis.logger.logKey('delete', `MultiTierCache ${this.cacheName} deleteKeys (count: ${deleteKeys.length.toString()})`);\n\t\tthis.emit('delete', deleteKeys);\n\t\tthis.emit('update', this.buildStatus(true));\n\t\treturn deleteKeys.length;\n\t}\n\n\tpublic status(): Readonly<TieredCacheStatus<Tiers>> {\n\t\treturn this.buildStatus(false);\n\t}\n\n\tprotected buildStatus(rebuild: boolean): Readonly<TieredCacheStatus<Tiers>> {\n\t\tif (!rebuild) {\n\t\t\treturn this.statusData;\n\t\t}\n\t\tthis.statusData = Object.freeze({\n\t\t\tsize: this.cache.size,\n\t\t\ttiers: Array.from(this.cache.values()).reduce<TierStatusRecord<Tiers>>(\n\t\t\t\t(acc, {tier: type}) => {\n\t\t\t\t\tacc[type as keyof TierStatusRecord<Tiers>]++;\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{...this.getInitialStatusData()},\n\t\t\t),\n\t\t});\n\t\treturn this.statusData;\n\t}\n\n\t/**\n\t * Internal helper to set cache entry and set timeout\n\t * @param key - cache entry key\n\t * @param tier - cache entry tier\n\t * @param data - cache entry data\n\t * @param timeout - timeout value, optional\n\t */\n\tprotected async handleSetValue<T extends Tiers[number]>(key: Key, tier: T['tier'], data: T['data'], timeout?: TimeoutEnum) {\n\t\tthis.cache.set(key, {tier, data});\n\t\tthis.setTimeout(key, timeout ?? (await this.handleTimeoutValue(key, tier, data)));\n\t}\n\n\t/**\n\t * Internal helper to delete cache entry and cancel its timeout\n\t * @param key - cache entry key\n\t * @returns true if entry was deleted, false if not found\n\t */\n\tprotected handleDeleteValue(key: Key): boolean {\n\t\tthis.clearTimeoutKey(key);\n\t\treturn this.cache.delete(key);\n\t}\n\n\tprivate logCacheName() {\n\t\tthis.logger.logKey('constructor', `MultiTierCache ${this.cacheName} created`);\n\t}\n\n\tprivate setTimeout(key: Key, timeout: number | undefined) {\n\t\tconst oldTimeout = this.cacheTimeout.get(key);\n\t\tif (oldTimeout) {\n\t\t\tclearTimeout(oldTimeout);\n\t\t}\n\t\tif (timeout !== undefined) {\n\t\t\tthis.cacheTimeout.set(\n\t\t\t\tkey,\n\t\t\t\tsetTimeout(() => void this.runTimeout(key), timeout),\n\t\t\t);\n\t\t\tthis.logger.logKey('setTimeout', `MultiTierCache ${this.cacheName} setTimeout: '${String(key)}' = timeouts: ${timeout.toString()}`);\n\t\t}\n\t}\n\n\tprivate clearTimeoutKey(key: Key) {\n\t\tconst oldTimeout = this.cacheTimeout.get(key);\n\t\tif (oldTimeout) {\n\t\t\tthis.logger.logKey('clearTimeoutKey', `MultiTierCache ${this.cacheName} clearTimeoutKey: '${String(key)}'`);\n\t\t\tclearTimeout(oldTimeout);\n\t\t}\n\t\tthis.cacheTimeout.delete(key);\n\t}\n\n\tprivate clearAllTimeouts() {\n\t\tfor (const timeout of this.cacheTimeout.values()) {\n\t\t\tif (timeout) {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t}\n\t\t}\n\t\tthis.cacheTimeout.clear();\n\t}\n\n\tprivate async runTimeout(key: Key) {\n\t\ttry {\n\t\t\tconst timeoutValue = await this.handleTierTimeout(key);\n\t\t\tif (timeoutValue === undefined) {\n\t\t\t\tthis.logger.logKey('runTimeout', `MultiTierCache ${this.cacheName} runTimeout: '${String(key)}' cleared`);\n\t\t\t\tthis.clearTimeoutKey(key);\n\t\t\t} else {\n\t\t\t\tthis.logger.logKey('runTimeout', `MultiTierCache ${this.cacheName} runTimeout: '${String(key)}' cleared, new timeout: ${timeoutValue.toString()}`);\n\t\t\t\tthis.setTimeout(key, timeoutValue);\n\t\t\t}\n\t\t\tthis.emit('update', this.buildStatus(true));\n\t\t\t/* v8 ignore next 3 */\n\t\t} catch (error) {\n\t\t\tthis.logger.error(error);\n\t\t}\n\t}\n\n\tprotected abstract handleCacheEntry<T extends Tiers[number]>(\n\t\tkey: Key,\n\t\ttier: T['tier'],\n\t\tcache: Tiers[number] | undefined,\n\t): Promise<T['data'] | undefined> | T['data'] | undefined;\n\t/**\n\t * this return new timeout value for cached entry based on tier (or undefined if tier doesn't have timeout)\n\t * @example\n\t * // if tier not care about data and just want to return default timeouts\n\t * protected handleTimeoutValue<T extends DateCacheTiers[number]>(key: Key, tier: T['type'], _data: T['data']) {\n\t * return this.handleTierDefaultTimeout(tier); // else make logic based on data (i.e. newer data should have longer timeout)\n\t * }\n\t */\n\tprotected abstract handleTimeoutValue<T extends Tiers[number]>(key: Key, tier: T['tier'], data: T['data']): Promise<number | undefined> | number | undefined;\n\t/**\n\t * this handle should change value of cache entry to another shape and return next tier default timeout (can also delete entry)\n\t */\n\tprotected abstract handleTierTimeout(key: Key): Promise<number | undefined> | number | undefined;\n\t/**\n\t * If request didn't specify timeout, this method should return default timeout for tier or undefined if tier doesn't have timeout.\n\t */\n\tprotected abstract handleTierDefaultTimeout(type: Tiers[number]['tier']): TimeoutEnum | undefined;\n\n\t/**\n\t * Build initial status data for cache\n\t * @example\n\t * protected getInitialStatusData(): Readonly<TierStatusInitialRecord<DateCacheTiers>> {\n\t * \treturn {model: 0, object: 0, stringValue: 0} as const;\n\t * }\n\t */\n\tprotected abstract getInitialStatusData(): Readonly<TierStatusInitialRecord<Tiers>>;\n}\n"],"mappings":"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","names":["EventEmitter","LogLevel","MapLogger","defaultLogMap","LogLevel","EventEmitter","MapLogger","EventEmitter","LogLevel","MapLogger","defaultLogMap","LogLevel","EventEmitter","MapLogger"]}