@@ -17,12 +17,21 @@ import (
1717 "github.com/coder/coder/peerbroker/proto"
1818)
1919
20+ // ICEServersFunc returns ICEServers when a new connection is requested.
21+ type ICEServersFunc func (ctx context.Context ) ([]webrtc.ICEServer , error )
22+
2023// Listen consumes the transport as the server-side of the PeerBroker dRPC service.
2124// 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+ }
2331 ctx , cancelFunc := context .WithCancel (context .Background ())
2432 listener := & Listener {
2533 connectionChannel : make (chan * peer.Conn ),
34+ iceServersFunc : iceServersFunc ,
2635
2736 closeFunc : cancelFunc ,
2837 closed : make (chan struct {}),
@@ -48,6 +57,7 @@ func Listen(connListener net.Listener, opts *peer.ConnOptions) (*Listener, error
4857
4958type Listener struct {
5059 connectionChannel chan * peer.Conn
60+ iceServersFunc ICEServersFunc
5161
5262 closeFunc context.CancelFunc
5363 closed chan struct {}
@@ -104,8 +114,12 @@ type peerBrokerService struct {
104114
105115// NegotiateConnection negotiates a WebRTC connection.
106116func (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+ }
107121 // 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 )
109123 if err != nil {
110124 return xerrors .Errorf ("create peer connection: %w" , err )
111125 }
@@ -121,9 +135,9 @@ func (b *peerBrokerService) NegotiateConnection(stream proto.DRPCPeerBroker_Nego
121135 case <- peerConn .Closed ():
122136 return
123137 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 {
127141 SdpType : int32 (sessionDescription .Type ),
128142 Sdp : sessionDescription .SDP ,
129143 },
@@ -134,8 +148,8 @@ func (b *peerBrokerService) NegotiateConnection(stream proto.DRPCPeerBroker_Nego
134148 return
135149 }
136150 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 {
139153 IceCandidate : iceCandidate .Candidate ,
140154 },
141155 })
@@ -156,28 +170,11 @@ func (b *peerBrokerService) NegotiateConnection(stream proto.DRPCPeerBroker_Nego
156170 }
157171
158172 switch {
159- case clientToServerMessage .GetOffer () != nil :
173+ case clientToServerMessage .GetSdp () != nil :
160174 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 ,
163177 })
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- }
181178 case clientToServerMessage .GetIceCandidate () != "" :
182179 peerConn .AddRemoteCandidate (webrtc.ICECandidateInit {
183180 Candidate : clientToServerMessage .GetIceCandidate (),
0 commit comments