graphql-yoga
Version:
<div align="center"><img src="./website/public/cover.png" width="720" /></div>
54 lines (53 loc) • 2.38 kB
JavaScript
import { isAsyncIterable } from '@envelop/core';
import { getMediaTypesForRequestInOrder, isMatchingMediaType, } from './resultProcessor/accept.js';
import { processMultipartResult } from './resultProcessor/multipart.js';
import { processPushResult } from './resultProcessor/push.js';
import { processRegularResult } from './resultProcessor/regular.js';
const multipart = {
mediaTypes: ['multipart/mixed'],
asyncIterables: true,
processResult: processMultipartResult,
};
const textEventStream = {
mediaTypes: ['text/event-stream'],
asyncIterables: true,
processResult: processPushResult,
};
const regular = {
mediaTypes: ['application/graphql-response+json', 'application/json'],
asyncIterables: false,
processResult: processRegularResult,
};
const defaultList = [textEventStream, multipart, regular];
const subscriptionList = [multipart, textEventStream, regular];
export function useResultProcessors() {
const isSubscriptionRequestMap = new WeakMap();
return {
onSubscribe({ args: { contextValue } }) {
if (contextValue.request) {
isSubscriptionRequestMap.set(contextValue.request, true);
}
},
onResultProcess({ request, result, acceptableMediaTypes, setResultProcessor, }) {
const isSubscriptionRequest = isSubscriptionRequestMap.get(request);
const processorConfigList = isSubscriptionRequest
? subscriptionList
: defaultList;
const requestMediaTypes = getMediaTypesForRequestInOrder(request);
const isAsyncIterableResult = isAsyncIterable(result);
for (const requestMediaType of requestMediaTypes) {
for (const resultProcessorConfig of processorConfigList) {
if (isAsyncIterableResult && !resultProcessorConfig.asyncIterables) {
continue;
}
for (const processorMediaType of resultProcessorConfig.mediaTypes) {
acceptableMediaTypes.push(processorMediaType);
if (isMatchingMediaType(processorMediaType, requestMediaType)) {
setResultProcessor(resultProcessorConfig.processResult, processorMediaType);
}
}
}
}
},
};
}