Aeolus - God of the winds, delivering messages at lightning speed.
Generalized WebSocket server with Redis authentication for real-time communication.
- Redis-based authentication
- Channel management (rooms)
- Broadcasting with sender exclusion
- Typing indicators
- Python async/await with python-socketio
uv sync
cp .env.example .envPORT=3000
REDIS_URL=redis://localhost:6379
CORS_ORIGIN=*
AUTH_TOKEN_PREFIX=tc2:socket:auth
SERVER_SECRET=super-secret-tokenStore auth tokens in Redis:
Key: {AUTH_TOKEN_PREFIX}:{token}
Value: JSON with userId, sessionId, etc.
uv run python server.pyUsed by TC2 to notify Aeolus that a chat message has been read by all participants. Requires the SERVER_SECRET
via Authorization: Bearer <secret>.
Payload:
{
"channelId": "chat_1",
"messageId": 42,
"readerId": 10,
"readAt": "2026-01-06T12:00:00Z",
"complete": true,
"readers": [
{"role_id": 10, "name": "Admin", "read_at": "2026-01-06T12:00:00Z"}
]
}Notifies Aeolus that TC2 has persisted a chat message. Requires the same SERVER_SECRET.
{
"channelId": "chat_1",
"messageId": 42,
"senderId": 10,
"content": "Hello world",
"timestamp": "2026-01-06T12:00:00Z",
"senderName": "Admin"
}channel:init- Initialize channelchannel:join- Join channelchannel:leave- Leave channelmessage:send- Send messagebroadcast- Broadcast eventtyping:start/typing:stop- Typing indicators
channel:initialized- Channel createdchannel:joined- Joined confirmationuser:joined- User joined channeluser:left- User left channelmessage:received- Message receivedtyping:user- User typing status