| 1753 | } |
| 1754 | |
| 1755 | func (c *Controller) workspaceUpdates(client WorkspaceUpdatesClient) { |
| 1756 | defer func() { |
| 1757 | c.logger.Debug(c.ctx, "exiting workspaceUpdates control routine") |
| 1758 | cErr := client.Close() |
| 1759 | if cErr != nil { |
| 1760 | c.logger.Debug(c.ctx, "error closing WorkspaceUpdates RPC", slog.Error(cErr)) |
| 1761 | } |
| 1762 | }() |
| 1763 | cw := c.WorkspaceUpdatesCtrl.New(client) |
| 1764 | select { |
| 1765 | case <-c.ctx.Done(): |
| 1766 | c.logger.Debug(c.ctx, "workspaceUpdates: context done") |
| 1767 | return |
| 1768 | case err := <-cw.Wait(): |
| 1769 | c.logger.Debug(c.ctx, "workspaceUpdates: wait done") |
| 1770 | if err != nil && |
| 1771 | !xerrors.Is(err, io.EOF) && |
| 1772 | !xerrors.Is(err, context.Canceled) && |
| 1773 | !xerrors.Is(err, context.DeadlineExceeded) { |
| 1774 | c.logger.Error(c.ctx, "workspace updates stream error", slog.Error(err)) |
| 1775 | } |
| 1776 | } |
| 1777 | } |
| 1778 | |
| 1779 | func (c *Controller) refreshToken(ctx context.Context, client ResumeTokenClient) { |
| 1780 | cw := c.ResumeTokenCtrl.New(client) |