跳转到内容

Rivu 代码实施计划 ​

历史设计参考

本文为 2026 年 10 月 12 日的实施设计,并非功能完成清单。当前状态见架构、源码结构和实现状态。

将产品需求和视觉原型落地为 Go/MyGo macOS 应用。原目录规划用于职责参考。保留原生技术栈,建立一个应用级会话,让主窗口与菜单栏成为会话投影。P0 包括真实导入、文件选择、队列、做种、恢复、桌面和更新;RSS、远程控制、流播放、账号和代理路由不在本轮范围。

架构决策 ​

决策实施含义
当时固定 Go 1.27.2 / MyGo v0.4.3生产 UI 使用 ui.View,HTML 仅是视觉参考
应用持有唯一会话关闭窗口仅取消视图和草稿,传输继续
根包组合 UI延续原有组织,不引入 Web 前端或 IPC
session 持有产品策略引擎仅报告观测,不覆盖运行意图
anacrolix/torrent 为首选候选M0 验证并固定版本后才交付适配器
版本化 JSON 为初始存储单一有序写入器、明确迁移、稳定记录,不每秒写全量
MyGo 处理原生托盘、登录和更新仅在公开能力不足时增加窄适配器
macOS 优先其他平台明确不支持能力,原生行为逐平台验收

候选引擎采用 MPL-2.0,协议、存储、暂停、恢复与分发要求通过 M0 前保持候选状态。

应用归属与并发 ​

application 持有 session、config、updater、tray、全局快捷键、工作上下文与窗口引用。窗口只持有选择、搜索、排序、详情标签、草稿、局部繁忙/错误和不可变快照。

串行会话命令排序意图、去重、队列和持久化确认。任务与引擎代次关联,移除/替换后的旧观测被丢弃。引擎 I/O 和写入由工作线程管理,同一时刻最多提交一个持久修改,测量仍可观测。

操作顺序:验证 → 保存期望状态 → 发布已提交意图 → 协调引擎。保存被拒绝时保持原意图,不启动新传输;保存后引擎失败则保留可重试错误。确认包含持久修订号,不承诺已连接节点。

暂停立即显示处理中并阻止新准入,确认流量停止后才完成。保存失败仍保持内存中安全停止,显示未保存错误,阻止普通退出/重启,不能为掩盖失败恢复任务。

window.run 承载窗口阻塞操作,派发前复制参数,Window.Update 更新 UI。对话框/草稿与命令结果分离,慢选择器不能阻塞暂停。已接受命令属于应用上下文,关闭窗口只停止等待,不取消已提交传输。原生句柄走主线程,避免工作线程与主线程互相等待。

摘要目标最高 4 Hz,主窗口约 2–4 Hz,面板 1–2 Hz,重要意图/错误及时发布。容量为 1 的通道合并显示通知,但持久化与完成通知必须有序,不能丢失。关闭时取消订阅,隐藏面板停止渲染。发布前深拷贝切片/映射,不暴露引擎指针。大文件树仅按当前选择读取,防止过时选择回调。

会话与引擎契约 ​

会话定义其消费的普通 Go 接口,引擎适配器实现,UI 不接触上游对象。记录稳定任务 ID、完整 v1/v2 身份及别名、来源、目录、选择、优先级、期望运行、暂停原因、批次、队列、上传、做种策略与完成周期。

引擎阶段与运行意图分离。手动暂停是持久意图,错误和环境等待是观测;恢复不能隐式清除需用户修复的存储锁。全部暂停只记录本批运行任务,恢复批次不能恢复此前手动暂停任务,手动恢复或移除后退出批次。

下载、校验、元数据准入有界,做种独立。无进展任务让出名额并可重试,活跃任务保持公平。重复检测使用完整种子身份,v1/v2 混合别名不能引入重复。支持范围先通过本地 swarm 确认,不因上游可解析就承诺端到端支持。

私有属性未知的磁力先禁用 DHT/PEX,仅使用明确 Tracker/节点;元数据认证后遵守私有发现。元数据预览不能写下载内容,取消后释放客户端和临时资源。不获取任意元数据源 URL 或 Web Seed。暂停必须真正停止节点传输,恢复重新校验。

文件优先级至少选中一个文件,进度按选中字节计算;共享分片需要清晰解释未选中文件中的数据。做种按累计上传/目标比例处理,手动恢复可覆盖目标,自动策略不覆盖手动暂停。

持久化与恢复 ​

使用独立、版本化的设置、会话和不可变 metainfo。用户修改及时持久化,统计建议每 15 秒及正常退出保存,说明崩溃可丢失最后统计区间。元数据先于引用提交,崩溃孤立元数据可稍后保守处理,任务墓碑提交前不能删除引用元数据。

复用同目录临时文件、同步和重命名。父目录同步失败属于提交不确定,不能声称回滚。设置/会话/元数据之间不构成事务,恢复需容忍孤立文件、缺失引用和待完成操作。损坏或未来 schema 保留原文件并阻止修改,提供恢复,不以空会话覆盖。

启动加载迁移、验证记录、构造停止句柄、检查目录、重新校验内容。仅在启用恢复且无阻塞时运行原本应运行的任务,手动与批次暂停跨重启保留。元数据缺失但有磁力时可重新获取,无法重建的本地来源进入需要处理。

移除流程可恢复:保存待移除 → 停止分离 → 计算逐文件安全废纸篓计划 → 执行 → 保存完成。保存部分结果,失败可重试;崩溃后不能复活下载句柄。在既定计划中确认消失的文件才可视为已移除,操作完成前保留归属记录。

目录与文件安全 ​

拒绝绝对成员路径、..、非法名称、规范化重复和大小写折叠冲突。校验元数据与实际打开,字符串前缀或一次符号链接检查无法抵御后续变化;M0 验证 rooted 文件访问。

记录目录根与文件归属,不跟随越界符号链接,开始前再查空间并处理写入 ENOSPC。不要将缺失外置卷挂载路径重新创建为本地目录;同路径替换磁盘需重新验证。

移除默认保留内容,废纸篓排除共享文件与无权接管文件,不递归移动共享根目录。TrashItem 失败保留未完成状态,绝不永久删除。覆盖混合归属、部分失败、符号链接和磁盘消失测试。

原生界面 ​

主窗口默认 1180 × 760 pt、最小 880 × 560 pt,侧边栏 190–220 pt、详情约 292 pt,空间不足先隐藏详情。列表稳定 ID,约 86–96 pt 行,Cmd/Shift 多选、Space 暂停、双击详情、共享右键命令。详情包括概览、文件和连接,丢弃选择过期结果。

添加窗口使用 MyGo Parent 与 Modal,实际验证 macOS sheet 后再承诺效果,批量逐项报错。菜单栏约 360 pt、最多四行、应用级生命周期。设置单窗口独立重开,展示保存值和真实原生结果。空状态提供添加,错误提供操作并保留有效工作。

语义主题、系统字体、正文约 13 pt、次级 11–12 pt;普通内容不透明,面板材质有实色回退。焦点、键盘、可访问标签、克制播报齐备,减少动态/透明度与 VoiceOver 在打包应用验收。presentation.go 共享筛选、计数、进度、速度、ETA;测量 1,000 任务/10,000 文件,必要时虚拟化。

commands() 是应用级稳定 ID 注册表,包含标签、快捷键、可用条件和动作,选择操作使用捕获的任务 ID,不能按菜单索引识别。无主窗口也应支持暂停、限速和退出。

macOS 集成与生命周期 ​

托盘不永久绑定菜单,左键切换 NewFlyout,右键临时绑定菜单后清除。MyGo 负责锚定、Escape 和关闭,硬件验证多显示器。关闭最后窗口仍保留 session,Dock 激活重开,禁用托盘保留 Dock,托盘失败可提示但主界面可用。

登录默认关闭,启用后默认后台启动;显式文件/URL 请求仍打开预览。设置打开或应用激活时刷新实际状态。布尔登录观测不能区分全部授权状态,不解析本地化错误来伪造枚举;需要时增加窄 macOS 适配器并验证打包行为。

通知使用稳定任务/完成周期 ID,点击定位;持久记录避免常规重复,但不承诺崩溃边界严格仅一次。系统支持、授权和成功请求是独立事实。

OnBeforeQuit 首次同步 PreventDefault 后异步退出,不阻塞 UI。菜单、Cmd+Q 和更新重启走同一流程。获准后加屏障、停止活动、保存、关引擎、标记就绪,再主线程调用 Quit/Relaunch;第二回调放行。OnQuit 只作幂等清理。保存/关闭失败保持应用打开并允许重试;取消后按原意图恢复,已关引擎则重建。周期保存限制强制终止损失。

更新实现 ​

更新器拥有不可用、空闲、检查、最新、可用、安装、需重启和失败状态,区分尝试与成功时间。Enabled() 为 false 不等于最新。自动检查先征求同意,每 24 小时最多一次,抖动与退避,手动复用进行中检查。取消同意仅取消定时,不伪造成功。

MyGo Install 合并下载、验证、替换;下载百分比不能称总安装进度,差量回退全量时可重置。成功后等待退出协调器保存才重启。

自动安装需维护屏障并重新确认无元数据、下载、校验、做种或排队待运行工作;阻止检查与替换之间的新准入。手动立即安装先解释并停止活动。失败或稍后重启时释放屏障,恢复允许任务,保留待重启版本。

正式发布配置可信 HTTPS、嵌入公钥、签名产物与公证,私钥仅保存在发布密钥中。受控验证错误架构、签名、空间与中断,可靠前置检查可分类,其他保留原始错误,失败必须留有可运行应用。

交付顺序 ​

里程碑交付与退出条件
M0 可行性固定引擎,验证 v1/v2/混合、私有发现、真实暂停、仅元数据、选择文件、校验恢复;验证面板/modal 和状态适配器缺口
M1 生命周期唯一会话、确定引擎测试替身、持久意图、批次暂停、订阅、关闭窗口继续运行、共享修订
M2 原生展示全部设计画面、两种外观、选择/筛选、空/错/禁用能力,快照加打包面板冒烟
M3 真实传输本地 swarm、部分选择、暂停/恢复、队列、比例停止、恢复和安全移除,无伪成功
M4 桌面集成关联、第二实例、后台登录、系统状态、通知、睡眠、Dock、多显示器打包验收
M5 更新发布签名更新、保存失败阻止重启、失败恢复、签名公证、完整回归矩阵

M1 先归属再持久状态再命令订阅。M3 先单种子闭环,再队列/做种/批次,再磁力/批量/失败恢复。提交围绕行为;替代实现和测试完成后才删除旧示例。

验证与验收 ​

纯 Go 覆盖意图/观测、批次、公平调度、做种覆盖、身份别名、坏 schema、失败写入、退出屏障、慢/过时订阅;文件系统覆盖已有数据、穿越/链接、名称冲突、分片交叠、缺卷、共享归属和部分移除;本地 swarm 覆盖字节、元数据无内容、暂停流量、恢复、强制终止、限速和私有发现;UI 覆盖尺寸、外观、长名称、键盘、详情、错误和关闭回调;打包 macOS 验收托盘、窗口/退出、Dock、冷关联、登录授权、通知、睡眠和更新。

测试使用受控依赖与 t.TempDir(),网络 swarm 由显式 integration 目标启用,使用本地生成数据。崩溃恢复在确定检查点终止子进程,UI 快照不能证明原生注册、网络和更新正确。

sh
make check
make race
go tool mygo vet
make snapshots

发布前记录 macOS、架构、包/签名状态和检查结果,实际测量响应与资源。每项 P0 需具备可用路径或明确范围决定,未实现的设置开关不算完成。

实施参考 ​

支持 macOS、Windows 和 Linux 的原生 BitTorrent 应用。