Download packages/coding-agent/src/core/http-dispatcher.ts from SaylorTwift/pi: direct link, hf CLI and curl.
- Browser
- Download file 4.02 kB
-
https://huggingface.co/SaylorTwift/pi/resolve/main/packages/coding-agent/src/core/http-dispatcher.ts
- Command line
-
hf download hf://SaylorTwift/pi/packages/coding-agent/src/core/http-dispatcher.ts
-
curl -L -o http-dispatcher.ts https://huggingface.co/SaylorTwift/pi/resolve/main/packages/coding-agent/src/core/http-dispatcher.ts
4.02 kB
| import { EventEmitter } from "node:events"; | |
| import * as undici from "undici"; | |
| export const DEFAULT_HTTP_IDLE_TIMEOUT_MS = 300_000; | |
| // Node's 250ms default can terminate valid connection attempts on high-latency routes. | |
| const DEFAULT_AUTO_SELECT_FAMILY_ATTEMPT_TIMEOUT_MS = 2_000; | |
| export const HTTP_IDLE_TIMEOUT_CHOICES = [ | |
| { label: "30 sec", timeoutMs: 30_000 }, | |
| { label: "1 min", timeoutMs: 60_000 }, | |
| { label: "2 min", timeoutMs: 120_000 }, | |
| { label: "5 min", timeoutMs: 300_000 }, | |
| { label: "disabled", timeoutMs: 0 }, | |
| ] as const; | |
| const originalGlobalFetch = globalThis.fetch; | |
| let installedGlobalFetch: typeof globalThis.fetch | undefined; | |
| export function parseHttpIdleTimeoutMs(value: unknown): number | undefined { | |
| if (typeof value === "string") { | |
| const trimmed = value.trim(); | |
| if (trimmed.toLowerCase() === "disabled") { | |
| return 0; | |
| } | |
| if (trimmed.length === 0) { | |
| return undefined; | |
| } | |
| return parseHttpIdleTimeoutMs(Number(trimmed)); | |
| } | |
| if (typeof value !== "number" || !Number.isFinite(value) || value < 0) { | |
| return undefined; | |
| } | |
| return Math.floor(value); | |
| } | |
| export function formatHttpIdleTimeoutMs(timeoutMs: number): string { | |
| const choice = HTTP_IDLE_TIMEOUT_CHOICES.find((item) => item.timeoutMs === timeoutMs); | |
| if (choice) { | |
| return choice.label; | |
| } | |
| return `${timeoutMs / 1000} sec`; | |
| } | |
| export function applyHttpProxySettings(httpProxy: string | undefined): void { | |
| const proxy = httpProxy?.trim(); | |
| if (!proxy) return; | |
| process.env.HTTP_PROXY ??= proxy; | |
| process.env.HTTPS_PROXY ??= proxy; | |
| } | |
| const ignoreUndiciDispatcherError = (_error: unknown): void => {}; | |
| // Undici can emit an internal Client "error" while terminating a mid-stream | |
| // fetch body. The body stream still rejects through reader.read(); this listener | |
| // only prevents EventEmitter's unhandled "error" special case from crashing pi. | |
| function withUndiciErrorListener<T extends undici.Dispatcher>(dispatcher: T): T { | |
| if (dispatcher instanceof EventEmitter) { | |
| EventEmitter.prototype.on.call(dispatcher, "error", ignoreUndiciDispatcherError); | |
| } | |
| return dispatcher; | |
| } | |
| function createUndiciClient(origin: string | URL, options: object): undici.Dispatcher { | |
| return withUndiciErrorListener(new undici.Client(origin, options as undici.Client.Options)); | |
| } | |
| function createUndiciOriginDispatcher(origin: string | URL, options: object): undici.Dispatcher { | |
| const dispatcherOptions = options as undici.Pool.Options; | |
| if (dispatcherOptions.connections === 1) { | |
| return createUndiciClient(origin, dispatcherOptions); | |
| } | |
| return withUndiciErrorListener( | |
| new undici.Pool(origin, { | |
| ...dispatcherOptions, | |
| factory: createUndiciClient, | |
| }), | |
| ); | |
| } | |
| export function configureHttpDispatcher(timeoutMs: number = DEFAULT_HTTP_IDLE_TIMEOUT_MS): void { | |
| const normalizedTimeoutMs = parseHttpIdleTimeoutMs(timeoutMs); | |
| if (normalizedTimeoutMs === undefined) { | |
| throw new Error(`Invalid HTTP idle timeout: ${String(timeoutMs)}`); | |
| } | |
| const dispatcher = withUndiciErrorListener( | |
| new undici.EnvHttpProxyAgent({ | |
| allowH2: false, | |
| // Keep HTTP origins on CONNECT tunnels as they were before Undici 8.7. | |
| proxyTunnel: true, | |
| bodyTimeout: normalizedTimeoutMs, | |
| connect: { | |
| autoSelectFamilyAttemptTimeout: DEFAULT_AUTO_SELECT_FAMILY_ATTEMPT_TIMEOUT_MS, | |
| }, | |
| headersTimeout: normalizedTimeoutMs, | |
| clientFactory: createUndiciClient, | |
| factory: createUndiciOriginDispatcher, | |
| }), | |
| ); | |
| undici.setGlobalDispatcher(dispatcher); | |
| // Keep fetch and the dispatcher on the same undici implementation. Node 26.0's | |
| // bundled fetch can otherwise consume compressed responses through npm undici's | |
| // dispatcher without decompressing them, causing response.json() failures. | |
| // If a caller replaced fetch after module load, preserve that deliberate override. | |
| const shouldInstallGlobals = | |
| installedGlobalFetch === undefined | |
| ? globalThis.fetch === originalGlobalFetch | |
| : globalThis.fetch === installedGlobalFetch; | |
| if (shouldInstallGlobals) { | |
| undici.install?.(); | |
| installedGlobalFetch = globalThis.fetch; | |
| } | |
| } | |