defmodule Hustle do @moduledoc """ Documentation for `Hustle`. """ alias Hustle.Subscription alias Hustle.Vapid alias Hustle.HackneyClient @doc """ Generates a VAPID public/private key pair. See `Hustle.Vapid` for more information. """ @spec generate_vapid :: {public_key :: binary(), private_key :: binary()} defdelegate generate_vapid, to: Vapid, as: :generate def push(message, subscription, public_key, private_key, _opts \\ []) do {cipher, salt, server_public_key} = Hustle.Encryption.encrypt(message, subscription.p256dh, subscription.auth) jwt = subscription |> Subscription.get_base_url() |> Hustle.Jwt.generate( Base.url_decode64!(public_key, padding: false), Base.url_decode64!(private_key, padding: false) ) headers = headers(jwt, salt, public_key, server_public_key) HackneyClient.request(subscription.url, headers, cipher) end defp headers(jwt, salt, public_key, server_public_key) do [ {"TTL", "0"}, {"Content-Encoding", "aesgcm"}, {"Encryption", "salt=#{Base.url_encode64(salt, padding: false)}"}, {"Authorization", "WebPush " <> jwt}, {"Crypto-Key", "dh=#{Base.url_encode64(server_public_key, padding: false)}; p256ecdsa=#{public_key}"} ] end end