Spaces:
Running
Running
const dns = require('./dns') | |
const normalizeOptions = (opts) => { | |
const family = parseInt(opts.family ?? '0', 10) | |
const keepAlive = opts.keepAlive ?? true | |
const normalized = { | |
// nodejs http agent options. these are all the defaults | |
// but kept here to increase the likelihood of cache hits | |
// https://nodejs.org/api/http.html#new-agentoptions | |
keepAliveMsecs: keepAlive ? 1000 : undefined, | |
maxSockets: opts.maxSockets ?? 15, | |
maxTotalSockets: Infinity, | |
maxFreeSockets: keepAlive ? 256 : undefined, | |
scheduling: 'fifo', | |
// then spread the rest of the options | |
...opts, | |
// we already set these to their defaults that we want | |
family, | |
keepAlive, | |
// our custom timeout options | |
timeouts: { | |
// the standard timeout option is mapped to our idle timeout | |
// and then deleted below | |
idle: opts.timeout ?? 0, | |
connection: 0, | |
response: 0, | |
transfer: 0, | |
...opts.timeouts, | |
}, | |
// get the dns options that go at the top level of socket connection | |
...dns.getOptions({ family, ...opts.dns }), | |
} | |
// remove timeout since we already used it to set our own idle timeout | |
delete normalized.timeout | |
return normalized | |
} | |
const createKey = (obj) => { | |
let key = '' | |
const sorted = Object.entries(obj).sort((a, b) => a[0] - b[0]) | |
for (let [k, v] of sorted) { | |
if (v == null) { | |
v = 'null' | |
} else if (v instanceof URL) { | |
v = v.toString() | |
} else if (typeof v === 'object') { | |
v = createKey(v) | |
} | |
key += `${k}:${v}:` | |
} | |
return key | |
} | |
const cacheOptions = ({ secureEndpoint, ...options }) => createKey({ | |
secureEndpoint: !!secureEndpoint, | |
// socket connect options | |
family: options.family, | |
hints: options.hints, | |
localAddress: options.localAddress, | |
// tls specific connect options | |
strictSsl: secureEndpoint ? !!options.rejectUnauthorized : false, | |
ca: secureEndpoint ? options.ca : null, | |
cert: secureEndpoint ? options.cert : null, | |
key: secureEndpoint ? options.key : null, | |
// http agent options | |
keepAlive: options.keepAlive, | |
keepAliveMsecs: options.keepAliveMsecs, | |
maxSockets: options.maxSockets, | |
maxTotalSockets: options.maxTotalSockets, | |
maxFreeSockets: options.maxFreeSockets, | |
scheduling: options.scheduling, | |
// timeout options | |
timeouts: options.timeouts, | |
// proxy | |
proxy: options.proxy, | |
}) | |
module.exports = { | |
normalizeOptions, | |
cacheOptions, | |
} | |