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,9 +109,13 @@ 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 ))
113
-
112
+ url := fmt .Sprintf ("%s%s%s%s%s" , c .brokerAddr .String (), "/api/private/envagent/" , c .id , "/connect?session_token=" , c .token )
113
+ turnScheme := "turns"
114
+ if c .brokerAddr .Scheme == "http" {
115
+ turnScheme = "turn"
116
+ }
117
+ tcpProxy := fmt .Sprintf ("%s:%s:5349?transport=tcp" , turnScheme , c .brokerAddr .Host )
118
+ c .logger .Info (c .ctx , "connecting to broker" , slog .F ("url" , url ), slog .F ("tcp-proxy" , tcpProxy ))
114
119
conn , resp , err := websocket .Dial (c .ctx , url , nil )
115
120
if err != nil && resp == nil {
116
121
return fmt .Errorf ("dial: %w" , err )
@@ -122,7 +127,15 @@ func (c *client) start() error {
122
127
}
123
128
nconn := websocket .NetConn (context .Background (), conn , websocket .MessageBinary )
124
129
125
- rtc , err := xwebrtc .NewPeerConnection ()
130
+ // Only enabled under a private feature flag for now,
131
+ // so insecure connections are entirely fine to allow.
132
+ servers := []webrtc.ICEServer {{
133
+ URLs : []string {tcpProxy },
134
+ Username : "insecure" ,
135
+ Credential : "pass" ,
136
+ CredentialType : webrtc .ICECredentialTypePassword ,
137
+ }}
138
+ rtc , err := xwebrtc .NewPeerConnection (servers )
126
139
if err != nil {
127
140
return fmt .Errorf ("create connection: %w" , err )
128
141
}
@@ -150,16 +163,17 @@ func (c *client) start() error {
150
163
if err != nil {
151
164
return fmt .Errorf ("set local desc: %w" , err )
152
165
}
153
- flushCandidates ()
154
166
155
167
c .logger .Debug (context .Background (), "writing offer" )
156
168
b , _ := json .Marshal (& proto.Message {
157
- Offer : & localDesc ,
169
+ Offer : & localDesc ,
170
+ Servers : servers ,
158
171
})
159
172
_ , err = nconn .Write (b )
160
173
if err != nil {
161
174
return fmt .Errorf ("write offer: %w" , err )
162
175
}
176
+ flushCandidates ()
163
177
164
178
go func () {
165
179
err = xwebrtc .WaitForDataChannelOpen (context .Background (), channel )
0 commit comments