Spaces:
Running
Running
const { LRUCache } = require('lru-cache') | |
const dns = require('dns') | |
// this is a factory so that each request can have its own opts (i.e. ttl) | |
// while still sharing the cache across all requests | |
const cache = new LRUCache({ max: 50 }) | |
const getOptions = ({ | |
family = 0, | |
hints = dns.ADDRCONFIG, | |
all = false, | |
verbatim = undefined, | |
ttl = 5 * 60 * 1000, | |
lookup = dns.lookup, | |
}) => ({ | |
// hints and lookup are returned since both are top level properties to (net|tls).connect | |
hints, | |
lookup: (hostname, ...args) => { | |
const callback = args.pop() // callback is always last arg | |
const lookupOptions = args[0] ?? {} | |
const options = { | |
family, | |
hints, | |
all, | |
verbatim, | |
...(typeof lookupOptions === 'number' ? { family: lookupOptions } : lookupOptions), | |
} | |
const key = JSON.stringify({ hostname, ...options }) | |
if (cache.has(key)) { | |
const cached = cache.get(key) | |
return process.nextTick(callback, null, ...cached) | |
} | |
lookup(hostname, options, (err, ...result) => { | |
if (err) { | |
return callback(err) | |
} | |
cache.set(key, result, { ttl }) | |
return callback(null, ...result) | |
}) | |
}, | |
}) | |
module.exports = { | |
cache, | |
getOptions, | |
} | |