forked from ericc-ch/copilot-api
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathproxy.ts
More file actions
66 lines (62 loc) · 2.21 KB
/
proxy.ts
File metadata and controls
66 lines (62 loc) · 2.21 KB
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
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)
}
}