运行时、传输与存储开发
NyaTerm 没有独立的 Web 后端。原生应用的领域逻辑、协议运行时和持久化按职责拆分在多个 Rust crate 中,并通过有类型的接口与 GPUI 桌面层协作。
Crate 边界
| Crate | 放置的行为 |
|---|---|
nyaterm-core | 纯模型、解析、策略、兼容格式和 schema-neutral 序列化 |
nyaterm-transport | PTY、SSH、SFTP、Telnet、串口、隧道、远程操作和传输运行时 |
nyaterm-store | redb、事务、存储 worker、加密适配和兼容性读取 |
nyaterm-terminal | 终端状态机、快照、控制序列、编码和图形协议 |
nyaterm-remote-desktop | RDP/VNC 会话管理、framebuffer 与输入模型、证书策略、剪贴板状态和 helper IPC 合约 |
nyaterm-rdp-helper / nyaterm-vnc-helper | 隔离的 helper 进程,持有各自的协议解码器 |
nyaterm-otp | HOTP/TOTP 兼容实现 |
低层 crate 不导入 GPUI 或桌面呈现类型。需要跨边界时定义小型 typed adapter,不把 application-wide model 下沉到 transport 或 store。
解析服务器控制字节的协议解码器只放在 helper crate 里。nyaterm-remote-desktop 自己不含解码器,两个 helper 必须把解码器 panic 转换成致命 IPC 错误上报。详见 架构说明 → RDP / VNC 的进程隔离。
会话与传输运行时
nyaterm-transport 的 SessionManager 管理活动会话,并为本地 PTY、SSH、Telnet、raw TCP、串口、RDP 和 VNC 提供统一生命周期入口。
会话输出通过 SessionEvent 返回:
Output/OutputDroppedCwdChangedCommandAcceptedExitedError
事件队列按原始事件顺序限制高吞吐输出:单个大 Output 会拆成有界 chunk,8/4 MiB 高低水位通过 producer wait 提供正常运行期的无损背压,不合并相邻 raw output。桌面层批量 drain 事件,而不是让后台线程直接修改 GPUI state。新增会话事件时使用有类型的 enum variant,并同时测试正常顺序、队列上限和关闭路径。
关闭单个 session 时,manager 必须先取消该 session 并唤醒 queue waiter,再关闭 transport 和 join reader;取消会清除该 session 的已排队事件并拒绝后续事件,但不能影响其他 session。manager 整体析构必须先全局关闭 queue、唤醒 producer 和 blocking consumer,再关闭并 join 全部 session。全局关闭后的空 blocking drain 立即返回;这些 shutdown 丢弃边界不改变正常过载的无损与 8/4 MiB 滞回契约。
SSH、SFTP、隧道、远程进程和 Docker 等操作也应保持异步或运行在专用 worker 上。不要让 transport 依赖窗口、对话框或桌面 feature 类型。