Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

webtransport-py

PyPI image License Actions status Discord

About Shiguredo's open source software

We will not respond to PRs or issues that have not been discussed on Discord. Also, Discord is only available in Japanese.

Please read https://github.com/shiguredo/oss/blob/master/README.en.md before use.

時雨堂のオープンソースソフトウェアについて

利用前に https://github.com/shiguredo/oss をお読みください。

webtransport-py について

webtransport-py は Sans I/O アーキテクチャを採用した WebTransport の Python ライブラリです。WebTransport over HTTP/3 と WebTransport over HTTP/2 の両方に対応しています。

また、WebTransport だけでなく QUIC、HTTP/3、HTTP/2 を単体のプロトコルとしても利用できます。asyncio、スレッド、独自のイベントループなど、任意の I/O フレームワークと組み合わせて利用できます。

特徴

  • Sans I/O アーキテクチャ
    • I/O 処理をライブラリ外部で制御可能
    • 任意のイベントループやフレームワークと統合可能
    • Sans I/O
  • 二層 API 設計
    • Sans I/O API: プロトコル処理のみを提供する低レベル API
    • asyncio API: すぐに使える高レベルなクライアント/サーバー実装
  • WebTransport over HTTP/3
    • Sans I/O API と asyncio API の両方を提供
  • WebTransport over HTTP/2
    • Sans I/O API と asyncio API の両方を提供
  • QUIC
    • Sans I/O API と asyncio API の両方を提供
    • 双方向/単方向ストリーム
    • QUIC DATAGRAM
    • 0-RTT / Session Resumption
    • 証明書のカスタム検証
    • Connection Migration
    • ngtcp2 を採用
  • HTTP/3
    • Sans I/O API と asyncio API の両方を提供
    • nghttp3 を採用
  • HTTP/2
    • Sans I/O API と asyncio API の両方を提供
    • nghttp2 を採用
  • 依存ライブラリは deps.json で特定のタグ / コミットに固定する
    • ngtcp2 / nghttp3 は上流ブランチの特定コミット (ref)、nghttp2 / AWS-LC はタグ (tag) で固定する
    • 更新時は deps.json を書き換える (ビルドキャッシュのキーも deps.json の内容に連動する)
  • Python Free-Threading 対応
    • PEP 703 – Making the Global Interpreter Lock Optional in CPython | peps.python.org
    • Python Free-Threading Guide
    • 同一オブジェクトへの並行アクセスはオブジェクト単位の排他で保護する (接続・セッション系クラスの公開メソッドが対象。生成系 static・設定・イベント等の値オブジェクトは対象外)。Config は単一スレッドで構築し、共有後の並行書き換えは行わないこと。quic.Config の検証コールバック内で同一 quic.Connection のメソッドを呼ばないこと
  • クロスプラットフォーム対応
    • Ubuntu x86_64 / arm64
    • macOS arm64

インストール

uv add webtransport-py

使い方

WebTransport over HTTP/3

サーバー

import asyncio

from webtransport import h3


async def main() -> None:
    server = h3.Server(
        host="0.0.0.0",
        port=4433,
        certfile="cert.pem",
        keyfile="key.pem",
    )

    async def on_session_ready(session_id: int, addr: tuple[str, int]) -> None:
        print(f"セッション確立: {session_id} from {addr}")

    async def on_stream_data(
        session_id: int,
        stream_id: int,
        data: bytes,
        addr: tuple[str, int],
    ) -> None:
        print(f"データ受信: {data}")
        # エコーバック
        await server.send_stream_data(addr, stream_id, data)

    async def on_datagram(session_id: int, data: bytes, addr: tuple[str, int]) -> None:
        print(f"データグラム受信: {data}")
        # エコーバック
        await server.send_datagram(addr, session_id, data)

    server.on_session_ready(on_session_ready)
    server.on_stream_data(on_stream_data)
    server.on_datagram(on_datagram)

    async with server:
        print(f"サーバー開始: {server.host}:{server.actual_port}")
        await server.run()


if __name__ == "__main__":
    asyncio.run(main())

クライアント

import asyncio

from webtransport import h3
from webtransport.exceptions import WebTransportConnectError


async def main() -> None:
    client = h3.Client(
        url="https://localhost:4433/webtransport",
        verify_peer=False,
    )

    async def on_stream_data(stream_id: int, data: bytes) -> None:
        print(f"データ受信: {data}")

    async def on_datagram(data: bytes) -> None:
        print(f"データグラム受信: {data}")

    client.on_stream_data(on_stream_data)
    client.on_datagram(on_datagram)

    try:
        await client.connect()
    except WebTransportConnectError as exc:
        print(f"接続失敗: {exc}")
        return

    # ストリームでデータ送信
    stream_id = await client.open_stream()
    await client.send_stream_data(stream_id, b"Hello via stream!")

    # データグラムでデータ送信
    await client.send_datagram(b"Hello via datagram!")

    try:
        await asyncio.wait_for(client.run(), timeout=5.0)
    except TimeoutError:
        pass

    await client.close()


