mirror of
https://github.com/pion/webrtc.git
synced 2025-10-30 02:12:03 +08:00
Resolves #218 Change Event Callback APIs to setter functions which take care of locking so that users don't need to know about or remember to do this.
86 lines
2.4 KiB
Go
86 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/pions/webrtc"
|
|
"github.com/pions/webrtc/examples/util"
|
|
"github.com/pions/webrtc/pkg/datachannel"
|
|
"github.com/pions/webrtc/pkg/ice"
|
|
)
|
|
|
|
func main() {
|
|
// Everything below is the pion-WebRTC API! Thanks for using it ❤️.
|
|
|
|
// Prepare the configuration
|
|
config := webrtc.RTCConfiguration{
|
|
IceServers: []webrtc.RTCIceServer{
|
|
{
|
|
URLs: []string{"stun:stun.l.google.com:19302"},
|
|
},
|
|
},
|
|
}
|
|
|
|
// Create a new RTCPeerConnection
|
|
peerConnection, err := webrtc.New(config)
|
|
util.Check(err)
|
|
|
|
// Set the handler for ICE connection state
|
|
// This will notify you when the peer has connected/disconnected
|
|
peerConnection.OnICEConnectionStateChange(func(connectionState ice.ConnectionState) {
|
|
fmt.Printf("ICE Connection State has changed: %s\n", connectionState.String())
|
|
})
|
|
|
|
// Register data channel creation handling
|
|
peerConnection.OnDataChannel(func(d *webrtc.RTCDataChannel) {
|
|
fmt.Printf("New DataChannel %s %d\n", d.Label, d.ID)
|
|
|
|
// Register channel opening handling
|
|
d.OnOpen(func() {
|
|
fmt.Printf("Data channel '%s'-'%d' open. Random messages will now be sent to any connected DataChannels every 5 seconds\n", d.Label, d.ID)
|
|
for {
|
|
time.Sleep(5 * time.Second)
|
|
message := util.RandSeq(15)
|
|
fmt.Printf("Sending %s \n", message)
|
|
|
|
err := d.Send(datachannel.PayloadString{Data: []byte(message)})
|
|
util.Check(err)
|
|
}
|
|
})
|
|
|
|
// Register message handling
|
|
d.OnMessage(func(payload datachannel.Payload) {
|
|
switch p := payload.(type) {
|
|
case *datachannel.PayloadString:
|
|
fmt.Printf("Message '%s' from DataChannel '%s' payload '%s'\n", p.PayloadType().String(), d.Label, string(p.Data))
|
|
case *datachannel.PayloadBinary:
|
|
fmt.Printf("Message '%s' from DataChannel '%s' payload '% 02x'\n", p.PayloadType().String(), d.Label, p.Data)
|
|
default:
|
|
fmt.Printf("Message '%s' from DataChannel '%s' no payload \n", p.PayloadType().String(), d.Label)
|
|
}
|
|
})
|
|
})
|
|
|
|
// Wait for the offer to be pasted
|
|
sd := util.Decode(util.MustReadStdin())
|
|
|
|
// Set the remote SessionDescription
|
|
offer := webrtc.RTCSessionDescription{
|
|
Type: webrtc.RTCSdpTypeOffer,
|
|
Sdp: string(sd),
|
|
}
|
|
err = peerConnection.SetRemoteDescription(offer)
|
|
util.Check(err)
|
|
|
|
// Sets the LocalDescription, and starts our UDP listeners
|
|
answer, err := peerConnection.CreateAnswer(nil)
|
|
util.Check(err)
|
|
|
|
// Output the answer in base64 so we can paste it in browser
|
|
fmt.Println(util.Encode(answer.Sdp))
|
|
|
|
// Block forever
|
|
select {}
|
|
}
|