%PDF- %PDF-
Direktori : /var/www/pjc/vendor/needim/noty/src/ |
Current File : /var/www/pjc/vendor/needim/noty/src/push.js |
export class Push { constructor (workerPath = '/service-worker.js') { this.subData = {} this.workerPath = workerPath this.listeners = { onPermissionGranted: [], onPermissionDenied: [], onSubscriptionSuccess: [], onSubscriptionCancel: [], onWorkerError: [], onWorkerSuccess: [], onWorkerNotSupported: [] } return this } /** * @param {string} eventName * @param {function} cb * @return {Push} */ on (eventName, cb = () => {}) { if (typeof cb === 'function' && this.listeners.hasOwnProperty(eventName)) { this.listeners[eventName].push(cb) } return this } fire (eventName, params = []) { if (this.listeners.hasOwnProperty(eventName)) { this.listeners[eventName].forEach(cb => { if (typeof cb === 'function') { cb.apply(this, params) } }) } } create () { console.log('NOT IMPLEMENTED YET') } /** * @return {boolean} */ isSupported () { let result = false try { result = window.Notification || window.webkitNotifications || navigator.mozNotification || (window.external && window.external.msIsSiteMode() !== undefined) } catch (e) {} return result } /** * @return {string} */ getPermissionStatus () { let perm = 'default' if (window.Notification && window.Notification.permissionLevel) { perm = window.Notification.permissionLevel } else if ( window.webkitNotifications && window.webkitNotifications.checkPermission ) { switch (window.webkitNotifications.checkPermission()) { case 1: perm = 'default' break case 0: perm = 'granted' break default: perm = 'denied' } } else if (window.Notification && window.Notification.permission) { perm = window.Notification.permission } else if (navigator.mozNotification) { perm = 'granted' } else if ( window.external && window.external.msIsSiteMode() !== undefined ) { perm = window.external.msIsSiteMode() ? 'granted' : 'default' } return perm.toString().toLowerCase() } /** * @return {string} */ getEndpoint (subscription) { let endpoint = subscription.endpoint const subscriptionId = subscription.subscriptionId // fix for Chrome < 45 if (subscriptionId && endpoint.indexOf(subscriptionId) === -1) { endpoint += '/' + subscriptionId } return endpoint } /** * @return {boolean} */ isSWRegistered () { try { return navigator.serviceWorker.controller.state === 'activated' } catch (e) { return false } } /** * @return {void} */ unregisterWorker () { const self = this if ('serviceWorker' in navigator) { navigator.serviceWorker.getRegistrations().then(function (registrations) { for (let registration of registrations) { registration.unregister() self.fire('onSubscriptionCancel') } }) } } /** * @return {void} */ requestSubscription (userVisibleOnly = true) { const self = this const current = this.getPermissionStatus() const cb = result => { if (result === 'granted') { this.fire('onPermissionGranted') if ('serviceWorker' in navigator) { navigator.serviceWorker.register(this.workerPath).then(function () { navigator.serviceWorker.ready.then( function (serviceWorkerRegistration) { self.fire('onWorkerSuccess') serviceWorkerRegistration.pushManager .subscribe({ userVisibleOnly: userVisibleOnly }) .then(function (subscription) { const key = subscription.getKey('p256dh') const token = subscription.getKey('auth') self.subData = { endpoint: self.getEndpoint(subscription), p256dh: key ? window.btoa( String.fromCharCode.apply(null, new Uint8Array(key)) ) : null, auth: token ? window.btoa( String.fromCharCode.apply( null, new Uint8Array(token) ) ) : null } self.fire('onSubscriptionSuccess', [self.subData]) }) .catch(function (err) { self.fire('onWorkerError', [err]) }) } ) }) } else { self.fire('onWorkerNotSupported') } } else if (result === 'denied') { this.fire('onPermissionDenied') this.unregisterWorker() } } if (current === 'default') { if (window.Notification && window.Notification.requestPermission) { window.Notification.requestPermission(cb) } else if ( window.webkitNotifications && window.webkitNotifications.checkPermission ) { window.webkitNotifications.requestPermission(cb) } } else { cb(current) } } }