Web Push Elixir

Simple web push library for Elixir

<img src="https://github.com/midarrlabs/web-push-elixir/actions/workflows/test.yml/badge.svg" alt="Test Status"> <img src="https://codecov.io/gh/midarrlabs/web-push-elixir/branch/main/graph/badge.svg?token=8PJVJG09RK&style=flat-square" alt="Code Coverage"> <img alt="Hex Version" src="https://img.shields.io/hexpm/v/web_push_elixir.svg"> <img alt="Hex Docs" src="http://img.shields.io/badge/api-docs-blue.svg?style=flat">

Prerequisities

Installation

  1. Add web_push_elixir to your list of dependencies in mix.exs:
def deps do
  [
    {:web_push_elixir, "~> 0.5.0"}
  ]
end
  1. Run mix command to generate your Vapid public and private keys:
mix generate.vapid.keys
  1. Set config for your generated keys:
config :web_push_elixir,
  vapid_public_key: "someVapidPublicKey",
  vapid_private_key: "someVapidPrivateKey",
  vapid_subject: "mailto:admin@email.com"

Usage

WebPushElixir provides a simple send_notification/2 that takes 2 arguments:

subscription = &#39;{"endpoint":"https://some-push-service","keys":{"p256dh":"BNcRdreALRFXTkOOUHK1EtK2wtaz5Ry4YfYCA_0QTpQtUbVlUls0VJXg7A8u-Ts1XbjhazAkj7I99e8QcYP7DkM=","auth":"tBHItJI5svbpez7KI4CCXg=="}}&#39;
message = "Some message"

WebPushElixir.send_notification(subscription, message)

For more information on how to subscribe a client, permission UX and more - take a look at https://web.dev/notifications/

Error Handling

WebPushElixir returns error types to help you handle failures:

case WebPushElixir.send_notification(subscription, message) do
  {:ok, _response} ->
    # Notification sent successfully
    :ok
  
  {:error, :expired} ->
    # Subscription expired or not found (HTTP 404 / 410)
    Repo.delete(subscription)
  
  {:error, {:http_error, status, body}} ->
    # Handle specific HTTP errors from the push service
    Logger.error("Push notification failed: HTTP #{status} - #{body}")
end

Common Web Push HTTP Status Codes

Run tests

mix test

License

Web Push Elixir is open-sourced software licensed under the MIT license.

Credits

Heavily inspired by elixir-web-push-encryption