@graphql-mesh/utils
Version:
57 lines (56 loc) • 1.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.wrapFetchWithHooks = void 0;
const utils_1 = require("@graphql-tools/utils");
const iterateAsync_js_1 = require("./iterateAsync.js");
function wrapFetchWithHooks(onFetchHooks) {
return function wrappedFetchFn(url, options, context, info) {
let fetchFn;
const doneHooks = [];
function setFetchFn(newFetchFn) {
fetchFn = newFetchFn;
}
const result$ = (0, iterateAsync_js_1.iterateAsync)(onFetchHooks, onFetch => onFetch({
fetchFn,
setFetchFn,
url,
setURL(newUrl) {
url = String(newUrl);
},
options,
setOptions(newOptions) {
options = newOptions;
},
context,
info,
}), doneHooks);
function handleIterationResult() {
const response$ = fetchFn(url, options, context, info);
if (doneHooks.length === 0) {
return response$;
}
if ((0, utils_1.isPromise)(response$)) {
return response$.then(response => handleOnFetchDone(response, doneHooks));
}
return handleOnFetchDone(response$, doneHooks);
}
if ((0, utils_1.isPromise)(result$)) {
return result$.then(handleIterationResult);
}
return handleIterationResult();
};
}
exports.wrapFetchWithHooks = wrapFetchWithHooks;
function handleOnFetchDone(response, onFetchDoneHooks) {
function setResponse(newResponse) {
response = newResponse;
}
const result$ = (0, iterateAsync_js_1.iterateAsync)(onFetchDoneHooks, onFetchDone => onFetchDone({
response,
setResponse,
}));
if ((0, utils_1.isPromise)(result$)) {
return result$.then(() => response);
}
return response;
}