跳到主要内容

架构说明

NyaTerm 是一个基于 Tauri 2 的桌面应用:前端在 src/,后端在 src-tauri/src/,两者通过 Tauri command 与事件通信。

整体架构

┌─────────────────────────────────────────────────────────┐
│ Frontend (React / TypeScript) │
│ ├─ Main window: AppProvider + App.tsx │
│ ├─ Child windows: ChildAppProvider + ChildWindowRouter│
│ ├─ Terminal workspace, side panels, dialogs │
│ └─ invoke wrapper + Tauri event listeners │
├─────────────────────────────────────────────────────────┤
│ Tauri IPC bridge │
├─────────────────────────────────────────────────────────┤
│ Backend (Rust) │
│ ├─ SessionManager / TunnelManager / RecordingManager │
│ ├─ PendingAuthManager / CloudSyncManager │
│ ├─ SSH / SFTP / watcher / importer / stats / AI │
│ └─ redb persistence + encrypted credential storage │
└─────────────────────────────────────────────────────────┘

前端窗口模型

前端入口由 src/main.tsx 决定:

  • 主窗口:加载 AppProviderApp.tsx
  • 子窗口:加载 ChildAppProviderChildWindowRouter

当前子窗口流程包括:

  • 设置
  • 新建连接
  • 快捷命令编辑
  • 自动上传提示

相关实现位置:

  • src/main.tsx
  • src/ChildWindowRouter.tsx
  • src/lib/windowManager.ts

其中 windowManager.ts 还负责 modal child 与主窗口之间的焦点 / 可交互状态协调。

前端状态模型

AppContext

src/context/AppContext.tsx 是主窗口的核心状态容器,负责:

  • 工作区标签与窗格树
  • 应用设置与 UI 设置
  • 已保存连接 / 分组刷新
  • 启动时恢复 ui.open_tabs
  • 活动栏布局和面板状态

ChildAppProvider

src/context/ChildAppProvider.tsx 是子窗口专用的轻量 Provider:

  • 只加载 / 保存设置
  • 通过事件与主窗口同步
  • 不管理完整的工作区标签与会话状态

TransferContext

src/context/TransferContext.tsx 单独管理文件传输队列,消费后端 transfer-event 事件,并驱动暂停、继续、取消、重试等前端行为。

工作区模型

NyaTerm 的终端工作区有两个容易混淆、但职责不同的层次:

逻辑标签 / 窗格树

src/lib/workspaceTabs.ts 负责:

  • 创建标签页与会话 pane
  • 标签页内横向 / 纵向分屏
  • 持久化 ui.open_tabs
  • 启动时恢复可序列化的工作区结构

运行时窗口布局

src/lib/tabWindows.ts 负责:

  • 不同标签当前分布在哪个 window leaf 中
  • 每个 leaf 的活动标签
  • 运行时窗口 split ratio

可以简单理解为:

  • workspaceTabs.ts = “会保存下来的逻辑工作区”
  • tabWindows.ts = “当前运行时终端区域怎么摆”

终端集成

src/components/terminal/XTerminal.tsx 是 xterm.js 集成中心,负责:

  • Fit/Search/WebLinks 等 addon
  • 命令历史建议与 shell integration
  • 行号 / 时间戳 gutter
  • 动作链接与关键词高亮
  • 大输出保护与恢复提示
  • 与 session 事件的绑定和重连处理

后端运行时模型

src-tauri/src/lib.rs 是后端入口,负责构建并注入共享状态:

  • SessionManager
  • TunnelManager
  • RecordingManager
  • PendingAuthManager
  • CloudSyncManager

同时也在这里集中注册所有 Tauri commands,例如:

  • session 创建 / 关闭 / 写入 / 录制 / OTP
  • SFTP 文件与传输操作
  • 连接 / 密钥 / 密码 / OTP / 设置读写
  • cloud sync / backup 状态、推送、拉取、恢复、冲突处理
  • watcher、翻译、导入、stats、tunnel、proxy、AI

SessionManager 与事件流

src-tauri/src/core/session.rs 中的 SessionManager 是活动会话注册中心,负责:

  • 管理所有活动会话
  • 向具体 session I/O loop 路由命令
  • 维护命令历史与模糊搜索存储
  • 发出 sessions-changedcommand-history-changed 等事件

后端还会向前端发送这些典型事件:

事件说明
terminal-output-{id}终端输出
cwd-changed-{id}工作目录变化
session-closed-{id}会话关闭
sessions-changed会话列表变化
connections-changed已保存连接变化
transfer-event传输队列进度变化
otp-request触发 OTP / keyboard-interactive 认证
cloud-sync-status-changed云同步 / 备份状态变化
cloud-sync-history-changed同步 / 备份历史变化
cloud-sync-conflict云同步冲突预览与处理入口
AI 流式事件AI 响应、推理内容、命令卡片和执行状态

SSH / SFTP / watcher / 导入 / AI

核心后端能力主要分布在这些模块:

  • src-tauri/src/core/ssh/ — SSH 连接、认证、OSC/CWD、SFTP、隧道
  • src-tauri/src/core/pty.rs — 本地终端
  • src-tauri/src/core/telnet.rs — Telnet
  • src-tauri/src/core/serial.rs — 串口
  • src-tauri/src/core/watcher.rs — 本地文件监听与自动上传流程
  • src-tauri/src/core/importer.rs — Xshell / MobaXterm / WindTerm 导入
  • src-tauri/src/core/recording.rs — 会话录制
  • src-tauri/src/core/cloud_sync.rs — 云同步、远程备份、状态事件、冲突处理
  • src-tauri/src/core/portable_snapshot.rs — 可移植快照构建 / 应用与同步范围控制
  • src-tauri/src/core/ai.rs — provider 调用、流式响应、结构化输出、命令卡片与审计历史

配置与持久化

应用配置保存在 ~/.nyaterm/nyaterm.redb 中。主要 redb 文档包括:

  • JSON 文档:settingssessionskeyspasswordsotpquick-commandtunnelsproxieshistorycloud-synccloud-sync-stateai-historyai-audit
  • 文本文档:known_hostsmaster.key

从 Dragonfly 升级时会复制 ~/.dragonfly/dragonfly.redb;如果旧环境只有 .dragonfly JSON / 文本文件,也会复制后迁入 redb。旧目录不会被删除。

其中敏感值会先加密再写盘,因此前端管理的是可复用凭据条目,而不是明文配置。

云同步功能本身还有两层额外模型:

  • src-tauri/src/config/cloud_sync.rs 负责 provider 配置、运行状态和敏感字段加密 / mask / merge
  • src-tauri/src/core/portable_snapshot.rs 定义哪些配置会进入可移植快照,哪些设备本地 UI 状态会保留在本机