UNPKG

@graphql-mesh/utils

Version:
78 lines (77 loc) 2.81 kB
import { mapMaybePromise } from '@graphql-tools/utils'; import { iterateAsync } from './iterateAsync.js'; import { DefaultLogger } from './logger.js'; export const requestIdByRequest = new WeakMap(); export const loggerForExecutionRequest = new WeakMap(); export function wrapFetchWithHooks(onFetchHooks) { return function wrappedFetchFn(url, options, context, info) { let fetchFn; let response$; const onFetchDoneHooks = []; return mapMaybePromise(iterateAsync(onFetchHooks, (onFetch, endEarly) => onFetch({ fetchFn, setFetchFn(newFetchFn) { fetchFn = newFetchFn; }, url, setURL(newUrl) { url = String(newUrl); }, options, setOptions(newOptions) { options = newOptions; }, context, info, get executionRequest() { return info?.executionRequest; }, get requestId() { if (context?.request) { return requestIdByRequest.get(context.request); } }, get logger() { let logger; if (info?.executionRequest) { logger = loggerForExecutionRequest.get(info.executionRequest); } if (!logger) { logger = new DefaultLogger('fetch'); } if (context?.request) { const requestId = requestIdByRequest.get(context.request); if (requestId) { logger = logger.child(requestId); } } if (info?.executionRequest) { loggerForExecutionRequest.set(info.executionRequest, logger); } return logger; }, endResponse(newResponse) { response$ = newResponse; endEarly(); }, }), onFetchDoneHooks), function handleIterationResult() { if (response$) { return response$; } response$ = fetchFn(url, options, context, info); if (onFetchDoneHooks.length === 0) { return response$; } return mapMaybePromise(response$, function (response) { return mapMaybePromise(iterateAsync(onFetchDoneHooks, onFetchDone => onFetchDone({ response, setResponse(newResponse) { response = newResponse; }, })), function handleOnFetchDone() { return response; }); }); }); }; }