UNPKG

push-notification-service

Version:

Push notification package for web applications using service worker

2 lines (1 loc) 2.97 kB
import s from"web-push";class i{constructor(s){this.serverUrl=s.serverUrl,this.publicVapidKey=s.publicVapidKey,this.swPath=s.swPath||"/sw.js",this.userId=s.userId}urlBase64ToUint8Array(s){const i=(s+"=".repeat((4-s.length%4)%4)).replace(/-/g,"+").replace(/_/g,"/"),t=window.atob(i),e=new Uint8Array(t.length);for(let s=0;s<t.length;++s)e[s]=t.charCodeAt(s);return e}async initialize(){"serviceWorker"in navigator&&"PushManager"in window||console.log("Push notifications are not supported");"granted"!==await Notification.requestPermission()&&console.log("Notification permission not granted");try{if(!this.publicVapidKey){const s=await fetch(`${this.serverUrl}/vapid-public-key`),i=await s.json();this.publicVapidKey=i.publicKey}const s=await navigator.serviceWorker.register(this.swPath);await navigator.serviceWorker.ready;let i=await s.pushManager.getSubscription();if(!i){const t=this.urlBase64ToUint8Array(this.publicVapidKey);i=await s.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:t})}return await this.saveSubscription(i),i}catch(s){console.error(`Service Worker Registration failed: ${s.message}`)}}async saveSubscription(s){return(await fetch(`${this.serverUrl}/save-subscription`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({user:this.userId,key:s})})).json()}async sendNotification(s){try{return(await fetch(`${this.serverUrl}/send-notification`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)})).json()}catch(s){console.log(s)}}}const t="BFtsHOr4nnMmA9zvImAR-XRXZ89IpppbjYaZ93L2YqkombTbXyhYXwMLJ9BnChssfIcoS6P4LYp-W1G7pqdk-RQ",e="7JgjG-jzXykKfbpt7XtZa6Po_e1siUA_65B0jAaMBx8";class r{constructor(i){this.publicKey=i.publicKey,this.privateKey=i.privateKey,this.email=i.email,this.subscriptions=new Map,s.setVapidDetails(`mailto:${this.email||"jfixcoding@gmail"}`,this.publicKey||t,this.privateKey||e)}setupRoutes(s){s.post("/save-subscription",this.saveSubscription.bind(this)),s.post("/send-notification",this.sendNotification.bind(this)),s.get("/vapid-public-key",((s,i)=>{i.json({publicKey:this.publicKey||t})}))}saveSubscription(s,i){const{user:t,key:e}=s.body,r=e?.keys?.auth;this.subscriptions.has(e.endpoint)||this.subscriptions.set(e.endpoint,{userAuth:r,key:e}),i.status(200).json({status:"success",message:"Subscription saved!"})}async sendNotification(i,t){const e=i.body;if(0===this.subscriptions.size)return t.status(400).json({status:"error",message:"No subscriptions found"});try{const i=await Promise.all(Array.from(this.subscriptions.values()).map((i=>s.sendNotification(i.key,JSON.stringify(e)).then((()=>({success:!0}))).catch((s=>({success:!1,error:s.message})))))),r=i.filter((s=>s.success)).length,a=i.length-r;t.status(200).json({status:"success",message:`Notifications sent! Success: ${r}, Failures: ${a}`})}catch(s){t.status(500).json({status:"error",message:"Internal server error"})}}}export{i as PushNotificationClient,r as PushNotificationServer};