Transferir e encaminhar chamadas
Durante uma chamada ativa, talvez você queira transferir a chamada para outra pessoa ou número. Vamos aprender como.
Pré-requisitos
- Uma conta do Azure com uma assinatura ativa. Crie uma conta gratuitamente.
- Um recurso dos Serviços de Comunicação implantado. Crie um recurso dos Serviços de Comunicação.
- Um token de acesso de usuário para habilitar o cliente de chamada. Para saber mais, confira Criar e gerenciar token de acesso.
- Opcional: conclua o guia de início rápido para adicionar uma chamada de voz ao seu aplicativo
Instalar o SDK
Use o comando npm install
para instalar os SDKs Comuns e de Chamada dos Serviços de Comunicação do Azure para JavaScript:
npm install @azure/communication-common --save
npm install @azure/communication-calling --save
Inicializar objetos necessários
Uma instância CallClient
é necessária para a maioria das operações de chamada. Ao criar uma instância de CallClient
, você pode configurá-la com opções personalizadas, como uma instância de Logger
.
Com a instância de CallClient
, você pode criar uma instância de CallAgent
chamando o createCallAgent
. Esse método retorna de modo assíncrono um objeto de instância CallAgent
.
O método createCallAgent
usa CommunicationTokenCredential
como um argumento. Ele aceita um token de acesso do usuário.
Você pode usar o método getDeviceManager
na instância CallClient
para acessar o deviceManager
.
const { CallClient } = require('@azure/communication-calling');
const { AzureCommunicationTokenCredential} = require('@azure/communication-common');
const { AzureLogger, setLogLevel } = require("@azure/logger");
// Set the logger's log level
setLogLevel('verbose');
// Redirect log output to console, file, buffer, REST API, or whatever location you want
AzureLogger.log = (...args) => {
console.log(...args); // Redirect log output to console
};
const userToken = '<USER_TOKEN>';
callClient = new CallClient(options);
const tokenCredential = new AzureCommunicationTokenCredential(userToken);
const callAgent = await callClient.createCallAgent(tokenCredential, {displayName: 'optional Azure Communication Services user name'});
const deviceManager = await callClient.getDeviceManager()
Gerenciar a conectividade do SDK do ACS para chamadas de entrada
Uma instância Call Agent
permite iniciar/ingressar e gerenciar chamadas de entrada. Sua instância Call Agent
precisa estar conectada à infraestrutura do ACS para receber chamadas de entrada. Esta conexão é estabelecida quando uma instância Call Agent
é criada, mas às vezes, por exemplo, quando a rede está instável, a conexão pode não ser configurada ou pode ser interrompida durante o ciclo de vida de Call Agent
. O SDK do ACS sempre tenta se manter conectado à infraestrutura do ACS. Ele continua tentando se conectar novamente quando a conexão é perdida.
Você pode verificar se Call Agent
está conectado à infraestrutura ACS examinando o valor atual da propriedade connectionState
e escutando o evento connectionStateChanged
de Call Agent
.
const connectionState = callAgentInstance.connectionState;
console.log(connectionState); // it may return either of 'Connected' | 'Disconnected'
const connectionStateCallback = (args) => {
console.log(args); // it will return an object with oldState and newState, each of having a value of either of 'Connected' | 'Disconnected'
// it will also return reason, either of 'invalidToken' | 'connectionIssue'
}
callAgentInstance.on('connectionStateChanged', connectionStateCallback);
O exemplo acima ilustra como gerenciar o estado da conexão sempre que o estado da conexão for:
- A instância
Connected
-Call Agent
está conectada e é capaz de receber notificações de infraestrutura ACS. Por exemplo, o recebimento de notificações de chamadas recebidas. - A instância
Disconnected
-Call Agent
está desconectada. É um estado terminal.Call Agent
deve ser recriado. Os usuários devem se certificar de que não há problemas de rede. -- motivoinvalidToken
– se o token ACS expirou ou é inválido e o aplicativo não forneceu um novo token válido. A instânciaCall Agent
será desconectada por esse motivo. -- motivoconnectionIssue
: se a rede estiver inoperante e, após várias tentativas, oCall Agent
não conseguir se reconectar, ele se desconectará com esse motivo. Geralmente, isso indica problemas de rede do cliente e pode ser resolvido assim que o problema de conectividade for resolvido.
A transferência de chamadas é um recurso estendido da API Call
principal. Primeiro, você precisa importar recursos de chamada do SDK de Chamada:
import { Features} from "@azure/communication-calling";
Em seguida, você pode obter o objeto de API de recurso de transferência da instância de chamada:
const callTransferApi = call.feature(Features.Transfer);
As transferências de chamada envolvem três partes:
- Emitente da transferência : Aquele que inicia a solicitação de transferência.
- Destino de transferência: a pessoa que está sendo transferida.
- Destino da transferência: a pessoa que está sendo transferida.
Transferir para o participante:
- Já existe uma chamada conectada entre o emitente da transferência e o destinatário da transferência. O emitente da transferência decide transferir a chamada do transferida para o destino de transferência.
- O emitente da transferência chama a
transfer
API. - Odestino de transferência recebe uma chamada de entrada somente se odestinatário da transferência aceitar a solicitação de transferência.
Para transferir uma chamada atual, você pode usar a API transfer
. O transfer
usa o transferCallOptions
opcional, que permite que você defina um sinalizador disableForwardingAndUnanswered
:
disableForwardingAndUnanswered = false
: Se o destino da transferência não responder à chamada de transferência, a transferência segue as configurações não respondidas e de encaminhamento do destino de transferência.disableForwardingAndUnanswered = true
: Se o destino da transferência não responder à chamada de transferência, a tentativa de transferência se encerra.
// transfer target can be an Azure Communication Services user
const id = { communicationUserId: <ACS_USER_ID> };
// call transfer API
const transfer = callTransferApi.transfer({targetParticipant: id});
Transferir para a chamada:
- Já existe uma chamada conectada entre o emitente da transferência e o destinatário da transferência.
- Já existe uma chamada conectada entre o emitente da transferência e o destino da transferência.
- O emitente da transferência decide transferir a chamada do destinatário da transferência para o destino de transferência.
- O emitente da transferência chama a
transfer
API. - Odestino de transferência recebe uma chamada de entrada somente se odestinatário da transferência aceitar a solicitação de transferência.
Para transferir uma chamada atual, você pode usar a API transfer
.
// transfer to the target call specifying the call id
const id = { targetCallId: <CALL_ID> };
// call transfer API
const transfer = callTransferApi.transfer({ targetCallId: <CALL_ID> });
A API transfer
permite que você assine stateChanged
. Ela também vem com uma transferência state
e propriedades error
// transfer state
const transferState = transfer.state; // None | Transferring | Transferred | Failed
// to check the transfer failure reason
const transferError = transfer.error; // transfer error code that describes the failure if a transfer request failed
O beneficiário pode ouvir um evento transferAccepted
. O ouvinte desse evento tem TransferEventArgs
que contém o objeto de chamada da nova chamada de transferência entre o beneficiário e o destino da transferência.
// Transferee can subscribe to the transferAccepted event
callTransferApi.on('transferAccepted', args => {
const newTransferCall = args.targetCall;
});
O emitente da transferência pode assinar eventos para obter a alteração do estado da transferência. Se a chamada para o destinatário da transferência tiver sido conectada com êxito ao destino de transferência, o emitente da transferência poderá desligar a chamada original com o destinatário da transferência.
transfer.on('stateChanged', () => {
if (transfer.state === 'Transferred') {
call.hangUp();
}
});