@envelop/graphql-jit
Version:
This plugins replaces the original `execute` of GraphQL with [`graphql-jit`](https://github.com/zalando-incubator/graphql-jit).
75 lines (74 loc) • 3.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useGraphQlJit = void 0;
const tslib_1 = require("tslib");
/* eslint-disable no-console */
const core_1 = require("@envelop/core");
const graphql_1 = require("graphql");
const graphql_jit_1 = require("graphql-jit");
const lru_cache_1 = tslib_1.__importDefault(require("lru-cache"));
const DEFAULT_MAX = 1000;
const DEFAULT_TTL = 3600000;
const useGraphQlJit = (compilerOptions = {}, pluginOptions = {}) => {
const documentSourceMap = new WeakMap();
const jitCache = typeof pluginOptions.cache !== 'undefined'
? pluginOptions.cache
: new lru_cache_1.default({ max: DEFAULT_MAX, maxAge: DEFAULT_TTL });
function getCacheEntry(args) {
let cacheEntry;
const documentSource = documentSourceMap.get(args.document);
if (documentSource) {
cacheEntry = jitCache.get(documentSource);
}
if (!cacheEntry) {
const compilationResult = (0, graphql_jit_1.compileQuery)(args.schema, args.document, args.operationName ?? undefined, compilerOptions);
if (!(0, graphql_jit_1.isCompiledQuery)(compilationResult)) {
if (pluginOptions?.onError) {
pluginOptions.onError(compilationResult);
}
else {
console.error(compilationResult);
}
cacheEntry = {
query: () => compilationResult,
};
}
else {
cacheEntry = compilationResult;
}
if (documentSource) {
jitCache.set(documentSource, cacheEntry);
}
}
return cacheEntry;
}
return {
onParse({ params: { source } }) {
const key = source instanceof graphql_1.Source ? source.body : source;
return ({ result }) => {
if (!result || result instanceof Error)
return;
documentSourceMap.set(result, key);
};
},
async onExecute({ args, setExecuteFn }) {
if (!pluginOptions.enableIf || (pluginOptions.enableIf && (await pluginOptions.enableIf(args)))) {
setExecuteFn((0, core_1.makeExecute)(function jitExecutor(args) {
const cacheEntry = getCacheEntry(args);
return cacheEntry.query(args.rootValue, args.contextValue, args.variableValues);
}));
}
},
async onSubscribe({ args, setSubscribeFn }) {
if (!pluginOptions.enableIf || (pluginOptions.enableIf && (await pluginOptions.enableIf(args)))) {
setSubscribeFn((0, core_1.makeSubscribe)(async function jitSubscriber(args) {
const cacheEntry = getCacheEntry(args);
return cacheEntry.subscribe
? cacheEntry.subscribe(args.rootValue, args.contextValue, args.variableValues)
: cacheEntry.query(args.rootValue, args.contextValue, args.variableValues);
}));
}
},
};
};
exports.useGraphQlJit = useGraphQlJit;