Perf: smaller local dns mapping

This commit is contained in:
SukkaW 2024-09-26 01:18:23 +08:00
parent 3bc4e69f35
commit 5f027572cf
5 changed files with 172 additions and 134 deletions

View File

@ -12,19 +12,28 @@ import { appendArrayInPlace } from './lib/append-array-in-place';
import { OUTPUT_INTERNAL_DIR, OUTPUT_MODULES_DIR, SOURCE_DIR } from './constants/dir'; import { OUTPUT_INTERNAL_DIR, OUTPUT_MODULES_DIR, SOURCE_DIR } from './constants/dir';
import { RulesetOutput } from './lib/create-file'; import { RulesetOutput } from './lib/create-file';
const getRule = (domain: string) => {
switch (domain[0]) {
case '+':
case '$':
return `DOMAIN-SUFFIX,${domain.slice(1)}`;
default:
return `DOMAIN-SUFFIX,${domain}`;
}
};
export const getDomesticAndDirectDomainsRulesetPromise = createMemoizedPromise(async () => { export const getDomesticAndDirectDomainsRulesetPromise = createMemoizedPromise(async () => {
const domestics = await readFileIntoProcessedArray(path.join(SOURCE_DIR, 'non_ip/domestic.conf')); const domestics = await readFileIntoProcessedArray(path.join(SOURCE_DIR, 'non_ip/domestic.conf'));
const directs = await readFileIntoProcessedArray(path.resolve(SOURCE_DIR, 'non_ip/direct.conf')); const directs = await readFileIntoProcessedArray(path.resolve(SOURCE_DIR, 'non_ip/direct.conf'));
const lans: string[] = []; const lans: string[] = [];
Object.entries(DOMESTICS).forEach(([, { domains }]) => { Object.entries(DOMESTICS).forEach(([, { domains }]) => {
appendArrayInPlace(domestics, domains.map((domain) => `DOMAIN-SUFFIX,${domain}`)); appendArrayInPlace(domestics, domains.map(getRule));
}); });
Object.entries(DIRECTS).forEach(([, { domains }]) => { Object.entries(DIRECTS).forEach(([, { domains }]) => {
appendArrayInPlace(directs, domains.map((domain) => `DOMAIN-SUFFIX,${domain}`)); appendArrayInPlace(directs, domains.map(getRule));
}); });
Object.entries(LANS).forEach(([, { domains }]) => { Object.entries(LANS).forEach(([, { domains }]) => {
appendArrayInPlace(lans, domains.map((domain) => `DOMAIN-SUFFIX,${domain}`)); appendArrayInPlace(lans, domains.map(getRule));
}); });
return [domestics, directs, lans] as const; return [domestics, directs, lans] as const;
@ -74,10 +83,22 @@ export const buildDomesticRuleset = task(require.main === module, __filename)(as
'[Host]', '[Host]',
...dataset.flatMap(([, { domains, dns, hosts }]) => [ ...dataset.flatMap(([, { domains, dns, hosts }]) => [
...Object.entries(hosts).flatMap(([dns, ips]: [dns: string, ips: string[]]) => `${dns} = ${ips.join(', ')}`), ...Object.entries(hosts).flatMap(([dns, ips]: [dns: string, ips: string[]]) => `${dns} = ${ips.join(', ')}`),
...domains.flatMap((domain) => [ ...domains.flatMap((domain) => {
`${domain} = server:${dns}`, if (domain[0] === '$') {
`*.${domain} = server:${dns}` return [
]) `${domain.slice(1)} = server:${dns}`
];
}
if (domain[0] === '+') {
return [
`*.${domain.slice(1)} = server:${dns}`
];
}
return [
`${domain} = server:${dns}`,
`*.${domain} = server:${dns}`
];
})
]) ])
], ],
path.resolve(OUTPUT_MODULES_DIR, 'sukka_local_dns_mapping.sgmodule') path.resolve(OUTPUT_MODULES_DIR, 'sukka_local_dns_mapping.sgmodule')
@ -90,7 +111,16 @@ export const buildDomesticRuleset = task(require.main === module, __filename)(as
'nameserver-policy': dataset.reduce<Record<string, string | string[]>>( 'nameserver-policy': dataset.reduce<Record<string, string | string[]>>(
(acc, [, { domains, dns }]) => { (acc, [, { domains, dns }]) => {
domains.forEach((domain) => { domains.forEach((domain) => {
acc[`+.${domain}`] = dns === 'system' let domainWildcard = domain;
if (domain[0] === '$') {
domainWildcard = domain.slice(1);
} else if (domain[0] === '+') {
domainWildcard = `*.${domain.slice(1)}`;
} else {
domainWildcard = `+.${domain}`;
}
acc[domainWildcard] = dns === 'system'
? [ ? [
'system://', 'system://',
'system', 'system',

View File

@ -92,7 +92,10 @@ const REDIRECT_MIRROR_307 = [
['google.cn/', 'https://google.com/'], ['google.cn/', 'https://google.com/'],
['www.google.cn/', 'https://www.google.com/'], ['www.google.cn/', 'https://www.google.com/'],
['g.cn/', 'https://google.com/'], ['g.cn/', 'https://google.com/'],
['www.g.cn/', 'https://www.google.com/'] ['www.g.cn/', 'https://www.google.com/'],
// avg.tv/sm114514 -> https://www.nicovideo.jp/watch/sm114514
['acg.tv/sm', 'https://www.nicovideo.jp/watch/sm'],
['acg.tv/', 'https://b23.tv/']
]; ];
const REDIRECT_FAKEWEBSITES = [ const REDIRECT_FAKEWEBSITES = [

View File

@ -392,8 +392,6 @@ export async function compareAndWriteFile(span: Span, linesA: string[], filePath
if (p) await p; if (p) await p;
} }
await asyncWriteToStream(writeStream, '\n');
writeStream.end(); writeStream.end();
}); });
} }

View File

@ -3,6 +3,13 @@ export interface DNSMapping {
[domain: string]: string[] [domain: string]: string[]
}, },
dns: string, dns: string,
/**
* domain[0]
*
* + subdomain only
* $ domain only exact match
* [none] domain and subdomain
*/
domains: string[] domains: string[]
} }
@ -35,8 +42,8 @@ export const DIRECTS = {
// ZTE CPE // ZTE CPE
'zte.home', 'zte.home',
// UniFi // UniFi
'ui.direct', '+ui.direct',
'unifi', '$unifi',
'amplifi.lan', 'amplifi.lan',
// Other Router // Other Router
'hiwifi.com', 'hiwifi.com',
@ -85,8 +92,8 @@ export const DIRECTS = {
// TailScale Magic DNS // TailScale Magic DNS
'ts.net', 'ts.net',
// AdGuard // AdGuard
'injections.adguard.org', '$injections.adguard.org',
'local.adguard.org' '$local.adguard.org'
] ]
} }
} satisfies Record<string, DNSMapping>; } satisfies Record<string, DNSMapping>;
@ -97,7 +104,7 @@ export const LANS = {
hosts: {}, hosts: {},
domains: [ domains: [
'lan', 'lan',
'localhost', '$localhost',
'localdomain', 'localdomain',
'home.arpa', 'home.arpa',
// AS112 // AS112

View File

@ -10,22 +10,22 @@ export const DOMESTICS = {
'uc.cn', 'uc.cn',
'ucweb.com', 'ucweb.com',
'alibaba.com', 'alibaba.com',
'alicdn.com', '+alicdn.com',
'ialicdn.com', '+ialicdn.com',
'myalicdn.com', '+myalicdn.com',
'alidns.com', '+alidns.com',
'aliimg.com', '+aliimg.com',
'aliyun.com', 'aliyun.com',
'aliyuncs.com', '+aliyuncs.com',
'alikunlun.com', '+alikunlun.com',
'alikunlun.net', '+alikunlun.net',
'cdngslb.com', '+cdngslb.com',
'alipay.com', 'alipay.com',
'alipay.cn', 'alipay.cn',
'alipay.com.cn', 'alipay.com.cn',
'alipayobjects.com', '+alipayobjects.com',
'alibaba-inc.com', 'alibaba-inc.com',
'alibabausercontent.com', '+alibabausercontent.com',
'alibabadns.com', 'alibabadns.com',
'alicloudccp.com', 'alicloudccp.com',
'alipan.com', 'alipan.com',
@ -46,18 +46,18 @@ export const DOMESTICS = {
'soku.com', 'soku.com',
'tb.cn', 'tb.cn',
'taobao.com', 'taobao.com',
'taobaocdn.com', '+taobaocdn.com',
'tbcache.com', '+tbcache.com',
'tmall.com', 'tmall.com',
'tmall.hk', 'tmall.hk',
'xiami.com', 'xiami.com',
'xiami.net', 'xiami.net',
'ykimg.com', '+ykimg.com',
'youku.com', 'youku.com',
'tudou.com', 'tudou.com',
'cibntv.net', '+cibntv.net',
'ele.me', 'ele.me',
'elemecdn.com', '+elemecdn.com',
'feizhu.com', 'feizhu.com',
'taopiaopiao.com', 'taopiaopiao.com',
'fliggy.com', 'fliggy.com',
@ -75,10 +75,11 @@ export const DOMESTICS = {
'npmmirror.com', 'npmmirror.com',
'alios.cn', 'alios.cn',
'wandoujia.com', 'wandoujia.com',
'aliapp.org', '+aliapp.org',
'tanx.com', 'tanx.com',
'hellobike.com', 'hellobike.com',
'hichina.com' '+hichina.com',
'+yunos.com'
] ]
}, },
TENCENT: { TENCENT: {
@ -91,25 +92,25 @@ export const DOMESTICS = {
domains: [ domains: [
'dns.pub', 'dns.pub',
'doh.pub', 'doh.pub',
'qcloud.com', '+qcloud.com',
'gtimg.cn', '+gtimg.cn',
'gtimg.com', '+gtimg.com',
'gtimg.com.cn', '+gtimg.com.cn',
'gdtimg.com', '+gdtimg.com',
'idqqimg.com', '+idqqimg.com',
'igamecj.com', 'igamecj.com',
'myapp.com', 'myapp.com',
'myqcloud.com', '+myqcloud.com',
'dnspod.com', 'dnspod.com',
'qpic.cn', '+qpic.cn',
'qlogo.cn', '+qlogo.cn',
'qq.com', 'qq.com',
'qq.com.cn', 'qq.com.cn',
'qq.wang', 'qq.wang',
'qqmail.cn', 'qqmail.cn',
'qqmail.com', 'qqmail.com',
'qzone.com', 'qzone.com',
'tencent-cloud.net', '+tencent-cloud.net',
'tencent.com', 'tencent.com',
'tencent.com.cn', 'tencent.com.cn',
'tencentmusic.com', 'tencentmusic.com',
@ -120,60 +121,58 @@ export const DOMESTICS = {
'soso.com', 'soso.com',
'sogo.com', 'sogo.com',
'sogou.com', 'sogou.com',
'sogoucdn.com', '+sogoucdn.com',
'roblox.cn', 'roblox.cn',
'robloxdev.cn', 'robloxdev.cn',
'wegame.com', 'wegame.com',
'wegame.com.cn', 'wegame.com.cn',
'wegameplus.com', 'wegameplus.com',
'cdn-go.cn', 'cdn-go.cn',
'tencentcs.cn', '+tencentcs.cn',
'tencent-coud.cn', '+qcloudimg.com',
'qcloudimg.com',
'dnspod.cn', 'dnspod.cn',
'yunos.com',
'yitao.com', 'yitao.com',
'anticheatexpert.com', 'anticheatexpert.com',
'url.cn', '$url.cn',
'qlivecdn.com', '+qlivecdn.com',
'tcdnlive.com', '+tcdnlive.com',
'dnsv1.com' '+dnsv1.com'
] ]
}, },
BILIBILI_ALI: { BILIBILI_ALI: {
dns: 'quic://dns.alidns.com:853', dns: 'quic://dns.alidns.com:853',
hosts: {}, hosts: {},
domains: [ domains: [
'upos-sz-mirrorali.bilivideo.com', '$upos-sz-mirrorali.bilivideo.com',
'upos-sz-estgoss.bilivideo.com' '$upos-sz-estgoss.bilivideo.com'
] ]
}, },
BILIBILI_BD: { BILIBILI_BD: {
dns: '180.76.76.76', dns: '180.76.76.76',
hosts: {}, hosts: {},
domains: [ domains: [
'upos-sz-mirrorbd.bilivideo.com', '$upos-sz-mirrorbd.bilivideo.com',
'upos-sz-mirrorbos.bilivideo.com' '$upos-sz-mirrorbos.bilivideo.com'
] ]
}, },
BILIBILI: { BILIBILI: {
dns: 'https://doh.pub/dns-query', dns: 'https://doh.pub/dns-query',
hosts: {}, hosts: {},
domains: [ domains: [
'upos-sz-mirrorcoso1.bilivideo.com', '$upos-sz-mirrorcoso1.bilivideo.com',
'acg.tv', '$acg.tv',
'b23.tv', '$b23.tv',
'acgvideo.com',
'bilibili.cn', 'bilibili.cn',
'bilibili.com', 'bilibili.com',
'bilibili.tv', // 'bilibili.tv',
'bilivideo.com', '+acgvideo.com',
'bilivideo.cn', '+bilivideo.com',
'bilivideo.net', '+bilivideo.cn',
'hdslb.com', '+bilivideo.net',
'biliimg.com', '+hdslb.com',
'biliapi.com', '+biliimg.com',
'biliapi.net', '+biliapi.com',
'+biliapi.net',
'biligame.cn', 'biligame.cn',
'biligame.com', 'biligame.com',
'biligame.net', 'biligame.net',
@ -181,7 +180,7 @@ export const DOMESTICS = {
'bilicomics.com', 'bilicomics.com',
'bilibilipay.cn', 'bilibilipay.cn',
'bilibilipay.com', 'bilibilipay.com',
'bilicdn1.com' '+bilicdn1.com'
] ]
}, },
XIAOMI: { XIAOMI: {
@ -190,7 +189,7 @@ export const DOMESTICS = {
domains: [ domains: [
'mi.com', 'mi.com',
'duokan.com', 'duokan.com',
'mi-img.com', '+mi-img.com',
'mi-fds.com', 'mi-fds.com',
'mifile.cn', 'mifile.cn',
'miui.com', 'miui.com',
@ -207,44 +206,45 @@ export const DOMESTICS = {
dns: '180.184.2.2', dns: '180.184.2.2',
hosts: {}, hosts: {},
domains: [ domains: [
'bytecdn.cn', '+bytecdn.cn',
'toutiaoimg.com', '+toutiaoimg.com',
'toutiaoimg.cn', '+toutiaoimg.cn',
'toutiaostatic.com', '+toutiaostatic.com',
'toutiaovod.com', '+toutiaovod.com',
'toutiaocloud.com', '+toutiaocloud.com',
'toutiaopage.com', 'toutiaopage.com',
'feiliao.com', 'feiliao.com',
'iesdouyin.com', 'iesdouyin.com',
'pstatp.com', '+pstatp.com',
'snssdk.com', 'snssdk.com',
'bytegoofy.com', '+bytegoofy.com',
'toutiao.com', 'toutiao.com',
'feishu.cn', 'feishu.cn',
'feishu.net', 'feishu.net',
'feishucdn.com', '+feishucdn.com',
'feishupkg.com', '+feishupkg.com',
'douyin.com', 'douyin.com',
'douyinpic.com', '+douyinpic.com',
'douyinstatic.com', '+douyinstatic.com',
'douyincdn.com', '+douyincdn.com',
'douyinliving.com', '+douyinliving.com',
'douyinvod.com', '+douyinvod.com',
'huoshan.com', 'huoshan.com',
'huoshanstatic.com', '+huoshanstatic.com',
'huoshanzhibo.com', 'huoshanzhibo.com',
'ixigua.com', 'ixigua.com',
'ixiguavideo.com', '+ixiguavideo.com',
'ixgvideo.com', '+ixgvideo.com',
'volccdn.com', '+volccdn.com',
'byted-static.com', '+byted-static.com',
'volces.com', 'volces.com',
'baike.com', 'baike.com',
'zjcdn.com', '+zjcdn.com',
'zijieapi.com', '+zijieapi.com',
'feelgood.cn', 'feelgood.cn',
'bytetcc.com', // Use hichina.com as NS '+bytetcc.com', // Use hichina.com as NS
'bytednsdoc.com' // Uses alidns.com as NS '+bytednsdoc.com', // Uses alidns.com as NS
'+byteimg.com' // Uses alidns.com as NS
] ]
}, },
BAIDU: { BAIDU: {
@ -256,25 +256,25 @@ export const DOMESTICS = {
'baidu.cn', 'baidu.cn',
'baidu.com', 'baidu.com',
'iqiyi.com', 'iqiyi.com',
'iqiyipic.com', '+iqiyipic.com',
'baidubce.com', '+baidubce.com',
'bcelive.com', '+bcelive.com',
'baiducontent.com', '+baiducontent.com',
'baidustatic.com', '+baidustatic.com',
'bdstatic.com', '+bdstatic.com',
'bdimg.com', '+bdimg.com',
'bcebos.com', '+bcebos.com',
'baidupcs.com', '+baidupcs.com',
'baidubcr.com', '+baidubcr.com',
'yunjiasu-cdn.net', '+yunjiasu-cdn.net',
'tieba.com', 'tieba.com',
'xiaodutv.com', 'xiaodutv.com',
'shifen.com', 'shifen.com',
'jomodns.com', '+jomodns.com',
'bdydns.com', '+bdydns.com',
'jomoxc.com', '+jomoxc.com',
'duapp.com', '+duapp.com',
'antpcdn.com' // Baidu PCDN '+antpcdn.com' // Baidu PCDN
] ]
}, },
QIHOO360: { QIHOO360: {
@ -288,40 +288,40 @@ export const DOMESTICS = {
}, },
dns: 'https://dns.360.net/dns-query', dns: 'https://dns.360.net/dns-query',
domains: [ domains: [
'qhimg.com', '+qhimg.com',
'qhimgs0.com', '+qhimgs0.com',
'qhimgs1.com', '+qhimgs1.com',
'qhimgs2.com', '+qhimgs2.com',
'qhimgs3.com', '+qhimgs3.com',
'qhimgs4.com', '+qhimgs4.com',
'qhimgs5.com', '+qhimgs5.com',
'qhimgs6.com', '+qhimgs6.com',
'qhres.com', '+qhres.com',
'qhres0.com', '+qhres0.com',
'qhres1.com', '+qhres1.com',
'qhres2.com', '+qhres2.com',
'qhres3.com', '+qhres3.com',
'qhres4.com', '+qhres4.com',
'qhres5.com', '+qhres5.com',
'qhres6.com', '+qhres6.com',
'qhmsg.com', '+qhmsg.com',
'qhstatic.com', '+qhstatic.com',
'qhupdate.com', '+qhupdate.com',
'qihucdn.com', '+qihucdn.com',
'360.com', '360.com',
'360.cn', '360.cn',
'360.net', '360.net',
'360safe.com', '360safe.com',
'360tpcdn.com', '+360tpcdn.com',
'360os.com', '360os.com',
'360webcache.com', '+360webcache.com',
'360kuai.com', '360kuai.com',
'so.com', 'so.com',
'haosou.com', 'haosou.com',
'yunpan.cn', 'yunpan.cn',
'yunpan.com', 'yunpan.com',
'yunpan.com.cn', 'yunpan.com.cn',
'qh-cdn.com', '+qh-cdn.com',
'baomitu.com' 'baomitu.com'
] ]
} }