UNPKG

@graphql-yoga/plugin-persisted-operations

Version:

Persisted Operations plugin for GraphQL Yoga.

93 lines (92 loc) 4.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.defaultExtractPersistedOperationId = void 0; exports.usePersistedOperations = usePersistedOperations; const graphql_yoga_1 = require("graphql-yoga"); const promise_helpers_1 = require("@whatwg-node/promise-helpers"); 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; }; exports.defaultExtractPersistedOperationId = defaultExtractPersistedOperationId; function usePersistedOperations({ allowArbitraryOperations = false, extractPersistedOperationId = exports.defaultExtractPersistedOperationId, getPersistedOperation, skipDocumentValidation = false, customErrors, }) { const operationASTByRequest = new WeakMap(); const persistedOperationRequest = new WeakSet(); const notFoundErrorFactory = createErrorFactory('PersistedQueryNotFound', customErrors?.notFound); const keyNotFoundErrorFactory = createErrorFactory('PersistedQueryKeyNotFound', customErrors?.keyNotFound); const persistentQueryOnlyErrorFactory = createErrorFactory('PersistedQueryOnly', customErrors?.persistedQueryOnly); return { onParams(payload) { const { request, params, setParams } = payload; if (params.query) { if (allowArbitraryOperations === false) { throw persistentQueryOnlyErrorFactory(payload); } if (typeof allowArbitraryOperations === 'function') { return (0, promise_helpers_1.handleMaybePromise)(() => allowArbitraryOperations(request), result => { if (!result) { throw persistentQueryOnlyErrorFactory(payload); } }); } return; } const persistedOperationKey = extractPersistedOperationId(params, request, payload.context); if (persistedOperationKey == null) { throw keyNotFoundErrorFactory(payload); } return (0, promise_helpers_1.handleMaybePromise)(() => getPersistedOperation(persistedOperationKey, request, payload.context), persistedQuery => { if (persistedQuery == null) { throw notFoundErrorFactory(payload); } if (typeof persistedQuery === 'object') { setParams({ query: `__PERSISTED_OPERATION_${persistedOperationKey}__`, operationName: params.operationName, variables: params.variables, extensions: params.extensions, }); operationASTByRequest.set(request, persistedQuery); } else { setParams({ query: persistedQuery, operationName: params.operationName, 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); } }, }; } function createErrorFactory(defaultMessage, options) { if (typeof options === 'string') { return () => (0, graphql_yoga_1.createGraphQLError)(options); } if (typeof options === 'function') { return options; } return () => { return (0, graphql_yoga_1.createGraphQLError)(options?.message ?? defaultMessage, options); }; }