Skip to content

Releases: fb0sh/ProxyDownloadManager

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 21 Jul 06:52

Added

  • 下载详情窗 进度地图(Progress Map):一格一个固定分片,每行 8 列,绿色自下而上填充并显示百分比
  • 详情窗标题区:总进度条 + 速度 + 暂停/继续;进度地图置于第二卡片
  • 引擎按写入 offset 归入固定 DownloadPart,进度事件携带 per-part 字节

Fixed

  • 暂停/恢复后分片进度不再卡住;resume 使用 gob/DB 剩余任务,禁止把 downloaded 清零
  • 崩溃/强退后:约 1s 刷盘 downloaded+parts;启动恢复用 DB 重建 resume
  • 详情速度显示(修正采样门槛与重渲染干扰);操作按钮点击后立即禁用直至完成
  • 多选操作后保持勾选状态

v0.9.7 — Architecture Refactoring

Choose a tag to compare

@fb0sh fb0sh released this 20 Jul 12:17

Added

  • PdmError 实现 serde::Serialize,Tauri 命令返回结构化错误(tagged union),前端可匹配 error.kind
  • 前端新增 PdmError 类型(src/types.ts
  • DownloadStateFacade 新增生命周期方法 on_paused(id) / on_deleted(id),封装 gob 持久化决策
  • 引擎集成测试:mock HTTP server + 4 个端到端测试(单引擎/并发引擎/进度事件/取消)
  • EventTransformer 纯函数:引擎事件 → 结构化 EventAction,6 个单元测试
  • tauriClient.ts 完整化:8 个新命令(exitApp, openFile, readLogs, getExtensionsDir, openExtensionsFolder, getFileIcon, checkUpdate, testProxy)
  • DialogRenderer 共享组件:消除 App.tsx 与 src-present/App.tsx 的对话框渲染重复
  • useDialog() / useSelection() 自定义 hooks,AppContext 深化
  • 浏览器扩展 shared/ 共享源码 + build.sh 构建脚本
  • patchDownloadProgress 纯函数及 5 个 vitest 测试

Changed

  • DownloadManager 移除 network 依赖,test_proxy/check_update 直接通过 AppState 调用
  • 所有 Tauri 命令返回 Result<T, PdmError>(不再 .map_err(|e| e.to_string())
  • save_gobsave_resume_stateload_gobload_resume_state(语义更清晰)
  • 前端 invoke() 调用全部经 tauriClient,零裸 invoke
  • parse_message() 从 WebSocket handle_connection 提取为纯函数 + 5 个测试
  • sendReliable() 签名简化(移除未使用的 referrer/tabTitle 参数)

Fixed

  • 19 个空 catch {} 块全部添加注释(预期失败 vs 需追踪的异常)
  • 浏览器扩展删除死代码 send()looksLikeDownload()
  • 移除 content.js + host_permissions: ["<all_urls>"](无需权限的空脚本)
  • 移除未使用的 zustand 依赖

v0.9.6

Choose a tag to compare

@github-actions github-actions released this 19 Jul 07:44
chore: bump version to 0.9.6

v0.9.5

Choose a tag to compare

@github-actions github-actions released this 19 Jul 05:10
chore: bump version to 0.9.5

v0.9.4

Choose a tag to compare

@github-actions github-actions released this 19 Jul 04:56
chore: bump version to 0.9.4

v0.9.3

Choose a tag to compare

@github-actions github-actions released this 19 Jul 04:30
fix: sync tauri.conf.json version to 0.9.3

v0.9.2

Choose a tag to compare

@github-actions github-actions released this 18 Jul 12:07
chore: bump version to 0.9.2

v0.9.1: Post-Review Architecture Fixes

Choose a tag to compare

@fb0sh fb0sh released this 18 Jul 10:01

What's Changed

5 Architecture Fixes from Post-v0.9.0 Review

1. Fix silent progress loss in flush_to_db

  • runtime.rs: Track per-entry flush success; failed entries stay dirty and retry on next cycle
  • Previously: let _ = silently discarded DB write errors, then unconditionally marked all entries as flushed
  • Added integration test with real DB writes

2. Fix rate limiter blocking tokio executor

  • limiter.rs: Changed wait_n to async using tokio::time::sleep
  • Previously: std::thread::sleep blocked OS threads, starving the tokio executor
  • Locks are dropped before sleeping to avoid blocking other workers

3. Unify start/redownload download pipeline

  • download_manager.rs: Extracted shared execute_download(DownloadSpec) method
  • Both start_download and redownload_download now delegate to it
  • Bug fix: redownload now uses probe_service::probe_with_fallback (was bypassing it)

4. Unify DownloadStatus serialization tests

  • types.rs: Added JSON roundtrip test for all DownloadStatus variants
  • db.rs: Added DB roundtrip test for all variants + parse_status edge case tests

5. Verify error event logging

  • Errors already flow through handle_event → Logger → Log Dialog
  • Confirmed the logging architecture is sound

Full Changelog: v0.9.0...v0.9.1

v0.9.0: Architecture Deepening (6 Candidates)

Choose a tag to compare

@fb0sh fb0sh released this 18 Jul 09:17

What's Changed

Architecture Deepening — 6 Candidates Implemented

Candidate 2 — Collapse Download Type Trinity

  • Replace DownloadConfig with EngineConfig in types/engine_config.rs
  • Add DownloadItem::to_engine_config() and DownloadState::to_engine_config()
  • Rename proxy_nameproxy_url in EngineConfig (fixes semantic inconsistency)
  • Remove duplicate output_path field (was always identical to save_path)

Candidate 3 — Seal Engine Resume-State Seam

  • Rename OnCancelledOnResumeState (reflects actual purpose)
  • WorkerPool::add_with_id accepts on_resume callback parameter
  • DownloadManager creates facade-based callback via make_resume_callback()
  • Engine no longer directly calls gob::save_state (seam is sealed)

Candidate 5 — Extract Platform Utilities from cmd.rs

  • update.rs: AssetInfo, UpdateInfo, GithubRelease, GithubAsset, compare_versions, current_platform_suffix, check_update command
  • platform.rs: sync_autostart, deploy_extensions, copy_dir_recursive, resolve_extensions_dir
  • cmd.rs shrinks from 434 to ~180 lines (pure Tauri command routing)

Candidate 4 — Unify Event Vocabulary

  • event_bus.rs: FrontendEvent enum (single source of truth for event names)
  • EventBus struct wraps AppHandle::emit
  • Remove EmittedEvent struct and direct app_handle.emit calls from cmd.rs
  • constants/events.ts: EVENTS object mirrors FrontendEvent variants

Candidate 6 — Frontend Context Provider

  • contexts/AppContext.tsx: AppProvider owns dialog, selectedIds, filter
  • tauriClient.ts: plain object export replacing tauriCommands() function
  • App.tsx: uses useAppContext() instead of useState for state
  • Layout.tsx: reads from context, 19→11 props (state props removed)

Candidate 1 — Deepen DownloadManager Orchestrator

  • services/chunk_planner.rs: compute_connection_count, plan_chunks, check_disk_space
  • services/probe_service.rs: probe_with_fallback, build_user_agents
  • download_manager.rs: inline logic replaced with service calls

Files Changed

  • Created: types/engine_config.rs, event_bus.rs, update.rs, platform.rs, services/mod.rs, services/chunk_planner.rs, services/probe_service.rs, contexts/AppContext.tsx, tauriClient.ts, constants/events.ts
  • Deleted: hooks/useTauriCommands.ts
  • Modified: 16 existing files across backend and frontend

Full Changelog: v0.8.1...v0.9.0

v0.8.1: PdmError Structured Error Enum

Choose a tag to compare

@fb0sh fb0sh released this 18 Jul 06:17

What's Changed

PdmError Structured Error Enum

Replaced Result<T, String> with PdmResult<T> across the entire Rust backend, introducing a typed PdmError enum with 10 variants:

  • Cancelled — download cancelled by user
  • Http(u16) — HTTP status code error
  • ClientBuild(String) — HTTP client construction failure
  • Probe(String) — URL probe failed
  • NotFound(u64) — download not found
  • Db(String) — database error
  • Config(String) — configuration error
  • Io(String) — I/O error
  • Network(String) — network error
  • Other(String) — generic fallback

Automatic conversion via From impls for reqwest::Error, rusqlite::Error, io::Error, String, &str, PoisonError, and serde_json::Error. The Tauri command layer (cmd.rs) retains String for IPC compatibility.

Files Changed

  • types.rs — PdmError enum, Display, Error trait, From impls, PdmResult alias
  • db.rs — all methods return PdmResult
  • download_manager.rs — all methods return PdmResult
  • engine/mod.rs — DownloadEngine trait returns PdmResult
  • engine/concurrent.rs — download() returns PdmResult, typed errors
  • engine/single.rs — uses PdmError::Cancelled/Http/Io/Network
  • worker.rs — add_with_id returns PdmResult
  • probe.rs — returns PdmResult
  • config.rs — save() returns PdmResult
  • cmd.rs — DM calls use .map_err for Tauri IPC boundary

Full Changelog: v0.8.0...v0.8.1