/** * Quick example (matches curl usage): * await callDataApi("Youtube/search", { * query: { gl: "US", hl: "en", q: "manus" }, * }) */ import { ENV } from "./env"; export type DataApiCallOptions = { query?: Record; body?: Record; pathParams?: Record; formData?: Record; }; export async function callDataApi( apiId: string, options: DataApiCallOptions = {} ): Promise { if (!ENV.forgeApiUrl) { throw new Error("BUILT_IN_FORGE_API_URL is not configured"); } if (!ENV.forgeApiKey) { throw new Error("BUILT_IN_FORGE_API_KEY is not configured"); } // Build the full URL by appending the service path to the base URL const baseUrl = ENV.forgeApiUrl.endsWith("/") ? ENV.forgeApiUrl : `${ENV.forgeApiUrl}/`; const fullUrl = new URL("webdevtoken.v1.WebDevService/CallApi", baseUrl).toString(); const response = await fetch(fullUrl, { method: "POST", headers: { accept: "application/json", "content-type": "application/json", "connect-protocol-version": "1", authorization: `Bearer ${ENV.forgeApiKey}`, }, body: JSON.stringify({ apiId, query: options.query, body: options.body, path_params: options.pathParams, multipart_form_data: options.formData, }), }); if (!response.ok) { const detail = await response.text().catch(() => ""); throw new Error( `Data API request failed (${response.status} ${response.statusText})${detail ? `: ${detail}` : ""}` ); } const payload = await response.json().catch(() => ({})); if (payload && typeof payload === "object" && "jsonData" in payload) { try { return JSON.parse((payload as Record).jsonData ?? "{}"); } catch { return (payload as Record).jsonData; } } return payload; }