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