This release is a pre-release and may not be stable for production use.
webtransport-py
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: すぐに使える高レベルなクライアント/サーバー実装
- 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 を採用
- WebTransport over HTTP/3
- Sans I/O API と asyncio API の両方を提供
- WebTransport over HTTP/2
- Sans I/O API と asyncio API の両方を提供
- Python Free-Threading 対応
- クロスプラットフォーム対応
- 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
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)
if not await client.connect():
print("接続失敗")
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
サーバー
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
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)
if not await client.connect():
print("接続失敗")
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 24.04 LTS x86_64
- Ubuntu 24.04 LTS arm64
- macOS 26 arm64
リリースビルド
make wheel
開発ビルド
make develop
テスト
uv sync
make test
サンプル
examples/ ディレクトリにサンプルコードがあります。
ngtcp2 ライセンス
https://github.com/ngtcp2/ngtcp2/blob/main/COPYING
The MIT License
Copyright (c) 2016 ngtcp2 contributors
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
nghttp3 ライセンス
https://github.com/ngtcp2/nghttp3/blob/main/COPYING
The MIT License
Copyright (c) 2019 nghttp3 contributors
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
nghttp2 ライセンス
https://github.com/nghttp2/nghttp2/blob/master/COPYING
The MIT License
Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa
Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
ライセンス
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.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
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 webtransport_py-2026.1.0.dev7-cp314-cp314t-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: webtransport_py-2026.1.0.dev7-cp314-cp314t-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 2.3 MB
- Tags: CPython 3.14t, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
40f2316883124ec30ed0b2021393ffacf218806daafa862bbacbe11f997d51e5
|
|
| MD5 |
abfb5ff03d34bf73e7eab998cfc70311
|
|
| BLAKE2b-256 |
c8b86b1312de5c60980da65db2a96c145032c6e73d6788db07a030ab28abcbc2
|
Provenance
The following attestation bundles were made for webtransport_py-2026.1.0.dev7-cp314-cp314t-manylinux_2_39_x86_64.whl:
Publisher:
wheel.yml on shiguredo/webtransport-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
webtransport_py-2026.1.0.dev7-cp314-cp314t-manylinux_2_39_x86_64.whl -
Subject digest:
40f2316883124ec30ed0b2021393ffacf218806daafa862bbacbe11f997d51e5 - Sigstore transparency entry: 2400082033
- Sigstore integration time:
-
Permalink:
shiguredo/webtransport-py@485ddb6be5ab7181acf5232581a590607f63f77f -
Branch / Tag:
refs/tags/2026.1.0.dev7 - Owner: https://github.com/shiguredo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheel.yml@485ddb6be5ab7181acf5232581a590607f63f77f -
Trigger Event:
push
-
Statement type:
File details
Details for the file webtransport_py-2026.1.0.dev7-cp314-cp314t-manylinux_2_39_aarch64.whl.
File metadata
- Download URL: webtransport_py-2026.1.0.dev7-cp314-cp314t-manylinux_2_39_aarch64.whl
- Upload date:
- Size: 2.1 MB
- Tags: CPython 3.14t, manylinux: glibc 2.39+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3adbd7aea68885c607f45772e03090ec629d27bf928dab9603aebb54b5fdf4ae
|
|
| MD5 |
cb8d3baede4f222346faa0a6948ed129
|
|
| BLAKE2b-256 |
6ed394c8595b1e8dce8b7f28cebd94f74f7907ad76bf8876e8760bbadbd3b409
|
Provenance
The following attestation bundles were made for webtransport_py-2026.1.0.dev7-cp314-cp314t-manylinux_2_39_aarch64.whl:
Publisher:
wheel.yml on shiguredo/webtransport-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
webtransport_py-2026.1.0.dev7-cp314-cp314t-manylinux_2_39_aarch64.whl -
Subject digest:
3adbd7aea68885c607f45772e03090ec629d27bf928dab9603aebb54b5fdf4ae - Sigstore transparency entry: 2400083096
- Sigstore integration time:
-
Permalink:
shiguredo/webtransport-py@485ddb6be5ab7181acf5232581a590607f63f77f -
Branch / Tag:
refs/tags/2026.1.0.dev7 - Owner: https://github.com/shiguredo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheel.yml@485ddb6be5ab7181acf5232581a590607f63f77f -
Trigger Event:
push
-
Statement type:
File details
Details for the file webtransport_py-2026.1.0.dev7-cp314-cp314t-macosx_26_0_arm64.whl.
File metadata
- Download URL: webtransport_py-2026.1.0.dev7-cp314-cp314t-macosx_26_0_arm64.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.14t, macOS 26.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38801bafbe322e03c53588184ed64b0c0fbbdea4e281883c027934dcf00cdc4b
|
|
| MD5 |
d95ae13d7320ee9a5fd4b57b08e84249
|
|
| BLAKE2b-256 |
6a7f28b507068715bc5d4a1442b0979bc79ed5b3cbcf763d53bfd392ff7eee28
|
Provenance
The following attestation bundles were made for webtransport_py-2026.1.0.dev7-cp314-cp314t-macosx_26_0_arm64.whl:
Publisher:
wheel.yml on shiguredo/webtransport-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
webtransport_py-2026.1.0.dev7-cp314-cp314t-macosx_26_0_arm64.whl -
Subject digest:
38801bafbe322e03c53588184ed64b0c0fbbdea4e281883c027934dcf00cdc4b - Sigstore transparency entry: 2400082385
- Sigstore integration time:
-
Permalink:
shiguredo/webtransport-py@485ddb6be5ab7181acf5232581a590607f63f77f -
Branch / Tag:
refs/tags/2026.1.0.dev7 - Owner: https://github.com/shiguredo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheel.yml@485ddb6be5ab7181acf5232581a590607f63f77f -
Trigger Event:
push
-
Statement type:
File details
Details for the file webtransport_py-2026.1.0.dev7-cp314-cp314-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: webtransport_py-2026.1.0.dev7-cp314-cp314-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 2.3 MB
- Tags: CPython 3.14, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d9391bf126d80e0b684591b644520746259ea76cd2be8c1cde659731037e861
|
|
| MD5 |
f8722fc938d76358d9c210c41959693d
|
|
| BLAKE2b-256 |
cde409a43124d978c5b5d29df9acadc409dbd981492b4d910fdcd06f0bf75e3b
|
Provenance
The following attestation bundles were made for webtransport_py-2026.1.0.dev7-cp314-cp314-manylinux_2_39_x86_64.whl:
Publisher:
wheel.yml on shiguredo/webtransport-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
webtransport_py-2026.1.0.dev7-cp314-cp314-manylinux_2_39_x86_64.whl -
Subject digest:
4d9391bf126d80e0b684591b644520746259ea76cd2be8c1cde659731037e861 - Sigstore transparency entry: 2400081807
- Sigstore integration time:
-
Permalink:
shiguredo/webtransport-py@485ddb6be5ab7181acf5232581a590607f63f77f -
Branch / Tag:
refs/tags/2026.1.0.dev7 - Owner: https://github.com/shiguredo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheel.yml@485ddb6be5ab7181acf5232581a590607f63f77f -
Trigger Event:
push
-
Statement type:
File details
Details for the file webtransport_py-2026.1.0.dev7-cp314-cp314-manylinux_2_39_aarch64.whl.
File metadata
- Download URL: webtransport_py-2026.1.0.dev7-cp314-cp314-manylinux_2_39_aarch64.whl
- Upload date:
- Size: 2.1 MB
- Tags: CPython 3.14, manylinux: glibc 2.39+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d0f0747377d5d3fa3e38a240c11402f32834ad99f926ebfe933e0d226ea8f3d8
|
|
| MD5 |
454662124f24a679e989414696abc7c7
|
|
| BLAKE2b-256 |
fb458c59bc3fb690f19e0410daa1fee469b2b98d66f683bc2efbe693b9e168e6
|
Provenance
The following attestation bundles were made for webtransport_py-2026.1.0.dev7-cp314-cp314-manylinux_2_39_aarch64.whl:
Publisher:
wheel.yml on shiguredo/webtransport-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
webtransport_py-2026.1.0.dev7-cp314-cp314-manylinux_2_39_aarch64.whl -
Subject digest:
d0f0747377d5d3fa3e38a240c11402f32834ad99f926ebfe933e0d226ea8f3d8 - Sigstore transparency entry: 2400079963
- Sigstore integration time:
-
Permalink:
shiguredo/webtransport-py@485ddb6be5ab7181acf5232581a590607f63f77f -
Branch / Tag:
refs/tags/2026.1.0.dev7 - Owner: https://github.com/shiguredo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheel.yml@485ddb6be5ab7181acf5232581a590607f63f77f -
Trigger Event:
push
-
Statement type:
File details
Details for the file webtransport_py-2026.1.0.dev7-cp314-cp314-macosx_26_0_arm64.whl.
File metadata
- Download URL: webtransport_py-2026.1.0.dev7-cp314-cp314-macosx_26_0_arm64.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.14, macOS 26.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6c66fab8fc85199b113d712c1bd519cbf47033e6c16772a1adf6e970df951c65
|
|
| MD5 |
4ed933ac1fa327d4ab56dde7b74cf55d
|
|
| BLAKE2b-256 |
a40247a500579f2708939b94cf77580f2663e3b0c4d323c1638a596be7c9e058
|
Provenance
The following attestation bundles were made for webtransport_py-2026.1.0.dev7-cp314-cp314-macosx_26_0_arm64.whl:
Publisher:
wheel.yml on shiguredo/webtransport-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
webtransport_py-2026.1.0.dev7-cp314-cp314-macosx_26_0_arm64.whl -
Subject digest:
6c66fab8fc85199b113d712c1bd519cbf47033e6c16772a1adf6e970df951c65 - Sigstore transparency entry: 2400083119
- Sigstore integration time:
-
Permalink:
shiguredo/webtransport-py@485ddb6be5ab7181acf5232581a590607f63f77f -
Branch / Tag:
refs/tags/2026.1.0.dev7 - Owner: https://github.com/shiguredo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheel.yml@485ddb6be5ab7181acf5232581a590607f63f77f -
Trigger Event:
push
-
Statement type: