-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproxy-resolve.ts
66 lines (59 loc) · 2.33 KB
/
proxy-resolve.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import dns, { DnsAnswer, DnsResponse, Packet, PacketQuestion } from 'dns2';
import cloudflare from 'cloudflare';
export function getProxyResolver(servers: string[]): ProxyResolver {
const dnsClient = new dns({
nameServers: servers,
});
return {
async resolveProxyRecord(record: cloudflare.DnsRecord): Promise<cloudflare.DnsRecord[] | undefined> {
const type = record.type;
let resolver: ((domain: string) => Promise<DnsAnswer[]>) | undefined = undefined;
let name: string = '';
switch (type) {
case 'A':
name = record.name;
resolver = async (domain: string) => {
const r = await dnsClient.resolveA(domain);
return r.answers;
};
break;
case 'AAAA':
name = record.name;
resolver = async (domain: string) => {
const r = await dnsClient.resolveAAAA(domain);
return r.answers;
};
break;
case 'CNAME':
name = record.name;
resolver = async (domain: string) => {
const r = await dnsClient.resolveA(domain);
const r2 = await dnsClient.resolveAAAA(domain);
return [...r.answers, ...r2.answers];
};
break;
default:
}
if (resolver) {
const r = await resolver(name);
if (r) {
return r.map(x => {
return {
...record,
type: (x.type === Packet.TYPE.A ? 'A' : 'AAAA'),
content: x.address!,
} as cloudflare.DnsRecord;
});
}
}
return undefined;
},
async query(domain: string, type: PacketQuestion) {
return dnsClient.query(domain, type);
},
};
}
export interface ProxyResolver {
resolveProxyRecord(r: cloudflare.DnsRecord): Promise<cloudflare.DnsRecord[] | undefined>;
query(domain: string, type: PacketQuestion): Promise<DnsResponse>;
}