-
Notifications
You must be signed in to change notification settings - Fork 1
/
sdp_transfer.go
106 lines (94 loc) · 2.66 KB
/
sdp_transfer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package main
import (
"encoding/json"
"log"
"github.com/pion/webrtc/v3"
)
const ChannelSDPAnswer = "sdp_answer"
const ChannelSDPOffer = "sdp_offer"
const ChannelICE = "ice"
const ChannelReady = "ready"
func (room *Room) UpdateSDPs(myContext *MyContext, _peer *Peer) {
offerOptions := &webrtc.OfferOptions{
OfferAnswerOptions: webrtc.OfferAnswerOptions{
VoiceActivityDetection: false,
},
ICERestart: false,
}
for _, peer := range room.Users {
if peer.User.ID == _peer.User.ID {
continue
}
sendOffer(peer, offerOptions, myContext)
}
}
func sendOffer(peer *Peer, offerOptions *webrtc.OfferOptions, myContext *MyContext) {
sdp, err := peer.PeerConnection.CreateOffer(offerOptions)
if err != nil {
panic(err)
}
peer.PeerConnection.SetLocalDescription(sdp)
json, err := json.Marshal(sdp)
if err != nil {
panic(err)
}
myContext.RTMT.Send(peer.User.ID, ChannelSDPOffer, json)
}
func (room *Room) OnSDPAnswerMessage(peer *Peer, channel MessageChannel, message Message) {
log.Println("OnSDPAnswerMessage")
var sdp webrtc.SessionDescription
err := json.Unmarshal(message, &sdp)
if err != nil {
panic(err)
}
peer.PeerConnection.SetRemoteDescription(sdp)
}
func (room *Room) OnSDPOfferMessage(peer *Peer, channel MessageChannel, message Message) {
log.Println("OnSDPOfferMessage")
var sdp webrtc.SessionDescription
err := json.Unmarshal(message, &sdp)
if err != nil {
panic(err)
}
peer.PeerConnection.SetRemoteDescription(sdp)
answer, err := peer.PeerConnection.CreateAnswer(nil)
if err != nil {
panic(err)
}
peer.PeerConnection.SetLocalDescription(answer)
answerJson, err := json.Marshal(answer)
if err != nil {
panic(err)
}
err = myContext.RTMT.Send(peer.User.ID, ChannelSDPAnswer, Message(answerJson))
if err != nil {
log.Println(err)
}
}
func (room *Room) ListenIceMessages(peer *Peer, myContext *MyContext) {
room.ListenSelfIceMessage(peer, myContext)
room.ListenRemoteIceMessage(peer, myContext)
}
func (room *Room) ListenSelfIceMessage(peer *Peer, myContext *MyContext) {
peer.PeerConnection.OnICECandidate(func(i *webrtc.ICECandidate) {
log.Printf("OnICECandidate : %v", i)
if i != nil {
json, err := json.Marshal(i.ToJSON())
if err != nil {
panic(err)
}
myContext.RTMT.Send(peer.User.ID, ChannelICE, Message(json))
}
})
}
func (room *Room) ListenRemoteIceMessage(peer *Peer, myContext *MyContext) {
myContext.RTMT.Listen(ChannelICE, func(p *Peer, mc MessageChannel, m Message) {
var candidateInit webrtc.ICECandidateInit
err := json.Unmarshal(m, &candidateInit)
log.Printf("OnICECandidateMessage : %v", candidateInit)
if err != nil {
panic(err)
}
p.PeerConnection.AddICECandidate(candidateInit)
})
}