@@ -250,7 +250,6 @@ class MessageManager {
async initialize ( ) : Promise < void > {
if ( this . state . isInitialized ) {
console . log ( '[MessageManager] 已经初始化,跳过' ) ;
return ;
}
@@ -259,7 +258,6 @@ class MessageManager {
return ;
}
console . log ( '[MessageManager] 开始初始化' ) ;
this . initializePromise = ( async ( ) = > {
try {
@@ -280,7 +278,6 @@ class MessageManager {
await this . fetchUnreadCount ( ) ;
this . state . isInitialized = true ;
console . log ( '[MessageManager] 初始化完成' ) ;
this . notifySubscribers ( {
type : 'conversations_updated' ,
@@ -310,7 +307,6 @@ class MessageManager {
}
destroy ( ) : void {
console . log ( '[MessageManager] 销毁资源' ) ;
if ( this . wsUnsubscribe ) {
this . wsUnsubscribe ( ) ;
this . wsUnsubscribe = null ;
@@ -328,41 +324,34 @@ class MessageManager {
this . wsUnsubscribe ( ) ;
}
console . log ( '[MessageManager] 初始化WebSocket监听' ) ;
// 监听私聊消息
websocketService . on ( 'chat' , ( message : WSChatMessage ) = > {
console . log ( '[MessageManager] 收到私聊消息:' , message . id ) ;
this . handleNewMessage ( message ) ;
} ) ;
// 监听群聊消息
websocketService . on ( 'group_message' , ( message : WSGroupChatMessage ) = > {
console . log ( '[MessageManager] 收到群聊消息:' , message . id ) ;
this . handleNewMessage ( message ) ;
} ) ;
// 监听私聊已读回执
websocketService . on ( 'read' , ( message : WSReadMessage ) = > {
console . log ( '[MessageManager] 收到已读回执:' , message ) ;
this . handleReadReceipt ( message ) ;
} ) ;
// 监听群聊已读回执
websocketService . on ( 'group_read' , ( message : WSGroupReadMessage ) = > {
console . log ( '[MessageManager] 收到群聊已读回执:' , message ) ;
this . handleGroupReadReceipt ( message ) ;
} ) ;
// 监听私聊消息撤回
websocketService . on ( 'recall' , ( message : WSRecallMessage ) = > {
console . log ( '[MessageManager] 收到私聊撤回:' , message ) ;
this . handleRecallMessage ( message ) ;
} ) ;
// 监听群聊消息撤回
websocketService . on ( 'group_recall' , ( message : WSGroupRecallMessage ) = > {
console . log ( '[MessageManager] 收到群聊撤回:' , message ) ;
this . handleGroupRecallMessage ( message ) ;
} ) ;
@@ -373,13 +362,11 @@ class MessageManager {
// 监听群通知
websocketService . on ( 'group_notice' , ( message : WSGroupNoticeMessage ) = > {
console . log ( '[MessageManager] 收到群通知:' , message ) ;
this . handleGroupNotice ( message ) ;
} ) ;
// 监听连接状态
websocketService . onConnect ( ( ) = > {
console . log ( '[MessageManager] WebSocket已连接' ) ;
this . state . isWebSocketConnected = true ;
this . notifySubscribers ( {
type : 'connection_changed' ,
@@ -403,7 +390,6 @@ class MessageManager {
} ) ;
websocketService . onDisconnect ( ( ) = > {
console . log ( '[MessageManager] WebSocket已断开' ) ;
this . state . isWebSocketConnected = false ;
this . notifySubscribers ( {
type : 'connection_changed' ,
@@ -595,29 +581,15 @@ class MessageManager {
const currentUserId = this . getCurrentUserId ( ) ;
// 【调试日志】追踪消息来源和重复问题
console . log ( '[MessageManager][DEBUG] 处理新消息:' , {
messageId : id ,
conversationId : normalizedConversationId ,
senderId : sender_id ,
seq ,
currentUserId ,
messageType : message.type ,
isAck : _isAck ,
currentConversationId : this.state.currentConversationId ,
isActiveConversation : normalizedConversationId === this . state . currentConversationId ,
timestamp : Date.now ( ) ,
} ) ;
// 0. 如果是ACK消息, 直接跳过不增加未读数( ACK是发送确认, 不是新消息)
if ( _isAck ) {
console . log ( '[MessageManager][DEBUG] ACK消息, 跳过未读数处理:' , id ) ;
// 但仍然需要更新消息列表( 因为ACK包含完整消息内容)
// 继续处理但不增加未读数
}
// 1. 消息去重检查 - 防止ACK消息和正常消息重复处理
if ( this . isMessageProcessed ( id ) ) {
console . log ( '[MessageManager][DEBUG] 消息已处理,跳过:' , id ) ;
return ;
}
this . markMessageAsProcessed ( id ) ;
@@ -627,7 +599,6 @@ class MessageManager {
// 异步获取发送者信息,不阻塞消息显示
this . getSenderInfo ( sender_id ) . then ( user = > {
if ( user ) {
console . log ( '[MessageManager][DEBUG] 获取到发送者信息:' , { userId : sender_id , nickname : user.nickname } ) ;
// 更新消息对象中的发送者信息
const messages = this . state . messagesMap . get ( normalizedConversationId ) ;
if ( messages ) {
@@ -636,7 +607,6 @@ class MessageManager {
m . id === id ? { . . . m , sender : user } : m
) ;
this . state . messagesMap . set ( normalizedConversationId , updatedMessages ) ;
console . log ( '[MessageManager][DEBUG] 更新消息发送者信息:' , { messageId : id , sender : user.nickname } ) ;
// 通知订阅者消息已更新
this . notifySubscribers ( {
type : 'messages_updated' ,
@@ -648,10 +618,9 @@ class MessageManager {
} ) ;
}
} else {
console . log ( '[MessageManager][DEBUG] 未能获取到发送者信息:' , { userId : sender_id } ) ;
}
} ) . catch ( error = > {
console . error ( '[MessageManager][DEBUG ] 获取发送者信息失败:' , { userId : sender_id , error } ) ;
console . error ( '[MessageManager][ERROR ] 获取发送者信息失败:' , { userId : sender_id , error } ) ;
} ) ;
}
@@ -694,15 +663,6 @@ class MessageManager {
const isActiveConversation = normalizedConversationId === this . state . currentConversationId ;
// 【调试日志】追踪未读数增加逻辑
console . log ( '[MessageManager][DEBUG] 未读数判断:' , {
messageId : id ,
sender_id ,
currentUserId ,
isCurrentUserMessage ,
isActiveConversation ,
currentConversationId : this.state.currentConversationId ,
shouldIncrement : ! isCurrentUserMessage && ! isActiveConversation ,
} ) ;
// 修复:确保当前用户发送的消息不会增加未读数
// 同时确保currentUserId有效( 避免undefined === undefined的情况)
@@ -710,15 +670,8 @@ class MessageManager {
const shouldIncrementUnread = ! isCurrentUserMessage && ! isActiveConversation && ! ! currentUserId && ! _isAck ;
if ( shouldIncrementUnread ) {
console . log ( '[MessageManager][DEBUG] 增加未读数:' , { conversationId : conversation_id , messageId : id } ) ;
this . incrementUnreadCount ( normalizedConversationId ) ;
} else {
console . log ( '[MessageManager][DEBUG] 跳过未读数增加:' , {
isCurrentUserMessage ,
isActiveConversation ,
hasCurrentUserId : ! ! currentUserId ,
isAck : _isAck ,
} ) ;
}
// 6. 如果是当前活动会话,自动标记已读
@@ -766,11 +719,6 @@ class MessageManager {
const conversation = this . state . conversations . get ( conversationId ) ;
if ( conversation ) {
console . log ( '[MessageManager][DEBUG] updateConversationWithNewMessage - 更新前:' , {
conversationId ,
prevUnreadCount : conversation.unread_count ,
conversationRef : conversation ,
} ) ;
// 更新现有会话
const updatedConv : ConversationResponse = {
@@ -783,13 +731,6 @@ class MessageManager {
this . state . conversations . set ( conversationId , updatedConv ) ;
console . log ( '[MessageManager][DEBUG] updateConversationWithNewMessage - 更新后:' , {
conversationId ,
newUnreadCount : updatedConv.unread_count ,
updatedConvRef : updatedConv ,
conversationInMap : this.state.conversations.get ( conversationId ) ,
isSameRef : updatedConv === this . state . conversations . get ( conversationId ) ,
} ) ;
} else {
// 新会话,需要获取详情
// 异步获取会话详情
@@ -812,14 +753,12 @@ class MessageManager {
*/
private handleReadReceipt ( message : WSReadMessage ) : void {
// 可以在这里处理对方已读的状态更新
console . log ( '[MessageManager] 处理已读回执:' , message ) ;
}
/**
* 处理群聊已读回执
*/
private handleGroupReadReceipt ( message : WSGroupReadMessage ) : void {
console . log ( '[MessageManager] 处理群聊已读回执:' , message ) ;
}
/**
@@ -1001,12 +940,10 @@ class MessageManager {
*/
async fetchConversations ( forceRefresh = false ) : Promise < void > {
if ( this . state . isLoadingConversations && ! forceRefresh ) {
console . log ( '[MessageManager] 会话列表正在加载中,跳过' ) ;
return ;
}
this . state . isLoadingConversations = true ;
console . log ( '[MessageManager] 获取会话列表' ) ;
try {
const response = await messageService . getConversations ( 1 , 20 , forceRefresh ) ;
@@ -1022,12 +959,6 @@ class MessageManager {
// 如果服务器返回的 unread_count > 0, 但本地有更晚的已读记录, 则保留本地状态
const shouldPreserveLocalRead = conv . unread_count > 0 ;
if ( shouldPreserveLocalRead ) {
console . log ( '[MessageManager] fetchConversations 保护已读状态:' , {
conversationId : conv.id ,
serverUnread : conv.unread_count ,
readTimestamp : readRecord.timestamp ,
version : readRecord.version ,
} ) ;
this . state . conversations . set ( conv . id , { . . . conv , unread_count : 0 } ) ;
} else {
this . state . conversations . set ( conv . id , conv ) ;
@@ -1056,10 +987,6 @@ class MessageManager {
}
}
console . log ( '[MessageManager] 会话列表获取完成:' , {
count : conversations.length ,
totalUnread ,
} ) ;
// 通知更新
this . notifySubscribers ( {
@@ -1134,12 +1061,10 @@ class MessageManager {
async fetchMessages ( conversationId : string , afterSeq? : number ) : Promise < void > {
// 防止重复加载
if ( this . state . loadingMessagesSet . has ( conversationId ) ) {
console . log ( '[MessageManager] 消息正在加载中,跳过:' , conversationId ) ;
return ;
}
this . state . loadingMessagesSet . add ( conversationId ) ;
console . log ( '[MessageManager][DEBUG] 获取消息开始:' , { conversationId , afterSeq , currentConversationId : this.state.currentConversationId , timestamp : Date.now ( ) } ) ;
try {
const mergeMessages = ( base : MessageResponse [ ] , incoming : MessageResponse [ ] ) : MessageResponse [ ] = > {
@@ -1163,7 +1088,6 @@ class MessageManager {
console . warn ( '[MessageManager] 读取本地消息失败,回退到服务端同步:' , error ) ;
}
console . log ( '[MessageManager] 本地消息:' , { count : localMessages.length , maxSeq : localMaxSeq } ) ;
if ( localMessages . length > 0 ) {
// 转换格式
@@ -1179,7 +1103,6 @@ class MessageManager {
// 立即更新内存和通知(关键:解决竞态条件)
this . state . messagesMap . set ( conversationId , formattedMessages ) ;
console . log ( '[MessageManager][DEBUG] 本地消息已加载,通知订阅者:' , { conversationId , messageCount : formattedMessages.length , timestamp : Date.now ( ) } ) ;
this . notifySubscribers ( {
type : 'messages_updated' ,
payload : {
@@ -1283,7 +1206,6 @@ class MessageManager {
// 2.2 再基于 localMaxSeq 做增量补齐(防止快照窗口不足导致漏更老的新消息)
const snapshotMaxSeq = snapshotMessages . reduce ( ( max , m ) = > Math . max ( max , m . seq || 0 ) , 0 ) ;
if ( snapshotMaxSeq > localMaxSeq ) {
console . log ( '[MessageManager] 增量补齐:' , { localMaxSeq , snapshotMaxSeq } ) ;
const incrementalResp = await messageService . getMessages ( conversationId , localMaxSeq ) ;
const newMessages = incrementalResp ? . messages || [ ] ;
if ( newMessages . length > 0 ) {
@@ -1378,7 +1300,6 @@ class MessageManager {
* 加载更多历史消息
*/
async loadMoreMessages ( conversationId : string , beforeSeq : number , limit = 20 ) : Promise < MessageResponse [ ] > {
console . log ( '[MessageManager] 加载更多历史消息:' , { conversationId , beforeSeq , limit } ) ;
try {
// 先从本地获取
@@ -1468,10 +1389,6 @@ class MessageManager {
this . state . totalUnreadCount = unreadData ? . total_unread_count ? ? 0 ;
this . state . systemUnreadCount = systemUnreadData ? . unread_count ? ? 0 ;
console . log ( '[MessageManager] 未读数更新:' , {
total : this.state.totalUnreadCount ,
system : this.state.systemUnreadCount ,
} ) ;
this . notifySubscribers ( {
type : 'unread_count_updated' ,
@@ -1496,7 +1413,6 @@ class MessageManager {
segments : MessageSegment [ ] ,
options ? : { replyToId? : string }
) : Promise < MessageResponse | null > {
console . log ( '[MessageManager] 发送消息:' , { conversationId , segmentCount : segments.length } ) ;
try {
// 调用API发送
@@ -1583,7 +1499,6 @@ class MessageManager {
* 3. fetchConversations 使用版本号判断数据新旧
*/
async markAsRead ( conversationId : string , seq : number ) : Promise < void > {
console . log ( '[MessageManager] 标记已读:' , { conversationId , seq } ) ;
const conversation = this . state . conversations . get ( conversationId ) ;
if ( ! conversation ) {
@@ -1596,11 +1511,6 @@ class MessageManager {
// 使用 seq 去重:同一会话若已上报到更大/相同 seq, 则跳过重复上报
if ( existingRecord && seq <= existingRecord . lastReadSeq ) {
console . log ( '[MessageManager] 已读seq未前进, 跳过重复上报:' , {
conversationId ,
seq ,
lastReadSeq : existingRecord.lastReadSeq ,
} ) ;
return ;
}
@@ -1620,7 +1530,6 @@ class MessageManager {
version : currentVersion ,
lastReadSeq : seq ,
} ) ;
console . log ( '[MessageManager] 已读保护开始:' , { conversationId , version : currentVersion } ) ;
// 2. 乐观更新本地状态( 立即反映到UI)
const updatedConv : ConversationResponse = {
@@ -1663,7 +1572,6 @@ class MessageManager {
// 5. 调用 API, 完成后设置延迟清除保护
try {
await messageService . markAsRead ( conversationId , seq ) ;
console . log ( '[MessageManager] 标记已读API调用成功:' , { conversationId , version : currentVersion } ) ;
} catch ( error ) {
console . error ( '[MessageManager] 标记已读API失败:' , error ) ;
// 失败时回滚状态
@@ -1692,7 +1600,6 @@ class MessageManager {
// 只有版本号匹配时才清除(防止清除新的已读请求的保护)
if ( record && record . version === currentVersion ) {
this . pendingReadMap . delete ( conversationId ) ;
console . log ( '[MessageManager] 已读保护结束:' , { conversationId , version : currentVersion } ) ;
}
} , READ_STATE_PROTECTION_DELAY ) ;
@@ -1709,7 +1616,6 @@ class MessageManager {
* 标记所有消息已读
*/
async markAllAsRead ( ) : Promise < void > {
console . log ( '[MessageManager] 标记所有已读' ) ;
// 乐观更新
const prevConversations = new Map ( this . state . conversations ) ;
@@ -1766,7 +1672,6 @@ class MessageManager {
* 创建私聊会话
*/
async createConversation ( userId : string ) : Promise < ConversationResponse | null > {
console . log ( '[MessageManager] 创建私聊会话:' , userId ) ;
try {
const conversation = await messageService . createConversation ( userId ) ;
@@ -1860,7 +1765,6 @@ class MessageManager {
* 设置系统消息未读数
*/
setSystemUnreadCount ( count : number ) : void {
console . log ( '[MessageManager] 设置系统未读数:' , count ) ;
this . state . systemUnreadCount = count ;
this . notifySubscribers ( {
@@ -1878,7 +1782,6 @@ class MessageManager {
*/
incrementSystemUnreadCount ( ) : void {
this . state . systemUnreadCount += 1 ;
console . log ( '[MessageManager] 系统未读数增加:' , this . state . systemUnreadCount ) ;
this . notifySubscribers ( {
type : 'unread_count_updated' ,
@@ -1895,7 +1798,6 @@ class MessageManager {
*/
decrementSystemUnreadCount ( count = 1 ) : void {
this . state . systemUnreadCount = Math . max ( 0 , this . state . systemUnreadCount - count ) ;
console . log ( '[MessageManager] 系统未读数减少:' , this . state . systemUnreadCount ) ;
this . notifySubscribers ( {
type : 'unread_count_updated' ,
@@ -1953,7 +1855,6 @@ class MessageManager {
* 清空会话列表
*/
clearConversations ( ) : void {
console . log ( '[MessageManager] 清空会话列表' ) ;
this . state . conversations . clear ( ) ;
this . state . conversationList = [ ] ;
this . state . totalUnreadCount = 0 ;
@@ -1980,7 +1881,6 @@ class MessageManager {
* 实际 MessageManager 使用内存状态,此方法用于兼容性
*/
invalidateCache ( type : 'all' | 'list' | 'unread' = 'all' ) : void {
console . log ( '[MessageManager] 使缓存失效:' , type ) ;
// MessageManager 不使用外部缓存,内存状态始终是最新的
// 此方法仅用于 API 兼容性
}
@@ -1994,14 +1894,6 @@ class MessageManager {
const prevUnreadCount = conversation . unread_count || 0 ;
const newUnreadCount = prevUnreadCount + 1 ;
console . log ( '[MessageManager][DEBUG] incrementUnreadCount:' , {
conversationId ,
prevUnreadCount ,
newUnreadCount ,
conversationRef : conversation ,
conversationInMap : this.state.conversations.get ( conversationId ) ,
isSameRef : conversation === this . state . conversations . get ( conversationId ) ,
} ) ;
// 创建新对象而不是直接修改,确保状态一致性
const updatedConv : ConversationResponse = {
@@ -2095,7 +1987,6 @@ class MessageManager {
*/
setActiveConversation ( conversationId : string | null ) : void {
const normalizedConversationId = conversationId ? this . normalizeConversationId ( conversationId ) : null ;
console . log ( '[MessageManager] 设置活动会话:' , normalizedConversationId ) ;
this . state . currentConversationId = normalizedConversationId ;
}
@@ -2157,7 +2048,6 @@ class MessageManager {
*/
subscribe ( subscriber : MessageSubscriber ) : ( ) = > void {
this . state . subscribers . add ( subscriber ) ;
console . log ( '[MessageManager] 新订阅者,当前数量:' , this . state . subscribers . size ) ;
// 立即发送当前状态给新订阅者
subscriber ( {
@@ -2186,10 +2076,6 @@ class MessageManager {
if ( this . state . currentConversationId ) {
const currentMessages = this . state . messagesMap . get ( this . state . currentConversationId ) ;
if ( currentMessages && currentMessages . length > 0 ) {
console . log ( '[MessageManager][DEBUG] 新订阅者,发送当前活动会话消息:' , {
conversationId : this.state.currentConversationId ,
messageCount : currentMessages.length ,
} ) ;
subscriber ( {
type : 'messages_updated' ,
payload : {
@@ -2205,7 +2091,6 @@ class MessageManager {
// 返回取消订阅函数
return ( ) = > {
this . state . subscribers . delete ( subscriber ) ;
console . log ( '[MessageManager] 订阅者移除,当前数量:' , this . state . subscribers . size ) ;
} ;
}