feat: adapta CdpHandleDialog (nueva firma + DialogLog) y reporta diálogos en disconnect
CdpHandleDialog ahora devuelve (cancel, *DialogLog, error). El pool guarda el DialogLog por puerto y browser_disconnect reporta cuántos diálogos se auto-respondieron y el último (tipo + mensaje). drop/closeAll usan CdpDisconnect (alias legible de CdpClose(c,0)).
This commit is contained in:
@@ -11,13 +11,18 @@ import (
|
||||
// Una conexión = una sesión viva a una tab "page". Mantenerla evita pagar el
|
||||
// handshake WebSocket en cada tool y preserva estado (event handlers, contexto).
|
||||
type connPool struct {
|
||||
mu sync.Mutex
|
||||
conns map[int]*browser.CDPConn
|
||||
cancels map[int]func() // cancels de handlers persistentes (handle_dialog)
|
||||
mu sync.Mutex
|
||||
conns map[int]*browser.CDPConn
|
||||
cancels map[int]func() // cancels de handlers persistentes (handle_dialog)
|
||||
dialogLogs map[int]*browser.DialogLog // log de diálogos auto-respondidos por puerto
|
||||
}
|
||||
|
||||
func newConnPool() *connPool {
|
||||
return &connPool{conns: map[int]*browser.CDPConn{}, cancels: map[int]func(){}}
|
||||
return &connPool{
|
||||
conns: map[int]*browser.CDPConn{},
|
||||
cancels: map[int]func(){},
|
||||
dialogLogs: map[int]*browser.DialogLog{},
|
||||
}
|
||||
}
|
||||
|
||||
func (p *connPool) get(port int) (*browser.CDPConn, error) {
|
||||
@@ -41,8 +46,11 @@ func (p *connPool) drop(port int) {
|
||||
cancel()
|
||||
delete(p.cancels, port)
|
||||
}
|
||||
delete(p.dialogLogs, port)
|
||||
if c, ok := p.conns[port]; ok && c != nil {
|
||||
_ = browser.CdpClose(c, 0)
|
||||
// CdpDisconnect = cerrar el WebSocket sin matar Chrome (el navegador
|
||||
// sigue vivo; solo soltamos la sesión pooled).
|
||||
_ = browser.CdpDisconnect(c)
|
||||
delete(p.conns, port)
|
||||
}
|
||||
}
|
||||
@@ -62,13 +70,27 @@ func (p *connPool) connectTarget(port int, match string) (*browser.CDPConn, erro
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func (p *connPool) setCancel(port int, cancel func()) {
|
||||
// setDialog guarda el cancel y el DialogLog del auto-handler de diálogos del
|
||||
// puerto. Si ya había uno armado, lo cancela primero.
|
||||
func (p *connPool) setDialog(port int, cancel func(), dlog *browser.DialogLog) {
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
if old := p.cancels[port]; old != nil {
|
||||
old()
|
||||
}
|
||||
p.cancels[port] = cancel
|
||||
p.dialogLogs[port] = dlog
|
||||
}
|
||||
|
||||
// dialogSnapshot devuelve el estado del log de diálogos del puerto (0,"","" si
|
||||
// no hay handler armado).
|
||||
func (p *connPool) dialogSnapshot(port int) (int, string, string) {
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
if dl := p.dialogLogs[port]; dl != nil {
|
||||
return dl.Snapshot()
|
||||
}
|
||||
return 0, "", ""
|
||||
}
|
||||
|
||||
func (p *connPool) closeAll() {
|
||||
@@ -79,11 +101,12 @@ func (p *connPool) closeAll() {
|
||||
cancel()
|
||||
}
|
||||
if c != nil {
|
||||
_ = browser.CdpClose(c, 0)
|
||||
_ = browser.CdpDisconnect(c)
|
||||
}
|
||||
}
|
||||
p.conns = map[int]*browser.CDPConn{}
|
||||
p.cancels = map[int]func(){}
|
||||
p.dialogLogs = map[int]*browser.DialogLog{}
|
||||
}
|
||||
|
||||
// isConnErr reconoce errores de conexión CDP muerta para reintentar UNA vez.
|
||||
|
||||
Reference in New Issue
Block a user