@@ -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