Skip to content

Commit

Permalink
Add testable example for GatheringCompletePromise
Browse files Browse the repository at this point in the history
It is not immediately obvious how to do traditional (non-trickle)
ICE in Pion, and the current documentation does not make it
sufficiently clear.  Add a testable example for non-Trickle ICE.
  • Loading branch information
jech authored and Sean-Der committed Apr 18, 2022
1 parent 6ae706a commit 45061ef
Showing 1 changed file with 64 additions and 0 deletions.
64 changes: 64 additions & 0 deletions gathering_complete_promise_example_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package webrtc

import (
"fmt"
"strings"
)

// ExampleGatheringCompletePromise demonstrates how to implement
// non-trickle ICE in Pion, an older form of ICE that does not require an
// asynchronous side channel between peers: negotiation is just a single
// offer-answer exchange. It works by explicitly waiting for all local
// ICE candidates to have been gathered before sending an offer to the peer.
func ExampleGatheringCompletePromise() {
// create a peer connection
pc, err := NewPeerConnection(Configuration{})
if err != nil {
panic(err)
}
defer func() {
closeErr := pc.Close()
if closeErr != nil {
panic(closeErr)
}
}()

// add at least one transceiver to the peer connection, or nothing
// interesting will happen. This could use pc.AddTrack instead.
_, err = pc.AddTransceiverFromKind(RTPCodecTypeVideo)
if err != nil {
panic(err)
}

// create a first offer that does not contain any local candidates
offer, err := pc.CreateOffer(nil)
if err != nil {
panic(err)
}

// gatherComplete is a channel that will be closed when
// the gathering of local candidates is complete.
gatherComplete := GatheringCompletePromise(pc)

// apply the offer
err = pc.SetLocalDescription(offer)
if err != nil {
panic(err)
}

// wait for gathering of local candidates to complete
<-gatherComplete

// compute the local offer again
offer2 := pc.LocalDescription()

// this second offer contains all candidates, and may be sent to
// the peer with no need for further communication. In this
// example, we simply check that it contains at least one
// candidate.
hasCandidate := strings.Contains(offer2.SDP, "\na=candidate:")
if hasCandidate {
fmt.Println("Ok!")
}
// Output: Ok!
}

0 comments on commit 45061ef

Please sign in to comment.