Keshi is a tiny in-memory cache for Node and the browser that is especially suited to storing Promises (e.g. caching fetch requests).
import Keshi from 'keshi'
// or
const Keshi = require('keshi')
const cache = new Keshi()
const user = await cache.resolve(
'user',
() => fetch('https://myapi.com/user').then(r => r.json()),
'5mins'
)
What this will do:
- Fetch the user from the API as it doesn't have it in cache.
- If called again within 5 minutes it will return the cached user.
- If called after 5 minutes it will fetch the user again and re-cache.
Keshi automatically cleans up expired items.
cache.resolve<T>(key: string, getValue: () => T | Promise<T>, expiresIn?: number | string) => Promise<T>
function getCachedUser() {
return cache.resolve(
'user',
() => fetch('https://myapi.com/user').then(r => r.json()),
'5mins' // Anything 'ms' package accepts or milliseconds as a number. Omit for no expiry.
)
}
const user1 = await getCachedUser() // First time caches the promise and returns it
const user2 = await getCachedUser() // Second time returns the first promise if within 5mins
You can use plain values but they must still be awaited:
const plainValue = await cache.resolve('mynumber', () => 5, '10mins')
console.log(plainValue) // prints 5
Explicitly delete a cached object.
Note: expired objects are automatically cleanup up.
If true
is passed for matchStart
then any cache starting with the key
will be deleted:
cache.del(`project.${projectId}.`, true) // Delete all caches under this projectId
Clear the whole cache.
A stale cache cleanup interval is running in the background. If your cache doesn't last the lifetime of your application then you should call teardown.