{"version":3,"sources":["../../../../../src/cache/adapters/in-memory/index.ts"],"sourcesContent":["import { v } from 'valleyed'\n\nimport { Instance } from '../../../instance'\nimport { configurable } from '../../../utilities'\nimport { Cache } from '../base'\n\ntype CacheEntry = {\n\tdata: string\n\texpiredAt?: number\n}\n\nexport const inMemoryCacheConfigPipe = () => v.object({})\n\nexport class InMemoryCache extends configurable(inMemoryCacheConfigPipe, Cache) {\n\t#caches = new Map<string, CacheEntry>()\n\t#interval?: ReturnType<typeof setInterval>\n\n\tprotected constructor(config: typeof InMemoryCache.Config) {\n\t\tsuper(config)\n\t\tInstance.on('start', async () => {\n\t\t\tthis.#interval = setInterval(() => {\n\t\t\t\tconst now = Date.now()\n\t\t\t\tfor (const [key, record] of this.#caches.entries()) {\n\t\t\t\t\tif (record.expiredAt && record.expiredAt <= now) this.#caches.delete(key)\n\t\t\t\t}\n\t\t\t}, 5000)\n\t\t}, { class: InMemoryCache })\n\t\tInstance.on('close', async () => clearInterval(this.#interval), { class: InMemoryCache })\n\t}\n\n\tasync delete(key: string) {\n\t\tthis.#caches.delete(this.getScopedKey(key))\n\t}\n\tasync get(key: string) {\n\t\tconst record = this.#caches.get(this.getScopedKey(key))\n\t\tif (record && (record.expiredAt === undefined || record.expiredAt > Date.now())) return record.data\n\t\treturn null\n\t}\n\tasync set(key: string, data: string, ttlInSecs?: number) {\n\t\tthis.#caches.set(this.getScopedKey(key), { data, expiredAt: ttlInSecs ? Date.now() + ttlInSecs * 1000 : undefined })\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect, expectTypeOf, vi, beforeEach, afterEach } = import.meta.vitest\n\n\tlet hookCalls: Array<{ event: string; options?: any }>\n\n\tbeforeEach(() => {\n\t\thookCalls = []\n\t\tvi.spyOn(Instance, 'on').mockImplementation((event, _cb, options) => {\n\t\t\thookCalls.push({ event, options })\n\t\t})\n\t\tvi.spyOn(Instance, 'get').mockReturnValue({ getScopedName: (_name: string, _sep: string) => `test:${_name}` } as any)\n\t})\n\n\tafterEach(() => {\n\t\tvi.restoreAllMocks()\n\t})\n\n\tdescribe('InMemoryCache', () => {\n\t\ttest('create() produces a working instance', () => {\n\t\t\tconst cache = InMemoryCache.create({})\n\t\t\texpect(cache).toBeInstanceOf(InMemoryCache)\n\t\t})\n\n\t\ttest('new InMemoryCache() is a compile error', () => {\n\t\t\t// @ts-expect-error — external `new` on a class with protected constructor is a compile error\n\t\t\tvoid (() => new InMemoryCache({}))\n\t\t})\n\n\t\ttest('Instance.on calls use { class: InMemoryCache }', () => {\n\t\t\tInMemoryCache.create({})\n\t\t\tconst startHook = hookCalls.find((h) => h.event === 'start')\n\t\t\tconst closeHook = hookCalls.find((h) => h.event === 'close')\n\t\t\texpect(startHook?.options).toEqual({ class: InMemoryCache })\n\t\t\texpect(closeHook?.options).toEqual({ class: InMemoryCache })\n\t\t})\n\n\t\ttest('set/get/delete work correctly', async () => {\n\t\t\tconst cache = InMemoryCache.create({})\n\t\t\tawait cache.set('key1', 'value1')\n\t\t\texpect(await cache.get('key1')).toBe('value1')\n\t\t\tawait cache.delete('key1')\n\t\t\texpect(await cache.get('key1')).toBeNull()\n\t\t})\n\n\t\ttest('get returns null after ttl expires', async () => {\n\t\t\tconst now = Date.now()\n\t\t\tvi.spyOn(Date, 'now').mockReturnValue(now)\n\t\t\tconst cache = InMemoryCache.create({})\n\t\t\tawait cache.set('key1', 'value1', 1)\n\t\t\tvi.spyOn(Date, 'now').mockReturnValue(now + 1001)\n\t\t\texpect(await cache.get('key1')).toBeNull()\n\t\t})\n\n\t\ttest('Config type is accessible', () => {\n\t\t\ttype PipeOutput<T> = import('valleyed').PipeOutput<T>\n\t\t\ttype Expected = PipeOutput<ReturnType<typeof inMemoryCacheConfigPipe>>\n\t\t\texpectTypeOf<typeof InMemoryCache.Config>().toEqualTypeOf<Expected>()\n\t\t})\n\t})\n}\n"],"mappings":"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","names":[]}