@@ -33,6 +33,7 @@ import (
33
33
"golang.org/x/mod/semver"
34
34
"golang.org/x/oauth2"
35
35
xgithub "golang.org/x/oauth2/github"
36
+ "golang.org/x/sync/errgroup"
36
37
"golang.org/x/xerrors"
37
38
"google.golang.org/api/idtoken"
38
39
"google.golang.org/api/option"
@@ -169,8 +170,9 @@ func server() *cobra.Command {
169
170
}
170
171
171
172
var (
172
- tunnelErrChan <- chan error
173
173
ctxTunnel , closeTunnel = context .WithCancel (cmd .Context ())
174
+ devTunnel = (* devtunnel .Tunnel )(nil )
175
+ devTunnelErrChan = make (<- chan error , 1 )
174
176
)
175
177
defer closeTunnel ()
176
178
@@ -195,10 +197,11 @@ func server() *cobra.Command {
195
197
}
196
198
}
197
199
if err == nil {
198
- accessURL , tunnelErrChan , err = devtunnel .New (ctxTunnel , localURL )
200
+ devTunnel , devTunnelErrChan , err = devtunnel .New (ctxTunnel , logger . Named ( "devtunnel" ) )
199
201
if err != nil {
200
202
return xerrors .Errorf ("create tunnel: %w" , err )
201
203
}
204
+ accessURL = devTunnel .URL
202
205
}
203
206
_ , _ = fmt .Fprintln (cmd .ErrOrStderr ())
204
207
}
@@ -349,7 +352,27 @@ func server() *cobra.Command {
349
352
return shutdownConnsCtx
350
353
},
351
354
}
352
- errCh <- server .Serve (listener )
355
+
356
+ wg := errgroup.Group {}
357
+ wg .Go (func () error {
358
+ // Make sure to close the tunnel listener if we exit so the
359
+ // errgroup doesn't wait forever!
360
+ if dev && tunnel {
361
+ defer devTunnel .Listener .Close ()
362
+ }
363
+
364
+ return server .Serve (listener )
365
+ })
366
+
367
+ if dev && tunnel {
368
+ wg .Go (func () error {
369
+ defer listener .Close ()
370
+
371
+ return server .Serve (devTunnel .Listener )
372
+ })
373
+ }
374
+
375
+ errCh <- wg .Wait ()
353
376
}()
354
377
355
378
config := createConfig (cmd )
@@ -415,7 +438,7 @@ func server() *cobra.Command {
415
438
case <- cmd .Context ().Done ():
416
439
coderAPI .Close ()
417
440
return cmd .Context ().Err ()
418
- case err := <- tunnelErrChan :
441
+ case err := <- devTunnelErrChan :
419
442
if err != nil {
420
443
return err
421
444
}
@@ -478,7 +501,7 @@ func server() *cobra.Command {
478
501
if dev && tunnel {
479
502
_ , _ = fmt .Fprintf (cmd .OutOrStdout (), cliui .Styles .Prompt .String ()+ "Waiting for dev tunnel to close...\n " )
480
503
closeTunnel ()
481
- <- tunnelErrChan
504
+ <- devTunnelErrChan
482
505
}
483
506
484
507
_ , _ = fmt .Fprintf (cmd .OutOrStdout (), cliui .Styles .Prompt .String ()+ "Waiting for WebSocket connections to close...\n " )
0 commit comments