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; }
}