snapshot of https://github.com/pion/webrtc.git (main, 2026-09-15; blobs > 131072B omitted)
Some checks failed
REUSE Compliance Check / lint (push) Failing after 0s
Browser E2E / Test (push) Failing after 3s
Test / test (1.24) (push) Failing after 0s
Test / test-i386 (1.25) (push) Failing after 0s
Test / test-i386 (1.24) (push) Failing after 0s
Test / test-windows (1.25) (push) Failing after 0s
Test / test-windows (1.24) (push) Failing after 0s
Test / test (1.25) (push) Failing after 0s
Examples Tests / Test (push) Failing after 3s
Test / test-macos (1.25) (push) Failing after 0s
Test / test-macos (1.24) (push) Failing after 0s
Go mod tidy / tidy (push) Failing after 0s
Test / test-wasm (push) Failing after 0s
CodeQL / analyze (push) Failing after 1s
Fuzz / fuzz (push) Failing after 0s

This commit is contained in:
upstream-mirror
2026-09-15 20:06:07 +05:00
commit 8acb1a3a29
394 changed files with 78746 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
# ice-tcp
ice-tcp demonstrates Pion WebRTC's ICE TCP abilities.
## Instructions
### Download ice-tcp
This example requires you to clone the repo since it is serving static HTML.
```
git clone https://github.com/pion/webrtc.git
cd webrtc/examples/ice-tcp
```
### Run ice-tcp
Execute `go run *.go`
### Open the Web UI
Open [http://localhost:8080](http://localhost:8080). This will automatically start a PeerConnection. This page will now prints stats about the PeerConnection. The UDP candidates will be filtered out from the SDP.
Congrats, you have used Pion WebRTC! Now start building something cool

View File

@@ -0,0 +1,57 @@
<html>
<!--
SPDX-FileCopyrightText: 2026 The Pion community <https://pion.ly>
SPDX-License-Identifier: MIT
-->
<head>
<title>ice-tcp</title>
</head>
<body>
<h1>ICE TCP</h1>
<h3> ICE Connection States </h3>
<div id="iceConnectionStates"></div> <br />
<h3> Inbound DataChannel Messages </h3>
<div id="inboundDataChannelMessages"></div>
</body>
<script>
let pc = new RTCPeerConnection()
let dc = pc.createDataChannel('data')
dc.onmessage = event => {
let el = document.createElement('p')
el.appendChild(document.createTextNode(event.data))
document.getElementById('inboundDataChannelMessages').appendChild(el);
}
pc.oniceconnectionstatechange = () => {
let el = document.createElement('p')
el.appendChild(document.createTextNode(pc.iceConnectionState))
document.getElementById('iceConnectionStates').appendChild(el);
}
pc.createOffer()
.then(offer => {
pc.setLocalDescription(offer)
return fetch(`/doSignaling`, {
method: 'post',
headers: {
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json'
},
body: JSON.stringify(offer)
})
})
.then(res => res.json())
.then(res => {
pc.setRemoteDescription(res)
})
.catch(alert)
</script>
</html>

115
examples/ice-tcp/main.go Normal file
View File

@@ -0,0 +1,115 @@
// SPDX-FileCopyrightText: 2026 The Pion community <https://pion.ly>
// SPDX-License-Identifier: MIT
//go:build !js
// ice-tcp demonstrates Pion WebRTC's ICE TCP abilities.
package main
import (
"encoding/json"
"errors"
"fmt"
"io"
"net"
"net/http"
"time"
"github.com/pion/webrtc/v4"
)
var api *webrtc.API //nolint
func doSignaling(res http.ResponseWriter, req *http.Request) { //nolint:cyclop
peerConnection, err := api.NewPeerConnection(webrtc.Configuration{})
if err != nil {
panic(err)
}
// Set the handler for ICE connection state
// This will notify you when the peer has connected/disconnected
peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) {
fmt.Printf("ICE Connection State has changed: %s\n", connectionState.String())
})
// Send the current time via a DataChannel to the remote peer every 3 seconds
peerConnection.OnDataChannel(func(d *webrtc.DataChannel) {
d.OnOpen(func() {
for range time.Tick(time.Second * 3) {
if err = d.SendText(time.Now().String()); err != nil {
if errors.Is(err, io.ErrClosedPipe) {
return
}
panic(err)
}
}
})
})
var offer webrtc.SessionDescription
if err = json.NewDecoder(req.Body).Decode(&offer); err != nil {
panic(err)
}
if err = peerConnection.SetRemoteDescription(offer); err != nil {
panic(err)
}
// Create channel that is blocked until ICE Gathering is complete
gatherComplete := webrtc.GatheringCompletePromise(peerConnection)
answer, err := peerConnection.CreateAnswer(nil)
if err != nil {
panic(err)
} else if err = peerConnection.SetLocalDescription(answer); err != nil {
panic(err)
}
// Block until ICE Gathering is complete, disabling trickle ICE
// we do this because we only can exchange one signaling message
// in a production application you should exchange ICE Candidates via OnICECandidate
<-gatherComplete
response, err := json.Marshal(*peerConnection.LocalDescription())
if err != nil {
panic(err)
}
res.Header().Set("Content-Type", "application/json")
if _, err := res.Write(response); err != nil {
panic(err)
}
}
//nolint:cyclop
func main() {
settingEngine := webrtc.SettingEngine{}
// Enable support only for TCP ICE candidates.
settingEngine.SetNetworkTypes([]webrtc.NetworkType{
webrtc.NetworkTypeTCP4,
webrtc.NetworkTypeTCP6,
})
tcpListener, err := net.ListenTCP("tcp", &net.TCPAddr{
IP: net.IP{0, 0, 0, 0},
Port: 8443,
})
if err != nil {
panic(err)
}
fmt.Printf("Listening for ICE TCP at %s\n", tcpListener.Addr())
tcpMux := webrtc.NewICETCPMux(nil, tcpListener, 8)
settingEngine.SetICETCPMux(tcpMux)
api = webrtc.NewAPI(webrtc.WithSettingEngine(settingEngine))
http.Handle("/", http.FileServer(http.Dir(".")))
http.HandleFunc("/doSignaling", doSignaling)
fmt.Println("Open http://localhost:8080 to access this demo")
// nolint: gosec
panic(http.ListenAndServe(":8080", nil))
}