@@ -11,6 +11,8 @@ import (
11
11
"go.coder.com/retry"
12
12
"golang.org/x/xerrors"
13
13
"nhooyr.io/websocket"
14
+
15
+ "cdr.dev/coder-cli/coder-sdk"
14
16
)
15
17
16
18
const (
@@ -45,32 +47,48 @@ func NewServer(args ServerArgs) (*Server, error) {
45
47
46
48
// Run will listen and proxy new peer connections on a retry loop.
47
49
func (s * Server ) Run (ctx context.Context ) error {
48
- err := retry .New (time .Second ).Context (ctx ).Backoff (15 * time .Second ).Run (func () error {
49
- ctx , cancelFunc := context .WithTimeout (ctx , time .Second * 15 )
50
- defer cancelFunc ()
51
- s .log .Info (ctx , "connecting to coder" , slog .F ("url" , s .listenURL .String ()))
52
- conn , _ , err := websocket .Dial (ctx , s .listenURL .String (), nil )
53
- if err != nil {
54
- return fmt .Errorf ("dial: %w" , err )
55
- }
56
- nc := websocket .NetConn (context .Background (), conn , websocket .MessageBinary )
57
- session , err := yamux .Server (nc , nil )
58
- if err != nil {
59
- return fmt .Errorf ("open: %w" , err )
60
- }
61
- s .log .Info (ctx , "connected to coder. awaiting connection requests" )
62
- for {
63
- st , err := session .AcceptStream ()
50
+ err := retry .New (time .Second ).
51
+ Context (ctx ).
52
+ Backoff (15 * time .Second ).
53
+ Conditions (
54
+ retry .Condition (func (err error ) bool {
55
+ if err != nil {
56
+ s .log .Error (ctx , "failed to connect" , slog .Error (err ))
57
+ }
58
+ return true
59
+ }),
60
+ ).Run (
61
+ func () error {
62
+ ctx , cancelFunc := context .WithTimeout (ctx , time .Second * 15 )
63
+ defer cancelFunc ()
64
+ s .log .Info (ctx , "connecting to coder" , slog .F ("url" , s .listenURL .String ()))
65
+ conn , resp , err := websocket .Dial (ctx , s .listenURL .String (), nil )
66
+ if err != nil && resp == nil {
67
+ return fmt .Errorf ("dial: %w" , err )
68
+ }
69
+ if err != nil && resp != nil {
70
+ return & coder.HTTPError {
71
+ Response : resp ,
72
+ }
73
+ }
74
+ nc := websocket .NetConn (context .Background (), conn , websocket .MessageBinary )
75
+ session , err := yamux .Server (nc , nil )
64
76
if err != nil {
65
- return fmt .Errorf ("accept stream : %w" , err )
77
+ return fmt .Errorf ("open : %w" , err )
66
78
}
67
- stream := & stream {
68
- logger : s .log .Named (fmt .Sprintf ("stream %d" , st .StreamID ())),
69
- stream : st ,
79
+ s .log .Info (ctx , "connected to coder. awaiting connection requests" )
80
+ for {
81
+ st , err := session .AcceptStream ()
82
+ if err != nil {
83
+ return fmt .Errorf ("accept stream: %w" , err )
84
+ }
85
+ stream := & stream {
86
+ logger : s .log .Named (fmt .Sprintf ("stream %d" , st .StreamID ())),
87
+ stream : st ,
88
+ }
89
+ go stream .listen ()
70
90
}
71
- go stream .listen ()
72
- }
73
- })
91
+ })
74
92
75
93
return err
76
94
}
0 commit comments