rsnext/packages/next/lib/with-promise-cache.ts
Javi Velasco 036ffa7057
Extract and refactor getPageStaticInfo (#37062)
Extract config parsing
2022-05-20 14:24:00 +02:00

32 lines
899 B
TypeScript

/* eslint-disable no-redeclare */
interface Cache<K, V> {
set(key: K, value: V, maxAge?: number): boolean
get(key: K): V | undefined
del(key: K): void
}
export function withPromiseCache<K, V>(
cache: Cache<K, Promise<V>>,
fn: (value: K) => Promise<V>
): (value: K) => Promise<V>
export function withPromiseCache<T extends any[], K, V>(
cache: Cache<K, Promise<V>>,
fn: (...values: T) => Promise<V>,
getKey: (...values: T) => K
): (...values: T) => Promise<V>
export function withPromiseCache<T extends any[], K, V>(
cache: Cache<K, Promise<V>>,
fn: (...values: T) => Promise<V>,
getKey?: (...values: T) => K
): (...values: T) => Promise<V> {
return (...values: T) => {
const key = getKey ? getKey(...values) : values[0]
let p = cache.get(key)
if (!p) {
p = fn(...values)
p.catch(() => cache.del(key))
cache.set(key, p)
}
return p
}
}