{"version":3,"file":"utils/request.mjs","sources":["../../src/utils/request.ts"],"sourcesContent":["import { Manifest, SDK } from '@rsdoctor/types';\nimport { Fetch, Manifest as ManifestMethod, Url } from '@rsdoctor/utils/common';\nimport { APILoaderMode4Dev } from '../constants';\nimport { getManifestUrlFromUrlQuery } from './url';\nimport { getAPILoaderModeFromStorage } from './storage';\n\nfunction random() {\n  return `${Date.now()}${Math.floor(Math.random() * 10000)}`;\n}\n\nfunction resolveRequestUrl(url: string): string {\n  if (\n    process.env.NODE_ENV === 'development' &&\n    getAPILoaderModeFromStorage() === APILoaderMode4Dev.Local &&\n    url.startsWith('/')\n  ) {\n    const nextUrl =\n      url === manifestUrlForDev ? SDK.ServerAPI.API.Manifest : url;\n    const currentUrl = new URL(location.href);\n    currentUrl.port = String(process.env.LOCAL_CLI_PORT!);\n    return `${currentUrl.origin}${nextUrl}`;\n  }\n\n  return url;\n}\n\nasync function requestText(url: string, timeout: number) {\n  const res = await Fetch.fetchWithTimeout(resolveRequestUrl(url), { timeout });\n  return res.text();\n}\n\nexport async function fetchShardingFile(url: string): Promise<string> {\n  if (Url.isUrl(url)) {\n    return requestText(url, 999999);\n  }\n  // json string\n  return url;\n}\n\nexport async function loadManifestByUrl(url: string) {\n  const json = await fetchJSONByUrl(url);\n\n  const res = await parseManifest(json);\n  return res;\n}\n\nexport async function fetchJSONByUrl(url: string) {\n  let json: unknown = await requestText(url, 30000);\n\n  if (typeof json === 'string') {\n    const trimmed = json.trim();\n    // If we got an HTML document (usually error page / SPA fallback), skip JSON.parse\n    if (/^<!doctype html\\b/i.test(trimmed) || /^<html\\b/i.test(trimmed)) {\n      json = {} as Manifest.RsdoctorManifestWithShardingFiles;\n    } else {\n      json = JSON.parse(json);\n    }\n  }\n\n  return json as Manifest.RsdoctorManifestWithShardingFiles;\n}\n\nexport function fetchJSONByUrls(urls: string[]) {\n  return Promise.all(urls.map((url) => fetchJSONByUrl(url)));\n}\n\nexport async function parseManifest(\n  json: Manifest.RsdoctorManifestWithShardingFiles,\n) {\n  let transformedData: Manifest.RsdoctorManifestData;\n\n  try {\n    // try to load cloud data first\n    if (json.cloudData) {\n      try {\n        transformedData = await ManifestMethod.fetchShardingFiles(\n          json.cloudData,\n          fetchShardingFile,\n        );\n      } catch (error) {\n        console.log('cloudData load error: ', error);\n      }\n    } else {\n      transformedData = await ManifestMethod.fetchShardingFiles(\n        json.data,\n        fetchShardingFile,\n      );\n    }\n  } catch {\n    transformedData = await ManifestMethod.fetchShardingFiles(\n      json.data,\n      fetchShardingFile,\n    );\n  }\n\n  return {\n    ...json,\n    data: transformedData!,\n  };\n}\n\nconst manifestUrlForDev = '/manifest.json';\n\nexport function getManifestUrl(): string {\n  let file: string | void;\n\n  if (\n    (window as { [key: string]: any })[\n      Manifest.RsdoctorManifestClientConstant.WindowPropertyForManifestUrl\n    ]\n  ) {\n    // load from window property\n    file = (window as { [key: string]: any })[\n      Manifest.RsdoctorManifestClientConstant.WindowPropertyForManifestUrl\n    ];\n  } else {\n    // load from url query\n    file = getManifestUrlFromUrlQuery();\n  }\n\n  if (!file) {\n    file = SDK.ServerAPI.API.Manifest;\n  }\n\n  return file;\n}\n\nconst pool = new Map<\n  string,\n  Promise<Manifest.RsdoctorManifestWithShardingFiles>\n>();\n\nexport async function fetchManifest(url = getManifestUrl()) {\n  if (!pool.has(url)) {\n    pool.set(\n      url,\n      fetchJSONByUrl(url).catch((err) => {\n        pool.delete(url);\n        throw err;\n      }),\n    );\n  }\n\n  const res = await pool.get(url)!;\n\n  return res;\n}\n\nexport async function postServerAPI<\n  T extends SDK.ServerAPI.API,\n  B extends SDK.ServerAPI.InferRequestBodyType<T> =\n    SDK.ServerAPI.InferRequestBodyType<T>,\n  R extends SDK.ServerAPI.InferResponseType<T> =\n    SDK.ServerAPI.InferResponseType<T>,\n>(...args: B extends void ? [api: T] : [api: T, body: B]): Promise<R> {\n  const [api, body] = args;\n  const timeout = process.env.NODE_ENV === 'development' ? 10000 : 60000;\n  const res = await Fetch.fetchWithTimeout(\n    resolveRequestUrl(`${api}?_t=${random()}`),\n    {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: body === undefined ? undefined : JSON.stringify(body),\n      timeout,\n    },\n  );\n  return (await res.json()) as R;\n}\n"],"names":["random","Date","Math","resolveRequestUrl","url","process","getAPILoaderModeFromStorage","APILoaderMode4Dev","nextUrl","manifestUrlForDev","SDK","currentUrl","URL","location","String","requestText","timeout","res","Fetch","fetchShardingFile","Url","loadManifestByUrl","json","fetchJSONByUrl","parseManifest","trimmed","JSON","fetchJSONByUrls","urls","Promise","transformedData","ManifestMethod","error","console","getManifestUrl","file","window","Manifest","getManifestUrlFromUrlQuery","pool","Map","fetchManifest","err","postServerAPI","args","api","body","undefined"],"mappings":"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"}