@graphql-yoga/plugin-persisted-operations
Version:
Persisted Operations plugin for GraphQL Yoga.
64 lines (63 loc) • 2.77 kB
JavaScript
import { createGraphQLError, } from 'graphql-yoga';
export const defaultExtractPersistedOperationId = (params) => {
if (params.extensions != null &&
typeof params.extensions === 'object' &&
params.extensions?.persistedQuery != null &&
typeof params.extensions?.persistedQuery === 'object' &&
params.extensions?.persistedQuery.version === 1 &&
typeof params.extensions?.persistedQuery.sha256Hash === 'string') {
return params.extensions?.persistedQuery.sha256Hash;
}
return null;
};
export function usePersistedOperations({ allowArbitraryOperations = false, extractPersistedOperationId = defaultExtractPersistedOperationId, getPersistedOperation, skipDocumentValidation = false, }) {
const operationASTByRequest = new WeakMap();
const persistedOperationRequest = new WeakSet();
return {
async onParams({ request, params, setParams }) {
if (params.query) {
if ((typeof allowArbitraryOperations === 'boolean'
? allowArbitraryOperations
: await allowArbitraryOperations(request)) === false) {
throw createGraphQLError('PersistedQueryOnly');
}
return;
}
const persistedOperationKey = extractPersistedOperationId(params);
if (persistedOperationKey == null) {
throw createGraphQLError('PersistedQueryNotFound');
}
const persistedQuery = await getPersistedOperation(persistedOperationKey);
if (persistedQuery == null) {
throw createGraphQLError('PersistedQueryNotFound');
}
if (typeof persistedQuery === 'object') {
setParams({
query: `__PERSISTED_OPERATION_${persistedOperationKey}__`,
variables: params.variables,
extensions: params.extensions,
});
operationASTByRequest.set(request, persistedQuery);
}
else {
setParams({
query: persistedQuery,
variables: params.variables,
extensions: params.extensions,
});
}
persistedOperationRequest.add(request);
},
onValidate({ setResult, context: { request } }) {
if (skipDocumentValidation && persistedOperationRequest.has(request)) {
setResult([]); // skip validation
}
},
onParse({ setParsedDocument, context: { request } }) {
const ast = operationASTByRequest.get(request);
if (ast) {
setParsedDocument(ast);
}
},
};
}