UNPKG

@graphql-mesh/utils

Version:
82 lines (81 loc) 3.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.loggerForExecutionRequest = exports.requestIdByRequest = void 0; exports.wrapFetchWithHooks = wrapFetchWithHooks; const utils_1 = require("@graphql-tools/utils"); const iterateAsync_js_1 = require("./iterateAsync.js"); const logger_js_1 = require("./logger.js"); exports.requestIdByRequest = new WeakMap(); exports.loggerForExecutionRequest = new WeakMap(); function wrapFetchWithHooks(onFetchHooks) { return function wrappedFetchFn(url, options, context, info) { let fetchFn; let response$; const onFetchDoneHooks = []; return (0, utils_1.mapMaybePromise)((0, iterateAsync_js_1.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 exports.requestIdByRequest.get(context.request); } }, get logger() { let logger; if (info?.executionRequest) { logger = exports.loggerForExecutionRequest.get(info.executionRequest); } if (!logger) { logger = new logger_js_1.DefaultLogger('fetch'); } if (context?.request) { const requestId = exports.requestIdByRequest.get(context.request); if (requestId) { logger = logger.child(requestId); } } if (info?.executionRequest) { exports.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 (0, utils_1.mapMaybePromise)(response$, function (response) { return (0, utils_1.mapMaybePromise)((0, iterateAsync_js_1.iterateAsync)(onFetchDoneHooks, onFetchDone => onFetchDone({ response, setResponse(newResponse) { response = newResponse; }, })), function handleOnFetchDone() { return response; }); }); }); }; }