map-cache-ttl
Version:
Map cache with expiration and es6 `Map`s
95 lines (64 loc) • 2.8 kB
Markdown
# map-cache-ttl
Map subclass for use as simple cache *with* expiration
## Usage
```js
const Cache = require('map-cache-ttl');
let cache = new Cache('5s', '1m');
// Will cache for 5seconds by default
// and trim() expired pairs every minute
cache.set('foo', {bar: 'baz'}, '30s');
// will cache in 'foo' key for 30 seconds
cache.has('foo'); // true
//... 30 seconds later
cache.has('foo'); // false
const getRawBody = require('raw-body');
let requests = 0;
const proxy = cache.proxy((url) => new Promise((resolve, reject) => {
requests += 1;
http
.get(url, res => res.statusCode == 200 ?
resolve(getRawBody(res)) :
reject(new Error(`${res.statusCode} ${res.statusMessage}`))
)
.on('error', reject);
}), '30s');
// requests is 1
proxy('https://github.com')
.then( github => console.log(github) ) // requests is 1
.then( () => proxy('https://github.com') ) // requests is 1, cache hit
.then( () => ... ) // 1 min later
.then( () => proxy('https://github.com') )
.then( github => console.log(github) ); // requests is 2, github page fresh
```
### `new Cache(max_age, interval)`
*max_age* sets the default max age for keys. If not set or is less then 1ms
it will default to `Infinity` and keys will *never* expire unless a per-key
`max_age` is passed during `cache.set(key, value, max_age)` or `cache.proxy(fn, max_age)`.
*interval* sets a `setInterval` for `cache.trim()` to automatically
trim expired keys. Default is to set no interval and use `cache.trim()`
manually to free up expired objects.
### `cache.get(key)`
Will return the stored value for the specified key if the expiration time is in
the future.
### `cache.has(key)`
Will return `true` if a value is stored the specified key and it has not expired.
### `cache.set(key, value, max_age)`
Cache a value into a specific key.
The *key* can be any type other then `string` as `Cache` extends `Map` objects.
The *value* will be cached for `max_age` ms *but* it's contents are _not_ protected
from modifications in any way. It's the value's user's responsibility to ensure
that the values will not be modified if this is desired.
If no *max_age* is provided or it is less then 1ms it will default to the cache's
default to `cache.max_age`.
### `cache.proxy(fn, max_age)`
Will return a wrapper `function` that will cache the results of the first
function invocation for every set of arguments. This works by hashing arguments
using [object-hash](https://www.npmjs.com/package/object-hash). The proxy `function`
always returns a `Promise`
### `cache.trim()`
Clean up __expired__ key/value pairs.
### `cache.clear()`
Clear __all__ key/value pairs.
### `cache.size`
Will return the number of *not expired* items.
> __Caution__ This will also trigger a `cache.trim()` to calculate the correct size.