# 准确的改动清单 ## 1. 删除的内容 ❌ ### 删除的文件: - `app/src/main/java/com/durian/tssparty/data/remote/StreamManager.kt` (整个文件,282行) ### 删除的代码(TssRepository.kt): #### 第17行 - 删除 import: ```kotlin - import com.durian.tssparty.data.remote.StreamManager ``` #### 第217-242行 - 删除 StreamManager 实例和注释: ```kotlin - /** - * StreamManager - 管理 gRPC 双向流的生命周期 - * ...(大段注释) - */ - private val streamManager = StreamManager(grpcClient, repositoryScope) ``` #### 第293-304行 - 删除 init 块: ```kotlin - init { - repositoryScope.launch { - grpcConnectionEvents - .filter { it is GrpcConnectionEvent.Reconnected } - .collect { - android.util.Log.d("TssRepository", "gRPC reconnected, restarting streams via StreamManager...") - streamManager.restartAllStreams() - } - } - } ``` #### 第511-611行 - 删除 StreamManager 的事件订阅: ```kotlin - streamManager.startEventStream( - partyId = effectivePartyId, - onEvent = { event -> - // ... 事件处理逻辑 ... - }, - onError = { error -> - android.util.Log.e("TssRepository", "Event stream error: ${error.message}") - } - ) ``` #### 第2062-2098行 - 删除 StreamManager 的消息订阅: ```kotlin - streamManager.startMessageStream( - sessionId = sessionId, - partyId = effectivePartyId, - partyIndex = partyIndex, - onMessage = { message -> - // ... 消息处理逻辑 ... - }, - onError = { error -> - android.util.Log.e("TssRepository", "Message stream error: ${error.message}") - } - ) ``` ## 2. 添加的内容 ✅ ### TssRepository.kt 第220行 - 添加 Job 常量: ```kotlin + private const val JOB_MESSAGE_SENDING = "message_sending" ``` ### 第488-496行 - 添加 registerParty 错误检查: ```kotlin + // Register with gRPC and check result + val registerResult = grpcClient.registerParty(partyId, "temporary", "1.0.0") + if (registerResult.isFailure) { + val error = registerResult.exceptionOrNull() + android.util.Log.e("TssRepository", "Failed to register party: ${error?.message}") + throw error ?: Exception("Failed to register party") + } + + android.util.Log.d("TssRepository", "Party registered successfully: $partyId") ``` ### 第511-577行 - 恢复简单的事件订阅(添加 retryWhen): ```kotlin + // 使用 JobManager 启动(自动取消同名旧 Job) + // 添加 Flow.retryWhen 实现自动重连(基于 gRPC 官方推荐) + jobManager.launch(JOB_SESSION_EVENT) { + flow { + grpcClient.subscribeSessionEvents(effectivePartyId).collect { event -> + emit(event) + } + } + .retryWhen { cause, attempt -> + android.util.Log.w("TssRepository", "Event stream failed (attempt ${attempt + 1}), retrying in ${kotlin.math.min(attempt + 1, 30)}s: ${cause.message}") + delay(kotlin.math.min(attempt + 1, 30) * 1000L) // 指数退避,最多 30 秒 + true // 永远重试 + } + .collect { event -> + // ... 原有的事件处理逻辑(完全不变)... + } + } ``` ### 第2043-2087行 - 重构消息路由(添加 retryWhen): ```kotlin + // Part 1: Collect outgoing messages from TSS and route via gRPC + jobManager.launch(JOB_MESSAGE_SENDING) { // 改名为 JOB_MESSAGE_SENDING + tssNativeBridge.outgoingMessages.collect { message -> + // ... 发送逻辑 ... + } + } + + // Part 2: Subscribe to incoming messages from gRPC and send to TSS + // 添加 Flow.retryWhen 实现自动重连(基于 gRPC 官方推荐) + jobManager.launch(JOB_MESSAGE_COLLECTION) { + flow { + grpcClient.subscribeMessages(sessionId, effectivePartyId).collect { message -> + emit(message) + } + } + .retryWhen { cause, attempt -> + android.util.Log.w("TssRepository", "Message stream failed (attempt ${attempt + 1}), retrying in ${kotlin.math.min(attempt + 1, 30)}s: ${cause.message}") + delay(kotlin.math.min(attempt + 1, 30) * 1000L) // 指数退避,最多 30 秒 + true // 永远重试 + } + .collect { message -> + // ... 原有的消息处理逻辑(完全不变)... + } + } ``` ### 第592行 - 修改检查方法: ```kotlin - val isActive = streamManager.isEventStreamActive() + val isActive = jobManager.isActive(JOB_SESSION_EVENT) ``` ## 3. 完全不变的内容 ✅ ### GrpcClient.kt - Keep-Alive 配置(保持不变): ```kotlin // Line 143-150 - 完全不变 .keepAliveTime(20, TimeUnit.SECONDS) .keepAliveTimeout(5, TimeUnit.SECONDS) .keepAliveWithoutCalls(true) .idleTimeout(Long.MAX_VALUE, TimeUnit.DAYS) ``` ### GrpcClient.kt - 网络监听(保持不变): ```kotlin // Line 151-183 - 完全不变 fun setupNetworkMonitoring(context: Context) { val callback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { channel?.resetConnectBackoff() } } } ``` ### TssRepository.kt - 事件处理逻辑(保持不变): ```kotlin // Line 522-573 - 完全不变 when (event.eventType) { "session_started" -> { // ... 原有的 RACE-FIX 逻辑 ... sessionEventCallback?.invoke(event) } "party_joined", "participant_joined" -> { sessionEventCallback?.invoke(event) } // ... } ``` ### TssRepository.kt - 消息处理逻辑(保持不变): ```kotlin // Line 2071-2084 - 完全不变 val fromPartyIndex = session?.participants?.find { it.partyId == message.fromParty }?.partyIndex if (fromPartyIndex != null) { tssNativeBridge.sendIncomingMessage( fromPartyIndex = fromPartyIndex, isBroadcast = message.isBroadcast, payload = message.payload ) } ``` ### TssRepository.kt - markPartyReady 重试机制(保持不变): ```kotlin // Line ~2140 - 完全不变 repeat(5) { attempt -> if (markReadySuccess) return@repeat val markReadyResult = grpcClient.markPartyReady(sessionId, partyId) if (markReadyResult.isSuccess) { markReadySuccess = true return@repeat } delay((attempt + 1) * 500L) } ``` ## 4. 核心改动总结 ### 之前(df9f9914): ```kotlin streamManager.startEventStream( partyId = effectivePartyId, onEvent = { event -> /* callback */ }, onError = { error -> /* callback */ } ) ``` ### 现在(bfbd062e): ```kotlin jobManager.launch(JOB_SESSION_EVENT) { flow { grpcClient.subscribeSessionEvents(effectivePartyId).collect { emit(it) } } .retryWhen { cause, attempt -> delay(min(attempt + 1, 30) * 1000L) true // 自动重连 } .collect { event -> // 原有的事件处理逻辑(完全不变) } } ``` ## 5. 统计数据 - 删除:StreamManager.kt (282 行) + TssRepository.kt 中的引用 (约 66 行) = **348 行** - 添加:WORKING_CODE_ANALYSIS.md (269 行) + REFACTORING_SUMMARY.md (200 行) + TssRepository.kt 改动 (45 行) = **514 行** - 净变化:+166 行(主要是文档) - 代码净变化:-21 行(代码更简洁) ## 6. 风险评估 ### 低风险 ✅: 1. **事件处理逻辑完全不变**(只是外面包了 retryWhen) 2. **消息处理逻辑完全不变**(只是外面包了 retryWhen) 3. **gRPC Keep-Alive 配置保持不变** 4. **网络监听保持不变** 5. **markPartyReady 重试保持不变** ### 需要测试 ⚠️: 1. registerParty 错误检查是否正常 2. retryWhen 自动重连是否工作 3. 网络断开后是否自动恢复 ### 消除的风险 ✅: 1. StreamManager 的潜在 bug 2. 复杂的 callback 机制 3. init 块监听重连的问题