Newer
Older
/* globals importScripts, backend */
Matiss Janis Aboltins
committed
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
* Sometimes the frontend build is way faster than backend.
* This results in the frontend starting up before backend is
* finished and thus the backend script is not available.
*
* The goal of this function is to retry X amount of times
* to retrieve the backend script with a small delay.
*/
const importScriptsWithRetry = async (script, { maxRetries = 5 } = {}) => {
try {
importScripts(script);
} catch (e) {
// Break if maxRetries has exceeded
if (maxRetries <= 0) {
throw e;
} else {
console.groupCollapsed(
`Failed to load backend, will retry ${maxRetries} more time(s)`,
);
console.log(e);
console.groupEnd();
}
// Attempt to retry after a small delay
await new Promise(resolve =>
setTimeout(async () => {
await importScriptsWithRetry(script, {
maxRetries: maxRetries - 1,
});
resolve();
}, 5000),
);
}
};
self.addEventListener('message', async e => {
if (!hasInitialized) {
let msg = e.data;
if (msg.type === 'init') {
hasInitialized = true;
let isDev = !!msg.isDev;
if (!self.SharedArrayBuffer && !msg.isSharedArrayBufferOverrideEnabled) {
self.postMessage({
type: 'app-init-failure',
SharedArrayBufferMissing: true,
});
return;
}
Matiss Janis Aboltins
committed
await importScriptsWithRetry(
`${msg.publicUrl}/kcab/kcab.worker.${hash}.js`,
{ maxRetries: isDev ? 5 : 0 },
);
backend.initApp(isDev, self).catch(err => {
console.log(err);
let msg = {
type: 'app-init-failure',
IDBFailure: err.message.includes('indexeddb-failure'),
};
self.postMessage(msg);
throw err;
});