Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
6920d5d
feat(webrtc):revamp-setup+implement-test-suites
Nkovaturient Jul 20, 2025
fd22cd6
Merge branch 'main' of https://github.com/Nkovaturient/py-libp2p into…
Nkovaturient Jul 20, 2025
cd019ce
fix(webrtc): resolve lint and type declaration issues
Nkovaturient Jul 20, 2025
c2ba14d
Merge branch 'main' into feat/add-webrtc-transport
seetadev Jul 21, 2025
e7c1910
Add message.proto and fix a few mypy-ci errors
sukhman-sukh Jul 20, 2025
5d03f4f
Fix SDP and ICE message transfer
sukhman-sukh Jul 22, 2025
3c60b92
Fix ICE candidate exchange
sukhman-sukh Jul 22, 2025
f15f7a2
Fix lint error in CI
sukhman-sukh Jul 22, 2025
55d1de3
fix pyrefly typecheck in CI
Nkovaturient Jul 23, 2025
0784f1c
Fix webrtc-direct proto and certmanager
sukhman-sukh Jul 26, 2025
13378e6
Add dialer and listener to webrtc-direct
sukhman-sukh Aug 9, 2025
1cd4b3f
Merge branch 'main' into feat/add-webrtc-transport
seetadev Aug 12, 2025
bd7f93a
Add stream read/write for webrtc
sukhman-sukh Aug 11, 2025
177c149
Fix lint error in CI
sukhman-sukh Aug 11, 2025
2f30557
Merge branch 'main' into feat/add-webrtc-transport
seetadev Aug 14, 2025
0102ce7
Merge branch 'main' into feat/add-webrtc-transport
seetadev Aug 18, 2025
b525eec
Merge branch 'feat/add-webrtc-transport' into webrtc-side-branch
sukhman-sukh Aug 19, 2025
ccc7d28
Fix lint
sukhman-sukh Aug 19, 2025
7c545db
Merge pull request #1 from sukhman-sukh/webrtc-side-branch
sukhman-sukh Aug 19, 2025
927bfab
Merge branch 'main' into feat/add-webrtc-transport
seetadev Aug 25, 2025
73a87a9
Merge branch 'main' into feat/add-webrtc-transport
seetadev Aug 25, 2025
89c9d10
Merge branch 'main' into feat/add-webrtc-transport
seetadev Aug 28, 2025
b498932
Merge branch 'main' into feat/add-webrtc-transport
seetadev Sep 1, 2025
9fe7d72
Merge branch 'main' into feat/add-webrtc-transport
seetadev Sep 4, 2025
15ee85b
Merge branch 'main' into feat/add-webrtc-transport
seetadev Sep 4, 2025
951b892
Merge branch 'main' into feat/add-webrtc-transport
seetadev Sep 8, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
169 changes: 169 additions & 0 deletions libp2p/transport/webrtc/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
"""
WebRTC Transport Module for py-libp2p.

Provides both private-to-private and private-to-public WebRTC transport
implementations.
"""

import sys
from .private_to_private.transport import WebRTCTransport
from .private_to_public.transport import WebRTCDirectTransport
from .constants import (
DEFAULT_ICE_SERVERS,
SIGNALING_PROTOCOL,
MUXER_PROTOCOL,
WebRTCError,
SDPHandshakeError,
ConnectionStateError,
CertificateError,
STUNError,
CODEC_WEBRTC,
CODEC_WEBRTC_DIRECT,
CODEC_CERTHASH,
PROTOCOL_WEBRTC,
PROTOCOL_WEBRTC_DIRECT,
PROTOCOL_CERTHASH,
)
from typing import Dict, Any, Protocol as TypingProtocol
from multiaddr import protocols
from multiaddr.protocols import Protocol
from multiaddr import codecs


class WebRTCCodec:
"""Codec for WebRTC protocol (empty protocol with no value)."""
SIZE = 0
IS_PATH = False

@staticmethod
def to_bytes(proto: Any, s: str) -> bytes:
return b""

