Skip to content

fix: 全栈 12 处健壮性修复 + 版本升至 2.0.8 - #3

Merged
RexVane merged 1 commit into
mainfrom
fix/bugfix-2.0.8
Aug 3, 2026
Merged

RexVane merged 1 commit into
mainfrom
fix/bugfix-2.0.8

Conversation

@RexVane

@RexVane RexVane commented Aug 3, 2026

Copy link
Copy Markdown
Owner

修复内容

本次修复静态审查发现的 12 处健壮性 bug,版本 2.0.7 → 2.0.8 / Flutter 2.0.7+8 → 2.0.8+9。

Rust 核心(经 cargo clippy 零警告 + 79 测试验证)

# 位置 修复
#2 transport.rs send_file 补源文件增长检测(与文件夹路径一致),防止传输期间追加写入导致接收端拿到旧快照仍校验通过
#3 service.rs derive_transfer_id 在 Windows 归一化路径大小写,保证断点续传复用同一 transfer_id
#4 service.rs start_lan 幂等清理改 warn 不上抛,旧会话 close 失败也能进入创建新会话分支
#5 discovery.rs 多宿主对端 goodbye 后等所有 hosts 探测失败才淘汰,避免首探失败即移除导致列表闪烁

桌面端(Windows 冻结区最小守卫)

# 位置 修复
#1 main.ts finishProgress 校验 sendId 匹配当前批次,旧批次完成事件不再清空新批次状态/隐藏取消按钮

Flutter 移动端

# 位置 修复
#7 home_page.dart identity_private 落盘改 await,首启崩溃或安全存储写失败不再导致下次冷启生成全新身份(致配对断裂)
#10 home_page.dart lan.peers/lan.status 加 session_id 守卫,重启期间旧会话残余事件不再污染状态栏/设备列表
#9 inkhole_core.dart call() 的 send 包 try/catch 防 Completer 泄漏
#6 inkhole_core.dart close() 加 3s 超时 + kill 兜底,worker 阻塞时不再永久挂起

Android

# 位置 修复
#8 Exporter.kt 新增 cleanupPendingOrphans,启动时清理上次导出被中断残留的 IS_PENDING=1 孤儿记录
#11 Exporter.kt 文件夹导出回滚只删未发布项,保留已发布到 Download 的文件
#12 Exporter.kt SAF 文件夹部分拷贝失败回滚已建子树

验证

  • ✅ cargo fmt --check 通过
  • ✅ cargo clippy --workspace --all-targets -D warnings 零警告
  • ✅ cargo test --workspace 79 全过(65 核心 + 11 桌面 + 3 FFI),0 回归
  • ✅ 前端 tsc --noEmit + vite build 通过
  • ⏳ flutter analyze / flutter test / Android 编译待 CI 验证(本机未装 Flutter,Dart/Kotlin 已人工复查)

约束遵守

  • Windows 桌面端冻结区仅 main.ts 一处最小守卫(4 行),rust/apps/inkhole-desktop/ 零改动
  • 平台差异用 #[cfg(windows)] 门控
  • 不"顺手统一"字段名/重构,所有改动针对具体 bug

Rust 核心(经 cargo clippy 零警告 + 79 测试验证):
- transport.rs: send_file 补源文件增长检测,与文件夹路径一致,
  防止传输期间追加写入导致接收端拿到旧快照仍校验通过
- service.rs: derive_transfer_id 在 Windows 归一化路径大小写,
  保证断点续传复用同一 transfer_id(与 normalize_wormhole_paths 一致)
- service.rs: start_lan 幂等清理改 warn 不上抛,确保旧会话 close
  失败也能进入创建新会话分支
- discovery.rs: 多宿主对端 goodbye 后等所有 hosts 探测失败才淘汰,
  避免首探失败即移除导致列表闪烁/极端下永久丢失

桌面端(Windows 冻结区最小守卫):
- main.ts: finishProgress 校验 sendId 匹配当前批次,旧批次完成事件
  不再清空新批次状态/隐藏取消按钮

Flutter 移动端:
- home_page.dart: identity_private 落盘改 await,首启崩溃或安全存储
  写失败不再导致下次冷启生成全新身份(致配对断裂)
- home_page.dart: lan.peers/lan.status 加 session_id 守卫,重启期间
  旧会话残余事件不再污染状态栏/设备列表
- inkhole_core.dart: call() 的 send 包 try/catch 防 Completer 泄漏
- inkhole_core.dart: close() 加 3s 超时 + kill 兜底,worker 阻塞在
  in-flight native 调用时不再永久挂起

Android:
- Exporter.kt: 新增 cleanupPendingOrphans,启动时清理上次导出被中断
  残留的 IS_PENDING=1 孤儿记录
- Exporter.kt: 文件夹导出回滚只删未发布项,保留已发布到 Download 的文件
- Exporter.kt: SAF 文件夹部分拷贝失败回滚已建子树

版本: 2.0.7 → 2.0.8 / Flutter 2.0.7+8 → 2.0.8+9
@RexVane
RexVane merged commit 2825673 into main Aug 3, 2026
7 checks passed
@RexVane
RexVane deleted the fix/bugfix-2.0.8 branch August 3, 2026 06:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant