Sub-spike of #546. Required before a spec-aligned /webrtc-direct listener can land.
Background
WebRTC-Direct v1 (libp2p/specs#672) and v2 (libp2p/specs#715) are no-signaling transports. The listener reconstructs the dialer's offer from the inbound STUN connectivity-check, reading the USERNAME attribute to recover ICE credentials and (for v2) the version-prefix dispatch (libp2p+webrtc+v1/ vs libp2p+webrtc+v2/).
js-libp2p solved this at the native ICE layer (murat-dogan/node-datachannel#420 exposes localUfrag on IceUdpMuxRequest). go-libp2p uses pion's ICE mux internals similarly.
py-libp2p uses aiortc. Whether aiortc gives us equivalent hooks is unknown today.
Goal
Determine — without committing to an implementation — whether aiortc exposes (or can be made to expose, via subclassing / monkey-patch / upstream PR):
- Inbound STUN parsing: the
USERNAME attribute of incoming connectivity checks before/during ICE negotiation, so the listener can branch on the version-prefix and reconstruct the dialer's offer.
- Server-side credential override: setting local
ufrag / pwd to the value parsed out of the STUN USERNAME before generating the answer (v2 step 6 in libp2p/specs#715).
- ICE mux / shared UDP socket across multiple concurrent inbound dials, so one listening UDP port can demux to per-dial
RTCPeerConnections without spinning up a port per peer.
Deliverables
- A spike doc (in this issue, a comment thread, or a short markdown PR) covering:
- Which of the 3 capabilities aiortc currently exposes (public API, private-but-accessible, or genuinely absent).
- For absent ones: feasibility of a subclass / monkey-patch / upstream contribution and a rough effort estimate.
- A go / no-go recommendation: does py-libp2p WebRTC-Direct listener land on aiortc, or do we need a different ICE / DTLS backend (e.g. wrap a Rust / C library)?
Why this isn't blocking #1309
PR #1309 lands experimental v1 node-to-node scaffolding (HTTP POST /sdp signaling, documented as a py-to-py temporary harness). Browser dial and go / js interop are explicitly out of scope there; the STUN listener path is a separate piece of work this spike unblocks.
Refs #546, #1309.
Sub-spike of #546. Required before a spec-aligned
/webrtc-directlistener can land.Background
WebRTC-Direct v1 (libp2p/specs#672) and v2 (libp2p/specs#715) are no-signaling transports. The listener reconstructs the dialer's offer from the inbound STUN connectivity-check, reading the
USERNAMEattribute to recover ICE credentials and (for v2) the version-prefix dispatch (libp2p+webrtc+v1/vslibp2p+webrtc+v2/).js-libp2p solved this at the native ICE layer (murat-dogan/node-datachannel#420 exposes
localUfragonIceUdpMuxRequest). go-libp2p uses pion's ICE mux internals similarly.py-libp2p uses aiortc. Whether aiortc gives us equivalent hooks is unknown today.
Goal
Determine — without committing to an implementation — whether aiortc exposes (or can be made to expose, via subclassing / monkey-patch / upstream PR):
USERNAMEattribute of incoming connectivity checks before/during ICE negotiation, so the listener can branch on the version-prefix and reconstruct the dialer's offer.ufrag/pwdto the value parsed out of the STUNUSERNAMEbefore generating the answer (v2 step 6 in libp2p/specs#715).RTCPeerConnections without spinning up a port per peer.Deliverables
Why this isn't blocking #1309
PR #1309 lands experimental v1 node-to-node scaffolding (HTTP
POST /sdpsignaling, documented as a py-to-py temporary harness). Browser dial and go / js interop are explicitly out of scope there; the STUN listener path is a separate piece of work this spike unblocks.Refs #546, #1309.