@staticmethod
def to_string(proto: Any, b: bytes) -> str:
return ""


class WebRTCDirectCodec:
"""Codec for WebRTC-Direct protocol (empty protocol with no value)."""
SIZE = 0
IS_PATH = False

@staticmethod
def to_bytes(proto: Any, s: str) -> bytes:
return b""

@staticmethod
def to_string(proto: Any, b: bytes) -> str:
return ""


class CerthashCodec:
"""Codec for certificate hash protocol (handles certificate hash encoding/decoding)."""
SIZE = -1 # Variable size protocol
LENGTH_PREFIXED_VAR_SIZE = -1
IS_PATH = False

@staticmethod
def to_bytes(proto: Any, s: str) -> bytes:
if not s:
return b""
# Remove multibase prefix if present
if s.startswith('uEi'):
s = s[3:]
elif s.startswith('u'):
s = s[1:]
# Decode base64url encoded hash
try:
import base64
# Ensure s is encoded as bytes for base64 decoding
s_bytes = s.encode('ascii') if isinstance(s, str) else s
padding = 4 - (len(s_bytes) % 4)
if padding != 4:
s_bytes += b'=' * padding
return base64.urlsafe_b64decode(s_bytes)
except Exception:
return s.encode('utf-8')

@staticmethod
def to_string(proto: Any, b: bytes) -> str:
if not b:
return ""
import base64
b64_hash = base64.urlsafe_b64encode(b).decode().rstrip('=')
return f"uEi{b64_hash}"


# Register WebRTC protocols with multiaddr
try:

# Create codec instances
webrtc_codec = WebRTCCodec()
webrtc_direct_codec = WebRTCDirectCodec()
certhash_codec = CerthashCodec()

# Register codec modules for multiaddr
sys.modules['multiaddr.codecs.webrtc'] = webrtc_codec # type: ignore
sys.modules['multiaddr.codecs.webrtc_direct'] = webrtc_direct_codec # type: ignore
sys.modules['multiaddr.codecs.certhash'] = certhash_codec # type: ignore

setattr(codecs, 'webrtc', webrtc_codec)
setattr(codecs, 'webrtc_direct', webrtc_direct_codec)
setattr(codecs, 'certhash', certhash_codec)

# Create Protocol objects with string codec names
webrtc_protocol = Protocol(
code=CODEC_WEBRTC,
name=PROTOCOL_WEBRTC,
codec="webrtc"
)

webrtc_direct_protocol = Protocol(
code=CODEC_WEBRTC_DIRECT,
name=PROTOCOL_WEBRTC_DIRECT,
codec="webrtc_direct"
)

certhash_protocol = Protocol(
code=CODEC_CERTHASH,
name=PROTOCOL_CERTHASH,
codec="certhash"
)

# Register protocols using the add_protocol function
protocols.add_protocol(webrtc_protocol)
protocols.add_protocol(webrtc_direct_protocol)
protocols.add_protocol(certhash_protocol)

print("✅ WebRTC protocols registered with multiaddr")

except ImportError as e:
print(f"⚠️ Failed to register WebRTC protocols: {e}")
except Exception as e:
print(f"⚠️ Error registering WebRTC protocols: {e}")

__all__ = [
"WebRTCTransport",
"WebRTCDirectTransport",
"DEFAULT_ICE_SERVERS",
"SIGNALING_PROTOCOL",
"MUXER_PROTOCOL",
"WebRTCError",
"SDPHandshakeError",
"ConnectionStateError",
"CertificateError",
"STUNError",
"CODEC_WEBRTC",
"CODEC_WEBRTC_DIRECT",
"CODEC_CERTHASH",
]


def webrtc(config: dict[str, Any] | None = None) -> WebRTCTransport:
"""Create a WebRTC transport instance (private-to-private)."""
return WebRTCTransport(config)


def webrtc_direct() -> WebRTCDirectTransport:
"""Create a WebRTC-Direct transport instance (private-to-public)."""
return WebRTCDirectTransport()
Loading