6
6
"fmt"
7
7
"io"
8
8
"net"
9
+ "net/url"
9
10
"os"
10
11
"strconv"
11
12
"time"
@@ -57,7 +58,7 @@ coder tunnel my-dev 3000 3000
57
58
}
58
59
baseURL := sdk .BaseURL ()
59
60
60
- envs , err := sdk . Environments (ctx )
61
+ envs , err := getEnvs (ctx , sdk , coder . Me )
61
62
if err != nil {
62
63
return err
63
64
}
@@ -79,8 +80,8 @@ coder tunnel my-dev 3000 3000
79
80
localPort : uint16 (localPort ),
80
81
remotePort : uint16 (remotePort ),
81
82
ctx : context .Background (),
82
- logger : log ,
83
- brokerAddr : baseURL . String () ,
83
+ logger : log . Leveled ( slog . LevelDebug ) ,
84
+ brokerAddr : baseURL ,
84
85
token : sdk .Token (),
85
86
}
86
87
@@ -98,7 +99,7 @@ coder tunnel my-dev 3000 3000
98
99
99
100
type client struct {
100
101
ctx context.Context
101
- brokerAddr string
102
+ brokerAddr url. URL
102
103
token string
103
104
logger slog.Logger
104
105
id string
@@ -108,8 +109,9 @@ type client struct {
108
109
}
109
110
110
111
func (c * client ) start () error {
111
- url := fmt .Sprintf ("%s%s%s%s%s" , c .brokerAddr , "/api/private/envagent/" , c .id , "/connect?session_token=" , c .token )
112
- c .logger .Info (c .ctx , "connecting to broker" , slog .F ("url" , url ))
112
+ url := fmt .Sprintf ("%s%s%s%s%s" , c .brokerAddr .String (), "/api/private/envagent/" , c .id , "/connect?session_token=" , c .token )
113
+ tcpProxy := fmt .Sprintf ("turn:%s:5349?transport=tcp" , c .brokerAddr .Host )
114
+ c .logger .Info (c .ctx , "connecting to broker" , slog .F ("url" , url ), slog .F ("tcp-proxy" , tcpProxy ))
113
115
114
116
conn , resp , err := websocket .Dial (c .ctx , url , nil )
115
117
if err != nil && resp == nil {
@@ -122,7 +124,15 @@ func (c *client) start() error {
122
124
}
123
125
nconn := websocket .NetConn (context .Background (), conn , websocket .MessageBinary )
124
126
125
- rtc , err := xwebrtc .NewPeerConnection ()
127
+ // Only enabled under a private feature flag for now,
128
+ // so insecure connections are entirely fine to allow.
129
+ servers := []webrtc.ICEServer {{
130
+ URLs : []string {tcpProxy },
131
+ Username : "insecure" ,
132
+ Credential : "pass" ,
133
+ CredentialType : webrtc .ICECredentialTypePassword ,
134
+ }}
135
+ rtc , err := xwebrtc .NewPeerConnection (servers )
126
136
if err != nil {
127
137
return fmt .Errorf ("create connection: %w" , err )
128
138
}
@@ -150,16 +160,17 @@ func (c *client) start() error {
150
160
if err != nil {
151
161
return fmt .Errorf ("set local desc: %w" , err )
152
162
}
153
- flushCandidates ()
154
163
155
164
c .logger .Debug (context .Background (), "writing offer" )
156
165
b , _ := json .Marshal (& proto.Message {
157
- Offer : & localDesc ,
166
+ Offer : & localDesc ,
167
+ Servers : servers ,
158
168
})
159
169
_ , err = nconn .Write (b )
160
170
if err != nil {
161
171
return fmt .Errorf ("write offer: %w" , err )
162
172
}
173
+ flushCandidates ()
163
174
164
175
go func () {
165
176
err = xwebrtc .WaitForDataChannelOpen (context .Background (), channel )
0 commit comments