Статьи

Начало работы с Pusher: использование каналов присутствия

В этой серии мы узнали о каналах от Pusher , платформы, которая позволяет вам предоставлять своим пользователям бесперебойную работу в режиме реального времени, которую они хотят.

Каналы присутствия основаны на безопасности, обеспечиваемой частными каналами, но они дают преимущество в знании того, какие пользователи подписаны и подключены к этому каналу. Самое приятное то, насколько легко внедрить и использовать каналы присутствия, и еще проще, если вы уже настроили свое приложение для использования частных каналов. В этом посте вы узнаете, как использовать каналы присутствия.

Наше приложение для чата в настоящее время использует частный канал для мгновенного обмена данными между клиентом и сервером. Поэтому настройка нашего приложения на использование канала присутствия будет чрезвычайно простой. Начнем с серверного приложения.

Чтобы использовать частный канал, мы настроили конечную точку, чтобы обеспечить аутентификацию пользователя в нашем приложении. Эта конечная точка выполняет метод authorizeUser() ChannelsController и вызывает метод socket_auth() библиотеки Pusher для проверки подлинности пользователя. Чтобы использовать канал присутствия, нам нужно изменить authorizeUser() для вызова методаsence_auth presence_auth() библиотеки Pusher, например:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
public function authorizeUser(Request $request) {
    if (!Auth::check()) {
        return new Response(‘Forbidden’, 403);
    }
 
    $presenceData = [‘name’ => Auth::user()->name];
 
    echo $this->pusher->presence_auth(
        $request->input(‘channel_name’),
        $request->input(‘socket_id’),
        Auth::user()->id,
        $presenceData
    );
}

Но изменение имени метода — это только первая модификация; мы также должны предоставитьsence_auth presence_auth() уникальный идентификатор пользователя и любую дополнительную информацию о пользователе, которую мы хотим предоставить. Приведенный выше код сохраняет эти дополнительные пользовательские данные в переменной $presenceData senceData и передает их в качестве последнего аргументаsence_auth presence_auth() .

Кроме того, мы должны изменить метод sendMessage() . Первое изменение — название канала. Как и со всеми другими нашими именами, мы должны добавить префикс имени канала, чтобы обозначить тип канала, который мы хотим использовать: presence- в данном случае, как показано в следующем коде.

1
$this->pusher->trigger(‘presence-chat’, ‘send-message’, $data);

Мы также можем изменить данные, которые мы отправляем вместе с событием — вместо указания имени пользователя, инициировавшего событие, мы можем включить идентификатор пользователя.

1
$data[‘user’] = Auth::user()->id;

Поскольку мы будем использовать канал присутствия, мы можем искать имена пользователей на клиенте, и это небольшое изменение уменьшит размер данных, передаваемых по сети.

Канальный объект клиента содержит все, что нам нужно для работы с подписанным каналом, и запрос пользовательских данных не является исключением. У нашего объекта channel есть свойство, называемое members которое мы можем использовать для получения информации о конкретном пользователе. Мы будем использовать этот объект в обработчике события send-message , например так:

1
2
3
4
5
6
7
this.channel.bind(‘send-message’, (data) => {
    let user = this.channel.members.get(data.user);
    this.messages.push({
        message: data.message,
        user: user.info.name
    });
});

Здесь мы вызываем this.channels.members.get() и передаем идентификатор пользователя (помните, что наше серверное приложение теперь предоставляет идентификатор вместо имени). Этот метод возвращает объект с info свойством, и этот info объект содержит всю дополнительную информацию, которую мы предоставили в переменной $presenceData senceData в методе authorizeUser() на сервере. Таким образом, в приведенном выше коде мы получаем имя пользователя с помощью user.info.name .

Мы также можем изменить метод trigger() включив в него информацию о пользователе, который инициировал событие тревоги клиента. Чтобы получить данные об участнике, вошедшем в систему в данный момент, вы используете свойство me , как показано в следующем коде:

1
2
3
4
5
6
7
trigger(eventName, message) {
     
    this.channel.trigger(eventName, {
        message,
        user: this.channel.members.me
    });
}

В этом коде мы добавляем свойство user к полезной нагрузке события и устанавливаем его для объекта пользователя вошедшего в систему пользователя. Это означает, что мы можем изменить обработчик события client-send-alarm чтобы включить имя пользователя в сообщение о тревоге, например так:

1
2
3
this.channel.bind(‘client-send-alarm’, (data) =>
    alert(`${data.user.info.name}: ${data.message}`)
);

Здесь мы используем data.user.info.name для доступа к имени пользователя, чтобы мы могли видеть, какой пользователь отправил сигнал тревоги, как показано здесь:

экран, показывающий, какой пользователь отправил сигнал тревоги

Использование каналов присутствия не только обеспечивает вашему приложению повышенную безопасность анонимного канала, но также дает вам возможность запрашивать пользовательские данные для пользователей, которые подписываются на канал. С каналами от Pusher невероятно легко добавить безопасное общение в режиме реального времени и многофункциональность в ваши приложения.