Уведомления, SSE, SocketIO и Push API
Сравнение и краткое руководство по взаимодействию сервера с клиентом.
API уведомлений позволяет вам использовать встроенные уведомления вашего клиента, поэтому им не нужно просматривать вашу веб-страницу, чтобы получить уведомление. Это чисто функция пользовательского интерфейса.
События на стороне сервера, веб-сокеты и Push API позволяют серверу отправлять данные клиенту (без необходимости инициировать запрос клиента).
Это краткое руководство покажет базовую настройку и использование этих 4 технологий.
Полнофункциональные примеры можно найти по адресу: https://github.com/efossas/WebServerAlerts-POC. Это проверенный концептуальный проект по изучению плюсов и минусов каждой технологии. В этом руководстве я буду использовать модифицированные версии этого кода для обучения. Не все они работают, если вы просто скопируете и вставите.
Кроме того, все мои примеры будут использовать NodeJS на стороне сервера.
О чем идет речь в этом руководстве
- Уведомление API
- События на стороне сервера
- Веб-сокеты с SocketIO
- Push API
Что вам понадобится для этого руководства
Ничего такого. Браузер, я полагаю, и Docker, если вы хотите развернуть POC в репо, упомянутом выше.
Уведомление API
API уведомлений позволяет использовать собственные уведомления клиента. Это означает, что даже если они не смотрят вашу веб-страницу или даже браузер, если на то пошло, они все равно получат от вас небольшое уведомление.
IE, Mobile Safari и Android не поддерживают его.
На Mac уведомления отображаются в правом верхнем углу. Они могут содержать небольшое изображение и немного текста. Уведомление в POC выглядит так:
Прежде чем вы сможете использовать API уведомлений, вы должны спросить у пользователя разрешение, которое выдаст ему приглашение, которое выглядит следующим образом:
JavaScript для создания уведомлений и запроса доступа выглядит так:
События на стороне сервера (SSE)
События на стороне сервера предназначены для односторонней связи от сервера к клиенту. Их проще всего настроить без библиотеки. Однако, поскольку веб-сокеты являются единственным сервером, совместимым с кроссбраузерностью, и клиентской технологией, SSE используется не так часто.
IE и Edge не поддерживают его.
Настроить SSE на клиенте очень просто. Вы просто делаете запрос на путь к серверу, который запустит SSE и начнет прослушивать сообщения с сервера.
Сервер должен делать несколько вещей для SSE. Самое главное, он не должен закрывать соединение. Вам нужен способ сохранить его в живых. Вы также захотите сохранить объект ответа таким образом, чтобы другие части вашего кода могли находить подключенных клиентов и отправлять им события.
Фактическое событие выглядит довольно просто (похоже на протокол HTTP). Каждая строка начинается с id (просто идентификатора события), data (данные, которые вы хотите отправить) или повтора (если соединение с сервером разорвано, количество миллисекунд, пока клиент пытается повторно подключиться) вместе с некоторыми данными. Новая пустая строка означает конец события.
id: 12345
retry: 3000
data: put some data here
data: and some more data here
Ниже приведен пример того, как может выглядеть функция маршрута ExpressJS для SSE:
Веб-сокеты с SocketIO
Веб-сокеты предназначены для двусторонней связи между серверами и клиентами. Хотя их нелегко настроить без библиотеки, существуют библиотеки, которые делают установку невероятно простой. Кроме того, у большинства этих библиотек есть откат к опросу AJAX, когда веб-сокеты недоступны. Поэтому мы будем использовать SocketIO для настройки веб-сокетов.
Веб-сокеты совместимы со всеми современными браузерами.
Настроить веб-сокеты на клиенте так же просто, как и SSE. Если использовать значения по умолчанию, это еще проще. Помимо подключения и прослушивания событий, сокеты также могут отправлять события на сервер с помощью функции emit ().
SSE был настолько прост, что мы записали фактические байты строки в поток ответа. WS немного сложнее. Фактически, он даже использует свой собственный префикс протокола, ws: // (незашифрованный) и wss: // (зашифрованный ssl). Однако SocketIO абстрагирует все это от нас и даже управляет жизнями наших подключений, поэтому нам не нужно. Таким образом, настроить его на сервере довольно просто. Вот пример:
Push API
Push API позволяет серверам отправлять данные клиентам, даже если у клиента не открыта ваша веб-страница или даже браузер. Следовательно, его необходимо использовать с Service Workers (это скрипты, которые всегда выполняются для вашей веб-страницы, даже когда она закрыта) и API уведомлений. Он также работает только через HTTPS и требует использования ключей VAPID для безопасности. При этом заставить его работать определенно непросто, но поехали ...
IE, Safari и Mobile Safari не поддерживают его.
Вот как должны выглядеть шаги по настройке Push-уведомлений на стороне клиента:
- Зарегистрируйте сервис-воркер (который прослушивает push-уведомления).
- После регистрации сервисного работника проверьте, существует ли уже подписка.
- Если этого не произошло, получите открытый ключ VAPID сервера.
- Получив открытый ключ VAPID, используйте его для создания подписки с помощью pushManager.
- Теперь отправьте информацию о подписке на сервер, чтобы он мог использовать ее для отправки push-уведомлений.
Между прочим, открытый ключ VAPID используется для проверки того, что он получает push-уведомления, на которые он подписан (или, другими словами, push-уведомления могут поступать с любого сервера, имеющего закрытый ключ VAPID).
Вот пример кода на стороне клиента:
А вот как должен выглядеть сервис-воркер:
Вот как должны выглядеть шаги по настройке Push-уведомлений на стороне сервера:
- Создайте публичные и частные ключи VAPID.
- Создайте http-маршрут, по которому клиенты могут получить открытый ключ VAPID.
- Создайте http-маршрут, по которому клиенты могут отправлять информацию о своей подписке.
- Создайте http-маршрут, по которому клиенты могут запросить удаление информации о своей подписке.
- Когда захотите, используйте информацию о подписке для отправки подписчикам push-уведомлений.
Вот пример кода на стороне сервера:
Выполнено!
Итак, есть краткое изложение веб-технологий, позволяющих осуществлять обмен данными между сервером и клиентом. Если у вас нет очень специфического варианта использования, обычно лучше использовать веб-сокеты поверх событий на стороне сервера или Push API.