@@ -17,12 +17,21 @@ import (
17
17
"github.com/coder/coder/peerbroker/proto"
18
18
)
19
19
20
+ // ICEServersFunc returns ICEServers when a new connection is requested.
21
+ type ICEServersFunc func (ctx context.Context ) ([]webrtc.ICEServer , error )
22
+
20
23
// Listen consumes the transport as the server-side of the PeerBroker dRPC service.
21
24
// The Accept function must be serviced, or new connections will hang.
22
- func Listen (connListener net.Listener , opts * peer.ConnOptions ) (* Listener , error ) {
25
+ func Listen (connListener net.Listener , iceServersFunc ICEServersFunc , opts * peer.ConnOptions ) (* Listener , error ) {
26
+ if iceServersFunc == nil {
27
+ iceServersFunc = func (ctx context.Context ) ([]webrtc.ICEServer , error ) {
28
+ return []webrtc.ICEServer {}, nil
29
+ }
30
+ }
23
31
ctx , cancelFunc := context .WithCancel (context .Background ())
24
32
listener := & Listener {
25
33
connectionChannel : make (chan * peer.Conn ),
34
+ iceServersFunc : iceServersFunc ,
26
35
27
36
closeFunc : cancelFunc ,
28
37
closed : make (chan struct {}),
@@ -48,6 +57,7 @@ func Listen(connListener net.Listener, opts *peer.ConnOptions) (*Listener, error
48
57
49
58
type Listener struct {
50
59
connectionChannel chan * peer.Conn
60
+ iceServersFunc ICEServersFunc
51
61
52
62
closeFunc context.CancelFunc
53
63
closed chan struct {}
@@ -104,8 +114,12 @@ type peerBrokerService struct {
104
114
105
115
// NegotiateConnection negotiates a WebRTC connection.
106
116
func (b * peerBrokerService ) NegotiateConnection (stream proto.DRPCPeerBroker_NegotiateConnectionStream ) error {
117
+ iceServers , err := b .listener .iceServersFunc (stream .Context ())
118
+ if err != nil {
119
+ return xerrors .Errorf ("get ice servers: %w" , err )
120
+ }
107
121
// Start with no ICE servers. They can be sent by the client if provided.
108
- peerConn , err := peer .Server ([]webrtc. ICEServer {} , b .connOptions )
122
+ peerConn , err := peer .Server (iceServers , b .connOptions )
109
123
if err != nil {
110
124
return xerrors .Errorf ("create peer connection: %w" , err )
111
125
}
@@ -121,9 +135,9 @@ func (b *peerBrokerService) NegotiateConnection(stream proto.DRPCPeerBroker_Nego
121
135
case <- peerConn .Closed ():
122
136
return
123
137
case sessionDescription := <- peerConn .LocalSessionDescription ():
124
- err = stream .Send (& proto.NegotiateConnection_ServerToClient {
125
- Message : & proto.NegotiateConnection_ServerToClient_Answer {
126
- Answer : & proto.WebRTCSessionDescription {
138
+ err = stream .Send (& proto.Exchange {
139
+ Message : & proto.Exchange_Sdp {
140
+ Sdp : & proto.WebRTCSessionDescription {
127
141
SdpType : int32 (sessionDescription .Type ),
128
142
Sdp : sessionDescription .SDP ,
129
143
},
@@ -134,8 +148,8 @@ func (b *peerBrokerService) NegotiateConnection(stream proto.DRPCPeerBroker_Nego
134
148
return
135
149
}
136
150
case iceCandidate := <- peerConn .LocalCandidate ():
137
- err = stream .Send (& proto.NegotiateConnection_ServerToClient {
138
- Message : & proto.NegotiateConnection_ServerToClient_IceCandidate {
151
+ err = stream .Send (& proto.Exchange {
152
+ Message : & proto.Exchange_IceCandidate {
139
153
IceCandidate : iceCandidate .Candidate ,
140
154
},
141
155
})
@@ -156,28 +170,11 @@ func (b *peerBrokerService) NegotiateConnection(stream proto.DRPCPeerBroker_Nego
156
170
}
157
171
158
172
switch {
159
- case clientToServerMessage .GetOffer () != nil :
173
+ case clientToServerMessage .GetSdp () != nil :
160
174
peerConn .SetRemoteSessionDescription (webrtc.SessionDescription {
161
- Type : webrtc .SDPType (clientToServerMessage .GetOffer ().SdpType ),
162
- SDP : clientToServerMessage .GetOffer ().Sdp ,
175
+ Type : webrtc .SDPType (clientToServerMessage .GetSdp ().SdpType ),
176
+ SDP : clientToServerMessage .GetSdp ().Sdp ,
163
177
})
164
- case clientToServerMessage .GetServers () != nil :
165
- // Convert protobuf ICE servers to the WebRTC type.
166
- iceServers := make ([]webrtc.ICEServer , 0 , len (clientToServerMessage .GetServers ().Servers ))
167
- for _ , iceServer := range clientToServerMessage .GetServers ().Servers {
168
- iceServers = append (iceServers , webrtc.ICEServer {
169
- URLs : iceServer .Urls ,
170
- Username : iceServer .Username ,
171
- Credential : iceServer .Credential ,
172
- CredentialType : webrtc .ICECredentialType (iceServer .CredentialType ),
173
- })
174
- }
175
- err = peerConn .SetConfiguration (webrtc.Configuration {
176
- ICEServers : iceServers ,
177
- })
178
- if err != nil {
179
- return peerConn .CloseWithError (xerrors .Errorf ("set ice configuration: %w" , err ))
180
- }
181
178
case clientToServerMessage .GetIceCandidate () != "" :
182
179
peerConn .AddRemoteCandidate (webrtc.ICECandidateInit {
183
180
Candidate : clientToServerMessage .GetIceCandidate (),
0 commit comments