@envelop/validation-cache
Version:
This plugins adds simple LRU caching to your `validate`, to improve performance by caching the validation result.
43 lines (42 loc) • 1.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useValidationCache = void 0;
const tslib_1 = require("tslib");
const graphql_1 = require("graphql");
const lru_cache_1 = tslib_1.__importDefault(require("lru-cache"));
const DEFAULT_MAX = 1000;
const DEFAULT_TTL = 3600000;
const rawDocumentSymbol = Symbol('rawDocument');
const useValidationCache = (pluginOptions = {}) => {
const resultCache = typeof pluginOptions.cache !== 'undefined'
? pluginOptions.cache
: new lru_cache_1.default({
max: DEFAULT_MAX,
maxAge: DEFAULT_TTL,
});
return {
onSchemaChange() {
if (resultCache.reset) {
resultCache.reset?.();
}
else if ('clear' in resultCache) {
resultCache.clear?.();
}
},
onParse({ params, extendContext }) {
extendContext({ [rawDocumentSymbol]: params.source.toString() });
},
onValidate({ params, context, setResult }) {
const key = context[rawDocumentSymbol] ?? (0, graphql_1.print)(params.documentAST);
const cachedResult = resultCache.get(key);
if (cachedResult !== undefined) {
setResult(cachedResult);
}
return ({ result }) => {
// @ts-expect-error TODO: not sure how we will make it dev friendly
resultCache.set(key, result);
};
},
};
};
exports.useValidationCache = useValidationCache;