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
+9 -15
View File
@@ -1,13 +1,11 @@
/**
* Chat 状态机:State 形状 + 初始值
*
* 注:GuestChatQuota 仍位于 chat-machine.ts(属于业务常量,与上下文配对紧密)。
*
* 新增 `wsConnected: boolean`(仅 userSession 期间 true):
* - WS 已连 → 消息发送走 WS,不消耗次数
* - WS 未连 → 消息发送走 HTTP,消耗次数
* `wsConnected: boolean` 仅 VIP 会话期间有意义:
* - VIP + WS 已连 → 消息发送走 WS
* - 非 VIP / 游客 → 不连接 WS,消息走 HTTP
* - `ChatWebSocketConnected` 事件 → true
* - `userSession.exit` → falseWS actor cleanup 时也会跑 exit
* - VIP 会话 exit → falseWS actor cleanup 时也会跑 exit
*/
import type { UiMessage } from "@/data/dto/chat";
@@ -15,14 +13,11 @@ export interface ChatState {
messages: UiMessage[];
isReplyingAI: boolean;
/**
* WebSocket 连接状态(仅 userSession 期间 true
* - 决定消息发送路径(WS / HTTP)和是否消耗次数
* - true:走 WS,不消耗次数
* - false:走 HTTP,消耗次数
* WebSocket 连接状态(仅 VIP 用户会话期间 true
* - VIP true:走 WS
* - 非 VIP / 游客:固定 false,走 HTTP
*/
wsConnected: boolean;
/** 当前非游客用户是否 VIP;游客会话固定 false。 */
isVip: boolean;
/** 游客剩余配额(次/天)—— 仅游客业务展示用
*/
guestRemainingQuota: number;
@@ -37,11 +32,11 @@ export interface ChatState {
historyOffset: number;
/** 游客配额加载完成标志(仅 guestSession 期间) —— default false
* - guestSession.initializing 走 always barrier`quotaLoaded && historyLoaded` 才进 ready
* - userSession 永不为 true(不调 loadQuota)—— OK,不影响 barrier
* - user sessions 永不为 true(不调 loadQuota)—— OK,不影响 barrier
*/
quotaLoaded: boolean;
/** history 加载完成标志(initial load —— local → network → save 跑完)
* - guestSession.initializing / userSession.initializing 走 always barrier
* - guestSession.initializing / user sessions initializing 走 always barrier
* - 不被 `loadMoreHistoryActor` 设置(翻页是另一码事)
*/
historyLoaded: boolean;
@@ -51,7 +46,6 @@ export const initialState: ChatState = {
messages: [],
isReplyingAI: false,
wsConnected: false,
isVip: false,
guestRemainingQuota: 0,
guestTotalQuota: 0,
quotaExceededTrigger: 0,