github.com/pion/webrtc/v4@v4.0.1/examples/ice-restart/main.go (about) 1 // SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly> 2 // SPDX-License-Identifier: MIT 3 4 // ice-restart demonstrates Pion WebRTC's ICE Restart abilities. 5 package main 6 7 import ( 8 "encoding/json" 9 "fmt" 10 "net/http" 11 "time" 12 13 "github.com/pion/webrtc/v4" 14 ) 15 16 var peerConnection *webrtc.PeerConnection //nolint 17 18 func doSignaling(w http.ResponseWriter, r *http.Request) { 19 var err error 20 21 if peerConnection == nil { 22 if peerConnection, err = webrtc.NewPeerConnection(webrtc.Configuration{}); err != nil { 23 panic(err) 24 } 25 26 // Set the handler for ICE connection state 27 // This will notify you when the peer has connected/disconnected 28 peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) { 29 fmt.Printf("ICE Connection State has changed: %s\n", connectionState.String()) 30 }) 31 32 // Send the current time via a DataChannel to the remote peer every 3 seconds 33 peerConnection.OnDataChannel(func(d *webrtc.DataChannel) { 34 d.OnOpen(func() { 35 for range time.Tick(time.Second * 3) { 36 if err = d.SendText(time.Now().String()); err != nil { 37 panic(err) 38 } 39 } 40 }) 41 }) 42 } 43 44 var offer webrtc.SessionDescription 45 if err = json.NewDecoder(r.Body).Decode(&offer); err != nil { 46 panic(err) 47 } 48 49 if err = peerConnection.SetRemoteDescription(offer); err != nil { 50 panic(err) 51 } 52 53 // Create channel that is blocked until ICE Gathering is complete 54 gatherComplete := webrtc.GatheringCompletePromise(peerConnection) 55 56 answer, err := peerConnection.CreateAnswer(nil) 57 if err != nil { 58 panic(err) 59 } else if err = peerConnection.SetLocalDescription(answer); err != nil { 60 panic(err) 61 } 62 63 // Block until ICE Gathering is complete, disabling trickle ICE 64 // we do this because we only can exchange one signaling message 65 // in a production application you should exchange ICE Candidates via OnICECandidate 66 <-gatherComplete 67 68 response, err := json.Marshal(*peerConnection.LocalDescription()) 69 if err != nil { 70 panic(err) 71 } 72 73 w.Header().Set("Content-Type", "application/json") 74 if _, err := w.Write(response); err != nil { 75 panic(err) 76 } 77 } 78 79 func main() { 80 http.Handle("/", http.FileServer(http.Dir("."))) 81 http.HandleFunc("/doSignaling", doSignaling) 82 83 fmt.Println("Open http://localhost:8080 to access this demo") 84 // nolint: gosec 85 panic(http.ListenAndServe(":8080", nil)) 86 }