В выпуске Twilio Conversations SDK 2.0 появился новый способ создания клиента и настройки обработчиков событий. Как указано в документации и в отличие от предыдущих версий, когда клиент создается, чтобы гарантировать, что он был правильно инициализирован, мы должны дождаться срабатывания события stateChanged и проверить переданное state, чтобы убедиться, что инициализация была завершена:
import { Client } from '@twilio/conversations';
const client = new Client(token);
// Before you use the client, subscribe to the `'stateChanged'` event and wait
// for the `'initialized'` state to be reported.
client.on('stateChanged', (state) => {
if (state === 'initialized') {
// Use the client
}
}
Что, если у нас есть моментально ненадежное соединение? Просто изменив качество сети на вкладке сети Chrome на Медленно, клиент Twilio отказался инициализироваться, и все.
Чтобы сделать процесс немного более устойчивым, я написал функцию, которая оборачивает событие инициализации внутри обещания, которое разрешается, когда клиент успешно инициализирован, и пытается воссоздать клиента, используя обещание экспоненциальной отсрочки в противном случае.
//wait is a helper function that will wait a given number of seconds.
const wait = (ms) => new Promise((res) => setTimeout(res, ms));
const createTwilioClientWithRetries = (token, depth = 0) => {
return new Promise((resolve, reject) => {
//Create a new Twilio Client for the token.
const twilioClient = new Client(token);
twilioClient.on('stateChanged', async (state) => {
try {
if (state === 'initialized') {
resolve(twilioClient);
}
if (state === 'failed') {
if (depth > 5) {
throw new Error("Too many retries");
}
else {
dispatch(setError({
type: TWILIO_TOKEN_FAILURE,
message: "Twilio Token Error"
}));
await wait(2 ** depth * 10);
return await createTwilioClientWithRetries(token, depth + 1);
}
}
} catch (err) {
reject("Too many retries");
}
});
});
}
Первоначально я пытался закрыть клиент с помощью await twilioClient.shutdown() перед вызовом следующей итерации, но по какой-то причине это не позволило мне впоследствии создать какие-либо дополнительные экземпляры клиента.
Веселиться!
Постоянная ссылка: https://www.estebansastre.com/create-twilio-client-join-conversation/