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
| 'use strict'
|
| const { LRUCache } = require('lru-cache')
| const { normalizeOptions, cacheOptions } = require('./options')
| const { getProxy, proxyCache } = require('./proxy.js')
| const dns = require('./dns.js')
| const Agent = require('./agents.js')
|
| const agentCache = new LRUCache({ max: 20 })
|
| const getAgent = (url, { agent, proxy, noProxy, ...options } = {}) => {
| // false has meaning so this can't be a simple truthiness check
| if (agent != null) {
| return agent
| }
|
| url = new URL(url)
|
| const proxyForUrl = getProxy(url, { proxy, noProxy })
| const normalizedOptions = {
| ...normalizeOptions(options),
| proxy: proxyForUrl,
| }
|
| const cacheKey = cacheOptions({
| ...normalizedOptions,
| secureEndpoint: url.protocol === 'https:',
| })
|
| if (agentCache.has(cacheKey)) {
| return agentCache.get(cacheKey)
| }
|
| const newAgent = new Agent(normalizedOptions)
| agentCache.set(cacheKey, newAgent)
|
| return newAgent
| }
|
| module.exports = {
| getAgent,
| Agent,
| // these are exported for backwards compatability
| HttpAgent: Agent,
| HttpsAgent: Agent,
| cache: {
| proxy: proxyCache,
| agent: agentCache,
| dns: dns.cache,
| clear: () => {
| proxyCache.clear()
| agentCache.clear()
| dns.cache.clear()
| },
| },
| }
|
|