push-notification-service
Version:
Push notification package for web applications using service worker
2 lines (1 loc) • 1.44 kB
JavaScript
import s from"web-push";const t="BFtsHOr4nnMmA9zvImAR-XRXZ89IpppbjYaZ93L2YqkombTbXyhYXwMLJ9BnChssfIcoS6P4LYp-W1G7pqdk-RQ",i="7JgjG-jzXykKfbpt7XtZa6Po_e1siUA_65B0jAaMBx8";class e{constructor(e){this.publicKey=e.publicKey,this.privateKey=e.privateKey,this.email=e.email,this.subscriptions=new Map,s.setVapidDetails(`mailto:${this.email||"jfixcoding@gmail"}`,this.publicKey||t,this.privateKey||i)}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,t){const{user:i,key:e}=s.body,o=e?.keys?.auth;this.subscriptions.has(e.endpoint)||this.subscriptions.set(e.endpoint,{userAuth:o,key:e}),t.status(200).json({status:"success",message:"Subscription saved!"})}async sendNotification(t,i){const e=t.body;if(0===this.subscriptions.size)return i.status(400).json({status:"error",message:"No subscriptions found"});try{const t=await Promise.all(Array.from(this.subscriptions.values()).map((t=>s.sendNotification(t.key,JSON.stringify(e)).then((()=>({success:!0}))).catch((s=>({success:!1,error:s.message})))))),o=t.filter((s=>s.success)).length,a=t.length-o;i.status(200).json({status:"success",message:`Notifications sent! Success: ${o}, Failures: ${a}`})}catch(s){i.status(500).json({status:"error",message:"Internal server error"})}}}export{e as PushNotificationServer};