* 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;
}
}