Arquitetura
Visão Geral
Arquitetura geral do sistema stCall e fluxo de dados.
Visão Geral da Arquitetura
O stCall utiliza uma arquitetura de canal duplo que separa mídia (WebRTC) de sinalização/controle (WebSocket).
Diagrama do Sistema
┌─────────────────────────────────────────────────────────────────┐
│ Frontend (stcall-app) │
│ Nuxt 3 + Vue 3 + PrimeVue │
│ │
│ ┌─────────────────────────┐ ┌────────────────────────────┐ │
│ │ WebRTC (SIP.js) │ │ WebSocket Client │ │
│ │ - Registro PJSIP │ │ - Eventos ARI │ │
│ │ - Chamadas via INVITE │ │ - Comandos │ │
│ │ - Áudio (RTP/DTLS) │ │ - Status dos agentes │ │
│ │ - Mudo/Espera via SIP │ │ - Heartbeat │ │
│ └──────────┬──────────────┘ └─────────────┬──────────────┘ │
│ │ │ │
└──────────────┼────────────────────────────────┼──────────────────┘
│ WSS (:8089) │ WS (:3001)
▼ ▼
┌──────────────────────┐ ┌──────────────────────────┐
│ Asterisk PBX │ │ stcall-ws │
│ │◄──────────►│ (Bun WebSocket) │
│ - PJSIP WebRTC │ ARI WS │ │
│ - Canais/Bridges │ + HTTP │ - Autenticação JWT │
│ - Gravação │ │ - Roteamento de eventos │
│ - PSTN Gateway │ │ - Execução de comandos │
│ - Stasis App │ │ - Call tracking │
└──────────────────────┘ └────────────┬─────────────┘
│
┌─────────────┼─────────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│PostgreSQL│ │ MySQL │ │ MySQL │
│ (stCall) │ │(FreePBX) │ │ (CDR) │
└──────────┘ └──────────┘ └──────────┘
Canal 1: WebRTC (Mídia)
Conexão direta entre o navegador e o Asterisk para streaming de áudio.
- Protocolo: SIP sobre WebSocket Secure (WSS)
- Biblioteca: SIP.js
- Porta: 8089 (WSS)
- Responsabilidades:
- Registro SIP do agente (PJSIP endpoint)
- Chamadas de saída via SIP INVITE
- Streaming de áudio (RTP/DTLS-SRTP)
- Controle básico: mudo, espera (via métodos SIP)
- Atendimento de chamadas entrantes
Canal 2: WebSocket (Controle e Eventos)
Conexão entre o navegador e o servidor stcall-ws para coordenação.
- Protocolo: WebSocket nativo (Bun)
- Porta: 3001
- Autenticação: JWT no parâmetro de URL ou header
- Responsabilidades:
- Registro e disponibilidade de agentes
- Roteamento de chamadas entrantes (eventos StasisStart)
- Atualizações de status em tempo real
- Monitoramento do dashboard administrativo
- Execução de comandos no Asterisk (via ARI HTTP)
- Heartbeat e reconexão
Fluxo de Chamada de Saída
1. Agente clica "Discar" → webrtcPhone.call(número)
2. SIP.js envia INVITE via WSS → Asterisk PJSIP
3. Asterisk roteia para destino (PSTN ou ramal)
4. Destino atende → áudio bidirecional via WebRTC
5. Agente desliga → SIP BYE → chamada encerrada
Chamadas de saída não usam ARI originate. O SIP INVITE é enviado diretamente pelo SIP.js. Usar ARI originate faria o agente ver uma "chamada entrante" quando ele mesmo iniciou a ligação.
Fluxo de Chamada de Entrada
1. Chamada PSTN → Asterisk → Stasis App "stCall"
2. Asterisk dispara StasisStart → ARI WebSocket
3. stcall-ws recebe evento → identifica agente disponível
4. stcall-ws envia "incoming_call" → WebSocket do agente
5. Frontend exibe diálogo de chamada entrante
6. Agente clica "Atender" → webrtcPhone.answer()
7. Áudio flui via WebRTC entre navegador e Asterisk
Separação de Responsabilidades
| Operação | Canal | Motivo |
|---|---|---|
| Registro SIP | WebRTC | Necessário para mídia |
| Chamada de saída | WebRTC | SIP INVITE direto |
| Chamada de entrada (roteamento) | WebSocket | stcall-ws decide o agente |
| Chamada de entrada (atendimento) | WebRTC | Áudio via SIP |
| Mudo/Espera | WebRTC | Controle SIP nativo |
| Transferência | WebSocket + ARI | Requer bridge do Asterisk |
| Gravação | WebSocket + ARI | Controle via ARI |
| Desligar | WebRTC (primário) | Fallback via WebSocket |
| Status dos agentes | WebSocket | Coordenação em tempo real |
| Dashboard admin | WebSocket | Monitoramento centralizado |