if __name__ == "__main__":
    asyncio.run(main())

WebTransport over HTTP/2

h2.Client / h2.Server は TLS 1.3 以上を必須とする (draft-ietf-webtrans-http2-15 Section 7 準拠。仕様上許容される TLS 1.2 + extended master secret (EMS) の接続も、Python の ssl が EMS 交渉の有無を公開しないため現時点では拒否する)。

サーバー

import asyncio

from webtransport import h2


async def main() -> None:
    server = h2.Server(
        host="0.0.0.0",
        port=8443,
        certfile="cert.pem",
        keyfile="key.pem",
    )

    async def on_session_ready(session_writer: h2.SessionWriter) -> None:
        print(f"セッション確立: {session_writer.session_id}")

    async def on_stream_data(
        stream_id: int,
        data: bytes,
        session_writer: h2.SessionWriter,
    ) -> None:
        print(f"データ受信: {data}")
        # エコーバック
        await session_writer.send_stream_data(stream_id, data)

    async def on_datagram(data: bytes, session_writer: h2.SessionWriter) -> None:
        print(f"データグラム受信: {data}")
        # エコーバック
        await session_writer.send_datagram(data)

    server.on_session_ready(on_session_ready)
    server.on_stream_data(on_stream_data)
    server.on_datagram(on_datagram)

    async with server:
        print(f"サーバー開始: {server.host}:{server.actual_port}")
        await server.run()


if __name__ == "__main__":
    asyncio.run(main())

クライアント

import asyncio

from webtransport import h2
from webtransport.exceptions import WebTransportConnectError


async def main() -> None:
    client = h2.Client(
        url="https://localhost:8443/webtransport",
        verify_peer=False,
    )

    async def on_stream_data(stream_id: int, data: bytes) -> None:
        print(f"データ受信: {data}")

    async def on_datagram(data: bytes) -> None:
        print(f"データグラム受信: {data}")

    client.on_stream_data(on_stream_data)
    client.on_datagram(on_datagram)

    try:
        await client.connect()
    except WebTransportConnectError as exc:
        print(f"接続失敗: {exc}")
        return

    # ストリームでデータ送信
    stream_id = await client.open_stream()
    await client.send_stream_data(stream_id, b"Hello via stream!")

    # データグラムでデータ送信
    await client.send_datagram(b"Hello via datagram!")

    try:
        await asyncio.wait_for(client.run(), timeout=5.0)
    except TimeoutError:
        pass

    await client.close()


if __name__ == "__main__":
    asyncio.run(main())

QUIC

サーバー

import asyncio

from webtransport import quic


async def main() -> None:
    server = quic.Server(
        host="0.0.0.0",
        port=4433,
        certfile="cert.pem",
        keyfile="key.pem",
    )

    async def on_handshake_completed(addr: tuple[str, int]) -> None:
        print(f"ハンドシェイク完了: {addr}")

    async def on_stream_data(
        stream_id: int,
        data: bytes,
        fin: bool,
        addr: tuple[str, int],
    ) -> None:
        print(f"データ受信: {data}")
        # エコーバック
        await server.send_stream_data(addr, stream_id, data, fin)

    server.on_handshake_completed(on_handshake_completed)
    server.on_stream_data(on_stream_data)

    async with server:
        print(f"サーバー開始: {server.host}:{server.actual_port}")
        await server.run()


if __name__ == "__main__":
    asyncio.run(main())

クライアント

import asyncio

from webtransport import quic


async def main() -> None:
    client = quic.Client(
        host="localhost",
        port=4433,
        verify_peer=False,
    )

    if not await client.connect():
        print("接続失敗")
        return

    # 双方向ストリームを開いてデータ送信 (FIN でストリームを閉じる)
    stream_id = await client.open_stream(bidirectional=True)
    await client.send_stream_data(stream_id, b"Hello, QUIC!", fin=True)

    # サーバーからのエコーを FIN まで受信する
    try:
        data, _ = await client.recv_stream_data(stream_id, timeout=5.0)
        print(f"データ受信: {data}")
    except TimeoutError:
        print("受信タイムアウト")

    await client.close()


if __name__ == "__main__":
    asyncio.run(main())

Python

  • 3.14
  • 3.14t

プラットフォーム

  • Ubuntu 26.04 LTS x86_64
  • Ubuntu 26.04 LTS arm64
  • Ubuntu 24.04 LTS x86_64
  • Ubuntu 24.04 LTS arm64
  • macOS 26 arm64

リリースビルド

make wheel

リリース時は CHANGES.md の ## develop を ## <バージョン> に変更し、**リリース日**: YYYY-MM-DD を追記する (VERSION の更新と make wheel によるビルドも併せて行う)。

開発ビルド

make develop

テスト

uv sync
make test

サンプル

examples/ ディレクトリにサンプルコードがあります。

第三者ライセンス

本プロジェクトは ngtcp2 / nghttp3 / nghttp2 / AWS-LC / nanobind (同梱の tsl::robin_map を含む) を静的リンクしています。各ライセンス全文は THIRD_PARTY_LICENSES.md を参照してください。

