Replies: 2 comments
ADR-0008: 桌面端存储源插件化
背景桌面端需要支持 Google Drive、FnOS 以及未来更多存储系统。目前 同时,桌面端大部分云端上传和删除操作仍经 决策采用“外部进程插件 + JSON-RPC over stdio”的架构。桌面主进程负责插件生命周期、统一存储 不采用 Go 核心抽象业务服务只依赖统一端口,不依赖 provider 名称: type StoragePort interface {
Upload(ctx context.Context, req UploadRequest) (ObjectInfo, error)
Delete(ctx context.Context, req DeleteRequest) error
Stat(ctx context.Context, sourceID, key string) (ObjectInfo, error)
List(ctx context.Context, req ListRequest) (ListResult, error)
Health(ctx context.Context, sourceID string) HealthResult
}插件通过 manifest 声明能力,而不是由核心猜测能力: 无法提供永久 URL 的 provider 必须返回 URL 类型( 插件包和运行时插件以带签名的 zip 分发: manifest 至少包含 JSON-RPC 初始方法: 上传内容不直接编码进 JSON。Host 为每次传输创建带随机 ID 的临时文件/句柄,插件只获得该 存储源模型现有固定 provider 字段逐步迁移为: Windows 使用 Credential Manager,macOS 使用 Keychain,Linux 使用 Secret Service。OAuth 照片中的 Provider 适配原则先实现通用协议,再实现私有 API:
FnOS 的具体插件方案必须先确认其是否支持 S3、WebDAV、SMB 或稳定的官方 HTTP API;不能 Google Drive 约束Google Drive 插件需要 OAuth 2.0 Authorization Code + PKCE、refresh token、文件夹 ID、 安全约束
实施阶段Phase 0:边界确认
Phase 1:统一核心接口
Phase 2:插件运行时
Phase 3:配置和凭据
Phase 4:首个外部插件
验证要求每个插件必须通过统一 contract tests:
备选方案
影响正面影响:新增存储源无需修改桌面主业务;插件可以独立发布和升级;Google Drive、FnOS 等 代价:需要维护插件协议、签名、安装和版本兼容;外部进程带来 IPC、调试和分发复杂度; 本 ADR 只批准架构方向,不代表立即实现所有 provider。下一步应先完成 Phase 0,并以五个 |
|
存储插件生成为应用插件,提高未来可扩展性 |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
相关模块 / Area
Mobile 客户端 / Mobile
需求与场景 / Need and use case
面向Desktop端,减轻应用压力
以插件形式满足多存储源存储的需求,如Google Driver、One Driver、FnOS等
Web端不考虑,暂时用当前能力
建议方案 / Proposed solution
TODO
替代方案 / Alternatives
No response
参考资料 / References
No response
参与贡献 / Contribution
All reactions