3
votes

Reconnectez-vous et déconnectez-vous en douceur du canal de discussion

Considérez le scénario suivant ...

  1. Le membre se connecte au canal de discussion
  2. Le membre se déconnecte du canal de discussion
  3. Le même membre tente de se reconnecter au même canal de discussion

Mon problème est le suivant ... Entre les étapes 2 et 3, lorsque le membre tente de se reconnecter au même canal, j'obtiens l'erreur "Le membre existe déjà". Afin de résoudre le problème, j'ai essayé les étapes suivantes:

2.1 Appel channel.leave ()

2.2 channel.leave () retourne avec succès

2.3 Le membre tente de se reconnecter au même canal de discussion

  1. Le membre se connecte avec succès au même canal de discussion

Une fois la reconnexion réussie, lorsque le membre tente d'envoyer un message, il apparaît deux fois. Pas une solution de travail. Au lieu d'utiliser channel.leave (), j'ai également essayé d'utiliser channel.removeMember (identity) à la place. Après s'être reconnecté au même canal, encore une fois, si le membre envoie un message, il apparaît deux fois. Il est temps pour la dernière question, comment un membre pourrait / devrait-il se connecter et se déconnecter gracieusement d'un canal de discussion afin qu'il puisse continuer à avoir une conversation comme si ce membre n'avait jamais quitté le canal?

Merci!

Éditer:

Étape 1

 client.shutdown()            

Étape 2.

    const previousChannel = await channel.leave()    

Étape 3.

   channel.on('messageAdded', (message) => {    
   //When sending a message, this is where I get it duplicated after reconnecting to room
   })
    const previousChannel = await channel.leave()

Étape 4.

   const messages = await channel.getMessages()

   messages.items.forEach((message) => {                                                          
    //Consume unread messages...                                                                       
   })    

   channel.setAllMessagesConsumed() 

Étape 5

   const joinedChannel = await channel.join();

Étape 6. Écoutez les messages ajoutés

   const channel = await client.getChannelByUniqueName(channelName)

Étape 7. En quittant le canal ...

   const client = await Chat.Client.create(token);

Après de nombreux essais et erreurs, je suis enfin arrivé à la conclusion suivante. Afin de "résoudre" le problème, je dois actualiser l'onglet, et pour le recréer, je suis les étapes ci-dessus sans actualiser l'onglet ... Fuite de mémoire?

Firefox 65.0.1

Chrome 72.0.3626.53

MISE À JOUR:

Fixé. À l'étape 7, après avoir quitté la pièce, le client doit être arrêté en douceur ...

  const token = await axios.post('/twilio/chat', 
                { identity: identity , room: channelName }, 
                { headers: header })

Ce n'est pas une solution vraiment conviviale car elle n'est même pas documentée comme une étape requise pour quitter une pièce. La cause la plus probable est en effet une fuite de mémoire quelque part. J'espère que ce bug pourra être corrigé prochainement ...


2 commentaires

C'est intéressant. Pouvez-vous partager le code que vous utilisez plutôt qu'une description? Il serait beaucoup plus facile de déterminer ce qui ne va pas ici et comment mieux l'écrire. Merci!


Hey @philnash, a ajouté le code! J'apprécie vraiment votre aide


3 Réponses :


3
votes

Évangéliste développeur Twilio ici.

Je crois que vos messages en double sont messageAdded fait que vous ne déconnectez pas le gestionnaire messageAdded de l'ancien objet de canal. Lorsque vous quittez le canal, essayez également de supprimer l'écouteur d'événements.

channel.off('messageAdded', this.messageAdded);

En ce qui concerne l'erreur entre le départ et le retour, vous souhaiterez peut-être écouter l'événement de la chaîne memberLeft avant de pouvoir être complètement sûr que le membre est parti. Sinon, gérer l'erreur est un moyen raisonnable de la traiter.


4 commentaires

J'ai le même problème et même après avoir désactivé le message du canal Ajouté, lorsque je rejoins le canal, il a été dupliqué les fois que getChannelByUniqueName est appelé.


Salut @ f158087MuhammadZohaib, je ne suis pas sûr de ce que vous demandez ici. Il vaudrait peut-être mieux que vous posiez une nouvelle question et m'envoyiez un lien vers celle-ci afin que je puisse voir votre question avec plus de contexte et votre propre code.


la fonction off n'est pas définie pour le canal où j'obtiens un channel.off is not a function erreur de channel.off is not a function lorsque j'essaye de détacher l'écouteur d'événements pour l'événement messageAdded . J'utilise la v4.0.0


@Prime Je ne sais pas pourquoi vous ne pas avoir accès à la off méthode sur le channel , sauf dans votre cas , le channel est passé hors de portée d'une certaine manière et vous appeler au off sur undefined . Peut-être pourriez-vous poser une nouvelle question et partager une partie de votre code?



1
votes

Une chaîne privée ne peut pas être vue ou jointe directement. Le passage d'accès à ces canaux se fait uniquement via des invitations REST. Le créateur et les membres administrateurs de la chaîne privée auront accès à une invitation unique qu'ils pourront transmettre pour que les personnes rejoignent leur groupe. Ceux-ci ne sont visibles que pour les participants et réduiront le temps de synchronisation des canaux au démarrage du client.


0 commentaires

0
votes

Si un utilisateur a déjà rejoint le canal et tente de le rejoindre à nouveau, il générera une erreur qui

Le membre existe déjà

Pour éviter cela, j'ai créé le canal côté serveur (et c'est recommandé par twilio lui-même), ajoutez les deux participants à ce canal (toujours côté serveur). Documents de la chaîne ici

chatClient.getSubscribedChannels().then(function(paginator) {
  console.log("Your subscribed channels are ", paginator.items);
  // each item is a channel, on which you can set event Listeners and do other stuff related to the channel
});

identity est l'identifiant unique de votre utilisateur connecté, et invited_identity est l'identifiant unique de l'utilisateur avec lequel vous souhaitez configurer une discussion en tête-à-tête.
La fonction d'ajout de membre était, j'ai utilisé la documentation sur les ressources des membres

chatClient.getChannelBySid(sid_of_channel).then((channel)=>{
  console.log(channel);
  // you can now set event listeners on this channel object directly.
  // no need to call join() on it since, our server side code has already added the members(which means they've joined it)
  //to receive the messages of this channel, set an event listener on the channel
  channel.on('messageAdded', function(message) {
    console.log("Messagge is received", message);
  });
})

Le create_channel_and_add_members renvoyé un canal SID au front-end, que j'ai utilisé pour récupérer le canal lui-même sur le front-end, en utilisant ce code

def add_member(identity, channel_id)
  member = @client.chat.services(ENV["TWILIO_CHAT_SERVICE_SID"])
    .channels(channel_id)
    .members
    .create(identity: identity)
  if member
    true
  else
    false
  end
end

La prochaine fois que vous souhaitez obtenir les chaînes de l'utilisateur. Vous pouvez simplement récupérer les chaînes auxquelles l'utilisateur s'est abonné, c'est-à-dire qu'il a rejoint,

def create_channel_and_add_members(channel_name, identity, invited_identity, channel_type="private")
  channel = @client.chat.services(ENV["TWILIO_CHAT_SERVICE_SID"])
    .channels
    .create(unique_name: channel_name, type: channel_type)
  if channel && add_member(identity, channel.sid) && add_member(invited_identity, channel.sid)
    return channel.sid
  end
end

N'oubliez pas d'inclure le sdk Twilio dans votre projet sur les côtés front-end et back-end. J'espère que cela aidera quelqu'un à l'avenir.


0 commentaires