refactor(weixin-ilink): 措辞纠正 —「会话过期」→「会话被 iLink 拒绝」(零逻辑改动)
CI / Backend (build / vet / test / cross-compile) (push) Has been cancelled
CI / Frontend (tsc + vite build) (push) Has been cancelled

事实(主人 2026-10-03 确认):iLink 的 bot token 是长期凭据(一个月前扫码的仍可用);errcode=-14 是 iLink 侧拒绝/作废该会话,不是时间性过期;且至今未观测到真实 -14(当日全部日志 0 次)。此前代码把这些写成「过期」,属沿用的旧命名,现纠正。
- 纯改名/文案:ErrSessionExpired→ErrSessionRejected、errSessionExpired→errcodeSessionRejected、expired/expiredToken→rejected/rejectedToken、markExpired/expiredLocked/expiredState→markRejected/rejectedLocked/rejectedState;409 错误码 session_expired→session_rejected
- 行为一字未改:显式标记 / Connect 不假 OK / 面板 needsRescan+lastError / 扫码或换新 token 即清除 全部保留
- 微信协议自身的「二维码过期」与 auth 的 JWT/refresh 过期一律未动(那些是真·时间性过期)
- Docs/api-client v0.39 补事实说明;顺手收尾 3 处残留注释(admin.go / channelbridge/inbound.go / readloop_test.go)
This commit is contained in:
AskaEth committed 2026-10-03 18:26:27 +08:00
1 parent cdc370dc82
commit a51aadeef4
14 files changed
+205 -192

No files matched your search

+8 -8
View File
@@ -35,7 +35,7 @@ const (
type getupdatesResp struct {
// Ret is the top-level business result; non-zero is a transient error.
Ret int `json:"ret"`
// Errcode is the platform error code; -14 means the session expired.
// Errcode is the platform error code; -14 means iLink rejected the session.
Errcode int `json:"errcode"`
// Msgs holds the raw inbound messages delivered in this poll.
Msgs []json.RawMessage `json:"msgs"`
@@ -94,13 +94,13 @@ func (a *Adapter) ReadMessages(ctx context.Context, emit func(adapter.UnifiedMes
}
failures = 0
if resp.Errcode == errSessionExpired {
// The bot token is dead: retrying cannot help and the poll loop would go
// mute for good. Record the explicit expired state (which also drops the
// connected flag and logs at ERROR) and stop the loop; the owner has to
// re-scan, and everything downstream sees ErrSessionExpired until a fresh
// token arrives.
a.markExpired(rescanReasonGetUpdates)
if resp.Errcode == errcodeSessionRejected {
// iLink rejected this session credential: retrying cannot help and the poll
// loop would go mute for good. Record the explicit rejected state (which also
// drops the connected flag and logs at ERROR) and stop the loop; the owner
// has to re-scan, and everything downstream sees ErrSessionRejected until a
// fresh token arrives.
a.markRejected(rescanReasonGetUpdates)
return
}
if resp.Ret != 0 {