UNPKG

graphql-yoga

Version:

<div align="center"><img src="./website/public/cover.png" width="720" /></div>

54 lines (53 loc) 2.38 kB
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); } } } } }, }; }