0

I am using the Twilio conversations JS SDK, and I need to refresh my connection token if it is expired or invalid. The issue is that, if I call the updateToken() function when the connection state change to "denied", I get the following error:

Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'updateToken')

I am using it like this:

let conversationsClient = new Twilio.Conversations.Client('SOME_EXPIRED_OR_INVALID_TOKEN')
conversationsClient.on("connectionStateChanged", (state) => {
  switch (state) {
    case "denied":
      conversationsClient.updateToken(getConversationsToken());
      break
  }
});

For some reason my conversationsClient object is undefined when it enters the denied state.

According the SDK documentation (https://media.twiliocdn.com/sdk/js/conversations/releases/2.0.0/docs/modules.html#ConnectionState), I can update the token when the state is changed to denied.

Cesar
  • 707
  • 3
  • 13

1 Answers1

0

My guess here is that your getConversationsToken function is asynchronous as it presumably makes a request to your server. But you are passing the result of the function, not the result of the asynchronous action.

I assume that getConversationsToken returns a promise, so you might be able to fix this by updating the token in the then callback:

let conversationsClient = new Twilio.Conversations.Client('SOME_EXPIRED_OR_INVALID_TOKEN')
conversationsClient.on("connectionStateChanged", (state) => {
  switch (state) {
    case "denied":
      getConversationsToken().then(token => {
        conversationsClient.updateToken(token);
      }).catch(error => console.error(error));
      break
  }
});

Or, you could use async/await like this:

let conversationsClient = new Twilio.Conversations.Client('SOME_EXPIRED_OR_INVALID_TOKEN')
conversationsClient.on("connectionStateChanged", async (state) => {
  switch (state) {
    case "denied":
      conversationsClient.updateToken(await getConversationsToken());
      break
  }
});
philnash
  • 70,667
  • 10
  • 60
  • 88
  • Yes, I simplified it to better expose the problem, but I can replace the `getConversationsToken` function with a string and I have the same problem. The problem is that `conversationsClient` is a null object when I call `updateToken`. If I do `toString(conversationsClient)` it returns `[object Undefined]` – Cesar May 30 '22 at 15:36
  • Your simplification may have been too much, as it introduced bugs and possibly obscures what else you are doing. Is there anywhere else in your application that `conversationsClient` is set? Or is it somehow going out of scope? It definitely exists as an object since you are able to listen to events on it. Can you perhaps expand your code to show what's really going on? – philnash May 30 '22 at 23:19