webman/push

webman/push — это бесплатный серверный плагин для отправки уведомлений, клиентская часть основана на модели подписки и совместима с pusher. Имеет множество клиентских библиотек, таких как JS, Android (java), IOS (swift), IOS (Obj-C), uniapp, .NET, Unity, Flutter, AngularJS и др. Серверный SDK для отправки уведомлений поддерживает PHP, Node, Ruby, Asp, Java, Python, Go, Swift и другие. Клиенты имеют встроенные функции heartbeat и автоматического восстановления соединения, что делает их простыми и стабильными в использовании. Подходит для сценариев мгновенной передачи сообщений, чата и многих других.

Плагин включает в себя веб-клиент push.js и клиент для uniapp uniapp-push.js. Другие клиентские библиотеки можно скачать по адресу https://pusher.com/docs/channels/channels_libraries/libraries/.

Установка

composer require webman/push

Клиент (javascript)

Подключение javascript клиента

<script src="/plugin/webman/push/push.js"> </script>

Использование клиента (публичный канал)

// Установить соединение
var connection = new Push({
    url: 'ws://127.0.0.1:3131', // адрес websocket
    app_key: '<app_key, получить в config/plugin/webman/push/app.php>',
    auth: '/plugin/webman/push/auth' // авторизация подписки (только для частных каналов)
});
// Предположим, что uid пользователя 1
var uid = 1;
// Браузер слушает сообщения канала user-1, то есть сообщения пользователя с uid 1
var user_channel = connection.subscribe('user-' + uid);

// Когда в канале user-1 есть событие message
user_channel.on('message', function(data) {
    // data содержит текст сообщения
    console.log(data);
});
// Когда в канале user-1 есть событие friendApply
user_channel.on('friendApply', function (data) {
    // data содержит информацию о заявке в друзья
    console.log(data);
});

// Предположим, что id группы 2
var group_id = 2;
// Браузер слушает сообщения канала group-2, то есть слушает сообщения группы 2
var group_channel = connection.subscribe('group-' + group_id);
// Когда в группе 2 есть событие message
group_channel.on('message', function(data) {
    // data содержит текст сообщения
    console.log(data);
});

Совет
В приведенном выше примере метод subscribe реализует подписку на канал, message и friendApply — это события на канале. Каналы и события могут иметь любые названия, нет необходимости настраивать их заранее на сервере.

Серверная отправка уведомлений (PHP)

use Webman\Push\Api;
$api = new Api(
    // В webman можно использовать config для получения настроек, в не-webman окружении необходимо вручную указать соответствующие настройки
    'http://127.0.0.1:3232',
    config('plugin.webman.push.app.app_key'),
    config('plugin.webman.push.app.app_secret')
);
// Отправить сообщение события message всем клиентам, подписанным на user-1
$api->trigger('user-1', 'message', [
    'from_uid' => 2,
    'content'  => 'Привет, это текст сообщения'
]);

Частные каналы

В приведенном выше примере любой пользователь может подписаться на информацию через Push.js, что небезопасно, если информация является конфиденциальной.

webman/push поддерживает подписку на частные каналы, которые начинаются с private-. Например

var connection = new Push({
    url: 'ws://127.0.0.1:3131', // адрес websocket
    app_key: '<app_key>',
    auth: '/plugin/webman/push/auth' // авторизация подписки (только для частных каналов)
});

// Предположим, что uid пользователя 1
var uid = 1;
// Браузер слушает сообщения на частном канале private-user-1
var user_channel = connection.subscribe('private-user-' + uid);

Когда клиент подписывается на частный канал (каналл, начинающийся с private-), браузер отправляет ajax-запрос для авторизации (адрес ajax указывается в параметре auth при создании нового Push). Разработчики могут здесь проверить, имеет ли текущий пользователь право слушать этот канал. Это гарантирует безопасность подписки.

Для информации о авторизации смотрите код в config/plugin/webman/push/route.php.

Клиентская отправка уведомлений

В приведенных примерах клиент подписывается на определенный канал, а сервер вызывает API для отправки уведомлений. webman/push также поддерживает прямую отправку сообщений клиентами.

Внимание
Клиентская отправка сообщений поддерживается только для частных каналов (каналы, начинающиеся с private-), и клиенты могут инициировать события, начинающиеся с client-.

Пример отправки события клиентом

var user_channel = connection.subscribe('private-user-1');
user_channel.on('client-message', function (data) {
    // 
});
user_channel.trigger('client-message', {form_uid:2, content:"привет"});

Внимание
В приведенном выше коде отправляются данные события client-message всем клиентам, подписанным на private-user-1, за исключением текущего клиента (отправляющего сообщения).

Webhooks

Webhook используется для получения некоторых событий канала.

На данный момент есть 2 основных события:

    1. channel_added
      Событие, которое срабатывает, когда какой-либо канал переходит от отсутствия онлайн-клиентов к наличию онлайн-клиентов, то есть событие «онлайн».
    1. channel_removed
      Событие, которое срабатывает, когда все клиенты канала выходят, то есть событие «офлайн».

Совет
Эти события очень полезны для поддержания статуса онлайн пользователя.

Внимание
Адрес webhook настраивается в config/plugin/webman/push/app.php.
Код для обработки событий webhook можно посмотреть в логике config/plugin/webman/push/route.php.
Обновление страницы, которое временно выводит пользователя из сети, не должно считаться оффлайном, webman/push будет делать задержанные проверки, поэтому события «онлайн» / «офлайн» будут иметь задержку от 1 до 3 секунд.

wss прокси (SSL)

При использовании https невозможно установить ws-соединение, необходимо использовать wss-соединение. В таком случае можно использовать прокси nginx для wss, конфигурация будет выглядеть примерно так:

server {
    # .... здесь опущены другие настройки ...

    location /app/<app_key>
    {
        proxy_pass http://127.0.0.1:3131;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Внимание '<app_key>' в конфигурации берется из config/plugin/webman/push/app.php.

После перезапуска nginx можно подключиться к серверу следующим образом

var connection = new Push({
    url: 'wss://example.com',
    app_key: '<app_key, получить в config/plugin/webman/push/app.php>',
    auth: '/plugin/webman/push/auth' // авторизация подписки (только для частных каналов)
});

Внимание

  1. Адрес запроса должен начинаться с wss
  2. Не указывайте порт
  3. Необходимо использовать домен, соответствующий SSL-сертификату для подключения.

Инструкция по использованию push-vue.js

  1. Скопируйте файл push-vue.js в директорию проекта, например: src/utils/push-vue.js

  2. Импортируйте в vue-странице



## Другие клиентские адреса
`webman/push` совместим с pusher, другие языковые клиентские библиотеки (Java, Swift, .NET, Objective-C, Unity, Flutter, Android, IOS, AngularJS и т.д.) доступны для загрузки по адресу:
https://pusher.com/docs/channels/channels_libraries/libraries/