import type { CachePort } from '../port.js' import { wrapValue } from '../wrap.js' interface Entry { value: unknown expiresAt?: number } export interface MemoryAdapterOptions { store?: Map } export function memoryAdapter(options: MemoryAdapterOptions = {}): CachePort { const store = options.store ?? new Map() function read(key: string): Entry | null { const entry = store.get(key) if (entry === undefined) return null if (entry.expiresAt !== undefined && entry.expiresAt <= Date.now()) { store.delete(key) return null } return entry } const port: CachePort = { name: 'memory', async get(key: string) { const entry = read(key) return entry === null ? null : (entry.value as T) }, async set(key: string, value: T, ttlSeconds?: number) { const expiresAt = ttlSeconds === undefined ? undefined : Date.now() + ttlSeconds * 1000 store.set(key, { value, expiresAt }) }, async delete(key: string) { store.delete(key) }, async has(key: string) { return read(key) !== null }, wrap(key: string, factory: () => Promise, ttlSeconds?: number) { return wrapValue(port, key, factory, ttlSeconds) }, } return port }