typedserver/ts_web_serviceworker_client/classes.actionmanager.ts
2024-05-25 01:28:56 +02:00

59 lines
2.0 KiB
TypeScript

import * as plugins from './plugins.js';
import * as interfaces from '../dist_ts_interfaces/index.js';
import { logger } from './logging.js';
/**
* MessageManager implements two ways of serviceworker communication
* * the serviceWorker method
* * the deesComms method using BroadcastChannel
*/
export class ActionManager {
public deesComms = new plugins.deesComms.DeesComms();
constructor() {
// lets define handlers on the client/tab side
this.deesComms.createTypedHandler<interfaces.serviceworker.IMessage_Serviceworker_Client_UpdateInfo>('serviceworker_newVersion', async req => {
setTimeout(() => {
window.location.reload();
}, 200);
return {};
});
}
public async waitForServiceWorkerConnection () {
console.log('waiting for service worker connection...')
const tr = this.deesComms.createTypedRequest<interfaces.serviceworker.IRequest_Client_Serviceworker_ConnectionPolling>('broadcastConnectionPolling');
let connected = false;
while (!connected) {
tr.fire({
tabId: '123'
}).then(response => {
if (response.serviceworkerId) {
console.log('connected to serviceworker!');
connected = true;
}
}).catch();
await plugins.smartdelay.delayFor(777);
if (!connected) {
// lets wake it up.
navigator.serviceWorker.controller.postMessage({
type: 'wakeUpCall',
});
}
}
console.log('ok, got serviceworker connection.')
}
public async purgeServiceWorkerCache () {
const tr = this.deesComms.createTypedRequest<interfaces.serviceworker.IRequest_PurgeServiceWorkerCache>('purgeServiceWorkerCache');
const response = await tr.fire({});
return response;
}
public async getVersionInfo () {
const tr = this.deesComms.createTypedRequest<interfaces.serviceworker.IRequest_Serviceworker_Backend_VersionInfo>('serviceworker_versionInfo');
const response = await tr.fire({});
return response;
}
}