owncast/web/services/notifications-service.ts
2022-05-29 21:51:00 -07:00

48 lines
1.4 KiB
TypeScript

export async function saveNotificationRegistration(channel, destination, accessToken) {
const URL_REGISTER_NOTIFICATION = `/api/notifications/register`;
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ channel, destination }),
};
try {
await fetch(`${URL_REGISTER_NOTIFICATION}?accessToken=${accessToken}`, options);
} catch (e) {
console.error(e);
}
}
export function isPushNotificationSupported() {
return 'serviceWorker' in navigator && 'PushManager' in window;
}
function urlBase64ToUint8Array(base64String: string) {
const padding = '='.repeat((4 - (base64String.length % 4)) % 4);
const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
const rawData = window.atob(base64);
const outputArray = new Uint8Array(rawData.length);
for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
export async function registerWebPushNotifications(vapidPublicKey) {
const registration = await navigator.serviceWorker.ready;
let subscription = await registration.pushManager.getSubscription();
if (!subscription) {
subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(vapidPublicKey),
});
}
return JSON.stringify(subscription);
}