joraeuw
Hello everyone,
I have been working with Elixir for the past 3+ years and I think its about time I give something back to the community. I have been looking for a library that allows me to easily send push notifications to PWA, by abstracting myself from the RFC’s involved and the encryption logic but I didn’t find anything suitable so I decided to build one myself.
ExNudge is a pure elixir library that send push notifications to web clients (I use it for a PWA) using the protocol described under RFC 8291 and RFC 8292 (VAPID). I plan on expanding it a bit with for example retry system on failed requests and FCM/APNS specific implementation, but that all depends on wether or not its being useful to someone ![]()
Feel free to ask for features, fork and create a PR or an issue and tell me what you think, I would love to get some feedback both on the ease of use and code quality!
Thank you for your time :))
Trending in Announcing
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #ai
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixirconf-us
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #security
- #performance










First Post!- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
olivermt
Cool that you implemented for PWA!
Have you considered PR’ing that side to Pigeon — Pigeon v2.0.1 which is fully featured for the app native side of things?
Most Liked
joraeuw
Yeah sure! I will create a Phoenix example very soon. Perhaps by the end of tomorrow. The tokens come from PushManager. I will add a better explanation and a code example to clarify further.
christhekeele
Yup! In compiled BEAM files, including both Erlang and Elixir, module names are just atoms, and both can cross-call each other. Elixir’s namespaced
Module.Names are just fancy wrappers around compile-time verified andalias-friendly atoms.Elixir, designed after Erlang, has the luxury of making calling Erlang module cross-calls as elegant as
:module_name.function(). To do something similar from Erlang you have to deal with the more ungainly'Elixir.Module.Name':function()syntax. This is why Elixir libraries “supporting” Erlang better will often simplydefmodule Module.Nameand then implement adefmodule :module_namethatdefdelegatesto Elixir functions, to make it nicer to call from Erlang asmodule_name:function().I also think “Erlangifying” an Elixir library involves making it support rebar3 in practice, but I have no experience on this front.
tangui
Yeah, the JOSE library that you use does exactly that, you can take a look at the code. It’s way easier to use Erlang from Elixir, than the opposite. If you write the core in Erlang, you have the guarantee that someone somewhere in a basement some time in the future will be grateful
Other remarks:
HTTPoisonupon the user. An alternative is to useTeslaand let the user choose its favorite HTTP library (example). Another option is to write a behaviour for HTTP requesting and let the user implement its own (and / or provide with a default implementation securely using for instancehttpc). I’d normalize the success response as well, now it’s{:ok, %HTTPoison{}}but what if you change the library in the future? Does the response actually contains something useful?@moduledoc falseto prevent having them in the docExNudge.send_notifications/3ExNudge.generate_vapid_keys/0is used at config time. Maybe a Mix task would be more useful? I think other Web Push libraries do that{:error, Exception.t()}form: exception are better documented (example), can have a default error message, additional information and in case you don’t know what to do with them you can just throw (raise) them awayCheers!
Last Post!
joraeuw
I just uploaded the example. Feel free to check it out. Just make sure to change the dependency if you’re going to extract only the example from {:ex_nudge, path: “…”} to {:ex_nudge, “~> 1.0”} .
Tell me if you run into some issues. For some reason the notification did not work on chrome on my machine (MacBook) perhaps it was a permission thing.
Thank you for your patience