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çãoCanalMotivo
Registro SIPWebRTCNecessário para mídia
Chamada de saídaWebRTCSIP INVITE direto
Chamada de entrada (roteamento)WebSocketstcall-ws decide o agente
Chamada de entrada (atendimento)WebRTCÁudio via SIP
Mudo/EsperaWebRTCControle SIP nativo
TransferênciaWebSocket + ARIRequer bridge do Asterisk
GravaçãoWebSocket + ARIControle via ARI
DesligarWebRTC (primário)Fallback via WebSocket
Status dos agentesWebSocketCoordenação em tempo real
Dashboard adminWebSocketMonitoramento centralizado
Copyright © 2026