Skip to content

Commit

Permalink
Perf: make normalizeDomain faster
Browse files Browse the repository at this point in the history
  • Loading branch information
SukkaW committed Jan 17, 2025
1 parent 7683775 commit 264e307
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 8 deletions.
11 changes: 7 additions & 4 deletions Build/constants/loose-tldts-opt.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
import type * as tldts from 'tldts';

export const looseTldtsOpt: Parameters<typeof tldts.getSubdomain>[1] = {
export const looseTldtsOpt: NonNullable<Parameters<typeof tldts.getSubdomain>[1]> = {
allowPrivateDomains: false,
extractHostname: false,
validateHostname: false,
detectIp: false,
mixedInputs: false
};

export const loosTldOptWithPrivateDomains: Parameters<typeof tldts.getSubdomain>[1] = {
export const loosTldOptWithPrivateDomains: NonNullable<Parameters<typeof tldts.getSubdomain>[1]> = {
...looseTldtsOpt,
allowPrivateDomains: true
};

export const normalizeTldtsOpt: Parameters<typeof tldts.getSubdomain>[1] = {
export const normalizeTldtsOpt: NonNullable<Parameters<typeof tldts.getSubdomain>[1]> = {
allowPrivateDomains: true,
detectIp: true
// in normalizeDomain, we only care if it contains IP, we don't care if we need to extract it
// by setting detectIp to false and manually check ip outside tldts.parse, we can skip the tldts
// inner "extractHostname" call
detectIp: false
};
17 changes: 13 additions & 4 deletions Build/lib/normalize-domain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,21 @@
// import tldts from 'tldts-experimental';
import tldts from 'tldts';
import { normalizeTldtsOpt } from '../constants/loose-tldts-opt';
import { isProbablyIpv4, isProbablyIpv6 } from 'foxts/is-probably-ip';

type TldTsParsed = ReturnType<typeof tldts.parse>;

/**
* Skipped the input non-empty check, the `domain` should not be empty.
*/
export function fastNormalizeDomain(domain: string, parsed: TldTsParsed = tldts.parse(domain, normalizeTldtsOpt)) {
if (parsed.isIp) return null;
export function fastNormalizeDomain(domain: string, parsed: TldTsParsed | null = null) {
// We don't want tldts to call its own "extractHostname" on ip, bail out ip first.
// Now ip has been bailed out, we can safely set normalizeTldtsOpt.detectIp to false.
if (isProbablyIpv4(domain) || isProbablyIpv6(domain)) {
return null;
}

parsed ??= tldts.parse(domain, normalizeTldtsOpt);
// Private invalid domain (things like .tor, .dn42, etc)
if (!parsed.isIcann && !parsed.isPrivate) return null;

Expand All @@ -20,9 +27,11 @@ export function fastNormalizeDomain(domain: string, parsed: TldTsParsed = tldts.
export function normalizeDomain(domain: string, parsed: TldTsParsed | null = null) {
if (domain.length === 0) return null;

parsed ??= tldts.parse(domain, normalizeTldtsOpt);
if (isProbablyIpv4(domain) || isProbablyIpv6(domain)) {
return null;
}

if (parsed.isIp) return null;
parsed ??= tldts.parse(domain, normalizeTldtsOpt);
// Private invalid domain (things like .tor, .dn42, etc)
if (!parsed.isIcann && !parsed.isPrivate) return null;

Expand Down

0 comments on commit 264e307

Please sign in to comment.