feat: add telephony layer and asterisk-events worker

- packages/telephony: cliente AMI proprio sobre TCP puro (sem dependencia
  de terceiros pouco mantida) + interface TelephonyProvider +
  AsteriskTelephonyProvider (Originate, Hangup, QueuePause/Add/Remove,
  QueueStatus, ExtensionState, DeviceState, PJSIPShowEndpoints/Contacts,
  Reload, runCommand, stream de eventos). Testado contra o Asterisk real —
  o formato de resposta do Command mudou entre versoes do Asterisk
  (headers 'Output:' repetidos em vez de 'Response: Follows'/'--END
  COMMAND--'), corrigido apos inspecionar os bytes crus do protocolo
- apps/asterisk-events: worker dedicado a manter a conexao AMI viva,
  normalizar eventos (Newchannel, DialBegin/End, Hangup, DeviceStateChange,
  ContactStatus, eventos de fila/agente), persistir ExtensionState no
  Postgres e publicar em Redis pub/sub para consumo em tempo real.
  Containerizado, alcanca o Asterisk (host network) via
  host.docker.internal a partir da rede bridge. Heartbeat no Redis para
  health check
- packages/database: novos modelos Trunk, Extension, ExtensionState
  (migration aplicada)
- packages/shared: secret-crypto.ts (AES-256-GCM para credenciais de trunk
  e senha SIP em repouso, master key externa ao banco)

Testado ponta a ponta: chamada real originada -> eventos normalizados
recebidos via Redis SUBSCRIBE, heartbeat renovando no TTL correto.
This commit is contained in:
2026-08-27 12:41:41 -03:00
parent a2898fa566
commit 6f3d731581
20 changed files with 1059 additions and 4 deletions

34
pnpm-lock.yaml generated
View File

@@ -153,6 +153,31 @@ importers:
specifier: ^8.20.0
version: 8.68.0(eslint@9.39.5(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)
apps/asterisk-events:
dependencies:
'@b2bcall/database':
specifier: workspace:*
version: link:../../packages/database
'@b2bcall/telephony':
specifier: workspace:*
version: link:../../packages/telephony
ioredis:
specifier: ^5.4.2
version: 5.11.1(supports-color@8.1.1)
pino:
specifier: ^9.6.0
version: 9.14.0
devDependencies:
'@types/node':
specifier: ^24.0.0
version: 24.13.3
ts-node:
specifier: ^10.9.2
version: 10.9.2(@types/node@24.13.3)(typescript@5.9.3)
typescript:
specifier: ^5.7.3
version: 5.9.3
packages/database:
dependencies:
'@prisma/client':
@@ -184,6 +209,15 @@ importers:
specifier: ^5.7.3
version: 5.9.3
packages/telephony:
devDependencies:
'@types/node':
specifier: ^24.0.0
version: 24.13.3
typescript:
specifier: ^5.7.3
version: 5.9.3
packages:
'@angular-devkit/core@19.2.24':