09ccc67799155ed114967f281f93638bd1b6e611
三处都是"每个组件各自正确、合起来坏了"的接缝缺陷,其中第一处按部署文档 配置时必然命中。 1. 中继没有校验握手签名的能力。校验器被设计成 agent 条目上的 verify 回调, 而所有测试都注入了桩,于是唯一真实存在的校验器就是那些桩:按 docs/deployment.md 写的配置里没有它,第二次 hello 抛 "agent.verify is not a function",对每台节点回 500。现在配置只接受 signKey(base64 Ed25519 公钥),中继自己验签,能验不能签;密钥缺失、 长度不对或非规范 base64 一律拒绝启动——一个启动后拒绝全机群的"健康" 中继比启动失败更难查。msa-keygen 的输出与部署文档同步补上该字段。 2. agent 断线后中继永远认为它在线。此前只有进程关闭才 detach,而节点被杀、 断电、拔网线留下的只是一个关闭的 socket:节点会永远在线,手机的每条请求 白等 30 秒并收到"节点可能已执行"——实际没有任何东西在监听。现在长轮询的 socket 断开即判定离线(比对 session token,避免陈旧连接顶掉新会话), 实测从 504/30009ms 变为 503/5ms。 3. 重新握手丢弃邮箱。attach() 整体替换节点记录,连带丢掉已排队的信封, 于是重连窗口内到达的请求被静默丢弃、手机 5 秒后收到"节点离线",而节点 其实刚连上。重握手在每次会话过期与每次重连都会发生,是常规路径而非边角。 现在邮箱与每个信封的 handover 期限跨重握手保留。 同时修掉同一节点第二个长轮询孤儿化第一个的问题:两个 poll 共用槽位,后到的 覆盖先到的 resolve,前一个 promise 永不 settle、HTTP 请求一直挂着。现役 agent 串行轮询碰不到,--once 与守护进程同跑就会命中。现在每个 poll 有自己的 槽位,被顶掉的那个立刻以空结果返回。 测试新增三个文件,并全部改用真实密钥(verify 桩已消失): - test/config.test.js 只经 start() + 环境变量启动中继并完成握手。第一个缺陷 能存在,正是因为没有任何测试走这条装载路径——e2e.test.js 自己构造 createRelay 参数,把配置装载整个绕过了。 - test/liveness.test.js 七项节点生死与重连性质,两个方向的错误都断言: 漏判(死节点永远在线)与误判(陈旧 socket 顶掉新会话)。 - test/hello.test.js 把握手签名的字节直接与 Go 源码里的字面量比对,并断言 NUL 分隔符两侧一致——这是 relay 与 agent 之间唯一没有共享代码可依赖的地方。 四处修复都做了变异验证:改回旧行为后对应测试必失败。 Node 82 项、Go 全包、Swift 99 项、端到端(真编译运行 Go agent 经 TLS 接真中继) 全部通过。
Description
Outbound-only node agent for SimAdmin nodes: long-polls a relay, verifies signed envelopes, and forwards to the local SimAdmin on loopback. Static Go binary, no third-party modules.
268 KiB
Releases
3
simadmin-relay agent 1.0.2
Latest
Languages
Go
96.8%
Shell
2.4%
Makefile
0.8%