- 创建项目核心文件:package.json、vite.config.js、.gitignore - 添加前后端基础依赖和开发工具配置 - 完善OpenSpec模块,包括项目文档和核心能力规格 - 配置ESLint和Prettier代码规范 - 创建基本目录结构 - 实现前端Vue3应用框架和路由 - 添加后端Express服务器和基础路由 - 编写README项目说明文档
4.6 KiB
4.6 KiB
Command Capability Design
Context
This design document describes the technical implementation of the command capability for the BLS Project Console, which allows users to send console commands to Redis queues for other programs to read and execute.
Goals / Non-Goals
Goals
- Implement command sending to Redis queues
- Provide command validation and error handling
- Maintain a history of sent commands
- Handle command responses from Redis
- Ensure high performance and reliability
Non-Goals
- Command execution or processing
- Complex command syntax highlighting
- Advanced command editing capabilities
Decisions
Decision: Redis Queue Implementation
- What: Use Redis List as the queue data structure
- Why: Redis Lists provide efficient push/pop operations with O(1) time complexity, making them ideal for message queues
- Alternatives considered:
- Redis Streams: More advanced but overkill for our use case
- Redis Pub/Sub: No persistence, so commands would be lost if the receiving program is down
Decision: Command History Storage
- What: Store command history in memory with a configurable maximum size
- Why: In-memory storage provides fast access times and avoids the complexity of database management
- Alternatives considered:
- Database storage: Adds complexity and latency
- File system: Not suitable for real-time access
Decision: Command Validation
- What: Implement basic command validation on both frontend and backend
- Why: Frontend validation provides immediate feedback to users, while backend validation ensures data integrity
- Alternatives considered:
- Only frontend validation: Less secure, as users could bypass it
- Only backend validation: Less responsive, as users would have to wait for server response
Architecture
Frontend Architecture
CommandView Component
├── CommandForm Component
├── CommandHistory Component
└── CommandService
Backend Architecture
Command Routes
├── Command Service
│ ├── Redis Client
│ └── Command Manager
└── Command History Manager
Implementation Details
Redis Connection
- Use the
redisnpm package to connect to Redis - Implement automatic reconnection with exponential backoff
- Handle connection errors gracefully
Command Sending
- User enters a command in the frontend form
- Frontend validates the command (not empty, no invalid characters)
- Frontend sends a POST request to
/api/commandswith the command content - Backend validates the command again
- Backend generates a unique command ID
- Backend adds the command to the Redis queue using
LPUSH - Backend stores the command in the in-memory command history
- Backend sends a success response to the frontend
Command Validation
- Frontend validation:
- Check that the command is not empty
- Check that the command does not contain invalid characters (e.g., null bytes)
- Limit command length to 1024 characters
- Backend validation:
- Same checks as frontend
- Additional server-side validation if needed
Command History
- Store command history in an array in memory
- Implement a circular buffer to limit memory usage
- Default maximum command count: 1000
- Configurable via environment variable
- Include command ID, content, timestamp, and status
Command Response Handling
- Receiving program reads the command from the Redis queue
- Receiving program executes the command
- Receiving program writes the response to a separate Redis queue
- Backend listens for responses on the response queue using
BLPOP - When a response is received, backend updates the command status in the history
- Backend notifies the frontend of the response via Server-Sent Events (SSE)
Risks / Trade-offs
Risk: Redis Connection Failure
- Risk: If Redis connection is lost, commands won't be sent
- Mitigation: Implement automatic reconnection with exponential backoff, and notify users when connection is lost
Risk: Command Loss
- Risk: Commands could be lost if Redis goes down
- Mitigation: Implement Redis persistence (RDB or AOF) to ensure commands are not lost
Risk: Command Response Timeout
- Risk: Commands could take too long to execute, causing the UI to hang
- Mitigation: Implement a timeout mechanism for command responses, and show a loading indicator to users
Migration Plan
No migration is required as this is a new feature.
Open Questions
- What is the expected maximum command frequency per minute?
- Should we add support for command templates or macros?
- Should we implement command scheduling for future execution?