mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-22 15:18:13 +00:00
fix(telegram): move network fallback to resolver-scoped dispatchers (#40740)
Merged via squash.
Prepared head SHA: a4456d48b4
Co-authored-by: sircrumpet <4436535+sircrumpet@users.noreply.github.com>
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Reviewed-by: @obviyus
This commit is contained in:
@@ -48,6 +48,7 @@ describe("makeProxyFetch", () => {
|
||||
undiciFetch.mockResolvedValue({ ok: true });
|
||||
|
||||
const proxyFetch = makeProxyFetch(proxyUrl);
|
||||
expect(proxyAgentSpy).not.toHaveBeenCalled();
|
||||
await proxyFetch("https://api.example.com/v1/audio");
|
||||
|
||||
expect(proxyAgentSpy).toHaveBeenCalledWith(proxyUrl);
|
||||
|
||||
@@ -1,19 +1,46 @@
|
||||
import { EnvHttpProxyAgent, ProxyAgent, fetch as undiciFetch } from "undici";
|
||||
import { logWarn } from "../../logger.js";
|
||||
|
||||
export const PROXY_FETCH_PROXY_URL = Symbol.for("openclaw.proxyFetch.proxyUrl");
|
||||
type ProxyFetchWithMetadata = typeof fetch & {
|
||||
[PROXY_FETCH_PROXY_URL]?: string;
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a fetch function that routes requests through the given HTTP proxy.
|
||||
* Uses undici's ProxyAgent under the hood.
|
||||
*/
|
||||
export function makeProxyFetch(proxyUrl: string): typeof fetch {
|
||||
const agent = new ProxyAgent(proxyUrl);
|
||||
let agent: ProxyAgent | null = null;
|
||||
const resolveAgent = (): ProxyAgent => {
|
||||
if (!agent) {
|
||||
agent = new ProxyAgent(proxyUrl);
|
||||
}
|
||||
return agent;
|
||||
};
|
||||
// undici's fetch is runtime-compatible with global fetch but the types diverge
|
||||
// on stream/body internals. Single cast at the boundary keeps the rest type-safe.
|
||||
return ((input: RequestInfo | URL, init?: RequestInit) =>
|
||||
const proxyFetch = ((input: RequestInfo | URL, init?: RequestInit) =>
|
||||
undiciFetch(input as string | URL, {
|
||||
...(init as Record<string, unknown>),
|
||||
dispatcher: agent,
|
||||
}) as unknown as Promise<Response>) as typeof fetch;
|
||||
dispatcher: resolveAgent(),
|
||||
}) as unknown as Promise<Response>) as ProxyFetchWithMetadata;
|
||||
Object.defineProperty(proxyFetch, PROXY_FETCH_PROXY_URL, {
|
||||
value: proxyUrl,
|
||||
enumerable: false,
|
||||
configurable: false,
|
||||
writable: false,
|
||||
});
|
||||
return proxyFetch;
|
||||
}
|
||||
|
||||
export function getProxyUrlFromFetch(fetchImpl?: typeof fetch): string | undefined {
|
||||
const proxyUrl = (fetchImpl as ProxyFetchWithMetadata | undefined)?.[PROXY_FETCH_PROXY_URL];
|
||||
if (typeof proxyUrl !== "string") {
|
||||
return undefined;
|
||||
}
|
||||
const trimmed = proxyUrl.trim();
|
||||
return trimmed ? trimmed : undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user