winupdate-neo/lib/webpush.ts

50 lines
1.5 KiB
TypeScript

import webpush from 'web-push';
import { prisma } from '@/lib/prisma';
if (process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY && process.env.VAPID_PRIVATE_KEY) {
webpush.setVapidDetails(
process.env.VAPID_SUBJECT || 'mailto:example@yourdomain.org',
process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY,
process.env.VAPID_PRIVATE_KEY
);
}
export async function sendWebPush(message: string) {
if (!process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY || !process.env.VAPID_PRIVATE_KEY) {
console.warn('VAPID keys not configured, skipping web push');
return;
}
const subscriptions = await prisma.pushSubscription.findMany();
const notificationPayload = JSON.stringify({
title: 'WinUpdate Notification',
body: message,
icon: '/icons/icon-192x192.png', // Assuming you have icons
});
const promises = subscriptions.map((sub) => {
const pushSubscription = {
endpoint: sub.endpoint,
keys: {
p256dh: sub.p256dh,
auth: sub.auth,
},
};
return webpush.sendNotification(pushSubscription, notificationPayload)
.catch((err) => {
if (err.statusCode === 410 || err.statusCode === 404) {
// Subscription has expired or is no longer valid
console.log(`Subscription expired, deleting: ${sub.endpoint}`);
return prisma.pushSubscription.delete({
where: { endpoint: sub.endpoint },
});
}
console.error('Error sending web push:', err);
});
});
await Promise.all(promises);
}