namespace Fleet.Server; public sealed class FleetServerOptions { /// 节点 ID 的类型前缀,MoShiro 使用 agt。 public string NodeIdPrefix { get; set; } = "node"; /// 加入令牌的「种类」对应的节点 ID 前缀(例如 edge → edg);没有列出的种类用 。 public Dictionary NodeIdPrefixes { get; } = new(StringComparer.Ordinal); public int MaxFrameBytes { get; set; } = 16 << 20; public TimeSpan ChallengeTtl { get; set; } = TimeSpan.FromSeconds(30); public TimeSpan HeartbeatTimeout { get; set; } = TimeSpan.FromSeconds(45); public TimeSpan RequestTimeout { get; set; } = TimeSpan.FromSeconds(15); /// 处理节点的一条消息(心跳、hello、收件箱)最多用这么久:钩子卡在数据库或外部查询里时,不能让这条连接停在「在线」而收不到任何心跳超时。超过就断开,节点按退避重连。 public TimeSpan HandlerTimeout { get; set; } = TimeSpan.FromSeconds(30); /// 节点违反协议(方法没有声明、方向、类型或角色不对)的次数上限;超过就断开这条连接。 public int MaxViolations { get; set; } = 20; } /// 握手时的版本要求:服务端的版本(告诉节点),以及节点至少要是哪个版本。每次握手都重新取,所以改配置不用重启。 public interface IFleetVersionPolicy { string? ServerVersion { get; } /// 空表示不要求。 string? MinNodeVersion { get; } }