UNPKG

graphql-yoga

Version:
91 lines (90 loc) • 3.77 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.processResult = processResult; exports.processRequest = processRequest; const graphql_1 = require("graphql"); const promise_helpers_1 = require("@whatwg-node/promise-helpers"); const accept_js_1 = require("./plugins/result-processor/accept.js"); function processResult({ request, result, fetchAPI, onResultProcessHooks, serverContext, }) { const log = serverContext.log; let resultProcessor; const acceptableMediaTypes = []; let acceptedMediaType = '*/*'; return (0, promise_helpers_1.handleMaybePromise)(() => (0, promise_helpers_1.iterateAsync)(onResultProcessHooks, onResultProcessHook => { log.debug('Running onResultProcess hook'); return onResultProcessHook({ request, acceptableMediaTypes, result, setResult(newResult) { result = newResult; }, resultProcessor, setResultProcessor(newResultProcessor, newAcceptedMimeType) { resultProcessor = newResultProcessor; acceptedMediaType = newAcceptedMimeType; }, serverContext, }); }), () => { // If no result processor found for this result, return an error if (!resultProcessor) { log.debug({ accept: request.headers.get('accept'), acceptableMediaTypes }, 'No result processor matched, responding 406'); const response = new fetchAPI.Response(null, { status: 406, statusText: 'Not Acceptable', headers: { accept: acceptableMediaTypes.join('; charset=utf-8, '), }, }); log.debug({ status: response.status }, 'Sending response'); return response; } log.debug({ acceptedMediaType }, 'Result processor selected'); return (0, promise_helpers_1.handleMaybePromise)(() => resultProcessor(result, fetchAPI, acceptedMediaType), response => { log.debug({ status: response.status }, 'Sending response'); return response; }); }); } function processRequest({ params, enveloped, request, log, onOperationType, }) { // Parse GraphQLParams let document; try { document = enveloped.parse(params.query); } catch (err) { log.debug({ err }, 'Parsing failed'); throw err; } // Get the actual operation const operation = (0, graphql_1.getOperationAST)(document, params.operationName); onOperationType?.(operation?.operation); log.debug({ operationType: operation?.operation }, 'Parsed GraphQL document'); // Validate parsed Document Node const errors = enveloped.validate(enveloped.schema, document); if (errors.length > 0) { log.debug({ errors }, 'Validation failed'); return { errors }; } // Build the context for the execution return (0, promise_helpers_1.handleMaybePromise)(() => enveloped.contextFactory(), contextValue => { const executionArgs = { schema: enveloped.schema, document, contextValue, variableValues: params.variables, operationName: params.operationName, }; if (request) { const incrementalSpec = (0, accept_js_1.getIncrementalSpecForRequest)(request); if (incrementalSpec) { executionArgs.incrementalSpec = incrementalSpec; } } // Choose the right executor const executeFn = operation?.operation === 'subscription' ? enveloped.subscribe : enveloped.execute; // Get the result to be processed return executeFn(executionArgs); }); }