refactor: guard dispatcher definition so non-Node runtimes won't have issues

This commit is contained in:
Opliko
2024-01-22 23:17:20 +01:00
committed by Julian Lam
parent 2cb370882b
commit 2ce14f5019

View File

@@ -7,23 +7,13 @@ exports.jar = function () {
return new CookieJar(); return new CookieJar();
}; };
// Initialize fetch - required for globalDispatcher to be available // Initialize fetch - somewhat hacky, but it's required for globalDispatcher to be available
fetch().catch(() => null);
// Workaround for https://github.com/nodejs/undici/issues/1305
class FetchAgent extends global[Symbol.for('undici.globalDispatcher.1')].constructor {
dispatch(opts, handler) {
delete opts.headers['sec-fetch-mode'];
return super.dispatch(opts, handler);
}
}
const fetchAgent = new FetchAgent();
async function call(url, method, { body, timeout, jar, ...config } = {}) { async function call(url, method, { body, timeout, jar, ...config } = {}) {
let fetchImpl = fetch; let fetchImpl = fetch;
if (jar) { if (jar) {
fetchImpl = fetchCookie(fetch, jar); fetchImpl = fetchCookie(fetch, jar);
} }
const jsonTest = /application\/([a-z]+\+)?json/; const jsonTest = /application\/([a-z]+\+)?json/;
const opts = { const opts = {
...config, ...config,
@@ -32,7 +22,6 @@ async function call(url, method, { body, timeout, jar, ...config } = {}) {
'content-type': 'application/json', 'content-type': 'application/json',
...config.headers, ...config.headers,
}, },
dispatcher: fetchAgent,
}; };
if (timeout > 0) { if (timeout > 0) {
opts.signal = AbortSignal.timeout(timeout); opts.signal = AbortSignal.timeout(timeout);
@@ -45,6 +34,16 @@ async function call(url, method, { body, timeout, jar, ...config } = {}) {
opts.body = body; opts.body = body;
} }
} }
// Workaround for https://github.com/nodejs/undici/issues/1305
if (global[Symbol.for('undici.globalDispatcher.1')] !== undefined) {
class FetchAgent extends global[Symbol.for('undici.globalDispatcher.1')].constructor {
dispatch(opts, handler) {
delete opts.headers['sec-fetch-mode'];
return super.dispatch(opts, handler);
}
}
opts.dispatcher = new FetchAgent();
}
const response = await fetchImpl(url, opts); const response = await fetchImpl(url, opts);