Skip to content

v2.0.0

Choose a tag to compare

@github-actions github-actions released this 27 Aug 04:51
· 97 commits to main since this release

破坏性变更

  • 命名统一,消灭两个"codec"的混淆:帧定界侧改名——IFrameCodec→IFramer、IStreamingFrameCodec→IStreamingFramer、LengthPrefixFrameCodec→LengthPrefixFramer、StxEtxFrameCodec→StxEtxFramer;"codec"一词从此只指帧内编解码 ICodec<TMessage>。
  • 命名空间收敛:删除 StreamFrame.Abstractions,所有公共类型统一进根命名空间 StreamFrame——用户只需一个 using StreamFrame;(此前具体实现类住在 "Abstractions" 命名空间里,名不副实)。
  • Start(ct) 的 ct 升级为生命周期令牌:取消它会停止连接/重连并拆线(Disconnected 终态、GetMessages 自然结束、之后需新建连接),与 DisposeAsync 共用同一条幂等停机路径。1.x 中取消已连接的连接毫无作用且未如实文档化。
  • ConnectionState 新增 Disconnected 终态:停机时广播;1.x 取消/停机后状态停留在 Connecting。
  • DeviceIpAddress→RemoteIpAddress(string?):语义修正——主动模式为配置的远端地址,被动模式为已连接客户端地址(未连接为 null,不再返回魔法值 "NA");双栈下 IPv4 客户端地址归一显示为 IPv4。
  • IStreamConnection<TMessage> 新增 WaitForConnectedAsync(接口实现者需适配;此前 1.2.0 的 FrameError 已属破坏,一并归入 2.0)。
  • socket 改为 IPv6 双栈(同一 socket 同时支持 IPv4/IPv6;监听 IPAddress.Any 自动按双栈处理)。1.x 仅 IPv4。

修复

  • 主动模式连接失败重试不再泄漏 socket:ConnectAsync 失败/取消时立即释放本次尝试创建的 socket(此前每次失败重试泄漏一个,等终结器回收)。
  • CHANGELOG 底部版本对比链接补齐 [1.2.0] 并修正 [Unreleased] 指向(v1.2.0 发版时漏更新)。

变更

  • Start 重入防护:重复调用抛 InvalidOperationException(此前并发/重复 Start 会各自建立 socket 并互相覆盖,泄漏连接);重建连接请用 Reconnect()。
  • 发布管线合并为单条流水线 release.yml:tag 触发"版本号校验 → 构建 → 测试 → GitHub Release → 推 nuget.org",测试未通过不会发包(此前发布与推送是两条独立 workflow,测试失败时包仍会被推出)。workflow_dispatch 手动触发仅做构建+测试演练,不发布;需重发版本时在对应 tag 的运行记录上 Re-run(推送带 --skip-duplicate,幂等)。
  • tag 与两个 csproj 的 <Version> 一致性在流水线中显式校验,不一致直接失败(此前会静默发出错误版本号的包)。

新增

  • 代码质量棘轮:引入 Meziantou.Analyzer(SDK 自带 NetAnalyzers 之上的补充规则)与 .editorconfig,现存告警清零并把库项目的 TreatWarningsAsErrors 打开(告警即构建失败);FrameErrorKind/DecodeErrorPolicy 拆分为独立文件(一类型一文件)。
  • WaitForConnectedAsync:等待连接进入 Connected(已连接立即完成;取消或 Dispose 以取消结束),替代轮询状态或 Task.Delay 盲等;demo 全部改用该 API。
  • 可选 ILogger 构造参数:连接重试、会话故障、用户回调异常等内部事件输出到日志(此前 Debug.WriteLine 在 Release 构建中完全不可见,生产排障只能靠猜)。
  • ReceiveQueueCapacity 选项:接收消息通道可设上限(默认 0 不限制);消费慢时解码暂停读取、TCP 背压自然传导到对端,封堵慢消费者导致的内存无限增长。
  • 选项构造校验:非法取值(负延迟、0 队列容量等)在构造时抛清晰的 ArgumentOutOfRangeException(此前在运行中的重连/收发路径深处抛难定位的异常)。
  • LICENSE 文件(MIT 此前只在 README 与包元数据中声明,仓库内无正文)。
  • push / PR 持续集成 ci.yml(构建 + 测试),回归不再等到发版才暴露。