为用户触发的推送客户端事件

pusher client events triggering for user

我目前正在开发一个实时应用程序,它允许用户将其他人添加到 "team",我想通知用户他们已被实时添加。但是我终生都不知道如何实现它,我认为最让我困惑的是文档,

The user must be subscribed to the channel that the event is being triggered on

这怎么可能?当然是因为我正在尝试实时将一些人添加到一个组中,而该组是一个独特的频道,他们不能让我也订阅它吗?

这是我的尝试,以及对过程的解释。

1) 用户登录应用程序并订阅了他们唯一的频道 "presence-user_{id}" 其中 id 是数据库中的用户 ID。

2) 其他地方的用户想要将用户添加到他们的组中,select 该用户运行以下代码,

App['presence-' + 'user_' + newUser.get('id')] = App.pusher.subscribe('presence-user_' + newUser.get('id'));
                            App['presence-' + 'user_' + newUser.get('id')].trigger('client-user-added', { project : self.model.get('id') });

newUser 是一个 backbone 模型,详细说明了 selected 用户的用户详细信息。我想在这里做的是订阅正在尝试将某个用户加入该用户频道的组的用户。

这应该会触发此方法侦听器,

App['presence-' + 'user_' + App.Session.get('user_id')].bind('client-user-added', this.RT_addProject, this);

这又会在添加的客户端应用程序上触发以下方法,

RT_addProject: function(data) {
    console.log(data);
},

然而事实并非如此。触发客户端事件的正确方法是什么?

TLDR;我想在使用推送器将用户添加到组时实时通知用户。

presence channels 的要点是:

  1. presence 频道名称应该在您希望加入群组的用户 之间共享 - 订阅频道的行为会将他们添加到频道。
  2. 频道上的每个 用户都需要一个您通过服务器 (可能是用户会话 ID)通过 auth callback 提供的唯一 ID。这可以在频道中唯一地标识他们。
  3. 如果身份验证成功,他们将被订阅。订阅后,客户端通过 pusher:subscription_succeeded 事件获得频道上现有用户的初始列表。
  4. 频道的现有订阅者会通过 pusher:member_added 事件通知新用户存在
  5. 当用户离线(关闭浏览器、在页面之间导航或通过代码取消订阅)时,频道上的所有其他用户都会通过 pusher:member_removed 事件通知用户已离开频道。

例如。在客户端:

var pusher = new Pusher(APP_KEY);
var chatChannel = pusher.subscribe('presence-chat');

chatChannel.bind('pusher:subscription_succeeded', function(members) {
  members.each(memberAdded);
});
chatChannel.bind('pusher:member_added', memberAdded);
chatChannel.bind('pusher:member_removed', memberRemoved);

function memberAdded(member) {
  // add to UI etc.
}

function memberRemoved(member) {
  // remove from UI etc.
}

订阅行为会导致 Pusher JS 库向服务器端点发送 auth POST request

服务器伪代码:

var channelName = authRequest.postParam['channel-name'];
var socketId =  authRequest.postParam['socket-id'];

var pusher = new Pusher(YOUR_CREDENTIALS);

if( currentSessionUserAllowedToSubscribeToChannel(channelName)  ) {
  var uniqueUserId = getCurrentSessionUserUniqueId();
  var customUserInfo = getCustomUserInfo();
  var authSignature = pusher.presence_auth(channelName,
                                      uniqueUserId,
                                      customUserInfo);

  send200AuthJSONToClient(authSignature);
}
else {
  send401ToClient();
}

What is the correct method of triggering client events?

客户端事件只能在订阅成功后在私有或存在频道上触发:

var pusher = new Pusher(APP_KEY);
var chatChannel = pusher.subscribe('presence-chat');

chatChannel.bind('pusher:subscription_succeeded', function() {
  var wasTriggered = pusher.trigger('client-event', {some: 'data'});
  console.log(wasTriggered);
});

TLDR; I want notify a user in realtime when they are added to a group using pusher.

如果用户 A 希望用户 B 加入 channelX,那么您需要向用户 B 发送有关 channelX 存在的信号,以便他们可以订阅。

userB 只能在他们订阅的频道上接收事件。因此,userA 需要以某种方式在 userB 知道的频道上发送事件。一个常见的解决方案是为每个用户设置一个频道,例如userA-notifications 并且用户 A 需要通过服务器 在该频道 上触发一个事件。最终,您需要一个权限来阻止不需要的事件被触发。

此答案与上述过程相关: