DEV Community

Michael Di Prisco
Michael Di Prisco

Posted on

Our Journey In The Open Source World - cache-candidate-plugin-dependency-keys

Do you know we built an awesome caching library for Node at Jointly? No?! Well, check this out!

Today we want to present you our first plugin: A dependency key invalidation plugin!

What is this?

This is a plugin for @jointly/cache-candidate that allows you to use a dependency keys mechanism to invalidate the cache records.

How To Install?

$ npm install @jointly/cache-candidate-plugin-dependency-keys
Enter fullscreen mode Exit fullscreen mode

How To Use It?

The library exposes a PluginDependencyKeys object that can be used as a plugin for the cacheCandidate library and a cacheCandidateDependencyManager object that can be used to invalidate the cache records.

import { cacheCandidate } from '@jointly/cache-candidate';
import { PluginDependencyKeys, cacheCandidateDependencyManager } from '@jointly/cache-candidate-plugin-dependency-keys';

async function getUsers() {
  // Do something
  return users;
}

async function updateUser(user) {
  // Do something
  cacheCandidateDependencyManager.invalidate(`users-${user.id}`); // <-- This is responsible for invalidating the cache records that depend on the key 'users-1'
  return user;
}

const cachedGetUsers = cacheCandidate(getUsers, {
  requestsThreshold: 1,
  plugins: [
      {
        name: PluginDependencyKeys.name,
        hooks: PluginDependencyKeys.hooks,
        // ...PluginDependencyKeys would to the same
        additionalParameters: { dependencyKeys: (users) => users.map((user) => `users-${user.id}`) }
      }
    ]
});

let users;
users = await cachedGetUsers(); // <-- This will be executed and cached
users = await cachedGetUsers(); // <-- This will be retrieved from the cache
await updateUser({ id: 1, name: 'John' }); // <-- This will invalidate the dependency key 'users-1' and the cache record will be removed consequently
users = await cachedGetUsers(); // <-- This will be executed and cached
Enter fullscreen mode Exit fullscreen mode

You can pass an additional parameter dependencyKeys property which instructs the plugin about which keys to use to invalidate the cache records if necessary.

This property can be either a number, a string, an array of strings, a function that returns an array of strings or a function that returns a Promise fulfilled with an array of strings.

Both the function and the Promise will receive the result of the method on which the cacheCandidate operates.

In case of an async method, the promise will be fulfilled before passing the result to the dependencyKeys function.

The dependencyKeys function will be called only if the cache adapter correctly sets the value in the cache (i.e. the .set method is fulfilled).

Top comments (0)