mirror of
https://github.com/marcogll/TaxHacker_s23.git
synced 2026-01-13 13:25:18 +00:00
feat: add auth and cache to currency route
This commit is contained in:
108
lib/cache.ts
Normal file
108
lib/cache.ts
Normal file
@@ -0,0 +1,108 @@
|
||||
export type CacheKey = string
|
||||
export type CacheEntry<T> = {
|
||||
value: T
|
||||
timestamp: number
|
||||
}
|
||||
|
||||
export class PoorManCache<T> {
|
||||
private cache: Map<CacheKey, CacheEntry<T>>
|
||||
private duration: number
|
||||
|
||||
/**
|
||||
* Create a new cache instance
|
||||
* @param duration Cache duration in milliseconds
|
||||
*/
|
||||
constructor(duration: number) {
|
||||
this.cache = new Map<CacheKey, CacheEntry<T>>()
|
||||
this.duration = duration
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a value from the cache
|
||||
* @param key Cache key
|
||||
* @returns The cached value or undefined if not found or expired
|
||||
*/
|
||||
get(key: CacheKey): T | undefined {
|
||||
const entry = this.cache.get(key)
|
||||
|
||||
if (!entry) {
|
||||
return undefined
|
||||
}
|
||||
|
||||
// Check if entry is expired
|
||||
if (Date.now() - entry.timestamp > this.duration) {
|
||||
this.cache.delete(key)
|
||||
return undefined
|
||||
}
|
||||
|
||||
return entry.value
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a value in the cache
|
||||
* @param key Cache key
|
||||
* @param value Value to cache
|
||||
*/
|
||||
set(key: CacheKey, value: T): void {
|
||||
this.cache.set(key, {
|
||||
value,
|
||||
timestamp: Date.now(),
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a key exists in the cache and is not expired
|
||||
* @param key Cache key
|
||||
* @returns True if the key exists and is not expired
|
||||
*/
|
||||
has(key: CacheKey): boolean {
|
||||
const entry = this.cache.get(key)
|
||||
|
||||
if (!entry) {
|
||||
return false
|
||||
}
|
||||
|
||||
// Check if entry is expired
|
||||
if (Date.now() - entry.timestamp > this.duration) {
|
||||
this.cache.delete(key)
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a key from the cache
|
||||
* @param key Cache key
|
||||
*/
|
||||
delete(key: CacheKey): void {
|
||||
this.cache.delete(key)
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all expired entries from the cache
|
||||
*/
|
||||
cleanup(): void {
|
||||
const now = Date.now()
|
||||
for (const [key, entry] of this.cache.entries()) {
|
||||
if (now - entry.timestamp > this.duration) {
|
||||
this.cache.delete(key)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current size of the cache
|
||||
* @returns Number of entries in the cache
|
||||
*/
|
||||
size(): number {
|
||||
return this.cache.size
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all entries from the cache
|
||||
*/
|
||||
clear(): void {
|
||||
this.cache.clear()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user