import { ofetch } from "ofetch"; import { getApiToken, setApiToken } from "@/backend/helpers/providerApi"; import { getLoadbalancedProxyUrl } from "@/utils/providers"; type P = Parameters>; type R = ReturnType>; const baseFetch = ofetch.create({ retry: 0, }); export function makeUrl(url: string, data: Record) { let parsedUrl: string = url; Object.entries(data).forEach(([k, v]) => { parsedUrl = parsedUrl.replace(`{${k}}`, encodeURIComponent(v)); }); return parsedUrl; } export function mwFetch(url: string, ops: P[1] = {}): R { return baseFetch(url, ops); } export async function singularProxiedFetch( proxyUrl: string, url: string, ops: P[1] = {} ): R { let combinedUrl = ops?.baseURL ?? ""; if ( combinedUrl.length > 0 && combinedUrl.endsWith("/") && url.startsWith("/") ) combinedUrl += url.slice(1); else if ( combinedUrl.length > 0 && !combinedUrl.endsWith("/") && !url.startsWith("/") ) combinedUrl += `/${url}`; else combinedUrl += url; const parsedUrl = new URL(combinedUrl); Object.entries(ops?.params ?? {}).forEach(([k, v]) => { parsedUrl.searchParams.set(k, v); }); Object.entries(ops?.query ?? {}).forEach(([k, v]) => { parsedUrl.searchParams.set(k, v); }); let headers = ops.headers ?? {}; const apiToken = await getApiToken(); if (apiToken) headers = { ...headers, "X-Token": apiToken, }; return baseFetch(proxyUrl, { ...ops, baseURL: undefined, params: { destination: parsedUrl.toString(), }, query: {}, headers, onResponse(context) { const tokenHeader = context.response.headers.get("X-Token"); if (tokenHeader) setApiToken(tokenHeader); ops.onResponse?.(context); }, }); } export function proxiedFetch(url: string, ops: P[1] = {}): R { return singularProxiedFetch(getLoadbalancedProxyUrl(), url, ops); }