import * as plugins from './lele-serviceworker.plugins.js'; import * as interfaces from '../dist_ts_interfaces/index.js'; import { logger } from "./serviceworker.logging.js"; import { NotificationManager } from './lele-serviceworker.classes.notificationmanager.js'; import { ActionManager } from './lele-serviceworker.classes.actionmanager.js'; import { GlobalSW } from './lele-serviceworker.classes.globalsw.js' export class LosslessServiceworker { // STATIC public static async createServiceWorker(): Promise { if ('serviceWorker' in navigator) { try { logger.log('info', 'trying to register serviceworker'); // this is some magic for Parcel to not pick up the serviceworker const serviceworkerInNavigator: ServiceWorkerContainer = navigator.serviceWorker; const swRegistration: ServiceWorkerRegistration = await serviceworkerInNavigator.register('/lsw.js', { scope: '/', updateViaCache: 'none' }); plugins.smartdelay.delayFor(2000).then(async () => { swRegistration.onupdatefound = () => { logger.log('info', 'update found for service worker!'); logger.log('warn', 'trying to find convenient time to update'); }; while(true) { await plugins.smartdelay.delayFor(60000); swRegistration.update(); } }); logger.log('ok', 'serviceworker registered'); await navigator.serviceWorker.ready; logger.log('ok', 'serviceworker is ready!'); await this.waitForController(); const losslessServiceWorkerInstance = new LosslessServiceworker(); return losslessServiceWorkerInstance; } catch (err) { // sentry integration here console.log(err); console.log(err.stack); } } } private static async waitForController() { const done = new plugins.smartpromise.Deferred(); const checkReady = () => { if(navigator.serviceWorker.controller) { logger.log('ok', 'controller is ready'); done.resolve(); } else { logger.log('warn', 'controller not ready'); } }; navigator.serviceWorker.oncontrollerchange = checkReady; checkReady(); await done.promise; } // INSTANCE public notificationManager: NotificationManager; public actionManager: ActionManager; public globalSw: GlobalSW; constructor() { this.notificationManager = new NotificationManager(); this.actionManager = new ActionManager(); this.globalSw = new GlobalSW(this); } }