Repository navigation
v0.10.0
Release of oekit/network v0.10.0(annotated tag,由 release_train 门禁后打点)。
变更记录
- fix(streamx): SSESink.Emit 的关闭检查与 stream 写入原子化(#144)——#117 在 wsutil.Outbox 修掉的同构竞态换包复活:closed 检查与写入两步无 happens-before,Close 可插进中间,通过检查的 Emit 把事件写进已关 stream、返回底层 stream 错误而非 ErrSinkClosed(契约「Close 后 Emit 返回 ErrSinkClosed」被击穿,Hub 把正常关闭当 sink 故障留痕)。现照 #117 修法把两步纳入同一临界区(Emit 持 RLock、Close 持 Lock,Close 等在途 Emit 写完才关 stream——慢消费者在途写会推迟 Close 返回,契约明示),Sink 接口契约同步写明原子要求
关联问题单:#144。
- fix(mq): MQClient.Close 改 Close(ctx) error(BREAKING)(#143)——门面此前把无 ctx 的 Close() error 写进契约,与 AGENTS.md「组件 Close 统一 Close(ctx) error」硬规则及同仓 nats.Client 实现三方分裂:实现者只能无界关停(#83/#86 事故形态,ctx 上界入口都没有)或放弃门面。现接口与全部实现统一 Close(ctx) error(Go 不支持同名重载,无参形态移除,调用点改 c.Close(context.Background())),Requester.Request/RequestJSON 的「ctx 截止与 timeout 谁压谁」同步写死:先到先生效(min 语义,context.WithTimeout 同款),timeout ≤ 0 不是「不限时」而是立即到期(同 sshx #106 的两截止源教训)
关联问题单:#143。
- fix(wsutil): Broadcaster.writeMu 锁条目随 Conn 生命周期回收(#142)——条目此前无任何 Delete 路径,每见过一个 Conn 永久多一条 Conn→锁 强引用,断开的 websocket Conn 连同读写缓冲永远无法 GC,轮换型推送服务 RSS 随历史连接总数线性增长、永不回落。现按安全回收协议回收(无在途写协程窗口 且 conn 不属任何房间才删,users 计数盖住「取到条目、尚未加锁」的缝隙,恒等校验防换锁):写协程归还与 Unregister 收尾两处收尾,#87 的同锁串行保证不受影响(在途窗口内条目必留)
关联问题单:#142。
- 现代语言特性(贴合处落地):clear(Broadcaster.Close 丢弃条目表)、for range int(churn 轮换回归)、errors.Join(并发 emit/close 错误聚合)、sync.Once(SSESink.Close 幂等——「仅首次返回结果」口径贴 nats.Close 先例,故用 Do + 局部结果而非 OnceValue 的结果缓存形态)
矩阵内依赖地板(该 tag 的 go.mod,CI 验证过的组合)
github.com/oekit/concurrency v0.32.0
github.com/oekit/logx v0.9.2
github.com/oekit/tracing v0.3.10