70 lines
1.7 KiB
JavaScript
70 lines
1.7 KiB
JavaScript
const LRU = require('lru-cache')
|
|
// const { isIP } = require('validator')
|
|
const log = require('../../utils/util.log')
|
|
const { DynamicChoice } = require('../choice/index')
|
|
const cacheSize = 1024
|
|
// eslint-disable-next-line no-unused-vars
|
|
// function _isIP (v) {
|
|
// return v && isIP(v)
|
|
// }
|
|
|
|
class IpCache extends DynamicChoice {
|
|
constructor (hostname) {
|
|
super(hostname)
|
|
this.lookupCount = 0
|
|
}
|
|
|
|
/**
|
|
* 获取到新的ipList
|
|
* @param ipList
|
|
*/
|
|
setBackupList (ipList) {
|
|
super.setBackupList(ipList)
|
|
this.lookupCount++
|
|
}
|
|
}
|
|
|
|
module.exports = class BaseDNS {
|
|
constructor () {
|
|
this.cache = new LRU(cacheSize)
|
|
}
|
|
|
|
count (hostname, ip, isError = true) {
|
|
const ipCache = this.cache.get(hostname)
|
|
if (ipCache) {
|
|
ipCache.doCount(ip, isError)
|
|
}
|
|
}
|
|
|
|
async lookup (hostname) {
|
|
try {
|
|
let ipCache = this.cache.get(hostname)
|
|
if (ipCache) {
|
|
if (ipCache.value != null) {
|
|
ipCache.doCount(ipCache.value, false)
|
|
return ipCache.value
|
|
}
|
|
} else {
|
|
ipCache = new IpCache(hostname)
|
|
this.cache.set(hostname, ipCache)
|
|
}
|
|
|
|
const t = new Date()
|
|
let ipList = await this._lookup(hostname)
|
|
if (ipList == null) {
|
|
// 没有获取到ipv4地址
|
|
ipList = []
|
|
}
|
|
ipList.push(hostname) // 把原域名加入到统计里去
|
|
|
|
ipCache.setBackupList(ipList)
|
|
log.info(`[DNS]: ${hostname} ➜ ${ipCache.value} (${new Date() - t} ms), ipList: ${JSON.stringify(ipList)}, ipCache:`, JSON.stringify(ipCache))
|
|
|
|
return ipCache.value
|
|
} catch (error) {
|
|
log.error(`[DNS] cannot resolve hostname ${hostname} (${error})`, error)
|
|
return hostname
|
|
}
|
|
}
|
|
}
|