From fb1b27e36f2e3bc2db77069a746893518e95efc8 Mon Sep 17 00:00:00 2001 From: hailin Date: Mon, 29 Dec 2025 12:27:01 -0800 Subject: [PATCH] =?UTF-8?q?fix(service-party-app):=20=E5=88=87=E6=8D=A2=20?= =?UTF-8?q?session=20=E6=97=B6=E9=87=8D=E6=96=B0=E8=AE=A2=E9=98=85?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: - prepareForKeygen 只检查 isPrepared 标志 - 当旧 session 失败后 isPrepared 可能仍为 true - 新 session 调用 prepareForKeygen 时直接跳过,没有重新订阅 - 导致 external party 仍订阅旧 session 的消息流 - server parties 发送的 TSS 消息无法到达 external party 修复: - 检查 sessionId 是否变化 - 如果是新 session,先取消旧订阅再重新订阅 Generated with Claude Code Co-Authored-By: Claude Opus 4.5 --- .../electron/modules/tss-handler.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/backend/mpc-system/services/service-party-app/electron/modules/tss-handler.ts b/backend/mpc-system/services/service-party-app/electron/modules/tss-handler.ts index 3a0d09f4..bfbd49de 100644 --- a/backend/mpc-system/services/service-party-app/electron/modules/tss-handler.ts +++ b/backend/mpc-system/services/service-party-app/electron/modules/tss-handler.ts @@ -123,11 +123,20 @@ export class TSSHandler extends EventEmitter { * @param partyId 自己的 party ID */ prepareForKeygen(sessionId: string, partyId: string): void { - if (this.isPrepared) { - console.log('[TSS] Already prepared for keygen, skip'); + // 如果已经为同一个 session 准备过,跳过 + if (this.isPrepared && this.sessionId === sessionId) { + console.log('[TSS] Already prepared for same session, skip'); return; } + // 如果为不同的 session 准备过,先取消旧的订阅 + if (this.isPrepared && this.sessionId !== sessionId) { + console.log(`[TSS] Switching from session ${this.sessionId?.substring(0, 8)}... to ${sessionId.substring(0, 8)}...`); + this.grpcClient.removeAllListeners('mpcMessage'); + this.grpcClient.unsubscribeMessages(); + this.messageBuffer = []; + } + console.log(`[TSS] Preparing for keygen: session=${sessionId.substring(0, 8)}..., party=${partyId.substring(0, 8)}...`); this.sessionId = sessionId;