UNPKG

@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
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); }; }, }; };