using System.Text.Json.Nodes; using Proxd_man.Config.Stream; using Proxd_man.Config.TransportLayerSecurity; namespace Proxd_man.Config.Outbound; /// /// 基本的出站代理配置类. /// /// 所有协议的出站配置都要继承这个类. /// public abstract class BaseOutboundSetting { /// /// 出站配置名称. /// /// 便于管理的名字, 可以直接从订阅中获取. /// public required string Name { get; init; } /// /// 发送出站数据所使用的网卡地址. /// public string? BindAddress { get; init; } /// /// 出站代理协议类型. /// public OutboundProtocolType Protocol { get; init; } public string? Address { get; init; } public BaseStreamSetting StreamSetting { get; init; } = new RawStreamSetting(); public BaseTransportLayerSecuritySetting TransportLayerSecuritySetting { get; init; } = new NoneSecuritySetting(); public string? NextOutboundTag { get; init; } = null; /// /// 根据Xray-Core 的配置文件格式, /// 生成对应的 OutboundObject JSON 配置. /// /// public virtual JsonObject ToJsonSetting() { var root = new JsonObject { { "protocol", Protocol.ToString().ToLower() }, { "tag", GetTag() }, { "settings", GetProtocolSetting() } }; if (!string.IsNullOrEmpty(BindAddress)) { root.Add("sendThrough", BindAddress); } if (!string.IsNullOrEmpty(NextOutboundTag)) { root.Add("proxySettings", new JsonObject { { "tag", NextOutboundTag } }); } else { var streamSetting = StreamSetting.ToJsonSetting(); TransportLayerSecuritySetting.ApplyJsonSetting(streamSetting); root.Add("streamSettings", streamSetting); } return root; } /// /// 实现依据配置内容, 生成对应的 Outbound Tag. /// /// 返回该 Outbound 的 Tag, 最好唯一. public abstract string GetTag(); /// /// 实现类依据自身对应协议类型的设定, 生成对应的 V2Ray/Xray-Core Outbound Protocol Setting JSON 对象. /// /// 返回协议配置的 JSON 对象. protected abstract JsonObject? GetProtocolSetting(); }