mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
![]() |
interface FetchOptions {
|
||
|
cache?: string
|
||
|
}
|
||
|
|
||
|
const URL_RESOLVER = document.createElement('a');
|
||
|
|
||
|
// `fetch` with `file:` support
|
||
|
// Recent browsers seem to support `file` protocol under some conditions.
|
||
|
// Based on https://github.com/github/fetch/pull/92#issuecomment-174730593
|
||
|
// https://github.com/github/fetch/pull/92#issuecomment-512187452
|
||
|
export default async function fetchLocal(url: string, options?: FetchOptions) {
|
||
|
URL_RESOLVER.href = url;
|
||
|
|
||
|
const requestURL = URL_RESOLVER.href;
|
||
|
|
||
|
return new Promise<Response>((resolve, reject) => {
|
||
|
const xhr = new XMLHttpRequest;
|
||
|
|
||
|
xhr.onload = () => {
|
||
|
// `file` protocol has invalid OK status
|
||
|
let status = xhr.status;
|
||
|
if (requestURL.startsWith('file:') && status === 0) {
|
||
|
status = 200;
|
||
|
}
|
||
|
|
||
|
/* eslint-disable-next-line compat/compat */
|
||
|
resolve(new Response(xhr.responseText, { status }));
|
||
|
};
|
||
|
|
||
|
xhr.onerror = () => {
|
||
|
reject(new TypeError('Local request failed'));
|
||
|
};
|
||
|
|
||
|
xhr.open('GET', url);
|
||
|
|
||
|
if (options && options.cache) {
|
||
|
xhr.setRequestHeader('Cache-Control', options.cache);
|
||
|
}
|
||
|
|
||
|
xhr.send(null);
|
||
|
});
|
||
|
}
|