Skip to content

Commit

Permalink
fix: make dynamic resource loading more robust
Browse files Browse the repository at this point in the history
  • Loading branch information
vcheckzen committed Oct 2, 2024
1 parent 7e3aca6 commit 405e752
Showing 1 changed file with 42 additions and 38 deletions.
80 changes: 42 additions & 38 deletions front-end/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -661,48 +661,51 @@
return Promise.all(resources.map(load));

async function load(resource) {
return new Promise((resolve, reject) => {
const rid = btoa(encodeURIComponent(resource));
if (document.getElementById(rid)) {
return resolve();
}
if (!window.resourceCache[resource]) {
window.resourceCache[resource] = handle();
}
return window.resourceCache[resource];

const timeout = 5000;
let element;
switch (resource.split('.').pop()) {
case 'css':
element = document.createElement('link');
element.href = resource;
element.rel = 'stylesheet';
break;
case 'js':
element = document.createElement('script');
element.src = resource;
break;
default:
return reject(new Error('Unsupported resource type'));
}
element.id = rid;
function handle() {
return new Promise((resolve, reject) => {
const timeout = 5000;
let element;
switch (resource.split('.').pop()) {
case 'css':
element = document.createElement('link');
element.href = resource;
element.rel = 'stylesheet';
break;
case 'js':
element = document.createElement('script');
element.src = resource;
break;
default:
return reject(new Error('Unsupported resource type'));
}

let loaded = false;
element.onload = () => {
loaded = true;
resolve();
};
element.onerror = () => {
reject(new Error(`Failed to load resource: ${resource}`));
};
setTimeout(() => {
if (!loaded) {
reject(new Error(`Resource loading timed out: ${resource}`));
let loaded = false;
element.onload = () => {
loaded = true;
resolve();
};

function error(reason) {
if (!loaded) {
document.head.removeChild(element);
delete window.resourceCache[resource];
reject(new Error(`${reason}: ${resource}`));
}
}
}, timeout);
element.onerror = () => error('Failed to load resource');
setTimeout(() => error('Resource loading timed out'), timeout);

document.head.insertBefore(
element,
document.head.firstElementChild
);
});
document.head.insertBefore(
element,
document.head.firstElementChild
);
});
}
}
}

Expand Down Expand Up @@ -1849,6 +1852,7 @@
preview: false,
};
window.fileCache = new Map();
window.resourceCache = Object.create(null);
const initialPath =
new URLSearchParams(window.location.search).get('path') ||
window.api.root;
Expand Down

0 comments on commit 405e752

Please sign in to comment.