Бөлісу құралы:


Переключение и переадресация звонков

Во время активного звонка может потребоваться передать звонок другому лицу, номеру или голосовой почте. Давайте узнаем, как.

Необходимые компоненты

Установка пакета SDK

npm install Используйте команду для установки пакета SDK Службы коммуникации Azure Common and Calling SDK для JavaScript:

npm install @azure/communication-common --save
npm install @azure/communication-calling --save

Инициализация обязательных объектов

Экземпляр CallClient требуется для большинства операций вызова. При создании нового CallClient экземпляра его можно настроить с помощью пользовательских параметров, таких как Logger экземпляр.

С помощью экземпляра CallClient можно создать CallAgent экземпляр, вызвав его createCallAgent. Этот метод асинхронно возвращает объект экземпляра CallAgent.

Метод createCallAgent использует CommunicationTokenCredential в качестве аргумента. Он принимает маркер доступа пользователя.

Можно применить метод getDeviceManager для экземпляра CallClient, чтобы получить доступ к 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()

Управление подключением пакета SDK к инфраструктуре Майкрософт

Экземпляр Call Agent помогает управлять вызовами (для присоединения или запуска вызовов). Для работы пакета SDK для вызова необходимо подключиться к инфраструктуре Майкрософт для получения уведомлений о входящих звонках и координации других сведений о вызове. У вас Call Agent есть два возможных состояния:

ПодключеноCall Agent значение Connected connectionStatue означает, что клиентский пакет SDK подключен и способен получать уведомления из инфраструктуры Майкрософт.

ОтключеноCall Agent значение connectionStatue состояний Disconnected возникает проблема, которая препятствует правильному подключению пакета SDK. Call Agent необходимо повторно создать.

  • invalidToken: если срок действия маркера истек или является недопустимым Call Agent экземпляром, отключается с этой ошибкой.
  • connectionIssue: если возникла проблема с клиентом, подключающимся к инфраструктуре Майкрософт, после многих повторных попыток Call Agent возникает connectionIssue ошибка.

Вы можете проверить, подключен ли локальный сервер Call Agent к инфраструктуре Майкрософт, проверив текущее значение connectionState свойства. Во время активного вызова можно прослушивать connectionStateChanged событие, чтобы определить, изменяются ли 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);

Перенаправление вызовов является расширенной функцией основного API Call. Сначала необходимо импортировать функции вызова из пакета SDK для вызовов:

import { Features} from "@azure/communication-calling";

Затем можно получить объект API функций передачи из экземпляра вызова:

const callTransferApi = call.feature(Features.Transfer);

Перенаправление вызовов осуществляется при участии трех сторон.

  • Передающая сторона — участник вызова, который инициирует запрос на передачу.
  • Передаваемая сторона — участник вызова, который перенаправляется.
  • Целевая сторона — участник, к которому выполняется перенаправление.

Передача участнику:

  1. существует уже установленный вызов между передающей стороной и передаваемой стороной; передающая сторона принимает решение о перенаправлении вызова от передаваемой стороны целевой стороне;
  2. передающая сторона вызывает API transfer;
  3. целевая сторона получает входящий вызов, если передаваемая сторона подтверждает запрос на передачу.

Для передачи текущего вызова можно использовать API transfer. transfer принимает необязательный аргумент transferCallOptions, который позволяет задать флаг disableForwardingAndUnanswered:

  • disableForwardingAndUnanswered = false — если целевая сторона не ответит на входящий вызов, осуществляемый при передаче, применяются параметры переадресации и отсутствия ответа, настроенные для целевой стороны;
  • disableForwardingAndUnanswered = true — если целевая сторона не ответит на входящий вызов, осуществляемый при передаче, попытка передачи вызова прерывается.
// transfer target can be an Azure Communication Services user
const id = { communicationUserId: <ACS_USER_ID> };
// call transfer API
const transfer = callTransferApi.transfer({targetParticipant: id});

Передача на звонок:

  1. существует уже установленный вызов между передающей стороной и передаваемой стороной;
  2. Существует уже подключенный вызов между переносчиком и целевым объектом передачи.
  3. Переадресатор решает передать звонок с получателем передачи вызову с целевым объектом передачи.
  4. передающая сторона вызывает API transfer;
  5. целевая сторона получает входящий вызов, если передаваемая сторона подтверждает запрос на передачу.

Для передачи текущего вызова можно использовать 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> });

transfer API позволяет подписаться на stateChanged. Он также поставляется с передачей state и 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

Получатель может прослушивать transferAccepted событие. Прослушиватель этого события содержит TransferEventArgs объект вызова нового вызова между получателем передачи и целевым объектом передачи.

// Transferee can subscribe to the transferAccepted event
callTransferApi.on('transferAccepted', args => {
    const newTransferCall =  args.targetCall;
});

Средство передачи может подписаться на события для изменения состояния передачи. Если звонок к получателю передачи был успешно подключен к целевому объекту передачи, метод передачи может зависнуть от исходного вызова с получателем передачи.

transfer.on('stateChanged', () => {
   if (transfer.state === 'Transferred') {
       call.hangUp();
   }
});

Передача в голосовую почту:

  1. Существует подключенный вызов между переносчиком и получателем передачи.
  2. Известны идентификатор пользователя Teams целевого участника голосовой почты .
  3. Средство передачи решает передать звонок с получателем передачи в голосовую почту целевого участника с помощью идентификатора пользователя Teams целевого участника.
  4. передающая сторона вызывает API transfer;
  5. Получатель передачи получает запрос на передачу.

Для передачи текущего вызова можно использовать API transfer.

// transfer to the target participant voicemail specified by their Teams User Identifier
const id: MicrosoftTeamsUserIdentifier = { microsoftTeamsUserId: userId}
// call transfer API
const transfer = callTransferApi.transfer({ targetParticipantVoicemail: id });

transfer API позволяет подписаться на stateChanged. Он также поставляется с передачей state и 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

Получатель может прослушивать transferAccepted событие. Прослушиватель этого события содержит TransferEventArgs объект вызова нового вызова между получателем передачи и голосовой почтой целевого участника.

// Transferee can subscribe to the transferAccepted event
callTransferApi.on('transferAccepted', args => {
    const newTransferCall =  args.targetCall;
});

Средство передачи может подписаться на события для изменения состояния передачи. Если звонок к получателю передачи был успешно подключен с голосовой почтой целевого участника, передача может зависнуть от исходного звонка с получателем передачи.

transfer.on('stateChanged', () => {
   if (transfer.state === 'Transferred') {
       call.hangUp();
   }
});

Следующие шаги