From 098e8815aea45f3f81bccc7f59631d84cc2ad882 Mon Sep 17 00:00:00 2001 From: SukkaW Date: Wed, 26 Jun 2024 18:30:41 +0800 Subject: [PATCH] Perf: optimiaztions, avoid spread operator --- Build/build-apple-cdn.ts | 3 +- Build/build-cloudmounter-rules.ts | 4 +- ...c-direct-lan-ruleset-dns-mapping-module.ts | 8 +- Build/build-sgmodule-redirect.ts | 3 +- Build/build-sspanel-appprofile.ts | 118 +++++++++++++----- Build/lib/misc.ts | 1 + Build/trace/index.ts | 24 ++-- Source/non_ip/direct.ts | 5 +- Source/non_ip/domestic.ts | 6 + 9 files changed, 110 insertions(+), 62 deletions(-) create mode 100644 Build/lib/misc.ts diff --git a/Build/build-apple-cdn.ts b/Build/build-apple-cdn.ts index 1c4fc82a..047ad568 100644 --- a/Build/build-apple-cdn.ts +++ b/Build/build-apple-cdn.ts @@ -18,8 +18,7 @@ export const getAppleCdnDomainsPromise = createMemoizedPromise(() => fsFetchCach )); export const buildAppleCdn = task(import.meta.main, import.meta.path)(async (span) => { - const promise = getAppleCdnDomainsPromise(); - const res: string[] = await span.traceChildPromise('get apple cdn domains', promise); + const res: string[] = await span.traceChildPromise('get apple cdn domains', getAppleCdnDomainsPromise()); const description = [ ...SHARED_DESCRIPTION, diff --git a/Build/build-cloudmounter-rules.ts b/Build/build-cloudmounter-rules.ts index eed86994..0d953f77 100644 --- a/Build/build-cloudmounter-rules.ts +++ b/Build/build-cloudmounter-rules.ts @@ -11,9 +11,7 @@ export const buildCloudMounterRules = task(import.meta.main, import.meta.path)(a // AND,((SRC-IP,192.168.1.110), (DOMAIN, example.com)) const results = DOMAINS.flatMap(domain => { - return PROCESS_NAMES.map(process => { - return `AND,((${domain}),(PROCESS-NAME,${process}))`; - }); + return PROCESS_NAMES.map(process => `AND,((${domain}),(PROCESS-NAME,${process}))`); }); const description = SHARED_DESCRIPTION; diff --git a/Build/build-domestic-direct-lan-ruleset-dns-mapping-module.ts b/Build/build-domestic-direct-lan-ruleset-dns-mapping-module.ts index 431bed6c..b1fc0a4f 100644 --- a/Build/build-domestic-direct-lan-ruleset-dns-mapping-module.ts +++ b/Build/build-domestic-direct-lan-ruleset-dns-mapping-module.ts @@ -85,12 +85,8 @@ export const buildDomesticRuleset = task(import.meta.main, import.meta.path)(asy `#!desc=Last Updated: ${new Date().toISOString()}`, '', '[Host]', - ...dataset.flatMap(([, { domains, dns, ...rest }]) => [ - ...( - 'hosts' in rest - ? Object.entries(rest.hosts).flatMap(([dns, ips]: [dns: string, ips: string[]]) => `${dns} = ${ips.join(', ')}`) - : [] - ), + ...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}` diff --git a/Build/build-sgmodule-redirect.ts b/Build/build-sgmodule-redirect.ts index c4fb7924..05efbde5 100644 --- a/Build/build-sgmodule-redirect.ts +++ b/Build/build-sgmodule-redirect.ts @@ -2,6 +2,7 @@ import path from 'path'; import { task } from './trace'; import { compareAndWriteFile } from './lib/create-file'; import { getHostname } from 'tldts'; +import { isTruthy } from './lib/misc'; function escapeRegExp(string = '') { const reRegExpChar = /[$()*+.?[\\\]^{|}]/g; @@ -122,7 +123,7 @@ export const buildRedirectModule = task(import.meta.main, import.meta.path)(asyn const domains = Array.from(new Set([ ...REDIRECT_MIRROR.map(([from]) => getHostname(from, { detectIp: false })), ...REDIRECT_FAKEWEBSITES.flatMap(([from]) => [from, `www.${from}`]) - ])).filter(Boolean); + ])).filter(isTruthy); return compareAndWriteFile( span, diff --git a/Build/build-sspanel-appprofile.ts b/Build/build-sspanel-appprofile.ts index cbc73d8f..97ce6626 100644 --- a/Build/build-sspanel-appprofile.ts +++ b/Build/build-sspanel-appprofile.ts @@ -10,6 +10,8 @@ import { getChnCidrPromise } from './build-chn-cidr'; import { getTelegramCIDRPromise } from './build-telegram-cidr'; import { compareAndWriteFile } from './lib/create-file'; import { getMicrosoftCdnRulesetPromise } from './build-microsoft-cdn'; +import { isTruthy } from './lib/misc'; +import { appendArrayInPlace } from './lib/append-array-in-place'; const POLICY_GROUPS: Array<[name: string, insertProxy: boolean, insertDirect: boolean]> = [ ['Default Proxy', true, false], @@ -120,8 +122,6 @@ export const buildSSPanelUIMAppProfile = task(import.meta.main, import.meta.path ); }); -const isTruthy = (i: T | 0 | '' | false | null | undefined): i is T => !!i; - function generateAppProfile( directDomains: string[], microsoftAppleDomains: string[], @@ -135,7 +135,7 @@ function generateAppProfile( globalCidrs: string[], lanCidrs: string[] ) { - return [ + const redults = [ ' [', - ...POLICY_GROUPS.flatMap(([name, insertProxy, insertDirect]) => { + ' \'proxy-groups\' => [' + ]; + + appendArrayInPlace( + redults, + POLICY_GROUPS.flatMap(([name, insertProxy, insertDirect]) => { return [ ' [', ` 'name' => '${name}',`, @@ -184,33 +188,79 @@ function generateAppProfile( ' ],', ' ],' ].filter(isTruthy); - }), - ' ],', - ' \'rules\' => [', - // domestic - domains - ...directDomains.map(line => ` '${line},Domestic',`), - // microsoft & apple - domains - ...microsoftAppleDomains.map(line => ` '${line},Microsoft & Apple',`), - // stream - domains - ...streamDomains.map(line => ` '${line},Stream',`), - // steam download - domains - ...steamDomains.map(line => ` '${line},Steam Download',`), - // global - domains - ...globalDomains.map(line => ` '${line},Global',`), - // microsoft & apple - ip cidr (nope) - // lan - domains - ...lanDomains.map(line => ` '${line},DIRECT',`), - // stream - ip cidr - ...streamCidrs.map(line => ` '${line},Stream',`), - // global - ip cidr - ...globalCidrs.map(line => ` '${line},Global',`), - // domestic - ip cidr - ...directCidrs.map(line => ` '${line},Domestic',`), - // lan - ip cidr - ...lanCidrs.map(line => ` '${line},DIRECT',`), - // match - ' \'MATCH,Final Match\',', - ' ],', - '];' - ]; + }) + ); + + 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/lib/misc.ts b/Build/lib/misc.ts new file mode 100644 index 00000000..7744f7e3 --- /dev/null +++ b/Build/lib/misc.ts @@ -0,0 +1 @@ +export const isTruthy = (i: T | 0 | '' | false | null | undefined): i is T => !!i; diff --git a/Build/trace/index.ts b/Build/trace/index.ts index 6b7d5a5d..298b30e0 100644 --- a/Build/trace/index.ts +++ b/Build/trace/index.ts @@ -72,26 +72,20 @@ export const createSpan = (name: string, parentTraceResult?: TraceResult): Span stop, traceChild, traceSyncFn(fn: (span: Span) => T) { - try { - return fn(span); - } finally { - span.stop(); - } + const res = fn(span); + span.stop(); + return res; }, async traceAsyncFn(fn: (span: Span) => T | Promise): Promise { - try { - return await fn(span); - } finally { - span.stop(); - } + const res = await fn(span); + span.stop(); + return res; }, traceResult: curTraceResult, async tracePromise(promise: Promise): Promise { - try { - return await promise; - } finally { - span.stop(); - } + const res = await promise; + span.stop(); + return res; }, traceChildSync: (name: string, fn: (span: Span) => T): T => traceChild(name).traceSyncFn(fn), traceChildAsync: (name: string, fn: (span: Span) => T | Promise): Promise => traceChild(name).traceAsyncFn(fn), diff --git a/Source/non_ip/direct.ts b/Source/non_ip/direct.ts index 23884b2e..f25ff976 100644 --- a/Source/non_ip/direct.ts +++ b/Source/non_ip/direct.ts @@ -1,5 +1,5 @@ export interface DNSMapping { - hosts?: { + hosts: { [domain: string]: string[] }, dns: string, @@ -9,6 +9,7 @@ export interface DNSMapping { export const DIRECTS = { ROUTER: { dns: 'system', + hosts: {}, domains: [ // Aruba Router 'instant.arubanetworks.com', @@ -77,6 +78,7 @@ export const DIRECTS = { }, SYSTEM: { dns: 'system', + hosts: {}, domains: [ '_hotspot_.m2m', 'hotspot.cslwifi.com', @@ -92,6 +94,7 @@ export const DIRECTS = { export const LANS = { LAN: { dns: 'system', + hosts: {}, domains: [ 'lan', 'localhost', diff --git a/Source/non_ip/domestic.ts b/Source/non_ip/domestic.ts index de615fcb..2cd79910 100644 --- a/Source/non_ip/domestic.ts +++ b/Source/non_ip/domestic.ts @@ -141,18 +141,21 @@ export const DOMESTICS = { }, BILIBILI_ALI: { dns: 'quic://dns.alidns.com:853', + hosts: {}, domains: [ 'upos-sz-mirrorali.bilivideo.com' ] }, BILIBILI_BD: { dns: '180.76.76.76', + hosts: {}, domains: [ 'upos-sz-mirrorbos.bilivideo.com' ] }, BILIBILI: { dns: 'https://doh.pub/dns-query', + hosts: {}, domains: [ 'upos-sz-mirrorcoso1.bilivideo.com', 'acg.tv', @@ -179,6 +182,7 @@ export const DOMESTICS = { }, XIAOMI: { dns: 'https://doh.pub/dns-query', + hosts: {}, domains: [ 'mi.com', 'duokan.com', @@ -195,6 +199,7 @@ export const DOMESTICS = { }, BYTEDANCE: { dns: '180.184.2.2', + hosts: {}, domains: [ 'bytecdn.cn', 'toutiaoimg.com', @@ -235,6 +240,7 @@ export const DOMESTICS = { }, BAIDU: { dns: '180.76.76.76', + hosts: {}, domains: [ '91.com', 'hao123.com',