Created
March 22, 2021 11:07
-
-
Save trojek/baa9b1254bc8ed862960d91b0ab35276 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"time" | |
"github.com/pion/webrtc" | |
) | |
func main() { | |
// Everything below is the Pion WebRTC API! Thanks for using it ❤️. | |
// Prepare the configuration | |
config := webrtc.Configuration{ | |
ICEServers: []webrtc.ICEServer{ | |
{ | |
URLs: []string{"stun:stun.l.google.com:19302"}, | |
}, | |
}, | |
} | |
// Create a new RTCPeerConnection | |
peerConnection, err := webrtc.NewPeerConnection(config) | |
if err != nil { | |
panic(err) | |
} | |
// Create a datachannel with label 'data' | |
dataChannel, err := peerConnection.CreateDataChannel("data", nil) | |
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()) | |
}) | |
peerConnection.OnICECandidate(func(candidate *webrtc.ICECandidate) { | |
if candidate != nil { | |
fmt.Println("candidate :", candidate) | |
// Uncomment below line | |
// fmt.Println("local discription", peerConnection.LocalDescription()) | |
} | |
}) | |
// Register channel opening handling | |
dataChannel.OnOpen(func() { | |
fmt.Printf("Data channel '%s'-'%d' open. Random messages will now be sent to any connected DataChannels every 5 seconds\n", dataChannel.Label(), dataChannel.ID()) | |
for range time.NewTicker(5 * time.Second).C { | |
message := "1" | |
fmt.Printf("Sending '%s'\n", message) | |
// Send the message as text | |
sendErr := dataChannel.SendText(message) | |
if sendErr != nil { | |
panic(sendErr) | |
} | |
} | |
}) | |
// Register text message handling | |
dataChannel.OnMessage(func(msg webrtc.DataChannelMessage) { | |
fmt.Printf("Message from DataChannel '%s': '%s'\n", dataChannel.Label(), string(msg.Data)) | |
}) | |
// Create an offer to send to the browser | |
offer, err := peerConnection.CreateOffer(nil) | |
if err != nil { | |
panic(err) | |
} | |
// Create channel that is blocked until ICE Gathering is complete | |
gatherComplete := webrtc.GatheringCompletePromise(peerConnection) | |
// Sets the LocalDescription, and starts our UDP listeners | |
err = peerConnection.SetLocalDescription(offer) | |
if 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 | |
// Output the answer in base64 so we can paste it in browser | |
fmt.Println(*peerConnection.LocalDescription()) | |
// Block forever | |
select {} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment