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