From 4e915e8b9997c5dd6e5a138b4af359fea37a42d5 Mon Sep 17 00:00:00 2001 From: SukkaW Date: Tue, 19 Dec 2023 13:04:21 +0800 Subject: [PATCH] Chore: auto build `microsoft_cdn` --- Build/build-internal-chn-domains.ts | 21 ---------- Build/build-microsoft-cdn.ts | 60 +++++++++++++++++++++++++++ Build/lib/get-gorhill-publicsuffix.ts | 8 +--- README.md | 3 +- Source/non_ip/microsoft_cdn.conf | 18 -------- 5 files changed, 64 insertions(+), 46 deletions(-) delete mode 100644 Build/build-internal-chn-domains.ts create mode 100644 Build/build-microsoft-cdn.ts delete mode 100644 Source/non_ip/microsoft_cdn.conf diff --git a/Build/build-internal-chn-domains.ts b/Build/build-internal-chn-domains.ts deleted file mode 100644 index 1bc1aaa03..000000000 --- a/Build/build-internal-chn-domains.ts +++ /dev/null @@ -1,21 +0,0 @@ -import path from 'path'; -import fsp from 'fs/promises'; -import { parseFelixDnsmasq } from './lib/parse-dnsmasq'; -import { task } from './lib/trace-runner'; -import { compareAndWriteFile } from './lib/create-file'; - -export const buildInternalChnDomains = task(import.meta.path, async () => { - const result = (await Promise.all([ - parseFelixDnsmasq('https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf'), - fsp.mkdir(path.resolve(import.meta.dir, '../List/internal'), { recursive: true }) - ]))[0]; - - return compareAndWriteFile( - result.map(line => `SUFFIX,${line}`), - path.resolve(import.meta.dir, '../List/internal/accelerated-china-domains.txt') - ); -}); - -if (import.meta.main) { - buildInternalChnDomains(); -} diff --git a/Build/build-microsoft-cdn.ts b/Build/build-microsoft-cdn.ts new file mode 100644 index 000000000..1f3124980 --- /dev/null +++ b/Build/build-microsoft-cdn.ts @@ -0,0 +1,60 @@ +import path from 'path'; +import { task, traceAsync } from './lib/trace-runner'; +import { createRuleset } from './lib/create-file'; +import { fetchRemoteTextAndReadByLine } from './lib/fetch-text-by-line'; +import { createTrie } from './lib/trie'; +import { SHARED_DESCRIPTION } from './lib/constants'; + +const WHITELIST = [ + 'DOMAIN-SUFFIX,download.prss.microsoft.com', + 'DOMAIN,res.cdn.office.net' +]; + +const BLACKLIST = [ + 'www.microsoft.com', + 'learn.microsoft.com', + 'devblogs.microsoft.com', + 'docs.microsoft.com', + 'developer.microsoft.com' +]; + +export const buildMicrosoftCdn = task(import.meta.path, async () => { + const set = await traceAsync('fetch accelerated-domains.china.conf', async () => { + const trie = createTrie(); + for await (const line of await fetchRemoteTextAndReadByLine('https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf')) { + if (line.startsWith('server=/') && line.endsWith('/114.114.114.114')) { + const domain = line.slice(8, -16); + trie.add(domain); + } + } + return new Set(['.microsoft.com', '.windows.net', '.windows.com', '.windowsupdate.com', '.windowssearch.com', '.office.net'].flatMap(domain => trie.find(domain, false))); + }); + + const trie2 = createTrie(set); + BLACKLIST.flatMap(domain => trie2.find(domain, true)).forEach(d => set.delete(d)); + + const description = [ + ...SHARED_DESCRIPTION, + '', + 'This file contains Microsoft\'s domains using their China mainland CDN servers.', + '', + 'Data from:', + ' - https://github.com/felixonmars/dnsmasq-china-list' + ]; + + const ruleset = Array.from(set).map(d => `DOMAIN-SUFFIX,${d}`).concat(WHITELIST); + + return Promise.all(createRuleset( + 'Sukka\'s Ruleset - Microsoft CDN', + description, + new Date(), + ruleset, + 'ruleset', + path.resolve(import.meta.dir, '../List/non_ip/microsoft_cdn.conf'), + path.resolve(import.meta.dir, '../Clash/non_ip/microsoft_cdn.txt') + )); +}); + +if (import.meta.main) { + buildMicrosoftCdn(); +} diff --git a/Build/lib/get-gorhill-publicsuffix.ts b/Build/lib/get-gorhill-publicsuffix.ts index df010aa98..62c28978d 100644 --- a/Build/lib/get-gorhill-publicsuffix.ts +++ b/Build/lib/get-gorhill-publicsuffix.ts @@ -2,7 +2,7 @@ import { toASCII } from 'punycode'; import path from 'path'; import { traceAsync } from './trace-runner'; import { defaultRequestInit, fetchWithRetry } from './fetch-retry'; -import type { PublicSuffixList } from '@gorhill/publicsuffixlist'; +import { createMemoizedPromise } from './memo-promise'; const publicSuffixPath = path.resolve(import.meta.dir, '../../node_modules/.cache/public_suffix_list_dat.txt'); @@ -27,8 +27,4 @@ const getGorhillPublicSuffix = () => traceAsync('create gorhill public suffix in return gorhill; }); -let gorhillPublicSuffixPromise: Promise | null = null; -export const getGorhillPublicSuffixPromise = () => { - gorhillPublicSuffixPromise ||= getGorhillPublicSuffix(); - return gorhillPublicSuffixPromise; -}; +export const getGorhillPublicSuffixPromise = createMemoizedPromise(getGorhillPublicSuffix); diff --git a/README.md b/README.md index e55f49f1d..6f7b79e7c 100644 --- a/README.md +++ b/README.md @@ -384,8 +384,9 @@ rules: #### Microsoft CDN -- 人工维护 +- 自动生成 - 规则组包含 Microsoft 在中华人民共和国完成工信部 ICP 备案和公安网备、且在中华人民共和国境内提供 HTTP 服务的域名,如果由于某些原因需要代理其中部分域名,请自行针对域名编写规则、并添加到当前规则组之前。 +- 数据来源 [`felixonmars/dnsmasq-china-list`](https://github.com/felixonmars/dnsmasq-china-list/blob/master/apple.china.conf) **Surge** diff --git a/Source/non_ip/microsoft_cdn.conf b/Source/non_ip/microsoft_cdn.conf deleted file mode 100644 index fdbd1a290..000000000 --- a/Source/non_ip/microsoft_cdn.conf +++ /dev/null @@ -1,18 +0,0 @@ -# $ meta_title Sukka's Ruleset - Microsoft Domains -# $ meta_description This file contains domains of Microsoft that have PoP inside the Mainland China. - -DOMAIN-SUFFIX,dl.delivery.mp.microsoft.com -DOMAIN-SUFFIX,download.windowsupdate.com -DOMAIN-SUFFIX,download.prss.microsoft.com -DOMAIN,res.cdn.office.net -DOMAIN,build.microsoft.com -DOMAIN,cn.windowssearch.com -DOMAIN,ctldl.windowsupdate.com -DOMAIN,download.microsoft.com -DOMAIN,download.visualstudio.microsoft.com -DOMAIN,fs.microsoft.com -DOMAIN,officecdn.microsoft.com -DOMAIN,sdx.microsoft.com -DOMAIN,storeedgefd.dsx.mp.microsoft.com -DOMAIN,wscont1.apps.microsoft.com -DOMAIN,wscont2.apps.microsoft.com