From b33d35db5038035d3ca518592731cd562b650f52 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 31 Aug 2026 13:03:38 -0300 Subject: [PATCH] =?UTF-8?q?fix(softphone):=20widget=20nunca=20calculava=20?= =?UTF-8?q?o=20AOR=20quando=20config=20vinha=20via=20data-sip-*=20?= =?UTF-8?q?=E2=80=94=20ficava=20preso=20em=20"desconectado"=20pra=20sempre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Usuário configurou o proxy WebRTC de QA de verdade (Platform > Sistema > Softphone WebRTC) e tentou registrar o ramal 1501 (tenant teste01) — o widget só ficava cinza, sem nenhum erro visível. Descartado infraestrutura/credenciais primeiro (testes diretos: DNS, TCP, TLS, handshake WebSocket manual, e um REGISTER SIP cru com autenticação digest através do proxy — chegou no FreeSWITCH de verdade e voltou 200 OK). O bug estava no código-fonte do próprio widget: `widgetStorage.mergeConfig` só calculava o campo `aor` (sip:user@domain) no branch de config salva manualmente no localStorage — no branch usado quando a config vem via data-sip-*/window.HandphoneConfig (sempre, neste app), `aor` nunca era calculado, e `connect()` quebrava em `cfg.aor.startsWith(...)` com `aor` undefined — erro só no console, nunca visível pro usuário. Corrigido na mesma cópia local do handphone-2.0 (nunca enviado pro repo externo do usuário), rebuildado e revendorizado. Testado ponta a ponta com Playwright + navegador real fora do app (data-sip-* do ramal 1501 de verdade, sem depender do login do tenant): REGISTER 200 OK, botão do widget vira verde. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01BFaBaBSQGhyXGEgtTYZGV8 --- TODO.md | 49 +++++++++++++++++++++++++++++++ apps/frontend/public/handphone.js | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index b5cda1e..9ea57c2 100644 --- a/TODO.md +++ b/TODO.md @@ -2524,6 +2524,55 @@ rota de entrada") 1503→1502), áudio bidirecional e chamada sobrevivendo bem além dos 32s que travavam toda tentativa antes do achado 3. +## PHASE 69 — Sessão web expirando cedo demais pra call center (pedido do +usuário: "no minimo 12 hs") +- [x] Access token JWT (`packages/auth/src/tokens.ts`) e o teto absoluto do + cookie de sessão (duplicado em `login`/`post-login`/`select-tenant` + route handlers + `middleware.ts`) subiram de 15min/8h pra 12h. O + refresh silencioso do middleware (decodifica o `exp` do JWT, renova + via `/auth/refresh` uns 60s antes de vencer) continua existindo e + deslizando a sessão a cada requisição — 12h passa a ser só o teto de + segurança pra quando esse refresh falhar (aba parada, logout em + outro lugar), não o intervalo real de renovação. +- [x] Verificado com login real: token decodificado mostra exp−iat = 12h + exatas. + +## PHASE 70 — Softphone WebRTC não registrava, ficava cinza pra sempre +(usuário configurou o proxy QA de verdade e testou o ramal 1501 do tenant +teste01 — "so fica cinza") +- [x] Confirmado primeiro que a config em si estava certa + (`GET /platform/webrtc-proxy` devolvia a URL nova) e que a + infraestrutura de rede/proxy funcionava — DNS resolve, TCP conecta, + certificado TLS válido, e um handshake WebSocket manual (`ws`, com + header `Origin`) completa normal. Um REGISTER SIP cru (autenticação + digest manual) através do proxy chegou até o FreeSWITCH de verdade + (`User-Agent: FreeSWITCH-mod_sofia` na resposta) e voltou 200 OK — + credenciais do ramal 1501 corretas, proxy e FreeSWITCH 100% ok. +- [x] **Achado real, bug no próprio código-fonte do widget** (não + descoberto antes porque a verificação da PHASE 66 só conferia se o + `