fix(service-party-app): 切换 session 时重新订阅消息流

问题:
- 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 <noreply@anthropic.com>
This commit is contained in:
hailin 2025-12-29 12:27:01 -08:00
parent 989364969d
commit fb1b27e36f
1 changed files with 11 additions and 2 deletions

View File

@ -123,11 +123,20 @@ export class TSSHandler extends EventEmitter {
* @param partyId party ID * @param partyId party ID
*/ */
prepareForKeygen(sessionId: string, partyId: string): void { prepareForKeygen(sessionId: string, partyId: string): void {
if (this.isPrepared) { // 如果已经为同一个 session 准备过,跳过
console.log('[TSS] Already prepared for keygen, skip'); if (this.isPrepared && this.sessionId === sessionId) {
console.log('[TSS] Already prepared for same session, skip');
return; 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)}...`); console.log(`[TSS] Preparing for keygen: session=${sessionId.substring(0, 8)}..., party=${partyId.substring(0, 8)}...`);
this.sessionId = sessionId; this.sessionId = sessionId;