typedserver/ts_web_serviceworker_client/classes.serviceworkerclient.ts
2024-05-25 03:04:25 +02:00

69 lines
2.5 KiB
TypeScript

import * as plugins from './plugins.js';
import * as interfaces from '../dist_ts_interfaces/index.js';
import { logger } from "./logging.js";
import { NotificationManager } from './classes.notificationmanager.js';
import { ActionManager } from './classes.actionmanager.js';
import { GlobalSW } from './classes.globalsw.js'
export class ServiceworkerClient {
// STATIC
public static async createServiceWorker(): Promise<ServiceworkerClient> {
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('/serviceworker.bundle.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 ServiceworkerClient();
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);
}
}