Gateway
Gateway 架构
WinCode Gateway 基于 WebSocket 协议,通过云端中转连接多台设备。
Gateway 架构
WinCode Gateway 采用"云端中转 + 本地设备服务"的两层架构。设备之间并不直接建立 P2P 连接,而是都连接到同一台云端中转服务器,由该服务器把消息路由到对端。

整体数据流
┌────────────┐ ┌──────────────┐ ┌────────────┐
│ PC 端 │ WS │ 云端中转 │ WS │ 移动端 │
│ (桌面) │◀═══════▶│ 服务器 │◀═══════▶│ │
└────────────┘ └──────────────┘ └────────────┘
│ │
│ gateway-status 事件 │ 扫码配对
▼ ▼
gatewayStore PairDialog- 桌面端启动时,后端自动向云端 WebSocket 服务发起连接。连接成功后,
gatewayStore接收到gateway-status事件,把状态从connecting切换为connected。 - 移动端启动时,流程相同。
- 配对时,桌面端通过
gatewayPairToken()生成一个临时配对码,并渲染为二维码。移动端扫描二维码后,云端中转服务器把两台设备绑定为一个Binding。 - 绑定完成后,两台设备即可互发消息。桌面端收到的移动端请求,会先交给本地的
device service处理,再把结果回传。
状态模型
前端通过 gatewayStore 维护 Gateway 的状态。核心字段有:
status:来自后端的GatewayStatusPayload,包含status字段(connecting/connected/disconnected)和可选的retry_in秒数。binding:当前的BindingInfo,包含bindingId、deviceId与createdAt。为null时表示未配对。openSessionId:当移动端打开桌面端的某个会话时,通过gateway-open-session事件推送,桌面端据此跳转。
状态的变化都通过 Tauri 的事件系统(listen)驱动,而不是轮询。
device service
每台设备的本地 Rust 后端都运行着一个 device service,负责:
- 管理与云端的 WebSocket 连接,包括自动重连。
- 处理从另一台设备发来的请求,例如查询会话列表、转发消息、拉取上下文。
- 把本地的变更(例如新增会话)按需同步给对端。
device service 与聊天进程解耦,即使聊天进程重启,Gateway 的长连接依然可以保持。