@stewartmcgown/apollo-response-cache
Version:
Caching and invalidation mechanisms (plugins, directives) of Apollo GraphQL
47 lines (46 loc) • 1.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.invalidateFQC = exports.recordNodeFQCMapping = exports.toNodeFQCKey = void 0;
const enums_1 = require("./enums");
/**
* Generate cache key of Node and FQC hashes array mapping
*
* e.g. ['Article', 18] -> 'node-fqcs:Article:18'
*/
exports.toNodeFQCKey = (node) => {
return `${enums_1.CACHE_KEY_PREFIX_NODE_FQC}:${node.type}:${node.id}`;
};
/**
* Record Node:FQC mapping
*
*/
exports.recordNodeFQCMapping = ({ nodeFQCKeys, fqcKey, ttl, redis, }) => {
try {
nodeFQCKeys.forEach((cacheKey) => {
redis.client.sadd(cacheKey, fqcKey);
redis.client.expire(cacheKey, ttl);
});
}
catch (error) {
console.warn(error);
}
};
/**
* Invalidate full query caches by the given related node keys
*/
exports.invalidateFQC = async ({ node, redis, }) => {
try {
const key = exports.toNodeFQCKey(node);
const hashes = await redis.client.smembers(key);
hashes.map(async (hash) => {
await redis.client
.pipeline()
.del(`${enums_1.CACHE_KEY_PREFIX_FQC}${hash}`)
.srem(key, hash)
.exec();
});
}
catch (error) {
console.warn(error);
}
};