From 535e6a123110055555c952327015b86167834270 Mon Sep 17 00:00:00 2001 From: SukkaW Date: Mon, 3 Jun 2024 14:06:40 +0800 Subject: [PATCH] Perf: re-use filter parse return value --- Build/lib/parse-filter.ts | 145 ++++++++++++++++++++++---------------- 1 file changed, 84 insertions(+), 61 deletions(-) diff --git a/Build/lib/parse-filter.ts b/Build/lib/parse-filter.ts index 8bc2c6f2..b22a43c8 100644 --- a/Build/lib/parse-filter.ts +++ b/Build/lib/parse-filter.ts @@ -125,7 +125,8 @@ const enum ParseType { WhiteAbsolute = -1, BlackAbsolute = 1, BlackIncludeSubdomain = 2, - ErrorMessage = 10 + ErrorMessage = 10, + Null = 1000 } export async function processFilterRules( @@ -152,16 +153,18 @@ export async function processFilterRules( ? await span.traceChild('get gorhill').tracePromise(gorhillPromise) : (peekedGorhill as PublicSuffixList); + const MUTABLE_PARSE_LINE_RESULT: [string, ParseType] = ['', 1000]; /** - * @param {string} line - */ + * @param {string} line + */ const lineCb = (line: string) => { - const result = parse(line, gorhill); - if (!result) { + const result = parse(line, gorhill, MUTABLE_PARSE_LINE_RESULT); + const flag = result[1]; + + if (flag === ParseType.Null) { return; } - const flag = result[1]; const hostname = result[0]; if (DEBUG_DOMAIN_TO_FIND) { @@ -283,14 +286,15 @@ const kwfilter = createKeywordFilter([ '$cname' ]); -function parse($line: string, gorhill: PublicSuffixList): null | [hostname: string, flag: ParseType] { +function parse($line: string, gorhill: PublicSuffixList, result: [string, ParseType]): [hostname: string, flag: ParseType] { if ( // doesn't include !$line.includes('.') // rule with out dot can not be a domain // includes || kwfilter($line) ) { - return null; + result[1] = ParseType.Null; + return result; } const line = $line.trim(); @@ -298,7 +302,8 @@ function parse($line: string, gorhill: PublicSuffixList): null | [hostname: stri /** @example line.length */ const len = line.length; if (len === 0) { - return null; + result[1] = ParseType.Null; + return result; } const firstCharCode = line[0].charCodeAt(0); @@ -314,11 +319,13 @@ function parse($line: string, gorhill: PublicSuffixList): null | [hostname: stri // || line.includes('$removeparam') // || line.includes('$popunder') ) { - return null; + result[1] = ParseType.Null; + return result; } if ((line.includes('/') || line.includes(':')) && !line.includes('://')) { - return null; + result[1] = ParseType.Null; + return result; } const filter = NetworkFilter.parse(line); @@ -336,7 +343,8 @@ function parse($line: string, gorhill: PublicSuffixList): null | [hostname: stri || (!filter.fromAny() && !filter.fromDocument()) ) { // not supported type - return null; + result[1] = ParseType.Null; + return result; } if ( @@ -346,7 +354,8 @@ function parse($line: string, gorhill: PublicSuffixList): null | [hostname: stri ) { const hostname = normalizeDomain(filter.hostname); if (!hostname) { - return null; + result[1] = ParseType.Null; + return result; } // |: filter.isHostnameAnchor(), @@ -355,7 +364,9 @@ function parse($line: string, gorhill: PublicSuffixList): null | [hostname: stri const isIncludeAllSubDomain = filter.isHostnameAnchor(); if (filter.isException() || filter.isBadFilter()) { - return [hostname, isIncludeAllSubDomain ? ParseType.WhiteIncludeSubdomain : ParseType.WhiteAbsolute]; + result[0] = hostname; + result[1] = isIncludeAllSubDomain ? ParseType.WhiteIncludeSubdomain : ParseType.WhiteAbsolute; + return result; } const _1p = filter.firstParty(); @@ -363,12 +374,15 @@ function parse($line: string, gorhill: PublicSuffixList): null | [hostname: stri if (_1p) { if (_1p === _3p) { - return [hostname, isIncludeAllSubDomain ? ParseType.BlackIncludeSubdomain : ParseType.BlackAbsolute]; + result[0] = hostname; + result[1] = isIncludeAllSubDomain ? ParseType.BlackIncludeSubdomain : ParseType.BlackAbsolute; } - return null; + result[1] = ParseType.Null; + return result; } if (_3p) { - return null; + result[1] = ParseType.Null; + return result; } } } @@ -386,7 +400,8 @@ function parse($line: string, gorhill: PublicSuffixList): null | [hostname: stri * `.1.1.1.l80.js^$third-party` */ if (line.includes('$third-party') || line.includes('$frame')) { - return null; + result[1] = ParseType.Null; + return result; } /** @example line.endsWith('^') */ @@ -460,22 +475,22 @@ function parse($line: string, gorhill: PublicSuffixList): null | [hostname: stri const sliced = line.slice(sliceStart, sliceEnd); const domain = normalizeDomain(sliced); if (domain) { - return [domain, whiteIncludeAllSubDomain ? ParseType.WhiteIncludeSubdomain : ParseType.WhiteAbsolute]; + result[0] = domain; + result[1] = whiteIncludeAllSubDomain ? ParseType.WhiteIncludeSubdomain : ParseType.WhiteAbsolute; } - return [ - `[parse-filter E0001] (white) invalid domain: ${JSON.stringify({ - line, sliced, sliceStart, sliceEnd - })}`, - ParseType.ErrorMessage - ]; + + result[0] = `[parse-filter E0001] (white) invalid domain: ${JSON.stringify({ + line, sliced, sliceStart, sliceEnd + })}`; + result[1] = ParseType.ErrorMessage; + return result; } - return [ - `[parse-filter E0006] (white) failed to parse: ${JSON.stringify({ - line, sliceStart, sliceEnd - })}`, - ParseType.ErrorMessage - ]; + result[0] = `[parse-filter E0006] (white) failed to parse: ${JSON.stringify({ + line, sliceStart, sliceEnd + })}`; + result[1] = ParseType.ErrorMessage; + return result; } if ( @@ -504,13 +519,14 @@ function parse($line: string, gorhill: PublicSuffixList): null | [hostname: stri const domain = normalizeDomain(sliced); if (domain) { - return [domain, includeAllSubDomain ? ParseType.BlackIncludeSubdomain : ParseType.BlackAbsolute]; + result[0] = domain; + result[1] = includeAllSubDomain ? ParseType.BlackIncludeSubdomain : ParseType.BlackAbsolute; + return result; } - return [ - `[parse-filter E0002] (black) invalid domain: ${sliced}`, - ParseType.ErrorMessage - ]; + result[0] = `[parse-filter E0002] (black) invalid domain: ${sliced}`; + result[1] = ParseType.ErrorMessage; + return result; } const lineStartsWithSingleDot = firstCharCode === 46; // 46 `.` @@ -533,18 +549,19 @@ function parse($line: string, gorhill: PublicSuffixList): null | [hostname: stri const suffix = gorhill.getPublicSuffix(sliced); if (!gorhill.suffixInPSL(suffix)) { // This exclude domain-like resource like `1.1.4.514.js` - return null; + result[1] = ParseType.Null; + return result; } const domain = normalizeDomain(sliced); if (domain) { - return [domain, ParseType.BlackIncludeSubdomain]; + result[0] = domain; + result[1] = ParseType.BlackIncludeSubdomain; } - return [ - `[paparse-filter E0003] (black) invalid domain: ${sliced}`, - ParseType.ErrorMessage - ]; + result[0] = `[paparse-filter E0003] (black) invalid domain: ${sliced}`; + result[1] = ParseType.ErrorMessage; + return result; } /** @@ -576,14 +593,16 @@ function parse($line: string, gorhill: PublicSuffixList): null | [hostname: stri const sliced = line.slice(sliceStart, sliceEnd); const domain = normalizeDomain(sliced); if (domain) { - return [domain, ParseType.BlackIncludeSubdomain]; + result[0] = domain; + result[1] = ParseType.BlackIncludeSubdomain; + return result; } - return [ - `[parse-filter E0004] (black) invalid domain: ${JSON.stringify({ - line, sliced, sliceStart, sliceEnd - })}`, - ParseType.ErrorMessage - ]; + + result[0] = `[parse-filter E0004] (black) invalid domain: ${JSON.stringify({ + line, sliced, sliceStart, sliceEnd + })}`; + result[1] = ParseType.ErrorMessage; + return result; } } /** @@ -604,18 +623,20 @@ function parse($line: string, gorhill: PublicSuffixList): null | [hostname: stri const suffix = gorhill.getPublicSuffix(_domain); if (!suffix || !gorhill.suffixInPSL(suffix)) { // This exclude domain-like resource like `_social_tracking.js^` - return null; + result[1] = ParseType.Null; + return result; } const domain = normalizeDomain(_domain); if (domain) { - return [domain, ParseType.BlackAbsolute]; + result[0] = domain; + result[1] = ParseType.BlackAbsolute; + return result; } - return [ - `[parse-filter E0005] (black) invalid domain: ${_domain}`, - ParseType.ErrorMessage - ]; + result[0] = `[parse-filter E0005] (black) invalid domain: ${_domain}`; + result[1] = ParseType.ErrorMessage; + return result; } // Possibly that entire rule is domain @@ -666,17 +687,19 @@ function parse($line: string, gorhill: PublicSuffixList): null | [hostname: stri */ if (!suffix || !gorhill.suffixInPSL(suffix)) { // This exclude domain-like resource like `.gatracking.js`, `.beacon.min.js` and `.cookielaw.js` - return null; + result[1] = ParseType.Null; + return result; } const tryNormalizeDomain = normalizeDomain(sliced); if (tryNormalizeDomain === sliced) { // the entire rule is domain - return [sliced, ParseType.BlackIncludeSubdomain]; + result[0] = sliced; + result[1] = ParseType.BlackIncludeSubdomain; + return result; } - return [ - `[parse-filter E0010] can not parse: ${line}`, - ParseType.ErrorMessage - ]; + result[0] = `[parse-filter E0010] can not parse: ${line}`; + result[1] = ParseType.ErrorMessage; + return result; }