|
|
|
/*
|
|
|
|
* https://github.com/morethanwords/tweb
|
|
|
|
* Copyright (C) 2019-2021 Eduard Kuzmenko
|
|
|
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE
|
|
|
|
*/
|
|
|
|
|
|
|
|
// в SW может быть сразу две переменных TRUE
|
|
|
|
export const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;
|
|
|
|
export const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;
|
|
|
|
export const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;
|
|
|
|
|
|
|
|
export const getWindowClients = () => {
|
|
|
|
return (self as any as ServiceWorkerGlobalScope)
|
|
|
|
.clients
|
|
|
|
.matchAll({includeUncontrolled: false, type: 'window'});
|
|
|
|
};
|
|
|
|
|
|
|
|
const postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {
|
|
|
|
try {
|
|
|
|
// @ts-ignore
|
|
|
|
listener.postMessage(...args);
|
|
|
|
} catch(err) {
|
|
|
|
console.error('[worker] postMessage error:', err, args);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const notifyServiceWorker = (all: boolean, ...args: any[]) => {
|
|
|
|
getWindowClients().then((listeners) => {
|
|
|
|
if(!listeners.length) {
|
|
|
|
//console.trace('no listeners?', self, listeners);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
listeners.slice(all ? 0 : -1).forEach((listener) => {
|
|
|
|
postMessage(listener, ...args);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const notifyWorker = (...args: any[]) => {
|
|
|
|
postMessage(self as any as DedicatedWorkerGlobalScope, ...args);
|
|
|
|
};
|
|
|
|
|
|
|
|
const noop = () => {};
|
|
|
|
|
|
|
|
export const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);
|
|
|
|
export const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);
|