Files
WorkspaceAccessHost/docs/platforms/session-lifecycle.md
T
Nitload 0ea679932e
Verify / verify (ubuntu-latest, linux-bionic-arm64) (push) Canceled after 0s
Verify / verify (ubuntu-latest, linux-x64) (push) Canceled after 0s
Verify / verify (windows-latest, win-x64) (push) Canceled after 0s
Verify / postgres (push) Canceled after 0s
Build Charac server and client with OIDC, SSH sessions, and packages
2026-10-05 14:02:50 +08:00

2.3 KiB

会话生命周期

阶段 Windows Linux
创建 Server 通过 SSH 请求目标 OpenSSH 创建 ConPTY Shell Server 通过 SSH 请求目标 OpenSSH 创建 POSIX PTY Shell
断开客户端 Server 保持 SSH channel 并持续读取输出 同左
后端中断 原 SSH channel 消失 同左

当前 SshWorkspaceManager 按工作区分别保存身份归属、控制权、SSH channel 和最近 256 KiB 输出。一个工作区同时只有一个输入控制者;Server 可管理多个工作区。客户端断线不终止 SSH;显式结束、后端 SSH EOF 或 Server 停止会释放资源。后端结束时,Server 会先排空该观察者队列,再通过 WebSocket 发送 ended 事件并关闭连接;接管造成的旧观察者断开不会声称 SSH 已结束。撤销授权会阻止新的附着与结束请求,但尚不会自动终止已经附着的连接。Server 重启无法凭 SSH CA 恢复已经断开的交互终端,如需跨重启持久化,应设计目标侧会话管理。协议见连接与会话。

正式工作区创建时,Server 将身份键、目标、系统账户、认证方式与创建时间写入 PostgreSQL access.workspace_records。正常关闭会补写结束时间和原因,Server 正常停止记录 server_stopped;崩溃可能留下未补写的历史行。历史行始终保留,但它不是持久化的 SSH channel,也不会在重启后出现在可附着资源列表。测试用例只清理各自创建的临时数据,Server 停止不清理已登记身份、密钥或历史记录。

同一 OIDC 身份的活跃 Client 连接由 Server 按安装凭据仲裁:一台 Client 可同时附着多个工作区,另一台 Client 在前者仍有活跃连接时被拒绝。所有 WebSocket 断开后,设备占用释放,但 SSH 工作区继续运行。管理端 disconnect 仅中断该身份当前的 Client/WebSocket 并释放占用;它不删除工作区或修改目标授权。

资源列表仅暴露当前身份仍有权访问且账户映射一致的存活工作区,并携带创建时间及 attached/detached 状态。列表是快照,不预占控制权;查询后退出、接管、授权撤销等变化以实际附着请求的结果为准。Server 不为资源列表探测或新建 SSH 连接。