WatchWorkspaceAgentMetadata watches the metadata of a workspace agent. The returned channel will be closed when the context is canceled. Exactly one error will be sent on the error channel. The metadata channel is never closed.
(ctx context.Context, id uuid.UUID)
| 269 | // The returned channel will be closed when the context is canceled. Exactly |
| 270 | // one error will be sent on the error channel. The metadata channel is never closed. |
| 271 | func (c *Client) WatchWorkspaceAgentMetadata(ctx context.Context, id uuid.UUID) (<-chan []WorkspaceAgentMetadata, <-chan error) { |
| 272 | ctx, span := tracing.StartSpan(ctx) |
| 273 | defer span.End() |
| 274 | |
| 275 | metadataChan := make(chan []WorkspaceAgentMetadata, 256) |
| 276 | |
| 277 | ready := make(chan struct{}) |
| 278 | watch := func() error { |
| 279 | res, err := c.Request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/workspaceagents/%s/watch-metadata", id), nil) |
| 280 | if err != nil { |
| 281 | return err |
| 282 | } |
| 283 | if res.StatusCode != http.StatusOK { |
| 284 | return ReadBodyAsError(res) |
| 285 | } |
| 286 | |
| 287 | nextEvent := ServerSentEventReader(ctx, res.Body) |
| 288 | defer res.Body.Close() |
| 289 | |
| 290 | firstEvent := true |
| 291 | for { |
| 292 | select { |
| 293 | case <-ctx.Done(): |
| 294 | return ctx.Err() |
| 295 | default: |
| 296 | } |
| 297 | |
| 298 | sse, err := nextEvent() |
| 299 | if err != nil { |
| 300 | return err |
| 301 | } |
| 302 | |
| 303 | if firstEvent { |
| 304 | close(ready) // Only close ready after the first event is received. |
| 305 | firstEvent = false |
| 306 | } |
| 307 | |
| 308 | // Ignore pings. |
| 309 | if sse.Type == ServerSentEventTypePing { |
| 310 | continue |
| 311 | } |
| 312 | |
| 313 | b, ok := sse.Data.([]byte) |
| 314 | if !ok { |
| 315 | return xerrors.Errorf("unexpected data type: %T", sse.Data) |
| 316 | } |
| 317 | |
| 318 | switch sse.Type { |
| 319 | case ServerSentEventTypeData: |
| 320 | var met []WorkspaceAgentMetadata |
| 321 | err = json.Unmarshal(b, &met) |
| 322 | if err != nil { |
| 323 | return xerrors.Errorf("unmarshal metadata: %w", err) |
| 324 | } |
| 325 | metadataChan <- met |
| 326 | case ServerSentEventTypeError: |
| 327 | var r Response |
| 328 | err = json.Unmarshal(b, &r) |