В выпуске 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/