@@ -817,7 +817,7 @@ func (api *API) watchWorkspaceAgentContainers(rw http.ResponseWriter, r *http.Re
817
817
818
818
// If the agent is unreachable, the request will hang. Assume that if we
819
819
// don't get a response after 30s that the agent is unreachable.
820
- ctx , cancel := context .WithTimeout (ctx , 30 * time .Second )
820
+ dialCtx , cancel := context .WithTimeout (ctx , 30 * time .Second )
821
821
defer cancel ()
822
822
apiAgent , err := db2sdk .WorkspaceAgent (
823
823
api .DERPMap (),
@@ -843,7 +843,7 @@ func (api *API) watchWorkspaceAgentContainers(rw http.ResponseWriter, r *http.Re
843
843
return
844
844
}
845
845
846
- agentConn , release , err := api .agentProvider .AgentConn (ctx , workspaceAgent .ID )
846
+ agentConn , release , err := api .agentProvider .AgentConn (dialCtx , workspaceAgent .ID )
847
847
if err != nil {
848
848
httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
849
849
Message : "Internal error dialing workspace agent." ,
@@ -873,21 +873,21 @@ func (api *API) watchWorkspaceAgentContainers(rw http.ResponseWriter, r *http.Re
873
873
return
874
874
}
875
875
876
- ctx = api .ctx
876
+ ctx , wsNetConn := codersdk .WebsocketNetConn (ctx , conn , websocket .MessageText )
877
+ defer wsNetConn .Close ()
877
878
878
879
go httpapi .Heartbeat (ctx , conn )
879
- defer conn .Close (websocket .StatusNormalClosure , "connection closed" )
880
-
881
- encoder := wsjson .NewEncoder [codersdk.WorkspaceAgentListContainersResponse ](conn , websocket .MessageText )
882
- defer encoder .Close (websocket .StatusNormalClosure )
883
880
884
881
for {
885
882
select {
883
+ case <- api .ctx .Done ():
884
+ return
885
+
886
886
case <- ctx .Done ():
887
887
return
888
888
889
889
case containers := <- containersCh :
890
- if err := encoder .Encode (containers ); err != nil {
890
+ if err := json . NewEncoder ( wsNetConn ) .Encode (containers ); err != nil {
891
891
api .Logger .Error (ctx , "encode containers" , slog .Error (err ))
892
892
return
893
893
}
0 commit comments