librenms/librenms

View on GitHub
html/service-worker.js

Summary

Maintainability
A
0 mins
Test Coverage
self.addEventListener('fetch', function (event) {
});

self.addEventListener('push', function (e) {
    if (!(self.Notification && self.Notification.permission === 'granted') && localStorage.getItem('notifications') !== 'disabled') {
        //notifications aren't supported or permission not granted!
        return;
    }

    if (e.data) {
        const msg = e.data.json();
        // console.log(msg)
        e.waitUntil(self.registration.showNotification(msg.title, {
            body: msg.body,
            icon: msg.icon,
            actions: msg.actions,
            data: msg.data
        }));
    }
});

self.addEventListener('notificationclick', function (event) {
    event.notification.close();

    if (event.action === 'alert.acknowledge') {
        post(`./alert/${event.notification.data.id}/ack`, {state: 1})
    } else if (event.action === 'alert.view') {
        // navigate to alert
        event.waitUntil(self.clients.claim().then(() => self.clients.matchAll({type: 'window'}))
            .then(clients => {
                return clients.map(client => {
                    let alert_url = '/alerts?alert_id=' + event.notification.data.id;
                    // Check to make sure WindowClient.navigate() is supported.
                    if ('navigate' in client) {
                        return client.navigate(alert_url);
                    }

                    return self.clients.openWindow(alert_url);
                });
            }));
    }
}, false);

let csrf;

function post(url, data, retry = true) {
    if (!self.csrf) {
        return self.post(url, data, true);
    }

    return fetch(url, {
        method: 'post',
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
            'X-CSRF-Token': self.csrf
        },
        body: JSON.stringify(data)
    }).then((response) => {
        if (response.status === 419 && retry === true) {
            self.csrf = null; // reset csrf and try again
            return self.post(url, data, false);
        }
    }).catch(e => console.log(e));
}

const fetchCsrf = async () => {
    const response = await fetch('/push/token')
    self.csrf = await response.text();
}