Chiamate in entrata
Ricevere le offerte di chiamata in ingresso, accettarle o rifiutarle, e gestire il modello di offerta a più operatori.
Quando arriva una chiamata su un numero su cui un operatore è online, l'SDK
emette un evento incomingCall. Da lì decidi — tramite la tua UI — se
accettare o rifiutare l'offerta.
L'evento incomingCall
L'evento porta con sé un oggetto OperatorCall nello stato ringing:
op.on("incomingCall", (call) => {
console.log("chiamata in arrivo da", call.from, "su", call.to);
// call.direction === "inbound"
// call.state === "ringing"
// Mostra la tua UI "accetta / rifiuta", poi:
call.accept(); // oppure call.reject();
});In questa fase la chiamata è solo offerta: l'audio non è ancora stabilito. Le proprietà utili sono:
| Proprietà | Tipo | Note |
|---|---|---|
callSid | string | Identificatore della chiamata sulla piattaforma. |
direction | "inbound" | Per le chiamate in entrata è sempre inbound. |
from | string | undefined | Numero del chiamante (E.164), quando noto. |
to | string | undefined | Numero dell'account chiamato (E.164), quando noto. |
state | "ringing" | Stato iniziale di un'offerta in entrata. |
Accettare o rifiutare
L'oggetto OperatorCall espone due metodi per rispondere all'offerta:
accept()— risponde all'offerta. L'SDK apre il canale audio e, quando l'audio è stabilito, emettecallStarted. È un no-op se la chiamata non è più inringing(es. già accettata da un altro operatore).reject()— declina l'offerta. Anche questo è un no-op se la chiamata non è più inringing.
op.on("incomingCall", (call) => {
acceptButton.onclick = () => call.accept();
rejectButton.onclick = () => call.reject();
});accept() apre il microfono e l'audio: assicurati di averne il permesso
nel browser e che la pagina sia servita su HTTPS (o localhost). Vedi la
pagina Audio & microfono.
Il modello di offerta a più operatori
Una chiamata in entrata su un numero dell'account viene offerta a tutti gli operatori online su quel numero. Il primo che accetta vince la chiamata; gli altri ricevono la fine dell'offerta.
In pratica, dal punto di vista del tuo codice:
- Più operatori possono ricevere lo stesso
incomingCall"contemporaneamente". - Appena uno accetta, per gli altri la chiamata termina con
endReason: "taken_by_other". - Se nessuno risponde entro il tempo previsto, la chiamata termina con
endReason: "no_answer"e prosegue lungo il percorso configurato per quel numero (ad esempio un altro ramo del flusso lato Audin).
L'instradamento dell'offerta e i timeout sono gestiti dal gateway Audin:
il tuo codice deve solo reagire agli eventi (incomingCall, callStarted,
callEnded) e aggiornare la UI di conseguenza.
callStarted e callEnded
Una volta accettata l'offerta, segui il ciclo di vita della chiamata con due eventi:
callStarted— l'audio è stato stabilito (la chiamata passa allo statoactive). Da qui valgono i controllimute/hangup.callEnded— la chiamata è terminata (statoended). Ispezionacall.endReasonper sapere perché.
op.on("callStarted", (call) => {
console.log("connessa:", call.callSid);
});
op.on("callEnded", (call) => {
console.log("terminata:", call.callSid, "motivo:", call.endReason);
});Valori di endReason rilevanti per l'inbound
endReason | Significato |
|---|---|
taken_by_other | L'offerta è stata accettata da un altro operatore. |
rejected | L'operatore locale ha rifiutato l'offerta. |
no_answer | L'offerta non è stata risposta in tempo. |
hangup | L'operatore locale ha riagganciato. |
remote_hangup | La controparte (o la piattaforma) ha chiuso la chiamata. |
failed | Un errore ha impedito di stabilire la chiamata. |
offline | La sessione è andata offline mentre la chiamata era attiva. |
L'elenco completo di CallEndReason è nella
API reference.
Una sola chiamata attiva per operatore (MVP). Mentre una chiamata è in
corso, eventuali offerte in entrata vengono rifiutate automaticamente dal
gateway: il tuo codice non riceve un incomingCall per esse.