ライセンス

Apache License 2.0

Copyright 2026 Shiguredo Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Metadata

Release files for webtransport-py 2026.1.0.dev19

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for webtransport-py 2026.1.0.dev19
File
webtransport_py-2026.1.0.dev19-cp314-cp314t-manylinux_2_39_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.39+ x86-64 Details
webtransport_py-2026.1.0.dev19-cp314-cp314t-manylinux_2_39_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.39+ ARM64 Details
webtransport_py-2026.1.0.dev19-cp314-cp314t-macosx_26_0_arm64.whl CPython 3.14 CPython 3.14 free-threading macOS 26.0+ ARM64 Details
webtransport_py-2026.1.0.dev19-cp314-cp314-manylinux_2_39_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.39+ x86-64 Details
webtransport_py-2026.1.0.dev19-cp314-cp314-manylinux_2_39_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.39+ ARM64 Details
webtransport_py-2026.1.0.dev19-cp314-cp314-macosx_26_0_arm64.whl CPython 3.14 CPython 3.14 macOS 26.0+ ARM64 Details

Total release size: 12.7 MB

Release files / webtransport_py-2026.1.0.dev19-cp314-cp314t-manylinux_2_39_x86_64.whl

Download URL webtransport_py-2026.1.0.dev19-cp314-cp314t-manylinux_2_39_x86_64.whl
Size 2.3 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.39+ x86-64
SHA-256 checksum
How to use checksums
3ace9f2a91641494f23746f4f491ee60d2a0989667383e7c0c483a63179f8d0a
BLAKE2b-256 checksum
How to use checksums
36eccb30ef108bcc6432335a57511e31da000547a25a3854ad823db5d1694c41
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.

Transparency log

Release files / webtransport_py-2026.1.0.dev19-cp314-cp314t-manylinux_2_39_aarch64.whl

Download URL webtransport_py-2026.1.0.dev19-cp314-cp314t-manylinux_2_39_aarch64.whl
Size 2.1 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.39+ ARM64
SHA-256 checksum
How to use checksums
83ad9a2fb32fe653e38b0c54b989cab8cce8d81cc00386e67f10fbc23651ee60
BLAKE2b-256 checksum
How to use checksums
772f2331af73abd44e92dd95c7e7d3c325bb023a46d844db6e78c7623efa9535
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.

Transparency log

Release files / webtransport_py-2026.1.0.dev19-cp314-cp314t-macosx_26_0_arm64.whl

Download URL webtransport_py-2026.1.0.dev19-cp314-cp314t-macosx_26_0_arm64.whl
Size 1.9 MB
Tags CPython 3.14 CPython 3.14 free-threading macOS 26.0+ ARM64
SHA-256 checksum
How to use checksums
7f3d3dee1d808929db50718eea67ebcbb8d58f9272d4982ab0356f7bfcc10d8d
BLAKE2b-256 checksum
How to use checksums
5373aa449cd06efea67912369c87eb0e78b0edb96735db7f2ebef140f74cf710
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.

Transparency log

Release files / webtransport_py-2026.1.0.dev19-cp314-cp314-manylinux_2_39_x86_64.whl

Download URL webtransport_py-2026.1.0.dev19-cp314-cp314-manylinux_2_39_x86_64.whl
Size 2.3 MB
Tags CPython 3.14 Linux glibc 2.39+ x86-64
SHA-256 checksum
How to use checksums
f36861ba7cf3655e6444a6c8af5c95b5f37a28c9feaa82d186cc83b8d95e2790
BLAKE2b-256 checksum
How to use checksums
c6e80962af54e4f39cbc02451d18d4f7d8b38b4d3618096e4844a9b941803f64
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.

Transparency log

Release files / webtransport_py-2026.1.0.dev19-cp314-cp314-manylinux_2_39_aarch64.whl

Download URL webtransport_py-2026.1.0.dev19-cp314-cp314-manylinux_2_39_aarch64.whl
Size 2.1 MB
Tags CPython 3.14 Linux glibc 2.39+ ARM64
SHA-256 checksum
How to use checksums
2f158625dad0cf282a73c3bda5f9ebffbdf42fde904c95ef10fd4598085f7903
BLAKE2b-256 checksum
How to use checksums
71ca58e118384edb058e7d26ac64cf62fddad603288574408c8f9c0e8447ba67
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.

Transparency log

Release files / webtransport_py-2026.1.0.dev19-cp314-cp314-macosx_26_0_arm64.whl

Download URL webtransport_py-2026.1.0.dev19-cp314-cp314-macosx_26_0_arm64.whl
Size 1.9 MB
Tags CPython 3.14 macOS 26.0+ ARM64
SHA-256 checksum
How to use checksums
07617944a27c715d3ee0d59728a5cfe25967aabc3acacb732277cfdeb7d0c080
BLAKE2b-256 checksum
How to use checksums
693c8c9e0b405dcfa314c5c50f27513be2f67d8895258e200125ea2e3cbc41f9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page