# 📡 RTComm - Real-Time Communication Hub (SignalR Style in Python)
**RTComm** is a scalable, distributed real-time communication hub built with **FastAPI**, **WebSockets**, and **JSON encoding** — inspired by **SignalR**. Designed for production with support for full **Hub Protocol**, client/server reflection, authentication, and bi-directional messaging.
---
## ✨ Features
- ✅ WebSocket Hub with FastAPI
- ✅ JSON Hub Protocol: Invocation, Completion, Stream, Ping, Close, Acks, etc.
- ✅ Client-Side and Server-Side Reflection (`invoke(method_name)`)
- ✅ Authentication with Access Token
- ✅ Modular Python SDK for Clients
- ✅ Built using OOP + SOLID Principles
- ✅ Designed for extensibility and microservice integration
---
## 🏗 Folder Structure
rtcomm_package/
├── src/
│ └── rtcomm/
│ ├── __init__.py
│ ├── protocol/
│ │ └── messages.py
│ ├── hub/
│ │ ├── base.py
│ │ └── manager.py
│ └── client/
│ └── sdk.py
├── README.md
├── pyproject.toml
---
## 🚀 Installation
```bash
pip install rtcomm
Or for local development:
git clone https://github.com/your-username/rtcomm.git
cd rtcomm
pip install -e .
📡 Usage
🖥 1. Server Side
Run FastAPI App
# main.py
from fastapi import FastAPI, WebSocket
from rtcomm.hub.base import RTCommHub
from rtcomm.hub.manager import ConnectionManager
from rtcomm.protocol.messages import HubMessage, InvocationMessage
app = FastAPI()
manager = ConnectionManager()
class MyHub(RTCommHub):
async def on_connect(self, client_id: str):
print(f"{client_id} connected")
async def on_disconnect(self, client_id: str):
print(f"{client_id} disconnected")
async def handle_message(self, client_id: str, websocket: WebSocket, message: HubMessage):
print(f"Received from {client_id}: {message.to_dict()}")
if isinstance(message, InvocationMessage):
await websocket.send_text(message.to_json())
uvicorn app.main:app --reload
🤖 2. Client Side
Basic Example
# client.py
import asyncio
from rtcomm.client.sdk import RTCommClient
from rtcomm.protocol.messages import InvocationMessage, MessageType
async def main():
client = RTCommClient(uri="ws://localhost:8000/ws", access_token="token-user123")
client.on(MessageType.INVOCATION, lambda msg: print("[Client] Got:", msg.arguments))
await client.connect()
await client.send(InvocationMessage(invocation_id="1", target="broadcast", arguments=["Hello"]))
await asyncio.sleep(5)
await client.close()
if __name__ == "__main__":
asyncio.run(main())
🔐 Authentication
Add a ?access_token=your-token query string when connecting via WebSocket. You can override the token verification logic in your RTCommHub.
async def authenticate(self, token: str) -> str:
if token.startswith("token-"):
return token.split("-")[1] # return user_id
raise Exception("Unauthorized")
📜 Supported Message Types (SignalR Protocol)
| Type | Name | Description |
|---|---|---|
| 1 | Invocation | Call a method |
| 2 | Stream Item | Stream data item |
| 3 | Completion | Result or error return |
| 4 | Stream Invocation | Start a stream |
| 5 | Cancel Invocation | Cancel ongoing stream |
| 6 | Ping | Keep alive |
| 7 | Close | Graceful close |
| 8 | Acknowledgment | Confirm receipt (optional) |
| 9 | Sequence Message | Ordered message (optional) |
🧪 Testing
pytest
🐍 Python Compatibility
- Python 3.8+
- Fully typed (PEP 561)
- Async-first design with
asyncio
📦 Build & Publish
python -m build
twine upload dist/*
📚 License
MIT © [Your Name]
🤝 Contributing
PRs welcome! Please open issues for bugs, enhancements, or questions.
🛣 Roadmap
The goal of rtcomm is to offer full SignalR-like functionality in Python — scalable, secure, and cross-platform. Here's what's planned:
✅ Initial Release
- WebSocket Hub with FastAPI
- JSON-based SignalR Hub Protocol
- Client-to-server & server-to-client method invocation
- Basic authentication via access tokens
- Reflection for dynamic method execution
🔜 Coming Soon
👥 Group Management
-
add_to_group(client_id, group_name) -
remove_from_group(client_id, group_name) -
send_to_group(group_name, message) - In-memory and pluggable distributed store (Redis/Mongo/etc.)
🔁 Persistent Connections
- Reconnection logic with exponential backoff
- Keep-alive and heartbeat support
- Resume session after disconnects
⚙️ Scalability
- Plug-in support for Redis pub/sub or Kafka for multi-instance scaling
- Shared message bus to coordinate state
- Distributed group and client state store
🔄 Automatic Reconnects (Client SDK)
- Reconnect with backoff strategy
- Resume invocation queue
- Client state restore
📡 Streaming Support
- Server-to-client and client-to-server streaming
- Pause/resume/cancel stream control
- StreamItemMessage + StreamInvocationMessage handling
🌍 Cross-Platform Support
- Python client ✅
- Node.js/TypeScript client (planned)
- REST fallbacks for non-WebSocket clients
📚 Client Libraries
- TypeScript client for web browsers
- Python CLI & SDK
- CLI:
rtcomm connect ws://... --method=foo --args=bar
🧩 Hub Filters (Middleware)
- Support middleware for:
- Logging
- Authentication/authorization
- Error handling
- Message transformation
🧠 Have Ideas?
Feel free to open an issue or submit a PR. Collaboration is welcome!
Metadata
Release files for rtcomm 0.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| rtcomm-0.0.1.tar.gz | 11.7 kB | Without provenance | Details for rtcomm-0.0.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| rtcomm-0.0.1-py3-none-any.whl | Python 3 | none | any | Details for rtcomm-0.0.1-py3-none-any.whl |
Total release size: 22.5 kB
Release files / rtcomm-0.0.1.tar.gz
| Download URL | rtcomm-0.0.1.tar.gz |
|---|---|
| Size | 11.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4c22eaa86d47b6bd8f277289d71f2d3e9cac5a599f00007ea15fa19db60b702a
|
|
BLAKE2b-256 checksum How to use checksums |
97165f7a6f506fb5623cc949061db1124f56fe21af256f6779a1687871a0e0e7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / rtcomm-0.0.1-py3-none-any.whl
| Download URL | rtcomm-0.0.1-py3-none-any.whl |
|---|---|
| Size | 10.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d5bd7f0b73c3398caa6d5c0f0e4af34371fd0343d9794726908cdf914cc9ee42
|
|
BLAKE2b-256 checksum How to use checksums |
97a2ccc73bbea94ab07219ba448f9897a790e9f23c66501fef64b2ec817e668f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Security for rtcomm 0.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.