浏览代码

Experimental Surfboard support

SukkaW 10 月之前
父节点
当前提交
c3e4a1a445
共有 4 个文件被更改,包括 29 次插入1 次删除
  1. 1 0
      Build/constants/dir.ts
  2. 2 0
      Build/lib/rules/ruleset.ts
  3. 25 0
      Build/lib/writing-strategy/surfboard.ts
  4. 1 1
      Build/lib/writing-strategy/surge.ts

+ 1 - 0
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_CLASH_DIR = path.resolve(PUBLIC_DIR, 'Clash');
 export const OUTPUT_LEAGCY_CLASH_PREMIUM_DIR = path.resolve(PUBLIC_DIR, 'LegacyClashPremium');
 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_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_DIR = path.resolve(PUBLIC_DIR, 'Modules');
 export const OUTPUT_MODULES_RULES_DIR = path.resolve(OUTPUT_MODULES_DIR, 'Rules');
 export const OUTPUT_MODULES_RULES_DIR = path.resolve(OUTPUT_MODULES_DIR, 'Rules');
 export const OUTPUT_INTERNAL_DIR = path.resolve(PUBLIC_DIR, 'Internal');
 export const OUTPUT_INTERNAL_DIR = path.resolve(PUBLIC_DIR, 'Internal');

+ 2 - 0
Build/lib/rules/ruleset.ts

@@ -2,6 +2,7 @@ import type { Span } from '../../trace';
 import { ClashClassicRuleSet } from '../writing-strategy/clash';
 import { ClashClassicRuleSet } from '../writing-strategy/clash';
 import { LegacyClashPremiumClassicRuleSet } from '../writing-strategy/legacy-clash-premium';
 import { LegacyClashPremiumClassicRuleSet } from '../writing-strategy/legacy-clash-premium';
 import { SingboxSource } from '../writing-strategy/singbox';
 import { SingboxSource } from '../writing-strategy/singbox';
+import { SurfboardRuleSet } from '../writing-strategy/surfboard';
 import { SurgeRuleSet } from '../writing-strategy/surge';
 import { SurgeRuleSet } from '../writing-strategy/surge';
 import { FileOutput } from './base';
 import { FileOutput } from './base';
 
 
@@ -13,6 +14,7 @@ export class RulesetOutput extends FileOutput {
       new SurgeRuleSet(type),
       new SurgeRuleSet(type),
       new ClashClassicRuleSet(type),
       new ClashClassicRuleSet(type),
       new LegacyClashPremiumClassicRuleSet(type),
       new LegacyClashPremiumClassicRuleSet(type),
+      new SurfboardRuleSet(type),
       new SingboxSource(type)
       new SingboxSource(type)
     ];
     ];
   }
   }

+ 25 - 0
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<string>): void {
+    // https://getsurfboard.com/docs/profile-format/rule/misc
+    appendSetElementsToArray(this.result, port, i => `IN-PORT,${i}`);
+  }
+
+  override writeOtherRules = noop;
+}

+ 1 - 1
Build/lib/writing-strategy/surge.ts

@@ -48,7 +48,7 @@ export class SurgeDomainSet extends BaseWriteStrategy {
 }
 }
 
 
 export class SurgeRuleSet extends BaseWriteStrategy {
 export class SurgeRuleSet extends BaseWriteStrategy {
-  public readonly name = 'surge ruleset';
+  public readonly name: string = 'surge ruleset';
 
 
   readonly fileExtension = 'conf';
   readonly fileExtension = 'conf';