⚠️ Warning: This library is experimental and not intended for production use.
High-performance QUIC communication library with automatic NAT traversal within Modal applications.
- Automatic NAT traversal: Built-in STUN discovery and UDP hole punching, using Modal Dict for rendezvous.
- High-performance QUIC: Rust-based implementation for maximum throughput and minimal latency
- Simple synchronous API: Easy-to-use Portal class with static methods for server/client creation. WebSocket-style messaging.
- TODO: Improved NAT traversal: Handle more complex client-side NATs using port scanning + birthday technique. Currently only supports clients behind "easy" NATs.
- TODO: Shared server certificates: Use a modal.Dict to share server/client certificates, to mutually validate identity.
# Install from PyPi (only certain wheels built)
pip install quic-portal# Install from source (requires Rust toolchain)
git clone <repository>
cd quic-portal
pip install .import modal
from quic_portal import Portal
app = modal.App("my-quic-app")
@app.function()
def server_function(coord_dict: modal.Dict):
# Create server with automatic NAT traversal
portal = Portal.create_server(dict=coord_dict, local_port=5555)
# Receive and echo messages
while True:
data = portal.recv(timeout_ms=10000)
if data:
message = data.decode("utf-8")
print(f"Received: {message}")
portal.send(f"Echo: {message}".encode("utf-8"))
@app.function()
def client_function(coord_dict: modal.Dict):
# Create client with automatic NAT traversal
portal = Portal.create_client(dict=coord_dict, local_port=5556)
# Send messages
portal.send(b"Hello, QUIC!")
response = portal.recv(timeout_ms=5000)
if response:
print(f"Got response: {response.decode('utf-8')}")
@app.local_entrypoint()
def main(local: bool = False):
# Create coordination dict
with modal.Dict.ephemeral() as coord_dict:
# Start server
server_task = server_function.spawn(coord_dict)
# Run client
if local:
# Run test between local environment and remote container.
client_function.local(coord_dict)
else:
# Run test between two containers.
client_function.remote(coord_dict)
server_task.cancel()For advanced use cases where you handle NAT traversal yourself, or the server has a public IP:
from quic_portal import Portal
# After NAT hole punching is complete...
# Server side
server = Portal()
server.listen(5555)
# Client side
client = Portal()
client.connect("server_ip", 5555, 5556)
# WebSocket-style messaging
client.send(b"Hello!")
response = server.recv(timeout_ms=1000)Create a server portal with automatic NAT traversal. Synchronous operation.
Parameters:
dict(modal.Dict or dict): Modal Dict or regular dict for peer coordinationlocal_port(int): Local port for QUIC server (default: 5555)stun_server(tuple): STUN server for NAT discovery (default: ("stun.ekiga.net", 3478))punch_timeout(int): Timeout in seconds for NAT punching (default: 15)
Returns: Connected Portal instance ready for communication
Create a client portal with automatic NAT traversal. Synchronous operation.
Parameters:
dict(modal.Dict or dict): Modal Dict or regular dict for peer coordination (must be same as server)local_port(int): Local port for QUIC client (default: 5556)stun_server(tuple): STUN server for NAT discovery (default: ("stun.ekiga.net", 3478))punch_timeout(int): Timeout in seconds for NAT punching (default: 15)
Returns: Connected Portal instance ready for communication
Send data over QUIC connection (WebSocket-style). Synchronous operation.
Receive data from QUIC connection. Blocks until message arrives or timeout. Synchronous operation.
Parameters:
timeout_ms(int, optional): Timeout in milliseconds (None for blocking)
Returns: Received data as bytes, or None if timeout
Connect to a QUIC server (for manual NAT traversal). Synchronous operation.
Parameters:
server_ip(str): Server IP addressserver_port(int): Server portlocal_port(int): Local port to bind to
Start QUIC server and wait for connection (for manual NAT traversal). Synchronous operation.
Parameters:
local_port(int): Local port to bind to
Check if connected to peer.
Close the connection and clean up resources.
See the examples/ directory for complete working examples:
modal_simple.py- Basic server/client communicationmodal_benchmark.py- Performance benchmarking
- Python 3.9+
- Modal (for automatic NAT traversal)
- Rust toolchain (for building from source)
This project uses code from:
pynatby Ariel Antonitis, licensed under MIT License
MIT License