feat(session): 实现同平台抢登互踢功能,优化会话踢下线逻辑

新增同平台会话踢下线能力,将iOS/Android/mobile归为同一移动分组,web仅匹配web;扩展会话存储接口支持按平台、带原因踢除会话,同步更新集群广播逻辑与各调用点,统一传递踢下线原因参数
This commit is contained in:
Austin
2026-09-16 10:23:27 +08:00
parent dbb0a06db0
commit 4280b535c2
6 changed files with 124 additions and 9 deletions
+5 -3
View File
@@ -824,7 +824,7 @@ func changeUserState(s *Session, uid types.Uid, user *types.User, msg *ClientCom
if state != types.StateOK {
// Terminate all sessions.
globals.sessionStore.EvictUser(uid, "")
globals.sessionStore.EvictUser(uid, "", "user_state_changed")
publishRealtimeEvictUser(s.tenantID, uid, "user_state_changed", "")
}
@@ -900,7 +900,7 @@ func replyDelUser(s *Session, msg *ClientComMessage) {
}
// Terminate all sessions. Skip the current session so the requester gets a response.
globals.sessionStore.EvictUser(uid, s.sid)
globals.sessionStore.EvictUser(uid, s.sid, "user_deleted")
publishRealtimeEvictUser(s.tenantID, uid, "user_deleted", s.sid)
// Remove user from cache and announce to cluster that the user is deleted.
usersRemoveUser(msg.TenantID, uid)
@@ -944,7 +944,9 @@ func replyDelUser(s *Session, msg *ClientComMessage) {
if s.uid == uid && s.multi == nil {
// Evict the current session if it belongs to the deleted user.
// No need to send it to multiplexing session: remote node will be notified separately.
_, data := s.serialize(NoErrEvicted("", "", msg.Timestamp))
evicted := NoErrEvicted("", "", msg.Timestamp)
evicted.Ctrl.Params = map[string]any{"reason": "user_deleted"}
_, data := s.serialize(evicted)
s.stopSession(data)
}
}