You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.1 KiB
48 lines
1.1 KiB
import type { CacheDriver } from '../types'
|
|
|
|
interface MemoryEntry {
|
|
value: unknown
|
|
expiresAt: number | null
|
|
}
|
|
|
|
export class MemoryDriver implements CacheDriver {
|
|
name = 'memory'
|
|
private store = new Map<string, MemoryEntry>()
|
|
|
|
async get<T>(key: string): Promise<T | null> {
|
|
const entry = this.store.get(key)
|
|
if (!entry) return null
|
|
|
|
if (entry.expiresAt !== null && entry.expiresAt < Date.now()) {
|
|
this.store.delete(key)
|
|
return null
|
|
}
|
|
|
|
return entry.value as T
|
|
}
|
|
|
|
async set<T>(key: string, value: T, ttl = 0): Promise<void> {
|
|
const expiresAt = ttl > 0 ? Date.now() + ttl * 1000 : null
|
|
this.store.set(key, { value, expiresAt })
|
|
}
|
|
|
|
async del(key: string): Promise<void> {
|
|
this.store.delete(key)
|
|
}
|
|
|
|
async exists(key: string): Promise<boolean> {
|
|
const entry = this.store.get(key)
|
|
if (!entry) return false
|
|
|
|
if (entry.expiresAt !== null && entry.expiresAt < Date.now()) {
|
|
this.store.delete(key)
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
async clear(): Promise<void> {
|
|
this.store.clear()
|
|
}
|
|
}
|