MoFox Wire is a lightweight, high-performance messaging wire designed for MoFox Bot and similar chatbot applications. It provides a rowiret foundation for building message-driven systems with support for typed message envelopes, flexible routing, and multiple transport protocols.
- 🏷️ Typed Messages: Full TypeScript-style type safety with TypedDict message models
- 🚀 High Performance: Built with async/await and optimized for high-throughput scenarios
- 🌐 Multiple Transports: Support for HTTP and WebSocket protocols out of the box
- 🔄 Flexible Routing: Sophisticated message routing with middleware support
- 📦 JSON Serialization: Efficient JSON-based message serialization with orjson
- 🛡️ Error Handling: Comprehensive error handling and processing guarantees
- 🎯 Easy Integration: Simple API for quick integration with existing projects
Install from PyPI (recommended):
pip install mofox-wireInstall from source:
git clone https://github.com/mofox-bot/mofox-wire.git
cd mofox-wire
pip install -e .For development:
pip install -e ".[dev]"- Python 3.11+
- aiohttp >= 3.12.0
- fastapi >= 0.116.0
- orjson >= 3.10.0
- uvicorn >= 0.35.0
- websockets >= 15.0.1
MoFox Wire follows a layered architecture:
┌─────────────────┐
│ Application │
├─────────────────┤
│ Runtime API │
├─────────────────┤
│ Router │
├─────────────────┤
│ Codec/Types │
├─────────────────┤
│ Transport │
└─────────────────┘
- Types: TypedDict models for messages and metadata
- Codec: JSON serialization/deserialization utilities
- Transport: HTTP and WebSocket client/server implementations
- Router: Message routing and filtering capabilities
- Runtime: High-level API for message processing and middleware
import asyncio
from mofox_wire import MessageRuntime, MessageBuilder, MessageEnvelope
async def handle_message(envelope: MessageEnvelope) -> MessageEnvelope | None:
"""Simple message handler that processes incoming messages"""
print(f"Processing message: {envelope.get('content', 'No content')}")
# Process the message (modify, filter, etc.)
if envelope.get('content') == 'hello':
response = MessageBuilder.text_message('world')
response['reply_to'] = envelope.get('id')
return response
return None
async def main():
# Create runtime
runtime = MessageRuntime()
# Register handler
runtime.add_handler(handle_message)
# Create a test message
message = MessageBuilder.text_message('hello')
message['id'] = 'msg-001'
# Process the message
await runtime.process_message(message)
if __name__ == '__main__':
asyncio.run(main())from mofox_wire import MessageServer
import uvicorn
async def main():
# Create HTTP server
server = MessageServer()
# Add message handler
server.add_handler(lambda env: print(f"Received: {env}"))
# Start server (will run until interrupted)
config = uvicorn.Config(server.app, host="0.0.0.0", port=8000)
server = uvicorn.Server(config)
await server.serve()
if __name__ == '__main__':
asyncio.run(main())from mofox_wire.transport import WebSocketClient
from mofox_wire import MessageBuilder
async def main():
# Create WebSocket client
client = WebSocketClient("ws://localhost:8000/ws")
await client.connect()
# Send a message
message = MessageBuilder.text_message("Hello from WebSocket client!")
await client.send_message(message)
# Receive messages
async for envelope in client.listen():
print(f"Received: {envelope}")
if __name__ == '__main__':
asyncio.run(main())The main runtime for processing messages with middleware support.
runtime = MessageRuntime()
runtime.add_handler(handler_func)
runtime.add_middleware(middleware_func)
await runtime.process_message(envelope)Utility for creating typed message envelopes.
# Text message
msg = MessageBuilder.text_message("Hello world", user_id="user123")
# Image message
msg = MessageBuilder.image_message("https://example.com/image.jpg", user_id="user123")
# Custom message
msg = MessageBuilder.create_message(
content="Custom content",
message_type="custom",
user_id="user123",
platform="discord"
)Advanced message routing and filtering.
router = Router()
# Add route with predicate
router.add_route(
predicate=lambda env: env.get('platform') == 'discord',
handler=discord_handler
)
# Process messages
await router.route(envelope)MoFox Wire provides several built-in message types:
- Text Messages: Standard text content
- Image Messages: Image URLs and metadata
- Seg Messages: Structured content with segments
- Custom Messages: Extensible message format
# Server
server = MessageServer()
server.add_handler(handler)
await server.start(host="0.0.0.0", port=8000)
# Client
client = MessageClient("http://localhost:8000")
await client.send_message(envelope)# Server
ws_server = WebSocketServer()
ws_server.add_handler(handler)
await ws_server.start(host="0.0.0.0", port=8001)
# Client
ws_client = WebSocketClient("ws://localhost:8001/ws")
await ws_client.connect()
await ws_client.send_message(envelope)# Default settings
mofox_wire_HOST=0.0.0.0
mofox_wire_PORT=8000
mofox_wire_LOG_LEVEL=INFO
mofox_wire_MAX_CONNECTIONS=1000from mofox_wire import MessageRuntime
runtime = MessageRuntime(
max_workers=10,
error_handler=custom_error_handler,
middleware=[middleware1, middleware2]
)# Install development dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run tests with coverage
pytest --cov=mofox_wire
# Run type checking
mypy mofox_wire# Format code
black mofox_wire
isort mofox_wire
# Lint code
ruff check mofox_wire# Install documentation dependencies
pip install -e ".[docs]"
# Build docs
mkdocs build- Initial release of MoFox Wire
- Core message runtime with middleware support
- HTTP and WebSocket transport implementations
- Typed message models with TypedDict
- Message routing and filtering capabilities
- JSON serialization with orjson optimization
- Comprehensive error handling
- Full async/await support
We welcome contributions! Please see our Contributing Guide for details.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Run tests (
pytest) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the GPL-3.0 License. See the LICENSE file for details.
- The MoFox Bot team for the original concept and requirements
- Contributors who have helped shape this library
- The Python async community for inspiration and best practices
- MoFox Bot - The main chatbot framework
- maim_message - Message format standard
MoFox Wire - Building the future of messaging infrastructure, one message at a time. 🚀