fix(service-party-app): 方案B修复最后加入者错过session_started事件的竞态条件
问题: 最后一个加入者调用JoinSession时,session_started事件可能在RPC返回前 就已通过流式gRPC到达,此时activeKeygenSession尚未设置,事件被忽略 方案B: 在JoinSession返回后检查session状态,如果status已经是in_progress, 说明自己是最后一个加入的,直接触发keygen而不等待session_started事件 - 幂等性保护确保不会重复触发keygen - 同时适用于发起方和普通加入方 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
290b5ea766
commit
ee59d1c0b1
|
|
@ -479,7 +479,87 @@
|
|||
"Bash(./node_modules/.bin/tsc:*)",
|
||||
"Bash(npm ls:*)",
|
||||
"Bash(npm run build:win:*)",
|
||||
"Bash(npm run clean:*)"
|
||||
"Bash(npm run clean:*)",
|
||||
"Bash(node test-grpc-raw.js:*)",
|
||||
"Bash(del \"c:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system\\\\services\\\\service-party-app\\\\test-grpc-raw.js\")",
|
||||
"Bash(node test-grpc-quick.js:*)",
|
||||
"Bash(go version:*)",
|
||||
"Bash(set GOOS=js)",
|
||||
"Bash(set GOARCH=wasm)",
|
||||
"Bash($env:GOOS=\"js\")",
|
||||
"Bash($env:GOARCH=\"wasm\")",
|
||||
"Bash(GOOS=js GOARCH=wasm go build:*)",
|
||||
"Bash(go doc:*)",
|
||||
"Bash(go env:*)",
|
||||
"Bash(cmd.exe:*)",
|
||||
"Bash(git commit -m \"$\\(cat <<''EOF''\nfeat\\(api-gateway\\): 添加 MPC Account Service 路由配置\n\n添加共管钱包 API 路由,将 /api/v1/co-managed/* 请求转发到 account-service \\(端口 4000\\)\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n\\)\")",
|
||||
"Bash(git commit -m \"$\\(cat <<''EOF''\nfix\\(service-party-app\\): 修复 Account 服务 URL 为 rwaapi.szaiai.com\n\napi.szaiai.com 被 OSS/CDN 拦截,改用 rwaapi.szaiai.com 直接访问 Kong 网关\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n\\)\")",
|
||||
"Bash(git commit -m \"$\\(cat <<''EOF''\nfix\\(service-party-app\\): 创建会话时添加 initiator_party_id 参数\n\n- CreateKeygenSessionRequest 添加 initiator_party_id 和 initiator_name 字段\n- 创建会话前检查是否已连接到消息路由器\n- 自动获取已注册的 partyId 作为发起者\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n\\)\")",
|
||||
"Bash(git commit -m \"$\\(cat <<''EOF''\nfix\\(session-coordinator\\): 保存 WalletName 和 InviteCode 到数据库\n\n- CreateSessionInput 添加 WalletName 和 InviteCode 字段\n- gRPC handler 从请求中读取并传递这些字段\n- CreateSession use case 在创建会话时设置这些字段\n\n修复: 通过邀请码查询会话时找不到记录的问题\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n\\)\")",
|
||||
"Bash(git commit -m \"$\\(cat <<''EOF''\nfix\\(mpc-system\\): 修复通过邀请码加入会话时 invalid token 错误\n\n问题: 通过邀请码查询会话后加入时报 \"13 INTERNAL: invalid token\"\n原因: GetSessionByInviteCode API 没有返回 join_token\n\n修复:\n- account-service: GetSessionByInviteCode 在查询时生成新的 wildcard join token\n- account-service: CoManagedHTTPHandler 添加 jwtService 依赖注入\n- service-party-app: validateInviteCode 返回 join_token\n- service-party-app: Join.tsx 保存并使用 joinToken 和 partyId\n- service-party-app: preload.ts joinSession 使用正确的参数格式\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n\\)\")",
|
||||
"Bash(npm run build:electron:*)",
|
||||
"Bash(npm run:*)",
|
||||
"Bash(tasklist:*)",
|
||||
"Bash(powershell -Command:*)",
|
||||
"Bash(xargs cat:*)",
|
||||
"Bash(make proto:*)",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system''; go build ./services/server-party/...\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system''; go build ./services/message-router/...\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git status\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git diff backend/mpc-system/services/message-router/adapters/input/grpc/message_grpc_handler.go backend/mpc-system/services/server-party/adapters/output/grpc/message_router_client.go backend/mpc-system/services/server-party/application/use_cases/participate_keygen.go\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git log --oneline -5\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git add backend/mpc-system/services/message-router/adapters/input/grpc/message_grpc_handler.go backend/mpc-system/services/server-party/adapters/output/grpc/message_router_client.go backend/mpc-system/services/server-party/application/use_cases/participate_keygen.go\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git commit -m @''\nfix\\(server-party\\): co_managed_keygen 等待所有参与者加入后再开始 keygen\n\n- Message Router GetSessionStatus 透传 participants 列表\n- Server Party 新增 GetSessionStatusFull 方法获取完整会话状态\n- participate_keygen.go 对 co_managed_keygen 类型轮询等待所有 N 个参与者加入\n- 不影响原有 keygen/sign 功能(仅 co_managed_keygen 触发等待逻辑)\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\n''@\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git push\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system''; go build ./services/session-coordinator/...\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git diff backend/mpc-system/services/session-coordinator/adapters/output/postgres/session_postgres_repo.go\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git add backend/mpc-system/services/session-coordinator/adapters/output/postgres/session_postgres_repo.go && git commit -m @''\nfix\\(session-coordinator\\): 修复 FindExpired SQL 时区问题\n\n- expires_at 存储为 UTC 时间\n- 查询时使用 NOW\\(\\) AT TIME ZONE ''''UTC'''' 确保时区一致\n- 避免因时区差异导致 session 过早被标记为过期\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\n''@\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git add backend/mpc-system/services/session-coordinator/adapters/output/postgres/session_postgres_repo.go\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git commit -m @''\nfix\\(session-coordinator\\): 修复 FindExpired SQL 时区问题\n\n- expires_at 存储为 UTC 时间\n- 查询时使用 NOW\\(\\) AT TIME ZONE ''UTC'' 确保时区一致\n- 避免因时区差异导致 session 过早被标记为过期\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\n''@\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system\\\\services\\\\service-party-app''; if \\(Test-Path ''node_modules''\\) { npx tsc --noEmit --skipLibCheck 2>&1 | Select-Object -First 20 } else { Write-Output ''node_modules not found, skip type check'' }\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git diff backend/mpc-system/services/service-party-app/electron/main.ts\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git add backend/mpc-system/services/service-party-app/electron/main.ts\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git commit -m @''\nfix\\(service-party-app\\): 添加等待所有参与者加入的逻辑\n\n- 在 checkAndTriggerKeygen 中添加参与者数量检查\n- 必须等待所有 N 个参与者加入后才能开始 keygen\n- 与 server-party 的 waitForAllParticipants 逻辑保持一致\n- 修复 co_managed_keygen 场景下 TSS 协议无法完成的问题\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\n''@\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system\\\\services\\\\service-party-app''; if \\(Test-Path ''node_modules''\\) { npx tsc --noEmit --skipLibCheck 2>&1 | Select-Object -First 30 } else { Write-Output ''node_modules not found, skip type check'' }\")",
|
||||
"Bash(if [ -d node_modules ])",
|
||||
"Bash(then npx tsc --noEmit --skipLibCheck)",
|
||||
"Bash(else echo \"node_modules not found, skip type check\")",
|
||||
"Bash(git commit -m \"$\\(cat <<''EOF''\nfix\\(service-party-app\\): 修复 co_managed_keygen 消息丢失问题\n\n问题:\n- service-party-app 在 joinSession 后有 1 秒延迟才开始 keygen\n- server-party 检测到所有参与者后立即发送 TSS Round 0 消息\n- service-party-app 此时还没订阅消息流,导致消息丢失\n- TSS 协议无法完成\n\n修复:\n- TSSHandler 新增 prepareForKeygen\\(\\) 方法,在 joinSession 后立即订阅消息\n- 新增 isPrepared 状态,在预订阅阶段也能缓冲消息\n- handleIncomingMessage 支持 isPrepared || isRunning 时缓冲消息\n- participateKeygen 保留预订阅阶段缓冲的消息,不重复订阅\n- main.ts 在 joinSession 成功后立即调用 prepareForKeygen\\(\\)\n- 移除 1 秒延迟,改用 setImmediate 立即触发 keygen\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n\\)\")",
|
||||
"Bash(git commit -m \"$\\(cat <<''EOF''\nfix\\(service-party-app\\): checkAndTriggerKeygen 改为轮询等待\n\n问题:\n- 原来 checkAndTriggerKeygen 只检查一次\n- 如果首次检查时会话状态还不是 in_progress,就直接返回\n- 导致 external party 永远不触发 keygen\n\n修复:\n- 改为与 server-party 的 waitForAllParticipants 一致的轮询逻辑\n- 2 秒轮询间隔,最多等待 5 分钟\n- 持续检查直到所有参与者加入且状态正确\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n\\)\")",
|
||||
"Bash(powershell.exe -Command \"Get-ChildItem -Path ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system\\\\services\\\\service-party-app\\\\bin'' -Recurse | Select-Object FullName, Length\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git add backend/mpc-system/services/service-party-app/electron-builder.json && git commit -m @''\nfix\\(service-party-app\\): 将 tss-party 二进制文件打包进应用\n\n- 添加 extraResources 配置将 bin/$platform-$arch 目录包含到打包资源中\n- 修复打包后的应用找不到 tss-party.exe 导致 TSS 协议无法执行的问题\n- 二进制文件会被复制到 resources/bin/ 目录\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\n''@\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git add backend/mpc-system/services/service-party-app/electron-builder.json\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git add backend/mpc-system/services/service-party-app/electron-builder.json backend/mpc-system/services/service-party-app/scripts/afterPack.js\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system\\\\services\\\\service-party-app''; Select-String -Path ''package.json'' -Pattern ''electron-builder''\")",
|
||||
"Bash(powershell.exe -Command \"Test-Path ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system\\\\services\\\\service-party-app\\\\scripts\\\\afterPack.js''\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git log --oneline -3\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git add backend/mpc-system/services/service-party-app/package.json\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git commit -m ''fix\\(service-party-app\\): 在 package.json 的 build 配置中添加 afterPack\n\n问题:\n- electron-builder 加载的是 package.json 的 build 字段\n- 而不是单独的 electron-builder.json 文件\n- 导致 afterPack hook 没有被执行\n\n修复:\n- 在 package.json 的 build 配置中添加 afterPack 引用\n\nGenerated with Claude Code\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>''\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git add backend/mpc-system/services/service-party-app/src/pages/Session.tsx backend/mpc-system/services/service-party-app/src/pages/Home.tsx\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git commit -m ''fix\\(service-party-app\\): 修复 participants 为 undefined 导致的崩溃\n\n问题:\n- Session.tsx 和 Home.tsx 直接访问 participants.length\n- 当后端返回的 session 数据中 participants 为 undefined 时崩溃\n- 导致 TypeError: Cannot read properties of undefined \\(reading length\\)\n\n修复:\n- 添加空值检查 \\(session.participants || []\\).length\n- 使用 Math.max\\(0, ...\\) 防止负数长度\n\nGenerated with Claude Code\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>''\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git add backend/mpc-system/services/service-party-app/src/pages/Session.tsx && git commit -m ''fix\\(service-party-app\\): 修复 threshold 为 undefined 导致的崩溃\n\n问题:\n- Session.tsx 直接访问 session.threshold.n 和 session.threshold.t\n- 当后端返回的 session 数据中 threshold 为 undefined 时崩溃\n- 导致 TypeError: Cannot read properties of undefined \\(reading n\\)\n\n修复:\n- 添加空值检查 session.threshold?.n || 0\n- 阈值信息部分添加条件渲染 {session.threshold && ...}\n\nGenerated with Claude Code\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>''\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git add backend/mpc-system/services/service-party-app/src/pages/Session.tsx\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git commit -m ''fix\\(service-party-app\\): 修复 threshold 为 undefined 导致的崩溃\n\n问题:\n- Session.tsx 直接访问 session.threshold.n 和 session.threshold.t\n- 当后端返回的 session 数据中 threshold 为 undefined 时崩溃\n\n修复:\n- 添加空值检查 session.threshold?.n || 0\n- 阈值信息部分添加条件渲染\n\nGenerated with Claude Code\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>''\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system\\\\services\\\\service-party-app''; npx tsc -p tsconfig.electron.json 2>&1 | Select-Object -First 30\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git diff backend/mpc-system/services/service-party-app/electron/modules/tss-handler.ts\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git add backend/mpc-system/services/service-party-app/electron/modules/tss-handler.ts && git commit -m ''debug\\(service-party-app\\): 添加 TSS 进程详细调试日志\n\n- 输出二进制文件路径和存在性检查\n- 输出传递给 TSS 的参与者列表 JSON\n- 输出完整的命令行参数\n- 收集并输出 stderr 内容\n- 帮助诊断 TSS 进程 exit code 1 问题\n\nGenerated with Claude Code\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>''\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git add backend/mpc-system/services/service-party-app/electron/modules/tss-handler.ts\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git commit -m ''debug\\(service-party-app\\): 添加 TSS 进程详细调试日志\n\n- 输出二进制文件路径和存在性检查\n- 输出传递给 TSS 的参与者列表 JSON\n- 输出完整的命令行参数\n- 收集并输出 stderr 内容\n- 帮助诊断 TSS 进程 exit code 1 问题\n\nGenerated with Claude Code\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>''\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git commit -m ''fix\\(service-party-app\\): 补全 getSessionStatus 返回的 threshold 和 participants\n\n问题:\n- Session.tsx 期望 session 对象有 threshold 和 participants 字段\n- 但 grpc:getSessionStatus 只返回了基础字段\n- 导致前端显示 参与方 \\(0 / 0\\)\n\n修复:\n- 从 activeKeygenSession 获取 threshold 信息\n- 从 API 返回的 participants 构建完整的参与者列表\n- 添加 walletName, currentRound, totalRounds 字段\n\nGenerated with Claude Code\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>''\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system''; protoc --go_out=. --go-grpc_out=. api/proto/session_coordinator.proto 2>&1\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system''; if \\(Test-Path ''Makefile''\\) { Get-Content Makefile | Select-String -Pattern ''proto'' -Context 0,5 } else { Write-Output ''No Makefile'' }\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system''; make proto 2>&1\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system''; protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative api/proto/*.proto 2>&1\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system''; go build ./services/session-coordinator/... 2>&1 | Select-Object -First 20\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system''; protoc --proto_path=api/proto --go_out=api/grpc/coordinator/v1 --go_opt=paths=source_relative --go-grpc_out=api/grpc/coordinator/v1 --go-grpc_opt=paths=source_relative session_coordinator.proto 2>&1\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\\\\backend\\\\mpc-system''; go build ./services/message-router/... 2>&1 | Select-Object -First 20\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git add backend/mpc-system/api/proto/session_coordinator.proto backend/mpc-system/api/grpc/coordinator/v1/session_coordinator.pb.go backend/mpc-system/services/session-coordinator/adapters/input/grpc/session_grpc_handler.go backend/mpc-system/services/message-router/adapters/input/grpc/message_grpc_handler.go\")",
|
||||
"Bash(powershell.exe -Command \"cd ''C:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian''; git commit -m ''fix\\(mpc-system\\): GetSessionStatus 返回实际的 threshold_n 和 threshold_t\n\n问题:\n- Message Router 的 GetSessionStatus 把 TotalParties 当作 ThresholdN 返回\n- 导致 server-party 收到错误的 threshold_n=2 而不是 3\n- TSS 协议无法正确启动(参与者数量验证失败)\n\n修复:\n- 在 session_coordinator.proto 添加 threshold_n 和 threshold_t 字段\n- Session Coordinator 返回实际的 threshold 值\n- Message Router 透传 threshold 值而不是参与者数量\n\nGenerated with Claude Code\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>''\")",
|
||||
"Bash(powershell.exe:*)",
|
||||
"Bash(dir backendmpc-systemgithub.com /s /b)",
|
||||
"Bash(git status:*)",
|
||||
"Bash(git commit -m \"$\\(cat <<''EOF''\nfix\\(service-party-app\\): 动态计算 persistent_count 并修复 keygen 触发时机\n\n1. 动态计算 server-party 数量: persistent = n - t\n - 2-of-3 -> persistent=1, external=2\n - 3-of-5 -> persistent=2, external=3\n - 4-of-7 -> persistent=3, external=4\n\n2. 修复 5 分钟超时与 24 小时会话的冲突\n - 之前: joinSession 后立即启动 5 分钟轮询,导致超时失败\n - 现在: 等待 all_joined 事件后才启动 5 分钟倒计时\n - 用户可以在 24 小时内慢慢邀请其他参与者加入\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n\\)\")",
|
||||
"Bash(dir /s /b \"c:\\\\Users\\\\dong\\\\Desktop\\\\rwadurian\")"
|
||||
],
|
||||
"deny": [],
|
||||
"ask": []
|
||||
|
|
|
|||
|
|
@ -791,10 +791,38 @@ function setupIpcHandlers() {
|
|||
(tssHandler as { prepareForKeygen: (sessionId: string, partyId: string) => void }).prepareForKeygen(sessionId, partyId);
|
||||
}
|
||||
|
||||
// 注意:不再在这里调用 checkAndTriggerKeygen
|
||||
// 而是等待收到 all_joined 事件后再启动 5 分钟倒计时
|
||||
// 这样用户可以在 24 小时内慢慢邀请其他参与者加入
|
||||
debugLog.info('main', `Joined session ${sessionId}, waiting for all_joined event to start keygen`);
|
||||
// 方案 B: 检查 JoinSession 响应中的 session 状态
|
||||
// 如果 session 已经是 in_progress,说明我们是最后一个加入的
|
||||
// 此时 session_started 事件可能已经在 JoinSession 返回前到达(并被忽略)
|
||||
// 所以我们需要直接触发 keygen,而不是等待 session_started 事件
|
||||
//
|
||||
// 注意:只检查 status === 'in_progress' 就足够了
|
||||
// 因为 session 只有在所有参与者都加入后才会变成 in_progress
|
||||
// 不需要额外检查参与者数量
|
||||
const sessionStatus = result.session_info?.status;
|
||||
|
||||
debugLog.info('main', `JoinSession response: status=${sessionStatus}`);
|
||||
|
||||
if (sessionStatus === 'in_progress') {
|
||||
// Session 已经开始,说明我们是最后一个加入的
|
||||
// 直接触发 keygen,不需要等待 session_started 事件
|
||||
debugLog.info('main', `Session already in_progress, triggering keygen immediately (Solution B)`);
|
||||
|
||||
// 使用 setImmediate 确保 activeKeygenSession 已完全设置
|
||||
setImmediate(async () => {
|
||||
const selectedParties = activeKeygenSession?.participants.map(p => p.partyId) || [];
|
||||
await handleSessionStart({
|
||||
eventType: 'session_started',
|
||||
sessionId: sessionId,
|
||||
thresholdN: result.session_info?.threshold_n || activeKeygenSession?.threshold.n || 0,
|
||||
thresholdT: result.session_info?.threshold_t || activeKeygenSession?.threshold.t || 0,
|
||||
selectedParties: selectedParties,
|
||||
});
|
||||
});
|
||||
} else {
|
||||
// Session 还未开始,等待 session_started 事件
|
||||
debugLog.info('main', `Joined session ${sessionId}, waiting for session_started event to start keygen`);
|
||||
}
|
||||
}
|
||||
return { success: true, data: result };
|
||||
} catch (error) {
|
||||
|
|
@ -876,10 +904,29 @@ function setupIpcHandlers() {
|
|||
(tssHandler as { prepareForKeygen: (sessionId: string, partyId: string) => void }).prepareForKeygen(result.session_id, partyId);
|
||||
}
|
||||
|
||||
// 注意:不再在这里调用 checkAndTriggerKeygen
|
||||
// 而是等待收到 all_joined 事件后再启动 5 分钟倒计时
|
||||
// 这样用户可以在 24 小时内慢慢邀请其他参与者加入
|
||||
debugLog.info('main', `Initiator joined session ${result.session_id}, waiting for all_joined event to start keygen`);
|
||||
// 方案 B: 检查 JoinSession 响应中的 session 状态
|
||||
// 发起方通常是第一个加入的,所以 session 不太可能已经是 in_progress
|
||||
// 但为了代码一致性,这里也添加检查
|
||||
const sessionStatus = joinResult.session_info?.status;
|
||||
|
||||
debugLog.info('main', `Initiator JoinSession response: status=${sessionStatus}`);
|
||||
|
||||
if (sessionStatus === 'in_progress') {
|
||||
debugLog.info('main', `Session already in_progress, triggering keygen immediately (Solution B)`);
|
||||
|
||||
setImmediate(async () => {
|
||||
const selectedParties = activeKeygenSession?.participants.map(p => p.partyId) || [];
|
||||
await handleSessionStart({
|
||||
eventType: 'session_started',
|
||||
sessionId: result.session_id,
|
||||
thresholdN: joinResult.session_info?.threshold_n || params.thresholdN,
|
||||
thresholdT: joinResult.session_info?.threshold_t || params.thresholdT,
|
||||
selectedParties: selectedParties,
|
||||
});
|
||||
});
|
||||
} else {
|
||||
debugLog.info('main', `Initiator joined session ${result.session_id}, waiting for session_started event to start keygen`);
|
||||
}
|
||||
} else {
|
||||
console.warn('Initiator failed to join session');
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue