@@ -17,13 +17,22 @@ 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 ),
26
34
connectionListener : connListener ,
35
+ iceServersFunc : iceServersFunc ,
27
36
28
37
closeFunc : cancelFunc ,
29
38
closed : make (chan struct {}),
@@ -50,6 +59,7 @@ func Listen(connListener net.Listener, opts *peer.ConnOptions) (*Listener, error
50
59
type Listener struct {
51
60
connectionChannel chan * peer.Conn
52
61
connectionListener net.Listener
62
+ iceServersFunc ICEServersFunc
53
63
54
64
closeFunc context.CancelFunc
55
65
closed chan struct {}
@@ -107,8 +117,12 @@ type peerBrokerService struct {
107
117
108
118
// NegotiateConnection negotiates a WebRTC connection.
109
119
func (b * peerBrokerService ) NegotiateConnection (stream proto.DRPCPeerBroker_NegotiateConnectionStream ) error {
120
+ iceServers , err := b .listener .iceServersFunc (stream .Context ())
121
+ if err != nil {
122
+ return xerrors .Errorf ("get ice servers: %w" , err )
123
+ }
110
124
// Start with no ICE servers. They can be sent by the client if provided.
111
- peerConn , err := peer .Server ([]webrtc. ICEServer {} , b .connOptions )
125
+ peerConn , err := peer .Server (iceServers , b .connOptions )
112
126
if err != nil {
113
127
return xerrors .Errorf ("create peer connection: %w" , err )
114
128
}
@@ -124,9 +138,9 @@ func (b *peerBrokerService) NegotiateConnection(stream proto.DRPCPeerBroker_Nego
124
138
case <- peerConn .Closed ():
125
139
return
126
140
case sessionDescription := <- peerConn .LocalSessionDescription ():
127
- err = stream .Send (& proto.NegotiateConnection_ServerToClient {
128
- Message : & proto.NegotiateConnection_ServerToClient_Answer {
129
- Answer : & proto.WebRTCSessionDescription {
141
+ err = stream .Send (& proto.Exchange {
142
+ Message : & proto.Exchange_Sdp {
143
+ Sdp : & proto.WebRTCSessionDescription {
130
144
SdpType : int32 (sessionDescription .Type ),
131
145
Sdp : sessionDescription .SDP ,
132
146
},
@@ -137,8 +151,8 @@ func (b *peerBrokerService) NegotiateConnection(stream proto.DRPCPeerBroker_Nego
137
151
return
138
152
}
139
153
case iceCandidate := <- peerConn .LocalCandidate ():
140
- err = stream .Send (& proto.NegotiateConnection_ServerToClient {
141
- Message : & proto.NegotiateConnection_ServerToClient_IceCandidate {
154
+ err = stream .Send (& proto.Exchange {
155
+ Message : & proto.Exchange_IceCandidate {
142
156
IceCandidate : iceCandidate .Candidate ,
143
157
},
144
158
})
@@ -159,28 +173,11 @@ func (b *peerBrokerService) NegotiateConnection(stream proto.DRPCPeerBroker_Nego
159
173
}
160
174
161
175
switch {
162
- case clientToServerMessage .GetOffer () != nil :
176
+ case clientToServerMessage .GetSdp () != nil :
163
177
peerConn .SetRemoteSessionDescription (webrtc.SessionDescription {
164
- Type : webrtc .SDPType (clientToServerMessage .GetOffer ().SdpType ),
165
- SDP : clientToServerMessage .GetOffer ().Sdp ,
178
+ Type : webrtc .SDPType (clientToServerMessage .GetSdp ().SdpType ),
179
+ SDP : clientToServerMessage .GetSdp ().Sdp ,
166
180
})
167
- case clientToServerMessage .GetServers () != nil :
168
- // Convert protobuf ICE servers to the WebRTC type.
169
- iceServers := make ([]webrtc.ICEServer , 0 , len (clientToServerMessage .GetServers ().Servers ))
170
- for _ , iceServer := range clientToServerMessage .GetServers ().Servers {
171
- iceServers = append (iceServers , webrtc.ICEServer {
172
- URLs : iceServer .Urls ,
173
- Username : iceServer .Username ,
174
- Credential : iceServer .Credential ,
175
- CredentialType : webrtc .ICECredentialType (iceServer .CredentialType ),
176
- })
177
- }
178
- err = peerConn .SetConfiguration (webrtc.Configuration {
179
- ICEServers : iceServers ,
180
- })
181
- if err != nil {
182
- return peerConn .CloseWithError (xerrors .Errorf ("set ice configuration: %w" , err ))
183
- }
184
181
case clientToServerMessage .GetIceCandidate () != "" :
185
182
peerConn .AddRemoteCandidate (webrtc.ICECandidateInit {
186
183
Candidate : clientToServerMessage .GetIceCandidate (),
0 commit comments