WebPushEncryption
Elixir implementation of Web Push Payload encryption.
Installation
- Add
web_push_encryption
to your list of dependencies inmix.exs
.
def deps do
[{:web_push_encryption, "~> 0.1.0"}]
end
- Ensure
web_push_encryption
is started before your application:
def application do
[applications: [:web_push_encryption]]
end
Usage
WebPushEncryption
has two public API:
WebPushEncryption.encrypt/3
: Takes a body, a subscription, and an optional padding and returns a map containingciphertext
,server_public_key
andsalt
.WebPushEncryption.send_web_push/3
: Takes a body, a subcription, and a GCM secret key and sends a push notification with the given payload.
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>