UNPKG

@graphql-yoga/plugin-persisted-operations

Version:

Persisted Operations plugin for GraphQL Yoga.

64 lines (63 loc) 2.77 kB
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); } }, }; }