OpenHarmony forbids apps from binding netlink sockets, so local-ip-address failed and the whole Sync panel failed to load. Enumerate interfaces through getifaddrs (if-addrs) on every platform, the same source mdns-sd uses. - One port call returns available and default addresses from a single snapshot. - The default prefers running broadcast interfaces, then the default route, so full-tunnel VPNs and cellular links are not chosen. - The pairing return address stays route-based and moves into the adapter, its only caller.
7.5 KiB
同步(LAN Sync / TT-Sync v2)
LAN Sync 与远端 TT-Sync 共用 v2 的数据集、计划、传输和提交语义。本文说明职责与稳定契约,具体字段、参数和默认值以源码为准。
架构与数据方向
| 拓扑 | 连接与传输 |
|---|---|
| LAN Sync | 设备间通过 HTTPS 连接;支持附近发现、手动地址和配对链接。上传通过请求对端回拉完成。 |
| TT-Sync | 通过服务端邀请链接绑定远端服务,支持直接上传和下载。 |
应用层负责配对、偏好与作业编排,tt-adapter-sync 承载网络、存储和共享传输引擎,Tauri host 负责命令、事件与平台能力。分层遵循后端结构。
数据范围与写入约束
- 两种拓扑使用同一份
DatasetPolicy,作业范围由用户的DatasetSelection决定。新增数据类型应进入统一策略;面板只选择数据集,不维护路径规则。 - 同步自身的身份、配对记录和配置,以及本机平台策略缓存,始终排除在同步范围之外。用户密钥、模型响应等敏感或重型数据需要用户显式选择。
- Agent 数据按所选范围作为普通文件同步,不做额外解析或限制,已有材料也不会因此被过滤。
- Agent 续接时按需校验所选 Run 的本地 checkpoint 与运行材料。Full 范围包含恢复材料,默认核心历史不足以恢复;恢复资格不依赖同步作业状态。同步不提供跨设备运行锁或活动快照一致性。
- 本地同步写入与扩展安装、更新等变更共用互斥门禁,冲突时直接失败;只发送远端回拉请求的作业不占用本地写入许可。
Exact保持同步源权威;PreferNewer保护目标端修改时间严格更新的同路径文件,依赖设备时钟基本同步。覆盖策略归逻辑发起方所有,贯穿手动与自动同步。- Mirror 删除按计划在删除或提交阶段执行,目录清理只能发生在对应的数据集边界内。同步范围不支持符号链接。
- 每个文件原子发布并保留修改时间;增量判断依赖文件大小和修改时间。失败后已完成的文件保留,重试重新扫描并计算计划,不提供 bundle 字节级断点续传。
- 成功或部分失败导致本地数据变化时,必须刷新相关运行时缓存。能力、权限或数据集版本不满足要求时,在用户数据写入前失败;Sync Panel 要求 bundle 与 zstd 支持。
TriviumDB数据库
extensions.databases 以 namespace 为同步和提交单位,整体保留或替换数据库,不合并记录。默认范围不包含,Full 包含;两端均需支持此 scope。
Exact 以源端为准;PreferNewer 比较维护前文件组的最大修改时间,仅在目标严格较新时保留目标。Incremental 保留目标独有的 namespace,Mirror 删除它们。
同步和归档共用数据库维护锁,覆盖扫描到发布。发送端 flush 后读取原文件,接收端关闭实例并收齐文件后整体发布。调用方的句柄生命周期见 Database API。
独立设置范围
核心设置、当前外观与主题、当前预设与提示词、当前布局和用户设定可独立同步。当前生效配置与预设库、主题库分别选择。
用户设定资料保存在头像 PNG,选择与偏好单独存储,两者同属一个同步项。旧数据在启动和导入时转换,API 与归档导出保持上游完整设置格式。各分区作为普通文件同步,路径规则由 TT-Sync 统一维护。
LAN 发现与信任
发现只提供设备位置和公开信息,不建立信任,也不触发同步。附近设备、手动地址和配对链接共用配对流程,按需启动本机接收服务,并由对端用户确认;二维码是辅助入口。配对链接保持 v2 格式,旧 LAN v1 设备需要重新配对。
设备名称、平台和地址是可变信息,设备身份与信任独立保存。未固定证书的连接只能读取公开设备信息;配对和数据传输使用 SPKI 固定证书校验。已配对设备更换地址时仍须验证保存的指纹与 DeviceId,保留原有授权和身份。
LAN 上传保留发起方的覆盖策略,但实际回拉使用目标设备的有效 Sync mode;Mirror 删除的执行权在目标端。“请求已接受”与“数据同步完成”是不同结果。
本机广播随接收服务启停,只下载时可以独立发现。发现失败不删除配对或停用仍可用的 HTTPS 连接;停止接收服务不取消已接受的本地下载作业。
本机地址按用途分三类:可用地址列出全部非回环 IPv4,包括 VPN 与组网地址;默认地址用于配对链接,优先取运行中的广播接口上默认路由所在的地址,广播接口也包括虚拟网桥与 TAP;回连地址在配对时取本机到对端路由的源地址。
附近发现使用 mDNS / DNS-SD。iOS 受直接组播权限限制,使用系统 Bonjour,macOS 共用这一后端;Android、Windows、Linux 与鸿蒙使用 Rust mDNS。两套后端共享服务信息与设备目录,记录更新和过期由发现后端处理。
LAN 功能受宿主 sync.lan 能力门禁和平台权限约束。移动端权限、签名与生命周期要求见 Android、iOS 和 鸿蒙。
面板、事件与自动同步
面板通过宿主边界调用后端,传输与调度由 Rust 执行。已保存配置与编辑草稿分离,刷新不会提交或覆盖草稿;设备卡片和自动同步目标共用展示数据,本地备注不改变对端身份。
两种拓扑共用 sync:job 表达作业进度和结果。手动作业由命令返回的报告驱动完成提示,后台作业由事件通知,避免重复提示。发现变化与配对完成分开通知;配对完成通知只能在记录保存后发布。
自动同步只在应用进程运行时发起上传,使用独立保存的目标、范围和模式。TT-Sync 目标需要相应写入、删除权限;LAN 目标沿用对端回拉语义,只能将请求已接受记为已发出请求。自动任务不打开手动进度弹窗,也不强制刷新页面。
接收服务随应用启动和自动上传是独立设置;启用接收服务及发现不代表批准新设备配对。
源码入口
| 职责 | 入口 |
|---|---|
| 配对与配置用例 | LAN 服务、TT-Sync 服务 |
| 作业与自动调度 | 作业协调器、自动同步服务 |
| 作业契约 | 共享 DTO 与事件 |
| 网络、存储与数据范围 | 共享同步实现、TT-Sync 适配 |
| 发现协议与运行参数 | LAN 发现 |
| Tauri 集成 | 服务装配、事件与批准适配 |
| 前端交互 | 面板与 Controller、宿主适配 |