2.2.1 • Published 6 years ago
memcache-client-memoizer v2.2.1
memcache-client-memoizer
A function memoizer using a get/set cache client.
Install:
npm i memcache-client-memoizerAPI
memoizer(options)
Arguments
options:object. Required. An object with the following keys:client:{ get: (anything) => Promise, set: (anything, value, options) }. A cache client instance, must have agetandsetmethod. Thegetmethod must return a promise.clientProviderFn:() => clientA function which returns aclient(defined above); (Either aclientorclientProviderFnmust be passed.)fn:Function. Required. The function to memoize, must return a Promise.keyFn:(args to fn) => anything. Required. A function which returns a cache-key (can be anything) for caching. This function is called with the same arguments asfn, allowing you to create a dynamic cache-key, for example:const exampleKeyFn = ({ name, color }) => `${name}:${color}` // can be anythingsetOptions:anything. Optional. Formemcached-clientthis can be command options.cacheResultTransformFn.(result-from-cache) => transformed-result. Function to transform cache-result, defaults to(x) => x. This is useful if your cache service sends along the value in a different form than is returned by yourfn.skipCacheFn:(args to fn) => Boolean. Optional. A function which indicates that the call tofnshould skip the cache.
Note:
Rejected promises are not memoized - since that's probably not what you want :)
memcache-client example:
const MemcacheClient = require('memcache-client')
const { memoizer } = require('memcache-client-memoizer')
const fnToMemoize = ({ name, color }) => Promise.resolve({ name, color })
const memoizedFn = memoizer({
clientProviderFn: () => new MemcacheClient({ server: 'localhost:11211' }),
fn: fnToMemoize,
keyFn: ({ name, color }) => `${name}:${color}`, // this can return anything
cacheResultTransformFn: ({value}) => value,
skipCacheFn: ({ name, color }) => false,
})
memoizedFn({name: 'Max', color: 'blue'})
.then((result) => { ... }) // cache miss, fill cache, returns {name: 'Max', color: 'blue'}
// later on...
memoizedFn({name: 'Max', color: 'blue'})
.then((result) => { ... }) // cache hit, returns {name: 'Max', color: 'blue'}catbox example:
const Catbox = require('catbox');
const Memory = require('catbox-memory');
const cacheTtlMilliseconds = 1000 * 60 * 5; // 5 min
const client = new Catbox.Client(Memory);
await client.start();
const fnToMemoize = ({ name, color }) => Promise.resolve({ name, color })
const memoizedFn = memoizer({
client,
fn: fnToMemoize,
keyFn: ({ name, color }) => ({ segment: 'test', id: 'test-cache' }), // this can return anything
setOptions: cacheTtlMilliseconds,
cacheResultTransformFn: ({ item }) => item,
skipCacheFn: ({ name, color }) => false,
})
memoizedFn({name: 'Max', color: 'blue'})
.then((result) => { ... }) // cache miss, fill cache, returns {name: 'Max', color: 'blue'}
// later on...
memoizedFn({name: 'Max', color: 'blue'})
.then((result) => { ... }) // cache hit, returns {name: 'Max', color: 'blue'}