Skip to main content

A high-performance, async-native WebTransport implementation for Python.

Project description

PyWebTransport

PyPI version Python Versions License: MIT Build Status Coverage Docs

A high-performance, async-native WebTransport implementation for Python.

Features

  • Full WebTransport protocol implementation (bidirectional streams, unidirectional streams, datagrams).
  • High-performance async client and server application frameworks.
  • Production-ready components for connection pooling, management, and load balancing.
  • Comprehensive monitoring and debugging capabilities.
  • Type-safe API with complete type annotations.
  • Extensive test coverage (unit, integration, end-to-end).

Installation

pip install pywebtransport

Quick Start

Server

# server.py
import asyncio

from pywebtransport import ServerApp, ServerConfig, WebTransportSession, WebTransportStream
from pywebtransport.exceptions import ConnectionError, SessionError
from pywebtransport.utils import generate_self_signed_cert

generate_self_signed_cert("localhost")

app = ServerApp(
    config=ServerConfig.create(
        certfile="localhost.crt",
        keyfile="localhost.key",
    )
)


async def handle_datagrams(session: WebTransportSession) -> None:
    try:
        datagrams = await session.datagrams
        while True:
            data = await datagrams.receive()
            await datagrams.send(b"ECHO: " + data)
    except (ConnectionError, SessionError, asyncio.CancelledError):
        pass


async def handle_streams(session: WebTransportSession) -> None:
    try:
        async for stream in session.incoming_streams():
            if isinstance(stream, WebTransportStream):
                data = await stream.read_all()
                await stream.write_all(b"ECHO: " + data)
    except (ConnectionError, SessionError, asyncio.CancelledError):
        pass


@app.route("/")
async def echo_handler(session: WebTransportSession) -> None:
    datagram_task = asyncio.create_task(handle_datagrams(session))
    stream_task = asyncio.create_task(handle_streams(session))
    try:
        await session.wait_closed()
    finally:
        datagram_task.cancel()
        stream_task.cancel()


if __name__ == "__main__":
    app.run(host="127.0.0.1", port=4433)

Client

# client.py
import asyncio
import ssl

from pywebtransport import ClientConfig, WebTransportClient


async def main() -> None:
    config = ClientConfig.create(verify_mode=ssl.CERT_NONE)

    async with WebTransportClient.create(config=config) as client:
        session = await client.connect("https://127.0.0.1:4433/")

        print("Connection established. Testing datagrams...")
        datagrams = await session.datagrams
        await datagrams.send(b"Hello, Datagram!")
        response = await datagrams.receive()
        print(f"Datagram echo: {response!r}\n")

        print("Testing streams...")
        stream = await session.create_bidirectional_stream()
        await stream.write_all(b"Hello, Stream!")
        response = await stream.read_all()
        print(f"Stream echo: {response!r}")

        await session.close()


if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        pass

Documentation

Requirements

  • Python 3.11+
  • asyncio support
  • TLS 1.3

Dependencies:

  • aioquic >= 1.2.0
  • cryptography >= 45.0.4

Contributing

Contributions are welcome! Please read our Contributing Guide for details.

Development Setup:

git clone https://github.com/lemonsterfy/pywebtransport.git
cd pywebtransport
pip install -r dev-requirements.txt
pip install -e .
tox

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

Support

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

pywebtransport-0.3.0.tar.gz (96.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pywebtransport-0.3.0-py3-none-any.whl (123.0 kB view details)

Uploaded Python 3

File details

Details for the file pywebtransport-0.3.0.tar.gz.

File metadata

  • Download URL: pywebtransport-0.3.0.tar.gz
  • Upload date:
  • Size: 96.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.28.1

File hashes

Hashes for pywebtransport-0.3.0.tar.gz
Algorithm Hash digest
SHA256 ad22cbc1e3ca43b44253936cf7ef368130d6d1c7b7952e48ce1450e886d23c77
MD5 65b3e598b12ad0076b2adf27c1809b43
BLAKE2b-256 61dfb5410d1d6168368aabc94a5bf9e4d55ab1ed08971b2ac55de10428c3f9c1

See more details on using hashes here.

File details

Details for the file pywebtransport-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for pywebtransport-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 47d8955891a8d3bf25b3a293deeb07e2e3a4ea4e7b57bfb1a419a6efb080f98d
MD5 e076f2a6f69dc7b3d81b7760ad6cb503
BLAKE2b-256 920d87e9bfc8ea4600bf58d709e98c519bf5512864cf94330e5bb99e951315c4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page