WebPushEncryption

Elixir implementation of Web Push Payload encryption.

Installation

  1. Add web_push_encryption to your list of dependencies in mix.exs.
  def deps do
    [{:web_push_encryption, "~> 0.1.0"}]
  end
  1. Ensure web_push_encryption is started before your application:
  def application do
    [applications: [:web_push_encryption]]
  end

Usage

WebPushEncryption has two public API:

body = ~s({"hello": "elixir"})
subscription = %{keys: %{p256dh: "P256DH", auth: "AUTH" }, endpoint: "ENDPOINT"}
gcm_api_key = "API_KEY"

# encrypt the body
encrypted_body = WebPushEncryption.encrypt(body, subscription)
# or just send the push
{:ok, response} = WebPushEncryption.send_web_push(body, subscription, gcm_api_key)

See the docs for more info.

Client Sample

Here is the strict minimum client code to try it, you will need Chrome >= 50. It should also work for Firefox >= 44 but I did not try it yet.

  • main.js
navigator.serviceWorker
  .register('sw.js').then(function(reg) {
    reg.pushManager.subscribe({
      userVisibleOnly: true
    }).then(function(sub) {
      console.log('subscription:', JSON.stringify(sub));
    }).catch(e => console.log(e));
  }).catch(function(error) {
    console.log('error: ', error);
  });
  • sw.js
self.addEventListener('push', function(event) {
  if (event.data) {
    console.log(event.data.json());
  }
});
  • manifest.json
{
    "short_name": "Push Sample",
    "name": "Push sample",
    "start_url": "index.html",
    "gcm_sender_id": "GCM_SENDER_ID"
}
  • index.html
<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8"/>
        <title>Document</title>
        <link rel="manifest" href="/manifest.json">
        <script src="main.js"></script>
    </head>
    <body>
    </body>
</html>