Commit 62aef8a2 authored by nanahira's avatar nanahira

fix domain resolve duplicate

parent fd9d712a
......@@ -3,9 +3,8 @@
"version": "1.0.0",
"description": "",
"scripts": {
"build": "tsc",
"start": "node build/inventory.js",
"all": "npm run build && npm start"
"start": "ts-node src/inventory.ts",
"all": "npm start"
},
"dependencies": {
"@types/ip": "^1.1.0",
......
......@@ -12,7 +12,6 @@ set -e
#cd ..
mkdir -p result
npm run build
npm start
......
......@@ -74,10 +74,10 @@ class InventoryBuilder {
}
}
async resolveDomain(domain: string, ipv6: boolean) {
if (!domain || domain.match(/(\d{1,3}\.){3}\d{1,3}/)) {
return domain;
}
domainResolveFunctions = new Map<string, ((result: string) => void)[]>();
async resolveDomainProcess(domain: string, ipv6: boolean) {
const cacheKey = `${domain}-${ipv6 ? ':v6' : 'v4'}`;
if (this.resolveCache.has(domain)) {
return this.resolveCache.get(domain);
}
......@@ -99,6 +99,30 @@ class InventoryBuilder {
return resolvedIP;
}
async resolveDomain(domain: string, ipv6: boolean) {
if (!domain || domain.match(/(\d{1,3}\.){3}\d{1,3}/)) {
return domain;
}
return new Promise<string>(async(resolve) => {
const cacheKey = `${domain}-${ipv6 ? ':v6' : ':v4'}`;
if (this.resolveCache.has(cacheKey)) {
resolve(this.resolveCache.get(cacheKey));
} else {
let resolveFunctions = this.domainResolveFunctions.get(cacheKey);
if (!resolveFunctions) {
resolveFunctions = [];
this.domainResolveFunctions.set(cacheKey, resolveFunctions);
const result = await this.resolveDomainProcess(domain, ipv6);
resolve(result);
resolveFunctions.forEach(f => f(result));
this.domainResolveFunctions.delete(cacheKey);
} else {
resolveFunctions.push(resolve);
}
}
})
}
async load(sheetName: string): Promise<Record<string, any>[]> {
const data = await fs.promises.readFile(path.join('data', `内网互联计划 - ${sheetName}.csv`));
// @ts-ignore
......@@ -422,7 +446,7 @@ class InventoryBuilder {
if (!localGateway.ipv6 && !remoteGateway.ipv4 && remoteGateway.ipv6) {
remoteAddress = null;
}
const resolvedRemoteAddress = remoteAddress ? await this.resolveDomain(remoteAddress, !remoteGateway.ipv4 && remoteGateway.ipv6) : null;
const resolvedRemoteAddress = remoteAddress ? await this.resolveDomain(remoteAddress, (!remoteGateway.ipv4 || localGateway.ipv6) && remoteGateway.ipv6) : null;
const remoteLocalAddress = remote.address;
const remoteNextMark = remote.nextMark;
const remoteDestMark = remote.destMark;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment