- Modified startup script to instantiate GameProcessServer separately
before wrapping in WsServer/HttpServer, allowing direct access to
set event loop after IoServer creation
- Implemented setLoop() method to set event loop after construction
- Added error handling for fwrite() to gracefully handle broken pipes
when process closes
- Suppressed fread() warnings with @ operator to avoid noise
- Simplified startOutputReader() since event loop polling is now
handled directly in onOpen()
- Added null checks for event loop before using in timers
- Server now properly starts with continuous 100ms output polling
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
New simplified approach: WebSocket server spawns bin/game process and forwards I/O
Backend Changes:
- New GameProcessServer class (src/Core/GameProcessServer.php)
- Implements MessageComponentInterface (Ratchet)
- For each WebSocket connection, spawns independent php bin/game process
- Uses proc_open() to manage process I/O pipes
- Reads process STDOUT/STDERR in non-blocking mode
- Writes client input to process STDIN
- Automatic process cleanup on disconnect
- No game code modifications required
- New websocket-process-server.php startup script
- Listens on port 9002
- Simple process forwarder without game-specific logic
- Suitable for any interactive CLI application
Frontend Changes:
- New web/process.html
- Ultra-simple WebSocket frontend for process I/O
- Direct STDIN/STDOUT forwarding
- ANSI color support via xterm.js
- Minimal dependencies, minimal code
- Suitable for any CLI game/application
Architecture Benefits:
✓ Zero game code changes needed
✓ Each user gets independent process (isolation)
✓ Real process STDIO, not emulation
✓ ANSI colors work perfectly
✓ Can run ANY CLI application (not just this game)
✓ Simpler than GameSession-based approach
✓ Easier to deploy and manage
Usage:
1. Start WebSocket server:
php websocket-process-server.php
2. Start HTTP file server (for static files):
php -S 0.0.0.0:8080 web/server.php
3. Open browser:
http://localhost:8080/process.html
Message Protocol:
Client → Server:
{ "type": "input", "input": "command" } - Send stdin to process
{ "type": "ping" } - Heartbeat
Server → Client:
{ "type": "output", "text": "..." } - Process stdout/stderr
{ "type": "system", "message": "..." } - Server messages
{ "type": "error", "message": "..." } - Error messages
{ "type": "pong" } - Heartbeat response
Features:
- Non-blocking I/O reading
- Stream buffering management
- Automatic reconnection support
- 30-second heartbeat for keep-alive
- Process termination on disconnect
- Proper error handling
This is the simplest and most elegant approach for running CLI games on web!
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>