shahryarjb

shahryarjb

Hi, I created a subscription with my service worker and pushManager in JavaScript side like this:

var vapidPublicKey = 'MY_PUBLIC_KEY';
var convertedVapidPublicKey = urlBase64ToUint8Array(vapidPublicKey);
return reg.pushManager.subscribe({
  userVisibleOnly: true,
  applicationServerKey: convertedVapidPublicKey,
});

After that, I have something like this in my database:

{
  "endpoint": "https://fcm.googleapis.com/fcm/send/USER_STUFF",
  "keys": {
    "auth": "AUTH_CODE",
    "p256dh": "P256DH_CODE"
  }
}

So I see the Pigeon support FCM, but when I want to send a notification as the document says, what is the TOKEN?

n = Pigeon.FCM.Notification.new({:token, "reg ID"}, %{"body" => "test message"})
YourApp.FCM.push(n)

My goal: I am creating a PWA application and I need to send push notification with service worker. It can be Chrome or Firefox, even in desktop or mobile. The user activates and adds the app to their operating system with a manifest. After that, I should be able to send notifications from the server to the user.

In JavaScript or node server I can send notification with web-push lib, but in elixir I need to send

Thank you in andvance

Showing Posts 1 to 4

shahryarjb

shahryarjb OP

This library works for now. But I could not be able to use pigeon:

body = ~s({"title":"New Post","content":"New Post added!","openUrl":"/help"})
subscription = %{
  keys: %{
    p256dh: "CODE_OF_p256dh", 
    auth: "CODE_OF_auth" 
  }, 
  endpoint: "https://fcm.googleapis.com/fcm/send/FCM_TOKEN"
}

{:ok, response} = WebPushEncryption.send_web_push(body, subscription)

Based on: Web Push Payload Encryption  |  Blog  |  Chrome for Developers

mayel

mayel

@shahryarjb could you share the working code? last time I looked at webpush I couldn’t quite get it working… my attempt is at GitHub - bonfire-networks/bonfire_notify: Web push notifications · GitHub

shahryarjb

shahryarjb OP

Yes, sure.
First of all, I have used GitHub - danhper/elixir-web-push-encryption: Elixir implementation of Web Push Payload encryption. · GitHub.

I have a JavaScript file for service worker, sw.js

self.addEventListener('push', function(event) {
  console.log('Push Notification received', JSON.parse(event.data.text()));

  var data = {title: 'New!', content: 'Something new happened!', openUrl: '/'};

  if (event.data) {
    data = JSON.parse(event.data.text());
  }

  var options = {
    body: data.content,
    icon: '/src/images/icons/app-icon-96x96.png',
    badge: '/src/images/icons/app-icon-96x96.png',
    data: {
      url: data.openUrl
    }
  };

  event.waitUntil(
    self.registration.showNotification(data.title, options)
  );
});

This is a addEventListener with push event and my service worker is registered in my app.js


app.js

if ('serviceWorker' in navigator) {
  navigator.serviceWorker
    .register('/sw.js')
    .then(function () {
      console.log('Service worker registered!');
    })
    .catch(function (err) {
      console.log(err);
    });
}

After that, you need user permission, for example when he/her clicks on a button. Like this:

var enableNotificationsButtons = document.querySelectorAll('.enable-notifications');

if ('Notification' in window && 'serviceWorker' in navigator) {
  for (var i = 0; i < enableNotificationsButtons.length; i++) {
    enableNotificationsButtons[i].style.display = 'inline-block';
    enableNotificationsButtons[i].addEventListener('click', askForNotificationPermission);
  }
}

I got all the buttons with .enable-notifications class CSS and gave them addEventListener with click event.

You can see my app.js here: app.js · GitHub

finally, I use the elixir library:

body = ~s({"title":"New Post","content":"New Post added!","openUrl":"/help"})
subscription = %{
  keys: %{
    p256dh: "CODE_OF_p256dh", 
    auth: "CODE_OF_auth" 
  }, 
  endpoint: "https://fcm.googleapis.com/fcm/send/FCM_TOKEN"
}

{:ok, response} = WebPushEncryption.send_web_push(body, subscription)
mayel

mayel

Thanks, much appreciated! I’ll give it another go :grinning_face:

— All posts loaded —

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
jonnycharles
I’m in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
spammy
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
dli
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app? Looking for hints regarding: Addi...
New
roeland
Kia ora, We have been using elixir-google-api to connect to Google Drive. However, with the updates to Tesla due to CVEs this is now bro...
New
bottlenecked
Hi all, I wanted to ask how the community is dealing with post-release steps. Today we have Ecto migrations, which make sure that the db...
New
rahultumpala
Hello, I have an Elixir backend that implements a custom protocol over TCP. I want to load test the backend and assess the performance o...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge &amp; Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews