/** * Pure-JS port of `src/cli/proxy.ts` — installs a global undici * ProxyAgent so Node native `fetch()` honors `PILOTDECK_PROXY` / * `HTTPS_PROXY` / `HTTP_PROXY`. Node's native fetch does NOT respect * those env vars by default; this closes the gap. * * Living in `ui/server/utils/` lets the express bridge run from * source without depending on `dist/src/cli/proxy.js`. */ import { ProxyAgent, setGlobalDispatcher } from 'undici'; function getProxyUrl(env = process.env) { return ( env.PILOTDECK_PROXY || env.https_proxy || env.HTTPS_PROXY || env.http_proxy || env.HTTP_PROXY ); } let installed = false; /** * Install a global undici ProxyAgent. Safe to call multiple times — * only the first effective call wins. Returns the proxy URL that was * activated, or undefined if no proxy is configured. * * @param {string} [explicitUrl] Override the env-driven proxy URL. * @returns {string | undefined} The activated proxy URL. */ export function installGlobalProxy(explicitUrl) { if (installed) return undefined; const proxyUrl = explicitUrl ?? getProxyUrl(); if (!proxyUrl) return undefined; try { const agent = new ProxyAgent(proxyUrl); setGlobalDispatcher(agent); installed = true; console.log(`[proxy] Global fetch proxy → ${proxyUrl}`); return proxyUrl; } catch (error) { console.warn( `[proxy] Failed to install global proxy (${proxyUrl}):`, error instanceof Error ? error.message : String(error), ); return undefined; } }