refactor(chat): split sessions by vip status

This commit is contained in:
2026-06-22 15:11:57 +08:00
parent b105ba3457
commit 6ff1accad5
5 changed files with 225 additions and 81 deletions
+4 -4
View File
@@ -31,8 +31,8 @@ const log = new Logger("StoresChatChatMachineActors");
* 为什么用 module-level 而非 context.wsRef
* 1) `ChatWebSocket` 是带回调 + 重连 timer 的非可序列化对象,放进
* XState context 会污染快照、警告 non-serializable
* 2) userSession 同一时间只可能有一个活跃 WSparent-level invoke),
* module 单例的语义和"userSession 内一个活跃连接"一一对应
* 2) vipUserSession 同一时间只可能有一个活跃 WSparent-level invoke),
* module 单例的语义和"VIP 会话内一个活跃连接"一一对应
* 3) 不需要重构 ChatWebSocket 类的对外 API
*/
let activeChatWebSocket: ChatWebSocket | null = null;
@@ -123,7 +123,7 @@ export const loadMoreHistoryActor = fromPromise<
// WebSocket: long-lived callback
// ============================================================
/**
* 长生命周期 WebSocket(仅 `userSession` 期间 invoke
* 长生命周期 WebSocket(仅 `vipUserSession` 期间 invoke
* - 启动:连 WS,事件 → sendBack 派回机器
* - 停止(cleanup):disconnect
* - 游客不 invoke 此 actor(业务事实"游客不连 WS"
@@ -170,7 +170,7 @@ export const chatWebSocketActor = fromCallback<ChatEvent, { token: string }>(
// WebSocket: per-send callback
// ============================================================
/**
* WS 发送消息(userSession.sendingViaWs 期间 invoke
* WS 发送消息(vipUserSession.sendingViaWs 期间 invoke
* - 走 `activeChatWebSocket.sendMessage(content)`
* - 成功后 AI 回复通过 `chatWebSocketActor` 的 `onSentence` → `ChatAISentenceReceived` 流回
* - 失败抛错 → state machine 的 `onError` 兜底(清 isReplyingAI、回 ready