Move fetchLocal function to utils

This commit is contained in:
Bill Thornton 2023-04-16 23:37:37 -04:00
parent 0227d981e9
commit 0df6c66646
2 changed files with 43 additions and 38 deletions

View File

@ -1,44 +1,7 @@
import DefaultConfig from '../../config.json'; import DefaultConfig from '../../config.json';
import fetchLocal from '../../utils/fetchLocal.ts';
let data; let data;
const urlResolver = 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
async function fetchLocal(url, options) {
urlResolver.href = url;
const requestURL = urlResolver.href;
return new Promise((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: 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);
});
}
async function getConfig() { async function getConfig() {
if (data) return Promise.resolve(data); if (data) return Promise.resolve(data);

42
src/utils/fetchLocal.ts Normal file
View File

@ -0,0 +1,42 @@
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);
});
}