Skip to content

Bring WARP (#6) into factory/3rtt - #12

Merged
tbarbugli merged 6 commits into
factory/3rttfrom
3rtt/warp-into-factory
Oct 1, 2026
Merged

tbarbugli merged 6 commits into
factory/3rttfrom
3rtt/warp-into-factory

Conversation

@tbarbugli

Copy link
Copy Markdown
Member

#6 (build on the GetStream pion forks and always offer WARP) was merged into its stacked base feature/skip-hello-verify after #3 had already landed, so it never reached factory/3rtt. This merges that branch into factory/3rtt (no conflicts).

The resulting tree is identical to 3rtt/staging-all (88f1727), the build measured on staging on 2026-10-01: with fast join (#11), warm publish/subscribe went from 436 / 599 ms to 191 / 218 ms from us-east5. Without the pion forks, fast join keeps pion-ice's ~200 ms check interval. go vet and go test ./... pass locally (GitHub Actions is blocked by billing).

Please merge with a merge commit (not squash): Vision-Agents #693 pins this branch head (80e955d).

tbarbugli and others added 6 commits September 30, 2026 22:18
Replace pion/webrtc, pion/ice, pion/dtls/v4 and pion/sctp with the
GetStream forks that implement WARP (draft-uberti-tsvwg-warp), and move
to dtls/v4. Every peer connection now offers DTLS 1.2 to 1.3 and DTLS in
the ICE checks (SPED); the SFU decides in band. An SFU without WARP
answers as before, so there is one code path and nothing for callers to
configure.

The ICE fork also nominates on the first successful check against the
ICE-lite SFU instead of waiting for the next check tick.

The local network delay layer (internal/netdelay) moves to
pion/transport/v5 with pion/webrtc v4.2.22.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
pion's ICETransport.GetSelectedCandidatePairStats reads the transport's
gatherer without its lock, and ICETransport.Start sets it. With SPED,
Start runs inside the DTLS start, concurrently with the join trace
polling the RTT, and the race detector caught it in video-sfu's
end-to-end suite. ICE connected is reported after Start, so reading from
then on is ordered after the write.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…E-lite SFU

ICE on each peer connection connects one round trip after the first check
instead of two.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
pion answers an ICE-lite offerer passive, which made the SFU the DTLS
client on the subscriber peer connection. Its ClientHello could then only
ride the responses to our checks, one datagram each. Answering active to a
SPED offer puts our one-datagram ClientHello in our first check, as
browsers do, so the subscriber is connected when ICE is.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Build on the GetStream pion forks and always offer WARP
@tbarbugli
tbarbugli merged commit 33a76ab into factory/3rtt Oct 1, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant