@graphql-mesh/utils
Version:
78 lines (77 loc) • 2.81 kB
JavaScript
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;
});
});
});
};
}