import * as plugins from './plugins.js'; import * as interfaces from './env.js'; // imports import { CacheManager } from './classes.cachemanager.js'; import { Deferred } from '@push.rocks/smartpromise'; import { logger } from './logging.js'; // imported classes import { UpdateManager } from './classes.updatemanager.js'; import { NetworkManager } from './classes.networkmanager.js'; import { TaskManager } from './classes.taskmanager.js'; import { ServiceworkerBackend } from './classes.backend.js'; export class ServiceWorker { // STATIC // INSTANCE public serviceWindowRef: interfaces.ServiceWindow; public leleServiceWorkerBackend: ServiceworkerBackend; public cacheManager: CacheManager; public updateManager: UpdateManager; public networkManager: NetworkManager; public taskManager: TaskManager; public store: plugins.webstore.WebStore; constructor(selfArg: interfaces.ServiceWindow) { logger.log('info', `Service worker instantiating at ${Date.now()}`); this.serviceWindowRef = selfArg; this.leleServiceWorkerBackend = new ServiceworkerBackend({ self: selfArg, purgeCache: async (reqArg) => { await this.cacheManager.cleanCaches(), logger.log('info', `cleaned caches in serviceworker as per request from frontend.`); return {} } }); this.updateManager = new UpdateManager(this); this.networkManager = new NetworkManager(this); this.taskManager = new TaskManager(this); this.cacheManager = new CacheManager(this); this.store = new plugins.webstore.WebStore({ dbName: 'losslessServiceworker', storeName: 'losslessServiceworker', }); // ================================= // Installation and Activation // ================================= this.serviceWindowRef.addEventListener('install', async (event: interfaces.ServiceEvent) => { const done = new Deferred(); event.waitUntil(done.promise); // its important to not go async before event.waitUntil done.resolve(); logger.log('success', `service worker installed! TimeStamp = ${new Date().toISOString()}`); selfArg.skipWaiting(); logger.log('note', `Called skip waiting!`); }); this.serviceWindowRef.addEventListener('activate', async (event: interfaces.ServiceEvent) => { const done = new Deferred(); event.waitUntil(done.promise); // its important to not go async before event.waitUntil await selfArg.clients.claim(); await this.cacheManager.cleanCaches('new service worker loaded! :)'); done.resolve(); }); } }