Newer
Older
Greg Fodor
committed
import nextTick from "./utils/next-tick.js";
// Manages web push subscriptions
//
function urlBase64ToUint8Array(base64String) {
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 default class Subscriptions {
};
setRegistration = registration => {
Greg Fodor
committed
setRegistrationFailed = () => {
this.registration = null;
Greg Fodor
committed
setVapidPublicKey = vapidPublicKey => {
this.vapidPublicKey = vapidPublicKey;
Greg Fodor
committed
setSubscribed = isSubscribed => {
this._isSubscribed = isSubscribed;
Greg Fodor
committed
getCurrentEndpoint = async () => {
if (!navigator.serviceWorker) return null;
Greg Fodor
committed
// registration becomes null if failed, non null if registered
while (this.registration === undefined) await nextTick();
if (!this.registration || !this.registration.pushManager) return null;
while (this.vapidPublicKey === undefined) await nextTick();
if (this.vapidPublicKey === null) return null;
const convertedVapidKey = urlBase64ToUint8Array(this.vapidPublicKey);
if (
(await this.registration.pushManager.permissionState({
userVisibleOnly: true,
applicationServerKey: convertedVapidKey
})) !== "granted"
)
return null;
} catch (e) {
return null; // Chrome can throw here complaining about userVisible if push is not right
}
Greg Fodor
committed
const sub = await this.registration.pushManager.getSubscription();
if (!sub) return null;
Greg Fodor
committed
};
toggle = async () => {
if (!this.registration) return;
Greg Fodor
committed
if (this._isSubscribed) {
const pushSubscription = await this.registration.pushManager.getSubscription();
const res = await this.hubChannel.unsubscribe(pushSubscription);
Greg Fodor
committed
if (res && res.has_remaining_subscriptions === false) {
pushSubscription.unsubscribe();
Greg Fodor
committed
let pushSubscription = await this.registration.pushManager.getSubscription();
Greg Fodor
committed
if (!pushSubscription) {
const convertedVapidKey = urlBase64ToUint8Array(this.vapidPublicKey);
Greg Fodor
committed
pushSubscription = await this.registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: convertedVapidKey
});
}
Greg Fodor
committed
this.hubChannel.subscribe(pushSubscription);
Greg Fodor
committed
this._isSubscribed = !this._isSubscribed;