You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.8 KiB
59 lines
1.8 KiB
export type ImwaldBackendResponse = { |
|
status: number |
|
statusText: string |
|
headers: Record<string, string> |
|
body: string |
|
} |
|
|
|
/** |
|
* In Electron, translate / LanguageTool hit `https://…` from a loopback document origin and Chromium |
|
* CORS blocks them. {@link window.imwaldElectron.backendRequest} runs the same HTTP(S) call in main. |
|
*/ |
|
export async function electronAwareFetch(input: string, init?: RequestInit): Promise<Response> { |
|
if (init?.signal?.aborted) { |
|
throw new DOMException('Aborted', 'AbortError') |
|
} |
|
const bridge = typeof window !== 'undefined' ? window.imwaldElectron : undefined |
|
/** Prefer main-process fetch whenever the preload bridge exists (do not rely on `isElectron` alone). */ |
|
if (typeof bridge?.backendRequest !== 'function') { |
|
return fetch(input, init) |
|
} |
|
|
|
const method = (init?.method ?? 'GET').toUpperCase() |
|
const headers: Record<string, string> = {} |
|
if (init?.headers) { |
|
new Headers(init.headers as HeadersInit).forEach((value, key) => { |
|
headers[key] = value |
|
}) |
|
} |
|
|
|
let body: string | null = null |
|
if (init?.body != null) { |
|
const b = init.body |
|
if (typeof b === 'string') body = b |
|
else if (b instanceof URLSearchParams) body = b.toString() |
|
else if (b instanceof ArrayBuffer) body = new TextDecoder().decode(b) |
|
else if (typeof Blob !== 'undefined' && b instanceof Blob) body = await b.text() |
|
else body = String(b) |
|
} |
|
|
|
const raw = (await bridge.backendRequest({ |
|
url: input, |
|
method, |
|
headers, |
|
body |
|
})) as ImwaldBackendResponse |
|
|
|
const hdrs = new Headers() |
|
if (raw.headers && typeof raw.headers === 'object') { |
|
for (const [k, v] of Object.entries(raw.headers)) { |
|
if (typeof v === 'string') hdrs.set(k, v) |
|
} |
|
} |
|
|
|
return new Response(raw.body ?? '', { |
|
status: raw.status ?? 0, |
|
statusText: raw.statusText ?? '', |
|
headers: hdrs |
|
}) |
|
}
|
|
|