graphql-yoga
Version:
91 lines (90 loc) • 3.77 kB
JavaScript
;
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);
});
}