@envelop/validation-cache
Version:
This plugins adds simple LRU caching to your `validate`, to improve performance by caching the validation result.
38 lines (37 loc) • 1.29 kB
JavaScript
import { print } from 'graphql';
import LRU from 'lru-cache';
const DEFAULT_MAX = 1000;
const DEFAULT_TTL = 3600000;
const rawDocumentSymbol = Symbol('rawDocument');
export const useValidationCache = (pluginOptions = {}) => {
const resultCache = typeof pluginOptions.cache !== 'undefined'
? pluginOptions.cache
: new LRU({
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] ?? 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);
};
},
};
};