codekingpro/portable-devtools
114k
1'use strict'
2
3const { LRUCache } = require('lru-cache')
4const { normalizeOptions, cacheOptions } = require('./options')
5const { getProxy, proxyCache } = require('./proxy.js')
6const dns = require('./dns.js')
7const Agent = require('./agents.js')
8
9const agentCache = new LRUCache({ max: 20 })
10
11const getAgent = (url, { agent, proxy, noProxy, ...options } = {}) => {
12 // false has meaning so this can't be a simple truthiness check
13 if (agent != null) {
14 return agent
15 }
16
17 url = new URL(url)
18
19 const proxyForUrl = getProxy(url, { proxy, noProxy })
20 const normalizedOptions = {
21 ...normalizeOptions(options),
22 proxy: proxyForUrl,
23 }
24
25 const cacheKey = cacheOptions({
26 ...normalizedOptions,
27 secureEndpoint: url.protocol === 'https:',
28 })
29
30 if (agentCache.has(cacheKey)) {
31 return agentCache.get(cacheKey)
32 }
33
34 const newAgent = new Agent(normalizedOptions)
35 agentCache.set(cacheKey, newAgent)
36
37 return newAgent
38}
39
40module.exports = {
41 getAgent,
42 Agent,
43 // these are exported for backwards compatability
44 HttpAgent: Agent,
45 HttpsAgent: Agent,
46 cache: {
47 proxy: proxyCache,
48 agent: agentCache,
49 dns: dns.cache,
50 clear: () => {
51 proxyCache.clear()
52 agentCache.clear()
53 dns.cache.clear()
54 },
55 },
56}
57 