| 231 | } |
| 232 | |
| 233 | func (a *App) UpdatePortVisibility(ctx context.Context, selector *CodespaceSelector, args []string) (err error) { |
| 234 | ports, err := a.parsePortVisibilities(args) |
| 235 | if err != nil { |
| 236 | return fmt.Errorf("error parsing port arguments: %w", err) |
| 237 | } |
| 238 | |
| 239 | codespace, err := selector.Select(ctx) |
| 240 | if err != nil { |
| 241 | return err |
| 242 | } |
| 243 | |
| 244 | codespaceConnection, err := codespaces.GetCodespaceConnection(ctx, a, a.apiClient, codespace) |
| 245 | if err != nil { |
| 246 | return fmt.Errorf("error connecting to codespace: %w", err) |
| 247 | } |
| 248 | |
| 249 | fwd, err := portforwarder.NewPortForwarder(ctx, codespaceConnection) |
| 250 | if err != nil { |
| 251 | return fmt.Errorf("failed to create port forwarder: %w", err) |
| 252 | } |
| 253 | defer safeClose(fwd, &err) |
| 254 | |
| 255 | // TODO: check if port visibility can be updated in parallel instead of sequentially |
| 256 | for _, port := range ports { |
| 257 | err := a.RunWithProgress(fmt.Sprintf("Updating port %d visibility to: %s", port.number, port.visibility), func() (err error) { |
| 258 | // wait for success or failure |
| 259 | ctx, cancel := context.WithTimeout(ctx, 30*time.Second) |
| 260 | defer cancel() |
| 261 | |
| 262 | err = fwd.UpdatePortVisibility(ctx, port.number, port.visibility) |
| 263 | if err != nil { |
| 264 | return fmt.Errorf("error updating port %d to %s: %w", port.number, port.visibility, err) |
| 265 | } |
| 266 | return nil |
| 267 | }) |
| 268 | if err != nil { |
| 269 | return err |
| 270 | } |
| 271 | |
| 272 | } |
| 273 | |
| 274 | return nil |
| 275 | } |
| 276 | |
| 277 | type portVisibility struct { |
| 278 | number int |