From 1288460c48f20036a0d85e313f4ef4c09b918935 Mon Sep 17 00:00:00 2001 From: SukkaW Date: Sun, 26 May 2024 04:32:08 +0800 Subject: [PATCH] Perf: use tldts-experimental when possible --- Build/build-reject-domainset.ts | 5 ++++- Build/build-sgmodule-redirect.ts | 4 ++-- Build/build-speedtest-domainset.ts | 5 ++--- Build/lib/get-phishing-domains.ts | 4 ++-- Build/lib/normalize-domain.ts | 4 ++-- Build/lib/parse-dnsmasq.ts | 4 ++-- Build/lib/stable-sort-domain.ts | 27 ++++++++++++++++----------- bun.lockb | Bin 111370 -> 112114 bytes package.json | 3 ++- 9 files changed, 32 insertions(+), 24 deletions(-) diff --git a/Build/build-reject-domainset.ts b/Build/build-reject-domainset.ts index e713cabe..25eb694c 100644 --- a/Build/build-reject-domainset.ts +++ b/Build/build-reject-domainset.ts @@ -11,7 +11,10 @@ import createKeywordFilter from './lib/aho-corasick'; import { readFileByLine, readFileIntoProcessedArray } from './lib/fetch-text-by-line'; import { sortDomains } from './lib/stable-sort-domain'; import { task } from './trace'; -import * as tldts from 'tldts'; +// tldts-experimental is way faster than tldts, but very little bit inaccurate +// (since it is hashes based). But the result is still deterministic, which is +// enough when creating a simple stat of reject hosts. +import * as tldts from 'tldts-experimental'; import { SHARED_DESCRIPTION } from './lib/constants'; import { getPhishingDomains } from './lib/get-phishing-domains'; diff --git a/Build/build-sgmodule-redirect.ts b/Build/build-sgmodule-redirect.ts index 1a3c85a5..7a422049 100644 --- a/Build/build-sgmodule-redirect.ts +++ b/Build/build-sgmodule-redirect.ts @@ -1,7 +1,7 @@ import path from 'path'; import { task } from './trace'; import { compareAndWriteFile } from './lib/create-file'; -import * as tldts from 'tldts'; +import { getHostname } from 'tldts'; function escapeRegExp(string = '') { const reRegExpChar = /[$()*+.?[\\\]^{|}]/g; @@ -122,7 +122,7 @@ export const buildRedirectModule = task(import.meta.path, async (span) => { const domains = Array.from( new Set( [ - ...REDIRECT_MIRROR.map(([from]) => tldts.getHostname(from, { detectIp: false })), + ...REDIRECT_MIRROR.map(([from]) => getHostname(from, { detectIp: false })), ...REDIRECT_FAKEWEBSITES.flatMap(([from]) => [from, `www.${from}`]) ] ) diff --git a/Build/build-speedtest-domainset.ts b/Build/build-speedtest-domainset.ts index fa3adeb2..c0471638 100644 --- a/Build/build-speedtest-domainset.ts +++ b/Build/build-speedtest-domainset.ts @@ -4,11 +4,10 @@ import { createRuleset } from './lib/create-file'; import { sortDomains } from './lib/stable-sort-domain'; import { Sema } from 'async-sema'; -import * as tldts from 'tldts'; +import { getHostname } from 'tldts'; import { task } from './trace'; import { fetchWithRetry } from './lib/fetch-retry'; import { SHARED_DESCRIPTION } from './lib/constants'; -import { getGorhillPublicSuffixPromise } from './lib/get-gorhill-publicsuffix'; import picocolors from 'picocolors'; import { fetchRemoteTextByLine } from './lib/fetch-text-by-line'; import { processLine } from './lib/process-line'; @@ -64,7 +63,7 @@ const querySpeedtestApi = async (keyword: string): Promise> } })).then(r => r.json()).then((data: Array<{ url: string }>) => data.reduce( (prev, cur) => { - const hn = tldts.getHostname(cur.url, { detectIp: false }); + const hn = getHostname(cur.url, { detectIp: false }); if (hn) { prev.push(hn); } diff --git a/Build/lib/get-phishing-domains.ts b/Build/lib/get-phishing-domains.ts index a8b4de07..0cc1dd8c 100644 --- a/Build/lib/get-phishing-domains.ts +++ b/Build/lib/get-phishing-domains.ts @@ -1,6 +1,6 @@ import { getGorhillPublicSuffixPromise } from './get-gorhill-publicsuffix'; import { processDomainLists } from './parse-filter'; -import * as tldts from 'tldts'; +import { getSubdomain } from 'tldts'; import { TTL } from './cache-filesystem'; import { add as SetAdd } from 'mnemonist/set'; @@ -177,7 +177,7 @@ export function calcDomainAbuseScore(line: string) { } } - const subdomain = tldts.getSubdomain(line, { detectIp: false }); + const subdomain = getSubdomain(line, { detectIp: false }); if (subdomain) { if (subdomain.slice(1).includes('.')) { diff --git a/Build/lib/normalize-domain.ts b/Build/lib/normalize-domain.ts index dfaa8efc..63e17375 100644 --- a/Build/lib/normalize-domain.ts +++ b/Build/lib/normalize-domain.ts @@ -1,10 +1,10 @@ -import * as tldts from 'tldts'; +import { parse as tldtsParse } from 'tldts'; import { isProbablyIpv4 } from './is-fast-ip'; export const normalizeDomain = (domain: string) => { if (!domain) return null; if (isProbablyIpv4(domain)) return null; - const parsed = tldts.parse(domain, { allowPrivateDomains: true, detectIp: false }); + const parsed = tldtsParse(domain, { allowPrivateDomains: true, detectIp: false }); // if (parsed.isIp) return null; if (!parsed.hostname) return null; if (!parsed.isIcann && !parsed.isPrivate) return null; diff --git a/Build/lib/parse-dnsmasq.ts b/Build/lib/parse-dnsmasq.ts index fa09bbab..f3972027 100644 --- a/Build/lib/parse-dnsmasq.ts +++ b/Build/lib/parse-dnsmasq.ts @@ -1,8 +1,8 @@ import { fetchRemoteTextByLine } from './fetch-text-by-line'; -import { parse } from 'tldts'; +import { parse as tldtsParse } from 'tldts'; const isDomainLoose = (domain: string): boolean => { - const { isIcann, isPrivate, isIp } = parse(domain); + const { isIcann, isPrivate, isIp } = tldtsParse(domain); return !!(!isIp && (isIcann || isPrivate)); }; diff --git a/Build/lib/stable-sort-domain.ts b/Build/lib/stable-sort-domain.ts index dc6f996a..160a25ef 100644 --- a/Build/lib/stable-sort-domain.ts +++ b/Build/lib/stable-sort-domain.ts @@ -1,4 +1,7 @@ -import * as tldts from 'tldts'; +// tldts-experimental is way faster than tldts, but very little bit inaccurate +// (since it is hashes based). But the result is still deterministic, which is +// enough when sorting. +import * as tldts from 'tldts-experimental'; import { sort } from './timsort'; export const compare = (a: string, b: string) => { @@ -6,11 +9,11 @@ export const compare = (a: string, b: string) => { return (a.length - b.length) || a.localeCompare(b); }; -const tldtsOpt = { - extractHostname: false, +const tldtsOpt: Parameters[1] = { allowPrivateDomains: false, - detectIp: false, + extractHostname: false, validateHostname: false, + detectIp: false, mixedInputs: false }; @@ -36,14 +39,16 @@ export const sortDomains = (inputs: string[]) => { const main_domain_a = domainMap.get(a)!; const main_domain_b = domainMap.get(b)!; - let t = compare(main_domain_a, main_domain_b); + let t = compare( + main_domain_a, + main_domain_b + ) || compare( + /** subdomain_a */ subdomainMap.get(a)!, + /** subdomain_b */ subdomainMap.get(b)! + ); + if (t !== 0) return t; - if (t === 0) { - const subdomain_a = subdomainMap.get(a)!; - const subdomain_b = subdomainMap.get(b)!; - t = compare(subdomain_a, subdomain_b); - } - if (t === 0 && (a !== main_domain_a || b !== main_domain_b)) { + if (a !== main_domain_a || b !== main_domain_b) { t = compare(a, b); } diff --git a/bun.lockb b/bun.lockb index 360abbcb294db26dd3e4d0e3896f33e024ac2845..f3103a4ef2648c5fda1614cb324990657e3ce59c 100755 GIT binary patch delta 20408 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 diff --git a/package.json b/package.json index 677db73d..57459bc6 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,8 @@ "punycode": "^2.3.1", "table": "^6.8.2", "tar-stream": "^3.1.7", - "tldts": "^6.1.19" + "tldts": "^6.1.19", + "tldts-experimental": "^6.1.21" }, "devDependencies": { "@eslint-sukka/node": "6.0.0-beta.3",