mirror of
https://github.com/SukkaW/Surge.git
synced 2026-01-28 17:41:54 +08:00
Perf: avoid mutate string in ruleset base
This commit is contained in:
@@ -100,14 +100,14 @@ export abstract class RuleOutput<TPreprocessed = unknown> {
|
||||
for (let i = 0, len = domains.length; i < len; i++) {
|
||||
d = domains[i];
|
||||
if (d !== null) {
|
||||
this.addDomain(d);
|
||||
this.domainTrie.add(d, false, null, 0);
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
addDomainSuffix(domain: string) {
|
||||
this.domainTrie.add(domain, true);
|
||||
addDomainSuffix(domain: string, lineFromDot = domain[0] === '.') {
|
||||
this.domainTrie.add(domain, true, lineFromDot ? 1 : 0);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -126,9 +126,9 @@ export abstract class RuleOutput<TPreprocessed = unknown> {
|
||||
private async addFromDomainsetPromise(source: AsyncIterable<string> | Iterable<string> | string[]) {
|
||||
for await (const line of source) {
|
||||
if (line[0] === '.') {
|
||||
this.addDomainSuffix(line);
|
||||
this.addDomainSuffix(line, true);
|
||||
} else {
|
||||
this.addDomain(line);
|
||||
this.domainTrie.add(line, false, null, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -147,10 +147,10 @@ export abstract class RuleOutput<TPreprocessed = unknown> {
|
||||
|
||||
switch (type) {
|
||||
case 'DOMAIN':
|
||||
this.addDomain(value);
|
||||
this.domainTrie.add(value, false, null, 0);
|
||||
break;
|
||||
case 'DOMAIN-SUFFIX':
|
||||
this.addDomainSuffix(value);
|
||||
this.addDomainSuffix(value, false);
|
||||
break;
|
||||
case 'DOMAIN-KEYWORD':
|
||||
this.addDomainKeyword(value);
|
||||
|
||||
@@ -8,55 +8,47 @@ import { looseTldtsOpt } from '../../constants/loose-tldts-opt';
|
||||
import { fastStringCompare } from '../misc';
|
||||
import escapeStringRegexp from 'escape-string-regexp-node';
|
||||
|
||||
type Preprocessed = string[];
|
||||
|
||||
export class DomainsetOutput extends RuleOutput<Preprocessed> {
|
||||
export class DomainsetOutput extends RuleOutput<string[]> {
|
||||
protected type = 'domainset' as const;
|
||||
|
||||
private $surge: string[] = ['this_ruleset_is_made_by_sukkaw.ruleset.skk.moe'];
|
||||
private $clash: string[] = ['this_ruleset_is_made_by_sukkaw.ruleset.skk.moe'];
|
||||
private $singbox_domains: string[] = ['this_ruleset_is_made_by_sukkaw.ruleset.skk.moe'];
|
||||
private $singbox_domains_suffixes: string[] = ['this_ruleset_is_made_by_sukkaw.ruleset.skk.moe'];
|
||||
|
||||
preprocess() {
|
||||
const kwfilter = createKeywordFilter(this.domainKeywords);
|
||||
|
||||
const results: string[] = [];
|
||||
|
||||
this.domainTrie.dump((domain) => {
|
||||
this.domainTrie.dumpWithoutDot((domain, subdomain) => {
|
||||
if (kwfilter(domain)) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.$surge.push(subdomain ? '.' + domain : domain);
|
||||
this.$clash.push(subdomain ? `+.${domain}` : domain);
|
||||
(subdomain ? this.$singbox_domains : this.$singbox_domains_suffixes).push(domain);
|
||||
|
||||
results.push(domain);
|
||||
}, true);
|
||||
|
||||
const sorted = results;
|
||||
sorted.push('this_ruleset_is_made_by_sukkaw.ruleset.skk.moe');
|
||||
|
||||
return sorted;
|
||||
return results;
|
||||
}
|
||||
|
||||
surge(): string[] {
|
||||
return this.$preprocessed;
|
||||
return this.$surge;
|
||||
}
|
||||
|
||||
clash(): string[] {
|
||||
return this.$preprocessed.map(i => (i[0] === '.' ? `+${i}` : i));
|
||||
return this.$clash;
|
||||
}
|
||||
|
||||
singbox(): string[] {
|
||||
const domains: string[] = [];
|
||||
const domainSuffixes: string[] = [];
|
||||
|
||||
for (let i = 0, len = this.$preprocessed.length; i < len; i++) {
|
||||
const domain = this.$preprocessed[i];
|
||||
if (domain[0] === '.') {
|
||||
domainSuffixes.push(domain.slice(1));
|
||||
} else {
|
||||
domains.push(domain);
|
||||
}
|
||||
}
|
||||
|
||||
return RuleOutput.jsonToLines({
|
||||
version: 2,
|
||||
rules: [{
|
||||
domain: domains,
|
||||
domain_suffix: domainSuffixes
|
||||
domain: this.$singbox_domains,
|
||||
domain_suffix: this.$singbox_domains_suffixes
|
||||
}]
|
||||
} satisfies SingboxSourceFormat);
|
||||
}
|
||||
|
||||
@@ -23,13 +23,13 @@ export class RulesetOutput extends RuleOutput<Preprocessed> {
|
||||
const domainSuffixes: string[] = [];
|
||||
const sortedDomainRules: string[] = [];
|
||||
|
||||
this.domainTrie.dump((domain) => {
|
||||
this.domainTrie.dumpWithoutDot((domain, includeAllSubdomain) => {
|
||||
if (kwfilter(domain)) {
|
||||
return;
|
||||
}
|
||||
if (domain[0] === '.') {
|
||||
domainSuffixes.push(domain.slice(1));
|
||||
sortedDomainRules.push(`DOMAIN-SUFFIX,${domain.slice(1)}`);
|
||||
if (includeAllSubdomain) {
|
||||
domainSuffixes.push(domain);
|
||||
sortedDomainRules.push(`DOMAIN-SUFFIX,${domain}`);
|
||||
} else {
|
||||
domains.push(domain);
|
||||
sortedDomainRules.push(`DOMAIN,${domain}`);
|
||||
|
||||
Reference in New Issue
Block a user