microsoft / microsoft/BotFramework-DirectLineJS

Connection status Online when Websockets connection failing

Ouverte
#432 0 commentaires 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
TypeScript
Étoiles
199
Forks
133
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

We are using this library in our React app and I encounter this weird behaviour.

The problem

When disabled Websockets connection in Chrome browser using these steps:

  1. Open Chrome and install this extension
  2. Restart Chrome
  3. Go to the Extensions
  4. Click uBlock Origin, the dashboard window or popup should be viewed
  5. From the dashboard, click on Settings (cogs icon, see image above)
  6. In the settings go to My filters tab
  7. Add ||*^$websocket to 1st line of the filter editor and hit Apply changes

I can see that it successfully blocks the wss connections as I can see failed requests in my network tab. The problem is that the connection status will eventually set to ConnectionStatus.Online. I would expect that it will be ConnectionStatus.FailedToConnect as the Websockets request are failing. We need this so we can react with our UI to this scenario and also to log this to our internal logging systems. I cannot see how to do it without proper connection status information, though.

Our setup

In the React code we are just initializing my DirectLine instance in effect hook:

  useEffect(() => {
    if (directLineTokenData) {
      const body = {
        token: directLineTokenData.token || '',
        conversationId: conversationId || '',
        ...COMMON_BOT_PROPERTIES,
      };
      setDirectLine(new DirectLine(body));
    }
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [directLineTokenData]);

and in another we subscribe to the activity$ and connectionStatus$ observables:

 useEffect(() => {
    // eslint-disable-next-line no-console
    console.log('Starting subscription to all activities');
    const subscribtion = directLine?.activity$.subscribe(activity =>
      // eslint-disable-next-line no-console
      console.log('Received activity:', activity),
    );
    // eslint-disable-next-line no-console
    const connectionStatusSubscription = directLine?.connectionStatus$.subscribe(
      status => {
        switch (status) {
          case ConnectionStatus.Uninitialized:
            // eslint-disable-next-line no-console
            console.log('STATUS: uninitialized');
            break;
          case ConnectionStatus.Connecting:
            // eslint-disable-next-line no-console
            console.log('STATUS: connecting...');
            break;
          case ConnectionStatus.Online:
            // eslint-disable-next-line no-console
            console.log('STATUS: online');
            break;
          case ConnectionStatus.ExpiredToken:
            // eslint-disable-next-line no-console
            console.log('STATUS: expired token');
            break;
          case ConnectionStatus.FailedToConnect:
            // eslint-disable-next-line no-console
            console.log('STATUS: failed to connect');
            break;
          case ConnectionStatus.Ended:
            // eslint-disable-next-line no-console
            console.log('STATUS: ended');
            break;
          default:
            // eslint-disable-next-line no-console
            console.log('STATUS: unknown status', status);
        }
      },
      error => {
        // eslint-disable-next-line no-console
        console.error('Error subscribing to connection status', error);
      },
    );
    return () => {
      console.log('Stopping subscription to all activities');

      subscribtion?.unsubscribe();
      connectionStatusSubscription?.unsubscribe();
    };
  }, [directLine]);
Observing the problem

Console logs from our React app:

Image

From the logs we can see that there is eventually a ConnectionStatus.Online connection status change, even though failing Websockets requests. What's interesting that it sets connection status to ConnectionStatus.FailedToConnect one time (before it is set to ConnectionStatus.Online)

Any help is appreciated 🙏

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Reproduisez le problème dans la configuration React en bloquant les requêtes WebSocket avec le filtre documenté de uBlock Origin, puis observez connectionStatus$ de DirectLine avec activity$. Commencez par retracer le cycle de vie du constructeur de DirectLine et de connectionStatus$ ; le travail est terminé lorsqu’une connexion wss qui échoue de manière persistante signale ConnectionStatus.FailedToConnect au lieu de finir par devenir Online.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
react, typescript
Domaine
api, networking
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
À clarifier
Accessibilité débutants
30/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.