Spaces:
Running
Running
File size: 2,261 Bytes
9e27976 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
import consola from "consola"
import { getProxyForUrl } from "proxy-from-env"
import { Agent, ProxyAgent, setGlobalDispatcher, type Dispatcher } from "undici"
export function initProxyFromEnv(): void {
if (typeof Bun !== "undefined") return
try {
const direct = new Agent()
const proxies = new Map<string, ProxyAgent>()
// We only need a minimal dispatcher that implements `dispatch` at runtime.
// Typing the object as `Dispatcher` forces TypeScript to require many
// additional methods. Instead, keep a plain object and cast when passing
// to `setGlobalDispatcher`.
const dispatcher = {
dispatch(
options: Dispatcher.DispatchOptions,
handler: Dispatcher.DispatchHandler,
) {
try {
const origin =
typeof options.origin === "string" ?
new URL(options.origin)
: (options.origin as URL)
const get = getProxyForUrl as unknown as (
u: string,
) => string | undefined
const raw = get(origin.toString())
const proxyUrl = raw && raw.length > 0 ? raw : undefined
if (!proxyUrl) {
consola.debug(`HTTP proxy bypass: ${origin.hostname}`)
return (direct as unknown as Dispatcher).dispatch(options, handler)
}
let agent = proxies.get(proxyUrl)
if (!agent) {
agent = new ProxyAgent(proxyUrl)
proxies.set(proxyUrl, agent)
}
let label = proxyUrl
try {
const u = new URL(proxyUrl)
label = `${u.protocol}//${u.host}`
} catch {
/* noop */
}
consola.debug(`HTTP proxy route: ${origin.hostname} via ${label}`)
return (agent as unknown as Dispatcher).dispatch(options, handler)
} catch {
return (direct as unknown as Dispatcher).dispatch(options, handler)
}
},
close() {
return direct.close()
},
destroy() {
return direct.destroy()
},
}
setGlobalDispatcher(dispatcher as unknown as Dispatcher)
consola.debug("HTTP proxy configured from environment (per-URL)")
} catch (err) {
consola.debug("Proxy setup skipped:", err)
}
}
|