Browse Source

Perf: smaller local dns mapping

SukkaW 1 year ago
parent
commit
5f027572cf

+ 38 - 8
Build/build-domestic-direct-lan-ruleset-dns-mapping-module.ts

@@ -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 { 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 () => {
   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 lans: string[] = [];
 
   Object.entries(DOMESTICS).forEach(([, { domains }]) => {
-    appendArrayInPlace(domestics, domains.map((domain) => `DOMAIN-SUFFIX,${domain}`));
+    appendArrayInPlace(domestics, domains.map(getRule));
   });
   Object.entries(DIRECTS).forEach(([, { domains }]) => {
-    appendArrayInPlace(directs, domains.map((domain) => `DOMAIN-SUFFIX,${domain}`));
+    appendArrayInPlace(directs, domains.map(getRule));
   });
   Object.entries(LANS).forEach(([, { domains }]) => {
-    appendArrayInPlace(lans, domains.map((domain) => `DOMAIN-SUFFIX,${domain}`));
+    appendArrayInPlace(lans, domains.map(getRule));
   });
 
   return [domestics, directs, lans] as const;
@@ -74,10 +83,22 @@ export const buildDomesticRuleset = task(require.main === module, __filename)(as
         '[Host]',
         ...dataset.flatMap(([, { domains, dns, hosts }]) => [
           ...Object.entries(hosts).flatMap(([dns, ips]: [dns: string, ips: string[]]) => `${dns} = ${ips.join(', ')}`),
-          ...domains.flatMap((domain) => [
-            `${domain} = server:${dns}`,
-            `*.${domain} = server:${dns}`
-          ])
+          ...domains.flatMap((domain) => {
+            if (domain[0] === '$') {
+              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')
@@ -90,7 +111,16 @@ export const buildDomesticRuleset = task(require.main === module, __filename)(as
             'nameserver-policy': dataset.reduce<Record<string, string | string[]>>(
               (acc, [, { domains, dns }]) => {
                 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',

+ 4 - 1
Build/build-sgmodule-redirect.ts

@@ -92,7 +92,10 @@ const REDIRECT_MIRROR_307 = [
   ['google.cn/', 'https://google.com/'],
   ['www.google.cn/', 'https://www.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 = [

+ 0 - 2
Build/lib/rules/base.ts

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

+ 12 - 5
Source/non_ip/direct.ts

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

+ 118 - 118
Source/non_ip/domestic.ts

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