Skip to content

Commit bc337c4

Browse files
authored
unsupported file types are being difficult
1 parent 30a336a commit bc337c4

1 file changed

Lines changed: 134 additions & 127 deletions

File tree

ResourceLoader.js

Lines changed: 134 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -204,135 +204,132 @@ const ResourceLoader = (() => {
204204
}
205205
};
206206

207-
switch (fileType) {
208-
case "js":
209-
element = document.createElement("script");
210-
element.src = finalUrl;
211-
element.async = true;
212-
if (crossorigin) {
213-
element.crossOrigin = crossorigin;
214-
}
215-
break;
216-
case "css":
217-
element = document.createElement("link");
218-
element.href = finalUrl;
219-
element.rel = "stylesheet";
220-
if (crossorigin) {
221-
element.crossOrigin = crossorigin;
222-
}
223-
break;
224-
case "json":
225-
fetch(finalUrl, { signal })
226-
.then((response) => response.json())
227-
.then((data) => {
228-
if (!timedOut) {
229-
resourceStates[url] = "loaded";
230-
resolve(data);
207+
switch (fileType) {
208+
case "js":
209+
element = document.createElement("script");
210+
element.src = finalUrl;
211+
element.async = true;
212+
if (crossorigin) {
213+
element.crossOrigin = crossorigin;
231214
}
232-
})
233-
.catch((error) => {
234-
const categorizedError = categorizeError(
235-
error,
236-
fileType,
237-
finalUrl
238-
);
239-
reject(categorizedError);
240-
if (onError) onError(categorizedError);
241-
if (retryCount < retries) {
242-
log(`Retrying to load resource: ${finalUrl}`, "warn");
243-
setTimeout(
244-
() => loadResource(url, retryCount + 1),
245-
retryDelay
246-
);
215+
break;
216+
case "css":
217+
element = document.createElement("link");
218+
element.href = finalUrl;
219+
element.rel = "stylesheet";
220+
if (crossorigin) {
221+
element.crossOrigin = crossorigin;
247222
}
248-
});
249-
cancel = () => controller.abort();
250-
return;
251-
case "jpg":
252-
case "jpeg":
253-
case "png":
254-
case "gif":
255-
case "svg":
256-
element = document.createElement("img");
257-
element.src = finalUrl;
258-
if (crossorigin) {
259-
element.crossOrigin = crossorigin;
260-
}
261-
break;
262-
case "woff":
263-
case "woff2":
264-
const fontFace = new FontFace("customFont", `url(${finalUrl})`, {
265-
crossOrigin: crossorigin,
266-
});
267-
fontFace
268-
.load()
269-
.then(() => {
270-
if (!timedOut) {
271-
document.fonts.add(fontFace);
272-
resourceStates[url] = "loaded";
273-
resolve();
223+
break;
224+
case "json":
225+
fetch(finalUrl, { signal })
226+
.then((response) => response.json())
227+
.then((data) => {
228+
if (!timedOut) {
229+
resourceStates[url] = "loaded";
230+
resolve(data);
231+
}
232+
})
233+
.catch((error) => {
234+
const categorizedError = categorizeError(
235+
error,
236+
fileType,
237+
finalUrl
238+
);
239+
reject(categorizedError);
240+
if (onError) onError(categorizedError);
241+
if (retryCount < retries) {
242+
log(`Retrying to load resource: ${finalUrl}`, "warn");
243+
setTimeout(
244+
() => loadResource(url, retryCount + 1),
245+
retryDelay
246+
);
247+
}
248+
});
249+
cancel = () => controller.abort();
250+
return;
251+
case "jpg":
252+
case "jpeg":
253+
case "png":
254+
case "gif":
255+
case "svg":
256+
element = document.createElement("img");
257+
element.src = finalUrl;
258+
if (crossorigin) {
259+
element.crossOrigin = crossorigin;
274260
}
275-
})
276-
.catch((error) => {
277-
const categorizedError = categorizeError(
278-
error,
279-
fileType,
280-
finalUrl
261+
break;
262+
case "woff":
263+
case "woff2":
264+
const fontFace = new FontFace(
265+
"customFont",
266+
`url(${finalUrl})`,
267+
{
268+
crossOrigin: crossorigin,
269+
}
281270
);
282-
reject(categorizedError);
283-
if (onError) onError(categorizedError);
284-
if (retryCount < retries) {
285-
log(`Retrying to load resource: ${finalUrl}`, "warn");
286-
setTimeout(
287-
() => loadResource(url, retryCount + 1),
288-
retryDelay
289-
);
290-
}
291-
});
292-
return;
293-
case "pdf":
294-
case "zip":
295-
case "bin":
296-
fetch(finalUrl, { signal })
297-
.then((response) => response.blob())
298-
.then((data) => {
299-
if (!timedOut) {
300-
resourceStates[url] = "loaded";
301-
resolve(data);
302-
}
303-
})
304-
.catch((error) => {
305-
const categorizedError = categorizeError(
306-
error,
307-
fileType,
308-
finalUrl
271+
fontFace
272+
.load()
273+
.then(() => {
274+
if (!timedOut) {
275+
document.fonts.add(fontFace);
276+
resourceStates[url] = "loaded";
277+
resolve();
278+
}
279+
})
280+
.catch((error) => {
281+
const categorizedError = categorizeError(
282+
error,
283+
fileType,
284+
finalUrl
285+
);
286+
reject(categorizedError);
287+
if (onError) onError(categorizedError);
288+
if (retryCount < retries) {
289+
log(`Retrying to load resource: ${finalUrl}`, "warn");
290+
setTimeout(
291+
() => loadResource(url, retryCount + 1),
292+
retryDelay
293+
);
294+
}
295+
});
296+
return;
297+
case "pdf":
298+
case "zip":
299+
case "bin":
300+
fetch(finalUrl, { signal })
301+
.then((response) => response.blob())
302+
.then((data) => {
303+
if (!timedOut) {
304+
resourceStates[url] = "loaded";
305+
resolve(data);
306+
}
307+
})
308+
.catch((error) => {
309+
const categorizedError = categorizeError(
310+
error,
311+
fileType,
312+
finalUrl
313+
);
314+
reject(categorizedError);
315+
if (onError) onError(categorizedError);
316+
if (retryCount < retries) {
317+
log(`Retrying to load resource: ${finalUrl}`, "warn");
318+
setTimeout(
319+
() => loadResource(url, retryCount + 1),
320+
retryDelay
321+
);
322+
}
323+
});
324+
cancel = () => controller.abort();
325+
return;
326+
default:
327+
reject(new Error(`Unsupported file type: ${fileType}`));
328+
log(
329+
`Failed to load unsupported file type: ${finalUrl}`,
330+
"error"
309331
);
310-
reject(categorizedError);
311-
if (onError) onError(categorizedError);
312-
if (retryCount < retries) {
313-
log(`Retrying to load resource: ${finalUrl}`, "warn");
314-
setTimeout(
315-
() => loadResource(url, retryCount + 1),
316-
retryDelay
317-
);
318-
}
319-
});
320-
cancel = () => controller.abort();
321-
return;
322-
default:
323-
const unsupportedError = categorizeError(
324-
new Error("Unsupported file type"),
325-
fileType,
326-
finalUrl
327-
);
328-
reject(unsupportedError);
329-
if (onError) onError(unsupportedError);
330-
if (retryCount < retries) {
331-
log(`Retrying to load resource: ${finalUrl}`, "warn");
332-
setTimeout(() => loadResource(url, retryCount + 1), retryDelay);
333332
}
334-
return;
335-
}
336333

337334
applyAttributes(element, attributes, fileType);
338335
startedLoading = true;
@@ -341,9 +338,19 @@ const ResourceLoader = (() => {
341338
element.onload = () => {
342339
if (!timedOut) {
343340
clearTimeout(timeoutId);
344-
log(`Resource loaded from: ${finalUrl}`, "verbose");
345-
resourceStates[url] = "loaded";
346-
resolve(); // Make sure resolve is correctly called here
341+
342+
// Check if resource was really loaded (some resources may trigger onload without being valid)
343+
if (
344+
element.naturalWidth === 0 ||
345+
element.readyState === "complete"
346+
) {
347+
log(`Resource loaded from: ${finalUrl}`, "verbose");
348+
resourceStates[url] = "loaded";
349+
resolve();
350+
} else {
351+
log(`Failed to load resource from: ${finalUrl}`, "error");
352+
reject(new Error(`Failed to load resource: ${finalUrl}`));
353+
}
347354
}
348355
};
349356

@@ -357,7 +364,7 @@ const ResourceLoader = (() => {
357364
fileType,
358365
finalUrl
359366
);
360-
reject(categorizedError); // Ensure reject is called on error
367+
reject(categorizedError);
361368
log(`Failed to load resource from: ${finalUrl}`, "warn");
362369
resourceStates[url] = "unloaded";
363370
if (retryCount < retries) {

0 commit comments

Comments
 (0)