@@ -94,38 +94,34 @@ func (c *Client) WorkspaceBuildByName(ctx context.Context, workspace uuid.UUID,
94
94
return workspaceBuild , json .NewDecoder (res .Body ).Decode (& workspaceBuild )
95
95
}
96
96
97
- type WorkspaceWatcher struct {
98
- conn * websocket.Conn
99
- }
100
-
101
- func (w * WorkspaceWatcher ) Read (ctx context.Context ) (Workspace , error ) {
102
- var ws Workspace
103
- err := wsjson .Read (ctx , w .conn , & ws )
104
- if err != nil {
105
- return ws , xerrors .Errorf ("read workspace: %w" , err )
106
- }
107
-
108
- return ws , nil
109
- }
110
-
111
- func (w * WorkspaceWatcher ) Close () error {
112
- err := w .conn .Close (websocket .StatusNormalClosure , "" )
113
- if err != nil {
114
- return xerrors .Errorf ("closing workspace watcher: %w" , err )
115
- }
116
-
117
- return nil
118
- }
119
-
120
- func (c * Client ) WatchWorkspace (ctx context.Context , id uuid.UUID ) (* WorkspaceWatcher , error ) {
97
+ func (c * Client ) WatchWorkspace (ctx context.Context , id uuid.UUID ) (<- chan Workspace , error ) {
121
98
conn , err := c .dialWebsocket (ctx , fmt .Sprintf ("/api/v2/workspaces/%s/watch" , id ))
122
99
if err != nil {
123
100
return nil , err
124
101
}
125
-
126
- return & WorkspaceWatcher {
127
- conn : conn ,
128
- }, nil
102
+ wc := make (chan Workspace , 256 )
103
+
104
+ go func () {
105
+ defer close (wc )
106
+ defer conn .Close (websocket .StatusNormalClosure , "" )
107
+
108
+ for {
109
+ select {
110
+ case <- ctx .Done ():
111
+ return
112
+ default :
113
+ var ws Workspace
114
+ err := wsjson .Read (ctx , conn , & ws )
115
+ if err != nil {
116
+ conn .Close (websocket .StatusInternalError , "failed to read workspace" )
117
+ return
118
+ }
119
+ wc <- ws
120
+ }
121
+ }
122
+ }()
123
+
124
+ return wc , nil
129
125
}
130
126
131
127
// UpdateWorkspaceAutostartRequest is a request to update a workspace's autostart schedule.
0 commit comments