From c3e4a1a4451ee19bfc2ba39f6beb505e63d6e27b Mon Sep 17 00:00:00 2001 From: SukkaW Date: Sat, 3 May 2025 22:42:45 +0800 Subject: [PATCH] Experimental Surfboard support --- Build/constants/dir.ts | 1 + Build/lib/rules/ruleset.ts | 2 ++ Build/lib/writing-strategy/surfboard.ts | 25 +++++++++++++++++++++++++ Build/lib/writing-strategy/surge.ts | 2 +- 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 Build/lib/writing-strategy/surfboard.ts diff --git a/Build/constants/dir.ts b/Build/constants/dir.ts index 3918ecd9..aee9c066 100644 --- a/Build/constants/dir.ts +++ b/Build/constants/dir.ts @@ -13,6 +13,7 @@ export const OUTPUT_SURGE_DIR = path.join(PUBLIC_DIR, 'List'); export const OUTPUT_CLASH_DIR = path.resolve(PUBLIC_DIR, 'Clash'); export const OUTPUT_LEAGCY_CLASH_PREMIUM_DIR = path.resolve(PUBLIC_DIR, 'LegacyClashPremium'); export const OUTPUT_SINGBOX_DIR = path.resolve(PUBLIC_DIR, 'sing-box'); +export const OUTPUT_SURFBOARD_DIR = path.resolve(PUBLIC_DIR, 'Surfboard'); export const OUTPUT_MODULES_DIR = path.resolve(PUBLIC_DIR, 'Modules'); export const OUTPUT_MODULES_RULES_DIR = path.resolve(OUTPUT_MODULES_DIR, 'Rules'); export const OUTPUT_INTERNAL_DIR = path.resolve(PUBLIC_DIR, 'Internal'); diff --git a/Build/lib/rules/ruleset.ts b/Build/lib/rules/ruleset.ts index 9e9cee02..d3f8f3ff 100644 --- a/Build/lib/rules/ruleset.ts +++ b/Build/lib/rules/ruleset.ts @@ -2,6 +2,7 @@ import type { Span } from '../../trace'; import { ClashClassicRuleSet } from '../writing-strategy/clash'; import { LegacyClashPremiumClassicRuleSet } from '../writing-strategy/legacy-clash-premium'; import { SingboxSource } from '../writing-strategy/singbox'; +import { SurfboardRuleSet } from '../writing-strategy/surfboard'; import { SurgeRuleSet } from '../writing-strategy/surge'; import { FileOutput } from './base'; @@ -13,6 +14,7 @@ export class RulesetOutput extends FileOutput { new SurgeRuleSet(type), new ClashClassicRuleSet(type), new LegacyClashPremiumClassicRuleSet(type), + new SurfboardRuleSet(type), new SingboxSource(type) ]; } diff --git a/Build/lib/writing-strategy/surfboard.ts b/Build/lib/writing-strategy/surfboard.ts new file mode 100644 index 00000000..a370115a --- /dev/null +++ b/Build/lib/writing-strategy/surfboard.ts @@ -0,0 +1,25 @@ +import { noop } from 'foxts/noop'; +import { SurgeRuleSet } from './surge'; +import { OUTPUT_SURFBOARD_DIR } from '../../constants/dir'; +import { appendSetElementsToArray } from 'foxts/append-set-elements-to-array'; + +export class SurfboardRuleSet extends SurgeRuleSet { + public override readonly name: string = 'surfboard for android ruleset'; + + protected result: string[] = ['DOMAIN,this_ruleset_is_made_by_sukkaw.ruleset.skk.moe']; + constructor(public readonly type: 'ip' | 'non_ip' /* | (string & {}) */, public readonly outputDir = OUTPUT_SURFBOARD_DIR) { + super(type, outputDir); + } + + override writeDomainWildcards = noop; + override writeUserAgents = noop; + override writeUrlRegexes = noop; + override writeIpAsns = noop; + + override writeSourcePorts(port: Set): void { + // https://getsurfboard.com/docs/profile-format/rule/misc + appendSetElementsToArray(this.result, port, i => `IN-PORT,${i}`); + } + + override writeOtherRules = noop; +} diff --git a/Build/lib/writing-strategy/surge.ts b/Build/lib/writing-strategy/surge.ts index 152ec015..a19c629c 100644 --- a/Build/lib/writing-strategy/surge.ts +++ b/Build/lib/writing-strategy/surge.ts @@ -48,7 +48,7 @@ export class SurgeDomainSet extends BaseWriteStrategy { } export class SurgeRuleSet extends BaseWriteStrategy { - public readonly name = 'surge ruleset'; + public readonly name: string = 'surge ruleset'; readonly fileExtension = 'conf';