diff --git a/Build/build-apple-cdn.ts b/Build/build-apple-cdn.ts index fa1f6bbb..e1081170 100644 --- a/Build/build-apple-cdn.ts +++ b/Build/build-apple-cdn.ts @@ -1,14 +1,13 @@ import { parseFelixDnsmasqFromResp } from './lib/parse-dnsmasq'; import { task } from './trace'; import { SHARED_DESCRIPTION } from './constants/description'; -import { once } from 'foxts/once'; import { DomainsetOutput } from './lib/rules/domainset'; import { $$fetch } from './lib/fetch-retry'; -export const getAppleCdnDomainsPromise = once(() => $$fetch('https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/apple.china.conf').then(parseFelixDnsmasqFromResp)); +const getAppleCdnDomainsPromise = $$fetch('https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/apple.china.conf').then(parseFelixDnsmasqFromResp); export const buildAppleCdn = task(require.main === module, __filename)(async (span) => { - const res: string[] = await span.traceChildPromise('get apple cdn domains', getAppleCdnDomainsPromise()); + const res: string[] = await span.traceChildPromise('get apple cdn domains', getAppleCdnDomainsPromise); return new DomainsetOutput(span, 'apple_cdn') .withTitle('Sukka\'s Ruleset - Apple CDN') diff --git a/Build/build-cdn-download-conf.ts b/Build/build-cdn-download-conf.ts index 1542afd6..14f2d6cd 100644 --- a/Build/build-cdn-download-conf.ts +++ b/Build/build-cdn-download-conf.ts @@ -92,7 +92,7 @@ export const buildCdnDownloadConf = task(require.main === module, __filename)(as span.traceChildAsync( 'load public ipfs gateway list', async () => { - const data = await (await $$fetch('https://cdn.jsdelivr.net/gh/ipfs/public-gateway-checker@refs/heads/main/gateways.json')).json(); + const data = await (await $$fetch('https://cdn.jsdelivr.net/gh/ipfs/public-gateway-checker@main/gateways.json')).json(); if (!Array.isArray(data)) { console.error('Invalid IPFS gateway list format'); return []; diff --git a/Build/build-chn-cidr.ts b/Build/build-chn-cidr.ts index 59534701..808927dc 100644 --- a/Build/build-chn-cidr.ts +++ b/Build/build-chn-cidr.ts @@ -1,19 +1,16 @@ import { fetchRemoteTextByLine } from './lib/fetch-text-by-line'; import { task } from './trace'; -import { once } from 'foxts/once'; import { IPListOutput } from './lib/rules/ip'; import { createFileDescription } from './constants/description'; -export const getChnCidrPromise = once(async function getChnCidr() { - return Promise.all([ - fetchRemoteTextByLine('https://chnroutes2.cdn.skk.moe/chnroutes.txt', true).then(Array.fromAsync), - fetchRemoteTextByLine('https://gaoyifan.github.io/china-operator-ip/china6.txt', true).then(Array.fromAsync) - ]); -}); +const getChnCidrPromise = Promise.all([ + fetchRemoteTextByLine('https://chnroutes2.cdn.skk.moe/chnroutes.txt', true).then(Array.fromAsync), + fetchRemoteTextByLine('https://gaoyifan.github.io/china-operator-ip/china6.txt', true).then(Array.fromAsync) +]); export const buildChnCidr = task(require.main === module, __filename)(async (span) => { - const [filteredCidr4, cidr6] = await span.traceChildAsync('download chnroutes2', getChnCidrPromise); + const [filteredCidr4, cidr6] = await span.traceChildPromise('download chnroutes2', getChnCidrPromise); // Can not use SHARED_DESCRIPTION here as different license const description = createFileDescription('CC BY-SA 2.0'); diff --git a/Build/build-global-server-dns-mapping.ts b/Build/build-global-server-dns-mapping.ts index b0763295..df11bbce 100644 --- a/Build/build-global-server-dns-mapping.ts +++ b/Build/build-global-server-dns-mapping.ts @@ -9,7 +9,7 @@ import { readFileIntoProcessedArray } from './lib/fetch-text-by-line'; import { SHARED_DESCRIPTION } from './constants/description'; import { RulesetOutput } from './lib/rules/ruleset'; -export const getGlobalRulesetPromise = once(async () => { +const getGlobalRulesetPromise = once(async () => { const globals = await readFileIntoProcessedArray(path.join(SOURCE_DIR, 'non_ip/global.conf')); const getDnsMappingRuleWithWildcard = createGetDnsMappingRule(true); diff --git a/Build/build-microsoft-cdn.ts b/Build/build-microsoft-cdn.ts index d8a6d8f6..af761d8d 100644 --- a/Build/build-microsoft-cdn.ts +++ b/Build/build-microsoft-cdn.ts @@ -3,7 +3,6 @@ import { SHARED_DESCRIPTION } from './constants/description'; import { RulesetOutput } from './lib/rules/ruleset'; import Worktank from 'worktank'; import { RULES } from './constants/microsoft-cdn'; -import { wait } from 'foxts/wait'; const pool = new Worktank({ pool: { @@ -48,10 +47,10 @@ const pool = new Worktank({ } }); -export const getMicrosoftCdnRulesetPromise = wait(0).then(() => pool.exec( +const getMicrosoftCdnRulesetPromise = pool.exec( 'getMicrosoftCdnRuleset', [__filename] -)).finally(() => pool.terminate()); +).finally(() => pool.terminate()); export const buildMicrosoftCdn = task(require.main === module, __filename)(async (span) => { const [domains, domainSuffixes] = await span.traceChildPromise('get microsoft cdn domains', getMicrosoftCdnRulesetPromise); diff --git a/Build/build-reject-domainset.ts b/Build/build-reject-domainset.ts index 2cc9bfa3..111bd0b6 100644 --- a/Build/build-reject-domainset.ts +++ b/Build/build-reject-domainset.ts @@ -16,9 +16,8 @@ import { SHARED_DESCRIPTION } from './constants/description'; import { addArrayElementsToSet } from 'foxts/add-array-elements-to-set'; import { OUTPUT_INTERNAL_DIR, SOURCE_DIR } from './constants/dir'; -import { DomainsetOutput } from './lib/rules/domainset'; +import { DomainsetOutput, AdGuardHomeOutput } from './lib/rules/domainset'; import { foundDebugDomain } from './lib/parse-filter/shared'; -import { AdGuardHomeOutput } from './lib/rules/domainset'; import { getPhishingDomains } from './lib/get-phishing-domains'; import type { MaybePromise } from './lib/misc'; import { RulesetOutput } from './lib/rules/ruleset'; diff --git a/Build/build-sspanel-appprofile.ts b/Build/build-sspanel-appprofile.ts deleted file mode 100644 index 490cb0ae..00000000 --- a/Build/build-sspanel-appprofile.ts +++ /dev/null @@ -1,290 +0,0 @@ -import { getAppleCdnDomainsPromise } from './build-apple-cdn'; -import { getDomesticAndDirectDomainsRulesetPromise } from './build-domestic-direct-lan-ruleset-dns-mapping-module'; -import { readFileIntoProcessedArray } from './lib/fetch-text-by-line'; -import { task } from './trace'; -import path from 'node:path'; - -import { ALL as AllStreamServices } from '../Source/stream'; -import { getChnCidrPromise } from './build-chn-cidr'; -import { getTelegramCIDRPromise } from './lib/get-telegram-backup-ip'; -import { compareAndWriteFile } from './lib/create-file'; -import { getMicrosoftCdnRulesetPromise } from './build-microsoft-cdn'; -import { isTruthy, nullthrow } from 'foxts/guard'; -import { appendArrayInPlace } from 'foxts/append-array-in-place'; -import { OUTPUT_INTERNAL_DIR, OUTPUT_SURGE_DIR, SOURCE_DIR } from './constants/dir'; -import { ClashOnlyRulesetOutput } from './lib/rules/ruleset'; -import { getGlobalRulesetPromise } from './build-global-server-dns-mapping'; - -const POLICY_GROUPS: Array<[name: string, insertProxy: boolean, insertDirect: boolean]> = [ - ['Default Proxy', true, false], - ['Global', true, true], - ['Microsoft & Apple', true, true], - ['Stream', true, false], - ['Steam Download', true, true], - ['Domestic', false, true], - ['Final Match', true, true] -]; - -const steamDomainsPromise = readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/game-download.conf')); - -/** - * This only generates a simplified version, for under-used users only. - */ -export const buildSSPanelUIMAppProfile = task(require.main === module, __filename)(async (span) => { - const streamRules = AllStreamServices.flatMap((i) => i.rules); - const [streamCidrs4, streamCidrs6] = AllStreamServices.reduce<[cidr4: string[], cidr6: string[]]>((acc, i) => { - if (i.ip) { - appendArrayInPlace(acc[0], i.ip.v4); - appendArrayInPlace(acc[1], i.ip.v6); - } - - return acc; - }, [[], []]); - - const [ - [domesticRules, directRules, lanRules], - appleCdnDomains, - [microsoftCdnDomains, microsoftCdnDomainSuffixes], - appleCnRules, - neteaseMusicRules, - microsoftRules, - appleRules, - // streamRules, - steamDomainset, - [globalRules], - telegramRules, - [domesticCidrs4, domesticCidrs6], - // [streamCidrs4, streamCidrs6], - { ipcidr: telegramCidrs4, ipcidr6: telegramCidrs6 }, - rawLanCidrs - ] = await Promise.all([ - // domestic - domains - getDomesticAndDirectDomainsRulesetPromise(), - getAppleCdnDomainsPromise(), - getMicrosoftCdnRulesetPromise, - readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'non_ip/apple_cn.conf')), - readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'non_ip/neteasemusic.conf')), - // microsoft & apple - domains - readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'non_ip/microsoft.conf')), - readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'non_ip/apple_services.conf')), - // steam - domains - steamDomainsPromise, - // global - domains - getGlobalRulesetPromise(), - readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'non_ip/telegram.conf')), - // domestic - ip cidr - getChnCidrPromise(), - // global - ip cidr - getTelegramCIDRPromise(), - // lan - ip cidr - readFileIntoProcessedArray(path.join(OUTPUT_SURGE_DIR, 'ip/lan.conf')) - ] as const); - - const domestic = new ClashOnlyRulesetOutput(span, '_', 'non_ip') - .addFromRuleset(domesticRules) - .bulkAddDomainSuffix(appleCdnDomains) - .bulkAddDomain(microsoftCdnDomains) - .bulkAddDomainSuffix(microsoftCdnDomainSuffixes) - .addFromRuleset(appleCnRules) - .addFromRuleset(neteaseMusicRules); - - const microsoftApple = new ClashOnlyRulesetOutput(span, '_', 'non_ip') - .addFromRuleset(microsoftRules) - .addFromRuleset(appleRules); - - const stream = new ClashOnlyRulesetOutput(span, '_', 'non_ip') - .addFromRuleset(streamRules); - - const steam = new ClashOnlyRulesetOutput(span, '_', 'non_ip') - .addFromDomainset(steamDomainset); - - const global = new ClashOnlyRulesetOutput(span, '_', 'non_ip') - .addFromRuleset(globalRules) - .addFromRuleset(telegramRules); - - const direct = new ClashOnlyRulesetOutput(span, '_', 'non_ip') - .addFromRuleset(directRules) - .addFromRuleset(lanRules); - - const domesticCidr = new ClashOnlyRulesetOutput(span, '_', 'ip') - .bulkAddCIDR4(domesticCidrs4) - .bulkAddCIDR6(domesticCidrs6); - - const streamCidr = new ClashOnlyRulesetOutput(span, '_', 'ip') - .bulkAddCIDR4(streamCidrs4) - .bulkAddCIDR6(streamCidrs6); - - const telegramCidr = new ClashOnlyRulesetOutput(span, '_', 'ip') - .bulkAddCIDR4(telegramCidrs4) - .bulkAddCIDR6(telegramCidrs6); - - const lanCidrs = new ClashOnlyRulesetOutput(span, '_', 'ip') - .addFromRuleset(rawLanCidrs); - - const output = generateAppProfile( - ...( - (await Promise.all([ - domestic.compile(), - microsoftApple.compile(), - stream.compile(), - steam.compile(), - global.compile(), - direct.compile(), - domesticCidr.compile(), - streamCidr.compile(), - telegramCidr.compile(), - lanCidrs.compile() - ])).map(output => nullthrow(output[0])) - ) as [ - string[], string[], string[], string[], string[], - string[], string[], string[], string[], string[] - ] - ); - - await compareAndWriteFile( - span, - output, - path.resolve(OUTPUT_INTERNAL_DIR, 'appprofile.php') - ); -}); - -function generateAppProfile( - directDomains: string[], - microsoftAppleDomains: string[], - streamDomains: string[], - steamDomains: string[], - globalDomains: string[], - - lanDomains: string[], - directCidrs: string[], - streamCidrs: string[], - globalCidrs: string[], - lanCidrs: string[] -) { - const redults = [ - ' 7890,', - ' \'socks-port\' => 7891,', - ' \'allow-lan\' => false,', - ' \'mode\' => \'Rule\',', - ' \'ipv6\' => true,', - ' \'log-level\' => \'error\',', - ' \'external-controller\' => \'0.0.0.0:9090\',', - ' \'tun\' => [', - ' \'enable\' => true,', - ' \'stack\' => \'system\',', - ' \'auto-route\' => true,', - ' \'auto-redir\' => true,', - ' \'auto-detect-interface\' => true,', - ' \'dns-hijack\' => [', - ' \'8.8.8.8:53\',', - ' \'any:53\',', - ' \'tcp://8.8.8.8:53\',', - ' \'tcp://any:53\',', - ' ]', - ' ]', - '];', - '', - `$_ENV['Clash_Group_Indexes'] = [${JSON.stringify(POLICY_GROUPS.reduce((acc, [, insertProxy], index) => { - if (insertProxy) { - acc.push(index); - } - return acc; - }, [])).slice(1, -1)}];`, - '$_ENV[\'Clash_Group_Config\'] = [', - ' \'proxy-groups\' => [' - ]; - - appendArrayInPlace( - redults, - POLICY_GROUPS.flatMap(([name, insertProxy, insertDirect]) => [ - ' [', - ` 'name' => '${name}',`, - ' \'type\' => \'select\',', - ' \'proxies\' => [', - insertProxy && name !== 'Default Proxy' && ' \'Default Proxy\',', - insertDirect && ' \'DIRECT\',', - ' ],', - ' ],' - ].filter(isTruthy)) - ); - - appendArrayInPlace( - redults, - [ - ' ],', - ' \'rules\' => [' - ] - ); - - // domestic - domains - appendArrayInPlace( - redults, - directDomains.map(line => ` '${line},Domestic',`) - ); - - // microsoft & apple - domains - appendArrayInPlace( - redults, - microsoftAppleDomains.map(line => ` '${line},Microsoft & Apple',`) - ); - - // stream - domains - appendArrayInPlace( - redults, - streamDomains.map(line => ` '${line},Stream',`) - ); - // steam download - domains - appendArrayInPlace( - redults, - steamDomains.map(line => ` '${line},Steam Download',`) - ); - // global - domains - appendArrayInPlace( - redults, - globalDomains.map(line => ` '${line},Global',`) - ); - // microsoft & apple - ip cidr (nope) - // lan - domains - appendArrayInPlace( - redults, - lanDomains.map(line => ` '${line},DIRECT',`) - ); - // stream - ip cidr - appendArrayInPlace( - redults, - streamCidrs.map(line => ` '${line},Stream',`) - ); - // global - ip cidr - appendArrayInPlace( - redults, - globalCidrs.map(line => ` '${line},Global',`) - ); - // domestic - ip cidr - appendArrayInPlace( - redults, - directCidrs.map(line => ` '${line},Domestic',`) - ); - // lan - ip cidr - appendArrayInPlace( - redults, - lanCidrs.map(line => ` '${line},DIRECT',`) - ); - // match - appendArrayInPlace( - redults, - [ - ' \'MATCH,Final Match\',', - ' ],', - '];' - ] - ); - - return redults; -} diff --git a/Build/index.ts b/Build/index.ts index 7a6b076e..14953ff7 100644 --- a/Build/index.ts +++ b/Build/index.ts @@ -19,7 +19,6 @@ import { buildRedirectModule } from './build-sgmodule-redirect'; import { buildAlwaysRealIPModule } from './build-sgmodule-always-realip'; import { buildMicrosoftCdn } from './build-microsoft-cdn'; -import { buildSSPanelUIMAppProfile } from './build-sspanel-appprofile'; import { buildPublic } from './build-public'; import { downloadMockAssets } from './download-mock-assets'; @@ -98,10 +97,6 @@ const buildFinishedLock = path.join(ROOT_DIR, '.BUILD_FINISHED'); downloadPreviousBuildPromise.then(() => buildAlwaysRealIPModule(rootSpan)), downloadPreviousBuildPromise.then(() => buildStreamService(rootSpan)), downloadPreviousBuildPromise.then(() => buildMicrosoftCdn(rootSpan)), - Promise.all([ - downloadPreviousBuildPromise, - buildCommonPromise - ]).then(() => buildSSPanelUIMAppProfile(rootSpan)), downloadPreviousBuildPromise.then(() => buildCloudMounterRules(rootSpan)), downloadMockAssets(rootSpan) ]);