优雅地重新连接和断开 to/from 聊天频道
Reconnect and disconnect gracefully to/from chat channel
考虑以下场景...
- 成员连接到聊天频道
- 成员与聊天频道断开连接
- 同一个成员尝试重新连接到同一个聊天频道
我的问题如下...在第 2 步和第 3 步之间,当成员尝试重新连接到同一频道时,我收到错误 "Member already exists"。为了解决问题,我尝试了以下步骤:
2.1调用channel.leave()
2.2 channel.leave() 成功returns
2.3 成员尝试重新连接到同一个聊天频道
- 成员成功连接到同一个聊天频道
重连成功后,会员尝试发送消息时出现两次。不是一个有效的解决方案。除了使用 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。
我希望这对以后的人有所帮助。
考虑以下场景...
- 成员连接到聊天频道
- 成员与聊天频道断开连接
- 同一个成员尝试重新连接到同一个聊天频道
我的问题如下...在第 2 步和第 3 步之间,当成员尝试重新连接到同一频道时,我收到错误 "Member already exists"。为了解决问题,我尝试了以下步骤:
2.1调用channel.leave()
2.2 channel.leave() 成功returns
2.3 成员尝试重新连接到同一个聊天频道
- 成员成功连接到同一个聊天频道
重连成功后,会员尝试发送消息时出现两次。不是一个有效的解决方案。除了使用 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。 我希望这对以后的人有所帮助。