Files
webrtc/examples/pion-to-pion/answer/main.go
2018-09-04 19:15:55 -04:00

106 lines
2.4 KiB
Go

package main
import (
"fmt"
"log"
"net"
"os"
"os/signal"
"syscall"
"github.com/pions/webrtc"
"github.com/pions/webrtc/pkg/datachannel"
"github.com/pions/webrtc/pkg/ice"
)
func buildPeerConnection() *webrtc.RTCPeerConnection {
peerConnection, err := webrtc.New(webrtc.RTCConfiguration{
IceServers: []webrtc.RTCIceServer{
{
URLs: []string{"stun:stun.l.google.com:19302"},
},
},
})
if err != nil {
panic(err)
}
d, err := peerConnection.CreateDataChannel("data", nil)
if err != nil {
panic(err)
}
d.Lock()
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)
}
}
d.Unlock()
peerConnection.OnICEConnectionStateChange = func(connectionState ice.ConnectionState) {
fmt.Printf("Connection State has changed %s \n", connectionState.String())
if connectionState == ice.ConnectionStateConnected {
fmt.Println("sending openchannel")
err := d.SendOpenChannelMessage()
if err != nil {
fmt.Println("faild to send openchannel", err)
}
}
}
return peerConnection
}
func main() {
ln, err := net.Listen("unix", "../pion.sock")
if err != nil {
log.Fatal("Failed to listen: ", err)
}
sigc := make(chan os.Signal, 1)
signal.Notify(sigc, os.Interrupt, syscall.SIGTERM)
go func(ln net.Listener, c chan os.Signal) {
sig := <-c
log.Printf("Caught signal %s: shutting down.", sig)
ln.Close()
os.Exit(0)
}(ln, sigc)
fmt.Println("Ready for offer")
fd, err := ln.Accept()
if err != nil {
log.Fatal("Accept error: ", err)
}
buf := make([]byte, 5000)
n, err := fd.Read(buf)
if err != nil {
return
}
peerConnection := buildPeerConnection()
if err := peerConnection.SetRemoteDescription(webrtc.RTCSessionDescription{
Type: webrtc.RTCSdpTypeOffer,
Sdp: string(buf[0:n]),
}); err != nil {
panic(err)
}
answer, err := peerConnection.CreateAnswer(nil)
if err != nil {
panic(err)
}
if _, err := fd.Write([]byte(answer.Sdp)); err != nil {
log.Fatal("Writing client error: ", err)
}
select {}
}