From ff995a827be0ae5d84037dc6f4b406c20e84220e Mon Sep 17 00:00:00 2001 From: hailin Date: Wed, 31 Dec 2025 13:09:45 -0800 Subject: [PATCH] fix(grpc-client): add connection check and better error handling in subscribeMessages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Additional safeguards to prevent "CANCELLED: Cancelled on client" error: 1. Add `this.connected` check at the start of subscribeMessages() 2. Set messageStream to null after canceling old stream 3. Wrap new stream creation in try-catch to handle creation errors 4. Add logging for ignored cancel errors These changes ensure that: - subscribeMessages won't proceed if connection is lost - Old stream is fully cleaned up before creating new one - Errors during stream creation are properly caught and logged 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../electron/modules/grpc-client.ts | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/backend/mpc-system/services/service-party-app/electron/modules/grpc-client.ts b/backend/mpc-system/services/service-party-app/electron/modules/grpc-client.ts index cbf80b79..3c622f54 100644 --- a/backend/mpc-system/services/service-party-app/electron/modules/grpc-client.ts +++ b/backend/mpc-system/services/service-party-app/electron/modules/grpc-client.ts @@ -550,6 +550,10 @@ export class GrpcClient extends EventEmitter { throw new Error('Not connected'); } + if (!this.connected) { + throw new Error('gRPC client not connected'); + } + // 保存订阅状态(用于重连后恢复) this.activeMessageSubscription = { sessionId, partyId }; @@ -560,15 +564,22 @@ export class GrpcClient extends EventEmitter { try { oldStream.cancel(); } catch (e) { - // 忽略 + console.log('[gRPC] Ignored error while canceling old message stream:', (e as Error).message); } + this.messageStream = null; } - this.messageStream = (this.client as grpc.Client & { subscribeMessages: (req: unknown) => grpc.ClientReadableStream }) - .subscribeMessages({ - session_id: sessionId, - party_id: partyId, - }); + try { + this.messageStream = (this.client as grpc.Client & { subscribeMessages: (req: unknown) => grpc.ClientReadableStream }) + .subscribeMessages({ + session_id: sessionId, + party_id: partyId, + }); + } catch (e) { + console.error('[gRPC] Failed to create message stream:', (e as Error).message); + this.activeMessageSubscription = null; + throw e; + } // 保存当前流的引用,用于在事件处理器中检查是否是当前活跃的流 const currentStream = this.messageStream;