| 1727 | } |
| 1728 | |
| 1729 | func (c *Controller) derpMap(client DERPClient) error { |
| 1730 | defer func() { |
| 1731 | cErr := client.Close() |
| 1732 | if cErr != nil { |
| 1733 | c.logger.Debug(c.ctx, "error closing StreamDERPMaps RPC", slog.Error(cErr)) |
| 1734 | } |
| 1735 | }() |
| 1736 | cw := c.DERPCtrl.New(client) |
| 1737 | select { |
| 1738 | case <-c.ctx.Done(): |
| 1739 | cErr := client.Close() |
| 1740 | if cErr != nil { |
| 1741 | c.logger.Warn(c.ctx, "failed to close StreamDERPMaps RPC", slog.Error(cErr)) |
| 1742 | } |
| 1743 | return nil |
| 1744 | case err := <-cw.Wait(): |
| 1745 | if xerrors.Is(err, context.Canceled) || xerrors.Is(err, context.DeadlineExceeded) { |
| 1746 | return nil |
| 1747 | } |
| 1748 | if err != nil && !xerrors.Is(err, io.EOF) { |
| 1749 | c.logger.Error(c.ctx, "error receiving DERP Map", slog.Error(err)) |
| 1750 | } |
| 1751 | return err |
| 1752 | } |
| 1753 | } |
| 1754 | |
| 1755 | func (c *Controller) workspaceUpdates(client WorkspaceUpdatesClient) { |
| 1756 | defer func() { |