Skip to content

修复Windows 幻兽帕鲁转发输出流功能#85

Merged
yxsj245 merged 1 commit into
GSManagerXZ:mainfrom
gao918929:fix/stream-forward-output
Jul 12, 2026
Merged

修复Windows 幻兽帕鲁转发输出流功能#85
yxsj245 merged 1 commit into
GSManagerXZ:mainfrom
gao918929:fix/stream-forward-output

Conversation

@gao918929

@gao918929 gao918929 commented Jul 12, 2026

Copy link
Copy Markdown

Summary

  • 修复stdout块缓冲导致输出不实时: Windows下spawn()以管道模式启动游戏服务器时,C运行时将stdout从行缓冲切换为块缓冲(~4KB),导致只有启动时的第一条消息能立即显示。改用PTY二进制文件包装转发进程,让游戏服务器获得伪终端,保持行缓冲实时输出。
  • 修复实例重启竞态条件: virtualSocket的terminal-exit处理器增加会话ID守卫检查,防止旧PTY退出事件覆盖新实例状态(status被覆写为stopped,terminalSessionId被清空)。
  • 修复session.socket被无操作socket替换: handleInput中增加socket.connected检查,仅允许真实Socket.IO连接替换session.socket,防止stopInstance/sendInput的虚拟socket导致流转发输出丢失。
  • 实例会话启用autoCloseOnForwardExit: 转发进程退出后自动关闭PTY shell,加速停止流程。

Test plan

  • 创建幻兽帕鲁实例并启用输出流转发,验证服务器输出实时显示
  • 停止并重新启动实例,验证输出流转发在第二次启动时仍然正常工作
  • 在浏览器断开重连后,验证终端输出仍然正常转发
  • 验证非输出流转发模式的实例不受影响

🤖 Generated with Claude Code

1. 使用PTY包装转发进程解决stdout块缓冲问题
   - Windows下通过spawn()以管道模式启动的进程,stdout会切换为块缓冲(~4KB)
   - 游戏服务器日志输出量低,缓冲区填不满导致输出不实时
   - 改用PTY二进制文件包装转发进程,让游戏服务器获得伪终端,保持行缓冲

2. 修复实例重启后旧PTY退出事件覆盖新实例状态的竞态条件
   - virtualSocket的terminal-exit处理器增加会话ID检查
   - 防止旧会话退出事件将新实例的status覆写为stopped

3. 修复handleInput中session.socket被无操作虚拟socket替换的问题
   - stopInstance/sendInput创建的虚拟socket会在会话断开时替换session.socket
   - 导致后续流转发输出丢失(emit变为空操作)
   - 增加socket.connected检查,仅允许真实Socket.IO连接替换

4. 实例会话启用autoCloseOnForwardExit
   - 转发进程退出后自动关闭无用的PTY shell
   - 加速实例停止流程,减少竞态条件窗口

Co-Authored-By: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

⚠ 本 PR 已进入自动化语法检查流程,请稍后

本次变更文件 (2 个):

  • server/src/modules/instance/InstanceManager.ts (modified)
  • server/src/modules/terminal/TerminalManager.ts (modified)

正在进行 TypeScript 语法检查...

@yxsj245 yxsj245 merged commit afe48e0 into GSManagerXZ:main Jul 12, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants