优雅地重新连接和断开 to/from 聊天频道

Reconnect and disconnect gracefully to/from chat channel

考虑以下场景...

  1. 成员连接到聊天频道
  2. 成员与聊天频道断开连接
  3. 同一个成员尝试重新连接到同一个聊天频道

我的问题如下...在第 2 步和第 3 步之间,当成员尝试重新连接到同一频道时,我收到错误 "Member already exists"。为了解决问题,我尝试了以下步骤:

2.1调用channel.leave()

2.2 channel.leave() 成功returns

2.3 成员尝试重新连接到同一个聊天频道

  1. 成员成功连接到同一个聊天频道

重连成功后,会员尝试发送消息时出现两次。不是一个有效的解决方案。除了使用 channel.leave(),还尝试使用 channel.removeMember(identity)。重新连接回同一频道后,如果该成员再次发送消息,它会出现两次。现在是最后一个问题了,could/should 成员如何优雅地连接和断开聊天频道,以便它可以继续进行对话,就像该成员从未离开过频道一样?

谢谢!

编辑:

第 1 步

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

第 2 步。

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

第 3 步。

   const channel = await client.getChannelByUniqueName(channelName)

第 4 步。

   const joinedChannel = await channel.join();

第 5 步

   const messages = await channel.getMessages()

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

   channel.setAllMessagesConsumed() 

第 6 步。收听添加的消息

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

第7步.离开频道时....

    const previousChannel = await channel.leave()    

经过多次尝试和错误,我终于得出以下结论。为了 "fix" 这个问题,我必须刷新选项卡,为了重新创建它,我在不刷新选项卡的情况下按照上述步骤操作...内存泄漏?

火狐 65.0.1

铬 72.0.3626.53

更新:

已修复。第7步,离开房间后,客户端必须正常关机...

 client.shutdown()            

这不是一个真正友好的修复,因为它甚至没有被记录为离开房间的必要步骤。最可能的原因确实是某处内存泄漏。希望这个错误能尽快修复...

此处为 Twilio 开发人员布道师。

我认为您的重复消息是因为您没有断开 messageAdded 处理程序与旧通道对象的连接。当您离开频道时,请尝试同时移除事件侦听器。

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

至于离开和重新加入之间的错误,您可能需要监听频道 memberLeft 事件,然后才能完全确定该成员已经离开。否则,处理错误是合理的处理方式。

无法直接查看或加入私人频道。进入这些频道的通行证只能通过 REST 邀请获得。私人频道的创建者和管理员成员将有权访问一个独特的邀请,他们可以传递邀请,让人们加入他们的群组。这些仅对参与者可见,并且会减少客户端启动时的通道同步时间。

如果一个用户已经加入频道并试图再次加入,它会抛出一个错误

Member already exists

为了避免这种情况,我所做的是在我的服务器端创建频道(这是 twilio 本身推荐的),将两个参与者都添加到该频道(仍在服务器端)。频道 docs here

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

其中 identity 是您登录用户的唯一标识符,invited_identity 是您要与之建立一对一聊天的用户的唯一标识符。
添加成员函数是,我使用了 member resource docs

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

create_channel_and_add_members 向前端返回了一个频道 SID ,我用它在前端获取频道本身,使用这段代码

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);
  });
})

下次要获取用户的频道。您可以只获取用户已订阅的频道,即已加入,

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
});

不要忘记在前端和后端的项目中包含 Twilio sdk。 我希望这对以后的人有所帮助。