Messaging wire for MoFox Bot with HTTP/WebSocket transports and routing helpers.
Project description
MoFox Wire
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.
โจ Features
- ๐ท๏ธ 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
๐ Installation
Install from PyPI (recommended):
pip install mofox-wire
Install from source:
git clone https://github.com/mofox-bot/mofox-wire.git
cd mofox-wire
pip install -e .
For development:
pip install -e ".[dev]"
๐ Requirements
- Python 3.11+
- aiohttp >= 3.12.0
- fastapi >= 0.116.0
- orjson >= 3.10.0
- uvicorn >= 0.35.0
- websockets >= 15.0.1
๐๏ธ Architecture
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
๐ Quick Start
Basic Message Handling
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())
HTTP Server Example
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())
WebSocket Client Example
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())
๐ API Reference
Core Components
MessageRuntime
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)
MessageBuilder
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"
)
Router
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)
Message Types
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
Transport Layer
HTTP Transport
# 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)
WebSocket Transport
# 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)
๐ง Configuration
Environment Variables
# Default settings
mofox_wire_HOST=0.0.0.0
mofox_wire_PORT=8000
mofox_wire_LOG_LEVEL=INFO
mofox_wire_MAX_CONNECTIONS=1000
Programmatic Configuration
from mofox_wire import MessageRuntime
runtime = MessageRuntime(
max_workers=10,
error_handler=custom_error_handler,
middleware=[middleware1, middleware2]
)
๐งช Development
Running Tests
# Install development dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run tests with coverage
pytest --cov=mofox_wire
# Run type checking
mypy mofox_wire
Code Formatting
# Format code
black mofox_wire
isort mofox_wire
# Lint code
ruff check mofox_wire
Building Documentation
# Install documentation dependencies
pip install -e ".[docs]"
# Build docs
mkdocs build
๐ Changelog
[0.1.0] - 2024-XX-XX
Added
- 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
๐ค Contributing
We welcome contributions! Please see our Contributing Guide for details.
Development Workflow
- 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
๐ License
This project is licensed under the GPL-3.0 License. See the LICENSE file for details.
๐ Acknowledgments
- 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
๐ Support
- ๐ Documentation
- ๐ Issue Tracker
- ๐ฌ Discussions
๐ Related Projects
- MoFox Bot - The main chatbot framework
- maim_message - Message format standard
MoFox Wire - Building the future of messaging infrastructure, one message at a time. ๐
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mofox_wire-0.1.5.tar.gz.
File metadata
- Download URL: mofox_wire-0.1.5.tar.gz
- Upload date:
- Size: 97.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0b680fd5965f88076e4a5bdb2d1b8f4bc257bdece9dadea12848358e4cb35f27
|
|
| MD5 |
096b5a6022fc4350d44eb6fee3b02b8c
|
|
| BLAKE2b-256 |
879be57c261f9026a70015672e775116ff4c3e612007035964b543386a85b4a1
|
File details
Details for the file mofox_wire-0.1.5-py3-none-any.whl.
File metadata
- Download URL: mofox_wire-0.1.5-py3-none-any.whl
- Upload date:
- Size: 59.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a94d7606acee47fbfeb5d87bd3a06df3fbb5707b6383a063ef8b017616426d89
|
|
| MD5 |
2be6d13232ace4a1f0daa31b44473725
|
|
| BLAKE2b-256 |
6c7fdc8377e82ac086172dae83dfb24c74cc5e72b09013ff418e05b0c29bc331
|