@@ -435,9 +435,7 @@ func (api *API) workspaceAgentStartupLogs(rw http.ResponseWriter, r *http.Reques
435
435
return
436
436
}
437
437
438
- api .WebsocketWaitMutex .Lock ()
439
438
api .WebsocketWaitGroup .Add (1 )
440
- api .WebsocketWaitMutex .Unlock ()
441
439
defer api .WebsocketWaitGroup .Done ()
442
440
conn , err := websocket .Accept (rw , r , nil )
443
441
if err != nil {
@@ -559,9 +557,7 @@ func (api *API) workspaceAgentStartupLogs(rw http.ResponseWriter, r *http.Reques
559
557
func (api * API ) workspaceAgentPTY (rw http.ResponseWriter , r * http.Request ) {
560
558
ctx := r .Context ()
561
559
562
- api .WebsocketWaitMutex .Lock ()
563
560
api .WebsocketWaitGroup .Add (1 )
564
- api .WebsocketWaitMutex .Unlock ()
565
561
defer api .WebsocketWaitGroup .Done ()
566
562
567
563
appToken , ok := workspaceapps .ResolveRequest (api .Logger , api .AccessURL , api .WorkspaceAppsProvider , rw , r , workspaceapps.Request {
@@ -816,9 +812,7 @@ func (api *API) workspaceAgentConnection(rw http.ResponseWriter, r *http.Request
816
812
func (api * API ) workspaceAgentCoordinate (rw http.ResponseWriter , r * http.Request ) {
817
813
ctx := r .Context ()
818
814
819
- api .WebsocketWaitMutex .Lock ()
820
815
api .WebsocketWaitGroup .Add (1 )
821
- api .WebsocketWaitMutex .Unlock ()
822
816
defer api .WebsocketWaitGroup .Done ()
823
817
workspaceAgent := httpmw .WorkspaceAgent (r )
824
818
resource , err := api .Database .GetWorkspaceResourceByID (ctx , workspaceAgent .ResourceID )
@@ -1096,31 +1090,25 @@ func (api *API) workspaceAgentClientCoordinate(rw http.ResponseWriter, r *http.R
1096
1090
}
1097
1091
}
1098
1092
1099
- api .WebsocketWaitMutex .Lock ()
1100
- api .WebsocketWaitGroup .Add (1 )
1101
- api .WebsocketWaitMutex .Unlock ()
1102
- defer api .WebsocketWaitGroup .Done ()
1103
1093
workspaceAgent := httpmw .WorkspaceAgentParam (r )
1104
1094
1105
- conn , err := websocket .Accept (rw , r , nil )
1106
- if err != nil {
1107
- httpapi .Write (ctx , rw , http .StatusBadRequest , codersdk.Response {
1108
- Message : "Failed to accept websocket." ,
1109
- Detail : err .Error (),
1110
- })
1111
- return
1112
- }
1113
- ctx , wsNetConn := websocketNetConn (ctx , conn , websocket .MessageBinary )
1114
- defer wsNetConn .Close ()
1095
+ api .WebsocketWatch .Accept (rw , r , nil , func (conn * websocket.Conn ) {
1096
+ ctx , wsNetConn := websocketNetConn (ctx , conn , websocket .MessageBinary )
1097
+ defer wsNetConn .Close ()
1115
1098
1116
- go httpapi .Heartbeat (ctx , conn )
1099
+ // Track for graceful shutdown.
1100
+ api .WebsocketWatch .Add (wsNetConn )
1101
+ defer api .WebsocketWatch .Done ()
1117
1102
1118
- defer conn .Close (websocket .StatusNormalClosure , "" )
1119
- err = (* api .TailnetCoordinator .Load ()).ServeClient (wsNetConn , uuid .New (), workspaceAgent .ID )
1120
- if err != nil {
1121
- _ = conn .Close (websocket .StatusInternalError , err .Error ())
1122
- return
1123
- }
1103
+ go httpapi .Heartbeat (ctx , conn )
1104
+
1105
+ defer conn .Close (websocket .StatusNormalClosure , "" )
1106
+ err := (* api .TailnetCoordinator .Load ()).ServeClient (wsNetConn , uuid .New (), workspaceAgent .ID )
1107
+ if err != nil {
1108
+ _ = conn .Close (websocket .StatusInternalError , err .Error ())
1109
+ return
1110
+ }
1111
+ })
1124
1112
}
1125
1113
1126
1114
func convertApps (dbApps []database.WorkspaceApp ) []codersdk.WorkspaceApp {
0 commit comments