Files
fn_registry/functions/browser/cdp_close.md
T
egutierrez 8742cb25be feat(browser): auto-commit con 60 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-07 11:42:31 +02:00

3.6 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports params output tested tests test_file_path file_path
cdp_close function go browser 1.2.0 impure func CdpClose(c *CDPConn, pid int) error Cierra la conexion WebSocket CDP y opcionalmente mata el proceso Chrome por PID. En Linux nativo mata el grupo de proceso completo (pid == pgid cuando ChromeLaunch seteo Setpgid=true), lo que incluye zygote, gpu-process y renderers. Si c es nil, solo mata el proceso. Si pid <= 0, solo cierra la conexion. Siempre intenta ambas operaciones aunque una falle. Wrappers nombrados: CdpDisconnect(c) solo cierra el WebSocket; CdpQuit(c, pid) cierra y mata Chrome.
chrome
cdp
browser
automation
cleanup
devtools
linux
navegator
false error_go_core
fmt
os
syscall
name desc
c conexión CDP (puede ser nil para solo matar el proceso)
name desc
pid PID del proceso Chrome (0 para no matar; en Linux nativo este PID es tambien el PGID cuando ChromeLaunch uso Setpgid)
error si falla la desconexion o el cierre del proceso; nil si todo OK true
TestCdpCloseWrappers
functions/browser/cdp_close_test.go functions/browser/cdp_close.go

Ejemplo

pid, _ := ChromeLaunch(ChromeLaunchOpts{Port: 9222, Headless: true})
conn, _ := CdpConnect(9222)

defer CdpClose(conn, pid)  // cierra WebSocket y mata grupo Chrome completo

// O por separado:
defer CdpClose(conn, 0)  // solo cierra WebSocket
defer CdpClose(nil, pid) // solo mata Chrome (y su grupo en Linux)

Cuando usarla

Usar siempre en defer después de ChromeLaunch para garantizar cleanup del proceso Chrome y del WebSocket CDP. En Linux nativo mata el árbol completo de procesos (zygote, gpu, renderers) evitando procesos zombie.

Elige el wrapper según la intención (más legible que el pid mágico):

Quiero... Usa Equivale a
Soltar la sesión, dejar Chrome vivo (navegador diario en 9222) CdpDisconnect(c) CdpClose(c, 0)
Apagar el Chrome que yo lancé CdpQuit(c, pid) CdpClose(c, pid)
Control fino (decidir pid en runtime) CdpClose(c, pid)

Gotchas

  • Kill por grupo (Linux nativo): usa syscall.Kill(-pid, SIGKILL) que envía la señal a todos los procesos del grupo. Funciona porque ChromeLaunch setea Setpgid: true en Linux, haciendo que pid == pgid. En WSL+chrome.exe el Setpgid no se aplica, por lo que el fallback a os.FindProcess(pid).Kill() maneja ese caso.
  • Fallback automático: si el kill de grupo falla (proceso ya terminado, PID no encontrado, o es WSL+exe), intenta matar solo el proceso raiz. En ambos casos el error no es fatal si el proceso ya no existe.
  • Doble cierre seguro: marca c.closed = true para evitar doble cierre del WebSocket. El segundo CdpClose con la misma conexión es un no-op en el lado WebSocket.
  • Primer error: si tanto el cierre WebSocket como el kill fallan, retorna el error del WebSocket (el primero en ejecutarse). El kill siempre se intenta aunque el WebSocket falle.

Notas

Usar en defer para garantizar cleanup. Si tanto la conexion como el proceso son invalidos, el error retornado corresponde al primero que fallo.

Capability growth log

  • v1.2.0 (2026-06-06) — añade wrappers nombrados CdpDisconnect(c) (solo WebSocket) y CdpQuit(c, pid) (WebSocket + mata Chrome) para desambiguar el pid mágico; CdpClose sin cambios de comportamiento.
  • v1.1.0 (2026-06-05) — Linux-native kill: usa syscall.Kill(-pid, SIGKILL) para matar grupo completo (zygote, gpu, renderers), con fallback a os.FindProcess para WSL+exe o proceso ya terminado