0b766f496ed4fdd4d1dc935f0ccc940e446a608f
- src/lib.rs: HTTP catch-up 拿 apps+msgs → 保留 apps 给 WS worker → spawn std::thread 跑 websocket::run_stream_loop;WS 帧 → MessageItem → std::sync::mpsc::channel → UI 线程 slint::Timer 100ms tick drain → shared Rc<VecModel<MessageItem>>::push - src/models.rs: 拆 try_fetch_initial_data 返回 (apps, msgs, text) 原始 DTO,让 lib.rs 自己决定 model 包装时机;保留 try_fetch_real_messages + 新增 build_message_model 给 Settings → Test Connection 复用 避坑: - VecModel 不是 Send,不能跨线程直接 push——必须 mpsc channel + UI 线程 timer 中转(之前想用 invoke_from_event_loop 包装 Rc 失败: Rc 不是 Send,closure 不满足 FnOnce + Send + 'static) - mpsc::Receiver 在 std Rust 是 !Sync 但 Send;Timer::start 只要求 'static 不要求 Send(Timer callback 总在 UI 线程跑)—— 所以 closure 直接 capture rx 不需要 wrap - channel 选 unbounded:WS 重连风暴期间 message 风暴,UI 100ms drain 完全跟得上,不需要 backpressure - drain_timer 必须持有到 run() 末尾否则被 drop(slint Timer drop 自动停止) 验证:cargo build / build --release 都 exit 0,0 warning - cargo test: 12 passed (3 reconnect unit + 6 api + 3 websocket); 0 failed - debug 35.46 MB, subsystem = WINDOWS_CUI - release 9.75 MB, subsystem = WINDOWS_GUI(channel + timer drain +0.3 MB)
Windows-Gotify-Client-Rust
轻量、现代、Windows 原生体验良好的 Gotify 桌面客户端,使用 Rust + Slint 构建。
详细的产品定位、技术栈约束、架构、UI 规范与分阶段实施计划全部记录在
AGENTS.md。本文档只做项目导览。
状态
🚧 从 0 起步 —— 当前仓库只有目录骨架与占位 Cargo.toml,尚未进入 Phase 1(Bootstrap)。
完整 8 阶段路线图见 AGENTS.md §57。
目标平台
- Windows 10 x64
- Windows 11 x64(ARM64 条件允许时支持)
- 后台常驻、托盘型客户端
技术栈
| 层 | 选型 |
|---|---|
| 语言 | Rust stable |
| UI | Slint 1.17.x |
| HTTP | reqwest(blocking + rustls) |
| WebSocket | tungstenite |
| Windows 集成 | windows-rs focused crates(按需引入) |
| 配置 / 状态 | JSON 文件(%APPDATA%/WindowsGotify/) |
| 日志 | tracing + tracing-subscriber |
显式禁用:Tauri / Wails / Electron / WebView2 / WPF / WinUI 3 / Node 运行时。
理由见 AGENTS.md §2。
仓库布局
Windows-Gotify-Client-Rust/
├── Cargo.toml # 占位 — 见 AGENTS.md §44
├── AGENTS.md # AI Agent 实施计划(1363 行)
├── README.md
├── LICENSE # MIT(占位)
├── .gitignore
├── assets/ # 图标、字体等
├── ui/ # Slint 视图
├── src/ # Rust 业务代码
│ ├── gotify/ # HTTP + WebSocket
│ ├── storage/ # config.json / state.json
│ ├── windows/ # 托盘 / Toast / 启动 / 单实例 / URL
│ └── services/ # 生命周期
├── tests/ # 集成测试
└── scripts/ # PowerShell 构建脚本
开发环境
本仓库目前还没有源码,本节将在 Phase 1 完成后补全具体的
cargo run/cargo build --release步骤。
隐私与安全
- App Token 默认以 JSON 明文存储在
%APPDATA%/WindowsGotify/config.json,仅当前用户可访问 - 日志永不打印完整
Authorization头 - 通知点击的
click.url仅允许http:///https://,拒绝file:///javascript:/ 自定义 scheme - 详细策略见
AGENTS.md§13 / §20 / §38 / §51
License
MIT(见 LICENSE)。