69 lines
2.5 KiB
TypeScript
69 lines
2.5 KiB
TypeScript
|
import * as plugins from './lele-serviceworker.plugins.js';
|
||
|
import * as interfaces from './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<LosslessServiceworker> {
|
||
|
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);
|
||
|
}
|
||
|
}
|